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 aa5c039..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.properties
+++ /dev/null
@@ -1,170 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    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"
-copyright=\
-Copyright (c) 2007 Oracle Corporation.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.xml b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/feature.xml
deleted file mode 100644
index 94de41f..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.2.100.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 c184ca3..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.html
deleted file mode 100644
index fe81d46..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<P>June, 2008</P>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.ini b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.mappings b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.mappings
deleted file mode 100644
index a28390a..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.properties
deleted file mode 100644
index c315cf8..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/about.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be translated.
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=WTP Web Page Editor Apache MyFaces Trinidad Tag Support Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2007.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
-
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/build.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/build.properties
deleted file mode 100644
index 85ef5b7..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = about.html, about.ini, about.mappings, about.properties, eclipse32.gif, plugin.properties, plugin.xml, src/**, META-INF/
-sourcePlugin = true
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.gif b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.png b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.png
deleted file mode 100644
index 50ae49d..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/plugin.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/plugin.properties
deleted file mode 100644
index 09fcddc..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateBundle/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be translated.
-# plugin.properties
-# contains externalized strings for manifest.mf
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-pluginName=WTP Web Page Editor Apache MyFaces Trinidad Tag Support Source
-providerName=Eclipse.org
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/build.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/build.properties
deleted file mode 100644
index a52b18c..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be NOT be translated.
-bin.includes =\
-epl-v10.html,\
-eclipse_update_120.jpg,\
-feature.xml,\
-feature.properties,\
-license.html
-
-
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/epl-v10.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/epl-v10.html
deleted file mode 100644
index 022ad29..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/feature.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/feature.properties
deleted file mode 100644
index cf0ac79..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,172 +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\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/license.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplateFeature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.html
deleted file mode 100644
index fe81d46..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<P>June, 2008</P>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.ini b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.mappings b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.mappings
deleted file mode 100644
index a28390a..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.properties
deleted file mode 100644
index c315cf8..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/about.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be translated.
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=WTP Web Page Editor Apache MyFaces Trinidad Tag Support Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2007.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
-
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/build.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/build.properties
deleted file mode 100644
index 85ef5b7..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = about.html, about.ini, about.mappings, about.properties, eclipse32.gif, plugin.properties, plugin.xml, src/**, META-INF/
-sourcePlugin = true
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.gif b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.png b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.png
deleted file mode 100644
index 50ae49d..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/plugin.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/plugin.properties
deleted file mode 100644
index 09fcddc..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature/sourceTemplatePlugin/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Oracle Corporation - initial API and implementation
-###############################################################################
-# This file should be translated.
-# plugin.properties
-# contains externalized strings for manifest.mf
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-pluginName=WTP Web Page Editor Apache MyFaces Trinidad Tag Support Source
-providerName=Eclipse.org
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/.project b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/.project
deleted file mode 100644
index 8ff0421..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/build.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/build.properties
deleted file mode 100644
index bea9927..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c)  2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-bin.includes = feature.xml,\
-               eclipse_update_120.jpg,\
-               epl-v10.html,\
-               feature.properties,\
-               license.html
-
-generate.feature@org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature.source = org.eclipse.jst.jsf.apache.trinidad.tagsupport.feature
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/epl-v10.html b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.properties b/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.properties
deleted file mode 100644
index e9eb5e6..0000000
--- a/jsf/features/org.eclipse.jst.jsf.apache.trinidad.tagsupport_sdk.feature/feature.properties
+++ /dev/null
@@ -1,140 +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"
-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\
-March 17, 2005\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.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(TM) ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-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" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - 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, and\n\
-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 29a4f4a..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.2.100.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 87ab921..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.properties
+++ /dev/null
@@ -1,170 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# feature.properties
-# contains externalized strings for feature.xml
-# "%foo" in feature.xml corresponds to the key "foo" in this file
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-
-# "featureName" property - name of the feature
-featureName=Web Page Editor (Optional)
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "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"
-copyright=\
-Copyright (c) 2007 Oracle Corporation.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.xml b/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.xml
deleted file mode 100644
index ba411fa..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/feature.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.jst.webpageeditor.feature"
-      label="%featureName"
-      version="2.3.0.qualifier"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="license.html">
-      %license
-   </license>
-
-   <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>
-
-   <plugin
-         id="org.eclipse.jst.pagedesigner"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.pagedesigner.jsf.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.jst.pagedesigner.jsp.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/license.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.html
deleted file mode 100644
index fe81d46..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<P>June, 2008</P>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.ini b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.mappings b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.mappings
deleted file mode 100644
index a28390a..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.properties
deleted file mode 100644
index e3cbbc3..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/about.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be translated.
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=Web Page Editor Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2007.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
-
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/build.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/build.properties
deleted file mode 100644
index 43309f0..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = about.html, about.ini, about.mappings, about.properties, eclipse32.gif, plugin.properties, plugin.xml, src/**, META-INF/
-sourcePlugin = true
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.gif b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.png b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.png
deleted file mode 100644
index 50ae49d..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/plugin.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/plugin.properties
deleted file mode 100644
index 46b3449..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateBundle/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be translated.
-# plugin.properties
-# contains externalized strings for manifest.mf
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-pluginName=Web Page Editor Source
-providerName=Eclipse.org
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/build.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/build.properties
deleted file mode 100644
index 657ba1b..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be NOT be translated.
-bin.includes =\
-epl-v10.html,\
-eclipse_update_120.jpg,\
-feature.xml,\
-feature.properties,\
-license.html
-
-
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/epl-v10.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/epl-v10.html
deleted file mode 100644
index 022ad29..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/feature.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/feature.properties
deleted file mode 100644
index 6cdf093..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,172 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be translated.
-# feature.properties
-# contains externalized strings for feature.xml
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-#
-# "featureName" property - name of the feature
-featureName=Web Page Editor Source
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse Web Tools Platform
-
-# "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\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/license.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplateFeature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.html b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.html
deleted file mode 100644
index fe81d46..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
-
-<P>June, 2008</P>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-<h3>Source Code</h3>
-<p>This plug-in contains source code zip files (&quot;Source Zips&quot;) that correspond to binary content in other plug-ins. These Source Zips may be distributed under different license
-agreements and/or notices. Details about these license agreements and notices are contained in &quot;about.html&quot; files (&quot;Abouts&quot;) located in sub-directories in the
-src/ directory of this plug-in. Such Abouts govern your use of the Source Zips in that directory, not the EPL.</p>
-
-</body>
-</html>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.ini b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.ini
deleted file mode 100644
index 2dee36a..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (not translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
-
-
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.mappings b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.mappings
deleted file mode 100644
index a28390a..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.properties
deleted file mode 100644
index e3cbbc3..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/about.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be translated.
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-
-blurb=Web Page Editor Source\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2007.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
-
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/build.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/build.properties
deleted file mode 100644
index 43309f0..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-bin.includes = about.html, about.ini, about.mappings, about.properties, eclipse32.gif, plugin.properties, plugin.xml, src/**, META-INF/
-sourcePlugin = true
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.gif b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.png b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.png
deleted file mode 100644
index 50ae49d..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/plugin.properties b/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/plugin.properties
deleted file mode 100644
index 46b3449..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor.feature/sourceTemplatePlugin/plugin.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-# This file should be translated.
-# plugin.properties
-# contains externalized strings for manifest.mf
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-#
-# Do not translate any values surrounded by {}
-pluginName=Web Page Editor Source
-providerName=Eclipse.org
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.cvsignore b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.cvsignore
deleted file mode 100644
index c14487c..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-build.xml
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.project b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.project
deleted file mode 100644
index 1e4ee00..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.webpageeditor_sdk.feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/build.properties b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/build.properties
deleted file mode 100644
index 9c94285..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-bin.includes = feature.xml,\
-               license.html,\
-               feature.properties,\
-               epl-v10.html,\
-               eclipse_update_120.jpg
-
-generate.feature@org.eclipse.jst.webpageeditor.feature.source = org.eclipse.jst.webpageeditor.feature
-               
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/eclipse_update_120.jpg b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/epl-v10.html b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.properties b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.properties
deleted file mode 100644
index fad1bae..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.properties
+++ /dev/null
@@ -1,170 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# feature.properties
-# contains externalized strings for feature.xml
-# "%foo" in feature.xml corresponds to the key "foo" in this file
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file should be translated.
-
-# "featureName" property - name of the feature
-featureName=Web Page Editor (Optional) SDK
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "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"
-copyright=\
-Copyright (c) 2007 Oracle Corporation.\
-All rights reserved. This program and the accompanying materials\
-are made available under the terms of the Eclipse Public License v1.0\
-which accompanies this distribution, and is available at\
-http://www.eclipse.org/legal/epl-v10.html\
-\n\
-Contributors:\n\
-    Oracle Corporation - initial API and implementation\n
-################ end of copyright property ####################################
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.xml b/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/feature.xml
deleted file mode 100644
index c280ec2..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.3.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 c184ca3..0000000
--- a/jsf/features/org.eclipse.jst.webpageeditor_sdk.feature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.classpath b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.cvsignore
deleted file mode 100644
index 6577ed9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-javaCompiler...args
-build.xml
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.project b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.project
deleted file mode 100644
index a17f881..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.apache.trinidad.tagsupport</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index bff1737..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,65 +0,0 @@
-#Mon Jun 30 15:50:06 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 12f045f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 12:01:04 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/META-INF/MANIFEST.MF
deleted file mode 100644
index e2f05f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,27 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.jsf.apache.trinidad.tagsupport;singleton:=true
-Bundle-Version: 1.1.100.qualifier
-Bundle-Localization: plugin
-Bundle-Activator: org.eclipse.jst.jsf.apache.trinidad.tagsupport.TrinidadTagSupportActivator
-Bundle-Vendor: %pluginProvider
-Require-Bundle: org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.pagedesigner;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.1.0,1.3.0)"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.jst.jsf.apache.trinidad.tagsupport;x-internal:=true,
- org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;x-internal:=true,
- org.eclipse.jst.jsf.apache.trinidad.tagsupport.dtresourceprovider;x-internal:=true,
- org.eclipse.jst.jsf.apache.trinidad.tagsupport.el;x-internal:=true,
- org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;x-internal:=true,
- org.eclipse.jst.jsf.apache.trinidad.tagsupport.model;x-internal:=true
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/about.html b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/build.properties b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/build.properties
deleted file mode 100644
index a7ed816..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               metadata/,\
-               plugin.properties,\
-               about.html,\
-               icons/,\
-               skinning/
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chart.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chart.gif
deleted file mode 100644
index 08a36db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chart.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseColor.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseColor.gif
deleted file mode 100644
index d20f760..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseColor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseDate.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseDate.gif
deleted file mode 100644
index ca3b962..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/large/chooseDate.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/chart.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/chart.gif
deleted file mode 100644
index d37d0d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/chart.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputColor.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputColor.gif
deleted file mode 100644
index eb59712..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputColor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputDate.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputDate.gif
deleted file mode 100644
index df5eceb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputDate.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputListOfValues.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputListOfValues.gif
deleted file mode 100644
index 890e68e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputListOfValues.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputNumberSpinbox.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputNumberSpinbox.gif
deleted file mode 100644
index 2504705..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/icon_inputNumberSpinbox.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/importScript.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/importScript.gif
deleted file mode 100644
index 7478ce7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/importScript.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/inputHidden.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/inputHidden.gif
deleted file mode 100644
index f18865b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/inputHidden.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/message.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/message.gif
deleted file mode 100644
index 7d0c261..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/message.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/messages.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/messages.gif
deleted file mode 100644
index 6f43980..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/messages.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/poll.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/poll.gif
deleted file mode 100644
index 35ba6f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/poll.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/selectItem.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/selectItem.gif
deleted file mode 100644
index 247efe0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/selectItem.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/spacer.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/spacer.gif
deleted file mode 100644
index 3c1b4b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/spacer.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/styleSheet.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/styleSheet.gif
deleted file mode 100644
index d8fde00..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/icons/small/styleSheet.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.properties b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.properties
deleted file mode 100644
index 56cc502..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-property.category.event=Event
-property.category.core=Core
-property.category.css=CSS
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.xml
deleted file mode 100644
index 0bb2dd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad.xml
+++ /dev/null
@@ -1,4192 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel id="http://myfaces.apache.org/trinidad" type="tagFile"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-    xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:qe="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore"
-    xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore"
- 	>
-    <entity id="forEach" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="items"/>
-				<section id="var"/>
-				<section id="begin"/>
-				<section id="end"/>
-				<section id="step"/>							
-			</value>
-		</trait>
-        <entity id="items"/>
-        <entity id="var"/>
-        <entity id="varStatus"/>
-        <entity id="begin">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="end">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="step">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="setActionListener" type="tag">
-       <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="to"/>
-				<section id="from"/>			
-			</value>
-		</trait>
-        <entity id="to"/>
-        <entity id="from"/>
-    </entity>
-    <entity id="fileDownloadActionListener" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="method"/>				
-				<section id="filename"/>
-				<section id="contentType"/>
-			</value>
-		</trait>    
-        <entity id="contentType">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ContentType</value>
-            </trait>
-        </entity>
-        <entity id="filename"/>
-        <entity id="method">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-				<value xsi:type="mdt:ListOfValues">
-					<item>javax.faces.context.FacesContext</item>
-					<item>java.io.OutputStream</item>
-				</value>	
-            </trait>
-        </entity>
-    </entity>
-    <entity id="returnActionListener" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="value"/>
-			</value>
-		</trait>        
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-			<trait id="runtime-type-setter-required">
-				<value>true</value>
-			</trait>            
-        </entity>
-    </entity>
-    <entity id="resetActionListener" type="tag"/>
-    <entity id="componentRef" type="tag">
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="componentType"/>
-			</value>
-		</trait>    
-        <entity id="componentType"/>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="rendered">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="componentDef" type="tag">
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="var"/>				
-			</value>
-		</trait>   
-        <entity id="var">
-            <trait id="contributes-value-binding">
-                <value>true</value>
-            </trait>
-            <trait id="value-binding-scope">
-                <value>request</value>
-            </trait>
-            <trait id="value-binding-symbol-factory">
-                <value>org.eclipse.jst.jsf.common.unknownTypeSymbolFactory</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="facetRef" type="tag">
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="facetName"/>				
-			</value>
-		</trait>       
-        <entity id="facetName"/>
-    </entity>
-    <entity id="breadCrumbs" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>nodeStamp</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="orientation"/>
-			</value>
-		</trait>      		   	
-        <entity id="var"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-        <entity id="orientation">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>        	
-        	<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>horizontal</item>
-					<item>vertical</item>					
-				</value>
-			</trait>
-		</entity>
-    </entity>
-    <entity id="chart" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="type"/>
-			</value>
-		</trait>     	
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.ChartModel</value>
-            </trait>
-        </entity>
-        <entity id="chartDrillDownListener">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-           	<trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.ChartDrillDownEvent</value>
-            </trait>
-        </entity>
-        <entity id="type">
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>verticalBar</item>
-					<item>horizontalBar</item>
-					<item>stackedVerticalBar</item>
-					<item>stackedHorizontalBar</item>	
-					<item>pie</item>
-					<item>area</item>
-					<item>stackedArea</item>
-					<item>line</item>
-					<item>barLine</item>
-					<item>XYLine</item>	
-					<item>scatterPlot</item>
-					<item>radar</item>
-					<item>radarArea</item>
-					<item>funnel</item>
-					<item>circularGauge</item>
-					<item>semiCircularGauge</item>							
-				</value>
-			</trait>
-		</entity>
-        <entity id="templateSource"/>
-        <entity id="perspective">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="legendPosition">
-        	<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>bottom</item>					
-					<item>top</item>
-					<item>start</item>	
-				</value>
-			</trait>
-		</entity>
-        <entity id="animationDuration">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="YMajorGridLineCount">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="YMinorGridLineCount">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="XMajorGridLineCount">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="maxPrecision">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="gradientsUsed">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="tooltipsVisible">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="chooseColor" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="colorData"/>
-			</value>
-		</trait>     	
-        <entity id="colorData"/>
-        <entity id="customColorData"/>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="chooseDate" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="shortDesc"/>
-			</value>
-		</trait>     	
-        <entity id="minValue"/>
-        <entity id="maxValue"/>
-    </entity>
-    <entity id="column" type="tag">
-     	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>header</item>
-				<item>footer</item>					
-			</value> 	
-   		</trait> -->   	
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="sortable"/>
-				<section id="align"/>
-				<section id="separateRows"/>
-				<section id="headerNoWrap"/>
-			</value>
-		</trait>    		
-        <entity id="sortProperty"/>
-        <entity id="align">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>left</item>
-                    <item>center</item>
-                    <item>right</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="defaultSortOrder">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>ascending</item>
-                    <item>descending</item>                    
-                </value>
-            </trait>        
-        </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="headerText"/>
-        <entity id="noWrap">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="headerNoWrap">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>   
-        </entity>
-        <entity id="sortable">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>   
-        </entity>
-        
-        <entity id="separateRows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>   
-        </entity>
-        <entity id="rowHeader"/>
-    </entity>
-    <entity id="commandButton" type="tag">
-     	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-command-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>
-				<section id="action"/>
-				<section id="accessKey"/>
-				<section id="immediate"/>
-			</value>
-		</trait>     	
-        <entity id="blocking">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="icon"/>
-
-    </entity>
-    <entity id="commandLink" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<include-entity-group id="common-command-attributes"/>   
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>				
-				<section id="action"/>
-				<section id="immediate"/>
-			</value>
-		</trait> 		 	
-        <entity id="blocking">
-             <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="commandNavigationItem" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<include-entity-group id="common-command-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>				
-				<section id="action"/>
-				<section id="immediate"/>
-			</value>
-		</trait> 		
-        <entity id="destination"/>
-        <entity id="icon"/>   
-    	<entity id="selected">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-    	</entity>
-        <entity id="visited">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="targetFrame"/>
-    </entity>
-    <entity id="document" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>metaContainer</item>					
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="mode"/>
-				<section id="initialFocusId"/>				
-			</value>
-		</trait>    		
-        <entity id="title">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-        </entity>
-        <entity id="mode">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>strict</item>
-					<item>quirks</item>
-				</value>            
-            </trait>
-           	<trait id="default-value">
-           		<value>default</value>
-           	</trait>
-        </entity>        	
-        <entity id="onload">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-        	<trait id="category">
-           		<value>%property.category.event</value>
-           	</trait>
-        </entity>
-        <entity id="onunload">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-        	<trait id="category">
-           		<value>%property.category.event</value>
-           	</trait>
-        </entity>
-        <entity id="initialFocusId"/>
-    </entity>
-    <entity id="form" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="defaultCommand"/>				
-			</value>
-		</trait>     	
-        <entity id="targetFrame"/>
-        <entity id="usesUpload">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="defaultCommand"/>
-        <entity id="onsubmit">
-                	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-        	<trait id="category">
-           		<value>%property.category.event</value>
-           	</trait>
-        </entity>
-    </entity>
-    <entity id="goButton" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>	
-				<section id="textAndAccessKey"/>	
-				<section id="destination"/>								
-			</value>
-		</trait>       	
-        <entity id="destination"/>
-        <entity id="text"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="textAndAccessKey"/>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="targetFrame"/>
-        <entity id="icon"/>
-    </entity>
-    <entity id="goLink" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>	
-				<section id="textAndAccessKey"/>	
-				<section id="destination"/>								
-			</value>
-		</trait>      	
-        <entity id="destination"/>
-        <entity id="text"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="textAndAccessKey"/>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="targetFrame"/>
-    </entity>
-    <entity id="icon" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="name"/>								
-			</value>
-		</trait>  
-        <entity id="name"/>
-    </entity>
-    <entity id="image" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="source"/>		
-				<section id="shortDesc"/>						
-			</value>
-		</trait>      	
-        <entity id="source"/>
-        <entity id="longDescURL"/>
-        <entity id="imageMapType">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>server</item>
-				</value>            
-            </trait>
-        </entity>
-    </entity>
-    <entity id="importScript" type="tag">
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="names"/>								
-			</value>
-		</trait>      	
-        <entity id="names"/>
-    </entity>
-    <entity id="inputColor" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>  
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>								
-			</value>
-		</trait>      	
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait>   -->             
-        <entity id="action">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="actionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>           
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="returnListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.ReturnEvent</value>
-            </trait>        
-        </entity>
-        <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	      
-        </entity>
-        <entity id="compact">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="chooseId">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="columns">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="inputDate" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>    
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>	
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>									
-			</value>
-		</trait>  
-        <entity id="action">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="actionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>           
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="returnListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.ReturnEvent</value>
-            </trait>        
-        </entity>
-	    <entity id="contentStyle">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-	    </entity>
-        <entity id="chooseId"/>
-        <entity id="columns">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="maximumLength">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-    </entity>
-    <entity id="inputFile" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>    
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>	
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>									
-			</value>
-		</trait>    		    	
-        <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-        </entity>
-        <entity id="columns">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-    </entity>
-    <entity id="inputHidden" type="tag">
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>   
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>											
-			</value>
-		</trait>     	 	
-    </entity>
-    <entity id="inputListOfValues" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/> 
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="action"/>
-				<section id="searchDesc"/>
-				<section id="columns"/>									
-			</value>
-		</trait>      	
-        <entity id="action">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="actionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="returnListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.ReturnEvent</value>
-            </trait>        
-        </entity>
-       <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-       </entity>
-        <entity id="searchDesc"/>
-        <entity id="icon"/>
-        <entity id="columns">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="maximumLength">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="windowWidth">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="windowHeight">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-    </entity>
-    <entity id="inputNumberSpinbox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>  
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>    	 
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 			
-   		</trait>  	-->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="minimum"/>
-				<section id="maximum"/>
-				<section id="stepSize"/>
-				<section id="onclick"/>									
-			</value>
-		</trait>      	   		
-        <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-        </entity>
-        <entity id="columns">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="maximum">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="minimum">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="stepSize">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="styleClass">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>        
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>AFFieldTextMarker</item>
-					<item>AFFieldTextLTRMarker</item>
-					<item>AFFieldNumberMarker</item>							
-				</value>
-			</trait>
-        </entity>        
-    </entity>
-    <entity id="inputText" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="showRequired"/>
-				<section id="secret"/>				
-				<section id="autoSubmit"/>
-				<section id="immediate"/>
-			</value>
-		</trait>   		    	    	
-       	<entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-       	</entity>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>1</value>
-            </trait>
-        </entity>
-        <entity id="wrap">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait> 
-             <trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>off</item>
-					<item>soft</item>
-					<item>hard</item>							
-				</value>
-			</trait>    
-		    <trait id="default-value">
-                <value>soft</value>
-            </trait> 
-        </entity>
-        <entity id="secret">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="columns">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="maximumLength">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>        
-        </entity>
-        <entity id="styleClass">
-	     	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>        
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-			 		<item>AFDataText</item>
-					<item>AFFieldTextMarker</item>
-					<item>AFFieldTextLTRMarker</item>
-					<item>AFPhoneFieldTextMarker</item>							
-					<item>AFPostalCodeFieldTextMarker</item>
-					<item>AFAddressFieldTextMarker</item>
-					<item>AFFieldNumberMarker</item>	
-				</value>
-			</trait>
-        </entity> 
-    </entity>
-    <entity id="legend" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="name"/>
-			</value>
-		</trait>  
-        <entity id="name">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>        
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>required</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-			 	<value>required</value>
-			</trait>
-		</entity>			
-    </entity>
-    <entity id="media" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="source"/>
-				<section id="shortDesc"/>
-				<section id="innerWidth"/>
-				<section id="innerHeight"/>				
-				<section id="autoStart"/>
-				<section id="controls"/>
-				<section id="player"/>
-			</value>
-		</trait>  
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>   
-		</entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>   
-		</entity>
-        <entity id="innerWidth">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>   
-		</entity>
-        <entity id="innerHeight">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>   
-		</entity>
-        <entity id="source"/>
-        <entity id="autostart">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>   
-		</entity>
-        <entity id="playCount">
-            <trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>   
-		</entity>
-        <entity id="contentType">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ContentType</value>
-            </trait>
-        </entity>
-        <entity id="standbyText"/>
-        <entity id="player">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>           
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">			
-					<item>windows</item>
-					<item>quicktime</item>
-					<item>link</item>
-					<item>real</item>
-				</value>
-			</trait>        
-        </entity>
-        <entity id="controls">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>           
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">			
-					<item>none</item>
-					<item>noneVisible</item>
-					<item>minimal</item>
-					<item>typical</item>
-					<item>all</item>
-				</value>
-			</trait>    
-			<trait id="default-value">
-				<value>typical</value>
-			</trait>    
-        </entity>
-    </entity>
-    <entity id="message" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>					
-			</value> 	
-   		</trait>   -->
-     	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="for"/>
-				<section id="binding"/>
-				<section id="messageType"/>
-				<section id="inlineStyle"/>		
-			</value>
-		</trait>   		    	
-        <entity id="for"/>
-        <entity id="message"/>
-        <entity id="messageType">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>info</item>
-					<item>confirmation</item>
-					<item>warning</item>
-					<item>none</item>
-					<item>error</item>					
-				</value>
-			</trait>
-        </entity>
-
-    </entity>
-    <entity id="messages" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="inlineStyle"/>
-				<section id="layout"/>			
-			</value>
-		</trait>  
-        <entity id="message"/>
-        <entity id="text"/>
-        <entity id="globalOnly">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>		
-    </entity>
-    <entity id="navigationPane" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>nodeStamp</item>					
-			</value> 	
-   		</trait> -->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="hint"/>		
-			</value>
-		</trait>     		    	
-        <entity id="var"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="level">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>0</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="hint">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">			
-					<item>bar</item>
-					<item>buttons</item>
-					<item>choice</item>
-					<item>list</item>
-					<item>tabs</item>
-				</value>
-			</trait>           
-        </entity>
-        <entity id="title"/>
-    </entity>
-    <entity id="navigationTree" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>nodeStamp</item>					
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>
-				<section id="var"/>			
-			</value>
-		</trait>       	
-        <entity id="var"/>
-        <entity id="rowDisclosureListener">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RowDisclosureEvent</value>
-            </trait>
-        </entity>
-        <entity id="disclosedRowKeys"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="startLevel">
-           <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>0</value>
-            </trait>
-        </entity>        
-        <entity id="varStatus"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="outputDocument" type="tag">
-    	<include-entity-group id="common-event-attributes"/>        
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>nodeStamp</item>					
-			</value> 	
-   		</trait> -->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>				
-			</value>
-		</trait>     		      	
-        <entity id="titleClass">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-            </trait>
-        </entity>
-        <entity id="separatorClass">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="outputFormatted" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>
-				<section id="styleUsage"/>			
-			</value>
-		</trait>      	
-        <entity id="styleUsage">        	
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>pageStamp</item>
-					<item>instruction</item>
-					<item>inContextBranding</item>
-				</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>					
-        </entity>
-    </entity>
-    <entity id="outputLabel" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>
-				<section id="for"/>			
-			</value>
-		</trait>      	
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="showRequired">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="valueAndAccessKey"/>
-        <entity id="for"/>
-    </entity>
-    <entity id="outputText" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>					
-			</value>
-		</trait>      	
-        <entity id="truncateAt"/>
-        <entity id="description"/>
-        <entity id="escape">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="page" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>actions</item>
-				<item>appAbout</item>
-				<item>appCopyright</item>
-				<item>appPrivacy</item>
-				<item>branding</item>
-				<item>brandingApp</item>
-				<item>brandingAppContextual</item>
-				<item>contextSwitcher</item>
-				<item>infoFootnote</item>
-				<item>infoReturn</item>
-				<item>infoStatus</item>
-				<item>infoSupplemental</item>
-				<item>infoUser</item>
-				<item>location</item>
-				<item>menuSwitch</item>
-				<item>messages</item>
-				<item>nodeStamp</item>
-				<item>search</item>	
-			</value> 	
-   		</trait>  -->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="value"/>
-				<section id="var"/>			
-			</value>
-		</trait>     		     	
-        <entity id="var"/>
-        <entity id="rowDisclosureListener">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RowDisclosureEvent</value>
-            </trait>
-        </entity>
-        <entity id="disclosedRowKeys"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="chromeType">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>compact</item>
-					<item>expanded</item>
-				</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelAccordion" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="discloseNone"/>
-				<section id="discloseMany"/>
-			</value>
-		</trait>      	
-        <entity id="discloseNone">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="discloseMany">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelBorderLayout" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>bottom</item>
-				<item>end</item>
-				<item>innerBottom</item>
-				<item>innerEnd</item>
-				<item>innerLeft</item>
-				<item>innerRight</item>
-				<item>innerStart</item>
-				<item>innerTop</item>
-				<item>left</item>
-				<item>right</item>
-				<item>start</item>
-				<item>top</item>
-			</value> 	
-   		</trait>   -->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>						
-			</value>
-		</trait>     		  	        
-    </entity>
-    <entity id="panelBox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="text"/>
-				<section id="background"/>			
-			</value>
-		</trait>      	
-        <entity id="text"/>
-        <entity id="background">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>light</item>
-					<item>medium</item>
-					<item>dark</item>
-					<item>transparent</item>							
-				</value>
-			</trait>
-        </entity>
-        <entity id="icon"/>
-       	<entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-       	</entity>
-    </entity>
-    <entity id="panelButtonBar" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>								
-				<section id="halign"/>			
-			</value>
-		</trait>      	
-        <entity id="halign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>left</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelCaptionGroup" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>caption</item>
-			</value>
-		</trait>     	-->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="captionText"/>						
-			</value>
-		</trait>  		
-        <entity id="captionText"/>
-    </entity>
-    <entity id="panelChoice" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="label"/>
-				<section id="labelAndAccessKey"/>
-				<section id="position"/>			
-			</value>
-		</trait>     
-        <entity id="label"/>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="labelAndAccessKey"/>
-        <entity id="position">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>top</item>
-					<item>start</item>				
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>start</value>
-			</trait>
-        </entity>
-        <entity id="alignment">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>top</item>
-					<item>bottom</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>center</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelFormLayout" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>footer</item>
-			</value>
-		</trait> -->
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>								
-				<section id="labelWidth"/>		
-				<section id="fieldWidth"/>
-				<section id="rows"/>	
-			</value>
-		</trait>  		     	
-        <entity id="fieldWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="labelWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="maxColumns">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelGroupLayout" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>separator</item>
-			</value>
-		</trait>        -->	
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="layout"/>
-			</value>
-		</trait>
-        <entity id="layout">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>horizontal</item>
-					<item>vertical</item>				
-				</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelHeader" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="text"/>
-			</value>
-		</trait>    	
-        <entity id="text"/>
-        <entity id="icon"/>
-        <entity id="messageType">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>info</item>
-					<item>confirmation</item>
-					<item>warning</item>
-					<item>none</item>
-					<item>error</item>					
-				</value>
-			</trait>
-        </entity>
-        <entity id="size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="default-value">
-            	<value>-1</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelHorizontalLayout" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>separator</item>
-			</value>
-		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="halign"/>
-				<section id="valign"/>
-			</value>
-		</trait>       	
-        <entity id="valign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>top</item>
-                    <item>middle</item>
-                    <item>bottom</item>
-                    <item>baseline</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="halign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>right</item>
-                    <item>left</item>
-                    <item>start</item>
-                    <item>end</item>
-                    <item>center</item>
-                </value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelLabelAndMessage" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>end</item>
-				<item>help</item>
-			</value>
-		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>			
-				<section id="for"/>	
-				<section id="label"/>
-				<section id="message"/>
-			</value>
-		</trait>     	
-        <entity id="showRequired">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="label"/>
-        <entity id="labelStyle">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-            </trait>        
-        </entity>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>        
-        </entity>
-        <entity id="labelAndAccessKey"/>
-        <entity id="for"/>
-    </entity>
-    <entity id="panelList" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-     	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="rows"/>
-				<section id="maxColumns"/>		
-			</value>
-		</trait>      	
-        <entity id="listStyle"/>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="maxColumns">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelPage" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>appAbout</item>
-				<item>appCopyright</item>
-				<item>appPrivacy</item>
-				<item>auxiliary1</item>
-				<item>auxiliary2</item>
-				<item>auxiliaryGlobal</item>
-				<item>branding</item>
-				<item>contextGlobal</item>
-				<item>contextLocal</item>
-				<item>infoFootnote</item>
-				<item>infoReturn</item>
-				<item>infoStatus</item>
-				<item>infoUser</item>
-				<item>location</item>
-				<item>navigation1</item>
-				<item>navigation2</item>
-				<item>navigation3</item>
-				<item>navigationGlobal</item>
-				<item>search</item>	
-				<item>toolbar1</item>
-				<item>toolbar2</item>
-				<item>toolbarGlobal</item>
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-			</value>
-		</trait>  
-        <entity id="auxiliary1Size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>        
-        </entity>
-        <entity id="auxiliary2Size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>        
-        </entity>
-        <entity id="auxiliaryGlobalSize">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>        
-        </entity>
-    </entity>
-    <entity id="panelPageHeader" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>branding</item>
-				<item>brandingApp</item>
-				<item>brandingAppContextual</item>
-				<item>menuSwitch</item>
-				<item>navigation1</item>
-				<item>navigation2</item>
-				<item>navigationGlobal</item>
-				<item>search</item>	
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="chromeType"/>				
-			</value>
-		</trait>     		    	 	
-        <entity id="chromeType">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>compact</item>
-					<item>expanded</item>
-				</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelPopup" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>trigger</item>
-			</value>
-		</trait>   -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>
-				<section id="triggerType"/>	
-				<section id="position"/>
-				<section id="modal"/>	
-				<section id="height"/>
-				<section id="width"/>	
-			</value>
-		</trait>  	
-        <entity id="triggerType">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>click</item>
-					<item>hover</item>
-				</value>
-			</trait>
-        </entity>
-        <entity id="icon"/>
-        <entity id="text"/>
-        <entity id="title"/>
-        <entity id="modal">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="position">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>relative</item>
-					<item>centered</item>
-				</value>
-			</trait>
-        </entity>
-        <entity id="xoffset">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>        
-        </entity>
-        <entity id="yoffset">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>        
-        </entity>
-       <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-       </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelRadio" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="label"/>
-				<section id="alignment"/>	
-				<section id="position"/>	
-			</value>
-		</trait>      	
-        <entity id="position">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>top</item>
-					<item>start</item>
-				</value>
-			</trait>
-        </entity>
-        <entity id="alignment">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>top</item>
-					<item>bottom</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>center</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelSideBar" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>filter</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="width"/>	
-			</value>
-		</trait>  
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="panelTabbed" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="position"/>
-			</value>
-		</trait>
-        <entity id="position">
-         	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>above</item>
-					<item>below</item>
-					<item>both</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>both</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="panelTip" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-			</value>
-		</trait>  
-    </entity>
-    <entity id="poll" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="interval"/>
-				<section id="pollListener"/>						
-			</value>
-		</trait>      	
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="pollListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>           
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.PollEvent</value>
-            </trait>        
-        </entity>
-        <entity id="interval">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="value-minimum">
-            	<value>1</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="processChoiceBar" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>nodeStamp</item>					
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="var"/>	
-				<section id="shortDesc"/>	
-			</value>
-		</trait>     		    	
-        <entity id="var"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-    </entity>
-    <entity id="progressIndicator" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="action"/>					
-			</value>
-		</trait>      	
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.BoundedRangeModel</value>
-            </trait>
-        </entity>
-        <entity id="action">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="actionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>           
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="resetButton" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>
-				<section id="accessKey"/>	
-				<section id="disabled"/>	
-			</value>
-		</trait>      	
-        <entity id="text"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="textAndAccessKey"/>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="selectBooleanCheckbox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="text"/>	
-				<section id="label"/>	
-			</value>
-		</trait>      	
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait>   -->   	
-    	<entity id="selected">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-    	</entity>
-     </entity>
-    <entity id="selectBooleanRadio" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> 
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="text"/>	
-				<section id="label"/>	
-				<section id="selected"/>
-				<section id="group"/>
-			</value>
-		</trait>    		      	
-    	<entity id="selected">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-    	</entity>
-        <entity id="group"/>
-    </entity>
-    <entity id="selectItem" type="tag">
-    	<include-entity-group id="common-core-attributes"/>  
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>					
-			</value>
-		</trait>     	  	
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.Object</value>
-            </trait>
-        </entity>
-        <entity id="label"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="longDesc"/>
-        <entity id="shortDesc"/>
-    </entity>
-    <entity id="selectManyCheckbox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>	
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>       	
-        <entity id="layout">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>        	
-        	<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>horizontal</item>
-					<item>vertical</item>					
-				</value>
-			</trait>
-		</entity>
-    </entity>
-    <entity id="selectManyListbox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>	
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>       	
-        <entity id="size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>1</value>
-            </trait>
-        </entity>                  
-    </entity>
-    <entity id="selectManyShuttle" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>filter</item>
-				<item>leadingFooter</item>
-				<item>trailingFooter</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="leadingHeader"/>
-				<section id="trailingHeader"/>		
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>       	     	
-        <entity id="size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>10</value>
-            </trait>
-            <trait id="valid-maximum">
-                <value>20</value>
-            </trait>            
-        </entity>
-        <entity id="leadingHeader"/>
-        <entity id="trailingHeader"/>
-        <entity id="leadingDescShown">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="trailingDescShown">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="selectOneChoice" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>       
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="label"/>
-				<section id="unselectedLabel"/>	
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>    		     	
-    </entity>
-    <entity id="selectOneListbox" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-     	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>   
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="label"/>
-				<section id="unselectedLabel"/>	
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>      	     
-    </entity>
-    <entity id="selectOneRadio" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-text-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>     
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>help</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="label"/>
-				<section id="unselectedLabel"/>	
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>   
-        <entity id="layout">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>        	
-        	<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>horizontal</item>
-					<item>vertical</item>					
-				</value>
-			</trait>
-		</entity>
-    </entity>
-    <entity id="selectOrderShuttle" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-value-holder-attributes"/>
-    	<include-entity-group id="common-input-tag-attributes"/>
-    	<include-entity-group id="common-select-tag-attributes"/>
-    	<include-entity-group id="common-label-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>filter</item>
-				<item>leadingFooter</item>
-				<item>trailingFooter</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="leadingHeader"/>
-				<section id="trailingHeader"/>		
-				<section id="valueChangeListener"/>	
-			</value>
-		</trait>       	     	
-
-    	<entity id="reorderOnly">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-		</entity>    	
-        <entity id="size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-        <entity id="leadingHeader"/>
-        <entity id="trailingHeader"/>
-        <entity id="leadingDescShown">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-		</entity>  
-        <entity id="trailingDescShown">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-		</entity>  
-    </entity>
-    <entity id="selectRangeChoiceBar" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>rangeLabel</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="label"/>
-				<section id="first"/>
-				<section id="rows"/>		
-				<section id="var"/>	
-			</value>
-		</trait>       	     	   		      	
-        <entity id="var"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="rangeChangeListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>  
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>org.apache.myfaces.trinidad.event.RangeChangeEvent</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.Object</value>
-            </trait>
-        </entity>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-        <entity id="first">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="separator" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-			</value>
-		</trait>       	     	    	
-    </entity>
-    <entity id="showDetail" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<include-entity-group id="common-show-tag-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>prompt</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="disclosedText"/>
-				<section id="undisclosedText"/>
-				<section id="discloseListener"/>
-				<section id="partialTriggers"/>				
-			</value>
-		</trait>       	     	   		   		
-        <entity id="disclosedText"/>
-        <entity id="undisclosedText"/>
-    </entity>
-    <entity id="showDetailHeader" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<include-entity-group id="common-show-tag-attributes"/>	
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="text"/>
-				<section id="discloseListener"/>
-				<section id="partialTriggers"/>				
-			</value>
-		</trait>      	     				
-        <entity id="text"/>
-        <entity id="icon"/>
-        <entity id="messageType">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>info</item>
-					<item>confirmation</item>
-					<item>warning</item>
-					<item>none</item>
-					<item>error</item>					
-				</value>
-			</trait>
-        </entity>
-        <entity id="size">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="showDetailItem" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<include-entity-group id="common-show-tag-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="text"/>
-				<section id="textAndAccessKey"/>
-				<section id="disclosed"/>
-				<section id="disabled"/>
-			</value>
-		</trait>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>toolbar</item>
-			</value> 	
-   		</trait>  -->    	
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="text">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-        </entity>
-        <entity id="textAndAccessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-        </entity>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="flex">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="singleStepButtonBar" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>				
-				<section id="selectedStep"/>
-				<section id="maxStep"/>
-				<section id="nextAction"/>
-				<section id="previousAction"/>					
-			</value>
-		</trait>    	
-        <entity id="selectedStep">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>1</value>
-            </trait>
-        </entity>
-        <entity id="maxStep">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="previousActionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="nextActionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="nextAction">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="previousAction">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="text"/>
-    </entity>
-    <entity id="spacer" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="height"/>
-				<section id="width"/>
-			</value>
-		</trait>
-       <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>        
-        </entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>        
-        </entity>  
-    </entity>
-    <entity id="statusIndicator" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>busy</item>
-				<item>ready</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-			</value>
-		</trait>    	
-    </entity>
-    <entity id="subform" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="default"/>				
-			</value>
-		</trait>         
-        <entity id="default">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>       
-    </entity>
-    <entity id="switcher" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="defaultFacet"/>
-				<section id="facetName"/>				
-			</value>
-		</trait>     	
-    	<entity id="defaultFacet"/>
-    	<entity id="facetName"/>
-    </entity>
-    <entity id="table" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">
-			<value xsi:type="mdt:ListOfValues">
-				<item>actions</item>
-				<item>detailStamp</item>
-				<item>footer</item>
-				<item>header</item>				
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="var"/>
-				<section id="rows"/>
-				<section id="rowBandingInterval"/>
-				<section id="emptyText"/>
-				<section id="summary"/>
-				<section id="allDetailsEnabled"/>					
-			</value>
-		</trait>        	    	
-        <entity id="var">
-            <trait id="contributes-value-binding">
-                <value>true</value>
-            </trait>
-            <trait id="value-binding-scope">
-                <value>request</value>
-            </trait>
-            <trait id="value-binding-symbol-factory">
-                <value>org.eclipse.jst.jsf.common.unknownTypeSymbolFactory</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MultiSignatureValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-types">
-            	<value xsi:type="mdt:ListOfValues">					
-	                <item>org.apache.myfaces.trinidad.model.CollectionModel</item>
-	                <item>java.util.List</item>
-	                <item>java.util.Set</item>
-	                <item>java.util.Map</item>
-	                <item>javax.faces.model.DataModel</item>
-	                <item>java.lang.Object[]</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-        <entity id="first">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-        <entity id="rowDisclosureListener">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RowDisclosureEvent</value>
-            </trait>
-        </entity>
-        <entity id="disclosedRowKeys"/>
-        <entity id="selectionListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.SelectionEvent</value>
-            </trait>
-        </entity>        
-        <entity id="selectedRowKeys"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="sortListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.SortEvent</value>
-            </trait>
-        </entity>        
-        <entity id="rangeChangeListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RangeChangeEvent</value>
-            </trait>
-        </entity>        
-        <entity id="horizontalGridVisible">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="verticalGridVisible">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="emptyText"/>
-        <entity id="columnBandingInterval">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>0</value>
-            </trait>
-        </entity>
-        <entity id="rowBandingInterval">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>0</value>
-            </trait>
-        </entity>
-        <entity id="rowSelection">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>single</item>
-					<item>multiple</item>				
-				</value>
-			</trait>
-        </entity>
-        <entity id="autoSubmit">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="summary"/>
-        <entity id="allDetailsEnabled">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="train" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">				
-				<item>nodeStamp</item>
-			</value> 	
-   		</trait> -->
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="var"/>					
-			</value>
-		</trait>   		     	
-        <entity id="var"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.MenuModel</value>
-            </trait>
-        </entity>
-        <entity id="varStatus"/>
-    </entity>
-    <entity id="tree" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">				
-				<item>nodeStamp</item>
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="var"/>
-				<section id="initiallyExpanded"/>					
-			</value>
-		</trait>       	
-        <entity id="var"/>
-        <entity id="selectedRowKeys"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="rowDisclosureListener">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RowDisclosureEvent</value>
-            </trait>
-        </entity>
-        <entity id="disclosedRowKeys"/>
-        <entity id="selectionListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.SelectionEvent</value>
-            </trait>
-        </entity> 
-        <entity id="varStatus"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-            	<value>org.apache.myfaces.trinidad.model.TreeModel</value>
-            </trait>
-        </entity>
-        <entity id="focusRowKey"/>
-        <entity id="focusListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.FocusEvent</value>
-            </trait>
-        </entity> 
-        <entity id="initiallyExpanded">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="treeTable" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<include-entity-group id="common-trinidad-attributes"/>
-    	<include-entity-group id="common-event-attributes"/>
-    	<!-- <trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">				
-				<item>actions</item>
-				<item>footer</item>
-				<item>header</item>
-				<item>nodeStamp</item>
-				<item>pathStamp</item>				
-			</value> 	
-   		</trait> -->
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="summary"/>
-				<section id="emptyText"/>
-				<section id="rowByDepth"/>					
-			</value>
-		</trait>       	
-        <entity id="var"/>
-        <entity id="selectedRowKeys"/>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="rowDisclosureListener">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.RowDisclosureEvent</value>
-            </trait>
-        </entity>
-        <entity id="disclosedRowKeys"/>
-        <entity id="selectionListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.SelectionEvent</value>
-            </trait>
-        </entity> 
-        <entity id="varStatus"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>org.apache.myfaces.trinidad.model.TreeModel</value>
-            </trait>
-        </entity>
-        <entity id="focusRowKey"/>
-        <entity id="focusListener">        
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.FocusEvent</value>
-            </trait>
-        </entity> 
-        <entity id="initiallyExpanded">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="rootNodeRendered">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="rowsByDepth"/>
-        <entity id="rangeChangeListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>  
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>org.apache.myfaces.trinidad.event.RangeChangeEvent</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="horizontalGridVisible">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="verticalGridVisible">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="emptyText"/>
-        <entity id="columnBandingInterval">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="rowBandingInterval">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="rowSelection">			
-        	<trait id="attribute-value-runtime-type">
-        		<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-        	</trait>
-        	<trait id="valid-values">
-	        	<value xsi:type="mdt:ListOfValues">				
-					<item>none</item>
-					<item>single</item>
-					<item>multiple</item>
-				</value> 
-			</trait>
-		</entity>
-        <entity id="autoSubmit">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="summary"/>
-        <entity id="expandAllEnabled">
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="group" type="tag">
-    	<include-entity-group id="common-core-attributes"/>
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>					
-			</value>
-		</trait>
-    </entity>
-    <entity id="iterator" type="tag">
-		<include-entity-group id="common-core-attributes"/>    	
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="value"/>
-				<section id="var"/>
-				<section id="varStat"/>
-				<section id="first"/>				
-				<section id="rows"/>				
-			</value>
-		</trait>  		
-        <entity id="var"/>
-        <entity id="varStatus"/>
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MultiSignatureValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-types">
-            	<value xsi:type="mdt:ListOfValues">					
-	                <item>org.apache.myfaces.trinidad.model.CollectionModel</item>
-	                <item>java.util.List</item>
-	                <item>java.util.Set</item>
-	                <item>java.util.Map</item>
-	                <item>javax.faces.model.DataModel</item>
-	                <item>java.lang.Object[]</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="rows">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-        <entity id="first">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-                <value>0</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="convertColor" type="tag">
-   	 	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="patterns"/>
-				<section id="messageDetailConvert"/>
-				<section id="transparentAllowed"/>					
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="patterns"/>
-        <entity id="transparentAllowed">            
-        	<trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="messageDetailConvert"/>
-    </entity>
-    <entity id="convertDateTime" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="section.general.convertDateTime" type="SECTION"/>
-			</value>
-		</trait>	
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="messageDetailConvertDate"/>
-        <entity id="messageDetailConvertTime"/>
-        <entity id="messageDetailConvertBoth"/>
-        <entity id="dateStyle">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>short</item>
-					<item>medium</item>
-					<item>long</item>
-					<item>full</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>default</value>
-			</trait>
-		</entity>
-        <entity id="locale">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LocaleType</value>
-            </trait>        
-        </entity>
-		<entity id="pattern">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.DateTimePatternType</value>
-			</trait>
-		</entity>
-        <entity id="secondaryPattern">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.DateTimePatternType</value>
-			</trait>
-		</entity>
-        <entity id="timeStyle">			
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>short</item>
-					<item>medium</item>
-					<item>long</item>
-					<item>full</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>default</value>
-			</trait>
-		</entity>
-        <entity id="timeZone"/>
-		<entity id="type">			
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>date</item>
-					<item>time</item>
-					<item>both</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>both</value>
-			</trait>
-		</entity>
-    </entity>
-    <entity id="convertNumber" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="section.general.convertNumber" type="SECTION"/>
-			</value>
-		</trait>		    
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-		<entity id="currencyCode">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.CurrencyCodeType
-				</value>
-			</trait>
-		</entity>
-        <entity id="messageDetailConvertCurrency"/>
-        <entity id="messageDetailConvertNumber"/>
-        <entity id="messageDetailConvertPattern"/>
-        <entity id="messageDetailConvertPercent"/>
-        <entity id="currencySymbol"/>
-		<entity id="groupingUsed">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>true</value>
-			</trait>
-		</entity>
-		<entity id="integerOnly">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>false</value>
-			</trait>
-		</entity>
-		<entity id="locale">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.LocaleType
-				</value>
-			</trait>
-		</entity>
-		<entity id="maxFractionDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-        <entity id="maxIntegerDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-        <entity id="minFractionDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-        <entity id="minIntegerDigits">
-			<trait id="attribute-value-runtime-type">
-				<value>
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value>0</value></trait>
-		</entity>
-		<entity id="pattern">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.NumberPatternType</value>
-			</trait>
-		</entity>	
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>number</item>
-					<item>currency</item>
-					<item>percentage</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>number</value>
-			</trait>
-		</entity>
-    </entity>
-    <entity id="validateByteLength" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="maximum"/>
-				<section id="messageDetailMaximum"/>							
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="maximum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>1</value>
-            </trait>
-        </entity>
-        <entity id="encoding"/>
-        <entity id="messageDetailMaximum"/>
-    </entity>
-    <entity id="validateDateRestriction" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>					
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="invalidMonths"/>
-        <entity id="invalidDaysOfWeek"/>
-        <entity id="invalidDays"/>
-        <entity id="messageDetailInvalidMonths"/>
-        <entity id="messageDetailInvalidDaysOfWeek"/>
-        <entity id="messageDetailInvalidDays"/>
-    </entity>
-    <entity id="validateDateTimeRange" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="minimum"/>
-				<section id="messageDetailMinimum"/>
-				<section id="maximum"/>
-				<section id="messageDetailMaximum"/>							
-			</value>
-		</trait>    
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="maximum"/>
-        <entity id="minimum"/>
-        <entity id="messageDetailMaximum"/>
-        <entity id="messageDetailMinimum"/>
-        <entity id="messageDetailNotInRange"/>
-    </entity>
-    <entity id="validateDoubleRange" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="minimum"/>
-				<section id="messageDetailMinimum"/>
-				<section id="maximum"/>
-				<section id="messageDetailMaximum"/>							
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="maximum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.DoubleType</value>
-            </trait>
-        </entity>
-        <entity id="minimum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.DoubleType</value>
-            </trait>
-        </entity>
-        <entity id="messageDetailMaximum"/>
-        <entity id="messageDetailMinimum"/>
-        <entity id="messageDetailNotInRange"/>
-    </entity>
-    <entity id="validateLength" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="minimum"/>
-				<section id="messageDetailMinimum"/>
-				<section id="maximum"/>
-				<section id="messageDetailMaximum"/>							
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="maximum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="minimum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="messageDetailMaximum"/>
-        <entity id="messageDetailMinimum"/>
-        <entity id="messageDetailNotInRange"/>
-        <entity id="messageDetailExact"/>
-    </entity>
-    <entity id="validateLongRange" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="minimum"/>
-				<section id="messageDetailMinimum"/>
-				<section id="maximum"/>
-				<section id="messageDetailMaximum"/>							
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="maximum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LongType</value>
-            </trait>
-        </entity>
-        <entity id="minimum">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LongType</value>
-            </trait>
-        </entity>
-        <entity id="messageDetailMaximum"/>
-        <entity id="messageDetailMinimum"/>
-        <entity id="messageDetailNotInRange"/>
-    </entity>
-    <entity id="validateRegExp" type="tag">
-    	<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="pattern"/>
-				<section id="messageDetailNoMatch"/>							
-			</value>
-		</trait>
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-        </entity>
-        <entity id="pattern"/>
-        <entity id="messageDetailNoMatch"/>
-    </entity>
-    <entityGroup id="common-core-attributes">
-        <entity id="id">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-            </trait>
-            <trait id="category">
-				<value>%property.category.core</value>
-			</trait>	
-        </entity>
-        <entity id="rendered">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-            <trait id="category">
-				<value>%property.category.core</value>
-			</trait>	
-        </entity>
-        <entity id="binding">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>javax.faces.component.UIComponent</value>
-            </trait><trait id="category">
-				<value>%property.category.core</value>
-			</trait>	
-        </entity>
-        <entity id="attributeChangeListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>  
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>org.apache.myfaces.trinidad.event.AttributeChangeEvent</item>
-                </value>
-            </trait>    
-            <trait id="category">
-				<value>%property.category.core</value>
-			</trait>	    
-        </entity>
-    </entityGroup>
-    <entityGroup id="common-trinidad-attributes">
-        <entity id="inlineStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>			
-		</entity>
-        <entity id="styleClass">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>				
-        </entity>
-        <entity id="shortDesc">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>        
-        	<trait id="category">
-				<value>%property.category.core</value>
-			</trait>	
-        </entity>
-        <entity id="partialTriggers">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>        
-        	<trait id="category">
-				<value>%property.category.core</value>
-			</trait>	
-        </entity>
-    </entityGroup>
-	<entityGroup id="common-event-attributes"> 
-		<entity id="onclick">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="ondblclick">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmousedown">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseup">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseover">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmousemove">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseout">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeypress">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeydown">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeyup">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<!--almost common events - should be refactored-->
-		<entity id="onblur">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onchange">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onfocus">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onselect">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>					
-	</entityGroup>
-    <entityGroup id="common-show-tag-attributes">
-        <entity id="disclosed">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>        
-        </entity>
-        <entity id="disclosedTransient">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="disclosureListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>  
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>org.apache.myfaces.trinidad.event.DisclosureEvent</item>
-                </value>
-            </trait>
-        </entity>
-    </entityGroup>
-    <entityGroup id="common-value-holder-attributes">
-        <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="converter">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType</value>
-            </trait>
-        </entity>
-    </entityGroup>
-    <entityGroup id="common-input-tag-attributes">
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="required">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="validator">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>javax.faces.context.FacesContext</item>
-                    <item>javax.faces.component.UIComponent</item>
-                    <item>java.lang.Object</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="valueChangeListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>void</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ValueChangeEvent</value>
-            </trait>
-        </entity>
-        <entity id="requiredMessageDetail"/>
-    </entityGroup>
-    <entityGroup id="common-command-attributes">
-        <entity id="action">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-            </trait>
-            <trait id="runtime-return-type">
-                <value>java.lang.String</value>
-            </trait>
-        </entity>
-        <entity id="actionListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>javax.faces.event.ActionEvent</value>
-            </trait>
-        </entity>
-        <entity id="returnListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.ReturnEvent</value>
-            </trait>        
-        </entity>
-        <entity id="launchListener">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-            </trait>
-            <trait id="runtime-param-types">
-                <value>org.apache.myfaces.trinidad.event.LaunchEvent</value>
-            </trait>
-        </entity>
-        <entity id="immediate">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="useWindow">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="windowHeight">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="windowWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>        
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>  
-        </entity>      
-        <entity id="text"/>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="textAndAccessKey"/>       
-        <entity id="partialSubmit">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entityGroup>
-    <entityGroup id="common-select-tag-attributes">
-       <entity id="contentStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.css</value>
-			</trait>	       
-       </entity>
-       <entity id="valuePassThru">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-       <entity id="unselectedLabel"/>
-    </entityGroup>
-    <entityGroup id="common-text-attributes">
-        <entity id="autoSubmit">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="readOnly">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="text"/>
-        <entity id="textAndAccessKey"/>    
-	</entityGroup>   
-    <entityGroup id="common-label-attributes">
-        <entity id="label"/>
-        <entity id="accessKey">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-            </trait>
-        </entity>
-        <entity id="labelAndAccessKey"/>
-        <entity id="simple">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="showRequired">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>    
-        <entity id="readOnly">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="disabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-    </entityGroup>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_dti.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_dti.xml
deleted file mode 100644
index 323e432..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_dti.xml
+++ /dev/null
@@ -1,1453 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:dti="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"
-	id="http://myfaces.apache.org/trinidad"
-	type="tagFile">
-
-	<entity id="breadCrumbs" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.BreadCrumbsOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"					
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="chart" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeFromXPathOperation">
-						<parameter value="style"/>
-						<parameter value="concat('border:1px solid silver;padding:2px;',@inlineStyle)"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="color:#999999; font-size:8pt; vertical-align:middle;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="src"/>
-						<parameter value="$metadata-plugin-location$/icons/large/chart.gif"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="vertical-align:middle; margin:0px 3px 0px 0px;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="chart"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="chooseColor" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeFromXPathOperation">
-						<parameter value="style"/>
-						<parameter value="concat('border:1px solid silver;padding:2px;width:72px;height:72px;',@inlineStyle)"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="color:#999999; font-size:8pt; vertical-align:middle;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="src"/>
-						<parameter value="$metadata-plugin-location$/icons/large/chooseColor.gif"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="vertical-align:middle; margin:0px 3px 0px 0px;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="chooseColor"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="chooseDate" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeFromXPathOperation">
-						<parameter value="style"/>
-						<parameter value="concat('border:1px solid silver;padding:2px;width:224px;height:152px;',@inlineStyle)"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="color:#999999; font-size:8pt; vertical-align:middle;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="src"/>
-						<parameter value="$metadata-plugin-location$/icons/large/chooseDate.gif"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="style"/>
-						<parameter value="vertical-align:middle; margin:0px 3px 0px 0px;"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="chooseDate"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="span/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandButton" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="button"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="button"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@disabled='true'"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="disabled"/>
-							<parameter value=""/>
-						</operation>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="af_commandButton p_AFDisabled"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@disabled='true'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="af_commandButton"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="textAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="text"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@icon"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="img"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-							<parameter value="icon"/>
-							<parameter value="src"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandLink" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-						<parameter value="OraLinkText"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="textAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="text"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandNavigationItem" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CommandNavigationItemOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="document" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="html"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="head"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@title"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="title"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-							<parameter value="@title"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="body"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation"/>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="form" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="form"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="inlineStyle"/>
-						<parameter value="style"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"					
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="goButton" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="button"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="button"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@disabled='true'"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="disabled"/>
-							<parameter value=""/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-						<parameter value="af_goButton"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="textAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="text"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@icon"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="img"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-							<parameter value="icon"/>
-							<parameter value="src"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="goLink" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-						<parameter value="OraLinkText"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="textAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="text"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="group" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"					
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="icon" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@name='required' or @name='AFRequiredIcon'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="AFRequiredIconStyle"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-							<parameter value="*"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@name='info' or @name='AFInfoIcon'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="AFInfoIconStyle"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-							<parameter value="i"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@name='warning' or @name='AFWarningIcon'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="AFWarningIconStyle"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-							<parameter value="!"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@name='error' or @name='AFErrorIcon'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="AFErrorIconStyle"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-							<parameter value="X"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="image" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="source"/>
-						<parameter value="src"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="importScript" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/importScript.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputColor" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputTextWithIconOperation">
-						<parameter value="$metadata-plugin-location$/icons/small/icon_inputColor.gif"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputDate" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputTextWithIconOperation">
-						<parameter value="$metadata-plugin-location$/icons/small/icon_inputDate.gif"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputFile" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputFileOperation">
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputHidden" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/inputHidden.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputListOfValues" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputTextWithIconOperation">
-						<parameter value="$metadata-plugin-location$/icons/small/icon_inputListOfValues.gif"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputNumberSpinbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputTextWithIconOperation">
-						<parameter value="$metadata-plugin-location$/icons/small/icon_inputNumberSpinbox.gif"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName=".//a/img/src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputText" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.InputTextOperation">
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="message" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/message.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="messages" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/messages.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="navigationPane" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.NavigationPaneOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"					
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputFormatted" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.OutputFormattedOperation">
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputLabel" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="label"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-						<parameter value="for"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-						<parameter value="af_outputLabel"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@valueAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="valueAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@valueAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="value"/>
-						</operation>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputText" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="inlineStyle"/>
-						<parameter value="style"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelFormLayout" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.PanelFormLayoutOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelGroupLayout" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.PanelGroupLayoutOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelLabelAndMessage" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.PanelLabelAndMessageOperation">
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelTabbed" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.PanelTabbedOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelTip" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-						<parameter value="af_panelTip"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="class"/>
-						<parameter value="af_panelTip_label"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="TIP "/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="poll" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/poll.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="progressIndicator" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="table"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="cellpadding"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="cellspacing"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="border"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="align"/>
-						<parameter value="center"/>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation"/>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="tr"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="td"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="align"/>
-						<parameter value="center"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="class"/>
-						<parameter value="p_OraProcessingStatus"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="Processing"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="tr"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="td"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="align"/>
-						<parameter value="center"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="resetButton" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="button"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="reset"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@disabled='true'"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="disabled"/>
-							<parameter value=""/>
-						</operation>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="af_resetButton p_AFDisabled"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@disabled='true'"/>
-						<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateClassAttributeOperation">
-							<parameter value="af_resetButton"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.CreateStyleAttributeOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="textAndAccessKey"/>
-						</operation>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@textAndAccessKey"/>
-						<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-							<parameter value="text"/>
-						</operation>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectBooleanCheckbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectBooleanOperation">
-						<parameter value="checkbox"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectBooleanRadio" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectBooleanOperation">
-						<parameter value="radio"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectItem" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/selectItem.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyCheckbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectManyCheckboxOneRadioOperation">
-						<parameter value="checkbox"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyListbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectListboxChoiceOperation">
-						<parameter value="true"/>
-						<parameter value="true"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyShuttle" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectShuttleOperation">
-						<parameter value="false"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneChoice" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectListboxChoiceOperation">
-						<parameter value="false"/>
-						<parameter value="false"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneListbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectListboxChoiceOperation">
-						<parameter value="false"/>
-						<parameter value="true"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneRadio" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectManyCheckboxOneRadioOperation">
-						<parameter value="radio"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOrderShuttle" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.SelectShuttleOperation">
-						<parameter value="true"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectRangeChoiceBar" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="table"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="inlineStyle"/>
-						<parameter value="style"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="cellpadding"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="cellspacing"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="border"/>
-						<parameter value="0"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="tr"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="td"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="valign"/>
-						<parameter value="middle"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="nowrap"/>
-						<parameter value=""/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="class"/>
-						<parameter value="OraNavBarActiveLink"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-						<parameter value="concat('Previous ',@rows)"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="td"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="valign"/>
-						<parameter value="middle"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="nowrap"/>
-						<parameter value=""/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="class"/>
-						<parameter value="AFFieldText"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="option"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-						<parameter value="Show All n"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="option"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-						<parameter value="concat('1 - ',@rows,' of n')"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="option"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-						<parameter value="concat(@rows + 1,' - ',@rows * 2,' of n')"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="td"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="valign"/>
-						<parameter value="middle"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="nowrap"/>
-						<parameter value=""/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="class"/>
-						<parameter value="OraNavBarActiveLink"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-						<parameter value="concat('Next ',@rows)"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="separator" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="hr"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="inlineStyle"/>
-						<parameter value="style"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="showDetailItem" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.ShowDetailItemOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"					
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="spacer" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="src"/>
-						<parameter value="$metadata-plugin-location$/icons/small/spacer.gif"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="alt"/>
-						<parameter value=""/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-						<parameter value="width"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-						<parameter value="height"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-				>
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="src"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.properties b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.properties
deleted file mode 100644
index fd5e7d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-
-###############################################################################
-# Copyright (c) 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-property.category.event=Event
-property.category.core=Core
-property.category.css=CSS
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.xml
deleted file mode 100644
index b6d4f6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html.xml
+++ /dev/null
@@ -1,408 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel id="http://myfaces.apache.org/trinidad/html"
-    type="tagFile"
-    xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-    xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:qe="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore">
-    <entity id="body" type="tag">
- 		<include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
- 		<include-entity-group id="common-trinidadh-attributes"/> 
- 		<include-entity-group id="common-partialTrigger-attribute"/>
- 		<include-entity-group id="common-event-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="initialFocusId"/>						
-			</value>
-		</trait>
-        <entity id="firstClickPassed">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="initialFocusId"/>
-    </entity>
-    <entity id="cellFormat" type="tag">
-		<include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<include-entity-group id="common-trinidadh-attributes"/> 
-		<include-entity-group id="common-partialTrigger-attribute"/>
-		<include-entity-group id="common-event-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="columnSpan"/>
-				<section id="width"/>
-				<section id="height"/>							
-			</value>
-		</trait>
-        <entity id="shortText"/>
-        <entity id="halign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>left</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-        </entity>
-        <entity id="valign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>top</item>
-                    <item>middle</item>
-                    <item>bottom</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="columnSpan">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="rowSpan">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="wrappingDisabled">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>
-        <entity id="headers"/>
-        <entity id="header">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-            </trait>
-        </entity>        
-    </entity>
-    <entity id="frame" type="tag">
-		<include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<include-entity-group id="common-trinidadh-attributes"/> 
-		<include-entity-group id="common-partialTrigger-attribute"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="source"/>
-				<section id="name"/>								
-			</value>
-		</trait>
-        <entity id="source"/>
-        <entity id="longDescURL"/>
-        <entity id="name"/>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="marginWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>1</value>
-            </trait>
-        </entity>
-        <entity id="marginHeight">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-            <trait id="valid-minimum">
-            	<value>1</value>
-            </trait>
-        </entity>
-        <entity id="scrolling">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>auto</item>
-					<item>yes</item>
-					<item>no</item>>					
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>auto</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="frameBorderLayout" type="tag">
-        <include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <include-entity-group id="common-trinidadh-attributes"/> 
-        <include-entity-group id="common-partialTrigger-attribute"/>
-    	<trait id="supported-facets">			
-			<value xsi:type="mdt:ListOfValues">
-				<item>alternateContent</item>
-				<item>bottom</item>
-				<item>center</item>
-				<item>end</item>
-				<item>innerEnd</item>
-				<item>innerLeft</item>
-				<item>innerRight</item>
-				<item>innerStart</item>
-				<item>left</item>
-				<item>right</item>
-				<item>start</item>
-				<item>top</item>
-			</value> 	
-   		</trait>  
-   		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>			
-				<section id="width"/>
-				<section id="height"/>							
-			</value>
-		</trait>
-        <entity id="onload">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-        <entity id="onunload">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.event</value>
-			</trait>			
-		</entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="height">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="frameSpacing">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="borderWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="frameBorderWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-    </entity>
-    <entity id="head" type="tag">
-        <include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <include-entity-group id="common-partialTrigger-attribute"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>							
-			</value>
-		</trait>
-        <entity id="title"/>
-    </entity>
-    <entity id="html" type="tag">
-        <include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="mode"/>							
-			</value>
-		</trait>
-        <entity id="mode">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>strict</item>
-					<item>quirks</item>>					
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value>default</value>
-			</trait>
-        </entity>
-    </entity>
-    <entity id="rowLayout" type="tag">
-        <include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <include-entity-group id="common-trinidadh-attributes"/>
-        <include-entity-group id="common-partialTrigger-attribute"/>
-        <include-entity-group id="common-event-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="width"/>
-				<section id="halign"/>
-				<section id="valign"/>										
-			</value>
-		</trait>
-        <entity id="halign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>left</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-        </entity>
-        <entity id="valign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-            <trait id="valid-values">
-                <value xsi:type="mdt:ListOfValues">
-                    <item>top</item>
-                    <item>middle</item>
-                    <item>bottom</item>
-                </value>
-            </trait>
-        </entity>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>              
-    </entity>
-    <entity id="script" type="tag">
-        <include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-        <include-entity-group id="common-partialTrigger-attribute"/>
-        <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="source"/>													
-			</value>
-		</trait>
-        <entity id="text" />
-        <entity id="source" />
-        <entity id="generatesContent" />        
-    </entity>
-    <entity id="styleSheet" type="tag">
-		<include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>										
-			</value>
-		</trait>
-    </entity> 
-    <entity id="tableLayout" type="tag">
- 		<include-entity-group id="common-core-attributes" uri="http://myfaces.apache.org/trinidad"/>
- 		<include-entity-group id="common-trinidadh-attributes"/> 
- 		<include-entity-group id="common-partialTrigger-attribute"/>
- 		<include-entity-group id="common-event-attributes" uri="http://myfaces.apache.org/trinidad"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="binding"/>
-				<section id="width"/>
-				<section id="halign"/>													
-			</value>
-		</trait>
-        <entity id="width">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-            </trait>
-        </entity>
-        <entity id="halign">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-            </trait>
-			<trait id="valid-values">
-			 	<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>left</item>
-					<item>start</item>
-					<item>end</item>
-					<item>center</item>					
-				</value>
-			</trait>
-        </entity>
-        <entity id="cellSpacing">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="cellPadding">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="borderWidth">
-            <trait id="attribute-value-runtime-type">
-                <value>org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-            </trait>
-        </entity>
-        <entity id="summary"/>      
-    </entity>
-    <entityGroup id="common-trinidadh-attributes">
-        <entity id="inlineStyle">
-        	<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>			
-		</entity>
-        <entity id="styleClass">
-			<trait id="attribute-value-runtime-type">
-				<value>org.eclipse.jst.pagedesigner.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value>%property.category.core</value>
-			</trait>				
-        </entity>
-        <entity id="shortDesc"/>
-    </entityGroup>
-    <entityGroup id="common-partialTrigger-attribute">
-    	<entity id="partialTriggers">
-    		<trait id="category">
-				<value>%property.category.core</value>
-			</trait>
-    	</entity>
-    </entityGroup>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_dti.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_dti.xml
deleted file mode 100644
index aea52f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_dti.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:dti="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"
-	id="http://myfaces.apache.org/trinidad/html"
-	type="tagFile">
-
-	<entity id="body" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="body"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAttributeWithRenameOperation">
-						<parameter value="inlineStyle"/>
-						<parameter value="style"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="head" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="head"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@title"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="title"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-							<parameter value="@title"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="html" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="html"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="styleSheet" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/small/styleSheet.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_pi.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_pi.xml
deleted file mode 100644
index ac1e508..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_html_pi.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel id="http://myfaces.apache.org/trinidad/html"
-    type="tagFile"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-    xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    
-    <trait id="is-jsf-component-library">
-		<value>true</value>
-	</trait>
-    
-    <entity id="styleSheet" type="tag"/>
-    <entity id="body" type="tag"/>
-    <entity id="cellFormat" type="tag"/>
-    <entity id="frame" type="tag"/>
-    <entity id="frameBorderLayout" type="tag"/>
-    <entity id="head" type="tag"/>
-    <entity id="html" type="tag"/>
-    <entity id="rowLayout" type="tag"/>
-    <entity id="script" type="tag"/>
-    <entity id="tableLayout" type="tag"/>
-    
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_pi.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_pi.xml
deleted file mode 100644
index fc42ca6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/trinidad_pi.xml
+++ /dev/null
@@ -1,133 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel id="http://myfaces.apache.org/trinidad"
-    type="tagFile"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-    xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-    
-    <trait id="is-jsf-component-library">
-		<value>true</value>
-	</trait>
-    
-    <entity id="forEach" type="tag"/>
-    <entity id="setActionListener" type="tag"/>
-    <entity id="fileDownloadActionListener" type="tag"/>
-    <entity id="returnActionListener" type="tag"/>
-    <entity id="resetActionListener" type="tag"/>
-    <entity id="componentRef" type="tag"/>
-    <entity id="componentDef" type="tag"/>
-    <entity id="facetRef" type="tag"/>
-    <entity id="breadCrumbs" type="tag"/>
-    <entity id="chart" type="tag"/>
-    <entity id="chooseColor" type="tag"/>
-    <entity id="chooseDate" type="tag"/>
-    <entity id="column" type="tag"/>
-    <entity id="commandButton" type="tag"/>
-    <entity id="commandLink" type="tag"/>
-    <entity id="commandNavigationItem" type="tag"/>
-    <entity id="document" type="tag"/>
-    <entity id="form" type="tag"/>
-    <entity id="goButton" type="tag"/>
-    <entity id="goLink" type="tag"/>
-    <entity id="icon" type="tag"/>
-    <entity id="image" type="tag"/>
-    <entity id="importScript" type="tag"/>
-    <entity id="inputColor" type="tag"/>
-    <entity id="inputDate" type="tag"/>
-    <entity id="inputFile" type="tag"/>
-    <entity id="inputHidden" type="tag"/>
-    <entity id="inputListOfValues" type="tag"/>
-    <entity id="inputNumberSpinbox" type="tag"/>
-    <entity id="inputText" type="tag"/>
-    <entity id="legend" type="tag"/>
-    <entity id="media" type="tag"/>
-    <entity id="message" type="tag"/>
-    <entity id="messages" type="tag"/>
-    <entity id="navigationPane" type="tag"/>
-    <entity id="navigationTree" type="tag"/>
-    <entity id="outputDocument" type="tag"/>
-    <entity id="outputFormatted" type="tag"/>
-    <entity id="outputLabel" type="tag"/>
-    <entity id="outputText" type="tag"/>
-    <entity id="page" type="tag"/>
-    <entity id="panelAccordion" type="tag"/>
-    <entity id="panelBorderLayout" type="tag"/>
-    <entity id="panelBox" type="tag"/>
-    <entity id="panelButtonBar" type="tag"/>
-    <entity id="panelCaptionGroup" type="tag"/>
-    <entity id="panelChoice" type="tag"/>
-    <entity id="panelFormLayout" type="tag"/>
-    <entity id="panelGroupLayout" type="tag"/>
-    <entity id="panelHeader" type="tag"/>
-    <entity id="panelHorizontalLayout" type="tag"/>
-    <entity id="panelLabelAndMessage" type="tag"/>
-    <entity id="panelList" type="tag"/>
-    <entity id="panelPage" type="tag"/>
-    <entity id="panelPageHeader" type="tag"/>
-    <entity id="panelPopup" type="tag"/>
-    <entity id="panelRadio" type="tag"/>
-    <entity id="panelSideBar" type="tag"/>
-    <entity id="panelTabbed" type="tag">
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[ 
-				<showDetailItem text="Tab 1" 
-					_uri_="http://myfaces.apache.org/trinidad"
-				/>
-				<showDetailItem text="Tab 2" 
-					_uri_="http://myfaces.apache.org/trinidad"
-				/>
-				]]></template>				
-			</value>
-		</trait>
-	</entity>
-    <entity id="panelTip" type="tag"/>
-    <entity id="poll" type="tag"/>
-    <entity id="processChoiceBar" type="tag"/>
-    <entity id="progressIndicator" type="tag"/>
-    <entity id="resetButton" type="tag"/>
-    <entity id="selectBooleanCheckbox" type="tag"/>
-    <entity id="selectBooleanRadio" type="tag"/>
-    <entity id="selectItem" type="tag"/>
-    <entity id="selectManyCheckbox" type="tag"/>
-    <entity id="selectManyListbox" type="tag"/>
-    <entity id="selectManyShuttle" type="tag"/>
-    <entity id="selectOneChoice" type="tag"/>
-    <entity id="selectOneListbox" type="tag"/>
-    <entity id="selectOneRadio" type="tag"/>
-    <entity id="selectOrderShuttle" type="tag"/>
-    <entity id="selectRangeChoiceBar" type="tag"/>
-    <entity id="separator" type="tag"/>
-    <entity id="showDetail" type="tag"/>
-    <entity id="showDetailHeader" type="tag"/>
-    <entity id="showDetailItem" type="tag">
- 		<trait id="tag-create">
- 			<value xsi:type="pi:TagCreationInfo">
-				<attribute id="text" value="Tab" />
- 			</value>
- 		</trait>
-    </entity>
-    <entity id="singleStepButtonBar" type="tag"/>
-    <entity id="spacer" type="tag"/>
-    <entity id="statusIndicator" type="tag"/>
-    <entity id="subform" type="tag"/>
-    <entity id="table" type="tag"/>
-    <entity id="train" type="tag"/>
-    <entity id="tree" type="tag"/>
-    <entity id="treeTable" type="tag"/>
-    <entity id="group" type="tag"/>
-    <entity id="iterator" type="tag"/>
-    <entity id="switcher" type="tag"/>
-    <entity id="convertColor" type="tag"/>
-    <entity id="convertDateTime" type="tag"/>
-    <entity id="convertNumber" type="tag"/>
-    <entity id="validateByteLength" type="tag"/>
-    <entity id="validateDateRestriction" type="tag"/>
-    <entity id="validateDateTimeRange" type="tag"/>
-    <entity id="validateDoubleRange" type="tag"/>
-    <entity id="validateLength" type="tag"/>
-    <entity id="validateLongRange" type="tag"/>
-    <entity id="validateRegExp" type="tag"/>
-    
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad.xml
deleted file mode 100644
index f030ebb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad.xml
+++ /dev/null
@@ -1,1913 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:viewMap="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xsi:noNamespaceSchemaLocation="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" id="http://myfaces.apache.org/trinidad" type="tagFile">
-  <entity id="panelList" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelList</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelList</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.List</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyListbox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectManyListbox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectMany</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectManyListbox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectMany</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Listbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="tree" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreTree</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXTree</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreTree</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Tree</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Tree</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateDateTimeRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.DateTimeRangeValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.DateTimeRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="showDetailItem" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CoreShowDetailItem</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowDetail</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreShowDetailItem</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowDetail</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Item</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelTabbed" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelTabbed</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelTabbed</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Tab</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectItem" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectItem</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectItem</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectItem</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectItem</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelPopup" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelPopup</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelPopup</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Popup</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="singleStepButtonBar" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreSingleStepButtonBar</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSingleStep</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSingleStepButtonBar</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SingleStep</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ButtonBar</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="componentRef" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.UIXComponentRef</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.ComponentRef</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ComponentRef</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelChoice" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelChoice</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelChoice</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Choice</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="showDetail" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CoreShowDetail</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowDetail</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreShowDetail</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowDetail</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ShowDetail</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="processChoiceBar" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreProcessChoiceBar</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXProcess</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreProcessChoiceBar</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Process</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ChoiceBar</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="treeTable" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreTreeTable</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXTreeTable</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXTree</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreTreeTable</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.TreeTable</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.TreeTable</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="subform" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CoreSubform</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSubform</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSubform</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Subform</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Subform</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelPage" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelPage</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelPage</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Page</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="page" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CorePage</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPage</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePage</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Page</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Page</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="messages" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreMessages</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXMessages</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreMessages</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Messages</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Messages</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="convertNumber" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.convert.NumberConverter</className>
-            <converterId>org.apache.myfaces.trinidad.Number</converterId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="message" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreMessage</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXMessage</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreMessage</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Message</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Message</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="showDetailHeader" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CoreShowDetailHeader</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowDetail</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreShowDetailHeader</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowDetail</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Header</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="chart" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreChart</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXChart</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreChart</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Chart</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Chart</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateRegExp" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.RegExpValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.RegExp</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputDocument" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreOutputDocument</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXOutput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreOutputDocument</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Output</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Document</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="convertColor" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.convert.ColorConverter</className>
-            <converterId>org.apache.myfaces.trinidad.Color</converterId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="icon" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreIcon</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreIcon</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Icon</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="image" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreImage</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreImage</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Image</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputText" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputText</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputText</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Input</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="poll" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CorePoll</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPoll</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePoll</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Poll</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Poll</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="goButton" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreGoButton</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXGo</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreGoButton</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Go</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Button</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateDoubleRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.DoubleRangeValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.DoubleRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="media" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreMedia</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreMedia</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Media</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputText" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreOutputText</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXOutput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreOutputText</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Output</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectRangeChoiceBar" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreSelectRangeChoiceBar</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectRange</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectRangeChoiceBar</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectRange</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ChoiceBar</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelHorizontalLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelHorizontalLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelHorizontalLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.HorizontalLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="resetButton" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreResetButton</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXReset</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreResetButton</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ResetButton</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Button</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputHidden" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputHidden</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputHidden</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Input</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Hidden</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="spacer" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreSpacer</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSpacer</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Spacer</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOneChoice" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectOneChoice</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectOneChoice</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Choice</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="table" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreTable</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXTable</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXIterator</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreTable</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Table</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Table</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="switcher" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.UIXSwitcher</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.Switcher</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Switcher</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelGroupLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelGroupLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelGroupLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.GroupLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelHeader" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelHeader</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelHeader</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Header</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelTip" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelTip</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelTip</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Tip</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyShuttle" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectManyShuttle</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectMany</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectManyShuttle</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectMany</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Shuttle</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelCaptionGroup" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelCaptionGroup</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelCaptionGroup</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.PanelCaptionGroup</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelPageHeader" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelPageHeader</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelPageHeader</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.PageHeader</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOneRadio" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectOneRadio</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectOneRadio</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Radio</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOneListbox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectOneListbox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectOneListbox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Listbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectBooleanRadio" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectBooleanRadio</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectBoolean</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectBooleanRadio</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectBoolean</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Radio</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="commandButton" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreCommandButton</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCommand</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.DialogSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreCommandButton</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Command</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Button</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputListOfValues" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputListOfValues</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputListOfValues</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectInput</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="goLink" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreGoLink</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXGo</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreGoLink</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Go</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Link</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="importScript" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CoreImportScript</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreImportScript</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ImportScript</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ImportScript</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="group" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.UIXGroup</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.Group</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Group</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="train" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreTrain</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXProcess</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreTrain</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Process</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Train</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="chooseColor" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreChooseColor</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXChoose</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreChooseColor</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Choose</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Color</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="commandNavigationItem" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreCommandNavigationItem</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCommand</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.DialogSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreCommandNavigationItem</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Command</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.NavigationItem</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="chooseDate" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreChooseDate</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXChoose</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreChooseDate</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Choose</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Date</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelButtonBar" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelButtonBar</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelButtonBar</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.ButtonBar</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="legend" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreLegend</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreLegend</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Legend</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputColor" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputColor</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputColor</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectInput</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Color</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputLabel" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreOutputLabel</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXOutput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreOutputLabel</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Output</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Label</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputFile" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputFile</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputFile</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Input</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.File</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelFormLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelFormLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelFormLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.FormLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="form" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CoreForm</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXForm</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreForm</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Form</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Form</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateLongRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.LongRangeValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.LongRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="column" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.data.CoreColumn</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXColumn</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreColumn</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Column</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Column</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputDate" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputDate</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputDate</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectInput</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Date</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateLength" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.LengthValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.Length</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="progressIndicator" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreProgressIndicator</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXProgress</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreProgressIndicator</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Progress</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Indicator</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateDateRestriction" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.DateRestrictionValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.DateRestriction</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelSideBar" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelSideBar</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelSideBar</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.SideBar</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="convertDateTime" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.convert.DateTimeConverter</className>
-            <converterId>org.apache.myfaces.trinidad.DateTime</converterId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="separator" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreSeparator</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSeparator</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Separator</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="document" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CoreDocument</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXDocument</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreDocument</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Document</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Document</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputNumberSpinbox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreInputNumberSpinbox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXInput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreInputNumberSpinbox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Input</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.NumberSpinbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateByteLength" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>org.apache.myfaces.trinidadinternal.validator.ByteLengthValidator</className>
-            <validatorId>org.apache.myfaces.trinidad.ByteLength</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="navigationTree" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreNavigationTree</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationTree</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreNavigationTree</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.NavigationTree</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.NavigationTree</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectBooleanCheckbox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectBooleanCheckbox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectBoolean</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectBooleanCheckbox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectBoolean</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Checkbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="navigationPane" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreNavigationPane</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationLevel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreNavigationPane</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.NavigationLevel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Pane</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyCheckbox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectManyCheckbox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectMany</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectManyCheckbox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectMany</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Checkbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="statusIndicator" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreStatusIndicator</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXObject</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreStatusIndicator</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Object</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.StatusIndicator</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelRadio" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelRadio</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXShowOne</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelRadio</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.ShowOne</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Radio</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelBox" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelBox</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelBox</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Box</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="iterator" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.UIXIterator</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.Iterator</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Iterator</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelBorderLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelBorderLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelBorderLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.BorderLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelAccordion" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelAccordion</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelAccordion</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Accordion</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="commandLink" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreCommandLink</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCommand</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.DialogSource</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreCommandLink</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Command</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Link</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelLabelAndMessage" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.layout.CorePanelLabelAndMessage</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXPanel</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CorePanelLabelAndMessage</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Panel</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.LabelAndMessage</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOrderShuttle" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.input.CoreSelectOrderShuttle</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectOrder</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXSelectMany</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXEditableValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreSelectOrderShuttle</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.SelectOrder</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Shuttle</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputFormatted" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.output.CoreOutputFormatted</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXOutput</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXValue</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreOutputFormatted</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Output</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Formatted</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="breadCrumbs" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.nav.CoreBreadCrumbs</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationPath</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXNavigationHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXHierarchy</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXCollection</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.model.RowKeyIndex</interfaces>
-            <interfaces>org.apache.myfaces.trinidad.component.CollectionComponent</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreBreadCrumbs</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.NavigationPath</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.BreadCrumbs</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad_html.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad_html.xml
deleted file mode 100644
index c1423b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/metadata/viewMapping_trinidad_html.xml
+++ /dev/null
@@ -1,193 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:viewMap="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xsi:noNamespaceSchemaLocation="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" id="http://myfaces.apache.org/trinidad/html" type="tagFile">
-  <entity id="frame" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlFrame</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlFrame</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Frame</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Frame</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="html" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlHtml</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlHtml</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Html</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Html</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="script" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlScript</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlScript</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Script</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Script</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="head" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlHead</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlHead</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Head</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Head</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="rowLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlRowLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlRowLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.RowLayout</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.RowLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="frameBorderLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlFrameBorderLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlFrameBorderLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.FrameBorderLayout</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.FrameBorderLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="styleSheet" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.core.CoreStyleSheet</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.CoreStyleSheet</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.StyleSheet</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.StyleSheet</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="cellFormat" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlCellFormat</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlCellFormat</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.CellFormat</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.CellFormat</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="tableLayout" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlTableLayout</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlTableLayout</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.TableLayout</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.TableLayout</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="body" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>org.apache.myfaces.trinidad.component.html.HtmlBody</className>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponentBase</superClasses>
-            <superClasses>org.apache.myfaces.trinidad.component.UIXComponent</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>org.apache.myfaces.trinidad.HtmlBody</componentType>
-            <componentFamily>org.apache.myfaces.trinidad.Body</componentFamily>
-            <renderType>org.apache.myfaces.trinidad.Body</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.properties
deleted file mode 100644
index 8a7fa94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-
-# ====================================================================
-# To code developer:
-#   Do NOT change the properties between this line and the
-#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
-#   Make a new property name, append to the end of the file and change
-#   the code to use the new property.
-# ====================================================================
-
-# ====================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# ====================================================================
-
-pluginName = JavaServer Faces Tools - Taglibrary Metadata (Apache Trinidad)
-pluginProvider = Eclipse.org
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.xml
deleted file mode 100644
index a0a4833..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/plugin.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.jst.jsf.common.standardMetaDataFiles">
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad.xml"
-            uri="http://myfaces.apache.org/trinidad">
-      </standardMetaDataFile>  
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad_pi.xml"
-            uri="http://myfaces.apache.org/trinidad">
-      </standardMetaDataFile>    
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad_dti.xml"
-            uri="http://myfaces.apache.org/trinidad">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad_html.xml"
-            uri="http://myfaces.apache.org/trinidad/html">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad_html_pi.xml"
-            uri="http://myfaces.apache.org/trinidad/html">
-      </standardMetaDataFile> 
-      <standardMetaDataFile
-            location="$nl$/metadata/trinidad_html_dti.xml"
-            uri="http://myfaces.apache.org/trinidad/html">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/viewMapping_trinidad.xml"
-            uri="http://myfaces.apache.org/trinidad">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/viewMapping_trinidad_html.xml"
-            uri="http://myfaces.apache.org/trinidad/html">
-      </standardMetaDataFile>
-   </extension>
-   <extension
-         point="org.eclipse.jst.pagedesigner.pageDesignerExtension">
-      <elementEditFactory
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit.TrinidadCoreElementEditFactory">
-      </elementEditFactory>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.BreadCrumbsOperation"
-            id="BreadCrumbsOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.CommandNavigationItemOperation"
-            id="CommandNavigationItemOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.CreateClassAttributeOperation"
-            id="CreateClassAttributeOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.CreateStyleAttributeOperation"
-            id="CreateStyleAttributeOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.InputFileOperation"
-            id="InputFileOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.InputTextOperation"
-            id="InputTextOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.InputTextWithIconOperation"
-            id="InputTextWithIconOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.NavigationPaneOperation"
-            id="NavigationPaneOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.OutputFormattedOperation"
-            id="OutputFormattedOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.PanelFormLayoutOperation"
-            id="PanelFormLayoutOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.PanelGroupLayoutOperation"
-            id="PanelGroupLayoutOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.PanelLabelAndMessageOperation"
-            id="PanelLabelAndMessageOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.PanelTabbedOperation"
-            id="PanelTabbedOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.SelectBooleanOperation"
-            id="SelectBooleanOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.SelectListboxChoiceOperation"
-            id="SelectListboxChoiceOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.SelectManyCheckboxOneRadioOperation"
-            id="SelectManyCheckboxOneRadioOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.SelectShuttleOperation"
-            id="SelectShuttleOperation">
-      </tagTransformOperation>
-      <tagTransformOperation
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.ShowDetailItemOperation"
-            id="ShowDetailItemOperation">
-      </tagTransformOperation>
-      <dtResourceProvider
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.dtresourceprovider.TrinidadDTResourceProvider"
-            id="http://myfaces.apache.org/trinidad">
-      </dtResourceProvider>
-   </extension>
-   <extension
-         point="org.eclipse.jst.jsf.core.variableresolver">
-      <variableresolver
-            class="org.eclipse.jst.jsf.apache.trinidad.tagsupport.el.TrinidadDecorativeVariableResolver"
-            forRuntimeClass="org.apache.myfaces.trinidadinternal.el.TrinidadVariableResolver"
-            id="org.eclipse.jst.jsf.apache.trinidad.tagsupport.variableresolver1">
-      </variableresolver>
-   </extension>
-
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/close.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/close.gif
deleted file mode 100644
index e792e28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/close.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/list-bullet.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/list-bullet.gif
deleted file mode 100644
index 8c0cf4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/list-bullet.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/logo-dark.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/logo-dark.gif
deleted file mode 100644
index 8f450e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/logo-dark.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-deselected.gif
deleted file mode 100644
index e0ec834..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-end-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-end-selected.gif
deleted file mode 100644
index adc9eea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-end-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-mid-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-mid-selected.gif
deleted file mode 100644
index 0db0c96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-mid-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-start-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-start-selected.gif
deleted file mode 100644
index 72463ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-bot-start-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-deselected.gif
deleted file mode 100644
index d7417e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-deselected-to-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-deselected-to-deselected.gif
deleted file mode 100644
index 5416299..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-deselected-to-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-selected-to-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-selected-to-deselected.gif
deleted file mode 100644
index 29f33e0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-join-selected-to-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-selected.gif
deleted file mode 100644
index d36b395..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-end-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-deselected.gif
deleted file mode 100644
index 2639558..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-selected.gif
deleted file mode 100644
index 248de98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-mid-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-deselected.gif
deleted file mode 100644
index 2c904c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-deselected-to-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-deselected-to-deselected.gif
deleted file mode 100644
index 1ec2d3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-deselected-to-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected-to-deselected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected-to-deselected.gif
deleted file mode 100644
index 1ec2d3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected-to-deselected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected.gif
deleted file mode 100644
index f8ebc72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-join-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-selected.gif b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-selected.gif
deleted file mode 100644
index f4a260b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/images/tab3-start-selected.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/minimal.css b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/minimal.css
deleted file mode 100644
index 2bfe7cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/minimal.css
+++ /dev/null
@@ -1,243 +0,0 @@
-/* This CSS file generated on Thu Apr 02 15:47:44 PDT 2009 */
-.AFInstructionText,.AFFieldText,.af_outputText,.af_outputFormatted,.af_outputDocument,.af_inputChoice_content,.af_inputChoice_content-input,.af_inputText_content,.af_inputNumberSpinbox_content,.af_inputColor_content,.af_inputDate_content,.af_inputListOfValues_content,.af_selectManyCheckbox_content,.af_selectManyListbox_content,.af_selectOneChoice_content,.af_selectOneListbox_content,.af_selectOneRadio_content,.af_inputText.AFFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFFieldTextMarker .af_inputText_content,.af_inputText.AFFieldTextLTRMarker .af_inputText_content,.af_inputText.AFPhoneFieldTextMarker .af_inputText_content,.af_inputText.AFPostalCodeFieldTextMarker .af_inputText_content,.af_inputText.AFAddressFieldTextMarker .af_inputText_content,.af_inputChoice.AFFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFFieldTextLTRMarker .af_inputChoice_content-input,.af_inputChoice.AFPhoneFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFPostalCodeFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFAddressFieldTextMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.AFFieldTextMarker .af_inputNumberSpinbox_content,.af_inputNumberSpinbox.p_AFDisabled.AFFieldTextMarker .af_inputNumberSpinbox_content,.af_inputNumberSpinbox.AFFieldTextLTRMarker .af_inputNumberSpinbox_content,.AFFieldTextLTR,.AFPhoneFieldText,.AFPostalCodeFieldText,.AFAddressFieldText,.PortletText1,.PortletText2,.PortletText3,.PortletText4,.portlet-form-input-field,.portlet-form-field {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000}
-.AFInstructionTextDisabled,.AFFieldTextDisabled,.af_inputText.p_AFDisabled.AFFieldTextLTRMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFPhoneFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFPostalCodeFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFAddressFieldTextMarker .af_inputText_content,.af_inputChoice.p_AFDisabled.AFFieldTextLTRMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFPhoneFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFPostalCodeFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFAddressFieldTextMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.p_AFDisabled.AFFieldTextLTRMarker .af_inputNumberSpinbox_content,.p_InContextBrandingText,.AFFieldTextLTRDisabled,.AFPhoneFieldTextDisabled,.AFPostalCodeFieldTextDisabled,.AFAddressFieldTextDisabled,.OraHGridNavRowInactiveLink,.OraNavBarInactiveLink,.portlet-font-dim {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#999999}
-.AFDataText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#000000}
-.AFDataTextDisabled {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#999999}
-.AFDataNumber {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#000000;text-align:right}
-.AFDataNumberDisabled {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#999999;text-align:right}
-.AFFieldNumber,.af_inputText.AFFieldNumberMarker .af_inputText_content,.af_inputChoice.AFFieldNumberMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.AFFieldNumberMarker .af_inputNumberSpinbox_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right;color:#000000}
-.AFFieldNumberDisabled,.af_inputText.p_AFDisabled.AFFieldNumberMarker .af_inputText_content,.af_inputChoice.p_AFDisabled.AFFieldNumberMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.p_AFDisabled.AFFieldNumberMarker .af_inputNumberSpinbox_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right;color:#999999}
-.AFLabelText,.af_outputLabel,.af_inputChoice_label,.af_inputFile_label,.af_inputNumberSpinbox_label,.af_inputText_label,.af_selectBooleanCheckbox_label,.af_selectBooleanRadio_label,.af_inputColor_label,.af_inputDate_label,.af_inputListOfValues_label,.af_selectManyCheckbox_label,.af_selectManyListbox_label,.af_selectOneChoice_label,.af_selectOneListbox_label,.af_selectOneRadio_label,.af_panelLabelAndMessage_label,.af_panelFormLayout_label-cell,.portlet-form-label,.portlet-icon-label,.portlet-dlg-icon-label,.portlet-form-field-label {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;text-align:right;color:#000000;padding:0px 8px 0px 0px;font-weight:normal}
-.AFLabelCell {padding:0px 8px 0px 0px}
-.AFErrorIconStyle {color:#cc0000;font-family:monospace;font-weight:bold}
-.AFInfoIconStyle,.AFWarningIconStyle,.AFQuickSelectIconStyle {color:#669966;font-family:monospace;font-weight:bold}
-.AFRequiredIconStyle {color:#669966;font-family:Courier,sans-serif}
-.AFQuickSelectDisabledIconStyle {color:#999999;font-family:monospace;font-weight:bold}
-.OraLink:link,.af_treeTable_path,.af_menuPath,.af_panelList A,.af_panelPopup_link,.OraLinkText,.OraHGridNavRowActiveLink,.OraNavBarActiveLink {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333}
-.OraLink:active,.OraALinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#006666}
-.OraLink:visited,.OraVLinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336666}
-.OraLinkDisabled,.af_outputLabel_required-icon-style,.af_inputChoice_required-icon-style,.af_inputNumberSpinbox_required-icon-style,.af_inputText_required-icon-style,.af_selectBooleanCheckbox_required-icon-style,.af_selectBooleanRadio_required-icon-style,.af_inputDate_required-icon-style,.af_selectManyCheckbox_required-icon-style,.af_selectManyListbox_required-icon-style,.af_selectOneChoice_required-icon-style,.af_selectOneListbox_required-icon-style,.af_selectOneRadio_required-icon-style,.af_outputLabel_group-icon-style,.af_inputChoice_group-icon-style,.af_inputNumberSpinbox_group-icon-style,.af_inputText_group-icon-style,.af_selectBooleanCheckbox_group-icon-style,.af_selectBooleanRadio_group-icon-style,.af_inputDate_group-icon-style,.af_selectManyCheckbox_group-icon-style,.af_selectManyListbox_group-icon-style,.af_selectOneChoice_group-icon-style,.af_selectOneListbox_group-icon-style,.af_selectOneRadio_group-icon-style,.af_menuList,.af_navigationPane_choice-label,.af_navigationPane_choice-options,.af_navigationPane_choice-button,.af_breadCrumbs,.af_selectManyShuttle_box-content,.af_selectOrderShuttle_box-content,.af_menuTabs,.af_commandButton,.af_goButton,.af_resetButton,.p_OraDisabled,.OraNav3,.p_OraTreeRow,.portlet-form-button {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal}
-.af_outputDocument_title,.AFHeaderLevelOne,H1.af_panelHeader,H1.af_showDetailHeader,.PortletHeaderText,.PortletHeading1,.PortletSubHeaderText,.portlet-section-header,.portlet-section-subheader,.portlet-table-header,.portlet-table-subheader {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;color:#669966;font-weight:bold;padding:0px;margin:0px}
-.af_outputDocument_paragraph {text-align:justify;padding:0px;margin:0px}
-.af_outputDocument_separator {text-align:center;padding:0px;margin:0px}
-.af_panelTip,.OraPageStampText,.af_singleStepButtonBar_label,.OraNavBarViewOnly {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#669966}
-.af_panelTip_label {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold}
-.af_panelAccordion_toolbar,.p_OraContentFooterChildren {float:right}
-.af_dialog_container,.af_panelPopup_container {border-color:#336633;border:1px solid;background-color:white}
-.af_dialog_title-bar,.af_panelPopup_title-bar {background-color:#CCCCCC;border-color:#336633;border-bottom:1px solid;padding:2px 2px 2px 2px}
-.af_dialog_title-text,.af_panelPopup_title-text {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;white-space:nowrap;overflow:hidden}
-.af_dialog_close-icon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;margin-left:5px;background-image:url(images/close.gif);background-position:center;background-repeat:no-repeat;height:13px;width:13px}
-.af_dialog_content,.af_panelPopup_content {background-color:#e9e8e8;border:0px}
-.af_inputChoice.p_AFDisabled .af_inputChoice_label,.af_inputNumberSpinbox.p_AFDisabled .af_inputNumberSpinbox_label,.af_inputText.p_AFDisabled .af_inputText_label,.af_selectBooleanCheckbox.p_AFDisabled .af_selectBooleanCheckbox_label,.af_selectBooleanRadio.p_AFDisabled .af_selectBooleanRadio_label,.af_inputColor.p_AFDisabled .af_inputColor_label,.af_inputDate.p_AFDisabled .af_inputDate_label,.af_inputListOfValues.p_AFDisabled .af_inputListOfValues_label,.af_selectManyCheckbox.p_AFDisabled .af_selectManyCheckbox_label,.af_selectManyListbox.p_AFDisabled .af_selectManyListbox_label,.af_selectOneChoice.p_AFDisabled .af_selectOneChoice_label,.af_selectOneListbox.p_AFDisabled .af_selectOneListbox_label,.af_selectOneRadio.p_AFDisabled .af_selectOneRadio_label,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content,.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content a,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content a,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-mid A {color:#000000}
-.af_inputNumberSpinbox_increment-cell,.af_inputNumberSpinbox_decrement-cell {background-color:#e9e8e8;border-color:#999999;border-width:1px;border-style:solid;width:11px;height:8px}
-.af_inputNumberSpinbox_spinbox-cell {padding-left:1px}
-.af_menuList_selected,.OraNav3Selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#ccffcc}
-.af_menuChoice_label,.portlet-font {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal}
-BODY,.portlet-section-body,.portlet-table-body {background-color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif}
-.af_treeTable_path-step,.af_menuPath_step,.af_menuPath_selected-step {color:#003333;font-size:9pt}
-.af_treeTable_path-selected-step {font-size:9pt;color:#000000}
-.af_panelList UL {margin-top:4px;margin-bottom:4px}
-button {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;background-color:#e9e8e8;padding:0px;margin:1px}
-.af_inputColor_swatch-overlay {position:relative;left:-7px;top:5px}
-.af_navigationPane_bar {background-color:#EFEFEF;padding-left:6px;padding-right:6px}
-.af_navigationPane_bar-active-disabled,.af_navigationPane_bar-inactive-disabled,.af_navigationPane_buttons-active-disabled,.af_navigationPane_buttons-inactive-disabled,.af_navigationPane_list-active-disabled,.af_navigationPane_list-inactive-disabled {cursor:default}
-.af_navigationPane_bar-active-enabled,.af_navigationPane_bar-inactive-enabled,.af_navigationPane_buttons-active-enabled,.af_navigationPane_buttons-inactive-enabled,.af_navigationPane_list-active-enabled,.af_navigationPane_list-inactive-enabled,.af_navigationPane_tabs-active,.af_navigationPane_tabs-inactive {cursor:pointer}
-.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content {color:#000000;font-weight:bold}
-.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content a:hover,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content a:hover,.af_navigationPane_buttons-active-enabled .af_navigationPane_buttons-content a:hover,.af_navigationPane_buttons-inactive-enabled .af_navigationPane_buttons-content a:hover,.af_navigationPane_list-active-enabled .af_navigationPane_list-content a:hover,.af_navigationPane_list-inactive-enabled .af_navigationPane_list-content a:hover,.AFAccessKeyStyle {text-decoration:underline}
-.af_navigationPane_bar-active-disabled .af_navigationPane_bar-content,.af_navigationPane_buttons-active-disabled .af_navigationPane_buttons-content,.af_navigationPane_list-active-disabled .af_navigationPane_list-content {color:gray;font-weight:bold}
-.af_navigationPane_bar-inactive-disabled .af_navigationPane_bar-content,.af_navigationPane_bar-active-disabled .af_navigationPane_bar-content a,.af_navigationPane_bar-inactive-disabled .af_navigationPane_bar-content a,.af_navigationPane_buttons-inactive-disabled .af_navigationPane_buttons-content,.af_navigationPane_buttons-active-disabled .af_navigationPane_buttons-content a,.af_navigationPane_buttons-inactive-disabled .af_navigationPane_buttons-content a,.af_navigationPane_list-inactive-disabled .af_navigationPane_list-content,.af_navigationPane_list-active-disabled .af_navigationPane_list-content a,.af_navigationPane_list-inactive-disabled .af_navigationPane_list-content a,.af_navigationPane_tabs-active.p_AFDisabled .af_navigationPane_tabs-mid,.af_navigationPane_tabs-inactive.p_AFDisabled .af_navigationPane_tabs-mid {color:gray}
-.af_navigationPane_bar-content,.af_navigationPane_buttons-content,.af_navigationPane_list-content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-top:3px;padding-bottom:3px}
-.af_navigationPane_bar-content a,.af_navigationPane_buttons-content a,.af_navigationPane_list-content a {text-decoration:none}
-.af_navigationPane_bar-separator {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-left:6px;padding-right:6px;color:gray}
-.af_navigationPane_buttons-active-enabled .af_navigationPane_buttons-content,.af_navigationPane_list-active-enabled .af_navigationPane_list-content,.af_navigationPane_tabs-active .af_navigationPane_tabs-mid A,.AFLinkAccessKeyStyle,.af_inputDate_selected,.af_chooseDate_selected {font-weight:bold}
-.af_navigationPane_buttons-separator {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-left:6px;padding-right:6px}
-.af_navigationPane_list-bullet {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;vertical-align:middle;width:17px;background-image:url(images/list-bullet.gif);background-position:center;background-repeat:no-repeat}
-.af_navigationPane_tabs {height:26px;overflow:hidden}
-.af_navigationPane_tabs-active.p_AFDisabled,.af_navigationPane_tabs-inactive.p_AFDisabled {cursor:default;color:gray}
-.af_navigationPane_tabs-start,.af_navigationPane_tabs-start-join {height:22px;width:26px;background-position:top right}
-.af_navigationPane_tabs-start-join-from-active,.af_navigationPane_tabs-start-join-from-inactive {height:22px;width:14px;background-repeat:no-repeat}
-.af_navigationPane_tabs-mid {height:22px;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;padding-left:3px;white-space:nowrap}
-.af_navigationPane_tabs-end-join-to-inactive {height:22px;width:12px;background-repeat:no-repeat}
-.af_navigationPane_tabs-end {height:22px;width:15px}
-.af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-bottom-end {height:4px;background-repeat:repeat-x}
-.af_navigationPane_tabs-bottom-start-content {height:4px;width:17px;background-repeat:no-repeat}
-.af_navigationPane_tabs-bottom-mid-content {height:4px}
-.af_navigationPane_tabs-bottom-end-content {height:4px;width:100%;background-repeat:no-repeat}
-.af_navigationPane_tabs-mid A {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;text-decoration:none}
-.af_navigationPane_tabs-bottom-end-join {background-repeat:repeat-x}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-start {background-image:url(images/tab3-start-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-start-join {background-image:url(images/tab3-start-join-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end {background-image:url(images/tab3-bot-mid-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-start-content {background-image:url(images/tab3-bot-start-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-mid {background-image:url(images/tab3-mid-selected.gif);font-weight:bold}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-end-join-to-inactive {background-image:url(images/tab3-end-join-selected-to-deselected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-end {background-image:url(images/tab3-end-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end-join,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end-join {background-image:url(images/tab3-bot-deselected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end-content {background-image:url(images/tab3-bot-end-selected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start {background-image:url(images/tab3-start-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-start-content,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end-content {background-image:none}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start-join-from-active {background-image:url(images/tab3-start-join-selected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start-join-from-inactive {background-image:url(images/tab3-start-join-deselected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-mid {color:#000000;background-image:url(images/tab3-mid-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-end-join-to-inactive {background-image:url(images/tab3-end-join-deselected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-end {background-image:url(images/tab3-end-deselected.gif)}
-.af_panelFormLayout_column,.p_OraTreeIcon {vertical-align:top}
-.af_panelFormLayout_separator {background-color:gray;height:1px;font-size:1px;margin-top:3px;margin-bottom:3px}
-.af_panelFormLayout_cell,.af_panelFormLayout_content-cell,.af_panelFormLayout_message-cell {padding:1px 0px}
-.af_panelFormLayout_label-stacked-cell {padding:1px 0px;text-align:left}
-.af_panelBox_transparent,.af_panelBox_light,.af_panelBox_medium {border-color:#99cc99;border-style:solid;border-width:1px;margin:2px}
-.af_panelBox_dark {border-style:solid;border-width:1px;margin:2px;border-color:#669966}
-.af_panelBox_transparent img,.af_panelBox_light img,.af_panelBox_medium img,.af_panelBox_dark img,.af_selectManyShuttle_box-content img,.af_selectOrderShuttle_box-content img,.af_menuBar img,.af_messages img,.af_menuTabs img {vertical-align:bottom}
-.af_panelBox_body {padding:5px;height:20px}
-.af_panelBox_light .af_panelBox_body,.af_selectManyShuttle_box-content .af_selectManyShuttle_box-body,.af_selectOrderShuttle_box-content .af_selectOrderShuttle_box-body,.af_panelSideBar_body,.OraBGAccentLight,.PortletBodyColor,.PortletSubHeaderColor,.af_messages_body {background-color:#e9e8e8}
-.af_panelBox_medium .af_panelBox_body,.OraBGAccentMedium {background-color:#ffffcc}
-.af_panelBox_dark .af_panelBox_body,.OraBGAccentDark {background-color:#CCCCCC}
-.af_panelBox_header,.PortletHeaderColor {width:100%;background-repeat:repeat-x;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;padding:0px 3px;font-weight:bold}
-.af_panelBox_light .af_panelBox_header {background-color:#99cc99;color:#ffffff}
-.af_panelPage_copyright,.af_panelPage_privacy,.af_panelPage_about {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#000000;white-space:nowrap;padding:5px}
-.af_panelPage_copyright A,.af_panelPage_privacy A,.af_panelPage_about A,.af_train_link,.af_panelTabbed_tab A,.p_OraTreeRow A:link,.p_OraTreeRow A:active,.p_OraTreeRow A:visited {color:#003333}
-.af_panelCaptionGroup {border-color:#e9e8e8}
-.af_panelCaptionGroup_caption,.OraPageStampLabel,.OraTableControlBarText,.p_OraTreeRowSelected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#669966}
-.af_panelPopup_trigger {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333;text-decoration:none;white-space:nowrap}
-.af_panelPopup_close-icon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;text-align:right;padding-left:5px}
-.af_menuButtons_text {color:#003333;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 2px 2px 2px}
-.af_menuButtons_text-selected {color:#669966;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 2px 2px 2px}
-.af_menuButtons_text-disabled {color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 2px 2px 2px}
-.af_menuBar {background-color:#669966;color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;min-height:4px;padding:0px}
-.af_menuBar_enabled,.af_menuBar_selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 0px 0px 5px;white-space:nowrap}
-.af_menuBar_enabled A,.af_menuBar_selected A,.PortletHeaderLink,.PortletSubHeaderLink {color:#ffffff;text-decoration:none}
-.af_menuBar_separator {color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal}
-.af_treeTable_expansion {color:#669966;position:absolute;top:0px;left:-18px;text-decoration:none}
-.af_treeTable_focus {font-size:10pt;font-weight:normal;color:#669966;font-family:monospace;text-decoration:none}
-.af_treeTable_locator {font-size:10pt;font-weight:normal;color:#999999;font-family:monospace}
-.af_showOnePanel_container {border-color:#999999;border-width:0px 1px 1px 1px;border-style:solid}
-.af_showOnePanel_header-collapsed {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-width:1px 0px 0px 0px;border-style:solid;cursor:pointer;padding-left:5px}
-.af_showOnePanel_header-expanded {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-style:solid;border-width:1px 0px 1px 0px;padding-left:2px}
-.af_showOnePanel_header-disabled {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-style:solid;border-width:1px 0px 0px 0px;padding-left:18px}
-.af_showOnePanel_content {vertical-align:top;margin:5px}
-.af_showOnePanel_title-link {background:transparent;color:#669966;display:block;padding-top:2px;text-decoration:none;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold}
-.af_showOnePanel_title-disabled-link {color:#999999;display:block;padding-top:2px;text-decoration:none;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold}
-.AFHeaderLevelTwo,H2.af_panelHeader,H2.af_showDetailHeader,.PortletHeading2 {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;color:#669966;font-weight:bold;padding:0px;margin:0px}
-.AFHeaderLevelThreePlus,H3.af_panelHeader,H4.af_panelHeader,H5.af_panelHeader,H6.af_panelHeader,H3.af_showDetailHeader,H4.af_showDetailHeader,H5.af_showDetailHeader,H6.af_showDetailHeader,.PortletHeading3,.PortletHeading4 {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;color:#669966;font-weight:bold;padding:0px;margin:0px}
-.af_panelHeader_error,.af_messages_error,.portlet-msg-error {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:bold;padding:0px;margin:0px;color:#cc0000}
-.af_messages_header {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;color:#669966;font-weight:bold;margin:0px;border-color:#CCCCCC;border-width:0px 0px 1px 0px;border-style:solid;vertical-align:bottom;margin-bottom:3px;padding:0px 3px}
-.af_messages {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336633;width:100%;border-color:#999999;background-color:#ffffcc;border-style:solid;border-width:1px;padding:0px;margin:5px 0px 0px}
-.af_messages_message-text,.af_messages_list,.portlet-msg-info {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#669966;margin:0px 0px 0px 0px;padding:5px 30px 5px 30px}
-.af_panelSideBar {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336633;border-color:#999999;border-width:0px 1px 1px;border-style:solid;padding:0px;margin:0px 5px 0px 0px}
-.AFSortableHeaderSortIcon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;font-weight:normal;color:#669966;padding-left:4px;text-decoration:none}
-.af_menuTabs_enabled {background-color:#e9e8e8;white-space:nowrap;border-color:#999999;border-style:solid;border-width:1px 1px 0px 1px;padding:2px 6px}
-.af_menuTabs_selected {background-color:#669966;white-space:nowrap;border-color:#999999;border-style:solid;border-width:1px 1px 0px 1px;padding:2px 6px}
-.af_menuTabs_disabled {background-color:#e9e8e8;color:#999999;white-space:nowrap;border-color:#999999;border-style:solid;border-width:1px 1px 0px 1px;padding:2px 6px}
-.af_menuTabs_enabled A {text-decoration:none;color:#336633}
-.af_menuTabs_selected A {text-decoration:none;color:#ccffcc;font-weight:bold}
-.af_menuTabs_separator {width:0px}
-.af_table_content,.af_treeTable_content {border-collapse:collapse;border-color:#999999;border-style:solid;border-width:1px}
-.af_table_control-bar-top,.af_treeTable_control-bar-top {background-color:#e9e8e8;border-color:#999999;border-style:solid;border-width:1px 1px 0px;padding:1px 2px}
-.af_table_control-bar-bottom,.af_treeTable_control-bar-bottom {background-color:#e9e8e8;border-color:#999999;border-style:solid;border-width:0px 1px 1px;padding:1px 2px}
-.af_table_sub-control-bar,.af_treeTable_sub-control-bar {border-color:#999999;border-style:solid;border-width:1px 1px 0px;padding:1px 2px}
-.af_column_cell-text,.portlet-section-selected,.portlet-table-selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999}
-.af_column_cell-text-band,.portlet-section-alternate,.portlet-table-alternate {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999}
-.af_column_cell-number {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999;text-align:right;padding-right:2px}
-.af_column_cell-number-band {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999;text-align:right;padding-right:2px}
-.af_column_cell-icon-format,.af_tableSelectOne_cell-icon-format,.af_tableSelectMany_cell-icon-format,.OraTableCellSelect,.portlet-section-text,.portlet-table-text {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999;text-align:center}
-.af_column_cell-icon-format-band,.af_tableSelectOne_cell-icon-format-band,.af_tableSelectMany_cell-icon-format-band,.OraTableCellSelectBand {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999;text-align:center}
-.af_column_header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966;vertical-align:bottom}
-.af_column_header-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;text-align:right}
-.af_column_header-icon-format {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;text-align:center}
-.af_column_row-header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#669966}
-.af_table_detail {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;border-color:#999999;background-color:#ffffff}
-.af_table_column-footer,.portlet-section-footer,.portlet-table-footer {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966}
-.OraTableTotal {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#669966}
-.af_column_total-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#000000;vertical-align:baseline}
-.af_column_total-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#000000;vertical-align:baseline}
-.af_column_sortable-header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset}
-.af_column_sortable-header-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset;text-align:right}
-.af_column_sortable-header-icon-format {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset;text-align:center}
-.af_train_stop-content,.af_train_overflow-start-content,.af_train_overflow-end-content,.af_train_parent-start-content,.af_train_parent-end-content {border-top-style:solid;border-top-width:2px;}
-.af_train_stop.p_AFSelected {color:#669966;font-weight:bold;border-color:#669966}
-.af_train_stop:visited,.af_train_stop:visited .af_train_link {color:#666666}
-.af_train_stop.p_AFDisabled {color:#999999;border-color:#cccccc}
-.af_train_stop.p_AFUnvisited {color:#669966;border-color:#669966}
-.af_train_stop.p_AFDisabled .af_train_link {color:#669999}
-.OraBGColorVeryDark {background-color:#336633}
-.OraBGColorDark,.af_menuBar_body,.af_menuBar_title,.af_menuBar_empty {background-color:#669966}
-.OraBGColorMedium {background-color:#99cc99}
-.OraBGColorLight {background-color:#ccffcc}
-.OraBGGrayVeryDark {background-color:#333333}
-.OraBGGrayDark {background-color:#666666}
-.OraBGGrayMedium,.OraBGAccentVeryDark,.OraTable {background-color:#999999}
-.OraBGGrayLight {background-color:#cccccc}
-.OraInlineInfoText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#669966}
-.OraTextInline {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#99cc99}
-.OraMessageBoxErrorText,.AFErrorText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#cc0000}
-.OraErrorNameText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#cc0000}
-.OraInlineErrorText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#cc0000}
-.OraGlobalPageTitle {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;color:#ffffff;font-weight:bold}
-.p_OraSelected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#ccffcc;text-decoration:none}
-.p_OraHiddenLabel {position:absolute;top:-999px;left:0px;font-size:0px}
-.p_OraColorFieldSwatch {border-color:#000000;border-style:solid;border-width:1px}
-.p_OraColorPalette {background-color:#000000}
-.p_OraColorPaletteEmptyCell {background-color:#ffffff}
-.af_inputDate_nav A,.af_chooseDate_nav A {color:#003333;text-decoration:none}
-.af_inputDate_title,.af_chooseDate_title {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;text-align:center;background-color:#ffffff;color:#669966;padding:2px}
-.af_inputDate_header,.af_chooseDate_header {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:center;color:#669966;padding:2px}
-.af_inputDate_content A,.af_chooseDate_content A {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:center;color:#003333}
-.af_chooseDate_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:center;color:#999999;text-decoration:none;border-width:1px;border-style:solid;padding:2px}
-.p_OraContentFooterRule {color:#669966}
-.p_OraContentFooterStart {float:left}
-.p_OraContentFooterBottom {clear:both;margin-bottom:5px}
-.p_OraFooter {text-align:center}
-.p_OraFooterBottom {padding-top:5px}
-.p_OraHeaderNest {margin:5px 0px 0px 12px}
-.OraHGridLocatorHeader {border-color:#999999;background-color:#e9e8e8}
-.p_OraHideShowDisclosedSymbol,.af_panelTabbed_tab-selected A,.p_OraTreeDisclosedSymbol A:link,.p_OraTreeDisclosedSymbol A:active,.p_OraTreeDisclosedSymbol A:visited,.p_OraTreeRowSelected A:link,.p_OraTreeRowSelected A:active,.p_OraTreeRowSelected A:visited {color:#669966;text-decoration:none}
-.af_messages_list-single {list-style-type:none}
-.p_OraQuickSearchBox {background-color:#e9e8e8;border-color:#CCCCCC;border-style:solid;padding:0pt 5pt 5pt 5pt;border-width:0px 0px 1px 1px}
-.p_OraGlobalQuick {border-color:#CCCCCC;border-style:solid;border-width:0px 0px 0px 1px}
-.p_OraProcessingStatus {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#669966;border-color:#99cc99;border-style:solid;border-width:1px}
-.p_OraProductBrandingText {color:#669966;position:relative;font-family:Garamond, Times, Times New Roman, Serif;font-weight:normal;font-size:24pt;line-height:28.8pt;top:-4.8pt}
-.p_OraProductBrandingCompactText {color:#669966;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;margin-bottom:0px;margin-top:0px;font-weight:bold}
-.OraShuttleHeader {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;color:#669966;font-weight:bold;padding:0px 0px 0px 18px}
-.OraShuttleLinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;font-weight:normal;color:#003333}
-.p_OraSideBarMinWidth {width:140px}
-.OraStyledList {list-style-position:inside;padding:0px;margin:0px}
-.OraStyledList .OraStyledList {padding:0pt 0pt 0pt 10pt}
-.af_panelTabbed_orientation-top {background-color:#e9e8e8;border-color:#99cc99;text-align:center;border-style:solid;padding:2px 0px;margin:4px 0px;border-width:1px 0px 0px}
-.af_panelTabbed_orientation-bottom {background-color:#e9e8e8;border-color:#99cc99;text-align:center;border-style:solid;padding:2px 0px;margin:4px 0px;border-width:0px 0px 1px}
-.af_panelTabbed_tab {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 8px}
-.af_panelTabbed_tab .p_OraDisabled {color:#999999}
-.af_panelTabbed_tab-selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;padding:0px 8px}
-.af_panelTabbed_cell-start {width:0%}
-.af_panelTabbed_cell-end {width:100%}
-.OraTableBorder0001 {border-style:solid;border-width:0px 0px 0px 1px}
-.OraTableBorder0010 {border-style:solid;border-width:0px 0px 1px}
-.OraTableBorder0011 {border-style:solid;border-width:0px 0px 1px 1px}
-.OraTableBorder0100 {border-style:solid;border-width:0px 1px 0px 0px}
-.OraTableBorder0101 {border-style:solid;border-width:0px 1px}
-.OraTableBorder0110 {border-style:solid;border-width:0px 1px 1px 0px}
-.OraTableBorder0111 {border-style:solid;border-width:0px 1px 1px}
-.OraTableBorder1000 {border-style:solid;border-width:1px 0px 0px}
-.OraTableBorder1001 {border-style:solid;border-width:1px 0px 0px 1px}
-.OraTableBorder1010 {border-style:solid;border-width:1px 0px}
-.OraTableBorder1011 {border-style:solid;border-width:1px 0px 1px 1px}
-.OraTableBorder1100 {border-style:solid;border-width:1px 1px 0px 0px}
-.OraTableBorder1101 {border-style:solid;border-width:1px 1px 0px}
-.OraTableBorder1110 {border-style:solid;border-width:1px 1px 1px 0px}
-.OraTableBorder1111 {border-style:solid;border-width:1px}
-.OraTableTitle {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;background-color:#ffffff;color:#669966}
-.p_OraTreeDisclosedSymbol {color:#669966;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right}
-.p_OraTreeNodeAdjust {padding-bottom:2px}
-.af_chart {width:400px;height:300px;background-color:white}
-.p_OraOnePixelLine {background-color:#CCCCCC;font-size:0pt;overflow:hidden;height:1px;width:100%}
-.p_OraDisplayBlock {display:block}
-.p_OraHideSkipNaviText {font-size:0pt;margin-top:0px;margin-left:-999px}
-.AFLogo {width:103px;height:13px;background-repeat:no-repeat;background-position:center;vertical-align:middle;background-image:url(images/logo-dark.gif)}
-.af_panelBox_content-dark {border-color:#669966}
-.af_train_stop.p_AFVisited {border-color:#999999}
-.af_panelHeader,.af_showDetailHeader {border-color:#CCCCCC;border-width:0px 0px 1px 0px;border-style:solid;vertical-align:bottom;margin-bottom:3px;padding:0px 3px}
-.af_panelHeader_icon-style {margin-right:3px}
-.af_objectSeparator {border-color:#669966;border-style:dashed none none;border-width:1px 0px 0px;height:1px;margin:-3px 0px -3px 0px;padding:0px}
-body {margin-top:8px}
-.p_OraNav2 {border-color:#99cc99}
-.af_navigationPane {height:25px}
-/* The number of CSS selectors in this file is 566 */
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/simple.css b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/simple.css
deleted file mode 100644
index 38fd694..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/skinning/simple.css
+++ /dev/null
@@ -1,226 +0,0 @@
-/* This CSS file generated on Thu Apr 02 15:52:46 PDT 2009 */
-.AFInstructionText,.AFFieldText,.af_outputText,.af_outputFormatted,.af_outputDocument,.af_inputChoice_content,.af_inputChoice_content-input,.af_inputText_content,.af_inputNumberSpinbox_content,.af_inputColor_content,.af_inputDate_content,.af_inputListOfValues_content,.af_selectManyCheckbox_content,.af_selectManyListbox_content,.af_selectOneChoice_content,.af_selectOneListbox_content,.af_selectOneRadio_content,.af_inputText.AFFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFFieldTextMarker .af_inputText_content,.af_inputText.AFFieldTextLTRMarker .af_inputText_content,.af_inputText.AFPhoneFieldTextMarker .af_inputText_content,.af_inputText.AFPostalCodeFieldTextMarker .af_inputText_content,.af_inputText.AFAddressFieldTextMarker .af_inputText_content,.af_inputChoice.AFFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFFieldTextLTRMarker .af_inputChoice_content-input,.af_inputChoice.AFPhoneFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFPostalCodeFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.AFAddressFieldTextMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.AFFieldTextMarker .af_inputNumberSpinbox_content,.af_inputNumberSpinbox.p_AFDisabled.AFFieldTextMarker .af_inputNumberSpinbox_content,.af_inputNumberSpinbox.AFFieldTextLTRMarker .af_inputNumberSpinbox_content,.AFFieldTextLTR,.AFPhoneFieldText,.AFPostalCodeFieldText,.AFAddressFieldText,.PortletText1,.PortletText2,.PortletText3,.PortletText4,.portlet-form-input-field,.portlet-form-field {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000}
-.AFInstructionTextDisabled,.AFFieldTextDisabled,.af_inputText.p_AFDisabled.AFFieldTextLTRMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFPhoneFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFPostalCodeFieldTextMarker .af_inputText_content,.af_inputText.p_AFDisabled.AFAddressFieldTextMarker .af_inputText_content,.af_inputChoice.p_AFDisabled.AFFieldTextLTRMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFPhoneFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFPostalCodeFieldTextMarker .af_inputChoice_content-input,.af_inputChoice.p_AFDisabled.AFAddressFieldTextMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.p_AFDisabled.AFFieldTextLTRMarker .af_inputNumberSpinbox_content,.af_menuButtons_text-disabled,.p_InContextBrandingText,.AFFieldTextLTRDisabled,.AFPhoneFieldTextDisabled,.AFPostalCodeFieldTextDisabled,.AFAddressFieldTextDisabled,.OraHGridNavRowInactiveLink,.OraNavBarInactiveLink,.portlet-font-dim {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#999999}
-.AFDataText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#000000}
-.AFDataTextDisabled {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#999999}
-.AFDataNumber {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#000000;text-align:right}
-.AFDataNumberDisabled {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#999999;text-align:right}
-.AFFieldNumber,.af_inputText.AFFieldNumberMarker .af_inputText_content,.af_inputChoice.AFFieldNumberMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.AFFieldNumberMarker .af_inputNumberSpinbox_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right;color:#000000}
-.AFFieldNumberDisabled,.af_inputText.p_AFDisabled.AFFieldNumberMarker .af_inputText_content,.af_inputChoice.p_AFDisabled.AFFieldNumberMarker .af_inputChoice_content-input,.af_inputNumberSpinbox.p_AFDisabled.AFFieldNumberMarker .af_inputNumberSpinbox_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right;color:#999999}
-.AFLabelText,.af_outputLabel,.af_inputChoice_label,.af_inputFile_label,.af_inputNumberSpinbox_label,.af_inputText_label,.af_selectBooleanCheckbox_label,.af_selectBooleanRadio_label,.af_inputColor_label,.af_inputDate_label,.af_inputListOfValues_label,.af_selectManyCheckbox_label,.af_selectManyListbox_label,.af_selectOneChoice_label,.af_selectOneListbox_label,.af_selectOneRadio_label,.af_panelLabelAndMessage_label,.af_panelFormLayout_label-cell,.portlet-form-label,.portlet-icon-label,.portlet-dlg-icon-label,.portlet-form-field-label {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;text-align:right;color:#000000;padding:0px 8px 0px 0px;font-weight:normal}
-.AFLabelCell {padding:0px 8px 0px 0px}
-.AFErrorIconStyle {color:#cc0000;font-family:monospace;font-weight:bold}
-.AFInfoIconStyle,.AFWarningIconStyle,.AFQuickSelectIconStyle {color:#669966;font-family:monospace;font-weight:bold}
-.AFRequiredIconStyle {color:#669966;font-family:Courier,sans-serif}
-.AFQuickSelectDisabledIconStyle {color:#999999;font-family:monospace;font-weight:bold}
-.OraLink:link,.af_treeTable_path,.af_menuPath,.af_panelList A,.af_panelPopup_link,.af_menuButtons_text,.OraLinkText,.OraHGridNavRowActiveLink,.OraNavBarActiveLink {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333}
-.OraLink:active,.OraALinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#006666}
-.OraLink:visited,.OraVLinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336666}
-.OraLinkDisabled,.af_outputLabel_required-icon-style,.af_inputChoice_required-icon-style,.af_inputNumberSpinbox_required-icon-style,.af_inputText_required-icon-style,.af_selectBooleanCheckbox_required-icon-style,.af_selectBooleanRadio_required-icon-style,.af_inputDate_required-icon-style,.af_selectManyCheckbox_required-icon-style,.af_selectManyListbox_required-icon-style,.af_selectOneChoice_required-icon-style,.af_selectOneListbox_required-icon-style,.af_selectOneRadio_required-icon-style,.af_outputLabel_group-icon-style,.af_inputChoice_group-icon-style,.af_inputNumberSpinbox_group-icon-style,.af_inputText_group-icon-style,.af_selectBooleanCheckbox_group-icon-style,.af_selectBooleanRadio_group-icon-style,.af_inputDate_group-icon-style,.af_selectManyCheckbox_group-icon-style,.af_selectManyListbox_group-icon-style,.af_selectOneChoice_group-icon-style,.af_selectOneListbox_group-icon-style,.af_selectOneRadio_group-icon-style,.af_menuList,button,.af_navigationPane_choice-label,.af_navigationPane_choice-options,.af_navigationPane_choice-button,.af_breadCrumbs,.af_selectManyShuttle_box-content,.af_selectOrderShuttle_box-content,.af_menuTabs,.af_commandButton,.af_goButton,.af_resetButton,.p_OraDisabled,.OraNav3,.p_OraTreeRow,.portlet-form-button {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal}
-.af_outputDocument_title {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;color:#669966;padding:0px;margin:0px}
-.af_outputDocument_paragraph {text-align:justify;padding:0px;margin:0px}
-.af_outputDocument_separator {text-align:center;padding:0px;margin:0px}
-.af_panelTip,.af_menuButtons_text-selected,.AFHeaderLevelThreePlus,H3.af_panelHeader,H4.af_panelHeader,H5.af_panelHeader,H6.af_panelHeader,H3.af_showDetailHeader,H4.af_showDetailHeader,H5.af_showDetailHeader,H6.af_showDetailHeader,.OraPageStampText,.af_singleStepButtonBar_label,.OraNavBarViewOnly,.PortletHeading3,.PortletHeading4 {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#669966}
-.af_panelTip_label {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold}
-.af_panelAccordion_toolbar,.p_OraContentFooterChildren {float:right}
-.af_dialog_container,.af_panelPopup_container {border-color:#336633;border:1px solid;background-color:white}
-.af_dialog_title-bar,.af_panelPopup_title-bar {background-color:#CCCCCC;border-color:#336633;border-bottom:1px solid;padding:2px 2px 2px 2px}
-.af_dialog_title-text,.af_panelPopup_title-text {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;white-space:nowrap;overflow:hidden}
-.af_dialog_close-icon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;margin-left:5px;background-image:url(images/close.gif);background-position:center;background-repeat:no-repeat;height:13px;width:13px}
-.af_dialog_content,.af_panelPopup_content {background-color:#e9e8e8;border:0px}
-.af_inputChoice.p_AFDisabled .af_inputChoice_label,.af_inputNumberSpinbox.p_AFDisabled .af_inputNumberSpinbox_label,.af_inputText.p_AFDisabled .af_inputText_label,.af_selectBooleanCheckbox.p_AFDisabled .af_selectBooleanCheckbox_label,.af_selectBooleanRadio.p_AFDisabled .af_selectBooleanRadio_label,.af_inputColor.p_AFDisabled .af_inputColor_label,.af_inputDate.p_AFDisabled .af_inputDate_label,.af_inputListOfValues.p_AFDisabled .af_inputListOfValues_label,.af_selectManyCheckbox.p_AFDisabled .af_selectManyCheckbox_label,.af_selectManyListbox.p_AFDisabled .af_selectManyListbox_label,.af_selectOneChoice.p_AFDisabled .af_selectOneChoice_label,.af_selectOneListbox.p_AFDisabled .af_selectOneListbox_label,.af_selectOneRadio.p_AFDisabled .af_selectOneRadio_label,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content,.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content a,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content a,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-mid A {color:#000000}
-.af_inputNumberSpinbox_increment-cell,.af_inputNumberSpinbox_decrement-cell {background-color:#e9e8e8;border-color:#999999;border-width:1px;border-style:solid;width:11px;height:8px}
-.af_inputNumberSpinbox_spinbox-cell {padding-left:1px}
-.af_menuList_selected,.OraNav3Selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#ccffcc}
-.af_menuChoice_label,.portlet-font {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal}
-BODY,.portlet-section-body,.portlet-table-body {background-color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif}
-.af_treeTable_path-step,.af_menuPath_step,.af_menuPath_selected-step {color:#003333;font-size:9pt}
-.af_treeTable_path-selected-step {font-size:9pt;color:#000000}
-.af_panelList UL {margin-top:4px;margin-bottom:4px}
-.af_inputColor_swatch-overlay {position:relative;left:-7px;top:5px}
-.af_navigationPane_bar {background-color:#EFEFEF;padding-left:6px;padding-right:6px}
-.af_navigationPane_bar-active-disabled,.af_navigationPane_bar-inactive-disabled,.af_navigationPane_buttons-active-disabled,.af_navigationPane_buttons-inactive-disabled,.af_navigationPane_list-active-disabled,.af_navigationPane_list-inactive-disabled {cursor:default}
-.af_navigationPane_bar-active-enabled,.af_navigationPane_bar-inactive-enabled,.af_navigationPane_buttons-active-enabled,.af_navigationPane_buttons-inactive-enabled,.af_navigationPane_list-active-enabled,.af_navigationPane_list-inactive-enabled,.af_navigationPane_tabs-active,.af_navigationPane_tabs-inactive {cursor:pointer}
-.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content {color:#000000;font-weight:bold}
-.af_navigationPane_bar-active-enabled .af_navigationPane_bar-content a:hover,.af_navigationPane_bar-inactive-enabled .af_navigationPane_bar-content a:hover,.af_navigationPane_buttons-active-enabled .af_navigationPane_buttons-content a:hover,.af_navigationPane_buttons-inactive-enabled .af_navigationPane_buttons-content a:hover,.af_navigationPane_list-active-enabled .af_navigationPane_list-content a:hover,.af_navigationPane_list-inactive-enabled .af_navigationPane_list-content a:hover,.AFAccessKeyStyle {text-decoration:underline}
-.af_navigationPane_bar-active-disabled .af_navigationPane_bar-content,.af_navigationPane_buttons-active-disabled .af_navigationPane_buttons-content,.af_navigationPane_list-active-disabled .af_navigationPane_list-content {color:gray;font-weight:bold}
-.af_navigationPane_bar-inactive-disabled .af_navigationPane_bar-content,.af_navigationPane_bar-active-disabled .af_navigationPane_bar-content a,.af_navigationPane_bar-inactive-disabled .af_navigationPane_bar-content a,.af_navigationPane_buttons-inactive-disabled .af_navigationPane_buttons-content,.af_navigationPane_buttons-active-disabled .af_navigationPane_buttons-content a,.af_navigationPane_buttons-inactive-disabled .af_navigationPane_buttons-content a,.af_navigationPane_list-inactive-disabled .af_navigationPane_list-content,.af_navigationPane_list-active-disabled .af_navigationPane_list-content a,.af_navigationPane_list-inactive-disabled .af_navigationPane_list-content a,.af_navigationPane_tabs-active.p_AFDisabled .af_navigationPane_tabs-mid,.af_navigationPane_tabs-inactive.p_AFDisabled .af_navigationPane_tabs-mid {color:gray}
-.af_navigationPane_bar-content,.af_navigationPane_buttons-content,.af_navigationPane_list-content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-top:3px;padding-bottom:3px}
-.af_navigationPane_bar-content a,.af_navigationPane_buttons-content a,.af_navigationPane_list-content a {text-decoration:none}
-.af_navigationPane_bar-separator {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-left:6px;padding-right:6px;color:gray}
-.af_navigationPane_buttons-active-enabled .af_navigationPane_buttons-content,.af_navigationPane_list-active-enabled .af_navigationPane_list-content,.af_navigationPane_tabs-active .af_navigationPane_tabs-mid A,.AFLinkAccessKeyStyle,.af_inputDate_selected,.af_chooseDate_selected {font-weight:bold}
-.af_navigationPane_buttons-separator {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding-left:6px;padding-right:6px}
-.af_navigationPane_list-bullet {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;vertical-align:middle;width:17px;background-image:url(images/list-bullet.gif);background-position:center;background-repeat:no-repeat}
-.af_navigationPane_tabs {height:26px;overflow:hidden}
-.af_navigationPane_tabs-active.p_AFDisabled,.af_navigationPane_tabs-inactive.p_AFDisabled {cursor:default;color:gray}
-.af_navigationPane_tabs-start,.af_navigationPane_tabs-start-join {height:22px;width:26px;background-position:top right}
-.af_navigationPane_tabs-start-join-from-active,.af_navigationPane_tabs-start-join-from-inactive {height:22px;width:14px;background-repeat:no-repeat}
-.af_navigationPane_tabs-mid {height:22px;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;padding-left:3px;white-space:nowrap}
-.af_navigationPane_tabs-end-join-to-inactive {height:22px;width:12px;background-repeat:no-repeat}
-.af_navigationPane_tabs-end {height:22px;width:15px}
-.af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-bottom-end {height:4px;background-repeat:repeat-x}
-.af_navigationPane_tabs-bottom-start-content {height:4px;width:17px;background-repeat:no-repeat}
-.af_navigationPane_tabs-bottom-mid-content {height:4px}
-.af_navigationPane_tabs-bottom-end-content {height:4px;width:100%;background-repeat:no-repeat}
-.af_navigationPane_tabs-mid A {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;text-decoration:none}
-.af_navigationPane_tabs-bottom-end-join {background-repeat:repeat-x}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-start {background-image:url(images/tab3-start-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-start-join {background-image:url(images/tab3-start-join-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end {background-image:url(images/tab3-bot-mid-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-start-content {background-image:url(images/tab3-bot-start-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-mid {background-image:url(images/tab3-mid-selected.gif);font-weight:bold}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-end-join-to-inactive {background-image:url(images/tab3-end-join-selected-to-deselected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-end {background-image:url(images/tab3-end-selected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end-join,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-start,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-mid,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end-join {background-image:url(images/tab3-bot-deselected.gif)}
-.af_navigationPane_tabs-active .af_navigationPane_tabs-bottom-end-content {background-image:url(images/tab3-bot-end-selected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start {background-image:url(images/tab3-start-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-start-content,.af_navigationPane_tabs-inactive .af_navigationPane_tabs-bottom-end-content {background-image:none}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start-join-from-active {background-image:url(images/tab3-start-join-selected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-start-join-from-inactive {background-image:url(images/tab3-start-join-deselected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-mid {color:#000000;background-image:url(images/tab3-mid-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-end-join-to-inactive {background-image:url(images/tab3-end-join-deselected-to-deselected.gif)}
-.af_navigationPane_tabs-inactive .af_navigationPane_tabs-end {background-image:url(images/tab3-end-deselected.gif)}
-.af_panelFormLayout_column,.p_OraTreeIcon {vertical-align:top}
-.af_panelFormLayout_separator {background-color:gray;height:1px;font-size:1px;margin-top:3px;margin-bottom:3px}
-.af_panelFormLayout_cell,.af_panelFormLayout_content-cell,.af_panelFormLayout_message-cell {padding:0px}
-.af_panelFormLayout_label-stacked-cell {padding:0px;text-align:left}
-.af_panelBox_transparent img,.af_panelBox_light img,.af_panelBox_medium img,.af_panelBox_dark img,.af_selectManyShuttle_box-content img,.af_selectOrderShuttle_box-content img,.af_menuBar img,.af_messages img,.af_menuTabs img {vertical-align:bottom}
-.af_panelBox_light .af_panelBox_body,.af_selectManyShuttle_box-content .af_selectManyShuttle_box-body,.af_selectOrderShuttle_box-content .af_selectOrderShuttle_box-body,.af_panelSideBar_body,.OraBGAccentLight,.PortletBodyColor,.PortletSubHeaderColor,.af_messages_body {background-color:#e9e8e8}
-.af_panelBox_medium .af_panelBox_body,.OraBGAccentMedium {background-color:#ffffcc}
-.af_panelBox_dark .af_panelBox_body,.OraBGAccentDark {background-color:#CCCCCC}
-.af_panelBox_header,.PortletHeaderColor {width:100%;background-repeat:repeat-x}
-.af_panelBox_light .af_panelBox_header {background-color:#99cc99;color:#ffffff}
-.af_panelPage_copyright,.af_panelPage_privacy,.af_panelPage_about {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#000000;white-space:nowrap}
-.af_panelPage_copyright A,.af_panelPage_privacy A,.af_panelPage_about A,.af_train_link,.af_panelTabbed_tab A,.p_OraTreeRow A:link,.p_OraTreeRow A:active,.p_OraTreeRow A:visited {color:#003333}
-.af_panelCaptionGroup {border-color:#e9e8e8}
-.af_panelCaptionGroup_caption,.OraPageStampLabel,.OraTableControlBarText,.p_OraTreeRowSelected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#669966}
-.af_panelPopup_trigger {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#003333;text-decoration:none;white-space:nowrap}
-.af_panelPopup_close-icon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;text-align:right;padding-left:5px}
-.af_menuBar {background-color:#669966;color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;min-height:4px}
-.af_menuBar_enabled,.af_menuBar_selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;white-space:nowrap}
-.af_menuBar_enabled A,.af_menuBar_selected A {color:#ffffff}
-.af_menuBar_separator {color:#ffffff;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal}
-.af_treeTable_expansion {color:#669966;position:absolute;top:0px;left:-18px}
-.af_treeTable_focus {font-size:10pt;font-weight:normal;color:#669966;font-family:monospace}
-.af_treeTable_locator {font-size:10pt;font-weight:normal;color:#999999;font-family:monospace}
-.af_showOnePanel_container {border-color:#999999;border-width:0px 1px 1px 1px;border-style:solid}
-.af_showOnePanel_header-collapsed {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-width:1px 0px 0px 0px;border-style:solid;cursor:pointer;padding-left:5px}
-.af_showOnePanel_header-expanded {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-style:solid;border-width:1px 0px 1px 0px;padding-left:2px}
-.af_showOnePanel_header-disabled {border-color:#999999;height:21px;text-decoration:none;white-space:nowrap;padding-right:5px;border-style:solid;border-width:1px 0px 0px 0px;padding-left:18px}
-.af_showOnePanel_content {vertical-align:top;margin:5px}
-.af_showOnePanel_title-link {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;background:transparent;color:#669966;display:block;padding-top:2px;text-decoration:none}
-.af_showOnePanel_title-disabled-link {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#999999;display:block;padding-top:2px;text-decoration:none}
-.AFHeaderLevelOne,H1.af_panelHeader,H1.af_showDetailHeader,.af_messages_header,.PortletHeaderText,.PortletHeading1,.PortletSubHeaderText,.portlet-section-header,.portlet-section-subheader,.portlet-table-header,.portlet-table-subheader {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;color:#669966}
-.AFHeaderLevelTwo,H2.af_panelHeader,H2.af_showDetailHeader,.PortletHeading2 {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:11pt;font-weight:normal;color:#669966}
-.af_panelHeader_error,.af_messages_error,.portlet-msg-error {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;color:#cc0000}
-.af_messages {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336633;width:100%}
-.af_messages_message-text,.af_messages_list,.portlet-msg-info {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#669966;margin:0px 0px 0px 0px;padding:5px 30px 5px 30px}
-.af_panelSideBar {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#336633;border-color:#999999}
-.AFSortableHeaderSortIcon {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;font-weight:normal;color:#669966}
-.af_menuTabs_enabled {background-color:#e9e8e8;white-space:nowrap}
-.af_menuTabs_selected {background-color:#669966;white-space:nowrap}
-.af_menuTabs_disabled {background-color:#e9e8e8;color:#999999;white-space:nowrap}
-.af_menuTabs_enabled A {color:#336633}
-.af_menuTabs_selected A {color:#ccffcc}
-.af_menuTabs_separator {width:0px}
-.af_table_content,.af_treeTable_content {border-collapse:collapse;border-color:#999999;border-style:solid;border-width:1px}
-.af_table_control-bar-top,.af_treeTable_control-bar-top {background-color:#e9e8e8;border-color:#999999;border-style:solid;border-width:1px 1px 0px;padding:1px 2px}
-.af_table_control-bar-bottom,.af_treeTable_control-bar-bottom {background-color:#e9e8e8;border-color:#999999;border-style:solid;border-width:0px 1px 1px;padding:1px 2px}
-.af_table_sub-control-bar,.af_treeTable_sub-control-bar {border-color:#999999;border-style:solid;border-width:1px 1px 0px;padding:1px 2px}
-.af_column_cell-text,.portlet-section-selected,.portlet-table-selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999}
-.af_column_cell-text-band,.portlet-section-alternate,.portlet-table-alternate {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999}
-.af_column_cell-number {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999;text-align:right;padding-right:2px}
-.af_column_cell-number-band {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999;text-align:right;padding-right:2px}
-.af_column_cell-icon-format,.af_tableSelectOne_cell-icon-format,.af_tableSelectMany_cell-icon-format,.OraTableCellSelect,.portlet-section-text,.portlet-table-text {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#e9e8e8;border-color:#999999;text-align:center}
-.af_column_cell-icon-format-band,.af_tableSelectOne_cell-icon-format-band,.af_tableSelectMany_cell-icon-format-band,.OraTableCellSelectBand {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;vertical-align:baseline;background-color:#ffffff;border-color:#999999;text-align:center}
-.af_column_header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966;vertical-align:bottom}
-.af_column_header-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;text-align:right}
-.af_column_header-icon-format {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;text-align:center}
-.af_column_row-header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#669966}
-.af_table_detail {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#000000;border-color:#999999;background-color:#ffffff}
-.af_table_column-footer,.portlet-section-footer,.portlet-table-footer {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966}
-.OraTableTotal {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#669966}
-.af_column_total-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:right;background-color:#CCCCCC;color:#000000;vertical-align:baseline}
-.af_column_total-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#000000;vertical-align:baseline}
-.af_column_sortable-header-text {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:left;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset}
-.af_column_sortable-header-number {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset;text-align:right}
-.af_column_sortable-header-icon-format {border-color:#999999;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#CCCCCC;color:#669966;vertical-align:bottom;cursor:pointer;border-width:2px;border-style:outset;text-align:center}
-.af_train_stop.p_AFSelected {color:#669966;font-weight:bold}
-.af_train_stop:visited,.af_train_stop:visited .af_train_link {color:#666666}
-.af_train_stop.p_AFDisabled,.af_panelTabbed_tab .p_OraDisabled {color:#999999}
-.af_train_stop.p_AFUnvisited,.p_OraContentFooterRule {color:#669966}
-.af_train_stop.p_AFDisabled .af_train_link {color:#669999}
-.OraBGColorVeryDark {background-color:#336633}
-.OraBGColorDark,.af_menuBar_body,.af_menuBar_title,.af_menuBar_empty {background-color:#669966}
-.OraBGColorMedium {background-color:#99cc99}
-.OraBGColorLight {background-color:#ccffcc}
-.OraBGGrayVeryDark {background-color:#333333}
-.OraBGGrayDark {background-color:#666666}
-.OraBGGrayMedium,.OraBGAccentVeryDark,.OraTable {background-color:#999999}
-.OraBGGrayLight {background-color:#cccccc}
-.OraInlineInfoText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#669966}
-.OraTextInline {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#99cc99}
-.OraMessageBoxErrorText,.AFErrorText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;color:#cc0000}
-.OraErrorNameText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#cc0000}
-.OraInlineErrorText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;font-weight:normal;color:#cc0000}
-.OraGlobalPageTitle {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;color:#ffffff;font-weight:bold}
-.p_OraSelected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;background-color:#ccffcc;text-decoration:none}
-.p_OraHiddenLabel {position:absolute;top:-999px;left:0px;font-size:0px}
-.p_OraColorFieldSwatch {border-color:#000000;border-style:solid;border-width:1px}
-.p_OraColorPalette {background-color:#000000}
-.p_OraColorPaletteEmptyCell {background-color:#ffffff}
-.af_inputDate_nav A,.af_chooseDate_nav A {color:#003333;text-decoration:none}
-.af_inputDate_title,.af_chooseDate_title {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;text-align:center;background-color:#ffffff;color:#669966;padding:2px}
-.af_inputDate_header,.af_chooseDate_header {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;text-align:center;color:#669966;padding:2px}
-.af_inputDate_content A,.af_chooseDate_content A {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:center;color:#003333}
-.af_chooseDate_content {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:center;color:#999999;text-decoration:none;border-width:1px;border-style:solid;padding:2px}
-.p_OraContentFooterStart {float:left}
-.p_OraContentFooterBottom {clear:both;margin-bottom:5px}
-.p_OraFooter {text-align:center}
-.p_OraFooterBottom {padding-top:5px}
-.p_OraHeaderNest {margin:5px 0px 0px 12px}
-.OraHGridLocatorHeader {border-color:#999999;background-color:#e9e8e8}
-.p_OraHideShowDisclosedSymbol,.af_panelTabbed_tab-selected A,.p_OraTreeDisclosedSymbol A:link,.p_OraTreeDisclosedSymbol A:active,.p_OraTreeDisclosedSymbol A:visited,.p_OraTreeRowSelected A:link,.p_OraTreeRowSelected A:active,.p_OraTreeRowSelected A:visited {color:#669966;text-decoration:none}
-.af_messages_list-single {list-style-type:none}
-.p_OraQuickSearchBox {background-color:#e9e8e8;border-color:#CCCCCC;border-style:solid;padding:0pt 5pt 5pt 5pt;border-width:0px 0px 1px 1px}
-.p_OraGlobalQuick {border-color:#CCCCCC;border-style:solid;border-width:0px 0px 0px 1px}
-.p_OraProcessingStatus {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;color:#669966;border-color:#99cc99;border-style:solid;border-width:1px}
-.p_OraProductBrandingText {color:#669966;position:relative;font-family:Garamond, Times, Times New Roman, Serif;font-weight:normal;font-size:24pt;line-height:28.8pt;top:-4.8pt}
-.p_OraProductBrandingCompactText {color:#669966;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;margin-bottom:0px;margin-top:0px;font-weight:bold}
-.OraShuttleHeader {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;color:#669966;font-weight:bold;padding:0px 0px 0px 18px}
-.OraShuttleLinkText {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:9pt;font-weight:normal;color:#003333}
-.p_OraSideBarMinWidth {width:140px}
-.OraStyledList {list-style-position:inside;padding:0px;margin:0px}
-.OraStyledList .OraStyledList {padding:0pt 0pt 0pt 10pt}
-.af_panelTabbed_tab {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;padding:0px 8px}
-.af_panelTabbed_tab-selected {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:bold;padding:0px 8px}
-.af_panelTabbed_cell-start {width:0%}
-.af_panelTabbed_cell-end {width:100%}
-.OraTableBorder0001 {border-style:solid;border-width:0px 0px 0px 1px}
-.OraTableBorder0010 {border-style:solid;border-width:0px 0px 1px}
-.OraTableBorder0011 {border-style:solid;border-width:0px 0px 1px 1px}
-.OraTableBorder0100 {border-style:solid;border-width:0px 1px 0px 0px}
-.OraTableBorder0101 {border-style:solid;border-width:0px 1px}
-.OraTableBorder0110 {border-style:solid;border-width:0px 1px 1px 0px}
-.OraTableBorder0111 {border-style:solid;border-width:0px 1px 1px}
-.OraTableBorder1000 {border-style:solid;border-width:1px 0px 0px}
-.OraTableBorder1001 {border-style:solid;border-width:1px 0px 0px 1px}
-.OraTableBorder1010 {border-style:solid;border-width:1px 0px}
-.OraTableBorder1011 {border-style:solid;border-width:1px 0px 1px 1px}
-.OraTableBorder1100 {border-style:solid;border-width:1px 1px 0px 0px}
-.OraTableBorder1101 {border-style:solid;border-width:1px 1px 0px}
-.OraTableBorder1110 {border-style:solid;border-width:1px 1px 1px 0px}
-.OraTableBorder1111 {border-style:solid;border-width:1px}
-.OraTableTitle {font-family:Arial,Helvetica,Geneva,sans-serif;font-size:13pt;font-weight:normal;background-color:#ffffff;color:#669966}
-.p_OraTreeDisclosedSymbol {color:#669966;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:10pt;font-weight:normal;text-align:right}
-.p_OraTreeNodeAdjust {padding-bottom:2px}
-.af_chart {width:400px;height:300px;background-color:white}
-.p_OraOnePixelLine {background-color:#CCCCCC;font-size:0pt;overflow:hidden;height:1px;width:100%}
-.p_OraDisplayBlock {display:block}
-.p_OraHideSkipNaviText {font-size:0pt;margin-top:0px;margin-left:-999px}
-.PortletHeaderLink,.PortletSubHeaderLink {color:#ffffff;text-decoration:none}
-.AFLogo {width:103px;height:13px;background-repeat:no-repeat;background-position:center;vertical-align:middle;background-image:url(images/logo-dark.gif)}
-body {margin-top:8px}
-.p_OraNav2 {border-color:#99cc99}
-.af_navigationPane {height:25px}
-/* The number of CSS selectors in this file is 548 */
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/ITrinidadConstants.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/ITrinidadConstants.java
deleted file mode 100644
index cbb8d88..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/ITrinidadConstants.java
+++ /dev/null
@@ -1,2557 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-
-/**
- * Trinidad-related constants.
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITrinidadConstants {
-
-	/**
-	 * Trinidad "core" URI.
-	 */
-	public static final String URI_CORE = "http://myfaces.apache.org/trinidad"; //$NON-NLS-1$
-
-	/**
-	 * Trinidad "html" URI.
-	 */
-	public static final String URI_HTML = "http://myfaces.apache.org/trinidad/html"; //$NON-NLS-1$
-
-	// "Core" tags
-	/**
-	 * Tag name for "tr:forEach"
-	 */
-	public static final String TAG_FOREACH = "forEach"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:forEach"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FOREACH = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_FOREACH);
-
-	/**
-	 * Tag name for "tr:setActionListener"
-	 */
-	public static final String TAG_SETACTIONLISTENER = "setActionListener"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:setActionListener"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SETACTIONLISTENER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SETACTIONLISTENER);
-
-	/**
-	 * Tag name for "tr:fileDownloadActionListener"
-	 */
-	public static final String TAG_FILEDOWNLOADACTIONLISTENER = "fileDownloadActionListener"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:fileDownloadActionListener"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FILEDOWNLOADACTIONLISTENER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_FILEDOWNLOADACTIONLISTENER);
-
-	/**
-	 * Tag name for "tr:returnActionListener"
-	 */
-	public static final String TAG_RETURNACTIONLISTENER = "returnActionListener"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:returnActionListener"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_RETURNACTIONLISTENER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_RETURNACTIONLISTENER);
-
-	/**
-	 * Tag name for "tr:resetActionListener"
-	 */
-	public static final String TAG_RESETACTIONLISTENER = "resetActionListener"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:resetActionListener"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_RESETACTIONLISTENER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_RESETACTIONLISTENER);
-
-	/**
-	 * Tag name for "tr:componentRef"
-	 */
-	public static final String TAG_COMPONENTREF = "componentRef"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:componentRef"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COMPONENTREF = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COMPONENTREF);
-
-	/**
-	 * Tag name for "tr:componentDef"
-	 */
-	public static final String TAG_COMPONENTDEF = "componentDef"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:componentDef"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COMPONENTDEF = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COMPONENTDEF);
-
-	/**
-	 * Tag name for "tr:facetRef"
-	 */
-	public static final String TAG_FACETREF = "facetRef"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:facetRef"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FACETREF = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_FACETREF);
-
-	/**
-	 * Tag name for "tr:breadCrumbs"
-	 */
-	public static final String TAG_BREADCRUMBS = "breadCrumbs"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:breadCrumbs"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_BREADCRUMBS = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_BREADCRUMBS);
-
-	/**
-	 * Tag name for "tr:chart"
-	 */
-	public static final String TAG_CHART = "chart"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:chart"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CHART = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CHART);
-
-	/**
-	 * Tag name for "tr:chooseColor"
-	 */
-	public static final String TAG_CHOOSECOLOR = "chooseColor"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:chooseColor"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CHOOSECOLOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CHOOSECOLOR);
-
-	/**
-	 * Tag name for "tr:chooseDate"
-	 */
-	public static final String TAG_CHOOSEDATE = "chooseDate"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:chooseDate"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CHOOSEDATE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CHOOSEDATE);
-
-	/**
-	 * Tag name for "tr:column"
-	 */
-	public static final String TAG_COLUMN = "column"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:column"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COLUMN = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COLUMN);
-
-	/**
-	 * Tag name for "tr:commandButton"
-	 */
-	public static final String TAG_COMMANDBUTTON = "commandButton"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:commandButton"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COMMANDBUTTON = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COMMANDBUTTON);
-
-	/**
-	 * Tag name for "tr:commandLink"
-	 */
-	public static final String TAG_COMMANDLINK = "commandLink"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:commandLink"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COMMANDLINK = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COMMANDLINK);
-
-	/**
-	 * Tag name for "tr:commandNavigationItem"
-	 */
-	public static final String TAG_COMMANDNAVIGATIONITEM = "commandNavigationItem"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:commandNavigationItem"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_COMMANDNAVIGATIONITEM = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_COMMANDNAVIGATIONITEM);
-
-	/**
-	 * Tag name for "tr:document"
-	 */
-	public static final String TAG_DOCUMENT = "document"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:document"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_DOCUMENT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_DOCUMENT);
-
-	/**
-	 * Tag name for "tr:form"
-	 */
-	public static final String TAG_FORM = "form"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:form"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FORM = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_FORM);
-
-	/**
-	 * Tag name for "tr:goButton"
-	 */
-	public static final String TAG_GOBUTTON = "goButton"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:goButton"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_GOBUTTON = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_GOBUTTON);
-
-	/**
-	 * Tag name for "tr:goLink"
-	 */
-	public static final String TAG_GOLINK = "goLink"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:goLink"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_GOLINK = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_GOLINK);
-
-	/**
-	 * Tag name for "tr:icon"
-	 */
-	public static final String TAG_ICON = "icon"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:icon"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_ICON = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_ICON);
-
-	/**
-	 * Tag name for "tr:image"
-	 */
-	public static final String TAG_IMAGE = "image"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:image"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_IMAGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_IMAGE);
-
-	/**
-	 * Tag name for "tr:importScript"
-	 */
-	public static final String TAG_IMPORTSCRIPT = "importScript"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:importScript"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_IMPORTSCRIPT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_IMPORTSCRIPT);
-
-	/**
-	 * Tag name for "tr:inputColor"
-	 */
-	public static final String TAG_INPUTCOLOR = "inputColor"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputColor"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTCOLOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTCOLOR);
-
-	/**
-	 * Tag name for "tr:inputDate"
-	 */
-	public static final String TAG_INPUTDATE = "inputDate"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputDate"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTDATE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTDATE);
-
-	/**
-	 * Tag name for "tr:inputFile"
-	 */
-	public static final String TAG_INPUTFILE = "inputFile"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputFile"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTFILE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTFILE);
-
-	/**
-	 * Tag name for "tr:inputHidden"
-	 */
-	public static final String TAG_INPUTHIDDEN = "inputHidden"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputHidden"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTHIDDEN = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTHIDDEN);
-
-	/**
-	 * Tag name for "tr:inputListOfValues"
-	 */
-	public static final String TAG_INPUTLISTOFVALUES = "inputListOfValues"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputListOfValues"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTLISTOFVALUES = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTLISTOFVALUES);
-
-	/**
-	 * Tag name for "tr:inputNumberSpinbox"
-	 */
-	public static final String TAG_INPUTNUMBERSPINBOX = "inputNumberSpinbox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputNumberSpinbox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTNUMBERSPINBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTNUMBERSPINBOX);
-
-	/**
-	 * Tag name for "tr:inputText"
-	 */
-	public static final String TAG_INPUTTEXT = "inputText"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:inputText"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_INPUTTEXT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_INPUTTEXT);
-
-	/**
-	 * Tag name for "tr:legend"
-	 */
-	public static final String TAG_LEGEND = "legend"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:legend"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_LEGEND = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_LEGEND);
-
-	/**
-	 * Tag name for "tr:media"
-	 */
-	public static final String TAG_MEDIA = "media"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:media"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_MEDIA = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_MEDIA);
-
-	/**
-	 * Tag name for "tr:message"
-	 */
-	public static final String TAG_MESSAGE = "message"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:message"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_MESSAGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_MESSAGE);
-
-	/**
-	 * Tag name for "tr:messages"
-	 */
-	public static final String TAG_MESSAGES = "messages"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:messages"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_MESSAGES = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_MESSAGES);
-
-	/**
-	 * Tag name for "tr:navigationPane"
-	 */
-	public static final String TAG_NAVIGATIONPANE = "navigationPane"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:navigationPane"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_NAVIGATIONPANE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_NAVIGATIONPANE);
-
-	/**
-	 * Tag name for "tr:navigationTree"
-	 */
-	public static final String TAG_NAVIGATIONTREE = "navigationTree"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:navigationTree"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_NAVIGATIONTREE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_NAVIGATIONTREE);
-
-	/**
-	 * Tag name for "tr:outputDocument"
-	 */
-	public static final String TAG_OUTPUTDOCUMENT = "outputDocument"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:outputDocument"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_OUTPUTDOCUMENT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_OUTPUTDOCUMENT);
-
-	/**
-	 * Tag name for "tr:outputFormatted"
-	 */
-	public static final String TAG_OUTPUTFORMATTED = "outputFormatted"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:outputFormatted"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_OUTPUTFORMATTED = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_OUTPUTFORMATTED);
-
-	/**
-	 * Tag name for "tr:outputLabel"
-	 */
-	public static final String TAG_OUTPUTLABEL = "outputLabel"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:outputLabel"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_OUTPUTLABEL = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_OUTPUTLABEL);
-
-	/**
-	 * Tag name for "tr:outputText"
-	 */
-	public static final String TAG_OUTPUTTEXT = "outputText"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:outputText"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_OUTPUTTEXT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_OUTPUTTEXT);
-
-	/**
-	 * Tag name for "tr:page"
-	 */
-	public static final String TAG_PAGE = "page"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:page"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PAGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PAGE);
-
-	/**
-	 * Tag name for "tr:panelAccordion"
-	 */
-	public static final String TAG_PANELACCORDION = "panelAccordion"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelAccordion"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELACCORDION = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELACCORDION);
-
-	/**
-	 * Tag name for "tr:panelBorderLayout"
-	 */
-	public static final String TAG_PANELBORDERLAYOUT = "panelBorderLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelBorderLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELBORDERLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELBORDERLAYOUT);
-
-	/**
-	 * Tag name for "tr:panelBox"
-	 */
-	public static final String TAG_PANELBOX = "panelBox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelBox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELBOX);
-
-	/**
-	 * Tag name for "tr:panelButtonBar"
-	 */
-	public static final String TAG_PANELBUTTONBAR = "panelButtonBar"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelButtonBar"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELBUTTONBAR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELBUTTONBAR);
-
-	/**
-	 * Tag name for "tr:panelCaptionGroup"
-	 */
-	public static final String TAG_PANELCAPTIONGROUP = "panelCaptionGroup"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelCaptionGroup"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELCAPTIONGROUP = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELCAPTIONGROUP);
-
-	/**
-	 * Tag name for "tr:panelChoice"
-	 */
-	public static final String TAG_PANELCHOICE = "panelChoice"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelChoice"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELCHOICE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELCHOICE);
-
-	/**
-	 * Tag name for "tr:panelFormLayout"
-	 */
-	public static final String TAG_PANELFORMLAYOUT = "panelFormLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelFormLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELFORMLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELFORMLAYOUT);
-
-	/**
-	 * Tag name for "tr:panelGroupLayout"
-	 */
-	public static final String TAG_PANELGROUPLAYOUT = "panelGroupLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelGroupLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELGROUPLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELGROUPLAYOUT);
-
-	/**
-	 * Tag name for "tr:panelHeader"
-	 */
-	public static final String TAG_PANELHEADER = "panelHeader"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelHeader"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELHEADER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELHEADER);
-
-	/**
-	 * Tag name for "tr:panelHorizontalLayout"
-	 */
-	public static final String TAG_PANELHORIZONTALLAYOUT = "panelHorizontalLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelHorizontalLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELHORIZONTALLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELHORIZONTALLAYOUT);
-
-	/**
-	 * Tag name for "tr:panelLabelAndMessage"
-	 */
-	public static final String TAG_PANELLABELANDMESSAGE = "panelLabelAndMessage"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelLabelAndMessage"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELLABELANDMESSAGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELLABELANDMESSAGE);
-
-	/**
-	 * Tag name for "tr:panelList"
-	 */
-	public static final String TAG_PANELLIST = "panelList"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelList"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELLIST = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELLIST);
-
-	/**
-	 * Tag name for "tr:panelPage"
-	 */
-	public static final String TAG_PANELPAGE = "panelPage"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelPage"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELPAGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELPAGE);
-
-	/**
-	 * Tag name for "tr:panelPageHeader"
-	 */
-	public static final String TAG_PANELPAGEHEADER = "panelPageHeader"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelPageHeader"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELPAGEHEADER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELPAGEHEADER);
-
-	/**
-	 * Tag name for "tr:panelPopup"
-	 */
-	public static final String TAG_PANELPOPUP = "panelPopup"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelPopup"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELPOPUP = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELPOPUP);
-
-	/**
-	 * Tag name for "tr:panelRadio"
-	 */
-	public static final String TAG_PANELRADIO = "panelRadio"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelRadio"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELRADIO = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELRADIO);
-
-	/**
-	 * Tag name for "tr:panelSideBar"
-	 */
-	public static final String TAG_PANELSIDEBAR = "panelSideBar"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelSideBar"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELSIDEBAR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELSIDEBAR);
-
-	/**
-	 * Tag name for "tr:panelTabbed"
-	 */
-	public static final String TAG_PANELTABBED = "panelTabbed"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelTabbed"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELTABBED = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELTABBED);
-
-	/**
-	 * Tag name for "tr:panelTip"
-	 */
-	public static final String TAG_PANELTIP = "panelTip"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:panelTip"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PANELTIP = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PANELTIP);
-
-	/**
-	 * Tag name for "tr:poll"
-	 */
-	public static final String TAG_POLL = "poll"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:poll"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_POLL = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_POLL);
-
-	/**
-	 * Tag name for "tr:processChoiceBar"
-	 */
-	public static final String TAG_PROCESSCHOICEBAR = "processChoiceBar"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:processChoiceBar"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PROCESSCHOICEBAR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PROCESSCHOICEBAR);
-
-	/**
-	 * Tag name for "tr:progressIndicator"
-	 */
-	public static final String TAG_PROGRESSINDICATOR = "progressIndicator"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:progressIndicator"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_PROGRESSINDICATOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_PROGRESSINDICATOR);
-
-	/**
-	 * Tag name for "tr:resetButton"
-	 */
-	public static final String TAG_RESETBUTTON = "resetButton"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:resetButton"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_RESETBUTTON = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_RESETBUTTON);
-
-	/**
-	 * Tag name for "tr:selectBooleanCheckbox"
-	 */
-	public static final String TAG_SELECTBOOLEANCHECKBOX = "selectBooleanCheckbox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectBooleanCheckbox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTBOOLEANCHECKBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTBOOLEANCHECKBOX);
-
-	/**
-	 * Tag name for "tr:selectBooleanRadio"
-	 */
-	public static final String TAG_SELECTBOOLEANRADIO = "selectBooleanRadio"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectBooleanRadio"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTBOOLEANRADIO = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTBOOLEANRADIO);
-
-	/**
-	 * Tag name for "tr:selectItem"
-	 */
-	public static final String TAG_SELECTITEM = "selectItem"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectItem"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTITEM = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTITEM);
-
-	/**
-	 * Tag name for "tr:selectManyCheckbox"
-	 */
-	public static final String TAG_SELECTMANYCHECKBOX = "selectManyCheckbox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectManyCheckbox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTMANYCHECKBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTMANYCHECKBOX);
-
-	/**
-	 * Tag name for "tr:selectManyListbox"
-	 */
-	public static final String TAG_SELECTMANYLISTBOX = "selectManyListbox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectManyListbox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTMANYLISTBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTMANYLISTBOX);
-
-	/**
-	 * Tag name for "tr:selectManyShuttle"
-	 */
-	public static final String TAG_SELECTMANYSHUTTLE = "selectManyShuttle"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectManyShuttle"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTMANYSHUTTLE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTMANYSHUTTLE);
-
-	/**
-	 * Tag name for "tr:selectOneChoice"
-	 */
-	public static final String TAG_SELECTONECHOICE = "selectOneChoice"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectOneChoice"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTONECHOICE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTONECHOICE);
-
-	/**
-	 * Tag name for "tr:selectOneListbox"
-	 */
-	public static final String TAG_SELECTONELISTBOX = "selectOneListbox"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectOneListbox"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTONELISTBOX = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTONELISTBOX);
-
-	/**
-	 * Tag name for "tr:selectOneRadio"
-	 */
-	public static final String TAG_SELECTONERADIO = "selectOneRadio"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectOneRadio"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTONERADIO = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTONERADIO);
-
-	/**
-	 * Tag name for "tr:selectOrderShuttle"
-	 */
-	public static final String TAG_SELECTORDERSHUTTLE = "selectOrderShuttle"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectOrderShuttle"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTORDERSHUTTLE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTORDERSHUTTLE);
-
-	/**
-	 * Tag name for "tr:selectRangeChoiceBar"
-	 */
-	public static final String TAG_SELECTRANGECHOICEBAR = "selectRangeChoiceBar"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:selectRangeChoiceBar"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SELECTRANGECHOICEBAR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SELECTRANGECHOICEBAR);
-
-	/**
-	 * Tag name for "tr:separator"
-	 */
-	public static final String TAG_SEPARATOR = "separator"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:separator"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SEPARATOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SEPARATOR);
-
-	/**
-	 * Tag name for "tr:showDetail"
-	 */
-	public static final String TAG_SHOWDETAIL = "showDetail"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:showDetail"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SHOWDETAIL = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SHOWDETAIL);
-
-	/**
-	 * Tag name for "tr:showDetailHeader"
-	 */
-	public static final String TAG_SHOWDETAILHEADER = "showDetailHeader"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:showDetailHeader"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SHOWDETAILHEADER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SHOWDETAILHEADER);
-
-	/**
-	 * Tag name for "tr:showDetailItem"
-	 */
-	public static final String TAG_SHOWDETAILITEM = "showDetailItem"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:showDetailItem"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SHOWDETAILITEM = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SHOWDETAILITEM);
-
-	/**
-	 * Tag name for "tr:singleStepButtonBar"
-	 */
-	public static final String TAG_SINGLESTEPBUTTONBAR = "singleStepButtonBar"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:singleStepButtonBar"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SINGLESTEPBUTTONBAR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SINGLESTEPBUTTONBAR);
-
-	/**
-	 * Tag name for "tr:spacer"
-	 */
-	public static final String TAG_SPACER = "spacer"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:spacer"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SPACER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SPACER);
-
-	/**
-	 * Tag name for "tr:statusIndicator"
-	 */
-	public static final String TAG_STATUSINDICATOR = "statusIndicator"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:statusIndicator"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_STATUSINDICATOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_STATUSINDICATOR);
-
-	/**
-	 * Tag name for "tr:subform"
-	 */
-	public static final String TAG_SUBFORM = "subform"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:subform"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SUBFORM = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SUBFORM);
-
-	/**
-	 * Tag name for "tr:table"
-	 */
-	public static final String TAG_TABLE = "table"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:table"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_TABLE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_TABLE);
-
-	/**
-	 * Tag name for "tr:train"
-	 */
-	public static final String TAG_TRAIN = "train"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:train"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_TRAIN = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_TRAIN);
-
-	/**
-	 * Tag name for "tr:tree"
-	 */
-	public static final String TAG_TREE = "tree"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:tree"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_TREE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_TREE);
-
-	/**
-	 * Tag name for "tr:treeTable"
-	 */
-	public static final String TAG_TREETABLE = "treeTable"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:treeTable"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_TREETABLE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_TREETABLE);
-
-	/**
-	 * Tag name for "tr:group"
-	 */
-	public static final String TAG_GROUP = "group"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:group"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_GROUP = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_GROUP);
-
-	/**
-	 * Tag name for "tr:iterator"
-	 */
-	public static final String TAG_ITERATOR = "iterator"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:iterator"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_ITERATOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_ITERATOR);
-
-	/**
-	 * Tag name for "tr:switcher"
-	 */
-	public static final String TAG_SWITCHER = "switcher"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:switcher"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SWITCHER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_SWITCHER);
-
-	/**
-	 * Tag name for "tr:convertColor"
-	 */
-	public static final String TAG_CONVERTCOLOR = "convertColor"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:convertColor"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CONVERTCOLOR = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CONVERTCOLOR);
-
-	/**
-	 * Tag name for "tr:convertDateTime"
-	 */
-	public static final String TAG_CONVERTDATETIME = "convertDateTime"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:convertDateTime"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CONVERTDATETIME = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CONVERTDATETIME);
-
-	/**
-	 * Tag name for "tr:convertNumber"
-	 */
-	public static final String TAG_CONVERTNUMBER = "convertNumber"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:convertNumber"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CONVERTNUMBER = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_CONVERTNUMBER);
-
-	/**
-	 * Tag name for "tr:validateByteLength"
-	 */
-	public static final String TAG_VALIDATEBYTELENGTH = "validateByteLength"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateByteLength"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATEBYTELENGTH = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATEBYTELENGTH);
-
-	/**
-	 * Tag name for "tr:validateDateRestriction"
-	 */
-	public static final String TAG_VALIDATEDATERESTRICTION = "validateDateRestriction"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateDateRestriction"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATEDATERESTRICTION = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATEDATERESTRICTION);
-
-	/**
-	 * Tag name for "tr:validateDateTimeRange"
-	 */
-	public static final String TAG_VALIDATEDATETIMERANGE = "validateDateTimeRange"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateDateTimeRange"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATEDATETIMERANGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATEDATETIMERANGE);
-
-	/**
-	 * Tag name for "tr:validateDoubleRange"
-	 */
-	public static final String TAG_VALIDATEDOUBLERANGE = "validateDoubleRange"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateDoubleRange"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATEDOUBLERANGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATEDOUBLERANGE);
-
-	/**
-	 * Tag name for "tr:validateLength"
-	 */
-	public static final String TAG_VALIDATELENGTH = "validateLength"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateLength"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATELENGTH = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATELENGTH);
-
-	/**
-	 * Tag name for "tr:validateLongRange"
-	 */
-	public static final String TAG_VALIDATELONGRANGE = "validateLongRange"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateLongRange"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATELONGRANGE = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATELONGRANGE);
-
-	/**
-	 * Tag name for "tr:validateRegExp"
-	 */
-	public static final String TAG_VALIDATEREGEXP = "validateRegExp"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "tr:validateRegExp"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_VALIDATEREGEXP = TagIdentifierFactory
-			.createJSPTagWrapper(URI_CORE, TAG_VALIDATEREGEXP);
-
-	// "HTML" tags
-	/**
-	 * Tag name for "trh:styleSheet"
-	 */
-	public static final String TAG_STYLESHEET = "styleSheet"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:styleSheet"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_STYLESHEET = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_STYLESHEET);
-
-	/**
-	 * Tag name for "trh:body"
-	 */
-	public static final String TAG_BODY = "body"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:body"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_BODY = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_BODY);
-
-	/**
-	 * Tag name for "trh:cellFormat"
-	 */
-	public static final String TAG_CELLFORMAT = "cellFormat"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:cellFormat"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_CELLFORMAT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_CELLFORMAT);
-
-	/**
-	 * Tag name for "trh:frame"
-	 */
-	public static final String TAG_FRAME = "frame"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:frame"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FRAME = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_FRAME);
-
-	/**
-	 * Tag name for "trh:frameBorderLayout"
-	 */
-	public static final String TAG_FRAMEBORDERLAYOUT = "frameBorderLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:frameBorderLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_FRAMEBORDERLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_FRAMEBORDERLAYOUT);
-
-	/**
-	 * Tag name for "trh:head"
-	 */
-	public static final String TAG_HEAD = "head"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:head"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_HEAD = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_HEAD);
-
-	/**
-	 * Tag name for "trh:html"
-	 */
-	public static final String TAG_HTML = "html"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:html"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_HTML = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_HTML);
-
-	/**
-	 * Tag name for "trh:rowLayout"
-	 */
-	public static final String TAG_ROWLAYOUT = "rowLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:rowLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_ROWLAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_ROWLAYOUT);
-
-	/**
-	 * Tag name for "trh:script"
-	 */
-	public static final String TAG_SCRIPT = "script"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:script"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_SCRIPT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_SCRIPT);
-
-	/**
-	 * Tag name for "trh:tableLayout"
-	 */
-	public static final String TAG_TABLELAYOUT = "tableLayout"; //$NON-NLS-1$
-
-	/**
-	 * TagIdentifier for "trh:tableLayout"
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_TABLELAYOUT = TagIdentifierFactory
-			.createJSPTagWrapper(URI_HTML, TAG_TABLELAYOUT);
-
-//Attributes
-	/**
-	* "summary" tag attribute name
-	*/
-	public static final String ATTR_SUMMARY = "summary"; //$NON-NLS-1$
-
-	/**
-	* "initialFocusId" tag attribute name
-	*/
-	public static final String ATTR_INITIALFOCUSID = "initialFocusId"; //$NON-NLS-1$
-
-	/**
-	* "accessKey" tag attribute name
-	*/
-	public static final String ATTR_ACCESSKEY = "accessKey"; //$NON-NLS-1$
-
-	/**
-	* "colorData" tag attribute name
-	*/
-	public static final String ATTR_COLORDATA = "colorData"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertBoth" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTBOTH = "messageDetailConvertBoth"; //$NON-NLS-1$
-
-	/**
-	* "defaultSortOrder" tag attribute name
-	*/
-	public static final String ATTR_DEFAULTSORTORDER = "defaultSortOrder"; //$NON-NLS-1$
-
-	/**
-	* "columns" tag attribute name
-	*/
-	public static final String ATTR_COLUMNS = "columns"; //$NON-NLS-1$
-
-	/**
-	* "chromeType" tag attribute name
-	*/
-	public static final String ATTR_CHROMETYPE = "chromeType"; //$NON-NLS-1$
-
-	/**
-	* "rowHeader" tag attribute name
-	*/
-	public static final String ATTR_ROWHEADER = "rowHeader"; //$NON-NLS-1$
-
-	/**
-	* "transparentAllowed" tag attribute name
-	*/
-	public static final String ATTR_TRANSPARENTALLOWED = "transparentAllowed"; //$NON-NLS-1$
-
-	/**
-	* "rootNodeRendered" tag attribute name
-	*/
-	public static final String ATTR_ROOTNODERENDERED = "rootNodeRendered"; //$NON-NLS-1$
-
-	/**
-	* "rangeChangeListener" tag attribute name
-	*/
-	public static final String ATTR_RANGECHANGELISTENER = "rangeChangeListener"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertCurrency" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTCURRENCY = "messageDetailConvertCurrency"; //$NON-NLS-1$
-
-	/**
-	* "patterns" tag attribute name
-	*/
-	public static final String ATTR_PATTERNS = "patterns"; //$NON-NLS-1$
-
-	/**
-	* "disclosedRowKeys" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSEDROWKEYS = "disclosedRowKeys"; //$NON-NLS-1$
-
-	/**
-	* "ondblclick" tag attribute name
-	*/
-	public static final String ATTR_ONDBLCLICK = "ondblclick"; //$NON-NLS-1$
-
-	/**
-	* "windowWidth" tag attribute name
-	*/
-	public static final String ATTR_WINDOWWIDTH = "windowWidth"; //$NON-NLS-1$
-
-	/**
-	* "rendered" tag attribute name
-	*/
-	public static final String ATTR_RENDERED = "rendered"; //$NON-NLS-1$
-
-	/**
-	* "invalidDays" tag attribute name
-	*/
-	public static final String ATTR_INVALIDDAYS = "invalidDays"; //$NON-NLS-1$
-
-	/**
-	* "styleUsage" tag attribute name
-	*/
-	public static final String ATTR_STYLEUSAGE = "styleUsage"; //$NON-NLS-1$
-
-	/**
-	* "blocking" tag attribute name
-	*/
-	public static final String ATTR_BLOCKING = "blocking"; //$NON-NLS-1$
-
-	/**
-	* "gradientsUsed" tag attribute name
-	*/
-	public static final String ATTR_GRADIENTSUSED = "gradientsUsed"; //$NON-NLS-1$
-
-	/**
-	* "legendPosition" tag attribute name
-	*/
-	public static final String ATTR_LEGENDPOSITION = "legendPosition"; //$NON-NLS-1$
-
-	/**
-	* "rowDisclosureListener" tag attribute name
-	*/
-	public static final String ATTR_ROWDISCLOSURELISTENER = "rowDisclosureListener"; //$NON-NLS-1$
-
-	/**
-	* "binding" tag attribute name
-	*/
-	public static final String ATTR_BINDING = "binding"; //$NON-NLS-1$
-
-	/**
-	* "disclosureListener" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSURELISTENER = "disclosureListener"; //$NON-NLS-1$
-
-	/**
-	* "separatorClass" tag attribute name
-	*/
-	public static final String ATTR_SEPARATORCLASS = "separatorClass"; //$NON-NLS-1$
-
-	/**
-	* "showRequired" tag attribute name
-	*/
-	public static final String ATTR_SHOWREQUIRED = "showRequired"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailInvalidDaysOfWeek" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILINVALIDDAYSOFWEEK = "messageDetailInvalidDaysOfWeek"; //$NON-NLS-1$
-
-	/**
-	* "minimum" tag attribute name
-	*/
-	public static final String ATTR_MINIMUM = "minimum"; //$NON-NLS-1$
-
-	/**
-	* "simple" tag attribute name
-	*/
-	public static final String ATTR_SIMPLE = "simple"; //$NON-NLS-1$
-
-	/**
-	* "sortable" tag attribute name
-	*/
-	public static final String ATTR_SORTABLE = "sortable"; //$NON-NLS-1$
-
-	/**
-	* "discloseMany" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSEMANY = "discloseMany"; //$NON-NLS-1$
-
-	/**
-	* "maximumLength" tag attribute name
-	*/
-	public static final String ATTR_MAXIMUMLENGTH = "maximumLength"; //$NON-NLS-1$
-
-	/**
-	* "visited" tag attribute name
-	*/
-	public static final String ATTR_VISITED = "visited"; //$NON-NLS-1$
-
-	/**
-	* "truncateAt" tag attribute name
-	*/
-	public static final String ATTR_TRUNCATEAT = "truncateAt"; //$NON-NLS-1$
-
-	/**
-	* "auxiliary1Size" tag attribute name
-	*/
-	public static final String ATTR_AUXILIARY1SIZE = "auxiliary1Size"; //$NON-NLS-1$
-
-	/**
-	* "converter" tag attribute name
-	*/
-	public static final String ATTR_CONVERTER = "converter"; //$NON-NLS-1$
-
-	/**
-	* "reorderOnly" tag attribute name
-	*/
-	public static final String ATTR_REORDERONLY = "reorderOnly"; //$NON-NLS-1$
-
-	/**
-	* "maxValue" tag attribute name
-	*/
-	public static final String ATTR_MAXVALUE = "maxValue"; //$NON-NLS-1$
-
-	/**
-	* "rowSelection" tag attribute name
-	*/
-	public static final String ATTR_ROWSELECTION = "rowSelection"; //$NON-NLS-1$
-
-	/**
-	* "tooltipsVisible" tag attribute name
-	*/
-	public static final String ATTR_TOOLTIPSVISIBLE = "tooltipsVisible"; //$NON-NLS-1$
-
-	/**
-	* "sortProperty" tag attribute name
-	*/
-	public static final String ATTR_SORTPROPERTY = "sortProperty"; //$NON-NLS-1$
-
-	/**
-	* "YMajorGridLineCount" tag attribute name
-	*/
-	public static final String ATTR_YMAJORGRIDLINECOUNT = "YMajorGridLineCount"; //$NON-NLS-1$
-
-	/**
-	* "yoffset" tag attribute name
-	*/
-	public static final String ATTR_YOFFSET = "yoffset"; //$NON-NLS-1$
-
-	/**
-	* "shortDesc" tag attribute name
-	*/
-	public static final String ATTR_SHORTDESC = "shortDesc"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertNumber" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTNUMBER = "messageDetailConvertNumber"; //$NON-NLS-1$
-
-	/**
-	* "listStyle" tag attribute name
-	*/
-	public static final String ATTR_LISTSTYLE = "listStyle"; //$NON-NLS-1$
-
-	/**
-	* "readOnly" tag attribute name
-	*/
-	public static final String ATTR_READONLY = "readOnly"; //$NON-NLS-1$
-
-	/**
-	* "pattern" tag attribute name
-	*/
-	public static final String ATTR_PATTERN = "pattern"; //$NON-NLS-1$
-
-	/**
-	* "background" tag attribute name
-	*/
-	public static final String ATTR_BACKGROUND = "background"; //$NON-NLS-1$
-
-	/**
-	* "animationDuration" tag attribute name
-	*/
-	public static final String ATTR_ANIMATIONDURATION = "animationDuration"; //$NON-NLS-1$
-
-	/**
-	* "labelAndAccessKey" tag attribute name
-	*/
-	public static final String ATTR_LABELANDACCESSKEY = "labelAndAccessKey"; //$NON-NLS-1$
-
-	/**
-	* "titleClass" tag attribute name
-	*/
-	public static final String ATTR_TITLECLASS = "titleClass"; //$NON-NLS-1$
-
-	/**
-	* "minFractionDigits" tag attribute name
-	*/
-	public static final String ATTR_MINFRACTIONDIGITS = "minFractionDigits"; //$NON-NLS-1$
-
-	/**
-	* "to" tag attribute name
-	*/
-	public static final String ATTR_TO = "to"; //$NON-NLS-1$
-
-	/**
-	* "player" tag attribute name
-	*/
-	public static final String ATTR_PLAYER = "player"; //$NON-NLS-1$
-
-	/**
-	* "globalOnly" tag attribute name
-	*/
-	public static final String ATTR_GLOBALONLY = "globalOnly"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailInvalidMonths" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILINVALIDMONTHS = "messageDetailInvalidMonths"; //$NON-NLS-1$
-
-	/**
-	* "secondaryPattern" tag attribute name
-	*/
-	public static final String ATTR_SECONDARYPATTERN = "secondaryPattern"; //$NON-NLS-1$
-
-	/**
-	* "previousAction" tag attribute name
-	*/
-	public static final String ATTR_PREVIOUSACTION = "previousAction"; //$NON-NLS-1$
-
-	/**
-	* "columnBandingInterval" tag attribute name
-	*/
-	public static final String ATTR_COLUMNBANDINGINTERVAL = "columnBandingInterval"; //$NON-NLS-1$
-
-	/**
-	* "noWrap" tag attribute name
-	*/
-	public static final String ATTR_NOWRAP = "noWrap"; //$NON-NLS-1$
-
-	/**
-	* "startLevel" tag attribute name
-	*/
-	public static final String ATTR_STARTLEVEL = "startLevel"; //$NON-NLS-1$
-
-	/**
-	* "valueChangeListener" tag attribute name
-	*/
-	public static final String ATTR_VALUECHANGELISTENER = "valueChangeListener"; //$NON-NLS-1$
-
-	/**
-	* "compact" tag attribute name
-	*/
-	public static final String ATTR_COMPACT = "compact"; //$NON-NLS-1$
-
-	/**
-	* "autoSubmit" tag attribute name
-	*/
-	public static final String ATTR_AUTOSUBMIT = "autoSubmit"; //$NON-NLS-1$
-
-	/**
-	* "height" tag attribute name
-	*/
-	public static final String ATTR_HEIGHT = "height"; //$NON-NLS-1$
-
-	/**
-	* "horizontalGridVisible" tag attribute name
-	*/
-	public static final String ATTR_HORIZONTALGRIDVISIBLE = "horizontalGridVisible"; //$NON-NLS-1$
-
-	/**
-	* "YMinorGridLineCount" tag attribute name
-	*/
-	public static final String ATTR_YMINORGRIDLINECOUNT = "YMinorGridLineCount"; //$NON-NLS-1$
-
-	/**
-	* "description" tag attribute name
-	*/
-	public static final String ATTR_DESCRIPTION = "description"; //$NON-NLS-1$
-
-	/**
-	* "onblur" tag attribute name
-	*/
-	public static final String ATTR_ONBLUR = "onblur"; //$NON-NLS-1$
-
-	/**
-	* "longDesc" tag attribute name
-	*/
-	public static final String ATTR_LONGDESC = "longDesc"; //$NON-NLS-1$
-
-	/**
-	* "perspective" tag attribute name
-	*/
-	public static final String ATTR_PERSPECTIVE = "perspective"; //$NON-NLS-1$
-
-	/**
-	* "trailingHeader" tag attribute name
-	*/
-	public static final String ATTR_TRAILINGHEADER = "trailingHeader"; //$NON-NLS-1$
-
-	/**
-	* "text" tag attribute name
-	*/
-	public static final String ATTR_TEXT = "text"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvert" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERT = "messageDetailConvert"; //$NON-NLS-1$
-
-	/**
-	* "onmouseout" tag attribute name
-	*/
-	public static final String ATTR_ONMOUSEOUT = "onmouseout"; //$NON-NLS-1$
-
-	/**
-	* "partialSubmit" tag attribute name
-	*/
-	public static final String ATTR_PARTIALSUBMIT = "partialSubmit"; //$NON-NLS-1$
-
-	/**
-	* "align" tag attribute name
-	*/
-	public static final String ATTR_ALIGN = "align"; //$NON-NLS-1$
-
-	/**
-	* "width" tag attribute name
-	*/
-	public static final String ATTR_WIDTH = "width"; //$NON-NLS-1$
-
-	/**
-	* "onkeyup" tag attribute name
-	*/
-	public static final String ATTR_ONKEYUP = "onkeyup"; //$NON-NLS-1$
-
-	/**
-	* "onfocus" tag attribute name
-	*/
-	public static final String ATTR_ONFOCUS = "onfocus"; //$NON-NLS-1$
-
-	/**
-	* "label" tag attribute name
-	*/
-	public static final String ATTR_LABEL = "label"; //$NON-NLS-1$
-
-	/**
-	* "componentType" tag attribute name
-	*/
-	public static final String ATTR_COMPONENTTYPE = "componentType"; //$NON-NLS-1$
-
-	/**
-	* "autostart" tag attribute name
-	*/
-	public static final String ATTR_AUTOSTART = "autostart"; //$NON-NLS-1$
-
-	/**
-	* "discloseNone" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSENONE = "discloseNone"; //$NON-NLS-1$
-
-	/**
-	* "size" tag attribute name
-	*/
-	public static final String ATTR_SIZE = "size"; //$NON-NLS-1$
-
-	/**
-	* "standbyText" tag attribute name
-	*/
-	public static final String ATTR_STANDBYTEXT = "standbyText"; //$NON-NLS-1$
-
-	/**
-	* "onselect" tag attribute name
-	*/
-	public static final String ATTR_ONSELECT = "onselect"; //$NON-NLS-1$
-
-	/**
-	* "items" tag attribute name
-	*/
-	public static final String ATTR_ITEMS = "items"; //$NON-NLS-1$
-
-	/**
-	* "names" tag attribute name
-	*/
-	public static final String ATTR_NAMES = "names"; //$NON-NLS-1$
-
-	/**
-	* "maximum" tag attribute name
-	*/
-	public static final String ATTR_MAXIMUM = "maximum"; //$NON-NLS-1$
-
-	/**
-	* "disclosed" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSED = "disclosed"; //$NON-NLS-1$
-
-	/**
-	* "rowsByDepth" tag attribute name
-	*/
-	public static final String ATTR_ROWSBYDEPTH = "rowsByDepth"; //$NON-NLS-1$
-
-	/**
-	* "maxStep" tag attribute name
-	*/
-	public static final String ATTR_MAXSTEP = "maxStep"; //$NON-NLS-1$
-
-	/**
-	* "var" tag attribute name
-	*/
-	public static final String ATTR_VAR = "var"; //$NON-NLS-1$
-
-	/**
-	* "focusRowKey" tag attribute name
-	*/
-	public static final String ATTR_FOCUSROWKEY = "focusRowKey"; //$NON-NLS-1$
-
-	/**
-	* "unselectedLabel" tag attribute name
-	*/
-	public static final String ATTR_UNSELECTEDLABEL = "unselectedLabel"; //$NON-NLS-1$
-
-	/**
-	* "searchDesc" tag attribute name
-	*/
-	public static final String ATTR_SEARCHDESC = "searchDesc"; //$NON-NLS-1$
-
-	/**
-	* "pollListener" tag attribute name
-	*/
-	public static final String ATTR_POLLLISTENER = "pollListener"; //$NON-NLS-1$
-
-	/**
-	* "name" tag attribute name
-	*/
-	public static final String ATTR_NAME = "name"; //$NON-NLS-1$
-
-	/**
-	* "valueAndAccessKey" tag attribute name
-	*/
-	public static final String ATTR_VALUEANDACCESSKEY = "valueAndAccessKey"; //$NON-NLS-1$
-
-	/**
-	* "XMajorGridLineCount" tag attribute name
-	*/
-	public static final String ATTR_XMAJORGRIDLINECOUNT = "XMajorGridLineCount"; //$NON-NLS-1$
-
-	/**
-	* "nextActionListener" tag attribute name
-	*/
-	public static final String ATTR_NEXTACTIONLISTENER = "nextActionListener"; //$NON-NLS-1$
-
-	/**
-	* "maxIntegerDigits" tag attribute name
-	*/
-	public static final String ATTR_MAXINTEGERDIGITS = "maxIntegerDigits"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertTime" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTTIME = "messageDetailConvertTime"; //$NON-NLS-1$
-
-	/**
-	* "icon" tag attribute name
-	*/
-	public static final String ATTR_ICON = "icon"; //$NON-NLS-1$
-
-	/**
-	* "undisclosedText" tag attribute name
-	*/
-	public static final String ATTR_UNDISCLOSEDTEXT = "undisclosedText"; //$NON-NLS-1$
-
-	/**
-	* "disclosedText" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSEDTEXT = "disclosedText"; //$NON-NLS-1$
-
-	/**
-	* "onmouseover" tag attribute name
-	*/
-	public static final String ATTR_ONMOUSEOVER = "onmouseover"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertPattern" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTPATTERN = "messageDetailConvertPattern"; //$NON-NLS-1$
-
-	/**
-	* "message" tag attribute name
-	*/
-	public static final String ATTR_MESSAGE = "message"; //$NON-NLS-1$
-
-	/**
-	* "immediate" tag attribute name
-	*/
-	public static final String ATTR_IMMEDIATE = "immediate"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailNoMatch" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILNOMATCH = "messageDetailNoMatch"; //$NON-NLS-1$
-
-	/**
-	* "source" tag attribute name
-	*/
-	public static final String ATTR_SOURCE = "source"; //$NON-NLS-1$
-
-	/**
-	* "usesUpload" tag attribute name
-	*/
-	public static final String ATTR_USESUPLOAD = "usesUpload"; //$NON-NLS-1$
-
-	/**
-	* "onclick" tag attribute name
-	*/
-	public static final String ATTR_ONCLICK = "onclick"; //$NON-NLS-1$
-
-	/**
-	* "valign" tag attribute name
-	*/
-	public static final String ATTR_VALIGN = "valign"; //$NON-NLS-1$
-
-	/**
-	* "disabled" tag attribute name
-	*/
-	public static final String ATTR_DISABLED = "disabled"; //$NON-NLS-1$
-
-	/**
-	* "nextAction" tag attribute name
-	*/
-	public static final String ATTR_NEXTACTION = "nextAction"; //$NON-NLS-1$
-
-	/**
-	* "facetName" tag attribute name
-	*/
-	public static final String ATTR_FACETNAME = "facetName"; //$NON-NLS-1$
-
-	/**
-	* "for" tag attribute name
-	*/
-	public static final String ATTR_FOR = "for"; //$NON-NLS-1$
-
-	/**
-	* "defaultFacet" tag attribute name
-	*/
-	public static final String ATTR_DEFAULTFACET = "defaultFacet"; //$NON-NLS-1$
-
-	/**
-	* "defaultCommand" tag attribute name
-	*/
-	public static final String ATTR_DEFAULTCOMMAND = "defaultCommand"; //$NON-NLS-1$
-
-	/**
-	* "minValue" tag attribute name
-	*/
-	public static final String ATTR_MINVALUE = "minValue"; //$NON-NLS-1$
-
-	/**
-	* "labelStyle" tag attribute name
-	*/
-	public static final String ATTR_LABELSTYLE = "labelStyle"; //$NON-NLS-1$
-
-	/**
-	* "textAndAccessKey" tag attribute name
-	*/
-	public static final String ATTR_TEXTANDACCESSKEY = "textAndAccessKey"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertPercent" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTPERCENT = "messageDetailConvertPercent"; //$NON-NLS-1$
-
-	/**
-	* "valuePassThru" tag attribute name
-	*/
-	public static final String ATTR_VALUEPASSTHRU = "valuePassThru"; //$NON-NLS-1$
-
-	/**
-	* "imageMapType" tag attribute name
-	*/
-	public static final String ATTR_IMAGEMAPTYPE = "imageMapType"; //$NON-NLS-1$
-
-	/**
-	* "chartDrillDownListener" tag attribute name
-	*/
-	public static final String ATTR_CHARTDRILLDOWNLISTENER = "chartDrillDownListener"; //$NON-NLS-1$
-
-	/**
-	* "fieldWidth" tag attribute name
-	*/
-	public static final String ATTR_FIELDWIDTH = "fieldWidth"; //$NON-NLS-1$
-
-	/**
-	* "auxiliaryGlobalSize" tag attribute name
-	*/
-	public static final String ATTR_AUXILIARYGLOBALSIZE = "auxiliaryGlobalSize"; //$NON-NLS-1$
-
-	/**
-	* "triggerType" tag attribute name
-	*/
-	public static final String ATTR_TRIGGERTYPE = "triggerType"; //$NON-NLS-1$
-
-	/**
-	* "orientation" tag attribute name
-	*/
-	public static final String ATTR_ORIENTATION = "orientation"; //$NON-NLS-1$
-
-	/**
-	* "inlineStyle" tag attribute name
-	*/
-	public static final String ATTR_INLINESTYLE = "inlineStyle"; //$NON-NLS-1$
-
-	/**
-	* "timeStyle" tag attribute name
-	*/
-	public static final String ATTR_TIMESTYLE = "timeStyle"; //$NON-NLS-1$
-
-	/**
-	* "flex" tag attribute name
-	*/
-	public static final String ATTR_FLEX = "flex"; //$NON-NLS-1$
-
-	/**
-	* "destination" tag attribute name
-	*/
-	public static final String ATTR_DESTINATION = "destination"; //$NON-NLS-1$
-
-	/**
-	* "innerWidth" tag attribute name
-	*/
-	public static final String ATTR_INNERWIDTH = "innerWidth"; //$NON-NLS-1$
-
-	/**
-	* "useWindow" tag attribute name
-	*/
-	public static final String ATTR_USEWINDOW = "useWindow"; //$NON-NLS-1$
-
-	/**
-	* "verticalGridVisible" tag attribute name
-	*/
-	public static final String ATTR_VERTICALGRIDVISIBLE = "verticalGridVisible"; //$NON-NLS-1$
-
-	/**
-	* "onmousedown" tag attribute name
-	*/
-	public static final String ATTR_ONMOUSEDOWN = "onmousedown"; //$NON-NLS-1$
-
-	/**
-	* "invalidDaysOfWeek" tag attribute name
-	*/
-	public static final String ATTR_INVALIDDAYSOFWEEK = "invalidDaysOfWeek"; //$NON-NLS-1$
-
-	/**
-	* "headerNoWrap" tag attribute name
-	*/
-	public static final String ATTR_HEADERNOWRAP = "headerNoWrap"; //$NON-NLS-1$
-
-	/**
-	* "invalidMonths" tag attribute name
-	*/
-	public static final String ATTR_INVALIDMONTHS = "invalidMonths"; //$NON-NLS-1$
-
-	/**
-	* "headerText" tag attribute name
-	*/
-	public static final String ATTR_HEADERTEXT = "headerText"; //$NON-NLS-1$
-
-	/**
-	* "actionListener" tag attribute name
-	*/
-	public static final String ATTR_ACTIONLISTENER = "actionListener"; //$NON-NLS-1$
-
-	/**
-	* "attributeChangeListener" tag attribute name
-	*/
-	public static final String ATTR_ATTRIBUTECHANGELISTENER = "attributeChangeListener"; //$NON-NLS-1$
-
-	/**
-	* "position" tag attribute name
-	*/
-	public static final String ATTR_POSITION = "position"; //$NON-NLS-1$
-
-	/**
-	* "previousActionListener" tag attribute name
-	*/
-	public static final String ATTR_PREVIOUSACTIONLISTENER = "previousActionListener"; //$NON-NLS-1$
-
-	/**
-	* "interval" tag attribute name
-	*/
-	public static final String ATTR_INTERVAL = "interval"; //$NON-NLS-1$
-
-	/**
-	* "allDetailsEnabled" tag attribute name
-	*/
-	public static final String ATTR_ALLDETAILSENABLED = "allDetailsEnabled"; //$NON-NLS-1$
-
-	/**
-	* "validator" tag attribute name
-	*/
-	public static final String ATTR_VALIDATOR = "validator"; //$NON-NLS-1$
-
-	/**
-	* "onunload" tag attribute name
-	*/
-	public static final String ATTR_ONUNLOAD = "onunload"; //$NON-NLS-1$
-
-	/**
-	* "maxFractionDigits" tag attribute name
-	*/
-	public static final String ATTR_MAXFRACTIONDIGITS = "maxFractionDigits"; //$NON-NLS-1$
-
-	/**
-	* "leadingDescShown" tag attribute name
-	*/
-	public static final String ATTR_LEADINGDESCSHOWN = "leadingDescShown"; //$NON-NLS-1$
-
-	/**
-	* "emptyText" tag attribute name
-	*/
-	public static final String ATTR_EMPTYTEXT = "emptyText"; //$NON-NLS-1$
-
-	/**
-	* "trailingDescShown" tag attribute name
-	*/
-	public static final String ATTR_TRAILINGDESCSHOWN = "trailingDescShown"; //$NON-NLS-1$
-
-	/**
-	* "escape" tag attribute name
-	*/
-	public static final String ATTR_ESCAPE = "escape"; //$NON-NLS-1$
-
-	/**
-	* "mode" tag attribute name
-	*/
-	public static final String ATTR_MODE = "mode"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailInvalidDays" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILINVALIDDAYS = "messageDetailInvalidDays"; //$NON-NLS-1$
-
-	/**
-	* "title" tag attribute name
-	*/
-	public static final String ATTR_TITLE = "title"; //$NON-NLS-1$
-
-	/**
-	* "captionText" tag attribute name
-	*/
-	public static final String ATTR_CAPTIONTEXT = "captionText"; //$NON-NLS-1$
-
-	/**
-	* "stepSize" tag attribute name
-	*/
-	public static final String ATTR_STEPSIZE = "stepSize"; //$NON-NLS-1$
-
-	/**
-	* "encoding" tag attribute name
-	*/
-	public static final String ATTR_ENCODING = "encoding"; //$NON-NLS-1$
-
-	/**
-	* "modal" tag attribute name
-	*/
-	public static final String ATTR_MODAL = "modal"; //$NON-NLS-1$
-
-	/**
-	* "end" tag attribute name
-	*/
-	public static final String ATTR_END = "end"; //$NON-NLS-1$
-
-	/**
-	* "onkeypress" tag attribute name
-	*/
-	public static final String ATTR_ONKEYPRESS = "onkeypress"; //$NON-NLS-1$
-
-	/**
-	* "onkeydown" tag attribute name
-	*/
-	public static final String ATTR_ONKEYDOWN = "onkeydown"; //$NON-NLS-1$
-
-	/**
-	* "innerHeight" tag attribute name
-	*/
-	public static final String ATTR_INNERHEIGHT = "innerHeight"; //$NON-NLS-1$
-
-	/**
-	* "messageType" tag attribute name
-	*/
-	public static final String ATTR_MESSAGETYPE = "messageType"; //$NON-NLS-1$
-
-	/**
-	* "onsubmit" tag attribute name
-	*/
-	public static final String ATTR_ONSUBMIT = "onsubmit"; //$NON-NLS-1$
-
-	/**
-	* "selectedStep" tag attribute name
-	*/
-	public static final String ATTR_SELECTEDSTEP = "selectedStep"; //$NON-NLS-1$
-
-	/**
-	* "rowBandingInterval" tag attribute name
-	*/
-	public static final String ATTR_ROWBANDINGINTERVAL = "rowBandingInterval"; //$NON-NLS-1$
-
-	/**
-	* "varStatus" tag attribute name
-	*/
-	public static final String ATTR_VARSTATUS = "varStatus"; //$NON-NLS-1$
-
-	/**
-	* "xoffset" tag attribute name
-	*/
-	public static final String ATTR_XOFFSET = "xoffset"; //$NON-NLS-1$
-
-	/**
-	* "currencySymbol" tag attribute name
-	*/
-	public static final String ATTR_CURRENCYSYMBOL = "currencySymbol"; //$NON-NLS-1$
-
-	/**
-	* "selectedRowKeys" tag attribute name
-	*/
-	public static final String ATTR_SELECTEDROWKEYS = "selectedRowKeys"; //$NON-NLS-1$
-
-	/**
-	* "method" tag attribute name
-	*/
-	public static final String ATTR_METHOD = "method"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailExact" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILEXACT = "messageDetailExact"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailNotInRange" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILNOTINRANGE = "messageDetailNotInRange"; //$NON-NLS-1$
-
-	/**
-	* "launchListener" tag attribute name
-	*/
-	public static final String ATTR_LAUNCHLISTENER = "launchListener"; //$NON-NLS-1$
-
-	/**
-	* "templateSource" tag attribute name
-	*/
-	public static final String ATTR_TEMPLATESOURCE = "templateSource"; //$NON-NLS-1$
-
-	/**
-	* "maxPrecision" tag attribute name
-	*/
-	public static final String ATTR_MAXPRECISION = "maxPrecision"; //$NON-NLS-1$
-
-	/**
-	* "targetFrame" tag attribute name
-	*/
-	public static final String ATTR_TARGETFRAME = "targetFrame"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailConvertDate" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILCONVERTDATE = "messageDetailConvertDate"; //$NON-NLS-1$
-
-	/**
-	* "focusListener" tag attribute name
-	*/
-	public static final String ATTR_FOCUSLISTENER = "focusListener"; //$NON-NLS-1$
-
-	/**
-	* "contentType" tag attribute name
-	*/
-	public static final String ATTR_CONTENTTYPE = "contentType"; //$NON-NLS-1$
-
-	/**
-	* "type" tag attribute name
-	*/
-	public static final String ATTR_TYPE = "type"; //$NON-NLS-1$
-
-	/**
-	* "initiallyExpanded" tag attribute name
-	*/
-	public static final String ATTR_INITIALLYEXPANDED = "initiallyExpanded"; //$NON-NLS-1$
-
-	/**
-	* "selectionListener" tag attribute name
-	*/
-	public static final String ATTR_SELECTIONLISTENER = "selectionListener"; //$NON-NLS-1$
-
-	/**
-	* "level" tag attribute name
-	*/
-	public static final String ATTR_LEVEL = "level"; //$NON-NLS-1$
-
-	/**
-	* "action" tag attribute name
-	*/
-	public static final String ATTR_ACTION = "action"; //$NON-NLS-1$
-
-	/**
-	* "value" tag attribute name
-	*/
-	public static final String ATTR_VALUE = "value"; //$NON-NLS-1$
-
-	/**
-	* "auxiliary2Size" tag attribute name
-	*/
-	public static final String ATTR_AUXILIARY2SIZE = "auxiliary2Size"; //$NON-NLS-1$
-
-	/**
-	* "required" tag attribute name
-	*/
-	public static final String ATTR_REQUIRED = "required"; //$NON-NLS-1$
-
-	/**
-	* "integerOnly" tag attribute name
-	*/
-	public static final String ATTR_INTEGERONLY = "integerOnly"; //$NON-NLS-1$
-
-	/**
-	* "wrap" tag attribute name
-	*/
-	public static final String ATTR_WRAP = "wrap"; //$NON-NLS-1$
-
-	/**
-	* "chooseId" tag attribute name
-	*/
-	public static final String ATTR_CHOOSEID = "chooseId"; //$NON-NLS-1$
-
-	/**
-	* "requiredMessageDetail" tag attribute name
-	*/
-	public static final String ATTR_REQUIREDMESSAGEDETAIL = "requiredMessageDetail"; //$NON-NLS-1$
-
-	/**
-	* "styleClass" tag attribute name
-	*/
-	public static final String ATTR_STYLECLASS = "styleClass"; //$NON-NLS-1$
-
-	/**
-	* "customColorData" tag attribute name
-	*/
-	public static final String ATTR_CUSTOMCOLORDATA = "customColorData"; //$NON-NLS-1$
-
-	/**
-	* "rows" tag attribute name
-	*/
-	public static final String ATTR_ROWS = "rows"; //$NON-NLS-1$
-
-	/**
-	* "groupingUsed" tag attribute name
-	*/
-	public static final String ATTR_GROUPINGUSED = "groupingUsed"; //$NON-NLS-1$
-
-	/**
-	* "playCount" tag attribute name
-	*/
-	public static final String ATTR_PLAYCOUNT = "playCount"; //$NON-NLS-1$
-
-	/**
-	* "default" tag attribute name
-	*/
-	public static final String ATTR_DEFAULT = "default"; //$NON-NLS-1$
-
-	/**
-	* "contentStyle" tag attribute name
-	*/
-	public static final String ATTR_CONTENTSTYLE = "contentStyle"; //$NON-NLS-1$
-
-	/**
-	* "maxColumns" tag attribute name
-	*/
-	public static final String ATTR_MAXCOLUMNS = "maxColumns"; //$NON-NLS-1$
-
-	/**
-	* "alignment" tag attribute name
-	*/
-	public static final String ATTR_ALIGNMENT = "alignment"; //$NON-NLS-1$
-
-	/**
-	* "leadingHeader" tag attribute name
-	*/
-	public static final String ATTR_LEADINGHEADER = "leadingHeader"; //$NON-NLS-1$
-
-	/**
-	* "locale" tag attribute name
-	*/
-	public static final String ATTR_LOCALE = "locale"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailMaximum" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILMAXIMUM = "messageDetailMaximum"; //$NON-NLS-1$
-
-	/**
-	* "windowHeight" tag attribute name
-	*/
-	public static final String ATTR_WINDOWHEIGHT = "windowHeight"; //$NON-NLS-1$
-
-	/**
-	* "timeZone" tag attribute name
-	*/
-	public static final String ATTR_TIMEZONE = "timeZone"; //$NON-NLS-1$
-
-	/**
-	* "from" tag attribute name
-	*/
-	public static final String ATTR_FROM = "from"; //$NON-NLS-1$
-
-	/**
-	* "messageDetailMinimum" tag attribute name
-	*/
-	public static final String ATTR_MESSAGEDETAILMINIMUM = "messageDetailMinimum"; //$NON-NLS-1$
-
-	/**
-	* "id" tag attribute name
-	*/
-	public static final String ATTR_ID = "id"; //$NON-NLS-1$
-
-	/**
-	* "returnListener" tag attribute name
-	*/
-	public static final String ATTR_RETURNLISTENER = "returnListener"; //$NON-NLS-1$
-
-	/**
-	* "controls" tag attribute name
-	*/
-	public static final String ATTR_CONTROLS = "controls"; //$NON-NLS-1$
-
-	/**
-	* "disclosedTransient" tag attribute name
-	*/
-	public static final String ATTR_DISCLOSEDTRANSIENT = "disclosedTransient"; //$NON-NLS-1$
-
-	/**
-	* "selected" tag attribute name
-	*/
-	public static final String ATTR_SELECTED = "selected"; //$NON-NLS-1$
-
-	/**
-	* "dateStyle" tag attribute name
-	*/
-	public static final String ATTR_DATESTYLE = "dateStyle"; //$NON-NLS-1$
-
-	/**
-	* "minIntegerDigits" tag attribute name
-	*/
-	public static final String ATTR_MININTEGERDIGITS = "minIntegerDigits"; //$NON-NLS-1$
-
-	/**
-	* "onmouseup" tag attribute name
-	*/
-	public static final String ATTR_ONMOUSEUP = "onmouseup"; //$NON-NLS-1$
-
-	/**
-	* "layout" tag attribute name
-	*/
-	public static final String ATTR_LAYOUT = "layout"; //$NON-NLS-1$
-
-	/**
-	* "expandAllEnabled" tag attribute name
-	*/
-	public static final String ATTR_EXPANDALLENABLED = "expandAllEnabled"; //$NON-NLS-1$
-
-	/**
-	* "onmousemove" tag attribute name
-	*/
-	public static final String ATTR_ONMOUSEMOVE = "onmousemove"; //$NON-NLS-1$
-
-	/**
-	* "halign" tag attribute name
-	*/
-	public static final String ATTR_HALIGN = "halign"; //$NON-NLS-1$
-
-	/**
-	* "labelWidth" tag attribute name
-	*/
-	public static final String ATTR_LABELWIDTH = "labelWidth"; //$NON-NLS-1$
-
-	/**
-	* "currencyCode" tag attribute name
-	*/
-	public static final String ATTR_CURRENCYCODE = "currencyCode"; //$NON-NLS-1$
-
-	/**
-	* "partialTriggers" tag attribute name
-	*/
-	public static final String ATTR_PARTIALTRIGGERS = "partialTriggers"; //$NON-NLS-1$
-
-	/**
-	* "separateRows" tag attribute name
-	*/
-	public static final String ATTR_SEPARATEROWS = "separateRows"; //$NON-NLS-1$
-
-	/**
-	* "hint" tag attribute name
-	*/
-	public static final String ATTR_HINT = "hint"; //$NON-NLS-1$
-
-	/**
-	* "onchange" tag attribute name
-	*/
-	public static final String ATTR_ONCHANGE = "onchange"; //$NON-NLS-1$
-
-	/**
-	* "begin" tag attribute name
-	*/
-	public static final String ATTR_BEGIN = "begin"; //$NON-NLS-1$
-
-	/**
-	* "longDescURL" tag attribute name
-	*/
-	public static final String ATTR_LONGDESCURL = "longDescURL"; //$NON-NLS-1$
-
-	/**
-	* "onload" tag attribute name
-	*/
-	public static final String ATTR_ONLOAD = "onload"; //$NON-NLS-1$
-
-	/**
-	* "sortListener" tag attribute name
-	*/
-	public static final String ATTR_SORTLISTENER = "sortListener"; //$NON-NLS-1$
-
-	/**
-	* "filename" tag attribute name
-	*/
-	public static final String ATTR_FILENAME = "filename"; //$NON-NLS-1$
-
-	/**
-	* "secret" tag attribute name
-	*/
-	public static final String ATTR_SECRET = "secret"; //$NON-NLS-1$
-
-	/**
-	* "group" tag attribute name
-	*/
-	public static final String ATTR_GROUP = "group"; //$NON-NLS-1$
-
-	/**
-	* "first" tag attribute name
-	*/
-	public static final String ATTR_FIRST = "first"; //$NON-NLS-1$
-
-	/**
-	* "step" tag attribute name
-	*/
-	public static final String ATTR_STEP = "step"; //$NON-NLS-1$
-
-	/**
-	* "headers" tag attribute name
-	*/
-	public static final String ATTR_HEADERS = "headers"; //$NON-NLS-1$
-
-	/**
-	* "generatesContent" tag attribute name
-	*/
-	public static final String ATTR_GENERATESCONTENT = "generatesContent"; //$NON-NLS-1$
-
-	/**
-	* "marginHeight" tag attribute name
-	*/
-	public static final String ATTR_MARGINHEIGHT = "marginHeight"; //$NON-NLS-1$
-
-	/**
-	* "cellPadding" tag attribute name
-	*/
-	public static final String ATTR_CELLPADDING = "cellPadding"; //$NON-NLS-1$
-
-	/**
-	* "wrappingDisabled" tag attribute name
-	*/
-	public static final String ATTR_WRAPPINGDISABLED = "wrappingDisabled"; //$NON-NLS-1$
-
-	/**
-	* "rowSpan" tag attribute name
-	*/
-	public static final String ATTR_ROWSPAN = "rowSpan"; //$NON-NLS-1$
-
-	/**
-	* "columnSpan" tag attribute name
-	*/
-	public static final String ATTR_COLUMNSPAN = "columnSpan"; //$NON-NLS-1$
-
-	/**
-	* "frameSpacing" tag attribute name
-	*/
-	public static final String ATTR_FRAMESPACING = "frameSpacing"; //$NON-NLS-1$
-
-	/**
-	* "cellSpacing" tag attribute name
-	*/
-	public static final String ATTR_CELLSPACING = "cellSpacing"; //$NON-NLS-1$
-
-	/**
-	* "header" tag attribute name
-	*/
-	public static final String ATTR_HEADER = "header"; //$NON-NLS-1$
-
-	/**
-	* "scrolling" tag attribute name
-	*/
-	public static final String ATTR_SCROLLING = "scrolling"; //$NON-NLS-1$
-
-	/**
-	* "borderWidth" tag attribute name
-	*/
-	public static final String ATTR_BORDERWIDTH = "borderWidth"; //$NON-NLS-1$
-
-	/**
-	* "frameBorderWidth" tag attribute name
-	*/
-	public static final String ATTR_FRAMEBORDERWIDTH = "frameBorderWidth"; //$NON-NLS-1$
-
-	/**
-	* "shortText" tag attribute name
-	*/
-	public static final String ATTR_SHORTTEXT = "shortText"; //$NON-NLS-1$
-
-	/**
-	* "marginWidth" tag attribute name
-	*/
-	public static final String ATTR_MARGINWIDTH = "marginWidth"; //$NON-NLS-1$
-
-	/**
-	* "firstClickPassed" tag attribute name
-	*/
-	public static final String ATTR_FIRSTCLICKPASSED = "firstClickPassed"; //$NON-NLS-1$
-
-	/**
-	 * Value for "style" attribute on elements used to indicate an empty source
-	 * element.
-	 */
-	public static final String STYLE_EMPTYELEMENT = "color:silver;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/Messages.java
deleted file mode 100644
index 75e5d75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/Messages.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Ian Trimble - Oracle
- */
-public class Messages extends NLS {
-
-	private static final String BUNDLE_NAME =
-		"org.eclipse.jst.jsf.apache.trinidad.tagsupport.messages"; //$NON-NLS-1$
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String BreadCrumbsOperation_EmptyBreadCrumbsTag;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String NavigationPaneOperation_EmptyNavigationPaneTag;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String PanelTabbedOperation_EmptyPanelTabbedTag;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String ShowDetailItemOperation_EmptyShowDetailItemTag;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem1Label;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem1Value;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem2Label;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem2Value;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem3Label;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectItemModel_SampleItem3Value;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_Description;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkMove;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkMoveAll;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkRemove;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkRemoveAll;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkTop;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkUp;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkDown;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String SelectShuttleOperation_LinkBottom;
-
-	/**
-	 * See messages.properties.
-	 */
-	public static String TrinidadDTResourceProvider_StyleSheetNotLocated;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadTagSupportActivator.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadTagSupportActivator.java
deleted file mode 100644
index 35aa533..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadTagSupportActivator.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.dtresourceprovider.TrinidadDTResourceProvider;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class TrinidadTagSupportActivator extends AbstractUIPlugin {
-
-	/**
-	 * the plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.apache.trinidad.tagsupport"; //$NON-NLS-1$
-
-	// The shared instance
-	private static TrinidadTagSupportActivator plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public TrinidadTagSupportActivator() {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-		TrinidadDTResourceProvider.init();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static TrinidadTagSupportActivator getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Writes an informational message to this plug-in's log.
-	 * 
-	 * @param message Informational message to be written.
-	 */
-	public static void logInfo(String message) {
-		ILog log = getDefault().getLog();
-		log.log(new Status(IStatus.INFO, PLUGIN_ID, message));
-	}
-
-	/**
-	 * Writes an error message to this plug-in's log.
-	 * 
-	 * @param message Error message to be written.
-	 * @param ex Throwable instance.
-	 */
-	public static void logError(String message, Throwable ex) {
-		ILog log = getDefault().getLog();
-		IStatus status;
-		if (ex != null) {
-			status = new Status(IStatus.ERROR, PLUGIN_ID, message, ex);
-		} else {
-			status = new Status(IStatus.ERROR, PLUGIN_ID, message);
-		}
-		log.log(status);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadUtils.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadUtils.java
deleted file mode 100644
index 97991e4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/TrinidadUtils.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport;
-
-import org.w3c.dom.Node;
-
-/**
- * Utility class for the Trinidad Tag Support plug-in.
- *
- * @author Ian Trimble - Oracle
- */
-public class TrinidadUtils {
-
-	private static final String KEY_CURRENT_CHILD_INDEX =
-		"KEY_CURRENT_CHILD_INDEX"; //$NON-NLS-1$
-
-	/**
-	 * Sets the index of the Node instance's "current" child as user data on
-	 * the Node instance.
-	 * 
-	 * @param node Node instance on which to set index.
-	 * @param index Index of node's "current" child.
-	 * @return true if index has changed, else false.
-	 */
-	public static boolean setCurrentChildIndex(Node node, int index) {
-		boolean indexChanged = false;
-		if (node != null) {
-			int currentIndex = getCurrentChildIndex(node);
-			if (currentIndex != index) {
-				node.setUserData(
-						KEY_CURRENT_CHILD_INDEX,
-						new Integer(index),
-						null);
-				indexChanged = true;
-			}
-		}
-		return indexChanged;
-	}
-
-	/**
-	 * Gets the index of the Node instance's "current" child from user data on
-	 * the Node instance.
-	 * 
-	 * @param node Node instance from which to get index.
-	 * @return Index of node's "current" child. A value of -1 indicates
-	 * inability to get index from node.
-	 */
-	public static int getCurrentChildIndex(Node node) {
-		int index = -1;
-		if (node != null) {
-			Object obj = node.getUserData(KEY_CURRENT_CHILD_INDEX);
-			if (obj instanceof Integer) {
-				index = ((Integer)obj).intValue();
-			}
-		}
-		return index;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractLabelAndHelpOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractLabelAndHelpOperation.java
deleted file mode 100644
index d9f2113..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractLabelAndHelpOperation.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Abstract ITransformOperation implementation for tags which may be preceded by
- * a label and may have a "help" facet.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractLabelAndHelpOperation extends AbstractTrinidadTransformOperation {
-
-	private static final String STYLECLASS_OUTERELEMENT = "af_inputText p_AFRequired"; //$NON-NLS-1$
-	private static final String STYLECLASS_LABELTD = "af_inputText_label"; //$NON-NLS-1$
-	private static final String STYLECLASS_REQUIREDSPAN = "AFRequiredIconStyle"; //$NON-NLS-1$
-	private static final String STYLECLASS_CONTROLTD = "AFContentCell"; //$NON-NLS-1$
-	protected static final String STYLECLASS_CONTROLELEMENT = "af_inputText_content"; //$NON-NLS-1$
-	private static final String STYLECLASS_HELPTD = "AFComponentMessageCell"; //$NON-NLS-1$
-	private static final String STYLECLASS_HELPSPAN = "OraInlineInfoText"; //$NON-NLS-1$
-	
-	/**
-	 * Subclasses must implement this method to append the desired DOM structure
-	 * that represents the HTML control(s) to parentElement.
-	 * 
-	 * @param srcElement Source Element representing source document tag.
-	 * @param parentElement Parent Element to which structure is appended.
-	 */
-	protected abstract void appendControl(Element srcElement, Element parentElement);
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		Element outerElement;
-
-		//create outer Element
-		String simple = srcElement.getAttribute("simple"); //$NON-NLS-1$
-		if (Boolean.valueOf(simple)) {
-			outerElement = createElement("span"); //$NON-NLS-1$
-		} else {
-			outerElement = createElement("table"); //$NON-NLS-1$
-			//append table-specific attributes
-			appendAttribute(outerElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(outerElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(outerElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		//append common attributes
-		appendAttribute(outerElement, "class", //$NON-NLS-1$
-				calculateStyleClass(STYLECLASS_OUTERELEMENT, srcElement, "styleClass")); //$NON-NLS-1$
-		String inlineStyle = calculateStyle(null, srcElement, "inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null) {
-			appendAttribute(outerElement, "style", inlineStyle); //$NON-NLS-1$
-		}		
-
-		if (Boolean.valueOf(simple)) {
-			//continue building simple variant
-			appendControl(srcElement, outerElement);
-		} else {
-			//continue building non-simple variant
-			Element trElement = appendChildElement("tr", outerElement); //$NON-NLS-1$
-
-			if (isRequired(srcElement) || getLabel(srcElement) != null) {
-				//if either required or has label, build top-left table cell
-				Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-				appendAttribute(tdElement, "class", STYLECLASS_LABELTD); //$NON-NLS-1$
-				appendAttribute(tdElement, "valign", "top"); //$NON-NLS-1$ //$NON-NLS-2$
-				appendAttribute(tdElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-
-				if (isRequired(srcElement)) {
-					Element spanElement = appendChildElement("span", tdElement); //$NON-NLS-1$
-					appendAttribute(spanElement, "title", "Required"); //$NON-NLS-1$ //$NON-NLS-2$
-					appendAttribute(spanElement, "class", STYLECLASS_REQUIREDSPAN); //$NON-NLS-1$
-					appendChildText("* ", spanElement); //$NON-NLS-1$
-				}
-
-				if (getLabel(srcElement) != null) {
-					Element labelElement = appendChildElement("label", tdElement); //$NON-NLS-1$
-					appendChildText(getLabel(srcElement), labelElement);
-				}
-			}
-
-			//build content table cell
-			Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-			appendAttribute(tdElement, "class", STYLECLASS_CONTROLTD); //$NON-NLS-1$
-			appendAttribute(tdElement, "valign", "top"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			appendControl(srcElement, tdElement);
-
-			List<Node> helpFacetChildNodes = getHelpFacetChildNodes(srcElement);
-			if (helpFacetChildNodes.size() > 0) {
-				//build help table row
-				trElement = appendChildElement("tr", outerElement); //$NON-NLS-1$
-				if (isRequired(srcElement) || getLabel(srcElement) != null) {
-					tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-				}
-				tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-				appendAttribute(tdElement, "class", STYLECLASS_HELPTD); //$NON-NLS-1$
-				Element spanElement = appendChildElement("span", tdElement); //$NON-NLS-1$
-				appendAttribute(spanElement, "class", //$NON-NLS-1$
-						calculateStyle(STYLECLASS_HELPSPAN, srcElement, "styleClass")); //$NON-NLS-1$
-				if (inlineStyle != null) {
-					appendAttribute(spanElement, "style", inlineStyle); //$NON-NLS-1$
-				}
-				Iterator<Node> itHelpFacetChildNodes = helpFacetChildNodes.iterator();
-				int curPos = 0;
-				while (itHelpFacetChildNodes.hasNext()) {
-					Node curNode = itHelpFacetChildNodes.next();
-					if (curNode instanceof Text) {
-						if (curNode.getNodeValue() != null && curNode.getNodeValue().length() > 0) {
-							tagConverterContext.addChild(
-									curNode,
-									new ConvertPosition(spanElement, curPos));
-						}
-					} else {
-						tagConverterContext.addChild(
-								curNode,
-								new ConvertPosition(spanElement, curPos));
-					}
-					curPos++;
-				}
-			}
-		}
-
-		return outerElement;
-	}
-
-	protected String calculateStyle(
-			String baseStyle, Element srcElement, String styleAttributeName) {
-		String style = baseStyle;
-		if (srcElement != null && styleAttributeName != null) {
-			String srcElementStyle = srcElement.getAttribute(styleAttributeName);
-			if (srcElementStyle != null && srcElementStyle.length() > 0) {
-				if (style != null) {
-					if (!style.endsWith(";")) { //$NON-NLS-1$
-						style += ";"; //$NON-NLS-1$
-					}
-					style += srcElementStyle;
-				} else {
-					style = srcElementStyle;
-				}
-			}
-		}
-		return style;
-	}
-
-	protected String calculateStyleClass(
-			String baseStyleClass, Element srcElement, String styleClassAttributeName) {
-		String styleClass = baseStyleClass;
-		if (srcElement != null && styleClassAttributeName != null) {
-			String srcElementStyleClass = srcElement.getAttribute(styleClassAttributeName);
-			if (srcElementStyleClass != null && srcElementStyleClass.length() > 0) {
-				if (styleClass != null) {
-					if (!styleClass.endsWith(",")) { //$NON-NLS-1$
-						styleClass += ","; //$NON-NLS-1$
-					}
-					styleClass += srcElementStyleClass;
-				} else {
-					styleClass = srcElementStyleClass;
-				}
-			}
-		}
-		return styleClass;
-	}
-
-	protected boolean isRequired(Element srcElement) {
-		boolean required = false;
-		if (!isChildOfPanelFormLayout(srcElement)) {
-			if (srcElement != null) {
-				String requiredVal = srcElement.getAttribute("required"); //$NON-NLS-1$
-				String showRequiredVal = srcElement.getAttribute("showRequired"); //$NON-NLS-1$
-				//if either are true, for the purposes of tag conversion, consider required to be true
-				required =
-					Boolean.parseBoolean(requiredVal) ||
-					Boolean.parseBoolean(showRequiredVal);
-			}
-		}
-		return required;
-	}
-
-	protected String getLabel(Element srcElement) {
-		String label = null;
-		if (!isChildOfPanelFormLayout(srcElement)) {
-			if (srcElement != null) {
-				String labelAndAccessKeyVal = srcElement.getAttribute("labelAndAccessKey"); //$NON-NLS-1$
-				if (labelAndAccessKeyVal != null && labelAndAccessKeyVal.length() > 0) {
-					label = labelAndAccessKeyVal;
-				} else {
-					String labelVal = srcElement.getAttribute("label"); //$NON-NLS-1$
-					if (labelVal != null && labelVal.length() > 0) {
-						label = labelVal;
-					}
-				}
-			}
-		}
-		return label;
-	}
-
-	protected List<Node> getHelpFacetChildNodes(Element srcElement) {
-		@SuppressWarnings("unchecked")
-		List<Node> children = Collections.EMPTY_LIST;
-		Element helpFacet = getChildFacetByName(srcElement, "help"); //$NON-NLS-1$
-		if (helpFacet != null) {
-			children = getCopyChildrenNodes(helpFacet);
-		}
-		return children;
-	}
-
-	protected int getColumns(Element srcElement) {
-		int columns = 30;
-		if (srcElement != null) {
-			String columnsValue = srcElement.getAttribute("columns"); //$NON-NLS-1$
-			if (columnsValue != null && columnsValue.length() > 0) {
-				try {
-					columns = Integer.parseInt(columnsValue);
-				} catch(NumberFormatException nfe) {
-					//ignore; default value will be returned
-				}
-			}
-		}
-		return columns;
-	}
-
-	protected boolean isChildOfPanelFormLayout(Element srcElement) {
-		boolean isChild = false;
-		if (srcElement != null) {
-			Node parent = srcElement.getParentNode();
-			if (parent instanceof Element) {
-				TagIdentifier tagID = TagIdentifierFactory.createDocumentTagWrapper((Element)parent);
-				if (ITrinidadConstants.TAG_IDENTIFIER_PANELFORMLAYOUT.isSameTagType(tagID)) {
-					isChild = true;
-				} else if (ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(tagID)) {
-					isChild = isChildOfPanelFormLayout((Element)parent);
-				} else if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(tagID)) {
-					isChild = isChildOfPanelFormLayout((Element)parent);
-				}
-			}
-		}
-		return isChild;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractTrinidadTransformOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractTrinidadTransformOperation.java
deleted file mode 100644
index ca8e9ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/AbstractTrinidadTransformOperation.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Extends AbstractTransformOperation to supply extra convenience methods.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractTrinidadTransformOperation extends AbstractTransformOperation {
-
-	/**
-	 * Appends the specified attribute with the specified value to the specified
-	 * Element instance.
-	 * 
-	 * @param element Element instance to append attribute to.
-	 * @param attributeName Name of attribute to be appended.
-	 * @param attributeValue Value of attribute to be appended.
-	 */
-	protected void appendAttribute(
-			Element element, String attributeName, String attributeValue) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CreateAttributeOperation,
-					new String[]{attributeName, attributeValue});
-		operation.transform(null, element);
-	}
-
-	/**
-	 * Gets a child Element of the specified parent Element that has the node
-	 * name "facet" and the specified value of the "name" attribute.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @param facetName Name of the facet Element for which to search.
-	 * @return Child Element that is a facet with the specified name.
-	 */
-	protected Element getChildFacetByName(Element srcElement, String facetName) {
-		Element element = null;
-		@SuppressWarnings("unchecked")
-		List facets = getChildElements(srcElement, "facet"); //$NON-NLS-1$
-		@SuppressWarnings("unchecked")
-		Iterator itFacets = facets.iterator();
-		while (itFacets.hasNext()) {
-			Element facet = (Element)itFacets.next();
-			String facetAttrName = facet.getAttribute("name"); //$NON-NLS-1$
-			if (facetAttrName != null && facetAttrName.equals(facetName)) {
-				element = facet;
-				break;
-			}
-		}
-		return element;
-	}
-
-	/**
-	 * Gets a list of child Elements of the specified parent Element, skipping
-	 * any "facet" Elements.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @return List of child Elements of the specified parent Element that does
-	 * not include any child "facet" Elements.
-	 */
-	protected List<Element> getChildElementsSkipFacets(Element srcElement) {
-		List<Element> childElementsList = new ArrayList<Element>();
-		NodeList childNodes = srcElement.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node childNode = childNodes.item(i);
-			if (childNode.getNodeType() == Node.ELEMENT_NODE) {
-				if (!childNode.getLocalName().equals("facet")) { //$NON-NLS-1$
-					childElementsList.add((Element)childNode);
-				}
-			}
-		}
-		return childElementsList;
-	}
-
-	/**
-	 * Returns a List of child Node instances that will be added by the
-	 * "CopyChildrenOperation" ITransformOperation. This can be useful in
-	 * determining if any Node instances will, in fact, be copied. 
-	 * 
-	 * @param srcElement Source Element instance to query for child Node
-	 * instances.
-	 * @return A List of child Node instances that will be added by the
-	 * "CopyChildrenOperation" ITransformOperation.
-	 */
-	protected List<Node> getCopyChildrenNodes(Element srcElement) {
-		List<Node> children = new ArrayList<Node>();
-		if (srcElement != null) {
-			NodeList childNodes = srcElement.getChildNodes();
-			for (int i = 0; i < childNodes.getLength(); i++) {
-				Node childNode = childNodes.item(i);
-				short childNodeType = childNode.getNodeType();
-				if (childNodeType == Node.ELEMENT_NODE ||
-						childNodeType == Node.TEXT_NODE ||
-						childNodeType == Node.CDATA_SECTION_NODE) {
-					children.add(childNode);
-				}
-			}
-		}
-		return children;
-	}
-
-	/**
-	 * Calculates required style class value, based on a specified base style
-	 * class and the value of the source Element instance's "styleClass"
-	 * attribute.
-	 * 
-	 * @param baseClass Specified base style class (may be null).
-	 * @param srcElement Source Element instance (may be null).
-	 * @return Required style class value, to be set as "class" attribute (may
-	 * be null).
-	 */
-	protected String calculateStyleClass(String baseClass, Element srcElement) {
-		String styleClass = null;
-		if (baseClass != null) {
-			styleClass = baseClass;
-		}
-		if (srcElement != null) {
-			String srcStyleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-			if (srcStyleClass != null && srcStyleClass.length() > 0) {
-				if (styleClass.length() > 0) {
-					styleClass += "," + srcStyleClass; //$NON-NLS-1$
-				} else {
-					styleClass = srcStyleClass;
-				}
-			}
-		}
-		return styleClass;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/BreadCrumbsOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/BreadCrumbsOperation.java
deleted file mode 100644
index 6d91e14..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/BreadCrumbsOperation.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * Copyright (c) 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation specifically for the "breadCrumbs" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class BreadCrumbsOperation extends AbstractTrinidadTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		Element outerSpan = createElement("span"); //$NON-NLS-1$
-		String styleClass = calculateStyleClass("af_breadCrumbs", srcElement); //$NON-NLS-1$
-		if (styleClass != null) {
-			appendAttribute(outerSpan, "class", styleClass); //$NON-NLS-1$
-		}
-		String style = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (style != null) {
-			appendAttribute(outerSpan, "style", style); //$NON-NLS-1$
-		}
-		List<Element> childCmdNavItems = getChildCmdNavItems(srcElement);
-		int currentChildIndex = 0;
-		int numChildren = childCmdNavItems.size();
-		if (numChildren > 0) {
-			for (Element childCmdNavItem: childCmdNavItems) {
-				Element nobr;
-				if (isVertical(srcElement)) {
-					Element div = appendChildElement("div", outerSpan); //$NON-NLS-1$
-					nobr = appendChildElement("nobr", div); //$NON-NLS-1$
-					appendChildText(getIndentationString(currentChildIndex), nobr);
-				} else {
-					nobr = appendChildElement("nobr", outerSpan); //$NON-NLS-1$
-				}
-				Element innerSpan = appendChildElement("span", nobr); //$NON-NLS-1$
-				tagConverterContext.addChild(
-						childCmdNavItem, new ConvertPosition(innerSpan, 0));
-				if (currentChildIndex < numChildren - 1) {
-					//appendChildText("&nbsp;&nbsp;&gt;&nbsp;&nbsp;", nobr); //$NON-NLS-1$
-					appendChildText("\u00A0 \u003E \u00A0", nobr); //$NON-NLS-1$
-				}
-				currentChildIndex++;
-			}
-		} else {
-			appendAttribute(outerSpan, "style", ITrinidadConstants.STYLE_EMPTYELEMENT); //$NON-NLS-1$
-			appendChildText(Messages.BreadCrumbsOperation_EmptyBreadCrumbsTag, outerSpan);
-		}
-		return outerSpan;
-	}
-
-	private List<Element> getChildCmdNavItems(Element srcElement) {
-		List<Element> childCmdNavItems = new ArrayList<Element>();
-		NodeList childElements = srcElement.getElementsByTagNameNS(ITrinidadConstants.URI_CORE, "commandNavigationItem"); //$NON-NLS-1$$
-		if (childElements != null && childElements.getLength() > 0) {
-			for (int i = 0, len = childElements.getLength(); i < len; i++) {
-				childCmdNavItems.add((Element)childElements.item(i));
-			}
-		} else {
-			Element nodeStampFacet = getChildFacetByName(srcElement, "nodeStamp"); //$NON-NLS-1$
-			if (nodeStampFacet != null) {
-				childElements = nodeStampFacet.getElementsByTagNameNS(ITrinidadConstants.URI_CORE, "commandNavigationItem"); //$NON-NLS-1$
-				if (childElements != null && childElements.getLength() > 0) {
-					for (int i = 0, len = childElements.getLength(); i < len; i++) {
-						childCmdNavItems.add((Element)childElements.item(i));
-					}
-				}
-			}
-		}
-		return childCmdNavItems;
-	}
-
-	private boolean isVertical(Element srcElement) {
-		String orientationAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_ORIENTATION);
-		return "vertical".equalsIgnoreCase(orientationAttr); //$NON-NLS-1$
-	}
-
-	private String getIndentationString(int indentationLevel) {
-		StringBuffer indentation = new StringBuffer(""); //$NON-NLS-1$
-		for (int i = 0; i < indentationLevel; i++) {
-			//indentation.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"); //$NON-NLS-1$
-			indentation.append(" \u00A0 \u00A0 \u00A0 \u00A0 \u00A0"); //$NON-NLS-1$
-		}
-		return indentation.toString();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CommandNavigationItemOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CommandNavigationItemOperation.java
deleted file mode 100644
index 7dc4030..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CommandNavigationItemOperation.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/**
- * Copyright (c) 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the
- * "commandNavigationItem" JSF Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CommandNavigationItemOperation extends AbstractTrinidadTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		Element topElement = null;
-		if (isDescendentOf(ITrinidadConstants.TAG_IDENTIFIER_BREADCRUMBS, srcElement)) {
-			topElement = transformForBreadCrumbs(srcElement);
-		} else if (isDescendentOf(ITrinidadConstants.TAG_IDENTIFIER_NAVIGATIONPANE, srcElement)) {
-			Element navPane = getAncestor(ITrinidadConstants.TAG_IDENTIFIER_NAVIGATIONPANE, srcElement);
-			if (navPane != null) {
-				String navPaneHint = navPane.getAttribute("hint"); //$NON-NLS-1$
-				if ("choice".equalsIgnoreCase(navPaneHint)) { //$NON-NLS-1$
-					topElement = transformForNavigationPane_Choice(srcElement);
-				} else {
-					topElement = doDefaultTransform(srcElement);
-				}
-			}
-		} else {
-			topElement = doDefaultTransform(srcElement);
-		}
-		return topElement;
-	}
-
-	private Element transformForBreadCrumbs(Element srcElement) {
-		Element anchor = createElement("a"); //$NON-NLS-1$
-		if (!isDisabledOrLastCmdNavItem(srcElement)) {
-			appendAttribute(anchor, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(anchor, "class", "af_breadCrumbs_step"); //$NON-NLS-1$ //$NON-NLS-2$
-		} else {
-			appendAttribute(anchor, "class", "af_breadCrumbs_selected-step"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendChildText(getText(srcElement), anchor);
-		return anchor;
-	}
-
-	private Element transformForNavigationPane_Choice(Element srcElement) {
-		Element option = createElement("option"); //$NON-NLS-1$
-		if (isSelected(srcElement)) {
-			appendAttribute(option, "selected", "selected"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendChildText(getText(srcElement), option);
-		return option;
-	}
-
-	private Element doDefaultTransform(Element srcElement) {
-		Element anchor = createElement("a"); //$NON-NLS-1$
-		if (!isDisabled(srcElement)) {
-			appendAttribute(anchor, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendChildText(getText(srcElement), anchor);
-		return anchor;
-	}
-
-	private boolean isDescendentOf(TagIdentifier tagIdentifier, Element srcElement) {
-		boolean isDescendent = false;
-		if (tagIdentifier != null && srcElement != null) {
-			Node parentNode = srcElement.getParentNode();
-			if (parentNode instanceof Element) {
-				if (tagIdentifier.isSameTagType(
-						TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-					isDescendent = true;
-				} else if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(
-						TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-					parentNode = parentNode.getParentNode();
-					if (parentNode instanceof Element) {
-						if (tagIdentifier.isSameTagType(
-								TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-							isDescendent = true;
-						}
-					}
-				}
-			}
-		}
-		return isDescendent;
-	}
-
-	private Element getAncestor(TagIdentifier tagIdentifier, Element srcElement) {
-		Element ancestor = null;
-		if (tagIdentifier != null && srcElement != null) {
-			Node parentNode = srcElement.getParentNode();
-			if (parentNode instanceof Element) {
-				if (tagIdentifier.isSameTagType(
-						TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-					ancestor = (Element)parentNode;
-				} else if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(
-						TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-					parentNode = parentNode.getParentNode();
-					if (parentNode instanceof Element) {
-						if (tagIdentifier.isSameTagType(
-								TagIdentifierFactory.createDocumentTagWrapper((Element)parentNode))) {
-							ancestor = (Element)parentNode;
-						}
-					}
-				}
-			}
-		}
-		return ancestor;
-	}
-
-	/**
-	 * Gets display text from a commandNavigationItem Element.
-	 * 
-	 * @param srcElement A commmandNavigationItem Element instance.
-	 * @return Display text from a commandNavigationItem Element.
-	 */
-	public static String getText(Element srcElement) {
-		String text = "commandNavigationItem"; //$NON-NLS-1$
-		if (srcElement != null) {
-			String newText = srcElement.getAttribute(ITrinidadConstants.ATTR_TEXTANDACCESSKEY);
-			if (newText != null && newText.length() > 0) {
-				text = newText;
-			} else {
-				newText = srcElement.getAttribute(ITrinidadConstants.ATTR_TEXT);
-				if (newText != null && newText.length() > 0) {
-					text = newText;
-				} else {
-					newText = srcElement.getAttribute(ITrinidadConstants.ATTR_ACTION);
-					if (newText != null && newText.length() > 0) {
-						text = newText;
-					} else {
-						newText = srcElement.getAttribute(ITrinidadConstants.ATTR_DESTINATION);
-						if (newText != null && newText.length() > 0) {
-							text = newText;
-						}
-					}
-				}
-			}
-		}
-		return text;
-	}
-
-	public static boolean isDisabled(Element srcElement) {
-		String disabledAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_DISABLED);
-		return Boolean.TRUE.toString().equalsIgnoreCase(disabledAttr);
-	}
-
-	private boolean isDisabledOrLastCmdNavItem(Element srcElement) {
-		boolean ret = false;
-		String disabledAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_DISABLED);
-		if (Boolean.TRUE.toString().equalsIgnoreCase(disabledAttr)) {
-			ret = true;
-		} else {
-			Node nextSibling = srcElement;
-			while (nextSibling != null) {
-				nextSibling = nextSibling.getNextSibling();
-				if (nextSibling == null) {
-					ret = true;
-				} else {
-					if (nextSibling instanceof Element) {
-						if (TagIdentifierFactory.createDocumentTagWrapper((Element)nextSibling).isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_COMMANDNAVIGATIONITEM)) {
-							break;
-						}
-					}
-				}
-			}
-		}
-		return ret;
-	}
-
-	public static boolean isSelected(Element srcElement) {
-		String selectedAttr = srcElement.getAttribute(ITrinidadConstants.ATTR_SELECTED);
-		return Boolean.TRUE.toString().equalsIgnoreCase(selectedAttr);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateClassAttributeOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateClassAttributeOperation.java
deleted file mode 100644
index 66f6baa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateClassAttributeOperation.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Copyright (c) 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation to handle merging of an Element's optional
- * default style class with a specified "styleClass" as the current Element's
- * "class" attribute.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateClassAttributeOperation extends AbstractTrinidadTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		String classValue = null;
-		if (getParameters().length > 0) {
-			classValue = getParameters()[0];
-		}
-		String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-		if (styleClass != null && styleClass.length() > 0) {
-			if (classValue == null) {
-				classValue = styleClass;
-			} else {
-				classValue = styleClass + " " + classValue; //$NON-NLS-1$
-			}
-		}
-		if (classValue != null && curElement != null) {
-			curElement.setAttribute("class", classValue); //$NON-NLS-1$
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateStyleAttributeOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateStyleAttributeOperation.java
deleted file mode 100644
index b0baffa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/CreateStyleAttributeOperation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation to handle merging of an Element's optional
- * default style with a specified "inlineStyle" as the current Element's "style"
- * attribute.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateStyleAttributeOperation extends AbstractTrinidadTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		String styleValue = null;
-		if (getParameters().length > 0) {
-			styleValue = getParameters()[0];
-		}
-		String inlineStyle = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null && inlineStyle.length() > 0) {
-			if (styleValue == null) {
-				styleValue = inlineStyle;
-			} else {
-				if (styleValue.length() > 0 && !styleValue.endsWith(";")) { //$NON-NLS-1$
-					styleValue += ";"; //$NON-NLS-1$
-				}
-				styleValue += inlineStyle;
-			}
-		}
-		if (styleValue != null && curElement != null) {
-			curElement.setAttribute("style", styleValue); //$NON-NLS-1$
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputFileOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputFileOperation.java
deleted file mode 100644
index f3e2e97..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputFileOperation.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "inputFile" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class InputFileOperation extends AbstractLabelAndHelpOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		Element controlElement = appendChildElement("input", parentElement); //$NON-NLS-1$
-		appendAttribute(controlElement, "size", //$NON-NLS-1$
-				String.valueOf(getColumns(srcElement)));
-		appendAttribute(controlElement, "type", "file"); //$NON-NLS-1$ //$NON-NLS-2$
-		String value = srcElement.getAttribute("value"); //$NON-NLS-1$
-		if (value != null) {
-			appendAttribute(controlElement, "value", value); //$NON-NLS-1$
-		}
-		//append common attributes
-		appendAttribute(controlElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(controlElement, "style", contentStyle); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextOperation.java
deleted file mode 100644
index 47f7ab4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextOperation.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "inputText" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class InputTextOperation extends AbstractLabelAndHelpOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		int rows = getRows(srcElement);
-		Element controlElement;
-		if (rows < 2) {
-			controlElement = appendChildElement("input", parentElement); //$NON-NLS-1$
-			appendAttribute(controlElement, "size", //$NON-NLS-1$
-					String.valueOf(getColumns(srcElement)));
-			appendAttribute(controlElement, "type", getType(srcElement)); //$NON-NLS-1$
-			String value = srcElement.getAttribute("value"); //$NON-NLS-1$
-			if (value != null) {
-				appendAttribute(controlElement, "value", value); //$NON-NLS-1$
-			}
-		} else {
-			controlElement = appendChildElement("textarea", parentElement); //$NON-NLS-1$
-			appendAttribute(controlElement, "cols", //$NON-NLS-1$
-					String.valueOf(getColumns(srcElement)));
-			appendAttribute(controlElement, "rows", //$NON-NLS-1$
-					String.valueOf(getRows(srcElement)));
-			appendAttribute(controlElement, "wrap", getWrap(srcElement)); //$NON-NLS-1$
-			String value = srcElement.getAttribute("value"); //$NON-NLS-1$
-			if (value != null) {
-				appendChildText(value, controlElement);
-			}
-		}
-		//append common attributes
-		appendAttribute(controlElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(controlElement, "style", contentStyle); //$NON-NLS-1$
-		}
-	}
-
-	private int getRows(Element srcElement) {
-		int rows = 1;
-		if (srcElement != null) {
-			String rowsValue = srcElement.getAttribute("rows"); //$NON-NLS-1$
-			if (rowsValue != null && rowsValue.length() > 0) {
-				try {
-					rows = Integer.parseInt(rowsValue);
-				} catch(NumberFormatException nfe) {
-					//ignore; default value will be returned
-				}
-			}
-		}
-		return rows;
-	}
-
-	private String getWrap(Element srcElement) {
-		String wrap = "soft"; //$NON-NLS-1$
-		if (srcElement != null) {
-			String wrapValue = srcElement.getAttribute("wrap"); //$NON-NLS-1$
-			if (wrapValue != null && wrapValue.length() > 0) {
-				wrap = wrapValue;
-			}
-		}
-		return wrap;
-	}
-
-	private String getType(Element srcElement) {
-		String type = "text"; //$NON-NLS-1$
-		if (srcElement != null) {
-			String secret = srcElement.getAttribute("secret"); //$NON-NLS-1$
-			if (Boolean.valueOf(secret)) {
-				type = "password"; //$NON-NLS-1$
-			}
-		}
-		return type;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextWithIconOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextWithIconOperation.java
deleted file mode 100644
index d425db0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/InputTextWithIconOperation.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for any "input..." JSF
- * Elements that are basically comprised of an inputText followed by an icon.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class InputTextWithIconOperation extends AbstractLabelAndHelpOperation {
-
-	private String imageFilename;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else {
-			imageFilename = getParameters()[0];
-		}
-		return super.transform(srcElement, curElement);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		//append input
-		Element inputElement = appendChildElement("input", parentElement); //$NON-NLS-1$
-		appendAttribute(inputElement, "size", //$NON-NLS-1$
-				String.valueOf(getColumns(srcElement)));
-		appendAttribute(inputElement, "type", "text"); //$NON-NLS-1$ //$NON-NLS-2$
-		String value = srcElement.getAttribute("value"); //$NON-NLS-1$
-		if (value != null) {
-			appendAttribute(inputElement, "value", value); //$NON-NLS-1$
-		}
-		//append common attributes
-		appendAttribute(inputElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(inputElement, "style", contentStyle); //$NON-NLS-1$
-		}
-
-		//append anchor with child image
-		Element aElement = appendChildElement("a", parentElement); //$NON-NLS-1$
-		appendAttribute(aElement, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element imgElement = appendChildElement("img", aElement); //$NON-NLS-1$
-		appendAttribute(imgElement, "align", "absmiddle"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(imgElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(imgElement, "src", imageFilename); //$NON-NLS-1$
-		appendAttribute(imgElement, "style", "margin-left:4px;"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/NavigationPaneOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/NavigationPaneOperation.java
deleted file mode 100644
index 8a010ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/NavigationPaneOperation.java
+++ /dev/null
@@ -1,430 +0,0 @@
-/**
- * Copyright (c) 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation specifically for the "navigationPane"
- * JSF Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class NavigationPaneOperation extends AbstractTrinidadTransformOperation {
-
-	private static final String STYLECLASS_OUTERDIV = "af_navigationPane"; //$NON-NLS-1$
-
-	private static final String STYLECLASS_BAR_OUTERDIV = "af_navigationPane_bar"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_TABLE_INACTIVE_ENABLED = "af_navigationPane_bar-inactive-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_TABLE_ACTIVE_ENABLED = "af_navigationPane_bar-active-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_TABLE_INACTIVE_DISABLED = "af_navigationPane_bar-inactive-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_TABLE_ACTIVE_DISABLED = "af_navigationPane_bar-active-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_DIV_CONTENT = "af_navigationPane_bar-content"; //$NON-NLS-1$
-	private static final String STYLECLASS_BAR_DIV_SEPARATOR = "af_navigationPane_bar-separator"; //$NON-NLS-1$
-
-	private static final String STYLECLASS_BUTTONS_TABLE_INACTIVE_ENABLED = "af_navigationPane_buttons-inactive-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BUTTONS_TABLE_ACTIVE_ENABLED = "af_navigationPane_buttons-active-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BUTTONS_TABLE_INACTIVE_DISABLED = "af_navigationPane_buttons-inactive-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BUTTONS_TABLE_ACTIVE_DISABLED = "af_navigationPane_buttons-active-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_BUTTONS_DIV_CONTENT = "af_navigationPane_buttons-content"; //$NON-NLS-1$
-	private static final String STYLECLASS_BUTTONS_DIV_SEPARATOR = "af_navigationPane_buttons-separator"; //$NON-NLS-1$
-
-	private static final String STYLECLASS_CHOICE_SELECT = "af_navigationPane_choice-options"; //$NON-NLS-1$
-	private static final String STYLECLASS_CHOICE_BUTTON = "af_navigationPane_choice-button"; //$NON-NLS-1$
-
-	private static final String STYLECLASS_LIST_TABLE_INACTIVE_ENABLED = "af_navigationPane_list-inactive-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_LIST_TABLE_ACTIVE_ENABLED = "af_navigationPane_list-active-enabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_LIST_TABLE_INACTIVE_DISABLED = "af_navigationPane_list-inactive-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_LIST_TABLE_ACTIVE_DISABLED = "af_navigationPane_list-active-disabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_LIST_TD_BULLET = "af_navigationPane_list-bullet"; //$NON-NLS-1$
-	private static final String STYLECLASS_LIST_DIV_CONTENT = "af_navigationPane_list-content"; //$NON-NLS-1$
-
-	private static final String STYLECLASS_TABS_TABLE_INACTIVE_ENABLED = "af_navigationPane_tabs-inactive"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TABLE_ACTIVE_ENABLED = "af_navigationPane_tabs-active"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TABLE_INACTIVE_DISABLED = "af_navigationPane_tabs-inactive p_AFDisabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TABLE_ACTIVE_DISABLED = "af_navigationPane_tabs-active p_AFDisabled"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_START = "af_navigationPane_tabs-start"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_START_JOIN = "af_navigationPane_tabs-start-join"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_START_JOINFROMACTIVE = "af_navigationPane_tabs-start-join-from-active"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_START_JOINFROMINACTIVE = "af_navigationPane_tabs-start-join-from-inactive"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_BOTTOM_START = "af_navigationPane_tabs-bottom-start"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_MID = "af_navigationPane_tabs-mid"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_BOTTOM_MID = "af_navigationPane_tabs-bottom-mid"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_END = "af_navigationPane_tabs-end"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_END_JOINTOINACTIVE = "af_navigationPane_tabs-end-join-to-inactive"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_BOTTOM_END = "af_navigationPane_tabs-bottom-end"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_TD_BOTTOM_END_JOIN = "af_navigationPane_tabs-bottom-end-join"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_DIV_BOTTOM_START_CONTENT = "af_navigationPane_tabs-bottom-start-content"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_DIV_BOTTOM_MID_CONTENT = "af_navigationPane_tabs-bottom-mid-content"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABS_DIV_BOTTOM_END_CONTENT = "af_navigationPane_tabs-bottom-end-content"; //$NON-NLS-1$
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		Element div = null;
-		String hint = getHint(srcElement);
-		if (hint.equalsIgnoreCase("bar")) { //$NON-NLS-1$
-			div = transformAsBar(srcElement);
-		} else if (hint.equalsIgnoreCase("buttons")) { //$NON-NLS-1$
-			div = transformAsButtons(srcElement);
-		} else if (hint.equalsIgnoreCase("choice")) { //$NON-NLS-1$
-			div = transformAsChoice(srcElement);
-		} else if (hint.equalsIgnoreCase("list")) { //$NON-NLS-1$
-			div = transformAsList(srcElement);
-		} else if (hint.equalsIgnoreCase("tabs")) { //$NON-NLS-1$
-			div = transformAsTabs(srcElement);
-		} else {
-			div = transformAsBar(srcElement);
-		}
-		return div;
-	}
-
-	private Element transformAsBar(Element srcElement) {
-		return transformAsBarOrButtons(srcElement, true);
-	}
-
-	private Element transformAsButtons(Element srcElement) {
-		return transformAsBarOrButtons(srcElement, false);
-	}
-
-	private Element transformAsBarOrButtons(Element srcElement, boolean isBar) {
-		Element div = null;
-		String styleClass_outerDiv;
-		String styleClass_tableInactiveEnabled;
-		String styleClass_tableActiveEnabled;
-		String styleClass_tableInactiveDisabled;
-		String styleClass_tableActiveDisabled;
-		String styleClass_divContent;
-		String styleClass_divSeparator;
-		if (isBar) {
-			styleClass_outerDiv = STYLECLASS_BAR_OUTERDIV;
-			styleClass_tableInactiveEnabled = STYLECLASS_BAR_TABLE_INACTIVE_ENABLED;
-			styleClass_tableActiveEnabled = STYLECLASS_BAR_TABLE_ACTIVE_ENABLED;
-			styleClass_tableInactiveDisabled = STYLECLASS_BAR_TABLE_INACTIVE_DISABLED;
-			styleClass_tableActiveDisabled = STYLECLASS_BAR_TABLE_ACTIVE_DISABLED;
-			styleClass_divContent = STYLECLASS_BAR_DIV_CONTENT;
-			styleClass_divSeparator = STYLECLASS_BAR_DIV_SEPARATOR;
-		} else {
-			styleClass_outerDiv = STYLECLASS_OUTERDIV;
-			styleClass_tableInactiveEnabled = STYLECLASS_BUTTONS_TABLE_INACTIVE_ENABLED;
-			styleClass_tableActiveEnabled = STYLECLASS_BUTTONS_TABLE_ACTIVE_ENABLED;
-			styleClass_tableInactiveDisabled = STYLECLASS_BUTTONS_TABLE_INACTIVE_DISABLED;
-			styleClass_tableActiveDisabled = STYLECLASS_BUTTONS_TABLE_ACTIVE_DISABLED;
-			styleClass_divContent = STYLECLASS_BUTTONS_DIV_CONTENT;
-			styleClass_divSeparator = STYLECLASS_BUTTONS_DIV_SEPARATOR;
-		}
-		div = createElement("div"); //$NON-NLS-1$
-		setClassAndStyleAttributes(srcElement, styleClass_outerDiv, div);
-		List<Element> childCmdNavItems = getChildCmdNavItems(srcElement);
-		int index = 0;
-		int numChildCmdNavItems = childCmdNavItems.size();
-		if (numChildCmdNavItems > 0) {
-			for (Element childCmdNavItem: childCmdNavItems) {
-				String styleClass =
-					determineStyleClass(
-							childCmdNavItem,
-							styleClass_tableActiveEnabled,
-							styleClass_tableActiveDisabled,
-							styleClass_tableInactiveEnabled,
-							styleClass_tableInactiveDisabled);
-				Element tbody = appendTableAndTBody(div, true, styleClass);
-				Element tr = appendChildElement("tr", tbody); //$NON-NLS-1$
-				Element contentTD = appendChildElement("td", tr); //$NON-NLS-1$
-				Element contentDiv = appendChildElement("div", contentTD); //$NON-NLS-1$
-				appendAttribute(contentDiv, "class", styleClass_divContent); //$NON-NLS-1$
-				tagConverterContext.addChild(
-						childCmdNavItem,
-						new ConvertPosition(contentDiv, 0));
-				if (index++ < numChildCmdNavItems - 1) {
-					Element separatorTD = appendChildElement("td", tr); //$NON-NLS-1$
-					Element separatorDiv = appendChildElement("div", separatorTD); //$NON-NLS-1$
-					appendAttribute(separatorDiv, "class", styleClass_divSeparator); //$NON-NLS-1$
-					appendChildText("|", separatorDiv); //$NON-NLS-1$
-				}
-			}
-		} else {
-			setEmptyNavPaneMessage(div);
-		}
-		return div;
-	}
-
-	private Element transformAsChoice(Element srcElement) {
-		Element div = null;
-		div = createElement("div"); //$NON-NLS-1$
-		setClassAndStyleAttributes(srcElement, STYLECLASS_OUTERDIV, div);
-		List<Element> childCmdNavItems = getChildCmdNavItems(srcElement);
-		if (childCmdNavItems.size() > 0) {
-			Element select = appendChildElement("select", div); //$NON-NLS-1$
-			appendAttribute(select, "class", STYLECLASS_CHOICE_SELECT); //$NON-NLS-1$
-			for (Element childCmdNavItem: childCmdNavItems) {
-				if (!CommandNavigationItemOperation.isDisabled(childCmdNavItem)) {
-					Element option = appendChildElement("option", select); //$NON-NLS-1$
-					if (CommandNavigationItemOperation.isSelected(childCmdNavItem)) {
-						appendAttribute(option, "selected", "selected"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					appendChildText(CommandNavigationItemOperation.getText(childCmdNavItem), option);
-				}
-			}
-			Element span = appendChildElement("span", div); //$NON-NLS-1$
-			appendAttribute(span, "style", "width: 5px;"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendChildText(" ", span); //$NON-NLS-1$
-			Element button = appendChildElement("button", div); //$NON-NLS-1$
-			appendAttribute(button, "class", STYLECLASS_CHOICE_BUTTON); //$NON-NLS-1$
-			appendAttribute(button, "type", "button"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendChildText("Go", button); //$NON-NLS-1$
-		} else {
-			setEmptyNavPaneMessage(div);
-		}
-		return div;
-	}
-
-	private Element transformAsList(Element srcElement) {
-		Element div = null;
-		div = createElement("div"); //$NON-NLS-1$
-		setClassAndStyleAttributes(srcElement, STYLECLASS_OUTERDIV, div);
-		List<Element> childCmdNavItems = getChildCmdNavItems(srcElement);
-		if (childCmdNavItems.size() > 0) {
-			for (Element childCmdNavItem: childCmdNavItems) {
-				String styleClass =
-					determineStyleClass(
-							childCmdNavItem,
-							STYLECLASS_LIST_TABLE_ACTIVE_ENABLED,
-							STYLECLASS_LIST_TABLE_ACTIVE_DISABLED,
-							STYLECLASS_LIST_TABLE_INACTIVE_ENABLED,
-							STYLECLASS_LIST_TABLE_INACTIVE_DISABLED);
-				Element tbody = appendTableAndTBody(div, false, styleClass);
-				Element tr = appendChildElement("tr", tbody); //$NON-NLS-1$
-				Element bulletTD = appendChildElement("td", tr); //$NON-NLS-1$
-				appendAttribute(bulletTD, "class", STYLECLASS_LIST_TD_BULLET); //$NON-NLS-1$
-				Element bulletDiv = appendChildElement("div", bulletTD); //$NON-NLS-1$
-				appendChildText(" ", bulletDiv); //$NON-NLS-1$
-				Element contentTD = appendChildElement("td", tr); //$NON-NLS-1$
-				Element contentDiv = appendChildElement("div", contentTD); //$NON-NLS-1$
-				appendAttribute(contentDiv, "class", STYLECLASS_LIST_DIV_CONTENT); //$NON-NLS-1$
-				tagConverterContext.addChild(
-						childCmdNavItem,
-						new ConvertPosition(contentDiv, 0));
-			}
-		} else {
-			setEmptyNavPaneMessage(div);
-		}
-		return div;
-	}
-
-	private Element transformAsTabs(Element srcElement) {
-		Element div = null;
-		div = createElement("div"); //$NON-NLS-1$
-		setClassAndStyleAttributes(srcElement, STYLECLASS_OUTERDIV, div);
-		List<Element> childCmdNavItems = getChildCmdNavItems(srcElement);
-		int index = 0;
-		int numChildCmdNavItems = childCmdNavItems.size();
-		int selectedTabIndex = determineSelectedTabIndex(childCmdNavItems);
-		if (numChildCmdNavItems > 0) {
-			for (Element childCmdNavItem: childCmdNavItems) {
-				String tableStyleClass =
-					determineStyleClass(
-							childCmdNavItem,
-							STYLECLASS_TABS_TABLE_ACTIVE_ENABLED,
-							STYLECLASS_TABS_TABLE_ACTIVE_DISABLED,
-							STYLECLASS_TABS_TABLE_INACTIVE_ENABLED,
-							STYLECLASS_TABS_TABLE_INACTIVE_DISABLED);
-				Element outerTBody = appendTableAndTBody(div, true, ""); //$NON-NLS-1$
-				Element outerTR = appendChildElement("tr", outerTBody); //$NON-NLS-1$
-				Element outerTD = appendChildElement("td", outerTR); //$NON-NLS-1$
-				Element innerTBody = appendTableAndTBody(outerTD, false, tableStyleClass);
-				appendStartColumn(innerTBody, index, selectedTabIndex);
-				outerTD = appendChildElement("td", outerTR); //$NON-NLS-1$
-				innerTBody = appendTableAndTBody(outerTD, false, tableStyleClass);
-				appendMidColumn(innerTBody, childCmdNavItem);
-				if (index + 1 != selectedTabIndex) {
-					outerTD = appendChildElement("td", outerTR); //$NON-NLS-1$
-					innerTBody = appendTableAndTBody(outerTD, false, tableStyleClass);
-					appendEndColumn(innerTBody, index, numChildCmdNavItems);
-				}
-				index++;
-			}
-		} else {
-			setEmptyNavPaneMessage(div);
-		}
-		return div;
-	}
-
-	private List<Element> getChildCmdNavItems(Element srcElement) {
-		List<Element> childCmdNavItems = new ArrayList<Element>();
-		NodeList childElements = srcElement.getElementsByTagNameNS(ITrinidadConstants.URI_CORE, "commandNavigationItem"); //$NON-NLS-1$$
-		if (childElements != null && childElements.getLength() > 0) {
-			for (int i = 0, len = childElements.getLength(); i < len; i++) {
-				childCmdNavItems.add((Element)childElements.item(i));
-			}
-		} else {
-			Element nodeStampFacet = getChildFacetByName(srcElement, "nodeStamp"); //$NON-NLS-1$
-			if (nodeStampFacet != null) {
-				childElements = nodeStampFacet.getElementsByTagNameNS(ITrinidadConstants.URI_CORE, "commandNavigationItem"); //$NON-NLS-1$
-				if (childElements != null && childElements.getLength() > 0) {
-					for (int i = 0, len = childElements.getLength(); i < len; i++) {
-						childCmdNavItems.add((Element)childElements.item(i));
-					}
-				}
-			}
-		}
-		return childCmdNavItems;
-	}
-
-	private String getHint(Element srcElement) {
-		String hint = srcElement.getAttribute("hint"); //$NON-NLS-1$
-		return hint != null ? hint : "bar"; //$NON-NLS-1$
-	}
-
-	private void setClassAndStyleAttributes(Element srcElement, String baseStyleClass, Element curElement) {
-		String styleClass = calculateStyleClass(baseStyleClass, srcElement);
-		if (styleClass != null) {
-			appendAttribute(curElement, "class", styleClass); //$NON-NLS-1$
-		}
-		String style = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (style != null) {
-			appendAttribute(curElement, "style", style); //$NON-NLS-1$
-		}
-	}
-
-	private void setEmptyNavPaneMessage(Element curElement) {
-		appendAttribute(curElement, "style", ITrinidadConstants.STYLE_EMPTYELEMENT); //$NON-NLS-1$
-		appendChildText(Messages.NavigationPaneOperation_EmptyNavigationPaneTag, curElement);
-	}
-
-	private Element appendTableAndTBody(Element parentElement, boolean isInline, String styleClass) {
-		Element table = appendChildElement("table", parentElement); //$NON-NLS-1$
-		appendAttribute(table, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(table, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(table, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (isInline) {
-			appendAttribute(table, "style", "display: inline;"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendAttribute(table, "class", styleClass); //$NON-NLS-1$
-		Element tbody = appendChildElement("tbody", table); //$NON-NLS-1$
-		return tbody;
-	}
-
-	private String determineStyleClass(
-			Element cmdNavItem,
-			String styleClass_ActiveEnabled,
-			String styleClass_ActiveDisabled,
-			String styleClass_InactiveEnabled,
-			String styleClass_InactiveDisabled) {
-		String styleClass;
-		if (CommandNavigationItemOperation.isSelected(cmdNavItem)) {
-			if (!CommandNavigationItemOperation.isDisabled(cmdNavItem)) {
-				styleClass = styleClass_ActiveEnabled;
-			} else {
-				styleClass = styleClass_ActiveDisabled;
-			}
-		} else {
-			if (!CommandNavigationItemOperation.isDisabled(cmdNavItem)) {
-				styleClass = styleClass_InactiveEnabled;
-			} else {
-				styleClass = styleClass_InactiveDisabled;
-			}
-		}
-		return styleClass;
-	}
-
-	private int determineSelectedTabIndex(List<Element> childCmdNavItems) {
-		int selectedTabIndex = -2;
-		int curTabIndex = 0;
-		for (Element childCmdNavItem: childCmdNavItems) {
-			if (CommandNavigationItemOperation.isSelected(childCmdNavItem)) {
-				selectedTabIndex = curTabIndex;
-				break;
-			}
-			curTabIndex++;
-		}
-		return selectedTabIndex;
-	}
-
-	private void appendStartColumn(Element parentTBody, int curTabIndex, int selectedTabIndex) {
-		String topTDStyleClass;
-		String bottomTDStyleClass;
-		String divStyleClass;
-		if (curTabIndex == 0) {
-			topTDStyleClass = STYLECLASS_TABS_TD_START;
-			bottomTDStyleClass = STYLECLASS_TABS_TD_BOTTOM_START;
-			divStyleClass = STYLECLASS_TABS_DIV_BOTTOM_START_CONTENT;
-		} else {
-			if (curTabIndex == selectedTabIndex) {
-				topTDStyleClass = STYLECLASS_TABS_TD_START_JOIN;
-				bottomTDStyleClass = STYLECLASS_TABS_TD_BOTTOM_START;
-				divStyleClass = STYLECLASS_TABS_DIV_BOTTOM_START_CONTENT;
-			} else {
-				if (curTabIndex == selectedTabIndex + 1) {
-					topTDStyleClass = STYLECLASS_TABS_TD_START_JOINFROMACTIVE;
-				} else {
-					topTDStyleClass = STYLECLASS_TABS_TD_START_JOINFROMINACTIVE;
-				}
-				bottomTDStyleClass = STYLECLASS_TABS_TD_BOTTOM_END;
-				divStyleClass = STYLECLASS_TABS_DIV_BOTTOM_MID_CONTENT;
-			}
-		}
-		Element topTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element topTD = appendChildElement("td", topTR); //$NON-NLS-1$
-		appendAttribute(topTD, "class", topTDStyleClass); //$NON-NLS-1$
-		Element bottomTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element bottomTD = appendChildElement("td", bottomTR); //$NON-NLS-1$
-		appendAttribute(bottomTD, "class", bottomTDStyleClass); //$NON-NLS-1$
-		Element div = appendChildElement("div", bottomTD); //$NON-NLS-1$
-		appendAttribute(div, "class", divStyleClass); //$NON-NLS-1$
-	}
-
-	private void appendMidColumn(Element parentTBody, Element cmdNavItem) {
-		Element topTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element topTD = appendChildElement("td", topTR); //$NON-NLS-1$
-		appendAttribute(topTD, "class", STYLECLASS_TABS_TD_MID); //$NON-NLS-1$
-		tagConverterContext.addChild(cmdNavItem, new ConvertPosition(topTD, 0));
-		Element bottomTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element bottomTD = appendChildElement("td", bottomTR); //$NON-NLS-1$
-		appendAttribute(bottomTD, "class", STYLECLASS_TABS_TD_BOTTOM_MID); //$NON-NLS-1$
-		Element div = appendChildElement("div", bottomTD); //$NON-NLS-1$
-		appendAttribute(div, "class", STYLECLASS_TABS_DIV_BOTTOM_MID_CONTENT); //$NON-NLS-1$
-	}
-
-	private void appendEndColumn(Element parentTBody, int curTabIndex, int numTabs) {
-		String topTDStyleClass;
-		String bottomTDStyleClass;
-		if (curTabIndex < numTabs - 1) {
-			topTDStyleClass = STYLECLASS_TABS_TD_END_JOINTOINACTIVE;
-			bottomTDStyleClass = STYLECLASS_TABS_TD_BOTTOM_END_JOIN;
-		} else {
-			topTDStyleClass = STYLECLASS_TABS_TD_END;
-			bottomTDStyleClass = STYLECLASS_TABS_TD_BOTTOM_END;
-		}
-		Element topTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element topTD = appendChildElement("td", topTR); //$NON-NLS-1$
-		appendAttribute(topTD, "class", topTDStyleClass); //$NON-NLS-1$
-		Element bottomTR = appendChildElement("tr", parentTBody); //$NON-NLS-1$
-		Element bottomTD = appendChildElement("td", bottomTR); //$NON-NLS-1$
-		appendAttribute(bottomTD, "class", bottomTDStyleClass); //$NON-NLS-1$
-		Element div = appendChildElement("div", bottomTD); //$NON-NLS-1$
-		appendAttribute(div, "class", STYLECLASS_TABS_DIV_BOTTOM_END_CONTENT); //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/OutputFormattedOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/OutputFormattedOperation.java
deleted file mode 100644
index d29e92e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/OutputFormattedOperation.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation specifically for the "outputFormatted" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class OutputFormattedOperation extends AbstractTrinidadTransformOperation {
-
-	/*
-	 * NOTICE (especially if looking for missing whitespace):
-	 * Because this operation can potentially return a mix of child Element
-	 * and Text nodes inside a span Element, it can suffer from bug #221629
-	 * (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=221629).
-	 * This operation is not the cause of the above-mentioned bug.
-	 */
-
-	private static final String STYLECLASS_INSTRUCTION = "AFInstructionText"; //$NON-NLS-1$
-	private static final String STYLECLASS_PAGESTAMP = "OraPageStampText"; //$NON-NLS-1$
-	private static final String STYLECLASS_INCONTEXTBRANDING = "p_InContextBrandingText"; //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		//create outer span element and set class attribute
-		Element spanElement = createElement("span"); //$NON-NLS-1$
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeWithRenameOperation,
-					new String[]{"inlineStyle", "style"}); //$NON-NLS-1$  //$NON-NLS-2$
-		operation.transform(srcElement, spanElement);
-
-		String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-		if (styleClass == null || styleClass.length() < 1) {
-			String styleUsage = srcElement.getAttribute("styleUsage"); //$NON-NLS-1$
-			if (styleUsage != null && styleUsage.length() > 8) {
-				if (styleUsage.equals("instruction")) { //$NON-NLS-1$
-					styleClass = STYLECLASS_INSTRUCTION;
-				} else if (styleUsage.equals("pageStamp")) { //$NON-NLS-1$
-					styleClass = STYLECLASS_PAGESTAMP;
-				} else if (styleUsage.equals("inContextBranding")) { //$NON-NLS-1$
-					styleClass = STYLECLASS_INCONTEXTBRANDING;
-				}
-			}
-		}
-		if (styleClass != null && styleClass.length() > 0) {
-			appendAttribute(spanElement, "class", styleClass); //$NON-NLS-1$
-		}
-
-		//deal with value
-		String value = srcElement.getAttribute("value"); //$NON-NLS-1$
-		if (value != null && value.length() > 0) {
-			StringBuffer wrappedValue = new StringBuffer();
-			wrappedValue.append("<?xml version=\"1.0\"?><value>"); //$NON-NLS-1$
-			wrappedValue.append(value);
-			wrappedValue.append("</value>"); //$NON-NLS-1$
-			InputStream inputStream = new ByteArrayInputStream(wrappedValue.toString().getBytes());
-			Element valueElement = getValueDocumentElement(inputStream);
-			if (valueElement != null) {
-				if (!appendValueNodes(spanElement, valueElement)) {
-					//remove any children added before appendValueNodes failed
-					NodeList childNodes = spanElement.getChildNodes();
-					for (int i = 0; i < childNodes.getLength(); i++) {
-						spanElement.removeChild(childNodes.item(i));
-					}
-					//set as simple text
-					appendChildText(value, spanElement);
-				}
-			} else {
-				//set as simple text
-				appendChildText(value, spanElement);
-			}
-		}
-
-		return spanElement;
-	}
-
-	private Element getValueDocumentElement(InputStream inputStream) {
-		Element element = null;
-		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-		//TODO: entity expansion should be set to false for ".jsp", true for ".jspx"
-		factory.setExpandEntityReferences(true);
-		try {
-			DocumentBuilder builder = factory.newDocumentBuilder();
-			Document document = builder.parse(inputStream);
-			element = document.getDocumentElement();
-		} catch(Exception e) {
-			//fail on any exception - text with markup will be rendered instead
-		}
-		return element;
-	}
-
-	private boolean appendValueNodes(Node parentNode, Node currentNode) {
-		boolean success = true;
-		try {
-			NodeList childNodes = currentNode.getChildNodes();
-			for (int i = 0; i < childNodes.getLength(); i++) {
-				Node childNode = childNodes.item(i);
-				if (childNode instanceof Element) {
-					//TODO: elements should be filtered to only create elements specified for this tag
-					Element newElement = (Element)parentNode.appendChild(
-						parentNode.getOwnerDocument().createElement(
-								childNode.getNodeName()));
-					NamedNodeMap attrMap = childNode.getAttributes();
-					if (attrMap != null) {
-						for (int j = 0; j < attrMap.getLength(); j++) {
-							Attr attr = (Attr)attrMap.item(j);
-							//TODO: attributes should be filtered to only create attributes specified for this tag
-							newElement.setAttribute(
-									attr.getName(), attr.getValue());
-						}
-					}
-					success &= appendValueNodes(newElement, childNode);
-				} else if (childNode instanceof Text) {
-					parentNode.appendChild(
-							parentNode.getOwnerDocument().createTextNode(
-									childNode.getTextContent()));
-				}
-			}
-		} catch(Exception e) {
-			//fail on any exception - text with markup will be rendered instead
-			success = false;
-		}
-		return success;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelFormLayoutOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelFormLayoutOperation.java
deleted file mode 100644
index 761893e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelFormLayoutOperation.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "panelFormLayout"
- * JSF Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelFormLayoutOperation extends AbstractTrinidadTransformOperation {
-
-	private static final String STYLECLASS_REQUIREDSPAN = "AFRequiredIconStyle"; //$NON-NLS-1$
-	private static final String STYLECLASS_GROUPSEPARATOR = "af_panelFormLayout_separator"; //$NON-NLS-1$
-	private static final String STYLECLASS_LABELCELL = "af_inputText_label af_panelFormLayout_label-cell"; //$NON-NLS-1$
-	private static final String STYLECLASS_FIELDCELL = "af_panelFormLayout_content-cell"; //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		//calculate required values
-		int columnCount = calculateColumnCount(srcElement);
-		int rowCount = calculateRowCount(srcElement);
-		String fieldWidth = calculateFieldWidth(srcElement);
-		String labelWidth = calculateLabelWidth(srcElement);
-
-		//initialize current column/row variables
-		int currentColumn = 1;
-		int currentRow = 1;
-		
-		//build outer table
-		Element outerTableElement = createElement("table"); //$NON-NLS-1$
-		String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-		if (styleClass != null && styleClass.length() > 0) {
-			appendAttribute(outerTableElement, "class", styleClass); //$NON-NLS-1$
-		}
-		String inlineStyle = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null && inlineStyle.length() > 0) {
-			appendAttribute(outerTableElement, "style", inlineStyle + ";width:100%;"); //$NON-NLS-1$ //$NON-NLS-2$
-		} else {
-			appendAttribute(outerTableElement, "style", "width:100%;"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendAttribute(outerTableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(outerTableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(outerTableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element outerTBodyElement = appendChildElement("tbody", outerTableElement); //$NON-NLS-1$
-		Element outerTopTRElement = appendChildElement("tr", outerTBodyElement); //$NON-NLS-1$
-
-		//build start of column
-		Element currentTBodyElement = buildColumnStart(outerTopTRElement, columnCount, currentColumn, labelWidth, fieldWidth);
-
-		//build controls
-		List<Element> childElements = getChildElementsSkipFacets(srcElement);
-		Iterator<Element> itChildElements = childElements.iterator();
-		while (itChildElements.hasNext()) {
-			Element childElement = itChildElements.next();
-			if (ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(
-					TagIdentifierFactory.createDocumentTagWrapper(childElement))) {
-				if (currentRow > 1) {
-					buildGroupSeparatorRow(currentTBodyElement);
-				}
-				List<Element> groupChildElements = getChildElementsSkipFacets(childElement);
-				Iterator<Element> itGroupChildElements = groupChildElements.iterator();
-				while (itGroupChildElements.hasNext()) {
-					Element groupChildElement = itGroupChildElements.next();
-					buildControlRow(groupChildElement, currentTBodyElement);
-				}
-				currentRow += groupChildElements.size();
-				if (currentRow <= rowCount) {
-					buildGroupSeparatorRow(currentTBodyElement);
-				}
-				if (currentRow > rowCount && currentColumn < columnCount) {
-					currentRow = 1;
-					currentColumn++;
-					currentTBodyElement = buildColumnStart(
-							outerTopTRElement, columnCount, currentColumn, labelWidth, fieldWidth);
-				}
-			} else {
-				buildControlRow(childElement, currentTBodyElement);
-				currentRow++;
-				if (currentRow > rowCount && currentColumn < columnCount) {
-					currentRow = 1;
-					currentColumn++;
-					currentTBodyElement = buildColumnStart(
-							outerTopTRElement, columnCount, currentColumn, labelWidth, fieldWidth);
-				}
-			}
-		}
-
-		//handle "footer" facet
-		Element footerElement = getChildFacetByName(srcElement, "footer"); //$NON-NLS-1$
-		if (footerElement != null) {
-			List<Element> footerChildElements = getChildElementsSkipFacets(footerElement);
-			if (footerChildElements.size() > 0) {
-				Element outerBottomTRElement = appendChildElement("tr", outerTBodyElement); //$NON-NLS-1$
-				currentTBodyElement = buildFooterStart(
-						outerBottomTRElement, columnCount, labelWidth);
-				rowCount = countChildElements(footerElement);
-				currentRow = 1;
-				Iterator<Element> itFooterChildElements = footerChildElements.iterator();
-				while (itFooterChildElements.hasNext()) {
-					Element footerChildElement = itFooterChildElements.next();
-					if (ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(
-							TagIdentifierFactory.createDocumentTagWrapper(footerChildElement))) {
-						if (currentRow > 1) {
-							buildGroupSeparatorRow(currentTBodyElement);
-						}
-						List<Element> groupFooterChildElements = getChildElementsSkipFacets(footerChildElement);
-						Iterator<Element> itGroupFooterChildElements = groupFooterChildElements.iterator();
-						while (itGroupFooterChildElements.hasNext()) {
-							Element groupFooterChildElement = itGroupFooterChildElements.next();
-							if (ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(
-									TagIdentifierFactory.createDocumentTagWrapper(groupFooterChildElement))) {
-								if (currentRow > 1) {
-									buildGroupSeparatorRow(currentTBodyElement);
-								}
-								List<Element> subGroupFooterChildElements = getChildElementsSkipFacets(groupFooterChildElement);
-								Iterator<Element> itSubGroupFooterChildElements = subGroupFooterChildElements.iterator();
-								while (itSubGroupFooterChildElements.hasNext()) {
-									Element subGroupFooterChildElement = itSubGroupFooterChildElements.next();
-									buildControlRow(subGroupFooterChildElement, currentTBodyElement, true);
-									currentRow++;
-								}
-								if (currentRow <= rowCount) {
-									buildGroupSeparatorRow(currentTBodyElement);
-								}
-							} else {
-								buildControlRow(groupFooterChildElement, currentTBodyElement, true);
-								currentRow++;
-							}
-						}
-						if (currentRow <= rowCount) {
-							buildGroupSeparatorRow(currentTBodyElement);
-						}
-					} else {
-						buildControlRow(footerChildElement, currentTBodyElement, true);
-						currentRow++;
-					}
-				}
-			}
-		}
-
-		return outerTableElement;
-	}
-
-	private int calculateRowCount(Element srcElement) {
-		int rowCount = Integer.MAX_VALUE;
-		int specifiedRows = Integer.MAX_VALUE;
-		String rows = srcElement.getAttribute("rows"); //$NON-NLS-1$
-		if (rows != null && rows.length() > 0) {
-			try {
-				//not spec'ed, but observed that setting rows < 5 is ignored
-				specifiedRows = Math.max(5, Integer.parseInt(rows));
-			} catch(NumberFormatException nfe) {
-				//ignore - specifiedRows will default to Integer.MAX_VALUE
-			}
-		}
-		int specifiedMaxColumns = Integer.MAX_VALUE;
-		String maxColumns = srcElement.getAttribute("maxColumns"); //$NON-NLS-1$
-		if (maxColumns != null && maxColumns.length() > 0) {
-			try {
-				specifiedMaxColumns = Integer.parseInt(maxColumns);
-			} catch(NumberFormatException nfe) {
-				//ignore - specifiedMaxColumns will default to Integer.MAX_VALUE
-			}
-		}
-		int childElementCount = countChildElements(srcElement);
-		int calculatedColumns = childElementCount / specifiedRows;
-		if (childElementCount % specifiedRows > 0) {
-			calculatedColumns++;
-		}
-		if (calculatedColumns > specifiedMaxColumns) {
-			rowCount = childElementCount / specifiedMaxColumns;
-		} else {
-			rowCount = specifiedRows;
-		}
-		return rowCount;
-	}
-
-	private int calculateColumnCount(Element srcElement) {
-		int columnCount = Integer.MAX_VALUE;
-		int specifiedRows = Integer.MAX_VALUE;
-		String rows = srcElement.getAttribute("rows"); //$NON-NLS-1$
-		if (rows != null && rows.length() > 0) {
-			try {
-				//not spec'ed, but observed that setting rows < 5 is ignored
-				specifiedRows = Math.max(5, Integer.parseInt(rows));
-			} catch(NumberFormatException nfe) {
-				//ignore - specifiedRows will default to Integer.MAX_VALUE
-			}
-		}
-		int specifiedMaxColumns = Integer.MAX_VALUE;
-		String maxColumns = srcElement.getAttribute("maxColumns"); //$NON-NLS-1$
-		if (maxColumns != null && maxColumns.length() > 0) {
-			try {
-				specifiedMaxColumns = Integer.parseInt(maxColumns);
-			} catch(NumberFormatException nfe) {
-				//ignore - specifiedMaxColumns will default to Integer.MAX_VALUE
-			}
-		}
-		int childElementCount = countChildElements(srcElement);
-		int calculatedColumns = childElementCount / specifiedRows;
-		if (childElementCount % specifiedRows > 0) {
-			calculatedColumns++;
-		}
-		columnCount = Math.min(specifiedMaxColumns, calculatedColumns);
-		return columnCount;
-	}
-
-	private int countChildElements(Element srcElement) {
-		int count = 0;
-		List<Element> childElements = getChildElementsSkipFacets(srcElement);
-		Iterator<Element> itChildElements = childElements.iterator();
-		while (itChildElements.hasNext()) {
-			Element childElement = itChildElements.next();
-			if (ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(
-					TagIdentifierFactory.createDocumentTagWrapper(childElement))) {
-				count += countChildElements(childElement);
-			} else {
-				count++;
-			}
-		}
-		return count;
-	}
-
-	private String calculateFieldWidth(Element srcElement) {
-		String width = null;
-		String fieldWidth = srcElement.getAttribute("fieldWidth"); //$NON-NLS-1$
-		if (fieldWidth != null && fieldWidth.length() > 0) {
-			width = fieldWidth;
-		} else {
-			String labelWidth = srcElement.getAttribute("labelWidth"); //$NON-NLS-1$
-			if (labelWidth != null && labelWidth.length() > 1) {
-				if (labelWidth.endsWith("%")) { //$NON-NLS-1$
-					try {
-						int iLabelWidth = Integer.parseInt(labelWidth.substring(0, labelWidth.length() - 1));
-						if (iLabelWidth <= 100) {
-							width = String.valueOf(100 - iLabelWidth) + "%"; //$NON-NLS-1$
-						}
-					} catch(NumberFormatException nfe) {
-						//ignore - cannot calculate and so will return null
-					}
-				}
-			}
-		}
-		return width;
-	}
-
-	private String calculateLabelWidth(Element srcElement) {
-		String width = null;
-		String labelWidth = srcElement.getAttribute("labelWidth"); //$NON-NLS-1$
-		if (labelWidth != null && labelWidth.length() > 0) {
-			width = labelWidth;
-		} else {
-			String fieldWidth = srcElement.getAttribute("fieldWidth"); //$NON-NLS-1$
-			if (fieldWidth != null && fieldWidth.length() > 1) {
-				if (fieldWidth.endsWith("%")) { //$NON-NLS-1$
-					try {
-						int iFieldWidth = Integer.parseInt(fieldWidth.substring(0, fieldWidth.length() - 1));
-						if (iFieldWidth <= 100) {
-							width = String.valueOf(100 - iFieldWidth) + "%"; //$NON-NLS-1$
-						}
-					} catch(NumberFormatException nfe) {
-						//ignore - cannot calculate and so will return null
-					}
-				}
-			}
-		}
-		return width;
-	}
-
-	private Element buildColumnStart(
-			Element parentElement, int columnCount, int currentColumn,
-			String labelWidth, String fieldWidth) {
-		Element tdElement = appendChildElement("td", parentElement); //$NON-NLS-1$
-		appendAttribute(tdElement, "style", "vertical-align:top;"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (currentColumn < columnCount) {
-			String width = String.valueOf(100 / columnCount) + "%"; //$NON-NLS-1$
-			appendAttribute(tdElement, "width", width); //$NON-NLS-1$
-		}
-		Element tableElement = appendChildElement("table", tdElement); //$NON-NLS-1$
-		appendAttribute(tableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "width", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element tBodyElement = appendChildElement("tbody", tableElement); //$NON-NLS-1$
-		Element trElement = appendChildElement("tr", tBodyElement); //$NON-NLS-1$
-		Element tdLabelElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		if (labelWidth != null && labelWidth.length() > 0) {
-			appendAttribute(tdLabelElement, "style", "width:" + labelWidth); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		Element tdFieldElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		if (fieldWidth != null && fieldWidth.length() > 0) {
-			appendAttribute(tdFieldElement, "style", "width:" + fieldWidth); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return tBodyElement;
-	}
-
-	private void buildControlRow(Element srcElement, Element parentElement, boolean alignLabelsTop) {
-		Element trElement = appendChildElement("tr", parentElement); //$NON-NLS-1$
-		Element tdLabelElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		appendAttribute(tdLabelElement, "class", STYLECLASS_LABELCELL); //$NON-NLS-1$
-		if (alignLabelsTop) {
-			appendAttribute(tdLabelElement, "valign", "top"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		appendAttribute(tdLabelElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		buildLabel(srcElement, tdLabelElement);
-		Element tdFieldElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		appendAttribute(tdFieldElement, "class", STYLECLASS_FIELDCELL); //$NON-NLS-1$
-		appendAttribute(tdFieldElement, "valign", "top"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdFieldElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		tagConverterContext.addChild(srcElement, new ConvertPosition(tdFieldElement, 0));
-	}
-
-	private void buildControlRow(Element srcElement, Element parentElement) {
-		buildControlRow(srcElement, parentElement, false);
-	}
-
-	private void buildLabel(Element srcElement, Element parentElement) {
-		TagIdentifier tagID = TagIdentifierFactory.createDocumentTagWrapper(srcElement);
-		if (
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTCOLOR) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTDATE) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTFILE) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTLISTOFVALUES) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTNUMBERSPINBOX) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_INPUTTEXT) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTBOOLEANCHECKBOX) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTBOOLEANRADIO) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTMANYCHECKBOX) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTMANYLISTBOX) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTONECHOICE) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTONELISTBOX) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTONERADIO) ||
-				tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_PANELLABELANDMESSAGE)) {
-			String required = srcElement.getAttribute("required"); //$NON-NLS-1$
-			String showRequired = srcElement.getAttribute("showRequired"); //$NON-NLS-1$
-			if (Boolean.parseBoolean(required) || Boolean.parseBoolean(showRequired)) {
-				Element spanElement = appendChildElement("span", parentElement); //$NON-NLS-1$
-				appendAttribute(spanElement, "title", "Required"); //$NON-NLS-1$ //$NON-NLS-2$
-				appendAttribute(spanElement, "class", STYLECLASS_REQUIREDSPAN); //$NON-NLS-1$
-				appendChildText("* ", spanElement); //$NON-NLS-1$
-			}
-			String label = srcElement.getAttribute("labelAndAccessKey"); //$NON-NLS-1$
-			if (label == null || label.length() < 1) {
-				label = srcElement.getAttribute("label"); //$NON-NLS-1$
-			}
-			if (label != null && label.length() > 0) {
-				Element labelElement = appendChildElement("label", parentElement); //$NON-NLS-1$
-				appendChildText(label, labelElement);
-			}
-		}
-	}
-
-	private void buildGroupSeparatorRow(Element parentElement) {
-		Element trElement = appendChildElement("tr", parentElement); //$NON-NLS-1$
-		Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		appendAttribute(tdElement, "colspan", "2"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element divElement = appendChildElement("div", tdElement); //$NON-NLS-1$
-		appendAttribute(divElement, "class", STYLECLASS_GROUPSEPARATOR); //$NON-NLS-1$
-	}
-
-	private Element buildFooterStart(
-			Element parentElement, int columnCount, String labelWidth) {
-		Element tdElement = appendChildElement("td", parentElement); //$NON-NLS-1$
-		appendAttribute(tdElement, "style", "vertical-align:top;"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdElement, "colspan", String.valueOf(columnCount)); //$NON-NLS-1$
-		Element tableElement = appendChildElement("table", tdElement); //$NON-NLS-1$
-		appendAttribute(tableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "width", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element tBodyElement = appendChildElement("tbody", tableElement); //$NON-NLS-1$
-		Element trElement = appendChildElement("tr", tBodyElement); //$NON-NLS-1$
-		String footerLabelWidth = null;
-		String footerFieldWidth = null;
-		if (labelWidth != null && labelWidth.length() > 0) {
-			if (labelWidth.endsWith("%")) { //$NON-NLS-1$
-				try {
-					int iLabelWidth = Integer.parseInt(labelWidth.substring(0, labelWidth.length() - 1));
-					iLabelWidth = iLabelWidth / columnCount;
-					footerLabelWidth = String.valueOf(iLabelWidth) + "%"; //$NON-NLS-1$
-					footerFieldWidth = String.valueOf(100 - iLabelWidth) + "%"; //$NON-NLS-1$
-				} catch(NumberFormatException nfe) {
-					//ignore - cannot calculate, widths remain null
-				}
-			} else {
-				footerLabelWidth = labelWidth;
-			}
-		}
-		Element tdLabelElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		if (footerLabelWidth != null && footerLabelWidth.length() > 0) {
-			//appendAttribute(tdLabelElement, "style", "width:" + footerLabelWidth); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdLabelElement, "width", footerLabelWidth); //$NON-NLS-1$
-		}
-		Element tdFieldElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		if (footerFieldWidth != null && footerFieldWidth.length() > 0) {
-			//appendAttribute(tdFieldElement, "style", "width:" + footerFieldWidth); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdFieldElement, "width", footerFieldWidth); //$NON-NLS-1$
-		}
-		return tBodyElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelGroupLayoutOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelGroupLayoutOperation.java
deleted file mode 100644
index cc303c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelGroupLayoutOperation.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation specifically for the "panelGroupLayout"
- * JSF Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelGroupLayoutOperation extends AbstractTrinidadTransformOperation {
-
-	private static final int LAYOUT_DEFAULT = 0;
-	private static final int LAYOUT_HORIZONTAL = 1;
-	private static final int LAYOUT_VERTICAL = 2;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		Element outerElement;
-
-		//create outer element and set element-specific attributes
-		final int layout = getLayout(srcElement);
-		Element containerElement;
-		switch (layout) {
-		case LAYOUT_HORIZONTAL:
-			outerElement = createElement("table"); //$NON-NLS-1$
-			outerElement.setAttribute("cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-			outerElement.setAttribute("cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-			outerElement.setAttribute("border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-			containerElement = appendChildElement("tr", outerElement); //$NON-NLS-1$
-			break;
-		case LAYOUT_VERTICAL:
-			outerElement = createElement("div"); //$NON-NLS-1$
-			containerElement = outerElement;
-			break;
-		default:
-			outerElement = createElement("span"); //$NON-NLS-1$
-			containerElement = outerElement;
-			break;
-		}
-
-		//set common attributes on outer element
-		final String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-		if (styleClass != null && styleClass.length() > 0) {
-			outerElement.setAttribute("class", styleClass); //$NON-NLS-1$
-		}
-		final String inlineStyle = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null && inlineStyle.length() > 0) {
-			outerElement.setAttribute("style", inlineStyle); //$NON-NLS-1$
-		}
-
-		//get child nodes, skipping "facet" elements and empty Text nodes
-		List<Node> childNodes = new ArrayList<Node>();
-		Iterator<Node> itCopyChildrenNodes = getCopyChildrenNodes(srcElement).iterator();
-		while (itCopyChildrenNodes.hasNext()) {
-			Node copyChildrenNode = itCopyChildrenNodes.next();
-			if (!(copyChildrenNode instanceof Element && TagIdentifierFactory.createDocumentTagWrapper((Element)copyChildrenNode).isSameTagType(IJSFConstants.TAG_IDENTIFIER_FACET))) {
-				if (!(copyChildrenNode instanceof Text && copyChildrenNode.getNodeValue().trim().length() < 1)) {
-					childNodes.add(copyChildrenNode);
-				}
-			}
-		}
-
-		//get "separator" facet's first child Element (only one used at runtime)
-		Element separatorElement = null;
-		final Element facetElement = getChildFacetByName(srcElement, "separator"); //$NON-NLS-1$
-		if (facetElement != null) {
-			NodeList facetChildNodes = facetElement.getChildNodes();
-			for (int i = 0; i < facetChildNodes.getLength(); i++) {
-				Node curChildNode = facetChildNodes.item(i);
-				if (curChildNode instanceof Element) {
-					separatorElement = (Element)curChildNode;
-					break;
-				}
-			}
-		}
-
-		//iterate over child nodes, interspersing separator(s) as required
-		int curChildNodeIndex = 0;
-		int curIndex = 0;
-		Iterator<Node> itChildNodes = childNodes.iterator();
-		switch (layout) {
-		case LAYOUT_HORIZONTAL:
-			while (itChildNodes.hasNext()) {
-				final Element childTDElement = appendChildElement("td", containerElement); //$NON-NLS-1$
-				tagConverterContext.addChild(itChildNodes.next(), new ConvertPosition(childTDElement, 0));
-				if (++curChildNodeIndex < childNodes.size()) {
-					if (separatorElement != null) {
-						final Element sepTDElement = appendChildElement("td", containerElement); //$NON-NLS-1$
-						tagConverterContext.addChild(separatorElement, new ConvertPosition(sepTDElement, 0));
-					}
-				}
-			}
-			break;
-		case LAYOUT_VERTICAL:
-			while (itChildNodes.hasNext()) {
-				tagConverterContext.addChild(itChildNodes.next(), new ConvertPosition(containerElement, curIndex++));
-				if (++curChildNodeIndex < childNodes.size()) {
-					final Element divElement = appendChildElement("div", containerElement); //$NON-NLS-1$
-					curIndex++;
-					if (separatorElement != null) {
-						tagConverterContext.addChild(separatorElement, new ConvertPosition(divElement, 0));
-					}
-				}
-			}
-			break;
-		default:
-			while (itChildNodes.hasNext()) {
-				tagConverterContext.addChild(itChildNodes.next(), new ConvertPosition(containerElement, curIndex++));
-				if (++curChildNodeIndex < childNodes.size()) {
-					if (separatorElement != null) {
-						tagConverterContext.addChild(separatorElement, new ConvertPosition(containerElement, curIndex++));
-					}
-				}
-			}
-			break;
-		}
-
-		return outerElement;
-	}
-
-	private int getLayout(Element srcElement) {
-		int layout = LAYOUT_DEFAULT;
-		if (srcElement != null) {
-			String layoutValue = srcElement.getAttribute("layout"); //$NON-NLS-1$
-			if (layoutValue != null) {
-				if (layoutValue.equals("horizontal")) { //$NON-NLS-1$
-					layout = LAYOUT_HORIZONTAL;
-				} else if (layoutValue.equals("vertical")) { //$NON-NLS-1$
-					layout = LAYOUT_VERTICAL;
-				}
-			}
-		}
-		return layout;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelLabelAndMessageOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelLabelAndMessageOperation.java
deleted file mode 100644
index 93d9f7a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelLabelAndMessageOperation.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the "panelLabelAndMessage"
- * JSF Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelLabelAndMessageOperation extends
-		AbstractLabelAndHelpOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		handleLabelStyle(srcElement, parentElement);
-		Element tableElement = appendChildElement("table", parentElement); //$NON-NLS-1$
-		appendAttribute(tableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element trElement = appendChildElement("tr", tableElement); //$NON-NLS-1$
-		Element tdElementLeft = appendChildElement("td", trElement); //$NON-NLS-1$
-		List<Node> childNodes = getCopyChildrenNodes(srcElement);
-		Iterator<Node> itChildNodes = childNodes.iterator();
-		int curIndex = 0;
-		while (itChildNodes.hasNext()) {
-			Node childNode = itChildNodes.next();
-			if (!(childNode instanceof Element &&
-					IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(
-							TagIdentifierFactory.createDocumentTagWrapper((Element)childNode)))) {
-				tagConverterContext.addChild(
-						childNode, new ConvertPosition(tdElementLeft, curIndex++));
-			}
-		}
-		Element tdElementRight = appendChildElement("td", trElement); //$NON-NLS-1$
-		Element endFacetElement = getChildFacetByName(srcElement, "end"); //$NON-NLS-1$
-		if (endFacetElement != null) {
-			tagConverterContext.addChild(
-					endFacetElement, new ConvertPosition(tdElementRight, 0));
-		}
-	}
-
-	private void handleLabelStyle(Element srcElement, Element parentElement) {
-		String labelStyle = srcElement.getAttribute("labelStyle"); //$NON-NLS-1$
-		if (labelStyle != null && labelStyle.length() > 0) {
-			if (parentElement.getPreviousSibling() instanceof Element) {
-				Element labelTDElement = (Element)parentElement.getPreviousSibling();
-				labelTDElement.removeAttribute("valign"); //$NON-NLS-1$
-				String style = labelTDElement.getAttribute("style"); //$NON-NLS-1$
-				if (style != null && style.length() > 0) {
-					if (!style.endsWith(";")) { //$NON-NLS-1$
-						style += ";"; //$NON-NLS-1$
-					}
-					style += labelStyle;
-					appendAttribute(labelTDElement, "style", style); //$NON-NLS-1$
-				} else {
-					appendAttribute(labelTDElement, "style", labelStyle); //$NON-NLS-1$
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelTabbedOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelTabbedOperation.java
deleted file mode 100644
index d270153..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/PanelTabbedOperation.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.TrinidadUtils;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the "panelTabbed" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelTabbedOperation extends AbstractTrinidadTransformOperation {
-
-	private static final int SEP_POS_BETWEEN = -1;
-	private static final int SEP_POS_START = 0;
-	private static final int SEP_POS_END = 1;
-
-	private static final String STYLECLASS_TABLE_ABOVE = "af_panelTabbed_orientation-top"; //$NON-NLS-1$
-	private static final String STYLECLASS_TABLE_BELOW = "af_panelTabbed_orientation-bottom"; //$NON-NLS-1$
-	private static final String STYLECLASS_SEPARATOR_START = "af_panelTabbed_cell-start"; //$NON-NLS-1$
-	private static final String STYLECLASS_SEPARATOR_END = "af_panelTabbed_cell-end"; //$NON-NLS-1$
-	private static final String STYLECLASS_CELL = "af_panelTabbed_tab-selected"; //$NON-NLS-1$
-	private static final String STYLECLASS_CELL_NOTDISCLOSED_OR_DISABLED = "af_panelTabbed_tab"; //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		//create outer span element and set style and class attributes
-		Element spanElement = createElement("span"); //$NON-NLS-1$
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeWithRenameOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$  //$NON-NLS-2$
-		operation.transform(srcElement, spanElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeWithRenameOperation,
-					new String[]{"inlineStyle", "style"}); //$NON-NLS-1$  //$NON-NLS-2$
-		operation.transform(srcElement, spanElement);
-
-		//get child showDetailItem elements
-		@SuppressWarnings("unchecked")
-		List<Node> showDetailItems = getChildElements(
-				srcElement, "showDetailItem"); //$NON-NLS-1$
-		if (showDetailItems.size() > 0) {
-
-			//determine tabs position ("both", "above", or "below" - default "both")
-			String tabsPosition = srcElement.getAttribute("position"); //$NON-NLS-1$
-			if (tabsPosition == null ||
-					!(tabsPosition.equalsIgnoreCase("above") || //$NON-NLS-1$
-					tabsPosition.equalsIgnoreCase("below"))) { //$NON-NLS-1$
-				tabsPosition = "both"; //$NON-NLS-1$
-			}
-
-			//need to track where showDetailItem is in relation to "tabs"
-			int showDetailItemConvertPosition = 0;
-
-			//write tabs "above" if specified
-			if ("above".equalsIgnoreCase(tabsPosition) || //$NON-NLS-1$
-					"both".equalsIgnoreCase(tabsPosition)) { //$NON-NLS-1$
-				appendTabs(srcElement, showDetailItems, spanElement, true);
-				showDetailItemConvertPosition++;
-			}
-
-			//copy current child showDetailItem
-			int currentEditorItem =
-				getCurrentShowDetailItem(srcElement, showDetailItems);
-			int curItem = 0;
-			Iterator<Node> itItems = showDetailItems.iterator();
-			while (itItems.hasNext()) {
-				Node nodeItem = itItems.next();
-				if (currentEditorItem == curItem) {
-					if (nodeItem instanceof Element) {
-						Element elemItem = (Element)nodeItem;
-						tagConverterContext.addChild(
-								elemItem,
-								new ConvertPosition(
-										spanElement,
-										showDetailItemConvertPosition));
-						break;
-					}
-				}
-				curItem++;
-			}
-
-			//write tabs "below" if specified
-			if ("below".equalsIgnoreCase(tabsPosition) || //$NON-NLS-1$
-					"both".equalsIgnoreCase(tabsPosition)) { //$NON-NLS-1$
-				appendTabs(srcElement, showDetailItems, spanElement, false);
-			}
-		} else {
-			appendAttribute(
-					spanElement,
-					"style", //$NON-NLS-1$
-					ITrinidadConstants.STYLE_EMPTYELEMENT);
-			appendChildText(
-					Messages.PanelTabbedOperation_EmptyPanelTabbedTag,
-					spanElement);
-		}
-			
-		return spanElement;
-	}
-
-	private void appendTabs(Element srcElement, List<Node> showDetailItems, Element spanElement, boolean above) {
-		Element tableElement = appendChildElement("table", spanElement); //$NON-NLS-1$
-		String tableStyleClass;
-		if (above) {
-			tableStyleClass = STYLECLASS_TABLE_ABOVE;
-		} else {
-			tableStyleClass = STYLECLASS_TABLE_BELOW;
-		}
-		appendAttribute(tableElement, "class", tableStyleClass); //$NON-NLS-1$
-		appendAttribute(tableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "width", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement, "summary", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		Element trElement = appendChildElement("tr", tableElement); //$NON-NLS-1$
-
-		//append first separator
-		appendSeparatorTD(trElement, SEP_POS_START);
-
-		int currentItem = getCurrentShowDetailItem(srcElement, showDetailItems);
-		int disclosedItem = calculateDisclosedShowDetailItem(showDetailItems);
-		int curItem = 0;
-
-		//iterate over showDetailItem elements
-		Iterator<Node> itItems = showDetailItems.iterator();
-		while (itItems.hasNext()) {
-			Node nodeItem = itItems.next();
-			if (nodeItem instanceof Element) {
-				Element elemItem = (Element)nodeItem;
-				appendShowDetailItemTD(
-						trElement,
-						elemItem,
-						currentItem == curItem,
-						disclosedItem == curItem);
-				if (curItem < showDetailItems.size() - 1) {
-					appendSeparatorTD(trElement);
-				}
-				curItem++;
-			}
-		}
-
-		//append last separator
-		appendSeparatorTD(trElement, SEP_POS_END);
-	}
-
-	private void appendSeparatorTD(Element trElement, int sepPosition) {
-		Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		if (sepPosition == SEP_POS_START) {
-			appendAttribute(tdElement, "class", STYLECLASS_SEPARATOR_START); //$NON-NLS-1$
-		} else if (sepPosition == SEP_POS_END) {
-			appendAttribute(tdElement, "class", STYLECLASS_SEPARATOR_END); //$NON-NLS-1$
-		}
-		Element bElement = appendChildElement("b", tdElement); //$NON-NLS-1$
-		appendAttribute(bElement, "style", "margin-left:0px;"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	private void appendSeparatorTD(Element trElement) {
-		appendSeparatorTD(trElement, SEP_POS_BETWEEN);
-	}
-
-	private void appendShowDetailItemTD(Element trElement, Element showDetailItem, boolean isCurrent, boolean isDisclosed) {
-		boolean isDisabled = false;
-		String attrShowDetailItemDisabled = showDetailItem.getAttribute("disabled"); //$NON-NLS-1$
-		if (Boolean.TRUE.toString().equalsIgnoreCase(attrShowDetailItemDisabled)) {
-			isDisabled = true;
-		}
-		Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-		appendAttribute(tdElement, "height", "1"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdElement, "nowrap", "nowrap"); //$NON-NLS-1$ //$NON-NLS-2$
-		String tdStyleClass;
-		if (isDisclosed && !isDisabled) {
-			tdStyleClass = STYLECLASS_CELL;
-		} else {
-			tdStyleClass = STYLECLASS_CELL_NOTDISCLOSED_OR_DISABLED;
-		}
-		appendAttribute(tdElement, "class", tdStyleClass); //$NON-NLS-1$
-		Element aElement = appendChildElement("a", tdElement); //$NON-NLS-1$
-		String aStyle;
-		if (isDisabled) {
-			appendAttribute(aElement, "name", "name"); //$NON-NLS-1$ //$NON-NLS-2$
-			aStyle = "color:#999999;"; //$NON-NLS-1$
-		} else {
-			appendAttribute(aElement, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
-			if (isDisclosed) {
-				aStyle = "color:#669966;text-decoration:none;"; //$NON-NLS-1$
-			} else {
-				aStyle = "color:#003333;"; //$NON-NLS-1$
-			}
-		}
-		if (isCurrent) {
-			aStyle += "border:1px solid #99cc99;padding:2px;"; //$NON-NLS-1$
-		}
-		String attrShowDetailItemInlineStyle = showDetailItem.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (attrShowDetailItemInlineStyle != null &&
-				attrShowDetailItemInlineStyle.length() > 0) {
-			aStyle += attrShowDetailItemInlineStyle;
-		}
-		if (aStyle.length() > 0) {
-			appendAttribute(aElement, "style", aStyle); //$NON-NLS-1$
-		}
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeWithRenameOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$ //$NON-NLS-2$
-		operation.transform(showDetailItem, aElement);
-		String attrShowDetailItemTextAndAccessKey = showDetailItem.getAttribute("textAndAccessKey"); //$NON-NLS-1$
-		if (attrShowDetailItemTextAndAccessKey != null &&
-				attrShowDetailItemTextAndAccessKey.length() > 0) {
-			appendChildText(attrShowDetailItemTextAndAccessKey, aElement);
-		} else {
-			String attrShowDetailItemText = showDetailItem.getAttribute("text"); //$NON-NLS-1$
-			if (attrShowDetailItemText != null && attrShowDetailItemText.length() > 0) {
-				appendChildText(attrShowDetailItemText, aElement);
-			}
-		}
-	}
-
-	private int getCurrentShowDetailItem(
-			Element srcElement, List<Node> showDetailItems) {
-		int disclosedItem = TrinidadUtils.getCurrentChildIndex(srcElement);
-		if (disclosedItem == -1) {
-			disclosedItem = calculateDisclosedShowDetailItem(showDetailItems);
-			TrinidadUtils.setCurrentChildIndex(srcElement, disclosedItem);
-		}
-		return disclosedItem;
-	}
-
-	private int calculateDisclosedShowDetailItem(List<Node> showDetailItems) {
-		int disclosedItem = -1;
-		int curItem = 0;
-		Iterator<Node> itItems = showDetailItems.iterator();
-		while (itItems.hasNext()) {
-			Node item = itItems.next();
-			if (item instanceof Element) {
-				Element elemItem = (Element)item;
-				String attrDisclosedVal = elemItem.getAttribute("disclosed"); //$NON-NLS-1$
-				if (Boolean.TRUE.toString().equalsIgnoreCase(
-						attrDisclosedVal)) {
-					disclosedItem = curItem;
-					break;
-				}
-			}
-			curItem++;
-		}
-		//if none explicitly disclosed, consider first non-disabled tab disclosed
-		if (disclosedItem == -1) {
-			curItem = 0;
-			itItems = showDetailItems.iterator();
-			while (itItems.hasNext()) {
-				Node item = itItems.next();
-				if (item instanceof Element) {
-					Element elemItem = (Element)item;
-					String attrDisabledVal = elemItem.getAttribute("disabled"); //$NON-NLS-1$
-					if (!(Boolean.TRUE.toString().equalsIgnoreCase(attrDisabledVal))) {
-						disclosedItem = curItem;
-						break;
-					}
-				}
-				curItem++;
-			}
-		}
-		//if none explicitly disclosed and all disabled, consider first tab disclosed
-		if (disclosedItem == -1) {
-			disclosedItem = 0;
-		}
-		return disclosedItem;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectBooleanOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectBooleanOperation.java
deleted file mode 100644
index 55ee08e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectBooleanOperation.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for any "selectBoolean..."
- * JSF Elements.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectBooleanOperation extends AbstractLabelAndHelpOperation {
-
-	private String inputType;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else {
-			inputType = getParameters()[0];
-		}
-		return super.transform(srcElement, curElement);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		Element spanElement = appendChildElement("span", parentElement); //$NON-NLS-1$
-		Element inputElement = appendChildElement("input", spanElement); //$NON-NLS-1$
-		appendAttribute(inputElement, "type", inputType); //$NON-NLS-1$
-		Element labelElement = appendChildElement("label", spanElement); //$NON-NLS-1$
-		String textAndAccessKey = srcElement.getAttribute("textAndAccessKey"); //$NON-NLS-1$
-		if (textAndAccessKey != null && textAndAccessKey.length() > 0) {
-			appendChildText(textAndAccessKey, labelElement);
-		} else {
-			String text = srcElement.getAttribute("text"); //$NON-NLS-1$
-			if (text != null) {
-				appendChildText(text, labelElement);
-			}
-		}
-		//append common attributes
-		appendAttribute(inputElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(inputElement, "style", contentStyle); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectListboxChoiceOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectListboxChoiceOperation.java
deleted file mode 100644
index 1e50769..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectListboxChoiceOperation.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItem;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItemModel;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for "selectManyListbox",
- * "selectOneListbox", and "selectOneChoice" JSF Elements.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectListboxChoiceOperation extends AbstractLabelAndHelpOperation {
-
-	private boolean isMultiple;
-	private boolean showSize;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else {
-			isMultiple = Boolean.parseBoolean(getParameters()[0]);
-			showSize = Boolean.parseBoolean(getParameters()[1]);
-		}
-		return super.transform(srcElement, curElement);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		Element selectElement = appendChildElement("select", parentElement); //$NON-NLS-1$
-		if (isMultiple) {
-			appendAttribute(selectElement, "multiple", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		List<SelectItem> selectItems = SelectItemModel.getModel(srcElement);
-		if (showSize) {
-			int size;
-			String attrSize = srcElement.getAttribute("size"); //$NON-NLS-1$
-			if (attrSize != null && attrSize.length() > 0) {
-				try {
-					size = Integer.parseInt(attrSize);
-				} catch(NumberFormatException nfe) {
-					size = 1;
-				}
-			} else {
-				size = 1;
-			}
-			size = Math.max(size, selectItems.size());
-			appendAttribute(selectElement, "size", String.valueOf(size)); //$NON-NLS-1$
-		}
-		boolean isFirstSelectItem = !isMultiple;
-		Iterator<SelectItem> itSelectItems = selectItems.iterator();
-		while (itSelectItems.hasNext()) {
-			SelectItem selectItem = itSelectItems.next();
-			Element optionElement = appendChildElement("option", selectElement); //$NON-NLS-1$
-			if (isFirstSelectItem) {
-				appendAttribute(optionElement, "selected", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				isFirstSelectItem = false;
-			}
-			appendChildText(selectItem.getLabel(), optionElement);
-		}
-		//append common attributes
-		appendAttribute(selectElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(selectElement, "style", contentStyle); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectManyCheckboxOneRadioOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectManyCheckboxOneRadioOperation.java
deleted file mode 100644
index a06a48c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectManyCheckboxOneRadioOperation.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItem;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItemModel;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for "selectManyCheckbox" and
- * "selectOneRadio" JSF Elements.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectManyCheckboxOneRadioOperation extends AbstractLabelAndHelpOperation {
-
-	private String inputType;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else {
-			inputType = getParameters()[0];
-		}
-		return super.transform(srcElement, curElement);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations.AbstractLabelAndHelpOperation#appendControl(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	protected void appendControl(Element srcElement, Element parentElement) {
-		Element spanElement = appendChildElement("span", parentElement); //$NON-NLS-1$
-		String layout = srcElement.getAttribute("layout"); //$NON-NLS-1$
-		List<SelectItem> selectItems = SelectItemModel.getModel(srcElement);
-		Iterator<SelectItem> itSelectItems = selectItems.iterator();
-		while (itSelectItems.hasNext()) {
-			SelectItem selectItem = itSelectItems.next();
-			Element inputElement = appendChildElement("input", spanElement); //$NON-NLS-1$
-			appendAttribute(inputElement, "type", inputType); //$NON-NLS-1$
-			Element labelElement = appendChildElement("label", spanElement); //$NON-NLS-1$
-			appendChildText(selectItem.getLabel(), labelElement);
-			if (layout == null || !layout.equals("horizontal")) { //$NON-NLS-1$
-				if (itSelectItems.hasNext()) {
-					appendChildElement("br", spanElement); //$NON-NLS-1$
-				}
-			}
-		}
-		//append common attributes
-		appendAttribute(spanElement, "class", STYLECLASS_CONTROLELEMENT); //$NON-NLS-1$
-		String contentStyle = calculateStyle(null, srcElement, "contentStyle"); //$NON-NLS-1$
-		if (contentStyle != null) {
-			appendAttribute(spanElement, "style", contentStyle); //$NON-NLS-1$
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectShuttleOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectShuttleOperation.java
deleted file mode 100644
index aa71833..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/SelectShuttleOperation.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItem;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.model.SelectItemModel;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for "selectManyShuttle" and
- * "selectOrderShuttle" JSF Elements.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectShuttleOperation extends AbstractTrinidadTransformOperation {
-
-	private static final String STYLECLASS_OUTERTABLE = "af_selectManyShuttle p_AFRequired"; //$NON-NLS-1$
-	private static final String STYLECLASS_HEADER = "OraShuttleHeader"; //$NON-NLS-1$
-	private static final String STYLECLASS_REQUIRED = "AFRequiredIconStyle"; //$NON-NLS-1$
-	private static final String STYLECLASS_LISTCOLUMN = "af_selectManyShuttle_box-content"; //$NON-NLS-1$
-	private static final String STYLECLASS_SELECT = "af_selectManyListbox_content"; //$NON-NLS-1$
-	private static final String STYLECLASS_DESCRIPTION = "AFInstructionText"; //$NON-NLS-1$
-	private static final String STYLECLASS_LINK = "OraLinkText"; //$NON-NLS-1$
-	private static final String DEFAULT_SIZE = "10"; //$NON-NLS-1$
-
-	private static final String[] LINKS_MOVE = new String[]{
-		Messages.SelectShuttleOperation_LinkMove,
-		Messages.SelectShuttleOperation_LinkMoveAll,
-		Messages.SelectShuttleOperation_LinkRemove,
-		Messages.SelectShuttleOperation_LinkRemoveAll
-	};
-	private static final String[] LINKS_ORDER = new String[]{
-		Messages.SelectShuttleOperation_LinkTop,
-		Messages.SelectShuttleOperation_LinkUp,
-		Messages.SelectShuttleOperation_LinkDown,
-		Messages.SelectShuttleOperation_LinkBottom
-	};
-
-	private boolean showOrderLinks;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-		//get parameter
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else {
-			showOrderLinks = Boolean.parseBoolean(getParameters()[0]);
-		}
-		
-		//build outer table element
-		Element outerTableElement = createElement("table"); //$NON-NLS-1$
-		appendAttribute(outerTableElement, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(outerTableElement, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(outerTableElement, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(outerTableElement, "width", "10%"); //$NON-NLS-1$ //$NON-NLS-2$
-		String inlineStyle = srcElement.getAttribute("inlineStyle"); //$NON-NLS-1$
-		if (inlineStyle != null && inlineStyle.length() > 0) {
-			appendAttribute(outerTableElement, "style", inlineStyle); //$NON-NLS-1$
-		}
-		String styleClass = srcElement.getAttribute("styleClass"); //$NON-NLS-1$
-		if (styleClass != null && styleClass.length() > 0) {
-			appendAttribute(outerTableElement, "class", styleClass + " " + STYLECLASS_OUTERTABLE); //$NON-NLS-1$ //$NON-NLS-2$
-		} else {
-			appendAttribute(outerTableElement, "class", STYLECLASS_OUTERTABLE); //$NON-NLS-1$
-		}
-
-		//build header row
-		Element trHeaderElement = appendChildElement("tr", outerTableElement); //$NON-NLS-1$
-		Element tdLeadingHeaderElement = appendChildElement("td", trHeaderElement); //$NON-NLS-1$
-		String leadingHeader = srcElement.getAttribute("leadingHeader"); //$NON-NLS-1$
-		if (leadingHeader != null && leadingHeader.length() > 0) {
-			appendAttribute(tdLeadingHeaderElement, "class", STYLECLASS_HEADER); //$NON-NLS-1$
-			appendAttribute(tdLeadingHeaderElement, "valign", "bottom"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendChildText(leadingHeader, tdLeadingHeaderElement);
-		}
-		appendChildElement("td", trHeaderElement); //$NON-NLS-1$
-		Element tdTrailingHeaderElement = appendChildElement("td", trHeaderElement); //$NON-NLS-1$
-		String required = srcElement.getAttribute("required"); //$NON-NLS-1$
-		String trailingHeader = srcElement.getAttribute("trailingHeader"); //$NON-NLS-1$
-		if ((required != null && Boolean.parseBoolean(required)) || (trailingHeader != null && trailingHeader.length() > 0)) {
-			appendAttribute(tdTrailingHeaderElement, "class", STYLECLASS_HEADER); //$NON-NLS-1$
-			appendAttribute(tdTrailingHeaderElement, "valign", "bottom"); //$NON-NLS-1$ //$NON-NLS-2$
-			if (required != null && Boolean.parseBoolean(required)) {
-				Element spanRequiredElement = appendChildElement("span", tdTrailingHeaderElement); //$NON-NLS-1$
-				appendAttribute(spanRequiredElement, "class", STYLECLASS_REQUIRED); //$NON-NLS-1$
-				appendChildText("*", spanRequiredElement); //$NON-NLS-1$
-			}
-			if (trailingHeader != null && trailingHeader.length() > 0) {
-				appendChildText(trailingHeader, tdTrailingHeaderElement);
-			}
-		}
-
-		//build content row
-		Element trContentElement = appendChildElement("tr", outerTableElement); //$NON-NLS-1$
-		buildListColumn(srcElement, trContentElement, true);
-		buildLinkColumn(trContentElement, LINKS_MOVE);
-		buildListColumn(srcElement, trContentElement, false);
-
-		return outerTableElement;
-	}
-
-	private void buildListColumn(Element srcElement, Element parentElement, boolean isLeadingColumn) {
-		//build outer structure
-		Element tdElement0 = appendChildElement("td", parentElement); //$NON-NLS-1$
-		Element tableElement0 = appendChildElement("table", tdElement0); //$NON-NLS-1$
-		appendAttribute(tableElement0, "style", "width:100%;"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement0, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement0, "cellspacing", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement0, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element tbodyElement0 = appendChildElement("tbody", tableElement0); //$NON-NLS-1$
-		Element trElement0 = appendChildElement("tr", tbodyElement0); //$NON-NLS-1$
-		Element tdElement1 = appendChildElement("td", trElement0); //$NON-NLS-1$
-		Element divElement0 = appendChildElement("div", tdElement1); //$NON-NLS-1$
-		appendAttribute(divElement0, "class", STYLECLASS_LISTCOLUMN); //$NON-NLS-1$
-		Element tableElement1 = appendChildElement("table", divElement0); //$NON-NLS-1$
-		appendAttribute(tableElement1, "cellpadding", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tableElement1, "border", "0"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		//build filter structure
-		if (isLeadingColumn) {
-			Element filterFacet = getChildFacetByName(srcElement, "filter"); //$NON-NLS-1$
-			if (filterFacet != null) {
-				Element trFilterElement = appendChildElement("tr", tableElement1); //$NON-NLS-1$
-				Element tdFilterElement = appendChildElement("td", trFilterElement); //$NON-NLS-1$
-				appendAttribute(tdFilterElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				appendAttribute(tdFilterElement, "valign", "middle"); //$NON-NLS-1$ //$NON-NLS-2$
-				appendAttribute(tdFilterElement, "colspan", "3"); //$NON-NLS-1$ //$NON-NLS-2$
-				tagConverterContext.addChild(filterFacet, new ConvertPosition(tdFilterElement, 0));
-			}
-		}
-
-		//build select element structure
-		Element trSelectElement = appendChildElement("tr", tableElement1); //$NON-NLS-1$
-		Element tdSelectElement = appendChildElement("td", trSelectElement); //$NON-NLS-1$
-		appendAttribute(tdSelectElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdSelectElement, "valign", "middle"); //$NON-NLS-1$ //$NON-NLS-2$
-		Element spanSelectElement = appendChildElement("span", tdSelectElement); //$NON-NLS-1$
-		Element selectElement = appendChildElement("select", spanSelectElement); //$NON-NLS-1$
-		appendAttribute(selectElement, "multiple", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(selectElement, "class", STYLECLASS_SELECT); //$NON-NLS-1$
-		appendAttribute(selectElement, "size", getSizeString(srcElement)); //$NON-NLS-1$
-
-		if (isLeadingColumn) {
-			List<SelectItem> selectItems = SelectItemModel.getModel(srcElement);
-			Iterator<SelectItem> itSelectItems = selectItems.iterator();
-			while (itSelectItems.hasNext()) {
-				SelectItem selectItem = itSelectItems.next();
-				Element optionElement = appendChildElement("option", selectElement); //$NON-NLS-1$
-				appendChildText(selectItem.getLabel(), optionElement);
-			}
-		}
-		Element optionElement = appendChildElement("option", selectElement); //$NON-NLS-1$
-		appendChildText("_______________", optionElement); //$NON-NLS-1$
-
-		//build order links
-		if (!isLeadingColumn && showOrderLinks) {
-			buildLinkColumn(trSelectElement, LINKS_ORDER);
-		}
-
-		//build description structure
-		boolean showDesc = false;
-		String showDescAttrName;
-		if (isLeadingColumn) {
-			showDescAttrName = "leadingDescShown"; //$NON-NLS-1$
-		} else {
-			showDescAttrName = "trailingDescShown"; //$NON-NLS-1$
-		}
-		String showDescAttr = srcElement.getAttribute(showDescAttrName);
-		if (showDescAttr != null && showDescAttr.length() > 0) {
-			showDesc = Boolean.parseBoolean(showDescAttr);
-		}
-		if (showDesc) {
-			Element trDescElement = appendChildElement("tr", tableElement1); //$NON-NLS-1$
-			Element tdDescElement = appendChildElement("td", trDescElement); //$NON-NLS-1$
-			appendAttribute(tdDescElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdDescElement, "valign", "middle"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdDescElement, "colspan", "3"); //$NON-NLS-1$ //$NON-NLS-2$
-			Element spanDescElement = appendChildElement("span", tdDescElement); //$NON-NLS-1$
-			appendAttribute(spanDescElement, "class", STYLECLASS_DESCRIPTION); //$NON-NLS-1$
-			appendChildText(Messages.SelectShuttleOperation_Description, spanDescElement);
-			appendChildElement("div", tdDescElement); //$NON-NLS-1$
-			Element textareaElement = appendChildElement("textarea", tdDescElement); //$NON-NLS-1$
-			appendAttribute(textareaElement, "rows", "2"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(textareaElement, "cols", "18"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(textareaElement, "readonly", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-
-		//build footer structure
-		String footerFacetName;
-		if (isLeadingColumn) {
-			footerFacetName = "leadingFooter"; //$NON-NLS-1$
-		} else {
-			footerFacetName = "trailingFooter"; //$NON-NLS-1$
-		}
-		Element footerFacet = getChildFacetByName(srcElement, footerFacetName); 
-		if (footerFacet != null) {
-			Element trFooterElement = appendChildElement("tr", tableElement1); //$NON-NLS-1$
-			Element tdFooterElement = appendChildElement("td", trFooterElement); //$NON-NLS-1$
-			appendAttribute(tdFooterElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdFooterElement, "valign", "middle"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(tdFooterElement, "colspan", "3"); //$NON-NLS-1$ //$NON-NLS-2$
-			tagConverterContext.addChild(footerFacet, new ConvertPosition(tdFooterElement, 0));
-		}
-	}
-
-	private void buildLinkColumn(Element parentElement, String[] linkText) {
-		Element tdElement = appendChildElement("td", parentElement); //$NON-NLS-1$
-		appendAttribute(tdElement, "align", "center"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdElement, "valign", "middle"); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdElement, "nowrap", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		appendAttribute(tdElement, "style", "padding:5px;"); //$NON-NLS-1$ //$NON-NLS-2$
-		for (int i = 0; i < linkText.length; i++) {
-			Element aElement = appendChildElement("a", tdElement); //$NON-NLS-1$
-			appendAttribute(aElement, "href", "#"); //$NON-NLS-1$ //$NON-NLS-2$
-			appendAttribute(aElement, "class", STYLECLASS_LINK); //$NON-NLS-1$
-			appendChildText(linkText[i], aElement);
-			if (i < linkText.length - 1) {
-				appendChildElement("br", tdElement); //$NON-NLS-1$
-			}
-		}
-	}
-
-	private String getSizeString(Element srcElement) {
-		String size = DEFAULT_SIZE;
-		String sizeAttr = srcElement.getAttribute("size"); //$NON-NLS-1$
-		if (sizeAttr != null && sizeAttr.length() > 0) {
-			try {
-				int iSize = Integer.parseInt(sizeAttr);
-				iSize = Math.max(iSize, 10);
-				iSize = Math.min(iSize, 20);
-				size = String.valueOf(iSize);
-			} catch(NumberFormatException nfe) {
-				//ignore - default of "10" will be returned
-			}
-		}
-		return size;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/ShowDetailItemOperation.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/ShowDetailItemOperation.java
deleted file mode 100644
index 4cc3952..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/converter/operations/ShowDetailItemOperation.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.converter.operations;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the "showDetailItem" JSF
- * Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ShowDetailItemOperation extends AbstractTrinidadTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	@Override
-	public Element transform(Element srcElement, Element curElement) {
-
-		/*
-		 * We need to represent showDetailItem as a container on the design
-		 * canvas, so we need to return a top-level element to contain converted
-		 * child elements. However, at runtime, it is the parent that renders
-		 * the container element for showDetailItem's children. Therefore, we
-		 * need to determine the parent element in order to know what top-level
-		 * element it will render at runtime. There's no obvious way to do this
-		 * using generic operations alone; hence, we need this specialization.
-		 */
-
-		Element topElement = null;
-
-		/*
-		 * create top-level element type, which may differ depending on parent
-		 * element
-		 */
-		Element parentSrcElement = getParentElement(srcElement);
-		if (ITrinidadConstants.TAG_IDENTIFIER_PANELTABBED.isSameTagType(
-				TagIdentifierFactory.createDocumentTagWrapper(parentSrcElement))) {
-			topElement = createElement("div"); //$NON-NLS-1$
-		} else {
-			//default to div element
-			topElement = createElement("div"); //$NON-NLS-1$
-		}
-
-		if (getCopyChildrenNodes(srcElement).size() > 0) {
-			//copy all children
-			tagConverterContext.copyChildren(srcElement, topElement);
-		} else {
-			appendAttribute(
-					topElement,
-					"style", //$NON-NLS-1$
-					ITrinidadConstants.STYLE_EMPTYELEMENT);
-			appendChildText(
-					Messages.ShowDetailItemOperation_EmptyShowDetailItemTag,
-					topElement);
-		}
-		return topElement;
-	}
-
-	private Element getParentElement(Node node) {
-		Element parentElement = null;
-		Node curNode = node;
-		while (curNode != null) {
-			curNode = curNode.getParentNode();
-			if (curNode instanceof Element) {
-				parentElement = (Element)curNode;
-				break;
-			}
-		}
-		return parentElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/dtresourceprovider/TrinidadDTResourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/dtresourceprovider/TrinidadDTResourceProvider.java
deleted file mode 100644
index 5664642..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/dtresourceprovider/TrinidadDTResourceProvider.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * Copyright (c) 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.dtresourceprovider;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collections;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.TrinidadTagSupportActivator;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DefaultDTResourceProvider;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DefaultDTSkin;
-
-public class TrinidadDTResourceProvider extends DefaultDTResourceProvider {
-
-	private static final String ID = "http://myfaces.apache.org/trinidad"; //$NON-NLS-1$
-
-	private static final String SKIN_MINIMAL = "minimal"; //$NON-NLS-1$
-	private static final String SKIN_SIMPLE = "simple"; //$NON-NLS-1$
-
-	private static final String STYLESHEET_MINIMAL = "/skinning/minimal.css"; //$NON-NLS-1$
-	private static final String STYLESHEET_SIMPLE = "/skinning/simple.css"; //$NON-NLS-1$
-
-	/**
-	 * Constructs an instance.
-	 */
-	public TrinidadDTResourceProvider() {
-		super(ID);
-		addSkin(createSkin(SKIN_MINIMAL, STYLESHEET_MINIMAL_URL, true));
-		addSkin(createSkin(SKIN_SIMPLE, STYLESHEET_SIMPLE_URL, false));
-	}
-
-	private DefaultDTSkin createSkin(String name, URL stylesheetURL, boolean isDefault) {
-		DefaultDTSkin skin = null;
-		if (stylesheetURL != null) {
-			skin = new DefaultDTSkin(name, Collections.singletonList(stylesheetURL));
-			skin.setDefault(isDefault);
-		} else {
-			TrinidadTagSupportActivator.logError(
-					Messages.TrinidadDTResourceProvider_StyleSheetNotLocated,
-					null);
-		}
-		return skin;
-	}
-
-	//here we try to ensure we can access stylesheets and referenced resources even when JARed
-	private static URL STYLESHEET_MINIMAL_URL;
-	private static URL STYLESHEET_SIMPLE_URL;
-	private static final String DTREZPROV_CACHE_DIRNAME = "dtRezProvCache"; //$NON-NLS-1$
-	private static final String URI_DIRNAME = "myfaces.apache.org_trinidad"; //$NON-NLS-1$
-	private static final String DIR_TO_COPY = "skinning/"; //$NON-NLS-1$
-	/**
-	 * Initializes the class.
-	 */
-	public static void init() {
-		//worst case - we get the stylesheets but no referenced resources (if plug-in is JARed)
-		try {
-			STYLESHEET_MINIMAL_URL = FileLocator.toFileURL(
-					TrinidadDTResourceProvider.class.getResource(STYLESHEET_MINIMAL));
-			STYLESHEET_SIMPLE_URL = FileLocator.toFileURL(
-					TrinidadDTResourceProvider.class.getResource(STYLESHEET_SIMPLE));
-		} catch(IOException ioe) {
-			//nothing to be done
-		}
-		try {
-			File bundleFile = FileLocator.getBundleFile(TrinidadTagSupportActivator.getDefault().getBundle());
-			if (bundleFile.isFile()) {
-				//plug-in is JARed
-				try {
-					File stateLocation = TrinidadTagSupportActivator.getDefault().getStateLocation().toFile();
-					File dtRezProvCacheDir = new File(stateLocation, DTREZPROV_CACHE_DIRNAME);
-					File targetDir = new File(dtRezProvCacheDir, URI_DIRNAME);
-					wipeDir(targetDir);
-					if (targetDir.mkdirs()) {
-						FileInputStream fis = null;
-						JarInputStream jis = null;
-						FileOutputStream fos = null;
-						try {
-							fis = new FileInputStream(bundleFile);
-							jis = new JarInputStream(fis, false);
-							JarEntry jarEntry = jis.getNextJarEntry();
-							while (jarEntry != null) {
-								String name = jarEntry.getName();
-								if (name != null && name.startsWith(DIR_TO_COPY)) {
-									File targetFile = new File(targetDir, name);
-									if (!jarEntry.isDirectory()) {
-										File parentDir = targetFile.getParentFile();
-										if (parentDir != null && !parentDir.exists()) {
-											parentDir.mkdirs();
-										}
-										if (targetFile.createNewFile()) {
-											fos = new FileOutputStream(targetFile);
-											byte[] buf = new byte[1024];
-											int bytesRead = jis.read(buf, 0, 1024);
-											while (bytesRead > 0) {
-												fos.write(buf, 0, bytesRead);
-												bytesRead = jis.read(buf, 0, 1024);
-											}
-										}
-									}
-								}
-								jarEntry = jis.getNextJarEntry();
-							}
-						} catch(IOException ioe) {
-							//do nothing, we fall back on stylesheet without referenced resources
-						} finally {
-							if (fos != null) {
-								fos.close();
-							}
-							if (jis != null) {
-								jis.close();
-							}
-							if (fis != null) {
-								fis.close();
-							}
-						}
-					}
-					File minimalStylesheet = new File(targetDir, STYLESHEET_MINIMAL);
-					if (minimalStylesheet.exists()) {
-						STYLESHEET_MINIMAL_URL = minimalStylesheet.toURL();
-					}
-					File simpleStylesheet = new File(targetDir, STYLESHEET_SIMPLE);
-					if (simpleStylesheet.exists()) {
-						STYLESHEET_SIMPLE_URL = simpleStylesheet.toURL();
-					}
-				} catch(IllegalStateException ise) {
-					//do nothing, we fall back on stylesheet without referenced resources
-				}
-			}
-		} catch(IOException ioe) {
-			//do nothing, we fall back on stylesheet without referenced resources
-		}
-	}
-
-	private static void wipeDir(File targetDir) {
-		if (targetDir != null && targetDir.exists()) {
-			File[] files = targetDir.listFiles();
-			for (File file: files) {
-				if (file.isFile()) {
-					file.delete();
-				} else {
-					wipeDir(file);
-				}
-			}
-			targetDir.delete();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/el/TrinidadDecorativeVariableResolver.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/el/TrinidadDecorativeVariableResolver.java
deleted file mode 100644
index d9c6c29..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/el/TrinidadDecorativeVariableResolver.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.el;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
-import org.eclipse.jst.jsf.context.symbol.ISymbol;
-import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
-import org.eclipse.jst.jsf.designtime.el.AbstractDTVariableResolver;
-import org.eclipse.jst.jsf.designtime.el.IDecorativeResolver;
-import org.eclipse.jst.jsf.designtime.symbols.JSFSymbolFactory;
-
-/**
- * A decorative dt variable resolver that shadows Trinidad's runtime resolver.
- * 
- * @author cbateman
- * 
- */
-public class TrinidadDecorativeVariableResolver extends
-        AbstractDTVariableResolver implements IDecorativeResolver
-{
-    private final static JSFSymbolFactory _symbolFactory                = new JSFSymbolFactory();
-
-    public final static String            PAGE_FLOW_SCOPE_VARIABLE_NAME = "pageFlowScope"; //$NON-NLS-1$
-    public final static String            PROCESS_SCOPE_VARIABLE_NAME   = "processScope"; //$NON-NLS-1$
-
-    public final static String            REQUEST_CONTEXT_VARIABLE_NAME = "requestContext"; //$NON-NLS-1$
-    public final static String            REQUEST_CONTEXT_CLASS_NAME    = "org.apache.myfaces.trinidad.context.RequestContext"; //$NON-NLS-1$
-
-    @Override
-    public ISymbol[] getAllVariables(final DTFacesContext facesContext,
-            final IAdaptable externalContextKey)
-    {
-        final Map<String, ISymbol> symbols = createSymbols(facesContext);
-        return symbols.values().toArray(ISymbol.EMPTY_SYMBOL_ARRAY);
-    }
-
-    @Override
-    public ISymbol resolveVariable(final DTFacesContext context,
-            final String name, final IAdaptable externalContextKey)
-    {
-        return createSymbols(context).get(name);
-    }
-
-    private Map<String, ISymbol> createSymbols(final DTFacesContext context)
-    {
-        final IResource res = context.adaptContextObject();
-
-        if (res != null)
-        {
-            final IProject project = res.getProject();
-            if (project != null)
-            {
-                final Map<String, ISymbol> symbols = new HashMap<String, ISymbol>();
-
-                final ISymbol requestContextVar = _symbolFactory
-                        .createBeanOrUnknownInstanceSymbol(project,
-                                REQUEST_CONTEXT_CLASS_NAME,
-                                PAGE_FLOW_SCOPE_VARIABLE_NAME,
-                                ERuntimeSource.OTHER_LITERAL);
-                symbols.put(REQUEST_CONTEXT_VARIABLE_NAME, requestContextVar);
-                
-                // both pageFlowScope and processScope return the same variable
-                // TODO: we may be able to populate this map
-                final ISymbol pageFlowVar = _symbolFactory
-                        .createUnknownInstanceSymbol(
-                                PAGE_FLOW_SCOPE_VARIABLE_NAME,
-                                ERuntimeSource.OTHER_LITERAL);
-                symbols.put(PAGE_FLOW_SCOPE_VARIABLE_NAME, pageFlowVar);
-                final ISymbol processScopeVar = _symbolFactory
-                .createUnknownInstanceSymbol(
-                        PROCESS_SCOPE_VARIABLE_NAME,
-                        ERuntimeSource.OTHER_LITERAL);
-                symbols.put(PROCESS_SCOPE_VARIABLE_NAME, processScopeVar);
-                return symbols;
-            }
-        }
-        return Collections.emptyMap(); 
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/DefaultTrinidadCoreElementEdit.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/DefaultTrinidadCoreElementEdit.java
deleted file mode 100644
index a12ea8e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/DefaultTrinidadCoreElementEdit.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
-
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-
-/**
- * Default IElementEdit implementation for Trinidad core tag library.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultTrinidadCoreElementEdit extends AbstractElementEdit {
-
-	/*
-	 * Currently no default behaviour, but likely we will add some.
-	 * Delete this comment when functionality added.
-	 */
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelFormLayoutChildElementEdit.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelFormLayoutChildElementEdit.java
deleted file mode 100644
index 47b376f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelFormLayoutChildElementEdit.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.w3c.dom.Element;
-
-/**
- * IElementEdit implementation for Trinidad tags that are potentially children
- * of the panelFormLayout tag, and therefore may need to refresh panelFormLayout
- * on model change.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelFormLayoutChildElementEdit extends
-		DefaultTrinidadCoreElementEdit {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#handleModelChange(org.w3c.dom.Element, org.eclipse.jst.pagedesigner.parts.ElementEditPart, boolean)
-	 */
-	@Override
-	public boolean handleModelChange(Element ele, ElementEditPart part,
-			boolean recursive) {
-		boolean handled = false;
-		EditPart parentPart = part.getParent();
-		while (parentPart instanceof ElementEditPart) {
-			ElementEditPart parentElementEditPart = (ElementEditPart)parentPart;
-			TagIdentifier tagID = parentElementEditPart.getTagIdentifier();
-			if (tagID != null) {
-				if (ITrinidadConstants.TAG_IDENTIFIER_PANELFORMLAYOUT.isSameTagType(tagID)) {
-					parentElementEditPart.refreshModelChange(recursive);
-					handled = true;
-					break;
-				} else if (
-						ITrinidadConstants.TAG_IDENTIFIER_GROUP.isSameTagType(tagID) ||
-						IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(tagID)) {
-					parentPart = parentPart.getParent();
-				} else {
-					break;
-				}
-			}
-		}
-		return handled;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelTabbedElementEdit.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelTabbedElementEdit.java
deleted file mode 100644
index dc086aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/PanelTabbedElementEdit.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.TrinidadUtils;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.editpolicies.DragMoveEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tools.ObjectModeDragTracker;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DefaultPositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * IElementEdit implementation for Trinidad's panelTabbed tag.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelTabbedElementEdit extends DefaultTrinidadCoreElementEdit {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	@Override
-	public void createEditPolicies(ElementEditPart part) {
-		part.installEditPolicy(
-				EditPolicy.SELECTION_FEEDBACK_ROLE,
-				new PanelTabbedElementResizableEditPolicy());
-		part.installEditPolicy(
-				EditPolicy.PRIMARY_DRAG_ROLE,
-				new PanelTabbedDragMoveEditPolicy());
-		part.installEditPolicy(
-				ItemCreationRequest.REQ_ITEM_CREATION,
-				new PanelTabbedItemCreationEditPolicy());
-	}
-
-	/**
-	 * Extends ElementResizableEditPolicy to determine if tab is clicked and
-	 * respond accordingly.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	public static class PanelTabbedElementResizableEditPolicy extends ElementResizableEditPolicy {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy#getSelectionDragTracker(org.eclipse.gef.requests.LocationRequest)
-		 */
-		@Override
-		public DragTracker getSelectionDragTracker(LocationRequest request) {
-			return getSelectionTracker(request);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy#getSelectionTracker(org.eclipse.gef.requests.LocationRequest)
-		 */
-		@Override
-		protected DragTracker getSelectionTracker(LocationRequest request) {
-			final GraphicalEditPart part = (GraphicalEditPart)getHost();
-			if (part instanceof NodeEditPart) {
-				final Node node = ((NodeEditPart)part).getDOMNode();
-				if (getShowDetailItemCount(node) > 0) {
-					ObjectModeDragTracker dragTracker = new ObjectModeDragTracker(getHost()) {
-						protected boolean handleButtonDown(int button) {
-							if (button == 1) {
-								final int tabIndex = getTabIndex(getLocation());
-								final EditPart editPart = getSourceEditPart();
-								if (editPart instanceof ElementEditPart) {
-									final Node node = ((ElementEditPart)editPart).getDOMNode();
-									if (TrinidadUtils.setCurrentChildIndex(node, tabIndex)) {
-										((ElementEditPart)editPart).refresh(true);
-									}
-								}
-							}
-							return super.handleButtonDown(button);
-						}
-					};
-					return dragTracker;
-				}
-			}
-			return new ObjectModeDragTracker(getHost());
-		}
-
-		private int getTabIndex(Point location) {
-			int tabIndex = -1;
-			final GraphicalEditPart part = (GraphicalEditPart)getHost();
-			if (part instanceof NodeEditPart) {
-				final Node node = ((NodeEditPart)part).getDOMNode();
-				final IFigure figure = part.getFigure();
-				Point relLocation = location.getCopy();
-				figure.translateToRelative(relLocation);
-				final int showDetailItemCount = getShowDetailItemCount(node);
-				if (showDetailItemCount > 0) {
-					final int tabWidth = figure.getBounds().width / showDetailItemCount;
-					tabIndex = relLocation.x / tabWidth;
-					if (tabIndex > showDetailItemCount - 1) {
-						tabIndex = showDetailItemCount - 1;
-					}
-				}
-			}
-			return tabIndex;
-		}
-
-		private int getShowDetailItemCount(Node node) {
-			int count = 0;
-			if (node != null) {
-				NodeList childNodes = node.getChildNodes();
-				for (int i = 0; i < childNodes.getLength(); i++) {
-					Node childNode = childNodes.item(i);
-					if (childNode instanceof Element) {
-						if (ITrinidadConstants.TAG_IDENTIFIER_SHOWDETAILITEM.isSameTagType(
-								TagIdentifierFactory.createDocumentTagWrapper((Element)childNode))) {
-							count++;
-						}
-					}
-				}
-			}
-			return count;
-		}
-
-	}
-
-	/**
-	 * Extends DragMoveEditPolicy to add OnlyShowDetailItemsRule as a rule.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	public static class PanelTabbedDragMoveEditPolicy extends DragMoveEditPolicy {
-
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy#createDropChildValidator(org.eclipse.gef.requests.DropRequest)
-		 */
-		@Override
-		protected IPositionMediator createDropChildValidator(DropRequest r) {
-			DropData dropData = createDropData(r);
-			if (dropData != null) {
-				DnDPositionValidator validator = 
-					new DnDPositionValidator(new DropActionData(
-							ActionData.COMPONENT_MOVE, dropData));
-				validator.addRule(new OnlyShowDetailItemsRule(validator.getActionData()));
-				return validator;
-			}
-			return null;
-		}
-
-	}
-
-	/**
-	 * Extends ItemCreationEditPolicy to add OnlyShowDetailItemsRule as a rule.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	public static class PanelTabbedItemCreationEditPolicy extends ItemCreationEditPolicy {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy#createDropChildValidator(org.eclipse.gef.requests.DropRequest)
-		 */
-		@Override
-		protected IPositionMediator createDropChildValidator(DropRequest r) {
-			DropData dropData = createDropData(r);
-			if (dropData != null) {
-				DnDPositionValidator validator = 
-					new DnDPositionValidator(new DropActionData(
-							ActionData.PALETTE_DND, dropData));
-				validator.addRule(new OnlyShowDetailItemsRule(validator.getActionData()));
-				return validator;
-			}
-			return null;
-		}
-
-	}
-
-	/**
-	 * Extends DefaultPositionRule to only allow showDetailItem tags to be
-	 * dropped on panelTabbed tag.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	private static class OnlyShowDetailItemsRule extends DefaultPositionRule {
-
-		/**
-		 * Instantiates an instance.
-		 * 
-		 * @param actionData ActionData instance.
-		 */
-		public OnlyShowDetailItemsRule(ActionData actionData) {
-			super(actionData);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.validation.caret.DefaultPositionRule#isEditable(org.eclipse.jst.pagedesigner.validation.caret.Target)
-		 */
-		@Override
-		public boolean isEditable(Target target) {
-			if (ITrinidadConstants.TAG_IDENTIFIER_PANELTABBED.isSameTagType(
-					target.getTagWrapper())) {
-				return isDataDroppable();
-			}
-			return true;
-		}
-
-		private boolean isDataDroppable() {
-			ActionData actionData = getActionData();
-			if (actionData instanceof DropActionData) {
-				DropActionData dropActionData = (DropActionData)actionData;
-				TagIdentifier tagIdentifier = 
-					(TagIdentifier)dropActionData.getDropData().getTagIdentifiers().get(0);
-				if (ITrinidadConstants.TAG_IDENTIFIER_SHOWDETAILITEM.isSameTagType(
-						tagIdentifier)) {
-					return true;
-				}
-			}
-			return false;
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/ShowDetailItemElementEdit.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/ShowDetailItemElementEdit.java
deleted file mode 100644
index f0ba5bd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/ShowDetailItemElementEdit.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.w3c.dom.Element;
-
-/**
- * IElementEdit implementation for Trinidad's showDetailItem tag.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ShowDetailItemElementEdit extends DefaultTrinidadCoreElementEdit {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#handleModelChange(org.w3c.dom.Element, org.eclipse.jst.pagedesigner.parts.ElementEditPart, boolean)
-	 */
-	@Override
-	public boolean handleModelChange(
-			Element ele, ElementEditPart part, boolean recursive) {
-		boolean handled = false;
-		EditPart parentPart = part.getParent();
-		if (parentPart instanceof ElementEditPart) {
-			((ElementEditPart)parentPart).refreshModelChange(recursive);
-			handled = true;
-		}
-		return handled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#getDropRequestorLocationStrategy(org.eclipse.jst.jsf.common.dom.TagIdentifier, org.eclipse.gef.EditPartViewer)
-	 */
-	@Override
-	public IDropLocationStrategy getDropRequestorLocationStrategy(
-			TagIdentifier tag, EditPartViewer viewer) {
-		return new ShowDetailItemDropLocationStrategy(viewer);
-	}
-
-	/**
-	 * Extends DefaultDropLocationStrategy.
-	 * 
-	 * @author Ian Trimble - Oracle
-	 */
-	private static class ShowDetailItemDropLocationStrategy extends DefaultDropLocationStrategy {
-
-		/**
-		 * Instantiates an instance.
-		 * 
-		 * @param viewer EditPartViewer instance.
-		 */
-		public ShowDetailItemDropLocationStrategy(EditPartViewer viewer) {
-			super(viewer);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy#calculateDesignPosition(org.eclipse.gef.EditPart, org.eclipse.draw2d.geometry.Point, org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator)
-		 */
-		@Override
-		public DesignPosition calculateDesignPosition(
-				EditPart host, Point p, IPositionMediator validator) {
-			DesignPosition position = null;
-			//check if host is editable or get nearest editable ancestor
-			host = validator.getEditableContainer(new Target(host));
-			if (host instanceof ElementEditPart) {
-				final TagIdentifier hostTagId =
-					((ElementEditPart)host).getTagIdentifier();
-				if (ITrinidadConstants.TAG_IDENTIFIER_PANELTABBED.isSameTagType(hostTagId)) {
-					final int showDetailItemCount = host.getChildren().size();
-					position = new DesignPosition(host, showDetailItemCount);
-					if (!validator.isValidPosition(position)) {
-						position = null;
-					}
-				}
-			}
-			return position;
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/TrinidadCoreElementEditFactory.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/TrinidadCoreElementEditFactory.java
deleted file mode 100644
index 3a1d3c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/elementedit/TrinidadCoreElementEditFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.elementedit;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEditFactory;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-
-/**
- * AbstractElementEditFactory extension for Trinidad core tag library.
- * 
- * @author Ian Trimble - Oracle
- */
-public class TrinidadCoreElementEditFactory extends AbstractElementEditFactory {
-
-	/**
-	 * Instantiates an instance, with ITrinidadConstants.URI_CORE as the
-	 * supported URI.
-	 */
-	public TrinidadCoreElementEditFactory() {
-		super(ITrinidadConstants.URI_CORE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEditFactory#createElementEdit(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-	 */
-	public IElementEdit createElementEdit(final TagIdentifier tagIdentifier) {
-		if (ITrinidadConstants.TAG_IDENTIFIER_PANELTABBED.isSameTagType(tagIdentifier)) {
-			return new PanelTabbedElementEdit();
-		} else if (ITrinidadConstants.TAG_IDENTIFIER_SHOWDETAILITEM.isSameTagType(tagIdentifier)) {
-			return new ShowDetailItemElementEdit();
-		} else if (
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTCOLOR.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTDATE.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTFILE.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTLISTOFVALUES.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTNUMBERSPINBOX.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_INPUTTEXT.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTBOOLEANCHECKBOX.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTBOOLEANRADIO.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTMANYCHECKBOX.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTMANYLISTBOX.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTONECHOICE.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTONELISTBOX.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_SELECTONERADIO.isSameTagType(tagIdentifier) ||
-				ITrinidadConstants.TAG_IDENTIFIER_PANELLABELANDMESSAGE.isSameTagType(tagIdentifier)
-				) {
-			return new PanelFormLayoutChildElementEdit();
-		} else {
-			return new DefaultTrinidadCoreElementEdit();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/messages.properties
deleted file mode 100644
index 28fafc3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/messages.properties
+++ /dev/null
@@ -1,31 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-#
-###############################################################################
-BreadCrumbsOperation_EmptyBreadCrumbsTag=Empty breadCrumbs tag - add child commandNavigationItem tags or set nodeStamp facet
-NavigationPaneOperation_EmptyNavigationPaneTag=Empty navigationPane tag - add child commandNavigationItem tags or set nodeStamp facet
-PanelTabbedOperation_EmptyPanelTabbedTag=Empty panelTabbed tag - add child showDetailItem tags
-ShowDetailItemOperation_EmptyShowDetailItemTag=Empty showDetailItem tag - add children
-SelectItemModel_SampleItem1Label=Sample Label 1
-SelectItemModel_SampleItem1Value=Sample Value 1
-SelectItemModel_SampleItem2Label=Sample Label 2 
-SelectItemModel_SampleItem2Value=Sample Value 2
-SelectItemModel_SampleItem3Label=Sample Label 3
-SelectItemModel_SampleItem3Value=Sample Value 3
-SelectShuttleOperation_Description=Description
-SelectShuttleOperation_LinkMove=Move
-SelectShuttleOperation_LinkMoveAll=Move All
-SelectShuttleOperation_LinkRemove=Remove
-SelectShuttleOperation_LinkRemoveAll=Remove All
-SelectShuttleOperation_LinkTop=Top
-SelectShuttleOperation_LinkUp=Up
-SelectShuttleOperation_LinkDown=Down
-SelectShuttleOperation_LinkBottom=Bottom
-TrinidadDTResourceProvider_StyleSheetNotLocated=StyleSheet could not be located
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItem.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItem.java
deleted file mode 100644
index f6a06bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItem.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.model;
-
-/**
- * A simplified representation of a "selectItem" tag's most useful properties.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectItem {
-
-	private String label;
-	private String value;
-
-	/**
-	 * Creates an instance.
-	 * 
-	 * @param label The label.
-	 * @param value The value.
-	 */
-	public SelectItem(String label, String value) {
-		setLabel(label);
-		setValue(value);
-	}
-
-	/**
-	 * Sets the label of this instance.
-	 * 
-	 * @param label The new label.
-	 */
-	public void setLabel(String label) {
-		if (label != null) {
-			this.label = label;
-		} else {
-			this.label = ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Gets the label of this instance.
-	 * 
-	 * @return The current label.
-	 */
-	public String getLabel() {
-		return label;
-	}
-
-	/**
-	 * Sets the value of this instance.
-	 * 
-	 * @param value The new value.
-	 */
-	public void setValue(String value) {
-		if (value != null) {
-			this.value = value;
-		} else {
-			this.value = ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Gets the value of this instance.
-	 * 
-	 * @return The current value.
-	 */
-	public String getValue() {
-		return value;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItemModel.java b/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItemModel.java
deleted file mode 100644
index 74d802e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/model/SelectItemModel.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.jsf.apache.trinidad.tagsupport.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.ITrinidadConstants;
-import org.eclipse.jst.jsf.apache.trinidad.tagsupport.Messages;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-/**
- * Provides a simple "selectItem"-like model to facilitate handling of both
- * standard JSF core selectItem tags and Trinidad selectItem tags, or a sample
- * model in the absence of either.  
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectItemModel {
-
-	private static final List<SelectItem> SAMPLE_MODEL = new ArrayList<SelectItem>();
-	static {
-		SAMPLE_MODEL.add(new SelectItem(
-				Messages.SelectItemModel_SampleItem1Label,
-				Messages.SelectItemModel_SampleItem1Value));
-		SAMPLE_MODEL.add(new SelectItem(
-				Messages.SelectItemModel_SampleItem2Label,
-				Messages.SelectItemModel_SampleItem2Value));
-		SAMPLE_MODEL.add(new SelectItem(
-				Messages.SelectItemModel_SampleItem3Label,
-				Messages.SelectItemModel_SampleItem3Value));
-	}
-
-	/**
-	 * Gets a model as a List of SelectItem instances, derived from child
-	 * selectItem Elements, or a sample model if no suitable child Elements are
-	 * found.
-	 * 
-	 * @param parentElement Parent Element instance to scan for child selectItem
-	 * Elements.
-	 * @return List of SelectItem instances.
-	 */
-	public static final List<SelectItem> getModel(Element parentElement) {
-		return getModel(parentElement, true);
-	}
-
-	/**
-	 * Gets a model as a List of SelectItem instances, derived from child
-	 * selectItem Elements, or (optionally) a sample model if no suitable
-	 * child Elements are found.
-	 * 
-	 * @param parentElement Parent Element instance to scan for child selectItem
-	 * Elements.
-	 * @param fallbackOnSampleModel If true and no suitable child Elements are
-	 * found, return sample model.
-	 * @return List of SelectItem instances (may be empty, but not null).
-	 */
-	public static final List<SelectItem> getModel(
-			Element parentElement, boolean fallbackOnSampleModel) {
-		List<SelectItem> selectItems = new ArrayList<SelectItem>();
-		if (parentElement != null) {
-			NodeList childNodes = parentElement.getChildNodes();
-			for (int i = 0; i < childNodes.getLength(); i++) {
-				if (childNodes.item(i) instanceof Element) {
-					Element childElement = (Element)childNodes.item(i);
-					TagIdentifier tagID =
-						TagIdentifierFactory.createDocumentTagWrapper(childElement);
-					if (tagID.isSameTagType(ITrinidadConstants.TAG_IDENTIFIER_SELECTITEM)) {
-						String label = childElement.getAttribute("label"); //$NON-NLS-1$
-						if (label == null || label.length() < 1) {
-							label = childElement.getAttribute("value"); //$NON-NLS-1$
-						}
-						selectItems.add(new SelectItem(
-								label, childElement.getAttribute("value"))); //$NON-NLS-1$
-					} else if (tagID.isSameTagType(IJSFConstants.TAG_IDENTIFIER_SELECTITEM)) {
-						String value = childElement.getAttribute("value"); //$NON-NLS-1$
-						if (value == null || value.length() < 1) {
-							value = childElement.getAttribute("itemValue"); //$NON-NLS-1$
-						}
-						String label = childElement.getAttribute("itemLabel"); //$NON-NLS-1$
-						if (label == null || label.length() < 1) {
-							label = value;
-						}
-						selectItems.add(new SelectItem(label, value));
-					}
-				}
-			}
-		}
-		if (selectItems.size() > 0 || !fallbackOnSampleModel) {
-			return selectItems;
-		} else {
-			return getSampleModel();
-		}
-	}
-
-	/**
-	 * Gets a sample model as a List of SelectItem instances.
-	 * 
-	 * @return Sample model as a List of SelectItem instances.
-	 */
-	public static final List<SelectItem> getSampleModel() {
-		return SAMPLE_MODEL;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.classpath b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.cvsignore
deleted file mode 100644
index a179f16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-@dot
-build.xml
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.project b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.project
deleted file mode 100644
index 4fe172b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.common.runtime</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 0df408f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Tue Mar 02 08:23:18 PST 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=error
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 997a930..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:44:25 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/META-INF/MANIFEST.MF
deleted file mode 100644
index e04c87f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name.0
-Bundle-SymbolicName: org.eclipse.jst.jsf.common.runtime
-Bundle-Version: 1.1.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.common.runtime.internal.JSFCommonRuntimePlugin
-Require-Bundle: org.eclipse.core.runtime
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.jst.jsf.common.runtime.internal;x-internal:=true,
- org.eclipse.jst.jsf.common.runtime.internal.debug;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.bean;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.component;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.datatypes;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.decorator;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.event;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.model.types;x-friends:="org.eclipse.jst.jsf.common.runtime.tests",
- org.eclipse.jst.jsf.common.runtime.internal.view.model.common;x-friends:="org.eclipse.jst.jsf.common.runtime.tests"
-Bundle-Vendor: %Bundle-Vendor.0
-Bundle-Localization: plugin
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/about.html b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/build.properties b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/build.properties
deleted file mode 100644
index ce7a0fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               about.html
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/WebContent/WEB-INF/faces-config.xml b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/WebContent/WEB-INF/faces-config.xml
deleted file mode 100644
index 15eef3b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/WebContent/WEB-INF/faces-config.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!DOCTYPE faces-config PUBLIC
-    "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
-    "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
-
-<faces-config>
-	<lifecycle>
-		<phase-listener>
-		instrument.PhaseListener1</phase-listener>
-	</lifecycle>
-</faces-config>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/jar/jsfrt.jar b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/jar/jsfrt.jar
deleted file mode 100644
index 5093673..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/jar/jsfrt.jar
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/MyMonitorMessageFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/MyMonitorMessageFactory.java
deleted file mode 100644
index 3f06d6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/MyMonitorMessageFactory.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package instrument;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.util.Iterator;
-
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIInput;
-import javax.faces.component.UIOutput;
-
-import org.eclipse.jst.jsf.common.runtime.internal.debug.JSFMonitorMessage;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.FacetInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.UIInputInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.UIOutputInfo;
-
-public class MyMonitorMessageFactory 
-{
-    public static JSFMonitorMessage  createJSFMonitorMessage(InputStream inStream) throws IOException, ClassCastException, ClassNotFoundException
-    {
-        ObjectInputStream objectStream = new ObjectInputStream(inStream);
-        Object nextObject = objectStream.readObject();
-        return (JSFMonitorMessage) nextObject;
-    }
-   
-    static ComponentInfo buildComponentTree(UIComponent component, boolean isFacet)
-    {
-        final ComponentInfo componentInfo = getComponentData(component, isFacet);
-        
-        for (Iterator it = component.getChildren().iterator(); it.hasNext();)
-        {
-            UIComponent child = (UIComponent) it.next();
-            componentInfo.getChildren().add(buildComponentTree(child, false));
-        }
-
-        for (Iterator it = component.getFacets().values().iterator(); it.hasNext();)
-        {
-            UIComponent facet = (UIComponent) it.next();
-            componentInfo.getChildren().add(buildComponentTree(facet, true));
-        }
-        
-        return componentInfo;
-    }
-    
-    private static ComponentInfo getComponentData(final UIComponent component, boolean isFacet)
-    {
-        if (isFacet)
-        {
-            return calculateFacetInfo(component);
-        }
-        else if (component instanceof UIInput)
-        {
-            return calculateUIInput((UIInput)component);
-        }
-        else if (component instanceof UIOutput)
-        {
-            return calculateUIOutput((UIOutput)component);
-        }
-        
-        // default; just make a component
-        return calculateComponentInfo(component);
-    }
-
-    private static ComponentInfo calculateComponentInfo(UIComponent component)
-    {
-        final String id = component.getId();
-        final String parentId = component.getParent() == null ? null : component.getParent().getId();
-        final String componentFamily = component.getFamily();
-        final String renderFamily = component.getRendererType();
-        final String componentType = null;
-        final String componentClass = component.getClass().getCanonicalName();
-        
-        return ComponentFactory.createComponentInfo
-            (id, parentId, componentFamily, renderFamily, componentType, componentClass);
-    }
-    
-    private static FacetInfo calculateFacetInfo(UIComponent component)
-    {
-        final String id = component.getId();
-        final String parentId = component.getParent() == null ? null : component.getParent().getId();
-        final String componentFamily = component.getFamily();
-        final String renderFamily = component.getRendererType();
-        final String componentType = null;
-        final String componentClass = component.getClass().getCanonicalName();
-
-        return ComponentFactory.createFacetInfo
-            (id, parentId, componentFamily, renderFamily, componentType, componentClass);
-    }
-    
-    private static UIInputInfo calculateUIInput(UIInput  uiInput)
-    {
-        final String id = uiInput.getId();
-        final String parentId = uiInput.getParent() == null ? null : uiInput.getParent().getId();
-        final String componentFamily = uiInput.getFamily();
-        final String renderFamily = uiInput.getRendererType();
-        final String componentType = null;
-        final String componentClass = uiInput.getClass().getCanonicalName();
-        final String isValid = Boolean.toString(uiInput.isValid());
-        final String isImmediate = Boolean.toString(uiInput.isImmediate());
-        final String isRequired = Boolean.toString(uiInput.isRequired());
-        final String isRendered = Boolean.toString(uiInput.isRendered());
-
-        return ComponentFactory.createUIInputInfo
-            (id, parentId, componentFamily, renderFamily, isValid, isImmediate, isRequired, isRendered, componentType, componentClass);
-    }
-
-    private static UIOutputInfo calculateUIOutput(UIOutput uiOutput)
-    {
-        final String id = uiOutput.getId();
-        final String parentId = uiOutput.getParent() == null ? null : uiOutput.getParent().getId();
-        final String componentFamily = uiOutput.getFamily();
-        final String renderFamily = uiOutput.getRendererType();
-        final String componentType = null;
-        final String componentClass = uiOutput.getClass().getCanonicalName();
-        final String isRendered = Boolean.toString(uiOutput.isRendered());
-
-        return ComponentFactory.createUIOutputInfo
-            (id, parentId, componentFamily, renderFamily, isRendered, componentType, componentClass);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/PhaseListener1.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/PhaseListener1.java
deleted file mode 100644
index e93e028..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/instrumentation/src/instrument/PhaseListener1.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package instrument;
-
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.io.Writer;
-import java.net.Socket;
-import java.net.UnknownHostException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Stack;
-import java.util.concurrent.LinkedBlockingQueue;
-
-import javax.faces.FactoryFinder;
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIViewRoot;
-import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseWriter;
-import javax.faces.event.PhaseEvent;
-import javax.faces.event.PhaseId;
-import javax.faces.event.PhaseListener;
-import javax.faces.render.RenderKit;
-import javax.faces.render.RenderKitFactory;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import org.eclipse.jst.jsf.common.runtime.internal.debug.ComponentTreeMessage;
-import org.eclipse.jst.jsf.common.runtime.internal.debug.JSFMonitorMessage;
-import org.eclipse.jst.jsf.common.runtime.internal.debug.MonitorMessageFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.debug.RenderAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.debug.RenderNode;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * @author cbateman
- *
- */
-public class PhaseListener1 implements PhaseListener 
-{
-	SocketClient		_socketClient;
-	ResponseWriter		_savedRW;
-	LoggingResponseWriter  _injectRW;
-	
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 6564874625827591775L;
-
-	public PhaseListener1()
-	{
-		System.out.println("Initialized PhaseListener: "+this);
-		_socketClient = new SocketClient(3702);
-		Thread thread = new Thread(_socketClient);
-		thread.start();
-		
-	}
-	
-	public void afterPhase(PhaseEvent event) {
-		if(PhaseId.RENDER_RESPONSE.equals(event.getPhaseId()))
-		{
-			System.out.printf("afterPhase: %s, for view id: %s\n",event.getPhaseId(),event.getFacesContext().getViewRoot().getViewId());
-			dumpComponentTree(event.getFacesContext());
-			
-			if (_savedRW != null)
-			{
-				event.getFacesContext().setResponseWriter(_savedRW);
-			}
-			
-			if (_injectRW != null)
-			{
-				dumpNode(_injectRW._rootComponentNode, "");
-			}
-		}
-	}
-
-	private void dumpNode(RenderNode node, String prefix)
-	{
-		System.out.printf("%s%s for component %s\n", prefix, node.getRenderedNodeName(), node.getComponentId());
-
-		for (final Iterator it = node.getChildren().iterator();it.hasNext();)
-		{
-			RenderNode child = (RenderNode) it.next();
-			dumpNode(child, prefix+"\t");
-		}
-	}
-
-	public void beforePhase(PhaseEvent event) {
-		if (PhaseId.RENDER_RESPONSE.equals(event.getPhaseId()))
-		{
-			FacesContext facesContext = event.getFacesContext();
-            RenderKitFactory renderFactory = 
-            	(RenderKitFactory)FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
-            RenderKit renderKit = renderFactory.getRenderKit(facesContext,
-                                                             facesContext.getViewRoot().getRenderKitId());
-
-            _savedRW = facesContext.getResponseWriter();
-
-            try
-            {
-	            Writer writer = ((ServletResponse) facesContext.getExternalContext().getResponse()).getWriter();
-	            String charEncoding = ((ServletRequest)facesContext.getExternalContext().getRequest()).getCharacterEncoding();
-	            ResponseWriter responseWriter = renderKit.createResponseWriter
-	            	(writer,
-	                                           null /*Default: get the allowed content-types from the accept-header*/,
-	                                           charEncoding);
-	            _injectRW = new LoggingResponseWriter(responseWriter);
-	            facesContext.setResponseWriter(_injectRW);
-            }
-            catch (IOException ioe)
-            {
-            	ioe.printStackTrace();
-            }
-		}
-//		System.out.printf("beforePhase: %s, for view id: %s\n",event.getPhaseId(),event.getFacesContext().getViewRoot().getViewId());
-//		dumpComponentTree(event.getFacesContext());
-	}
-
-	public PhaseId getPhaseId() {
-		return PhaseId.ANY_PHASE;
-	}
-
-	private void dumpComponentTree(final FacesContext facesContext)
-	{
-		final UIViewRoot root = facesContext.getViewRoot();
-		
-		if (root != null)
-		{
-			final String viewId = root.getViewId();
-			final ComponentInfo rootComponent = MyMonitorMessageFactory.buildComponentTree(root,false);
-			ComponentTreeMessage message = 
-				MonitorMessageFactory.createTreeMessage(viewId, rootComponent, _injectRW._rootComponentNode);
-			_socketClient.put(message);
-		}
-	}
-	
-	
-	private static class SocketClient implements Runnable
-	{
-		private final int					_port;
-		
-		private LinkedBlockingQueue<JSFMonitorMessage>  _queue = 
-			new LinkedBlockingQueue<JSFMonitorMessage>();
-		
-		SocketClient(final int port)
-		{
-			_port = port;
-		}
-		
-		public void run()
-		{
-			JSFMonitorMessage buffer = null;
-			
-			try
-			{
-				while ((buffer = _queue.take()) != null)
-				{
-			        Socket socket = null;
-			        
-			        try
-			        {
-			        	socket = new Socket("127.0.0.1", _port);
-			        	ObjectOutputStream  stream = new ObjectOutputStream(socket.getOutputStream());
-			        	stream.writeObject(buffer);
-//						PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
-//						writer.println(buffer);
-//						writer.flush();
-			        } catch (UnknownHostException e) {
-						e.printStackTrace();
-					} catch (IOException e) {
-						e.printStackTrace();
-					}
-			        finally
-			        {
-			        	if (socket != null && !socket.isClosed())
-			        	{
-			        		try {
-								socket.close();
-							} catch (IOException e) {
-								e.printStackTrace();
-							}
-			        	}
-			        }
-				}
-			}
-			catch (InterruptedException e)
-			{
-				e.printStackTrace();
-			}
-		}
-		
-		public void put(JSFMonitorMessage  message)
-		{
-			_queue.add(message);
-		}
-	}
-	
-	private static class LoggingResponseWriter extends ResponseWriter
-	{
-		private final ResponseWriter		_wrapWriter;
-		private final Stack/*<RenderNode>*/	_parentStack;
-		private RenderNode					_curNode;
-		private RenderNode					_rootComponentNode;
-
-		// map component id to the root rendernode rendered for it
-		private Map							_componentToHtml;
-		
-		LoggingResponseWriter(ResponseWriter  wrapWriter)
-		{
-			_wrapWriter = wrapWriter;
-			_parentStack = new Stack();
-			
-			_componentToHtml = new HashMap/*<String,RenderNode>*/();
-		}
-		
-		public ResponseWriter cloneWithWriter(Writer writer) {
-			return _wrapWriter.cloneWithWriter(writer);
-		}
-
-		public void endDocument() throws IOException {
-			_wrapWriter.endDocument();
-		}
-
-		public void endElement(String element) throws IOException {
-			_curNode = (RenderNode) _parentStack.pop();
-			_wrapWriter.endElement(element);
-		}
-
-		public void flush() throws IOException {
-			_wrapWriter.flush();
-		}
-
-		public String getCharacterEncoding() {
-			return _wrapWriter.getCharacterEncoding();
-		}
-
-		public String getContentType() {
-			return _wrapWriter.getContentType();
-		}
-
-		public void startDocument() throws IOException {
-			_rootComponentNode = new RenderNode(null, null);
-			_wrapWriter.startDocument();
-		}
-
-		public void startElement(String elementName, UIComponent component)
-				throws IOException 
-		{
-			String componentId = null;
-			
-			if (component != null)
-			{
-				componentId = component.getId();
-			}
-			
-			RenderNode oldNode = _curNode;
-			// push the curNode.  Pushing null indicates the root of the document
-			_parentStack.push(oldNode);
-
-			_curNode = new RenderNode(componentId, elementName);
-			
-			// note that assumption here is that the first html element
-			// we see corresponding to a component is the root of its
-			// html tree.  This may not be true if a component renders
-			// more than one root element or if the output is generated
-			// any thing but pre-order (parent first) tranversal of the 
-			// component tree.  TODO: this algorithm needs refining
-			if (!_componentToHtml.containsKey(componentId))
-			{
-				_componentToHtml.put(componentId, _curNode);
-			}
-			
-			// if the current node isn't null, then append this new element
-			if (oldNode != null)
-			{
-				oldNode.getChildren().add(_curNode);
-			}
-			// otherwise, we are at the doc root, so append there instead
-			else
-			{
-				_rootComponentNode.getChildren().add(_curNode);
-			}
-
-			
-			// do the normal write
-			_wrapWriter.startElement(elementName, component);
-		}
-
-		public void writeAttribute(String name, Object value, String componentPropertyName)
-				throws IOException {
-			
-			System.out.printf("%s: [%s,%s]\n", name, value.toString(), componentPropertyName);
-			final RenderAttribute  attribute = 
-				new RenderAttribute(name, value.toString(), componentPropertyName);
-			
-			if (_curNode != null)
-			{
-				_curNode.getRenderedAttributes().add(attribute);
-			}
-			_wrapWriter.writeAttribute(name, value, componentPropertyName);
-		}
-
-		public void writeComment(Object obj) throws IOException {
-			_wrapWriter.writeComment(obj);
-		}
-
-		public void writeText(Object arg0, String arg1) throws IOException {
-			_wrapWriter.writeText(arg0, arg1);
-		}
-
-		public void writeText(char[] arg0, int arg1, int arg2)
-				throws IOException {
-			_wrapWriter.writeText(arg0, arg1, arg2);
-		}
-
-		public void writeURIAttribute(String arg0, Object arg1, String arg2)
-				throws IOException {
-			_wrapWriter.writeURIAttribute(arg0, arg1, arg2);
-		}
-
-		public void close() throws IOException {
-			_wrapWriter.close();
-		}
-
-		public void write(char[] cbuf, int off, int len) throws IOException {
-			_wrapWriter.write(cbuf, off, len);
-		}
-
-		public ResponseWriter getWrapWriter() {
-			return _wrapWriter;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/plugin.properties
deleted file mode 100644
index 2279dd9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/plugin.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-#Properties file for org.eclipse.jst.jsf.common.runtime
-Bundle-Vendor.0 = Eclipse.org
-Bundle-Name.0 = JavaServer Faces Tools - Common Runtime
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/JSFCommonRuntimePlugin.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/JSFCommonRuntimePlugin.java
deleted file mode 100644
index 6f9d5f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/JSFCommonRuntimePlugin.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class JSFCommonRuntimePlugin extends Plugin {
-
-    /**
-     *  The plug-in ID
-     */
-    public static final String PLUGIN_ID = "CommonComponentPlugin"; //$NON-NLS-1$
-
-    // The shared instance
-    private static JSFCommonRuntimePlugin plugin;
-
-    /**
-     * The constructor
-     */
-    public JSFCommonRuntimePlugin() {
-        // empty constructor
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-     */
-    public void start(final BundleContext context) throws Exception {
-        super.start(context);
-        plugin = this;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-     */
-    public void stop(final BundleContext context) throws Exception {
-        plugin = null;
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static JSFCommonRuntimePlugin getDefault() {
-        return plugin;
-    }
-
-    /**
-     * @param message
-     * @param t
-     */
-    public static void log(final String message, final Throwable t)
-    {
-        final ILog log = getDefault().getLog();
-        final IStatus status = new Status(IStatus.ERROR, PLUGIN_ID, message, t);
-        log.log(status);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/ComponentTreeMessage.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/ComponentTreeMessage.java
deleted file mode 100644
index f6687f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/ComponentTreeMessage.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.debug;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-
-/**
- * Represents a component tree in message for that can be serialized.
- * 
- * @author cbateman
- *
- */
-public class ComponentTreeMessage extends JSFMonitorMessage 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -6282344329821994209L;
-    private String                              _viewId;
-    private ComponentInfo                       _treeRoot;
-    private RenderNode                          _renderRoot;
-   // private HashMap<String, ComponentInfo>      _idIndex;
-    
-    /**
-     * default constructor
-     */
-    public ComponentTreeMessage()
-    {
-        //_idIndex = new HashMap<String, ComponentInfo>();
-    }
-    
-    /**
-     * @return the view id
-     */
-    public final String getViewId() {
-        return _viewId;
-    }
-
-    /**
-     * @return the componentinfo at the root of the component tree
-     */
-    public final ComponentInfo getTreeRoot() {
-        return _treeRoot;
-    }
-
-    /**
-     * @return the rendered root node
-     */
-    public final RenderNode getRenderRoot() {
-        return _renderRoot;
-    }
-
-    final void setRenderRoot(RenderNode renderRoot) {
-        _renderRoot = renderRoot;
-    }
-
-    final void setTreeRoot(ComponentInfo treeRoot)
-    {
-        _treeRoot = treeRoot;
-    }
-    
-    final void setViewId(final String viewId)
-    {
-        _viewId = viewId;
-    }
-    
-//    @Override
-//    protected void deserialize(InputStream inStream) throws IOException, ClassNotFoundException
-//    {
-//        ObjectInputStream  objectInputStream = new ObjectInputStream(inStream);
-//        
-//        Object obj = objectInputStream.readObject();
-//        int bytesRead = super.deserialize(inStream);
-//        
-//        // first line must be startView
-//        final BufferedReader reader = 
-//            new BufferedReader(new InputStreamReader(inStream));
-//        
-//        String line = reader.readLine();
-//        
-//        if (line != null
-//                && line.startsWith(START_VIEW))
-//        {
-//            _viewId = line.substring(START_VIEW.length()).trim();
-//            bytesRead += line.length()+1;
-//        }
-//        
-//        // loop until EOF
-//        while ((line = reader.readLine())!=null)
-//        {
-//            bytesRead += line.length()+1;
-//            
-//            if (line.startsWith("component:"))
-//            {
-//                parseComponent(line.substring("component:".length()).trim());
-//            }
-//            else if (line.startsWith("facet:"))
-//            {
-//                parseFacet(line.substring("facet:".length()).trim());
-//            }
-//            else if (line.startsWith("uiInput:"))
-//            {
-//                parseUIInput(line.substring("uiInput:".length()).trim());
-//            }
-//            else if (line.startsWith("uiOutput:"))
-//            {
-//                parseUIOutput(line.substring("uiOutput:".length()).trim());
-//            }
-//            else if (line.startsWith("endView"))
-//            {
-//                //
-//            }
-//        }
-//        return bytesRead;
-//    }
-
-//    private ComponentInfo  parseComponent(final String line)
-//    {
-//        final String[]  fields = line.split(",");
-//        if (fields.length >= 4)
-//        {
-//            String parentId = "!".equals(fields[0]) ? null : fields[0];
-//            String id = "!".equals(fields[1]) ? null : fields[1];
-//            String componentFamily = fields[2];
-//            String renderFamily = fields[3];
-//            
-//            ComponentInfo componentInfo = 
-//                ComponentFactory.createComponentInfo
-//                    (id, parentId, componentFamily, renderFamily);
-//
-//            if (id == null)
-//            {
-//                _treeRoot = componentInfo;
-//                _idIndex.put(null, componentInfo);
-//            }
-//            else
-//            {
-//                _idIndex.put(id, componentInfo);
-//                
-//                ComponentInfo parent = 
-//                    (ComponentInfo)_idIndex.get(parentId);
-//                
-//                if (parent != null)
-//                {
-//                    parent.getChildren().add(componentInfo);
-//                }
-//                else
-//                {
-//                    _treeRoot.getChildren().add(componentInfo);
-//                }
-//            }
-//        }
-//        return null;
-//    }
-//    
-//    private FacetInfo parseFacet(final String line)
-//    {
-//        final String[]  fields = line.split(",");
-//
-//        if (fields.length >= 4)
-//        {
-//            String parentId = "!".equals(fields[0]) ? null : fields[0];
-//            String id = "!".equals(fields[1]) ? null : fields[1];
-//            String componentFamily = fields[2];
-//            String renderFamily = fields[3];
-//
-//            FacetInfo facetInfo = 
-//                ComponentFactory.createFacetInfo(id, parentId, componentFamily, renderFamily);
-//            ComponentInfo  parent = _idIndex.get(parentId);
-//            
-//            if (parent != null)
-//            {
-//                parent.getChildren().add(facetInfo);
-//            }
-//            
-//            return facetInfo;
-//        }
-//        return null;
-//    }
-//    
-//    private UIInputInfo parseUIInput(final String line)
-//    {
-//        final String[]  fields = line.split(",");
-//
-//        if (fields.length >= 7)
-//        {
-//            String parentId = "!".equals(fields[0]) ? null : fields[0];
-//            String id = "!".equals(fields[1]) ? null : fields[1];
-//            String componentFamily = fields[2];
-//            String renderFamily = fields[3];
-//            String isValid = fields[4];
-//            String isImmediate = fields[5];
-//            String isRequired = fields[6];
-//            String isRendered = fields[7];
-//            
-//            UIInputInfo uiInputInfo = 
-//                ComponentFactory.createUIInputInfo
-//                    (id, parentId, componentFamily, renderFamily, isValid, isImmediate, isRequired, isRendered);
-//            ComponentInfo  parent = _idIndex.get(parentId);
-//            
-//            if (parent != null)
-//            {
-//                parent.getChildren().add(uiInputInfo);
-//            }
-//            
-//            return uiInputInfo;
-//        }            
-//        return null;
-//    }
-//    
-//    private UIOutputInfo parseUIOutput(final String line)
-//    {
-//        final String[]  fields = line.split(",");
-//
-//        if (fields.length >= 4)
-//        {
-//            String parentId = "!".equals(fields[0]) ? null : fields[0];
-//            String id = "!".equals(fields[1]) ? null : fields[1];
-//            String componentFamily = fields[2];
-//            String renderFamily = fields[3];
-//            String isRendered = fields[4];
-//            
-//            UIOutputInfo uiOutputInfo = 
-//                ComponentFactory.createUIOutputInfo(id, parentId, componentFamily, renderFamily, isRendered);
-//            
-//            ComponentInfo  parent = _idIndex.get(parentId);
-//            
-//            if (parent != null)
-//            {
-//                parent.getChildren().add(uiOutputInfo);
-//            }
-//            
-//            return uiOutputInfo;
-//        }            
-//        return null;
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/JSFMonitorMessage.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/JSFMonitorMessage.java
deleted file mode 100644
index 4b2be53..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/JSFMonitorMessage.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.debug;
-
-import java.io.Serializable;
-
-/**
- * Super of all messages that are sent by the JSF debug monitor
- * @author cbateman
- *
- */
-public abstract class JSFMonitorMessage implements Serializable
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -5417558019077000040L;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/MonitorMessageFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/MonitorMessageFactory.java
deleted file mode 100644
index eb57677..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/MonitorMessageFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.debug;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * Creates JSF remote monitor messages.
- * 
- * @author cbateman
- *
- */
-public class MonitorMessageFactory 
-{
-    /**
-     * @param viewId
-     * @param root
-     * @param renderRoot
-     * @return a new component tree message for the parameters
-     */
-    public static ComponentTreeMessage createTreeMessage(final String viewId, final ComponentInfo root, final RenderNode renderRoot)
-    {
-        ComponentTreeMessage message = new ComponentTreeMessage();
-        message.setViewId(viewId);
-        message.setTreeRoot(root);
-        message.setRenderRoot(renderRoot);
-        return message;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderAttribute.java
deleted file mode 100644
index e0c1b91..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderAttribute.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.debug;
-
-/**
- * Information about a rendered XML attribute
- * 
- * @author cbateman
- *
- */
-public class RenderAttribute extends JSFMonitorMessage {
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -4601065346261130623L;
-
-    private final String  _name;        // the name of the attribute.  TODO: local vs. namespace?
-    private final String  _value;       // the rendered value of the  node
-    private final String  _propertyName;  // the property name on the corresponding component
-                                          // may be null
-    /**
-     * @param name
-     * @param value
-     * @param propertyName
-     */
-    public RenderAttribute(String name, String value, String propertyName) {
-        super();
-        _name = name;
-        _propertyName = propertyName;
-        _value = value;
-    }
-    /**
-     * @return the name of the attribute
-     */
-    public final String getName() {
-        return _name;
-    }
-    /**
-     * @return the attribute's value
-     */
-    public final String getValue() {
-        return _value;
-    }
-    /**
-     * @return the name of the corresponding component property if any.
-     */
-    public final String getPropertyName() {
-        return _propertyName;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderNode.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderNode.java
deleted file mode 100644
index 2679c62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/debug/RenderNode.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.debug;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * A rendered XML node.
- * 
- * @author cbateman
- *
- */
-public class RenderNode extends JSFMonitorMessage 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -2843929405836710015L;
-
-    private final String      _componentId;       // the id of the component id that caused the node to render
-    private final String      _renderedNodeName;  // the node
-    private final List/*<RenderedAttribute>*/        _renderedAttributes; // attributes
-    private final List        _children;          // the rendered children of renderedNode based
-                                                  // on the output document hiearchy
-    /**
-     * @param componentId
-     * @param renderedNodeName
-     */
-    public RenderNode(String componentId, String renderedNodeName) {
-        super();
-        _componentId = componentId;
-        _renderedNodeName = renderedNodeName;
-        
-        _children = new ArrayList();
-        _renderedAttributes = new ArrayList();
-    }
-    /**
-     * @return the corresponding component's id
-     */
-    public final String getComponentId() {
-        return _componentId;
-    }
-    /**
-     * @return the node's children
-     */
-    public final List getChildren() {
-        return _children;
-    }
-    /**
-     * @return the name of the rendered node (element)
-     */
-    public final String getRenderedNodeName() {
-        return _renderedNodeName;
-    }
-    /**
-     * @return the attributes of this node as rendered.
-     */
-    public final List getRenderedAttributes() {
-        return _renderedAttributes;
-    }
-    public String toString()
-    {
-        String toString = "Root node: "+_renderedNodeName+", attributes: ["; //$NON-NLS-1$ //$NON-NLS-2$
-        
-        for (Iterator it = _renderedAttributes.iterator(); it.hasNext();)
-        {
-            final RenderAttribute attribute = (RenderAttribute) it.next();
-            toString+=attribute.getName() + "=" + attribute.getValue(); //$NON-NLS-1$
-            
-            toString+=it.hasNext() ? ", " : "]"; //$NON-NLS-1$ //$NON-NLS-2$
-        }
-        
-        return toString;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/IDesigntimeAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/IDesigntimeAdapter.java
deleted file mode 100644
index bd427e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/IDesigntimeAdapter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model;
-
-/**
- * Implemented by design time adapters that represent runtime interfaces.
- * 
- * @author cbateman
- *
- */
-public interface IDesigntimeAdapter
-{
-    /**
-     * @return the list of runtime interfaces that this runtime adapter 
-     * represents.
-     */
-    String[]  getInterfaces();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/ViewObject.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/ViewObject.java
deleted file mode 100644
index 9c36f72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/ViewObject.java
+++ /dev/null
@@ -1,542 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.Decorator;
-
-/**
- * The base type of all objects that participate in the lifecycle of a view.
- * This may be used to hold either design time or runtime information.
- * 
- * @author cbateman
- * 
- */
-public abstract class ViewObject implements Serializable /* IAdaptable? */
-{
-    private final ViewObjectData    _data;
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 1592205691642453075L;
-
-    /**
-     * 
-     */
-    protected ViewObject()
-    {
-        this(new ViewObjectData(false));
-    }
-
-    /**
-     * @param delegate
-     */
-    protected ViewObject(final ViewObjectData delegate)
-    {
-        _data = delegate;
-        _data.setOwner(this);
-    }
-
-    /**
-     * @return the object containing all this view object's data
-     */
-    protected ViewObjectData getData()
-    {
-        return _data;
-    }
-
-    /**
-     * IMPORTANT: if this method returns false, then calling a mutator method
-     * (basically anything that is not a get/isX() will throw any
-     * IllegalStateException).
-     * 
-     * @return if the object can still be modified.
-     */
-    public final boolean isModifiable()
-    {
-        return !getData().isProtected();
-    }
-
-    /**
-     * Calling this method sets the state to not modifiable
-     */
-    public final void setProtected()
-    {
-        getData().setLocked();
-    }
-
-    /**
-     * This call may be create a new data structure and should be considered of
-     * much higher cost than most calls.
-     * 
-     * @return all decorators of this object. List should be assumed by clients
-     *         to be unmodifiable and may throw mutation exceptions
-     */
-    public List getAllDecorators()
-    {
-        final int size = getDecoratorMap().size();
-
-        if (size == 0)
-        {
-            return Collections.EMPTY_LIST;
-        }
-
-        final List allDecorators = new ArrayList();
-        for (final Iterator entryIt = getDecoratorMap().entrySet().iterator(); entryIt
-        .hasNext();)
-        {
-            final Map.Entry entry = (Map.Entry) entryIt.next();
-            final List decorators = (List) entry.getValue();
-            allDecorators.addAll(decorators);
-        }
-
-        return Collections.unmodifiableList(allDecorators);
-    }
-
-    /**
-     * @param decoratorType
-     * @return all decorators of this object associated with the class type. The
-     *         returned list should be assumed to be unmodifiable. Returns an
-     *         empty list if no decorators are associated with decoratorType
-     */
-    public List getDecorators(final Class decoratorType)
-    {
-        final List decorators = (List) getDecoratorMap().get(decoratorType);
-
-        if (decorators == null)
-        {
-            return Collections.EMPTY_LIST;
-        }
-        return Collections.unmodifiableList(decorators);
-    }
-
-    /**
-     * Add the decorator using decorator.getClass to associate the type. Must be
-     * equivalent to addDecorator(decorator, decorator.getClass());
-     * 
-     * @param decorator
-     *            the decorator to add. <b>Must NOT be null.</b>
-     * @throws IllegalArgumentException
-     *             if decorator is null.
-     */
-    public void addDecorator(final Decorator decorator)
-    {
-        _data.addDecorator(decorator);
-    }
-
-    /**
-     * Add the decorator using the associatedType. Normally you should call
-     * {@link #addDecorator(Decorator)} however in some cases you may wish to
-     * associated a decorator with a class type other than its own. For example,
-     * sub-classes of ValidatorDecorator will want to associated with
-     * ValidatorDecorator.getClass() in most cases so that it is included in any
-     * common examination of component validators.
-     * 
-     * @param decorator
-     *            to add. <b>Must NOT be null.</b>
-     * @param associatedType
-     *            the key to store decorator <b>Must NOT be null</b>
-     * @throws IllegalArgumentException
-     *             if decorator or associatedType is null
-     */
-    public void addDecorator(final Decorator decorator,
-            final Class associatedType)
-    {
-        _data.addDecorator(decorator, associatedType);
-    }
-
-    /**
-     * Removes decorator if it is associated to associatedType on this view
-     * object.
-     * 
-     * @param decorator
-     * @param associatedType
-     * @return true if the decorator was found and removed.
-     * @throws IllegalArgumentException
-     *             if decorator or associatedType is null
-     */
-    public boolean removeDecorator(final Decorator decorator,
-            final Class associatedType)
-    {
-        return _data.removeDecorator(decorator, associatedType);
-    }
-
-    /**
-     * <p>
-     * Get the adapter associated the class key.
-     * </p>
-     * 
-     * <p>
-     * If addAdapter has been called with adapterType, then this adapter object
-     * should always be called. In the default implementation, if there is no
-     * explicit adapter, "this" is returned if (this instanceof adapterType).
-     * 
-     * @param adapterType
-     * @return the interface adapter associated with the class key or null if
-     *         not found
-     */
-    public Object getAdapter(final Class adapterType)
-    {
-        if (adapterType == null)
-        {
-            return null;
-        }
-
-        Object adapter = getAdapterMap().get(adapterType);
-
-        if (adapter == null)
-        {
-            if (adapterType.isInstance(this))
-            {
-                adapter = this;
-            }
-        }
-
-        return adapter;
-    }
-
-    /**
-     * Adds the interface adapter object under adapterType key. There can be at
-     * most one adapter registered for each class key.
-     * 
-     * It is an error (throws exception) to try to add an adapter for
-     * adapterType which this is already instance. This restriction is necessary
-     * because otherwise local getters/setters would need to be aware of the
-     * adapter mechanism and verify inheritance hierarchies on every calls. This
-     * mechanism is intended only for adding interfaces to view object impls
-     * that don't already have them.
-     * 
-     * @param adapterType
-     * @param adapter
-     * @throws IllegalArgumentException
-     *             if adapterType or adapter is null or if casting adapter to
-     *             adapterType would * cause a ClassCastException (i.e. if
-     *             !(adapter instanceof adapterType)) OR if this is already an
-     *             instance of adapterType.
-     */
-    public void addAdapter(final Class adapterType, final Object adapter)
-    {
-        _data.addAdapter(adapterType, adapter);
-    }
-
-    /**
-     * Note that {@link #getAdapter(Class)} may still return non-null after this
-     * is called if (this instanceof adapterType).
-     * 
-     * @param adapterType
-     * @return the adapter for adapterType that was just removed or null if not
-     *         found
-     */
-    public Object removeAdapter(final Class adapterType)
-    {
-        return getAdapterMap().remove(adapterType);
-    }
-
-    /**
-     * Note that this only returns those adapters added using
-     * {@link #addAdapter(Class, Object)}. It does not return any implicit
-     * adapters resulting from (this instanceof type).
-     * 
-     * @return the map of all adapters. Maps is immutable and may throw
-     *         exceptions on attempts to mutate.
-     */
-    public Map getAllAdapters()
-    {
-        if (getAdapterMap().size() == 0)
-        {
-            return Collections.EMPTY_MAP;
-        }
-        return Collections.unmodifiableMap(getAdapterMap());
-    }
-
-    /**
-     * <p>
-     * The contract for this method is that it must always return a usable Map
-     * and that map must be the same on every call. Lazy construction may be
-     * used (as it is by default). The default map size is 4 and load factor is
-     * 3 meaning that there should be decent tradeoff between wasted table size
-     * and overhead used to increase it should the number of decorators exceed
-     * 3. <b>Must never return null.</b>
-     * </p>
-     * 
-     * <p>
-     * Generally, the method should not need to be overridden, however it is
-     * provided to allow sub-classes to change the way the decorators map is
-     * constructed.
-     * </p>
-     * 
-     * @return the map containing lists of decorators keyed by class.
-     * 
-     */
-    protected Map getDecoratorMap()
-    {
-        return _data.getDecoratorMap();
-    }
-
-    /**
-     * <p>
-     * The contract for this method is that it must always return a usable Map
-     * and that map must be the same on every call. Lazy construction may be
-     * used (as it is by default). The default map size is 4 and load factor is
-     * 3 meaning that there should be decent tradeoff between wasted table size
-     * and overhead used to increase it should the number of decorators exceed
-     * 3. <b>Must never return null.</b>
-     * </p>
-     * 
-     * <p>
-     * Generally, the method should not need to be overridden, however it is
-     * provided to allow sub-classes to change the way the decorators map is
-     * constructed.
-     * </p>
-     * 
-     * @return the map containing lists of adapters keyed by class.
-     * 
-     */
-    protected Map getAdapterMap()
-    {
-        return _data.getAdapterMap();
-    }
-
-    // ALL ViewObject's must use reference equals
-    public final boolean equals(final Object obj)
-    {
-        return super.equals(obj);
-    }
-
-    public final int hashCode()
-    {
-        return super.hashCode();
-    }
-
-    /**
-     * The protectable view object data.
-     * 
-     */
-    public static class ViewObjectData extends ProtectedDataObject
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = -4216980607447926035L;
-        private Map _decorators;
-        private Map _adapters;
-        private Object _owner;
-
-        /**
-         * @param isProtected
-         */
-        public ViewObjectData(final boolean isProtected)
-        {
-            super(isProtected);
-        }
-
-        private void setOwner(final ViewObject viewObject)
-        {
-            _owner = viewObject;
-        }
-
-        /**
-         * For serialization only.
-         */
-        //        public ViewObjectData()
-        //        {
-        //            // for serializability
-        //            super(false);
-        //        }
-
-        /**
-         * @param decorator
-         * @param associatedType
-         * @return true if the decorator was removed.
-         */
-        public boolean removeDecorator(final Decorator decorator, final Class associatedType)
-        {
-            enforceProtection();
-
-            if (decorator == null || associatedType == null)
-            {
-                throw new IllegalArgumentException("Arguments must not be null"); //$NON-NLS-1$
-            }
-
-            final List decoratorsByType = (List) getDecoratorMap().get(
-                    associatedType);
-
-            if (decoratorsByType != null)
-            {
-                return decoratorsByType.remove(decorator);
-            }
-
-            return false;
-        }
-
-        /**
-         * @param adapterType
-         * @param adapter
-         */
-        public void addAdapter(final Class adapterType, final Object adapter)
-        {
-            enforceProtection();
-
-            if (adapterType == null || adapter == null)
-            {
-                throw new IllegalArgumentException("Arguments must not be null"); //$NON-NLS-1$
-            }
-
-            if (!adapterType.isInstance(adapter))
-            {
-                throw new IllegalArgumentException("adapter: " + adapter //$NON-NLS-1$
-                        + " must be cast compatible to class: " + adapterType); //$NON-NLS-1$
-            }
-            else if (adapterType.isInstance(_owner))
-            {
-                throw new IllegalArgumentException("this: " + _owner //$NON-NLS-1$
-                        + " must not already be an instance of class: " //$NON-NLS-1$
-                        + adapterType);
-            }
-            getAdapterMap().put(adapterType, adapter);
-        }
-
-        /**
-         * @param decorator
-         */
-        public void addDecorator(final Decorator decorator)
-        {
-            enforceProtection();
-
-            if (decorator == null)
-            {
-                throw new IllegalArgumentException("Arguments must not be null"); //$NON-NLS-1$
-            }
-            final Class associationType = decorator.getClass();
-            addDecorator(decorator, associationType);
-        }
-
-        /**
-         * @param decorator
-         * @param associatedType
-         */
-        public void addDecorator(final Decorator decorator, final Class associatedType)
-        {
-            enforceProtection();
-
-            if (decorator == null || associatedType == null)
-            {
-                throw new IllegalArgumentException("Arguments must not be null"); //$NON-NLS-1$
-            }
-
-            List decoratorsByType = (List) getDecoratorMap().get(associatedType);
-
-            if (decoratorsByType == null)
-            {
-                decoratorsByType = new ArrayList(2);
-                getDecoratorMap().put(associatedType, decoratorsByType);
-            }
-
-            decoratorsByType.add(decorator);
-        }
-
-        /**
-         * @return the decorator map, creating it if necessary
-         */
-        protected synchronized Map getDecoratorMap()
-        {
-            if (_decorators == null)
-            {
-                if (isProtected())
-                {
-                    _decorators = Collections.EMPTY_MAP;
-                }
-                _decorators = new HashMap(4);
-            }
-            return _decorators;
-        }
-
-        /**
-         * @return the adapter map, creating if necessary.
-         */
-        protected synchronized Map getAdapterMap()
-        {
-            if (_adapters == null)
-            {
-                _adapters = new HashMap(4);
-            }
-
-            return _adapters;
-        }
-    }
-
-    /**
-     * An object that enforces that mutation can only happen up to point where
-     * the object is designated protected at which point is it is forever
-     * immutable.
-     * 
-     */
-    public static abstract class ProtectedDataObject implements Serializable
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 4470279408370430399L;
-        private boolean _isProtected;
-
-        /**
-         * @param isProtected
-         */
-        public ProtectedDataObject(final boolean isProtected)
-        {
-            _isProtected = isProtected;
-        }
-
-        /**
-         * @throws UnsupportedOperationException
-         */
-        protected final synchronized void enforceProtection() throws UnsupportedOperationException
-        {
-            if (isProtected())
-            {
-                throw new UnsupportedOperationException("Object "+this.toString()+ " is locked for modification"); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-        }
-
-        /**
-         * @return true if this object is protected and irrevocablly immutable.
-         */
-        public final synchronized boolean isProtected()
-        {
-            return _isProtected;
-        }
-
-        /**
-         * Executed right before setProtected irrevocably sets the protection
-         * flag. Does nothing by default
-         */
-        protected void doBeforeProtecting()
-        {
-            // do nothing by default
-        }
-        /**
-         * Makes this object irrevocably immutable.
-         */
-        public final synchronized void setLocked()
-        {
-            doBeforeProtecting();
-            _isProtected = true;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/DataModelInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/DataModelInfo.java
deleted file mode 100644
index e7c2e93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/DataModelInfo.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.bean;
-
-import java.io.Serializable;
-
-/**
- * Design time analog of runtime DataModel bean
- * 
- * @author cbateman
- *
- */
-public class DataModelInfo implements Serializable 
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 6461056497382677871L;
-
-    private final boolean               _rowAvailable;
-    private final int                   _rowCount;
-    private final SerializableObject    _rowData;
-    private final int                   _rowIndex;
-    private final SerializableObject    _wrappedData;
-
-    /**
-     * @param rowAvailable
-     * @param rowCount
-     * @param rowData
-     * @param rowIndex
-     * @param wrappedData
-     */
-    public DataModelInfo(boolean rowAvailable, int rowCount, Object rowData,
-            int rowIndex, Object wrappedData) {
-        super();
-        _rowAvailable = rowAvailable;
-        _rowCount = rowCount;
-        _rowData = new SerializableObject(rowData);
-        _rowIndex = rowIndex;
-        _wrappedData = new SerializableObject(wrappedData);
-    }
-
-    /**
-     * @return true if the current row is available
-     */
-    public final boolean isRowAvailable() {
-        return _rowAvailable;
-    }
-    /**
-     * @return the row count of this model
-     */
-    public final int getRowCount() {
-        return _rowCount;
-    }
-    /**
-     * @return the row data
-     */
-    public final Object getRowData() {
-        return _rowData.getMaybeSerializable();
-    }
-    /**
-     * @return the row index
-     */
-    public final int getRowIndex() {
-        return _rowIndex;
-    }
-    /**
-     * @return the wrapped data.  may be null if wrapped object was not
-     * serializable.
-     */
-    public final Object getWrappedData() {
-        return _wrappedData.getMaybeSerializable();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/SerializableObject.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/SerializableObject.java
deleted file mode 100644
index e3b066a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/bean/SerializableObject.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.bean;
-
-import java.io.IOException;
-import java.io.NotSerializableException;
-import java.io.Serializable;
-
-/**
- * A special object used in place of Object to ensure that when an interface
- * requires a generic #{@link java.lang.Object}, it won't throw serialization
- * exception when a containing object is serialized.
- * 
- * @author cbateman
- * 
- */
-public class SerializableObject implements Serializable
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 9133733048469500692L;
-    private Object      _maybeSerializable;
-    
-    /**
-     * @param maybeSerializable
-     */
-    public SerializableObject(Object maybeSerializable)
-    {
-        _maybeSerializable = maybeSerializable;
-    }
-    
-    
-//    /**
-//     * Provided to support serialization.  Should not be used by sub-classes
-//     * or clients except in this regard.
-//     */
-//    protected SerializableObject()
-//    {
-//        _maybeSerializable = null;
-//    }
-    
-    /**
-     * @return the actual value
-     */
-    public final Object getMaybeSerializable() {
-        return _maybeSerializable;
-    }
-
-
-    private void writeObject(java.io.ObjectOutputStream out)
-        throws IOException
-    {
-        try
-        {
-            out.writeObject(_maybeSerializable);
-        }
-        catch (NotSerializableException nse)
-        {
-            // do nothing, the object isn't guaranteed to be serializable,
-            // but we don't want this be an error
-            out.writeObject(null);
-        }
-    }
-    
-    private void readObject(java.io.ObjectInputStream in)
-        throws IOException, ClassNotFoundException
-    {
-        _maybeSerializable = in.readObject();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo.java
deleted file mode 100644
index 6e7348d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ActionListenerDecorator;
-
-/**
- * Implementation of the ActionSourceInfo.
- * 
- * @author cbateman
- *
- */
-public class ActionSourceInfo implements IActionSourceInfo, IDesigntimeAdapter
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 6531166406473466685L;
-    private static final String[]                INTERFACE = new String[]{ComponentFactory.INTERFACE_ACTIONSOURCE};
-    private final String                                    _action;
-    private final String                                    _actionListener;
-    private final boolean                                   _immediate;
-    private List/*<ActionListenerDecorator>*/               _actionListeners;
-    
-    /**
-     * @param action
-     * @param actionListener
-     * @param immediate
-     */
-    public ActionSourceInfo(final String action, final String actionListener,
-            final boolean immediate) 
-    {
-        super();
-        _action = action;
-        _actionListener = actionListener;
-        _immediate = immediate;
-    }
-
-    public void addActionListener(final ActionListenerDecorator actionListener) {
-        if (_actionListeners == null)
-        {
-            _actionListeners = new ArrayList(2);
-        }
-        _actionListeners.add(actionListener);
-    }
-
-    public String getAction() {
-        return _action;
-    }
-
-    public String getActionListener() {
-        return _actionListener;
-    }
-
-    public List getActionListeners() {
-        if (_actionListeners == null)
-        {
-            return Collections.EMPTY_LIST;
-        }
-        return Collections.unmodifiableList(_actionListeners);
-    }
-
-    public boolean isImmediate() {
-        return _immediate;
-    }
-
-    public String[] getInterfaces()
-    {
-        return INTERFACE;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo2.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo2.java
deleted file mode 100644
index d36b95b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ActionSourceInfo2.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-
-/**
- * Implementation of the IActionSource2Info
- * 
- * @author cbateman
- *
- */
-public class ActionSourceInfo2 extends ActionSourceInfo implements
-        IActionSource2Info, IDesigntimeAdapter
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 5811194815559772378L;
-    private static final String[]                INTERFACE = new String[]{ComponentFactory.INTERFACE_ACTIONSOURCE2};
-
-    private final String        _actionExpression;
-    
-    /**
-     * @param action
-     * @param actionListener
-     * @param immediate
-     * @param actionExpression
-     */
-    public ActionSourceInfo2(final String action, final String actionListener,
-            final boolean immediate, final String actionExpression) {
-        super(action, actionListener, immediate);
-        _actionExpression = actionExpression;
-    }
-
-    public String getActionExpression() {
-        return _actionExpression;
-    }
-
-    public String[] getInterfaces()
-    {
-        return INTERFACE;
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/EditableValueHolderInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/EditableValueHolderInfo.java
deleted file mode 100644
index 8b07c45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/EditableValueHolderInfo.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValueChangeListenerDecorator;
-
-/**
- * Implementation of the IEditableValueHolderInfo
- * 
- * @author cbateman
- *
- */
-public class EditableValueHolderInfo extends ValueHolderInfo implements
-        IEditableValueHolderInfo, IDesigntimeAdapter
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -2115990809157328451L;
-    private static final String[]  INTERFACE = new String[] {ComponentFactory.INTERFACE_EDITABLEVALUEHOLDER};
-    
-    private final boolean       _localSetValue;
-    private final Object        _submittedValue;
-    private final String        _validator;
-    private final String        _valueChangeListener;
-    private final boolean       _isImmediate;
-    private final boolean       _isRequired;
-    private final boolean       _isValid;
-    private List                _validators;
-    private List                _valueChangeListeners;
-    
-    /**
-     * @param converterDecorator
-     * @param localValue
-     * @param value
-     * @param isImmediate
-     * @param isRequired
-     * @param isValid
-     * @param localSetValue
-     * @param submittedValue
-     * @param validator
-     * @param valueChangeListener
-     */
-    public EditableValueHolderInfo(final ConverterDecorator converterDecorator,
-            final Object localValue, final Object value, final boolean isImmediate,
-            final boolean isRequired, final boolean isValid, final boolean localSetValue,
-            final Object submittedValue, final String validator, final String valueChangeListener) 
-    {
-        super(converterDecorator, localValue, value);
-        _isImmediate = isImmediate;
-        _isRequired = isRequired;
-        _isValid = isValid;
-        _localSetValue = localSetValue;
-        _submittedValue = submittedValue;
-        _validator = validator;
-        _valueChangeListener = valueChangeListener;
-    }
-
-    public final boolean isLocalSetValue() {
-        return _localSetValue;
-    }
-
-    public final Object getSubmittedValue() {
-        return _submittedValue;
-    }
-
-    public final String getValidator() {
-        return _validator;
-    }
-
-    public final String getValueChangeListener() {
-        return _valueChangeListener;
-    }
-
-    public final boolean isImmediate() {
-        return _isImmediate;
-    }
-
-    public final boolean isRequired() {
-        return _isRequired;
-    }
-
-    public final boolean isValid() {
-        return _isValid;
-    }
-
-    public void addValidator(final ValidatorDecorator validator) 
-    {
-        if (_validators == null)
-        {
-            _validators = new ArrayList(2);
-        }
-        _validators.add(validator);
-    }
-
-    public void addValueChangeListener(
-            final ValueChangeListenerDecorator valueChangeListenerInfo) 
-    {
-        if (_valueChangeListeners == null)
-        {
-            _valueChangeListeners = new ArrayList(2);
-        }
-        _valueChangeListeners.add(valueChangeListenerInfo);
-    }
-
-    public List getValidators() {
-        if (_validators == null)
-        {
-            return Collections.EMPTY_LIST;
-        }
-        
-        return Collections.unmodifiableList(_validators);
-    }
-
-    public List getValueChangeListeners() {
-        if (_valueChangeListeners == null)
-        {
-            return Collections.EMPTY_LIST;
-        }
-        
-        return Collections.unmodifiableList(_valueChangeListeners);
-    }
-
-    public String[] getInterfaces()
-    {
-        return INTERFACE;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSource2Info.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSource2Info.java
deleted file mode 100644
index 21966e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSource2Info.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-/**
- * Design-time analog for the ActionSource2 interface.
- * 
- * @author cbateman
- *
- */
-public interface IActionSource2Info extends IActionSourceInfo 
-{
-    /**
-     * TODO: this method is similar to getAction on ActionSource from
-     * our perspective since the actual string rep of the EL is basically
-     * the same...
-     * 
-     * @return an EL method expression that represents a call to 
-     * an action method.
-     */
-    String getActionExpression();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSourceInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSourceInfo.java
deleted file mode 100644
index 3d2dd2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IActionSourceInfo.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.io.Serializable;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ActionListenerDecorator;
-
-/**
- * A design time analog for the runtime ActionSource interface.
- * 
- * @author cbateman
- *
- */
-public interface IActionSourceInfo extends Serializable
-{
-    /**
-     * @return true if action listener associated with this action source
-     * should be executed immediately after the apply request values phase.
-     * Default is false.
-     */
-    boolean isImmediate();
-    
-    
-    /**
-     * Add the action listener to the list
-     * 
-     * @param actionListener
-     */
-    void addActionListener(ActionListenerDecorator  actionListener);
-    
-    /**
-     * @return all action listeners registered.  List should be considered
-     * immutable and may throw exceptions if modified.
-     */
-    List/*<ActionListenerDecorator>*/ getActionListeners();
-    
-    /**
-     * <b> NOTE: this method is deprecated in the runtime spec and exists for
-     * backward compatibility with JSF 1.1. You should avoid using it except in
-     * conjunction with JSF 1.1 tooling support. This method will be deprecated
-     * once the runtime spec removes the underlying API</b>
-
-     * @return a method binding expression describing an action handler
-     */
-    String  getAction();
-    
-    /**
-     * <b> NOTE: this method is deprecated in the runtime spec and exists for
-     * backward compatibility with JSF 1.1. You should avoid using it except in
-     * conjunction with JSF 1.1 tooling support. This method will be deprecated
-     * once the runtime spec removes the underlying API</b>
-     * 
-     * @return a method binding expression describing an action listener
-     */
-    String  getActionListener();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IEditableValueHolderInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IEditableValueHolderInfo.java
deleted file mode 100644
index 53403d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IEditableValueHolderInfo.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValueChangeListenerDecorator;
-
-/**
- * A design time analog for the JSF runtime EditableValueHolder interface.
- * 
- * @author cbateman
- * 
- */
-public interface IEditableValueHolderInfo extends IValueHolderInfo {
-    /**
-     * @return the flag indicating whether the value of the value holder should
-     *         be evaluated in the apply request values phase instead of the
-     *         process validations phase
-     */
-    boolean isImmediate();
-
-    /**
-     * @return true if the value has been set
-     */
-    boolean isLocalSetValue();
-
-    /**
-     * @return true if validation should consider this field required (must be
-     *         non-empty).
-     */
-    boolean isRequired();
-
-    /**
-     * @return the submitted, unconverted value of the component.
-     */
-    Object getSubmittedValue();
-
-    /**
-     * @return false if validation has determined that the value property of
-     *         this component is not valid.
-     */
-    boolean isValid();
-
-    /**
-     * <b> NOTE: this method is deprecated in the runtime spec and exists for
-     * backward compatibility with JSF 1.1. You should avoid using it except in
-     * conjunction with JSF 1.1 tooling support. This method will be deprecated
-     * once the runtime spec removes the underlying API</b>
-     * 
-     * @return a method binding expression that refers to a validator method
-     */
-    String getValidator();
-
-    /**
-     * <b> NOTE: this method is deprecated in the runtime spec and exists for
-     * backward compatibility with JSF 1.1. You should avoid using it except in
-     * conjunction with JSF 1.1 tooling support. This method will be deprecated
-     * once the runtime spec removes the underlying API</b>
-     * 
-     * @return a method binding expression that refers to a value change
-     *         listener
-     */
-    String getValueChangeListener();
-
-    /**
-     * Add validator to the list of validators for this component. Should be
-     * equivalent to
-     * {@link org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject#addDecorator(org.eclipse.jst.jsf.common.runtime.internal.model.decorator.Decorator, Class)}.
-     * 
-     * @param validator
-     */
-    void addValidator(ValidatorDecorator validator);
-
-    /**
-     * @return the list of validators for this component. Should be considered
-     *         unmodifiable (may throw exception).
-     */
-    List/* <ValidatorDecorator> */getValidators();
-
-    /**
-     * Add the value change listener to this component.
-     * 
-     * @param valueChangeListenerInfo
-     */
-    void addValueChangeListener(
-            ValueChangeListenerDecorator valueChangeListenerInfo);
-
-    /**
-     * @return the list of value change listeners. Should be considered
-     *         unmodifiable (may throw exception).
-     */
-    List/* <ValueChangeListenerDecorator> */getValueChangeListeners();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/INamingContainerInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/INamingContainerInfo.java
deleted file mode 100644
index aeb1e98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/INamingContainerInfo.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.io.Serializable;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-
-/**
- * Design time analog for the NamingContainer interface.
- * 
- * @author cbateman
- * 
- */
-public interface INamingContainerInfo extends Serializable
-{
-    // tagging interface
-
-    /**
-     * Used as an adapter impl
-     */
-    public final static INamingContainerInfo ADAPTER = new NamingContainerInfo();
-    
-    /**
-     * A default naming container info
-     * @author cbateman
-     *
-     */
-    public static class NamingContainerInfo implements INamingContainerInfo, IDesigntimeAdapter
-    {
-        /**
-         * 
-         */
-        private static final long serialVersionUID = 7214529928361444126L;
-
-        public String[] getInterfaces()
-        {
-            return new String[] {ComponentFactory.INTERFACE_NAMINGCONTAINER};
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IValueHolderInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IValueHolderInfo.java
deleted file mode 100644
index 661dd81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/IValueHolderInfo.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import java.io.Serializable;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-
-/**
- * Represents design time information about the ValueHolder behavioural
- * interface.
- * 
- * @author cbateman
- *
- */
-public interface IValueHolderInfo extends Serializable
-{
-    /**
-     * @return the value, may be null
-     */
-    Object getValue();
-    
-    /**
-     * @return the raw value without expression value evaluation.  Note that 
-     * {@link #getValue()} may return the same value in cases where this value
-     * holder is derived at design time without EL expression evaluation. May be null.
-     */
-    Object getLocalValue();
-    
-    /**
-     * @return the converter for this value holder or null if none.
-     */
-    ConverterDecorator getConverter();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ValueHolderInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ValueHolderInfo.java
deleted file mode 100644
index 25c8e2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/behavioural/ValueHolderInfo.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.behavioural;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.IDesigntimeAdapter;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentFactory;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-
-/**
- * Implementation of the IValueHolderInfo.
- * 
- * @author cbateman
- *
- */
-public class ValueHolderInfo implements IValueHolderInfo, IDesigntimeAdapter
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 5000699728360703727L;
-
-    /**
-     * the value (may include EL evaluation)
-     */
-    protected final Object                  _value;
-    /**
-     * the raw value  before EL evaluation.
-     */
-    protected final Object                  _localValue;
-    /**
-     * the converter or null if none.
-     */
-    protected final ConverterDecorator      _converterDecorator;
-    
-    /**
-     * @param converterDecorator
-     * @param localValue
-     * @param value
-     */
-    public ValueHolderInfo(final ConverterDecorator converterDecorator,
-            final Object localValue, final Object value) {
-        super();
-        _converterDecorator = converterDecorator;
-        _localValue = localValue;
-        _value = value;
-    }
-    public final Object getValue() {
-        return _value;
-    }
-    public final Object getLocalValue() {
-        return _localValue;
-    }
-    public final ConverterDecorator getConverter() {
-        return _converterDecorator;
-    }
-    public String[] getInterfaces()
-    {
-        return new String[] {ComponentFactory.INTERFACE_VALUEHOLDER};
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/AbstractVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/AbstractVisitor.java
deleted file mode 100644
index a18b04f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/AbstractVisitor.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-/**
- * Implemented by visitors
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractVisitor
-{
-    /**
-     * A policy to control visitation
-     */
-    protected final VisitationPolicy _policy;
-
-    /**
-     * @param policy
-     */
-    protected AbstractVisitor(final VisitationPolicy policy)
-    {
-        super();
-        _policy = policy;
-    }
-
-    /**
-     * @param object
-     */
-    public abstract void visit(Object object);
-
-    /**
-     * @return the visitation policy
-     */
-    public VisitationPolicy getPolicy()
-    {
-        return _policy;
-    }
-
-    /**
-     * A policy that allows a visitor to configure how it will visit a tree.
-     * 
-     */
-    public static final class VisitationPolicy
-    {
-        /**
-         * indicates pre-order, parent first traversal (root visited first)
-         */
-        public static final int              VISIT_PARENT_FIRST   = 0;                          // pre-order
-        // tree
-        // visit
-        /**
-         * indicates post-order, children first traveral (root visited last)
-         */
-        public static final int              VISIT_CHILDREN_FIRST = 1;                          // post-order
-        // tree
-        // visit
-        /**
-         * A default parent first policy
-         */
-        public final static VisitationPolicy ParentFirstPolicy    = new VisitationPolicy(
-                VISIT_PARENT_FIRST);
-        /**
-         * A default children first policy
-         */
-        public final static VisitationPolicy ChildrenFirstPolicy  = new VisitationPolicy(
-                VISIT_CHILDREN_FIRST);
-
-        private final int                    _ordering;
-
-        /**
-         * @param ordering
-         */
-        public VisitationPolicy(final int ordering)
-        {
-            _ordering = ordering;
-        }
-
-        /**
-         * @return the ordering
-         */
-        public final int getOrdering()
-        {
-            return _ordering;
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentFactory.java
deleted file mode 100644
index a3c3762..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentFactory.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.bean.DataModelInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IActionSource2Info;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IActionSourceInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IEditableValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.INamingContainerInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.FacetDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.event.IActionListenerInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.event.IValueChangeListenerInfo;
-
-/**
- * Factory for creating component related objects.
- * 
- * @author cbateman
- * 
- */
-public class ComponentFactory
-{
-
-    /**
-     * The key for the standard ValueHolder adapter interface
-     */
-    public final static Class VALUE_HOLDER = IValueHolderInfo.class;
-    /**
-     * The key for the standard EditableValueHolder adapter interface
-     */
-    public final static Class EDITABLE_VALUE_HOLDER = IEditableValueHolderInfo.class;
-    /**
-     * The key for the standard ActionSource adapter interface
-     */
-    public final static Class ACTION_SOURCE = IActionSourceInfo.class;
-    /**
-     * The key for the standard ActionSource2 adapter interface
-     */
-    public final static Class ACTION_SOURCE2 = IActionSource2Info.class;
-    /**
-     * The key for the standard NamingContainer adapter interface
-     */
-    public final static Class NAMING_CONTAINER = INamingContainerInfo.class;
-
-    /**
-     * The key for the standard Converter decorator
-     */
-    public final static Class CONVERTER = ConverterDecorator.class;
-    /**
-     * The key for the standard Facet decorator
-     */
-    public final static Class FACET = FacetDecorator.class;
-    /**
-     * The key for the standard Validator decorator
-     */
-    public final static Class VALIDATOR = ValidatorDecorator.class;
-    /**
-     * The key for the standard ValueChangeListener decorator
-     */
-    public final static Class VALUE_CHANGE_LISTENER = IValueChangeListenerInfo.class;
-    /**
-     * The key for the standard ActionListener decorator
-     */
-    public final static Class ACTION_LISTENER = IActionListenerInfo.class;
-
-    /**
-     * Base class name for UIInput's
-     */
-    public final static String BASE_CLASS_UIINPUT = "javax.faces.component.UIInput"; //$NON-NLS-1$
-    /**
-     * Base class name for UIOutput's
-     */
-    public final static String BASE_CLASS_UIOUTPUT = "javax.faces.component.UIOutput"; //$NON-NLS-1$
-    /**
-     * Base class name for UICommand's
-     */
-    public final static String BASE_CLASS_UICOMMAND = "javax.faces.component.UICommand"; //$NON-NLS-1$
-    /**
-     * Base class name for UIData's
-     */
-    public final static String BASE_CLASS_UIDATA = "javax.faces.component.UIData"; //$NON-NLS-1$
-    /**
-     * Base class name for UIForm's
-     */
-    public final static String BASE_CLASS_UIFORM = "javax.faces.component.UIForm"; //$NON-NLS-1$
-
-    /**
-     * Interface name for ValueHolder's
-     */
-    public final static String INTERFACE_VALUEHOLDER = "javax.faces.component.ValueHolder"; //$NON-NLS-1$
-    /**
-     * Interface name for EditableValueHolder's
-     */
-    public final static String INTERFACE_EDITABLEVALUEHOLDER = "javax.faces.component.EditableValueHolder"; //$NON-NLS-1$
-    /**
-     * Interface name for ActionSource's
-     */
-    public final static String INTERFACE_ACTIONSOURCE = "javax.faces.component.ActionSource"; //$NON-NLS-1$
-    /**
-     * Interface name for ActionSource2's
-     */
-    public final static String INTERFACE_ACTIONSOURCE2 = "javax.faces.component.ActionSource2"; //$NON-NLS-1$
-    /**
-     * Interface name for NamingContainer's
-     */
-    public final static String INTERFACE_NAMINGCONTAINER = "javax.faces.component.NamingContainer"; //$NON-NLS-1$
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param isRendered
-     * @return a new component info
-     */
-    public static ComponentInfo createComponentInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final boolean isRendered)
-    {
-        return new ComponentInfo(id, parent, typeInfo, isRendered);
-    }
-
-    /**
-     * If the rendered attribute isn't set, defaults it.
-     * 
-     * @param attributes
-     */
-    public static void maybeDefaultRendered(final Map attributes)
-    {
-        if (!(attributes.get("rendered") instanceof Boolean)) //$NON-NLS-1$
-        {
-            attributes.put("rendered", Boolean.TRUE); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @param parent
-     * @param componentTypeInfo
-     * @param attributes
-     * @return a new component info
-     */
-    public static ComponentInfo createComponentInfo(final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        return new ComponentInfo(parent, componentTypeInfo, attributes);
-    }
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param editableValueHolder
-     * @param isRendered
-     * @return a new UIInputInfo
-     */
-    public static UIInputInfo createUIInputInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final IEditableValueHolderInfo editableValueHolder,
-            final boolean isRendered)
-    {
-        return new UIInputInfo(id, parent, typeInfo, editableValueHolder,
-                isRendered);
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     * @return a new UIInputInfo
-     */
-    public static UIInputInfo createUIInputInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        return new UIInputInfo(parent, typeInfo, attributes);
-    }
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param valueHolderInfo
-     * @param isRendered
-     * @return a new UIOutputInfo
-     */
-    public static UIOutputInfo createUIOutputInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final IValueHolderInfo valueHolderInfo, final boolean isRendered)
-    {
-        return new UIOutputInfo(id, parent, typeInfo, valueHolderInfo,
-                isRendered);
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     * @return a new UIOutputInfo
-     */
-    public static UIOutputInfo createUIOutputInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        return new UIOutputInfo(parent, typeInfo, attributes);
-    }
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param actionSourceInfo
-     * @param isRendered
-     * @return a new UICommandInfo
-     */
-    public static UICommandInfo createUICommandInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final IActionSourceInfo actionSourceInfo, final boolean isRendered)
-    {
-        return new UICommandInfo(id, parent, typeInfo, isRendered,
-                actionSourceInfo);
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     * @return a new UICommandInfo
-     */
-    public static UICommandInfo createUICommandInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        return new UICommandInfo(parent, typeInfo, attributes);
-    }
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param isRendered
-     * @param prependId
-     * @param submitted
-     * @return a new UIFormInfo
-     */
-    public static UIFormInfo createUIFormInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final boolean isRendered, final boolean prependId,
-            final boolean submitted)
-    {
-        return new UIFormInfo(id, parent, typeInfo, isRendered, prependId,
-                submitted);
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     * @return a new UIFormInfo
-     */
-    public static UIFormInfo createUIFormInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        maybeDefaultPrependId(attributes);
-        maybeDefaultSubmitted(attributes);
-        return new UIFormInfo(parent, typeInfo, attributes);
-    }
-
-    private static void maybeDefaultSubmitted(Map attributes)
-    {
-        if (!(attributes.get("submitted") instanceof Boolean)) //$NON-NLS-1$
-        {
-            attributes.put("submitted", Boolean.FALSE); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultPrependId(Map attributes)
-    {
-        if (!(attributes.get("prependId") instanceof Boolean)) //$NON-NLS-1$
-        {
-            attributes.put("prependId", Boolean.FALSE); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param isRendered
-     * @param dataModel
-     * @param first
-     * @param footer
-     * @param header
-     * @param rowCount
-     * @param rowAvailable
-     * @param rowData
-     * @param rowIndex
-     * @param rows
-     * @param value
-     * @param var
-     * @return a new UIDataInfo
-     */
-    public static UIDataInfo createUIDataInfo(final String id,
-            final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final boolean isRendered, final DataModelInfo dataModel,
-            final int first, final ComponentInfo footer,
-            final ComponentInfo header, final int rowCount,
-            final boolean rowAvailable, final Object rowData,
-            final int rowIndex, final int rows, final Object value,
-            final String var)
-    {
-        return new UIDataInfo(id, parent, typeInfo, isRendered, dataModel,
-                first, footer, header, rowCount, rowAvailable, rowData,
-                rowIndex, rows, value, var);
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     * @return the UIDataInfo
-     */
-    public static UIDataInfo createUIDataInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, final Map attributes)
-    {
-        maybeDefaultRendered(attributes);
-        maybeDefaultFirst(attributes);
-        maybeDefaultRowCount(attributes);
-        maybeDefaultRowAvailable(attributes);
-        maybeDefaultRowIndex(attributes);
-        maybeDefaultRows(attributes);
-        maybeDefaultVar(attributes);
-        return new UIDataInfo(parent, typeInfo, attributes);
-    }
-
-
-    private static final Integer ZERO = new Integer(0);
-    private static final Integer MINUS_ONE = new Integer(-1);
-
-    private static void maybeDefaultFirst(Map attributes)
-    {
-        if (!(attributes.get("first") instanceof Integer)) //$NON-NLS-1$
-        {
-            attributes.put("first", ZERO); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultRowCount(Map attributes)
-    {
-        if (!(attributes.get("rowCount") instanceof Integer)) //$NON-NLS-1$
-        {
-            attributes.put("rowCount", MINUS_ONE); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultRowAvailable(Map attributes)
-    {
-        if (! (attributes.get("rowAvailable") instanceof Boolean)) //$NON-NLS-1$
-        {
-            attributes.put("rowAvailable", Boolean.FALSE); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultRowIndex(Map attributes)
-    {
-        if (! (attributes.get("rowIndex") instanceof Integer)) //$NON-NLS-1$
-        {
-            attributes.put("rowIndex", MINUS_ONE); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultRows(Map attributes)
-    {
-        if (! (attributes.get("rows") instanceof Integer)) //$NON-NLS-1$
-        {
-            attributes.put("rows", ZERO); //$NON-NLS-1$
-        }
-    }
-
-    private static void maybeDefaultVar(Map attributes)
-    {
-        if (! (attributes.get("var") instanceof String)) //$NON-NLS-1$
-        {
-            attributes.put("var", "** default variable **"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentInfo.java
deleted file mode 100644
index 6bb4629..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentInfo.java
+++ /dev/null
@@ -1,930 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.io.Serializable;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.AbstractVisitor.VisitationPolicy;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.FacetDecorator;
-
-/**
- * Models a basic UI component instance
- * 
- * TODO: should implement a visitor pattern to traverse component trees
- * 
- * @author cbateman
- * 
- */
-public class ComponentInfo extends ViewObject implements Serializable,
-        IVisitable
-{
-    /**
-     * serializable id
-     */
-    private static final long             serialVersionUID     = 2517204356825585699L;
-
-    private final static int              DEFAULT_ARRAY_SIZE   = 4;
-
-    private transient BeanPropertyManager _beanPropertyManager;
-    /**
-     * Encapsulates all of the data for the view object
-     */
-    protected final ComponentInfoData     _data;
-
-    // initialized
-    // by
-    // getBeanProperties
-
-    /**
-     * @param id
-     * @param parent
-     * @param componentTypeInfo
-     * @param isRendered
-     */
-    protected ComponentInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo, final boolean isRendered)
-    {
-        super(new ComponentInfoData(id, parent, componentTypeInfo, isRendered));
-        _data = (ComponentInfoData) super.getData();
-        
-        final Set propExclude = new HashSet();
-        propExclude.add("attributeNames"); //$NON-NLS-1$
-        propExclude.add("componentTypeInfo"); //$NON-NLS-1$
-        propExclude.add("valueChangeListeners"); //$NON-NLS-1$
-        propExclude.add("visitableChildren"); //$NON-NLS-1$
-
-        _beanPropertyManager = new BeanPropertyManager(this, propExclude);
-    }
-
-    /**
-     * @param data
-     */
-    protected ComponentInfo(final ComponentInfoData data)
-    {
-        super(data);
-        _data = data;
-    }
-
-    /**
-     * Construct a new component info using the attributes keyed by name in
-     * attributes to set values. The names must match the corresponding bean
-     * property names. Primitives should be wrapped in their corresponding
-     * object types. Exceptions will be thrown if there is a type mismatch on an
-     * expected type. Number will be used for all numeric primitive wrappers an
-     * the corresponding "to" will be called.
-     * 
-     * @param parent
-     * @param componentTypeInfo
-     * @param attributes
-     * @throws ClassCastException
-     *             if an attribute's value doesn't match the expected type
-     * @throws NullPointerException
-     *             if an attribute value is null for a value whose type is
-     *             expected to be primitive
-     * @throws IllegalArgumentException
-     *             if attributes does not contain a required key.
-     */
-    protected ComponentInfo(final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo, final Map attributes)
-    {
-        this(getStringProperty("id", attributes, false), parent, //$NON-NLS-1$
-                componentTypeInfo, getBooleanProperty("rendered", attributes, false)); //$NON-NLS-1$
-    }
-
-    /**
-     * @param key
-     * @param attributes
-     * @param mandatory
-     * @return the value in attributes at location key, forcing a
-     *         ClassCastException if it turns out not to be a String.
-     * @throws ClassCastException
-     *             if the attribute for key is not a String
-     * @throws IllegalArgumentException
-     *             if the attribute for key is null but mandatory is true.
-     */
-    protected static String getStringProperty(final String key,
-            final Map attributes, final boolean mandatory)
-    {
-        final Object value = attributes.get(key);
-
-        if (mandatory && value == null)
-        {
-            throw new IllegalArgumentException(key
-                    + " is a mandatory attribute"); //$NON-NLS-1$
-        }
-        return (String) value;
-    }
-
-    /**
-     * @param key
-     * @param attributes
-     * @param mandatory 
-     * 
-     * @return the value in attributes at location, forcing a ClassCastExceptio
-     *         if it is not a Boolean and mandatory.  returns false if no value
-     *         and not mandatory
-     * @throws IllegalArgumentException
-     *             if key is not found and value is mandatory
-     */
-    protected static boolean getBooleanProperty(final String key,
-            final Map attributes, final boolean mandatory)
-    {
-        final Boolean value = (Boolean) attributes.get(key);
-
-        if (value == null)
-        {
-            if (mandatory)
-            {
-                throw new IllegalArgumentException(key + "is mandatory"); //$NON-NLS-1$
-            }
-            return false;
-        }
-
-        return value.booleanValue();
-    }
-
-    /**
-     * @param key
-     * @param attributes
-     * @return the integer property for key. Casts the value to Number and calls
-     *         Number.intValue().  0 if no value.
-     */
-    protected static int getIntegerProperty(final String key,
-            final Map attributes)
-    {
-        final Number value = (Number) attributes.get(key);
-
-        if (value == null)
-        {
-            return 0;
-        }
-
-        return value.intValue();
-    }
-
-    /**
-     * @param key
-     * @param attributes
-     * @return the component info value from attributes
-     */
-    protected static ComponentInfo getComponentProperty(final String key,
-            final Map attributes)
-    {
-        return (ComponentInfo) attributes.get(key);
-    }
-
-    /**
-     * @return the id
-     */
-    public final String getId()
-    {
-        return _data.getId();
-    }
-
-    /**
-     * @return the component type info
-     */
-    public final ComponentTypeInfo getComponentTypeInfo()
-    {
-        return _data.getComponentTypeInfo();
-    }
-
-    /**
-     * Pre-condition: isModifiable() == true Post-condition: getChildren() will
-     * return an empty list.
-     */
-    protected final void clearChildren()
-    {
-        _data.getChildren().clear();
-    }
-
-    /**
-     * @return the children. List is unmodifiable. List contains all children
-     *         including facets.
-     */
-    public final List/* <ComponentInfo> */getChildren()
-    {
-        if (_data.isProtected())
-        {
-            return _data.getChildren();
-        }
-        return Collections.unmodifiableList(_data.getChildren());
-    }
-
-    /**
-     * Get the sub-set of {@link #getChildren()} that are facets. This is a
-     * convenience method for {@link #getDecorators(Class)}
-     * 
-     * @return all component children that are facets
-     */
-    public final List getFacets()
-    {
-        return getDecorators(ComponentFactory.FACET);
-    }
-
-    /**
-     * @param childComponent
-     */
-    public final void addChild(final ComponentInfo childComponent)
-    {
-        if (childComponent == this)
-        {
-            throw new IllegalArgumentException(
-                    "A component cannot be its own child"); //$NON-NLS-1$
-        }
-        _data.addChild(childComponent);
-        // we need to reset the child's parent to me
-        childComponent.setParent(this);
-    }
-
-    /**
-     * @param parent
-     */
-    public final void setParent(ComponentInfo parent)
-    {
-        _data.setParent(parent);
-    }
-
-    /**
-     * @param name
-     * @param facetComponent
-     */
-    public final void addFacet(final String name,
-            final ComponentInfo facetComponent)
-    {
-        addChild(facetComponent);
-        addDecorator(new FacetDecorator(name, facetComponent));
-    }
-
-    /**
-     * @param component
-     * @return if component corresponds to a facet of this component, returns
-     *         the name of that facet. Returns null if not found.
-     */
-    public final String getFacetName(final ComponentInfo component)
-    {
-        if (component == null)
-        {
-            return null;
-        }
-
-        final List facets = getDecorators(ComponentFactory.FACET);
-
-        for (final Iterator it = facets.iterator(); it.hasNext();)
-        {
-            final FacetDecorator facet = (FacetDecorator) it.next();
-            if (component == facet.getDecorates())
-            {
-                return facet.getName();
-            }
-        }
-
-        // component is not a facet
-        return null;
-    }
-
-    /**
-     * @param name
-     * @return if this has a facet called name, then returns it's single root
-     *         component.
-     */
-    public final ComponentInfo getFacet(final String name)
-    {
-        if (name == null)
-        {
-            return null;
-        }
-
-        final List facets = getDecorators(ComponentFactory.FACET);
-
-        for (final Iterator it = facets.iterator(); it.hasNext();)
-        {
-            final FacetDecorator facet = (FacetDecorator) it.next();
-            if (name.equals(facet.getName()))
-            {
-                return facet.getDecorates();
-            }
-        }
-
-        // not found
-        return null;
-    }
-
-    public String toString()
-    {
-        final String parentId = getParent() != null ? getParent().getId()
-                : "null"; //$NON-NLS-1$
-        String toString = getMostSpecificComponentName() + ": id=" //$NON-NLS-1$
-                + _data.getId() + ", parentId: " + parentId + ", family=" //$NON-NLS-1$ //$NON-NLS-2$
-                + getComponentTypeInfo().getComponentFamily() + ", render=" //$NON-NLS-1$
-                + getComponentTypeInfo().getRenderFamily() + ", rendered=" //$NON-NLS-1$
-                + isRendered();
-
-        // use bean introspection to dump child properties
-        if (this.getClass() != ComponentInfo.class)
-        {
-            toString += dumpProperties();
-        }
-
-        return toString;
-    }
-
-    private String dumpProperties()
-    {
-        String properties = ""; //$NON-NLS-1$
-        try
-        {
-            final BeanInfo beanInfo = Introspector.getBeanInfo(this.getClass(),
-                    ComponentInfo.class);
-
-            final PropertyDescriptor[] descriptors = beanInfo
-                    .getPropertyDescriptors();
-            for (int i = 0; i < descriptors.length; i++)
-            {
-                final PropertyDescriptor desc = descriptors[i];
-                final String name = desc.getName();
-                final Object valueObj = desc.getValue(name);
-                final String value = valueObj != null ? valueObj.toString()
-                        : "null"; //$NON-NLS-1$
-                properties += ", " + name + "=" + value; //$NON-NLS-1$ //$NON-NLS-2$
-            }
-        }
-        catch (final IntrospectionException e)
-        {
-            return "Error introspecting bean: " + e.getLocalizedMessage(); //$NON-NLS-1$
-        }
-
-        return properties;
-    }
-
-    /**
-     * @return used for toString. Clients should not use.
-     */
-    protected String getMostSpecificComponentName()
-    {
-        return "UIComponent"; //$NON-NLS-1$
-    }
-
-    /**
-     * @return the parent of this component or null.
-     */
-    public final ComponentInfo getParent()
-    {
-        return _data.getParent();
-    }
-
-    /**
-     * @return the rendered flag
-     */
-    public final boolean isRendered()
-    {
-        return _data.isRendered();
-    }
-
-    public synchronized void addAdapter(final Class adapterType,
-            final Object adapter)
-    {
-        super.addAdapter(adapterType, adapter);
-
-        // force an update on the next call to getBeanProperties
-        _beanPropertyManager.reset();
-    }
-
-    public synchronized Object removeAdapter(final Class adapterType)
-    {
-        final Object removed = super.removeAdapter(adapterType);
-
-        _beanPropertyManager.reset();
-
-        return removed;
-    }
-
-    /**
-     * @return the set of all bean property names for this component. The set is
-     *         unmodifiable and will throw exceptions if modification is
-     *         attempted.
-     */
-    protected final Map/* <String, ComponentBeanProperty> */getBeanProperties()
-    {
-        return Collections.unmodifiableMap(_beanPropertyManager
-                .getBeanProperties());
-    }
-
-    /**
-     * @author cbateman
-     * 
-     */
-    public static class ComponentInfoData extends ViewObjectData
-    {
-        /**
-         * 
-         */
-        private static final long         serialVersionUID                = 5052732412917986062L;
-        /**
-         * the component id
-         */
-        private final String              _id;
-        /**
-         * the component's parent or null if none
-         */
-        private ComponentInfo             _parent;
-
-        /**
-         * the type info for this component
-         */
-        protected final ComponentTypeInfo _componentTypeInfo;
-        /**
-         * the rendered flage
-         */
-        protected final boolean           _isRendered;
-
-        private List                     /* <ComponentInfo> */_children = new ArrayList(
-                                                                                  DEFAULT_ARRAY_SIZE);
-
-        /**
-         * @param id
-         * @param parent
-         * @param componentTypeInfo
-         * @param isRendered
-         */
-        public ComponentInfoData(final String id, ComponentInfo parent,
-                ComponentTypeInfo componentTypeInfo, boolean isRendered)
-        {
-            super(false);
-            _id = id;
-            _parent = parent;
-            _componentTypeInfo = componentTypeInfo;
-            _isRendered = isRendered;
-        }
-
-        /**
-         * @param childComponent
-         */
-        protected void addChild(ComponentInfo childComponent)
-        {
-            enforceProtection();
-
-            getChildren().add(childComponent);
-        }
-
-        /**
-         * @return the modifiable list of children
-         */
-        protected final List/* <ComponentInfo> */getChildren()
-        {
-            return _children;
-        }
-
-        protected void doBeforeProtecting()
-        {
-            super.doBeforeProtecting();
-            // compact the children array list
-            if (_children.size() > 0)
-            {
-                _children = Collections.unmodifiableList(_children);
-            }
-            else
-            {
-                _children = Collections.EMPTY_LIST;
-            }
-        }
-
-        /**
-         * @return the isRendered flag
-         */
-        protected final boolean isRendered()
-        {
-            return _isRendered;
-        }
-
-        /**
-         * @return the component type info flag
-         */
-        protected final ComponentTypeInfo getComponentTypeInfo()
-        {
-            return _componentTypeInfo;
-        }
-
-        /**
-         * @return the parent or null if no parent
-         */
-        protected final ComponentInfo getParent()
-        {
-            return _parent;
-        }
-
-        /**
-         * @param parent
-         */
-        protected final void setParent(ComponentInfo parent)
-        {
-            enforceProtection();
-            _parent = parent;
-        }
-
-        /**
-         * @return the component id
-         */
-        protected final String getId()
-        {
-            return _id;
-        }
-    }
-
-    /**
-     * This is similar to the runtime getAttributes().get(name) call. The reason
-     * we don't implement a Map of all attribute values is that the implicit
-     * property structure can change at any time due to add/removeAdapter. To
-     * get all attributes known for a component, instead use:
-     * 
-     * The synchronized block is advised to protect against concurrent
-     * modification exceptions on the keySet iterator.
-     * 
-     * @param name
-     * 
-     * @return the value of the attribute or null if none.
-     * 
-     */
-    public synchronized ComponentBeanProperty getAttribute(final String name)
-    {
-        return (ComponentBeanProperty) getBeanProperties().get(name);
-    }
-
-    /**
-     * @return the set of valid attribute names. The Set is not modifiable.
-     */
-    public synchronized Set/* <String> */getAttributeNames()
-    {
-        return getBeanProperties().keySet();
-    }
-
-    /**
-     * Stores a bean property descriptor along information about which
-     * implementation class declares it and what key to pass to getAdapter() in
-     * order to get it.
-     * 
-     */
-    public final static class ComponentBeanProperty
-    {
-        private final PropertyDescriptor _propertyDescriptor;
-        private final Object             _declaringImplementation;
-        private final Class              _adapterKeyClass;
-
-        // only instantiable locally
-        private ComponentBeanProperty(Class adapterKeyClass,
-                Object declaringImplementationClass,
-                PropertyDescriptor propertyDescriptor)
-        {
-            super();
-            _adapterKeyClass = adapterKeyClass;
-            _declaringImplementation = declaringImplementationClass;
-            _propertyDescriptor = propertyDescriptor;
-        }
-
-        /**
-         * @return the value of property
-         */
-        public final Object getValue()
-        {
-            final Method method = _propertyDescriptor.getReadMethod();
-            if (method != null)
-            {
-                try
-                {
-                    method.setAccessible(true);
-                    return method.invoke(_declaringImplementation,
-                            new Object[0]);
-                }
-                catch (IllegalArgumentException e)
-                {
-                    e.printStackTrace();
-                }
-                catch (IllegalAccessException e)
-                {
-                    e.printStackTrace();
-                }
-                catch (InvocationTargetException e)
-                {
-                    e.printStackTrace();
-                }
-            }
-            // if any step fails, return null
-            return null;
-        }
-
-        /**
-         * @return the property descriptor
-         */
-        public final PropertyDescriptor getPropertyDescriptor()
-        {
-            return _propertyDescriptor;
-        }
-
-        /**
-         * @return the implemenation
-         */
-        public final Object getDeclaringImplementationClass()
-        {
-            return _declaringImplementation;
-        }
-
-        /**
-         * @return the adapter class for the interface that the declaring
-         *         implementation is providing the impl for
-         */
-        public final Class getAdapterKeyClass()
-        {
-            return _adapterKeyClass;
-        }
-    }
-
-    /**
-     * Manages bean property information for a component
-     * 
-     * @author cbateman
-     * 
-     */
-    protected final static class BeanPropertyManager
-    {
-        /**
-         * a map of the bean property names exposed by this component including
-         * all those added by addAdapter().
-         * 
-         * this is synthetic based the class definition and installed adapters
-         * so as long that info is available, no need to serialize.
-         */
-        protected transient Map              /*
-                                                 * <String,
-                                                 * ComponentBeanProperty>
-                                                 */_beanProperties; // lazily
-        private final transient ComponentInfo _component;
-        private final transient Set _excludeNames;
-
-        /**
-         * @param component
-         * @param excludeNames 
-         */
-        protected BeanPropertyManager(final ComponentInfo component,
-                final Set excludeNames)
-        {
-            _component = component;
-            _excludeNames = excludeNames;
-        }
-
-        /**
-         * Will throw exception of the calling thread already holds the "this"
-         * monitor lock. This is to ensure that caller always acquires locks in
-         * appropriate order to prevent deadlock.
-         * 
-         * @return the internal set of bean properties. This Set may be modified
-         *         internally.
-         */
-        public Map getBeanProperties()
-        {
-            if (Thread.holdsLock(this))
-            {
-                throw new IllegalStateException(
-                        "Must not already own this lock"); //$NON-NLS-1$
-            }
-
-            // must always acquire component lock first to prevent deadlock
-            synchronized (_component)
-            {
-                synchronized (this)
-                {
-                    if (_beanProperties == null)
-                    {
-                        _beanProperties = calculateAllBeanPropNames(ViewObject.class);
-                    }
-
-                    return _beanProperties;
-                }
-            }
-        }
-
-        /**
-         * Will throw exception if the calling thread already holds the "this"
-         * monitor lock. This is to ensure that caller always acquires locks in
-         * appropriate order to prevent deadlock.
-         * 
-         * Clears the internal map and sets to null. This will force it to be
-         * completely new built on the next call to getBeanProperties
-         */
-        public void reset()
-        {
-            if (Thread.holdsLock(this))
-            {
-                throw new IllegalStateException(
-                        "Must not already own this lock"); //$NON-NLS-1$
-            }
-
-            // must always acquire component lock first to prevent deadlock
-            synchronized (_component)
-            {
-                synchronized (this)
-                {
-                    if (_beanProperties != null)
-                    {
-                        _beanProperties.clear();
-                        _beanProperties = null;
-                    }
-                }
-            }
-        }
-
-        /**
-         * @param stopClass
-         * @return a synchronized map of all bean property names on this class
-         *         up to stopClass, as well as all adapter property names (as
-         *         though this really implemented them).
-         */
-        private Map calculateAllBeanPropNames(final Class stopClass)
-        {
-            // use a set to prevents the duplicates
-            final Map allProperties = new HashMap();
-
-            {
-                final Class myClass = _component.getClass();
-                final List myProperties = getOrCreateBeanProperties(myClass,
-                        stopClass);
-
-                addToMap(myProperties, _component, myClass, allProperties, _excludeNames);
-            }
-
-            {
-                for (final Iterator it = _component.getAdapterMap().entrySet()
-                        .iterator(); it.hasNext();)
-                {
-                    Map.Entry entry = (Entry) it.next();
-
-                    final Class adapterClass = (Class) entry.getKey();
-                    final Object declaringClass = entry.getValue();
-                    // get all props, excluding the ones on Object.
-                    final List props = getOrCreateBeanProperties(adapterClass,
-                            null);
-                    addToMap(props, declaringClass, adapterClass, allProperties,
-                            _excludeNames);
-                }
-            }
-
-            return Collections.synchronizedMap(allProperties);
-        }
-
-        private static void addToMap(
-                final List/* <ComponentBeanProperty> */addThese,
-                final Object declaringObject, final Class declaringAdapter,
-                final Map toMe,
-                Set excludeNames)
-        {
-            for (final Iterator it = addThese.iterator(); it.hasNext();)
-            {
-                final PropertyDescriptor desc = (PropertyDescriptor) it.next();
-
-                if (!toMe.containsKey(desc.getName())
-                    && !excludeNames.contains(desc.getName()))
-                {
-                    toMe.put(desc.getName(), new ComponentBeanProperty(
-                            declaringAdapter, declaringObject, desc));
-                }
-            }
-        }
-
-        /**
-         * lazily loaded with the local properties (those not defined using
-         * adapters)
-         * 
-         * MUST INITIALIZE early so can synchronize on it
-         */
-        private transient static Map /* <Class, List<PropertyDescriptor> */PROPERTY_MAP = new HashMap();
-
-        /**
-         * @param startClass
-         * @param stopClass
-         * @return a unmodifiable list of properties starting from startClass.
-         *         stopClass is only used if an entry doesn't already exist in
-         *         PROPERTY_MAP for startClass. The method is synchronized on
-         *         the PROPERTY_MAP it updates.
-         */
-        protected static List/* <PropertyDescriptor */getOrCreateBeanProperties(
-                final Class startClass, final Class stopClass)
-        {
-            synchronized (PROPERTY_MAP)
-            {
-                List localBeanProps = (List) PROPERTY_MAP.get(startClass);
-
-                if (localBeanProps == null)
-                {
-                    localBeanProps = calculateBeanProperties(startClass,
-                            stopClass);
-                    PROPERTY_MAP.put(startClass, Collections
-                            .unmodifiableList(localBeanProps));
-                }
-
-                return localBeanProps;
-            }
-        }
-
-        /**
-         * @param startClass
-         * @param stopClass
-         * @return a List<String> containing all of the bean names between
-         *         startClass and stopClass. Start class must be a descendant
-         *         (sub-class, sub-sub-class etc.) of stopClass. The properties
-         *         on stopClass are excluded from analysis.
-         */
-        private static List/* <PropertyDescriptor> */calculateBeanProperties(
-                final Class startClass, final Class stopClass)
-        {
-            BeanInfo beanInfo;
-            List names = new ArrayList();
-
-            try
-            {
-                beanInfo = Introspector.getBeanInfo(startClass, stopClass);
-                final PropertyDescriptor[] descriptors = beanInfo
-                        .getPropertyDescriptors();
-
-                if (descriptors != null)
-                {
-                    names = Arrays.asList(descriptors);
-                }
-            }
-            catch (final IntrospectionException e)
-            {
-                e.printStackTrace();
-            }
-            return names;
-        }
-
-    }
-
-    /**
-     * Visits this node and it's entire tree and makes all nodes protected.
-     */
-    public final void setSubtreeProtected()
-    {
-        // lock children first
-        final ComponentTreeVisitor protectionVisitor = new ComponentTreeVisitor(VisitationPolicy.ChildrenFirstPolicy)
-        {
-            public void visit(ComponentInfo component)
-            {
-                component.setProtected();
-            }
-        };
-        
-        accept(protectionVisitor);
-    }
-
-    public void accept(AbstractVisitor visitor)
-    {
-        // check policy ordering
-        if (visitor.getPolicy().getOrdering() == VisitationPolicy.VISIT_PARENT_FIRST)
-        {
-            visitor.visit(this);
-            visitChildren(visitor);
-        }
-        else
-        {
-            visitChildren(visitor);
-            visitor.visit(this);
-        }
-    }
-
-    private void visitChildren(AbstractVisitor visitor)
-    {
-        for (final Iterator it = getVisitableChildren(); it.hasNext();)
-        {
-            visitor.visit(it.next());
-        }
-    }
-
-    public Iterator getVisitableChildren()
-    {
-        return getChildren().iterator();
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTreeVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTreeVisitor.java
deleted file mode 100644
index 4bedc7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTreeVisitor.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-/**
- * An abstract class sub-classed by objects that wish to apply a Visitor pattern
- * type visitation to a component tree.
- * 
- * @author cbateman
- * 
- */
-public abstract class ComponentTreeVisitor extends AbstractVisitor
-{
-    /**
-     * @param policy
-     */
-    public ComponentTreeVisitor(final VisitationPolicy policy)
-    {
-        super(policy);
-    }
-
-    /**
-     * @param component
-     */
-    public abstract void visit(final ComponentInfo component);
-
-    public final void visit(final Object object)
-    {
-        visit((ComponentInfo) object);
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTypeInfo.java
deleted file mode 100644
index 74c7c9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/ComponentTypeInfo.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
-
-/**
- * Type information about a UIComponent
- * 
- * @author cbateman
- * 
- */
-public class ComponentTypeInfo extends ClassTypeInfo
-{
-    /**
-     * serializable uid
-     */
-    private static final long serialVersionUID = -311156682935177206L;
-    /**
-     * the ComponentType (see JSF spec for definition)
-     */
-    protected final String _componentType; // may be null, since may not be
-    // known at runtime
-    /**
-     * the component family (see JSF spec)
-     */
-    protected final String _componentFamily;
-    /**
-     * the render family (see JSF spec)
-     */
-    protected final String _renderFamily;
-    
-    /**
-     * @param componentType
-     * @param componentClass
-     * @param componentFamily
-     * @param renderFamily
-     */
-    public ComponentTypeInfo(final String componentType,
-            final String componentClass, final String componentFamily,
-            final String renderFamily)
-    {
-        super(componentClass, new String[0], new String[0]);
-        _componentType = componentType;
-        _componentFamily = componentFamily;
-        _renderFamily = renderFamily;
-    }
-
-    /**
-     * @param componentType
-     * @param superClasses
-     * @param interfaces
-     * @param componentClass
-     * @param componentFamily
-     * @param renderFamily
-     */
-    public ComponentTypeInfo(final String componentType,
-            final String componentClass, 
-            final String[] superClasses, final String[] interfaces,
-            final String componentFamily,
-            final String renderFamily)
-    {
-        super(componentClass, superClasses, interfaces);
-        _componentType = componentType;
-        _componentFamily = componentFamily;
-        _renderFamily = renderFamily;
-    }
-
-    /**
-     * @return the component type or null if unknown (may not be at runtime)
-     */
-    public final String getComponentType()
-    {
-        return _componentType;
-    }
-
-    /**
-     * @return the component family
-     */
-    public final String getComponentFamily()
-    {
-        return _componentFamily;
-    }
-
-    /**
-     * @return the render family
-     */
-    public final String getRenderFamily()
-    {
-        return _renderFamily;
-    }
-
-    public String toString()
-    {
-        return "Component Type Info: type = " + _componentType + " family=" + _componentFamily //$NON-NLS-1$ //$NON-NLS-2$
-                + " renderer=" + _renderFamily + ", "+super.toString(); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/IVisitable.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/IVisitable.java
deleted file mode 100644
index 6ddd83b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/IVisitable.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Iterator;
-
-/**
- * Implemented by a class that can accept visitors
- *
- */
-interface IVisitable
-{
-    /**
-     * Called on a visitable to accept a visitor
-     * 
-     * @param visitor
-     */
-    void accept(AbstractVisitor visitor);
-    
-    /**
-     * @return an iterator that returns IVisitable children.
-     */
-    Iterator getVisitableChildren();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UICommandInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UICommandInfo.java
deleted file mode 100644
index 9ff50f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UICommandInfo.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IActionSource2Info;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IActionSourceInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ActionListenerDecorator;
-
-/**
- * An design time analog of the standard UICommand.
- * @author cbateman
- *
- */
-public class UICommandInfo extends ComponentInfo implements IActionSource2Info {
-    private final String _actionExpression;
-    private final String _actionListener;
-    private final boolean _isImmediate;
-
-    /**
-     * serialization id
-     */
-    private static final long serialVersionUID = -9025172832535840949L;
-
-    /**
-     * @param id
-     * @param parent
-     * @param componentTypeInfo
-     * @param isRendered
-     * @param actionSourceInfo
-     */
-    protected UICommandInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo,
-            final boolean isRendered, final IActionSourceInfo actionSourceInfo) {
-        super(id, parent, componentTypeInfo, isRendered);
-
-        if (actionSourceInfo == null) {
-            _actionExpression = null;
-            _actionListener = null;
-            _isImmediate = false;
-        } else {
-            // TODO: having action and actionExpression will come back to
-            // to bite us.
-            _actionExpression = actionSourceInfo.getAction();
-            _actionListener = actionSourceInfo.getActionListener();
-            _isImmediate = actionSourceInfo.isImmediate();
-
-            for (final Iterator it = actionSourceInfo.getActionListeners()
-                    .iterator(); it.hasNext();) {
-                final ActionListenerDecorator actionListener = 
-                    (ActionListenerDecorator) it.next();
-                addActionListener(actionListener);
-            }
-        }
-    }
-
-    /**
-     * @param parent
-     * @param componentTypeInfo
-     * @param attributes
-     */
-    protected UICommandInfo(final ComponentInfo parent, final ComponentTypeInfo componentTypeInfo,
-            Map attributes)
-    {
-        this(getStringProperty("id", attributes, true), //$NON-NLS-1$
-                parent, componentTypeInfo,
-                getBooleanProperty("rendered", attributes, false), //$NON-NLS-1$
-                getActionSourceInfo("$actionSourceInfo", attributes) //$NON-NLS-1$
-                );
-    }
-    
-    private static IActionSourceInfo getActionSourceInfo(String key,
-            Map attributes)
-    {
-        return (IActionSourceInfo) attributes.get(key);
-    }
-
-    public String getActionExpression() {
-        return _actionExpression;
-    }
-
-    public final void addActionListener(final ActionListenerDecorator actionListener) {
-        addDecorator(actionListener, ComponentFactory.ACTION_LISTENER);
-    }
-
-    public final String getAction() {
-        return _actionExpression;
-    }
-
-    public final String getActionListener() {
-        return _actionListener;
-    }
-
-    public final List getActionListeners() {
-        return getDecorators(ComponentFactory.ACTION_LISTENER);
-    }
-
-    public final boolean isImmediate() {
-        return _isImmediate;
-    }
-
-    protected String getMostSpecificComponentName()
-    {
-        return "UICommand"; //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIDataInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIDataInfo.java
deleted file mode 100644
index 56981af..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIDataInfo.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.bean.DataModelInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.bean.SerializableObject;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.INamingContainerInfo;
-
-/**
- * Design time analog to UIData.
- * 
- * @author cbateman
- * 
- */
-public class UIDataInfo extends ComponentInfo implements INamingContainerInfo
-{
-    /**
-     * the standard name for the footer facet
-     */
-    public final static String FACET_NAME_FOOTER = "footer"; //$NON-NLS-1$
-    /**
-     * the standard name for the header facet.
-     */
-    public final static String FACET_NAME_HEADER = "header"; //$NON-NLS-1$
-    /**
-     * serialization id
-     */
-    private static final long serialVersionUID = 3473288390914978784L;
-
-    private final DataModelInfo _dataModel;
-    private final int _first;
-    private final int _rowCount;
-    private final boolean _rowAvailable;
-    private final SerializableObject _rowData;
-    private final int _rowIndex;
-    private final int _rows;
-    private final SerializableObject _value;
-    private final String _var;
-
-    /**
-     * @param id
-     * @param parent
-     * @param componentTypeInfo
-     * @param isRendered
-     * @param dataModel
-     * @param first
-     * @param footer
-     * @param header
-     * @param rowCount
-     * @param rowAvailable
-     * @param rowData
-     * @param rowIndex
-     * @param rows
-     * @param value
-     * @param var
-     */
-    public UIDataInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo,
-            final boolean isRendered, final DataModelInfo dataModel,
-            final int first, final ComponentInfo footer,
-            final ComponentInfo header, final int rowCount,
-            final boolean rowAvailable, final Object rowData,
-            final int rowIndex, final int rows, final Object value,
-            final String var)
-    {
-        super(id, parent, componentTypeInfo, isRendered);
-        _dataModel = dataModel;
-        _first = first;
-        _rowCount = rowCount;
-        _rowAvailable = rowAvailable;
-        _rowData = new SerializableObject(rowData);
-        _rowIndex = rowIndex;
-        _rows = rows;
-        _value = new SerializableObject(value);
-        _var = var;
-
-        if (footer != null)
-        {
-            addFacet(FACET_NAME_FOOTER, footer);
-        }
-
-        if (header != null)
-        {
-            addFacet(FACET_NAME_HEADER, header);
-        }
-    }
-
-    /**
-     * @param parent
-     * @param componentTypeInfo
-     * @param attributes
-     */
-    public UIDataInfo(final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo, Map attributes)
-    {
-        this(getStringProperty("id", attributes, true), parent, //$NON-NLS-1$
-                componentTypeInfo, 
-                getBooleanProperty("rendered", attributes, false), //$NON-NLS-1$
-                getDataModelInfo("$dataModel", attributes),  //$NON-NLS-1$
-                getIntegerProperty("first", attributes),  //$NON-NLS-1$
-                getComponentProperty("footer", attributes), //$NON-NLS-1$
-                getComponentProperty("header", attributes),  //$NON-NLS-1$
-                getIntegerProperty("rowCount", attributes),  //$NON-NLS-1$
-                getBooleanProperty("rowAvailable", attributes, false),  //$NON-NLS-1$
-                attributes.get("rowData"), //$NON-NLS-1$
-                getIntegerProperty("rowIndex", attributes),  //$NON-NLS-1$
-                getIntegerProperty("rows", attributes),  //$NON-NLS-1$
-                attributes.get("value"), //$NON-NLS-1$
-                getStringProperty("var", attributes, false)); //$NON-NLS-1$
-    }
-
-    private static DataModelInfo getDataModelInfo(String key, Map attributes)
-    {
-        return (DataModelInfo) attributes.get(key);
-    }
-
-    /**
-     * @return the data model
-     */
-    public final DataModelInfo getDataModel()
-    {
-        return _dataModel;
-    }
-
-    /**
-     * @return the first row
-     */
-    public final int getFirst()
-    {
-        return _first;
-    }
-
-    /**
-     * @return the row count
-     */
-    public final int getRowCount()
-    {
-        return _rowCount;
-    }
-
-    /**
-     * @return true if the row is available
-     */
-    public final boolean isRowAvailable()
-    {
-        return _rowAvailable;
-    }
-
-    /**
-     * @return the row data (may be null if not serialiable)
-     */
-    public final Object getRowData()
-    {
-        return _rowData.getMaybeSerializable();
-    }
-
-    /**
-     * @return the row index
-     */
-    public final int getRowIndex()
-    {
-        return _rowIndex;
-    }
-
-    /**
-     * @return the rows
-     */
-    public final int getRows()
-    {
-        return _rows;
-    }
-
-    /**
-     * @return the value of the model (may be null if not serialiable)
-     */
-    public final Object getValue()
-    {
-        return _value.getMaybeSerializable();
-    }
-
-    /**
-     * @return the name used to define the EL row variable
-     */
-    public final String getVar()
-    {
-        return _var;
-    }
-
-    /**
-     * @return the header facet or null.
-     */
-    public final ComponentInfo getHeader()
-    {
-        return getFacet(FACET_NAME_HEADER);
-    }
-
-    /**
-     * @return the footer facet or null.
-     */
-    public final ComponentInfo getFooter()
-    {
-        return getFacet(FACET_NAME_FOOTER);
-    }
-
-    protected String getMostSpecificComponentName()
-    {
-        return "UIData"; //$NON-NLS-1$
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIFormInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIFormInfo.java
deleted file mode 100644
index 2b82330..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIFormInfo.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.INamingContainerInfo;
-
-/**
- * A design-time analog for the UIForm.
- * 
- * @author cbateman
- */
-public class UIFormInfo extends ComponentInfo implements INamingContainerInfo 
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 6961034911873576644L;
-
-    private final boolean _prependId;
-    private final boolean _submitted;
-    
-    /**
-     * @param id
-     * @param parent
-     * @param componentTypeInfo
-     * @param isRendered
-     * @param prependId
-     * @param submitted
-     */
-    protected UIFormInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo componentTypeInfo, final boolean isRendered
-            , final boolean prependId, final boolean submitted) {
-        super(id, parent, componentTypeInfo, isRendered);
-        _prependId = prependId;
-        _submitted = submitted;
-    }
-    
-    /**
-     * @param parent
-     * @param componentTypeInfo
-     * @param attributes
-     */
-    protected UIFormInfo(final ComponentInfo parent, ComponentTypeInfo componentTypeInfo,
-            Map attributes)
-    {
-        this(getStringProperty("id", attributes, true), //$NON-NLS-1$
-                parent,
-                componentTypeInfo,
-                getBooleanProperty("rendered", attributes, false), //$NON-NLS-1$
-                getBooleanProperty("prependId", attributes, false), //$NON-NLS-1$
-                getBooleanProperty("submitted", attributes, false)); //$NON-NLS-1$
-    }
-    
-    /**
-     * JSF 1.2 only
-     * 
-     * @return true if the form allows its id to be prepended to its 
-     * descendent's ids.
-     */
-    public final boolean isPrependId()
-    {
-        return _prependId;
-    }
-
-    /**
-     * @return true if the form is submitted.
-     */
-    public final boolean isSubmitted() {
-        return _submitted;
-    }
-
-    protected String getMostSpecificComponentName()
-    {
-        return "UIForm"; //$NON-NLS-1$
-    } 
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIInputInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIInputInfo.java
deleted file mode 100644
index 14a6131..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIInputInfo.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IEditableValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorDecorator;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValueChangeListenerDecorator;
-
-/**
- * A design-time analog of the standard UIInput.
- * 
- * @author cbateman
- * 
- */
-public class UIInputInfo extends UIOutputInfo implements
-        IEditableValueHolderInfo
-{
-    /**
-     * serializable uid
-     */
-    private static final long serialVersionUID = -6055473902554910848L;
-    private final boolean _isValid;
-    private final boolean _isImmediate;
-    private final boolean _isRequired;
-    private final Object _submittedValue;
-    private final String _validator;
-    private final String _valueChangeListener;
-    private final boolean _localSetValue;
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param editableValueHolderInfo
-     * @param isRendered
-     */
-    protected UIInputInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo,
-            final IEditableValueHolderInfo editableValueHolderInfo,
-            final boolean isRendered)
-    {
-        super(id, parent, typeInfo, editableValueHolderInfo, isRendered);
-
-        if (editableValueHolderInfo == null)
-        {
-            _isValid = true;
-            _isImmediate = false;
-            _isRequired = false;
-            _localSetValue = false;
-            _submittedValue = null;
-            _validator = null;
-            _valueChangeListener = null;
-        }
-        else
-        {
-            _isValid = editableValueHolderInfo.isValid();
-            _isImmediate = editableValueHolderInfo.isImmediate();
-            _isRequired = editableValueHolderInfo.isRequired();
-            _localSetValue = editableValueHolderInfo.isLocalSetValue();
-            _submittedValue = editableValueHolderInfo.getSubmittedValue();
-            _validator = editableValueHolderInfo.getValidator();
-            _valueChangeListener = editableValueHolderInfo
-                    .getValueChangeListener();
-
-            for (final Iterator it = editableValueHolderInfo.getValidators()
-                    .iterator(); it.hasNext();)
-            {
-                final ValidatorDecorator validator = (ValidatorDecorator) it
-                        .next();
-                addValidator(validator);
-            }
-
-            for (final Iterator it = editableValueHolderInfo
-                    .getValueChangeListeners().iterator(); it.hasNext();)
-            {
-                final ValueChangeListenerDecorator valueChangeListener = (ValueChangeListenerDecorator) it
-                        .next();
-                addValueChangeListener(valueChangeListener);
-            }
-        }
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     */
-    protected UIInputInfo(final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo, Map attributes)
-    {
-        this(getStringProperty("id", attributes, true), parent, typeInfo, //$NON-NLS-1$
-                getEditableValueHolderInfo("$editableValueHolderInfo", //$NON-NLS-1$
-                        attributes), getBooleanProperty("rendered", attributes, false)); //$NON-NLS-1$
-    }
-
-    private static IEditableValueHolderInfo getEditableValueHolderInfo(
-            String key, Map attributes)
-    {
-        return (IEditableValueHolderInfo) attributes.get(key);
-    }
-
-    // public String toString() {
-    // final String toString = super.toString();
-    // return toString + ", isValid=" + _isValid + ", isImmediate="
-    // + _isImmediate + ", isRequired=" + _isRequired;
-    // }
-
-    // @Override
-    protected String getMostSpecificComponentName()
-    {
-        return "UIInput"; //$NON-NLS-1$
-    }
-
-    public final boolean isValid()
-    {
-        return _isValid;
-    }
-
-    public final boolean isImmediate()
-    {
-        return _isImmediate;
-    }
-
-    public final boolean isRequired()
-    {
-        return _isRequired;
-    }
-
-    public final Object getSubmittedValue()
-    {
-        return _submittedValue;
-    }
-
-    public final String getValidator()
-    {
-        return _validator;
-    }
-
-    public final String getValueChangeListener()
-    {
-        return _valueChangeListener;
-    }
-
-    public final boolean isLocalSetValue()
-    {
-        return _localSetValue;
-    }
-
-    public final void addValidator(final ValidatorDecorator validator)
-    {
-        addDecorator(validator, ComponentFactory.VALIDATOR);
-    }
-
-    public final void addValueChangeListener(
-            final ValueChangeListenerDecorator valueChangeListenerInfo)
-    {
-        addDecorator(valueChangeListenerInfo,
-                ComponentFactory.VALUE_CHANGE_LISTENER);
-    }
-
-    public final List getValidators()
-    {
-        return getDecorators(ComponentFactory.VALIDATOR);
-    }
-
-    public final List getValueChangeListeners()
-    {
-        return getDecorators(ComponentFactory.VALUE_CHANGE_LISTENER);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIOutputInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIOutputInfo.java
deleted file mode 100644
index 990028a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/component/UIOutputInfo.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.component;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.IValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.behavioural.ValueHolderInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterDecorator;
-
-/**
- * A design-time analog for the UIOutput
- * 
- * @author cbateman
- *
- */
-public class UIOutputInfo extends ComponentInfo implements IValueHolderInfo {
-    /**
-     * serializable uid
-     */
-    private static final long serialVersionUID = 9096297578991706150L;
-
-    /**
-     * the value
-     */
-    protected final Object _value;
-    /**
-     * the value before any EL evaluation
-     */
-    protected final Object _localValue;
-
-    /**
-     * @param id
-     * @param parent
-     * @param typeInfo
-     * @param valueHolderInfo
-     * @param isRendered
-     */
-    protected UIOutputInfo(final String id, final ComponentInfo parent,
-            final ComponentTypeInfo typeInfo,
-            final IValueHolderInfo valueHolderInfo, final boolean isRendered) {
-        super(id, parent, typeInfo, isRendered);
-
-        if (valueHolderInfo == null) {
-            _value = null;
-            _localValue = null;
-        } else {
-            _value = valueHolderInfo.getValue();
-            _localValue = valueHolderInfo.getLocalValue();
-
-            final ConverterDecorator converter = valueHolderInfo.getConverter();
-            if (converter != null) {
-                addDecorator(converter, ComponentFactory.CONVERTER);
-            }
-        }
-    }
-
-    /**
-     * @param parent
-     * @param typeInfo
-     * @param attributes
-     */
-    protected UIOutputInfo(final ComponentInfo parent, final ComponentTypeInfo typeInfo,
-            final Map attributes)
-    {
-        this(getStringProperty("id", attributes, true), //$NON-NLS-1$
-                parent,
-                typeInfo,
-                getValueHolderInfo("$valueHolderInfo", attributes), //$NON-NLS-1$
-                getBooleanProperty("rendered", attributes, false)); //$NON-NLS-1$
-    }
-    
-    /**
-     * @param key
-     * @param attributes
-     * @return the non-standard value holder info that encapsulates the
-     * ValueHolder properties.  This is never mandatory.
-     */
-    protected static IValueHolderInfo getValueHolderInfo(String key, Map attributes)
-    {
-        IValueHolderInfo info =  (IValueHolderInfo) attributes.get(key);
-        
-        if (info != null)
-        {
-            return info;
-        }
-        Object value = attributes.get("value"); //$NON-NLS-1$
-        if (value != null)
-        {
-            Object converter = attributes.get("converter"); //$NON-NLS-1$
-            Object localValue = attributes.get("localValue"); //$NON-NLS-1$
-            
-            return new ValueHolderInfo((ConverterDecorator) converter, localValue, value);
-        }
-        return null;
-    }
-    
-    // @Override
-    protected String getMostSpecificComponentName() {
-        return "UIOutput"; //$NON-NLS-1$
-    }
-
-    public final ConverterDecorator getConverter() {
-        // should only be a single converter decorator...
-        // so on this interface we'll return the first one if present.
-        // to do things like error checking, use the getDecorator
-        final List converters = getDecorators(ComponentFactory.CONVERTER);
-
-        if (converters.size() > 0) {
-            return (ConverterDecorator) converters.get(0);
-        }
-
-        return null;
-    }
-
-    public final Object getLocalValue() {
-        return _localValue;
-    }
-
-    public final Object getValue() {
-        return _value;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/datatypes/ELExpression.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/datatypes/ELExpression.java
deleted file mode 100644
index b14f68d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/datatypes/ELExpression.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.datatypes;
-
-/**
- * An abstraction for an EL expression.
- * 
- * @author cbateman
- * 
- */
-public abstract class ELExpression
-{
-    /**
-     * @return the original text of EL expression
-     */
-    public abstract String getText();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ActionListenerDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ActionListenerDecorator.java
deleted file mode 100644
index 6c7993e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ActionListenerDecorator.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * Design time ActionListener decorator
- * 
- * @author cbateman
- *
- */
-public class ActionListenerDecorator extends ComponentDecorator {
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 3806862878381550874L;
-
-    /**
-     * @param decorates
-     */
-    public ActionListenerDecorator(final ComponentInfo decorates) {
-        super(decorates);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ComponentDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ComponentDecorator.java
deleted file mode 100644
index b700073..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ComponentDecorator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * @author cbateman
- *
- */
-public abstract class ComponentDecorator extends Decorator 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 4378142984217256364L;
-    
-    private final ComponentInfo     _decorates;
-    
-    /**
-     * @param decorates
-     */
-    public ComponentDecorator(final ComponentInfo decorates)
-    {
-        _decorates = decorates;
-    }
-
-    /**
-     * @return the component that this decorator decorates.
-     */
-    public final ComponentInfo getDecorates() {
-        return _decorates;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterDecorator.java
deleted file mode 100644
index 692ec3b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterDecorator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * A converter decorator.
- * 
- * @author cbateman
- *
- */
-public class ConverterDecorator extends ComponentDecorator {
-
-    private final ConverterTypeInfo     _typeInfo;
-    
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 3838224353030247227L;
-    
-    
-    /**
-     * @param decorates
-     * @param typeInfo
-     */
-    public ConverterDecorator(final ComponentInfo decorates, final ConverterTypeInfo typeInfo)
-    {
-        super(decorates);
-        _typeInfo = typeInfo;
-    }
-
-    /**
-     * @return the converter's type info.
-     */
-    public final ConverterTypeInfo getTypeInfo()
-    {
-        return _typeInfo;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterTypeInfo.java
deleted file mode 100644
index f013d3c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ConverterTypeInfo.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
-
-/**
- * Type information about a converter.
- * 
- * @author cbateman
- * 
- */
-public class ConverterTypeInfo extends ClassTypeInfo
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = -7238952424045449907L;
-    private static final String[]  NO_FOR_CLASS = new  String[0];
-    private final String        _converterId;
-    private final String[]      _forClasses;
-
-    /**
-     * For unknown converters, use the UNKNOWN constant.
-     * 
-     * @param className
-     * @param converterId
-     * @throws java.lang.IllegalArgumentException
-     *             if both className and converterId are null.
-     * 
-     */
-    public ConverterTypeInfo(String className, String converterId)
-    {
-        super(className, new String[0], new String[0]);
-        if (className == null && converterId == null)
-        {
-            throw new IllegalArgumentException(
-                    "converterClass and converterId must not both be null.  For unknown validator use the UNKNOWN constant"); //$NON-NLS-1$
-        }
-
-        _converterId = converterId;
-        _forClasses = NO_FOR_CLASS;
-    }
-
-    /**
-     * For unknown converters, use the UNKNOWN constant.
-     * 
-     * @param className
-     * @param superClasses 
-     * @param interfaces 
-     * @param converterId
-     * @param forClass 
-     * @throws java.lang.IllegalArgumentException
-     *             if both className and converterId are null.
-     * 
-     */
-    public ConverterTypeInfo(String className, String[] superClasses,
-            String[] interfaces, String converterId, String[] forClass)
-    {
-        super(className, superClasses, interfaces);
-        if (className == null && converterId == null)
-        {
-            throw new IllegalArgumentException(
-                    "converterClass and converterId must not both be null.  For unknown validator use the UNKNOWN constant"); //$NON-NLS-1$
-        }
-
-        _converterId = converterId;
-        if (forClass == null)
-        {
-            _forClasses = NO_FOR_CLASS;
-        }
-        else
-        {
-            _forClasses = forClass;
-        }
-    }
-
-    /**
-     * Use when the converter's information unknown such as occurs when using
-     * the f:converter tag.
-     */
-    public static final ConverterTypeInfo UNKNOWN = new ConverterTypeInfo(
-            (Object) null);
-
-    /**
-     * A private constructor used to create the UNRESOLVED constant. We use an
-     * Object arg here (which is discarded) rather than using the zero-arg
-     * constructor so as not mess up anything like Serializable that may depend
-     * on how zero-arg constructors are defined.
-     * 
-     * @param unresolved
-     */
-    private ConverterTypeInfo(Object unresolved)
-    {
-        super(null, new String[0], new String[0]);
-        _converterId = null;
-        _forClasses = NO_FOR_CLASS;
-    }
-
-    /**
-     * @return the converter's id.
-     */
-    public final String getConverterId()
-    {
-        return _converterId;
-    }
-
-    /**
-     * @return a copy of the listof classes that this type converters to.  May
-     * be empty.  Never null.
-     */
-    public final String[] getForClass()
-    {
-        final String[]  returnArray = new String[_forClasses.length];
-        System.arraycopy(_forClasses, 0, returnArray, 0, _forClasses.length);
-        return returnArray;
-    }
-
-    public String toString()
-    {
-        String toString = ""; //$NON-NLS-1$
-
-        if (_forClasses.length  > 0)
-        {
-            toString = "For-Classes: ["; //$NON-NLS-1$
-            for (int i = 0; i < _forClasses.length; i++)
-            {
-                toString += _forClasses[i];
-                if (i < _forClasses.length-1)
-                {
-                    toString += ", "; //$NON-NLS-1$
-                }
-            }
-            toString += "], "; //$NON-NLS-1$
-        }
-        return toString + "Converter Type Info: type = " + _converterId + ", "+super.toString(); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/Decorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/Decorator.java
deleted file mode 100644
index ceaae4e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/Decorator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import java.io.Serializable;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.ViewObject;
-
-/**
- * The abstract super-class of all view object decorators.
- * 
- * @author cbateman
- * 
- */
-public abstract class Decorator extends ViewObject implements Serializable
-{
-
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = -3138829736243154022L;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/FacetDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/FacetDecorator.java
deleted file mode 100644
index 32e7f0d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/FacetDecorator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * Component decorator for facets.
- * 
- * @author cbateman
- *
- */
-public class FacetDecorator extends ComponentDecorator 
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 94806944978127012L;
-
-    private final String _name;
-
-    /**
-     * @param name
-     * @param component
-     */
-    public FacetDecorator(final String name, final ComponentInfo component) {
-        super(component);
-        _name = name;
-    }
-
-    /**
-     * @return the name of the facet.
-     */
-    public final String getName() {
-        return _name;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorDecorator.java
deleted file mode 100644
index b7e33d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorDecorator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-
-/**
- * Validator decorator.
- * 
- * @author cbateman
- *
- */
-public class ValidatorDecorator extends ComponentDecorator {
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -2898015711621314782L;
-
-    private final ValidatorTypeInfo     _typeInfo;
-
-    /**
-     * @param decorates
-     * @param typeInfo
-     */
-    public ValidatorDecorator(final ComponentInfo decorates, final ValidatorTypeInfo typeInfo) {
-        super(decorates);
-        _typeInfo = typeInfo;
-    }
-
-    /**
-     * @return the validator's type info
-     */
-    public final ValidatorTypeInfo getTypeInfo()
-    {
-        return _typeInfo;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorTypeInfo.java
deleted file mode 100644
index 7e4a6fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValidatorTypeInfo.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.ClassTypeInfo;
-
-/**
- * Type information about validator decorator.
- * @author cbateman
- *
- */
-public class ValidatorTypeInfo extends ClassTypeInfo
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 7512992316792276160L;
-    private final String    _validatorId;
-
-    /**
-     * For unknown validators, use the UNKNOWN constant.
-     * 
-     * @param validatorClass
-     * @param validatorId
-     * @throws java.lang.IllegalArgumentException if both className and
-     * converterId are null.
-     * 
-     */
-    public ValidatorTypeInfo(String validatorClass, String validatorId)
-    {
-        super(validatorClass, new String[0], new String[0]);
-        
-        if (validatorClass == null && validatorId == null)
-        {
-            throw new IllegalArgumentException("validatorClass and validatorId must not both be null.  For unknown validator use the UNKNOWN constant"); //$NON-NLS-1$
-        }
-        _validatorId = validatorId;
-    }
-
-    /**
-     * For unknown validators, use the UNKNOWN constant.
-     * 
-     * @param validatorClass
-     * @param superClasses 
-     * @param interfaces 
-     * @param validatorId
-     * @throws java.lang.IllegalArgumentException if both className and
-     * converterId are null.
-     * 
-     */
-    public ValidatorTypeInfo(String validatorClass, String[] superClasses, String[] interfaces, String validatorId)
-    {
-        super(validatorClass, superClasses, interfaces);
-        
-        if (validatorClass == null && validatorId == null)
-        {
-            throw new IllegalArgumentException("validatorClass and validatorId must not both be null.  For unknown validator use the UNKNOWN constant"); //$NON-NLS-1$
-        }
-        _validatorId = validatorId;
-    }
-
-    /**
-     * Use when a validator's type info information is unknown.
-     */
-    public static final ValidatorTypeInfo  UNKNOWN = 
-        new ValidatorTypeInfo((Object)null);
-    
-    /**
-     * A private constructor used to create the UNRESOLVED constant.
-     * We use an Object arg here (which is discarded) rather than using
-     * the zero-arg constructor so as not mess up anything like Serializable
-     * that may depend on how zero-arg constructors are defined.
-     * 
-     * @param unresolved
-     */
-    private ValidatorTypeInfo(Object unresolved)
-    {
-        super(null, new String[0], new String[0]);
-        _validatorId = null;
-    }
-
-    /**
-     * @return the validator id (may be null if unknown).
-     */
-    public final String getValidatorId()
-    {
-        return _validatorId;
-    }
-    
-    public String toString()
-    {
-        return "Validator Type Info: type = " + _validatorId + ", "+super.toString(); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValueChangeListenerDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValueChangeListenerDecorator.java
deleted file mode 100644
index e344c1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/decorator/ValueChangeListenerDecorator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.decorator;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentInfo;
-import org.eclipse.jst.jsf.common.runtime.internal.model.event.IValueChangeListenerInfo;
-
-/**
- * ValueChangeListener component decorator.
- * 
- * @author cbateman
- *
- */
-public class ValueChangeListenerDecorator extends ComponentDecorator implements
-        IValueChangeListenerInfo 
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = 9045831927898936727L;
-
-    /**
-     * @param decorates
-     */
-    public ValueChangeListenerDecorator(ComponentInfo decorates) {
-        super(decorates);
-    }    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IActionListenerInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IActionListenerInfo.java
deleted file mode 100644
index a26b3a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IActionListenerInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.event;
-
-/**
- * A design time analog for the ActionListener
- * @author cbateman
- *
- */
-public interface IActionListenerInfo extends IFacesListenerInfo 
-{
-    // TODO:
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IFacesListenerInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IFacesListenerInfo.java
deleted file mode 100644
index b8996d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IFacesListenerInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.event;
-
-/**
- * A design-time analog for the runtime Faces Listener.
- * @author cbateman
- *
- */
-public interface IFacesListenerInfo 
-{
-    // no methods
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IValueChangeListenerInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IValueChangeListenerInfo.java
deleted file mode 100644
index 3d21a7a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/event/IValueChangeListenerInfo.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.event;
-
-/**
- * A design time analog for the runtime ValueChangeListener interface.
- * 
- * @author cbateman
- *
- */
-public interface IValueChangeListenerInfo extends IFacesListenerInfo {
-    // TODO:
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/ClassTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/ClassTypeInfo.java
deleted file mode 100644
index 4a39bc0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/ClassTypeInfo.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.types;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A type info that has class information.
- * 
- * @author cbateman
- *
- */
-public abstract class ClassTypeInfo extends TypeInfo implements IClassTypeInfo
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = -5046230589012357680L;
-
-    /**
-     * the fully qualified class name of the implementation class for this
-     * type.
-     */
-    protected final String _className;
-
-    /**
-     * known super classes of the component class
-     */
-    protected final String[] _superClasses;
-    
-    /**
-     * known interfaces implemented by the component class
-     */
-    protected final String[] _interfaces;
-    
-    /**
-     * used internally by isInstanceOf
-     */
-    private Set            _superTypes; // may be lazily constructed
-    
-
-    /**
-     * @param className 
-     * @param superClasses
-     * @param interfaces
-     */
-    protected ClassTypeInfo(final String className, final String[] superClasses, final String[] interfaces)
-    {
-        _className = className;
-        _superClasses = superClasses != null ? superClasses : new String[0];
-        _interfaces = interfaces != null ? interfaces : new String[0];
-        
-        if (_superClasses.length + _interfaces.length == 0)
-        {
-            // there are no super-types known
-            _superTypes = Collections.EMPTY_SET;
-        }
-    }
-    
-    public final String[] getInterfaces()
-    {
-        if (_interfaces.length > 0)
-        {
-            final String[]  copy =  new String[_interfaces.length];
-            System.arraycopy(_interfaces, 0, copy, 0, _interfaces.length);
-            return copy;
-        }
-        return new String[0];
-    }
-
-    public final String[] getSuperClasses()
-    {
-        if (_superClasses.length > 0)
-        {
-            final String[]  copy =  new String[_superClasses.length];
-            System.arraycopy(_superClasses, 0, copy, 0, _superClasses.length);
-            return copy;
-        }
-        return new String[0];
-    }
-
-    public final boolean isInstanceOf(String checkType)
-    {
-        if (_superTypes == null)
-        {
-            _superTypes = new HashSet();
-            _superTypes.addAll(Arrays.asList(_superClasses));
-            _superTypes.addAll(Arrays.asList(_interfaces));
-        }
-        
-        return _superTypes.contains(checkType);
-    }
-
-    public final String getClassName()
-    {
-        return _className;
-    }
-
-    public String toString()
-    {
-        String supers = "["; //$NON-NLS-1$
-        
-        for (int i = 0; i < _superClasses.length; i++)
-        {
-            supers += _superClasses[i];
-            
-            if (i < _superClasses.length)
-            {
-                supers += ","; //$NON-NLS-1$
-            }
-        }
-        
-        for (int i = 0; i < _interfaces.length; i++)
-        {
-            supers += _interfaces[i];
-            
-            if (i < _interfaces.length-1)
-            {
-                supers += ","; //$NON-NLS-1$
-            }
-        }
-        supers +="]"; //$NON-NLS-1$
-        
-        return "class= "+getClassName()+ ", supers="+ supers; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IAttributeValueProxy.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IAttributeValueProxy.java
deleted file mode 100644
index 95b83db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IAttributeValueProxy.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.types;
-
-import java.io.Serializable;
-
-/**
- * Wraps 
- * @author cbateman
- *
- */
-public interface IAttributeValueProxy extends Serializable
-{
-//
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IClassTypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IClassTypeInfo.java
deleted file mode 100644
index 7b43252..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/IClassTypeInfo.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.types;
-
-/**
- * A type info that has an associate Java class.
- * @author cbateman
- *
- */
-public interface IClassTypeInfo
-{
-    /**
-     * The fully qualified class name, i.e. java.lang.String
-     * 
-     * @return the fully qualified class name in dot notation
-     * 
-     */
-    String getClassName();
-    
-    /**
-     * Should never return null.  Return empty array if none.
-     * 
-     * @return the list of fully-qualified super class names.  List is as 
-     * calculated at IClassTypeInfo construction and no guarantee is made
-     * (although an implementer may do so) that it will be updated if the
-     * definition of className changes.
-     */
-    String[]  getSuperClasses();
-    
-    /**
-     * Should never return null.  Return empty array if none.
-     * 
-     * @return the list of fully-qualified interface names.  List is as 
-     * calculated at IClassTypeInfo construction and no guarantee is made
-     * (although an implementer may do so) that it will be updated if the
-     * definition of className changes.
-     */
-    String[]  getInterfaces();
-    
-    /**
-     * @param checkType
-     * @return true if checkType is in the set comprised of getSuperClasses()+getInterfaces()
-     */
-    boolean isInstanceOf(final String checkType);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/TypeInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/TypeInfo.java
deleted file mode 100644
index 4061f4a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/model/types/TypeInfo.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.model.types;
-
-import java.io.Serializable;
-
-/**
- * Abstract super-class of all view object type information objects.
- * 
- * @author cbateman
- *
- */
-public abstract class TypeInfo implements Serializable
-{
-    /**
-     * serializable id
-     */
-    private static final long serialVersionUID = -3653573923653759724L;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/AbstractTagAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/AbstractTagAttribute.java
deleted file mode 100644
index 696113a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/AbstractTagAttribute.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-/**
- * Super-class of all ITagAttribute concrete implementations.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractTagAttribute implements ITagAttribute
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 6364594863141579928L;
-
-    public abstract String getName();
-
-    public abstract String getTargetNamespace();
-
-    public abstract String getDescription();
-
-    public abstract String getDisplayName();
-
-    public abstract boolean isRequired();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ComponentPropertyHandler.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ComponentPropertyHandler.java
deleted file mode 100644
index aa50545..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ComponentPropertyHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-/**
- * Default implementation of IComponentPropertyHandler.
- * 
- * @author cbateman
- * 
- */
-public class ComponentPropertyHandler extends TagAttributeHandler implements
-        IComponentPropertyHandler
-{
-    /**
-     * 
-     */
-    private static final long serialVersionUID = 8614562842401106572L;
-    private final String  _propertyName;
-
-    /**
-     * @param customHandler
-     * @param name
-     * @param elAllowed
-     * @param propertyName
-     */
-    public ComponentPropertyHandler(final String customHandler,
-            final String name, final boolean elAllowed,
-            final String propertyName)
-    {
-        super(customHandler, name, elAllowed);
-        _propertyName = propertyName;
-    }
-
-    public String getPropertyName()
-    {
-        return _propertyName;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentPropertyHandler.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentPropertyHandler.java
deleted file mode 100644
index dfcaf79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentPropertyHandler.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) ${year} Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-/**
- * Maps tag attributes to component properties.
- * 
- * @author cbateman
- *
- */
-public interface IComponentPropertyHandler extends ITagAttributeHandler
-{
-    /**
-     * @return the property name that this handler maps to.
-     */
-    String getPropertyName();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentTagElement.java
deleted file mode 100644
index d34cb2f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IComponentTagElement.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.component.ComponentTypeInfo;
-
-/**
- * A JSF tag element that maps one-to-one to a JSF UIComponent
- * 
- * @author cbateman
- *
- */
-public interface IComponentTagElement extends IJSFTagElement 
-{
-    /**
-     * @return the comopnent's type info.
-     */
-    ComponentTypeInfo getComponent();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IConverterTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IConverterTagElement.java
deleted file mode 100644
index 63e43ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IConverterTagElement.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ConverterTypeInfo;
-
-/**
- * A tag element that causes the construction registration of a converter on
- * a parent object.
- * 
- * @author cbateman
- *
- */
-public interface IConverterTagElement extends IJSFTagElement
-{
-    /**
-     * @return the type info for the converter represented by this
-     * element
-     */
-    ConverterTypeInfo getConverter();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IHandlerTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IHandlerTagElement.java
deleted file mode 100644
index 43e6828..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IHandlerTagElement.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.types.TypeInfo;
-
-/**
- * Generic tag handler that has effect when processed by the JSF ViewHandler.
- * 
- * @author cbateman
- *
- */
-public interface IHandlerTagElement extends IJSFTagElement
-{
-    /**
-     * Enumerates known types of built-in tag handlers.
-     * 
-     * @author cbateman
-     *
-     */
-    static class TagHandlerType extends TypeInfo implements Serializable
-    {
-        /**
-         * serializable id
-         */
-        private static final long serialVersionUID = 5062853948108253861L;
-        
-        private final static int HANDLER_TYPE_FACET = 0;
-        private final static int HANDLER_TYPE_ACTIONLISTENER = 1;
-        private final static int HANDLER_TYPE_VALUECHANGELISTENER = 2;
-        private final static int HANDLER_TYPE_ATTRIBUTE = 3;
-
-        private final static String[]  strValues =
-            {"facet", "actionListener", "valueChangeListener"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-        private final int _intValue;
-        
-        public TagHandlerType(int intValue)
-        {
-            _intValue = intValue;
-        }
-
-        public String toString()
-        {
-            return strValues[_intValue];
-        }
-
-        protected final int intValue()
-        {
-            return _intValue;
-        }
-       
-        public final static TagHandlerType FACET = 
-            new TagHandlerType(HANDLER_TYPE_FACET);
-        public final static TagHandlerType ACTIONLISTENER = 
-            new TagHandlerType(HANDLER_TYPE_ACTIONLISTENER);
-        public final static TagHandlerType VALUECHANGELISTENER = 
-            new TagHandlerType(HANDLER_TYPE_VALUECHANGELISTENER);
-        public final static TagHandlerType ATTRIBUTE = 
-            new TagHandlerType(HANDLER_TYPE_ATTRIBUTE);
-        
-    }
-    
-    /**
-     * @return the tag handler type as defined by standard known types of 
-     * tags that do not (necessarily) translate into standard objects at 
-     * runtime but may modify the view in some way.
-     */
-    TagHandlerType getTagHandlerType();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IJSFTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IJSFTagElement.java
deleted file mode 100644
index 435c08a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IJSFTagElement.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-
-/**
- * An abstraction of a tag element that maps to a JSF artifact (i.e. component, validator)
- *
- * @author cbateman
- *
- */
-public interface IJSFTagElement extends ITagElement
-{
-    /**
-     * An enumeration of different kinds of tags.
-     * 
-     * @author cbateman
-     *
-     */
-    static class TagType implements Serializable
-    {
-        /**
-         * serializable id
-         */
-        private static final long serialVersionUID = -2845327764902349963L;
-        private final static int TYPE_COMPONENT = 0;
-        private final static int TYPE_CONVERTER = 1;
-        private final static int TYPE_VALIDATOR = 2;
-        private final static int TYPE_HANDLER = 3;
-        //private final static int TYPE_UNKNOWN = 4;
-
-        private final static String[]  strValues =
-            {"component", "converter", "validator", "handler"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-
-        private final int _intValue;
-        
-        public TagType(int intValue)
-        {
-            _intValue = intValue;
-        }
-
-        public String toString()
-        {
-            return strValues[_intValue];
-        }
-
-        protected final int intValue()
-        {
-            return _intValue;
-        }
-       
-        public final static TagType COMPONENT = 
-            new TagType(TYPE_COMPONENT);
-        public final static TagType CONVERTER = 
-            new TagType(TYPE_CONVERTER);
-        public final static TagType VALIDATOR = 
-            new TagType(TYPE_VALIDATOR);
-        public final static TagType HANDLER = 
-            new TagType(TYPE_HANDLER);
-    }
-    
-    /**
-     * @return the type of tag as distinguished by how it may affect the
-     * view at runtime.
-     */
-    TagType getType();
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttribute.java
deleted file mode 100644
index 52fd6c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttribute.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-
-/**
- * Information about a tags attribute
- * @author cbateman
- *
- */
-public interface ITagAttribute extends Serializable
-{
-    /**
-     * @return the name of the attribute.  In XML this is the "local" name of
-     * the attribute: that is, it's name without any namespace qualification.
-     */
-    String getName();
-    
-    /**
-     * @return the unique namespace of the attribute or null if it is always the
-     * same as it's owner (the typical case in JSF).
-     */
-    String getTargetNamespace();
-    
-    /**
-     * @return a long-form piece of text, intended for end-user consumption,
-     * that describes the attribute
-     */
-    String getDescription();
-    
-    /**
-     * @return a short, user visible label text for the attribute.
-     */
-    String getDisplayName();
-    
-    /**
-     * @return true if the attribute is required to be populated on the 
-     * element.
-     */
-    boolean isRequired();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttributeHandler.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttributeHandler.java
deleted file mode 100644
index f6d15c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagAttributeHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) ${year} Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Cameron Bateman - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-
-/**
- * Basic information on attributes.
- * TODO C.B: some question exists in my mind as to how/whether this should merge
- * with meta-data enabled type descriptors.
- * 
- * @author cbateman
- *
- */
-public interface ITagAttributeHandler extends Serializable
-{
-    /**
-     * @return the name of the attribute
-     */
-    String      getName();
-    /**
-     * @return the name of an extension point used to perform custom handling
-     * of the attribute.
-     */
-    String      getCustomHandler();
-    
-    /**
-     * @return true if the property allows EL expressions
-     */
-    boolean isELAllowed();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagElement.java
deleted file mode 100644
index e4d8298..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/ITagElement.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import java.io.Serializable;
-import java.util.Map;
-
-/**
- * Super-interface of all JSF tag elements.
- * 
- * @author cbateman
- *
- */
-public interface ITagElement extends Serializable
-{
-
-    /**
-     * @return the name of the tag
-     */
-    public abstract String getName();
-
-    /**
-     * @return the namespace uri for this tag
-     */
-    public abstract String getUri();
-    
-    /**
-     * @return the fully qualified class name in dot separated format
-     * (i.e. javax.faces.webapp.ConverterTag)
-     */
-    public abstract String getTagHandlerClassName();
-    
-    /**
-     * @return an unmodifiable map, indexed by name, of all the attribute
-     * handlers available for this tag element.  Each value in the Map
-     * must be a ITagAttributeHandler.
-     */
-    public abstract Map    getAttributeHandlers();
-
-    /**
-     * @return the attributes for the tag.
-     */
-    public abstract Map<String, ? extends ITagAttribute> getAttributes();
-    /**
-     * Signals that the tag element should  make any mutable data immutable
-     * and throw exceptions if attempts are made to implement.  Flag must
-     * latch and become irrevocable.
-     */
-//    public abstract void setLocked();
-    
-    /**
-     * @return true if setLocked has been called.
-     */
-//    public abstract boolean isLocked();
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IValidatorTagElement.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IValidatorTagElement.java
deleted file mode 100644
index 9474902..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/IValidatorTagElement.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.runtime.internal.view.model.common;
-
-import org.eclipse.jst.jsf.common.runtime.internal.model.decorator.ValidatorTypeInfo;
-
-/**
- * Represents a tag element for a JSF validator.
- * 
- * @author cbateman
- *
- */
-public interface IValidatorTagElement extends IJSFTagElement
-{
-    /**
-     * @return the type info about the validator.
-     */
-    ValidatorTypeInfo getValidator();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/Namespace.java b/jsf/plugins/org.eclipse.jst.jsf.common.runtime/src/org/eclipse/jst/jsf/common/runtime/internal/view/model/common/Namespace.java
deleted file mode 100644
index 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 9334e13..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Mon Jun 30 15:55:16 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=error
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index d9b486b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:46:32 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.common.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 075c0da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,36 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.jsf.common.ui;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.cheatsheets;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.help;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.forms;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.draw2d;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.wst.common.project.facet.core;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.emf;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.emf.common;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.1,2.0.0)"
-Export-Package: org.eclipse.jst.jsf.common.ui;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.pagedesigner.jsf.ui",
- org.eclipse.jst.jsf.common.ui.internal.actions;x-friends:="org.eclipse.jst.jsf.facesconfig.ui",
- org.eclipse.jst.jsf.common.ui.internal.dialogfield;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.pagedesigner.jsf.ui",
- org.eclipse.jst.jsf.common.ui.internal.dialogs;x-friends:="org.eclipse.jst.pagedesigner",
- org.eclipse.jst.jsf.common.ui.internal.form;x-internal=true,
- org.eclipse.jst.jsf.common.ui.internal.guiutils;x-friends:="org.eclipse.jst.pagedesigner",
- org.eclipse.jst.jsf.common.ui.internal.logging;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.pagedesigner.jsf.ui",
- org.eclipse.jst.jsf.common.ui.internal.preferences;x-internal=true,
- org.eclipse.jst.jsf.common.ui.internal.utils;x-friends:="org.eclipse.jst.pagedesigner,org.eclipse.jst.jsf.facesconfig.ui,org.eclipse.jst.pagedesigner.jsf.ui"
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: %pluginProvider
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.html b/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.html
deleted file mode 100644
index 3b20a36..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.ini b/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.ini
deleted file mode 100644
index a21a3ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.ini
+++ /dev/null
@@ -1,29 +0,0 @@
-# about.ini
-# contains information about a feature
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# "%key" are externalized strings defined in about.properties
-# This file does not need to be translated.
-
-# Property "aboutText" contains blurb for "About" dialog (translated)
-aboutText=%blurb
-
-# Property "windowImage" contains path to window icon (16x16)
-# needed for primary features only
-
-# Property "featureImage" contains path to feature image (32x32)
-featureImage=eclipse32.gif
-
-# Property "aboutImage" contains path to product image (500x330 or 115x164)
-# needed for primary features only
-
-# Property "appName" contains name of the application (translated)
-# needed for primary features only
-
-# Property "welcomePage" contains path to welcome page (special XML-based format)
-# optional
-
-# Property "welcomePerspective" contains the id of the perspective in which the
-# welcome page is to be opened.
-# optional
-
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.mappings b/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.mappings
deleted file mode 100644
index 29ddddb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=200509071822
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.properties
deleted file mode 100644
index d7849b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/about.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2004, 2005 Sybase, Inc. and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Sybase, Inc. - initial API and implementation
-###############################################################################
-#
-#
-
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-blurb=JSF Faces Config Editor \n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others. 2000, 2004.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools/jsf
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/build.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/build.properties
deleted file mode 100644
index 2524004..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/build.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               about.html,\
-               about.ini,\
-               about.mappings,\
-               about.properties,\
-               bin/,\
-               build.properties,\
-               default.properties,\
-               eclipse32.gif,\
-               icons/,\
-               plugin.properties,\
-               schema/
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/default.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/default.properties
deleted file mode 100644
index 82c5358..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/default.properties
+++ /dev/null
@@ -1,52 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# This file contains all the Default Preference Settings
-
-####################################################
-# Logging Preference Settings
-####################################################
-
-# Enable/Disable console logging.  
-# Valid values: TRUE, FALSE
-console.logging.on=true
-
-# Maximum log level of console logging.  
-# Valid values: DEBUG, INFO, WARN, ERROR, FATAL
-console.logging.max.level=INFO
-
-# Enable/Disable eclipse logging.  
-# Valid values: TRUE, FALSE
-eclipse.logging.on=true
-
-# Maximum log level of eclipse logging.  
-# Valid values: DEBUG, INFO, WARN, ERROR, FATAL
-eclipse.logging.max.level=INFO
-
-eclipse.pattern=%m
-
-# Enable/Disable file logging.  
-# Valid values: TRUE, FALSE
-file.logging.on=true
-
-# Maximum log level of file logging.  
-# Valid values: DEBUG, INFO, WARN, ERROR, FATAL
-file.logging.max.level=DEBUG
-
-# Clear log file when eclipse restarts.  
-# Valid values: TRUE, FALSE
-file.logging.startup.clear=true
-
-# Location of log file
-file.logging.path=facesconfigeditor.log
-
-# Rollover frequency of log file.  
-# Valid values: DAILY, WEEKLY, MONTHLY
-file.logging.rollover.frequency=DAILY
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/eclipse32.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/Editor_Help.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/Editor_Help.gif
deleted file mode 100644
index 03f656f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/Editor_Help.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_GotoEditor.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_GotoEditor.gif
deleted file mode 100644
index 0e5bcf6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_GotoEditor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Introduction.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Introduction.gif
deleted file mode 100644
index 44cd044..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Introduction.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Tutorial.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Tutorial.gif
deleted file mode 100644
index ad8e5b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/FacesConfig_Tutorial.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/PD_Palette_Default.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/PD_Palette_Default.gif
deleted file mode 100644
index 5e7fb33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/PD_Palette_Default.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/back_nav_16.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/back_nav_16.gif
deleted file mode 100644
index 740419b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/back_nav_16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/configs.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/configs.gif
deleted file mode 100644
index c984fba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/configs.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/form_banner.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/form_banner.gif
deleted file mode 100644
index aebc0b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/form_banner.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/forward_nav_16.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/forward_nav_16.gif
deleted file mode 100644
index 7a1511d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/forward_nav_16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/help.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/help.gif
deleted file mode 100644
index 9d70301..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/help.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_converter.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_converter.gif
deleted file mode 100644
index 16466ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_converter.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_validator.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_validator.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_validator.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_view.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_view.gif
deleted file mode 100644
index c81630a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/jsf_view.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/object.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/object.gif
deleted file mode 100644
index 061161a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/object.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/overview_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/overview_obj.gif
deleted file mode 100644
index 03f656f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/overview_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/refresh_nav_16.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/refresh_nav_16.gif
deleted file mode 100644
index a063c23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/refresh_nav_16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/reload_nav_16.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/reload_nav_16.gif
deleted file mode 100644
index d71dfff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/reload_nav_16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/stop_nav_16.gif b/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/stop_nav_16.gif
deleted file mode 100644
index 4eb53ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/icons/stop_nav_16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.properties
deleted file mode 100644
index 3549ea3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-pluginName=JavaServer Faces Tools - Common UI
-pluginProvider=Eclipse.org
-
-extension-point.name.0 = Introduction Page
-extension-point.name.1 = OverviewPage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.xml
deleted file mode 100644
index 435be3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/plugin.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension-point id="introductionPage" name="%extension-point.name.0" schema="schema/introductionPage.exsd"/>
-   <extension-point id="overviewPage" name="%extension-point.name.1" schema="schema/overviewPage.exsd"/>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/introductionPage.exsd b/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/introductionPage.exsd
deleted file mode 100644
index d147b34..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/introductionPage.exsd
+++ /dev/null
@@ -1,213 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common.ui" id="introductionPage" name="Introduction Page"/>
-      </appInfo>
-      <documentation>
-         The purpose of this extension point is to allow plug-ins to describe the contents and links on a introduction page of an editor.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="introductionpage"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  identifier of the extension instance, this should be the same as the editor id.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance. Normally this is the editor name.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="introductionpage">
-      <annotation>
-         <documentation>
-            The details for an introduction page for a specific plugins editor
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="introductionelement" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A description for the page.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="introductionelement">
-      <annotation>
-         <documentation>
-            An element that make up a section of the page. Elements can contain Headers, Hyperlinks, Icons and text.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  An icon to display in the element. The icon should be 72x72 and will appear to the left of the headers, hyperlinks and text
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="heading" type="string">
-            <annotation>
-               <documentation>
-                  A short heading for the element (optional)
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="text" type="string">
-            <annotation>
-               <documentation>
-                  The text description for the element
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="hyperlink" type="string">
-            <annotation>
-               <documentation>
-                  A hyperlink associated with the element. The hyperlink would normally execute the hyperlinkaction action
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="hyperlinkaction" type="string">
-            <annotation>
-               <documentation>
-                  The action associated with the hyperlink. This is an action that will be executed when the hyperlink is selected
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="actionparameters" type="string">
-            <annotation>
-               <documentation>
-                  Can be used to pass one or more parameters to the hyperlink action. Parameter must be space separated (optional)
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;extension
-         id=&quot;org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor&quot;
-         name=&quot;%pageflow.editor.intro.name&quot;
-         point=&quot;org.eclipse.jst.jsf.facesconfig.ui.page.introductionPage&quot;&gt;
-      &lt;introductionpage
-            name=&quot;%pageflow.editor.intro.name&quot;
-            description=&quot;%port.editor.intro.description&quot;&gt;
-         &lt;introductionelement
-               icon=&quot;icons/pageflow_72.gif&quot;
-               heading=&quot;%pageflow.editor.intro.heading&quot;
-               text=&quot;%pageflow.editor.intro.description&quot;&gt;
-         &lt;/introductionelement&gt;
-         &lt;introductionelement
-               actionparameters=&quot;Pageflow.designerCheatSheet&quot;
-               icon=&quot;icons/tutorials_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.LoadCheatSheetAction&quot;
-               text=&quot;%pageflow.editor.intro.cheatsheets.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.cheatsheets.link&quot;&gt;
-         &lt;/introductionelement&gt;
-         &lt;introductionelement
-               actionparameters=&quot;http://www.eclipse.org&quot;
-               icon=&quot;icons/overview_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.LoadHelpAction&quot;
-               text=&quot;%pageflow.editor.intro.help.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.help.link&quot;&gt;
-         &lt;/introductionelement&gt;
-         &lt;introductionelement
-               actionparameters=&quot;overview&quot;
-               icon=&quot;icons/gotoeditor_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.OpenPageAction&quot;
-               text=&quot;%pageflow.editor.intro.start.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.start.link&quot;&gt;
-         &lt;/introductionelement&gt;
-      &lt;/introductionpage&gt;
-   &lt;/extension&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2006 Sybase, Inc. and others. &lt;br&gt;
- All rights reserved. This program and the accompanying materials &lt;br&gt;
- are made available under the terms of the Eclipse Public License v1.0 &lt;br&gt;
- which accompanies this distribution, and is available at &lt;br&gt;
- http://www.eclipse.org/legal/epl-v10.html &lt;br&gt;
- 
-  Contributors: &lt;br&gt;
-      Sybase, Inc. - initial API and implementation &lt;br&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/overviewPage.exsd b/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/overviewPage.exsd
deleted file mode 100644
index c55436b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/schema/overviewPage.exsd
+++ /dev/null
@@ -1,213 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.jsf.common.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.jsf.common.ui" id="overviewPage" name="Overview Page"/>
-      </appInfo>
-      <documentation>
-         The purpose of this extension point is to allow plug-ins to describe the contents and links on a overview page of an editor.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="overviewpage"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  identifier of the extension instance, this should be the same as the editor id.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  an optional name of the extension instance. Normally this is the editor name.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="overviewpage">
-      <annotation>
-         <documentation>
-            The details for an overview page for a specific plugins editor
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="overviewelement" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the page.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A description for the page.
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="overviewelement">
-      <annotation>
-         <documentation>
-            An element that make up a section of the page. Elements can contain Headers, Hyperlinks, Icons and text.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="icon" type="string">
-            <annotation>
-               <documentation>
-                  An icon to display in the element. The icon should be 72x72 and will appear to the left of the headers, hyperlinks and text
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="heading" type="string">
-            <annotation>
-               <documentation>
-                  A short heading for the element (optional)
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="text" type="string">
-            <annotation>
-               <documentation>
-                  The text description for the element
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="hyperlink" type="string">
-            <annotation>
-               <documentation>
-                  A hyperlink associated with the element. The hyperlink would normally execute the hyperlinkaction action
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="hyperlinkaction" type="string">
-            <annotation>
-               <documentation>
-                  The action associated with the hyperlink. This is an action that will be executed when the hyperlink is selected
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="actionparameters" type="string">
-            <annotation>
-               <documentation>
-                  Can be used to pass one or more parameters to the hyperlink action. Parameter must be space separated (optional)
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         &lt;extension
-         id=&quot;org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor&quot;
-         name=&quot;%pageflow.editor.intro.name&quot;
-         point=&quot;org.eclipse.jst.jsf.facesconfig.ui.page.overviewPage&quot;&gt;
-      &lt;overviewpage
-            name=&quot;%pageflow.editor.intro.name&quot;
-            description=&quot;%port.editor.intro.description&quot;&gt;
-         &lt;overviewelement
-               icon=&quot;icons/pageflow_72.gif&quot;
-               heading=&quot;%pageflow.editor.intro.heading&quot;
-               text=&quot;%pageflow.editor.intro.description&quot;&gt;
-         &lt;/overviewelement&gt;
-         &lt;overviewelement
-               actionparameters=&quot;Pageflow.designerCheatSheet&quot;
-               icon=&quot;icons/tutorials_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.LoadCheatSheetAction&quot;
-               text=&quot;%pageflow.editor.intro.cheatsheets.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.cheatsheets.link&quot;&gt;
-         &lt;/overviewelement&gt;
-         &lt;overviewelement
-               actionparameters=&quot;http://www.eclipse.org&quot;
-               icon=&quot;icons/overview_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.LoadHelpAction&quot;
-               text=&quot;%pageflow.editor.intro.help.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.help.link&quot;&gt;
-         &lt;/overviewelement&gt;
-         &lt;overviewelement
-               actionparameters=&quot;overview&quot;
-               icon=&quot;icons/gotoeditor_72.gif&quot;
-               hyperlinkaction=&quot;org.eclipse.jst.jsf.common.ui.actions.OpenPageAction&quot;
-               text=&quot;%pageflow.editor.intro.start.text&quot;
-               hyperlink=&quot;%pageflow.editor.intro.start.link&quot;&gt;
-         &lt;/overviewelement&gt;
-      &lt;/overviewpage&gt;
-   &lt;/extension&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright (c) 2004, 2006 Sybase, Inc. and others. &lt;br&gt;
- All rights reserved. This program and the accompanying materials &lt;br&gt;
- are made available under the terms of the Eclipse Public License v1.0 &lt;br&gt;
- which accompanies this distribution, and is available at &lt;br&gt;
- http://www.eclipse.org/legal/epl-v10.html &lt;br&gt;
- 
-  Contributors: &lt;br&gt;
-      Sybase, Inc. - initial API and implementation &lt;br&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/CommonResources.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/CommonResources.properties
deleted file mode 100644
index b9527d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/CommonResources.properties
+++ /dev/null
@@ -1,113 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Generic Strings for UI
-####################################################
-
-pluginName=Web Application Development Common
-button.save=&Save
-button.remove=&Remove
-
-####################################################
-# Resource message for Logging
-####################################################
-
-log.msg={0}
-
-log.ResourceUtils=Missing Resource Bundle "{0}".
-log.CommonPlugin=Web Application Development Common Plugin initialized on eclipse version {0}.
-log.FavoriteConfigurations.save.error=Failed to save {0} favorites. File={1}
-log.FavoriteConfigurations.read.error=Failed to read {0} favorites. File={1}
-log.CommonPlugin.image.error=Image {0} not found.
-
-log.IntroductionSection.action.error = Failed to launch the link {0}
-
-####################################################
-# Resource message for Alerts
-####################################################
-
-alert.msg={0}
-
-####################################################
-# Resource messages for FavoriteSection
-####################################################
-favorites.group.label=Favorite Configurations
-favorites.label=&Name:
-favorites.tooltip=Construct common setting favorites for this page.
-favorites.save.tooltip=Save the current options on this page as the favorites.
-favorites.remove.tooltip=Remove the current favorite.
-favorites.default=default
-
-####################################################
-# Resource messages for Preference Pages
-####################################################
-JMTPreferencePage.Description=Expand the tree to edit Web Application preferences.
-
-LoggingPreferencePage.Log.Level.label=Log Level:
-LoggingPreferencePage.Log.Level.tooltip=Select the logging level to output to the selected source.
-LoggingPreferencePage.Log.Level.debug=Debug
-LoggingPreferencePage.Log.Level.info=Info
-LoggingPreferencePage.Log.Level.warn=Warn
-LoggingPreferencePage.Log.Level.error=Error
-LoggingPreferencePage.Log.Level.fatal=Fatal
-LoggingPreferencePage.Console.Group.label=Console
-LoggingPreferencePage.Console.Logging.label=Enable &Console Logging
-LoggingPreferencePage.Console.Logging.tooltip=Receive log message in the Eclipse Console view.
-LoggingPreferencePage.Eclipse.Group.label=Eclipse
-LoggingPreferencePage.Eclipse.Logging.label=Enable &Eclipse Logging
-LoggingPreferencePage.Eclipse.Logging.tooltip=Receive log message in the Eclipse Error Log view.
-LoggingPreferencePage.File.Group.label=File
-LoggingPreferencePage.File.Logging.label=Enable &File Logging
-LoggingPreferencePage.File.Logging.tooltip=Write log message to an external file.
-LoggingPreferencePage.File.clearing.label=Clear log file on &startup
-LoggingPreferencePage.File.clearing.tooltip=Each time Eclipse starts, clear the log file.
-LoggingPreferencePage.File.path.label=&Log file:
-LoggingPreferencePage.File.path.tooltip=Where should the log file go? Partial paths are \n based from: /workspace/.metadata/.plugins/org.eclipse.jst.jsf.common.ui.internal/.
-LoggingPreferencePage.File.button.label=B&rowse
-LoggingPreferencePage.File.button.tooltip=Select a location and file name for file logging.
-LoggingPreferencePage.File.select.label=Select a log file
-LoggingPreferencePage.File.Rollover.Frequency.label=Rollover Fre&quency:
-LoggingPreferencePage.File.Rollover.Frequency.tooltip=Select the frequency of how often to generate a new log file. \n The original log file is appended with a timestamp.
-LoggingPreferencePage.File.Rollover.Frequency.daily=Daily
-LoggingPreferencePage.File.Rollover.Frequency.weekly=Weekly
-LoggingPreferencePage.File.Rollover.Frequency.monthly=Monthly
-
-####################################################
-# Resource messages for BrowserWindow
-####################################################
-BrowserWindow.back.tooltip=Navigate back in the browser
-BrowserWindow.forward.tooltip=Navigate forward in the browser
-BrowserWindow.stop.tooltip=Stop browser navigation
-BrowserWindow.refresh.tooltip=Refresh the browser
-BrowserWindow.reload.tooltip=Reload the browser
-
-####################################################
-# Resource messages for Commmon DialogField
-####################################################
-DialogField.JavaClassWizard.NewClass=New Java Class
-DialogField.ClassButton.SelectType=Select Type
-DialogField.Browse=Browse...
-DialogField.ResourceButton.SelectFile=Select File
-
-####################################################
-# Resource messages for Commmon Dialog
-####################################################
-Dialog.ResourceOnClasspathDialog.StatusMessage=Select a properties file
-Dialog.CommonResourceDialog.StatusMessage0=Select
-Dialog.TreeViewerSelectionDialog.DefaultTitle=Select a File
-
-Wizards.NewPage.Error.InvalidProject=Invalid Web project.
-Error.FileFilter.title=File selection
-Error.ImgFileFilter.error=File selection error:
-Error.ProjectFileDialogContentProvider=Project file dialog error: {0}
-Error.RefreshingLocal=Refreshing local
-
-Service.NoResourceError=Unable to determine Service Model file.
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/IFileFolderConstants.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/IFileFolderConstants.java
deleted file mode 100644
index e74e90a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/IFileFolderConstants.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IFileFolderConstants {
-
-	/**
-	 * the dot character
-	 */
-	public static final String DOT = "."; //$NON-NLS-1$
-
-	/**
-	 * the path separator
-	 */
-	public static final String PATH_SEPARATOR = "/"; //$NON-NLS-1$
-
-	/** file extensions */
-	/**
-	 * class file extension
-	 */
-	public static final String EXT_CLASS = "class"; //$NON-NLS-1$
-
-	/**
-	 * jar file extension
-	 */
-	public static final String EXT_JAR = "jar"; //$NON-NLS-1$
-
-	/**
-	 * java file extension
-	 */
-	public static final String EXT_JAVA = "java"; //$NON-NLS-1$
-
-
-	/**
-	 * jsp file extension
-	 */
-	public static final String EXT_JSP = "jsp"; //$NON-NLS-1$
-
-	/**
-	 * properties file extension
-	 */
-	public static final String EXT_PROPERTIES = "properties"; //$NON-NLS-1$
-
-	/**
-	 * taglib file extension
-	 */
-	public static final String EXT_TAGLIB = "tld"; //$NON-NLS-1$
-
-	/**
-	 * standard web.xml file name
-	 */
-	public static final String FILE_WEB_XML = "web.xml"; //$NON-NLS-1$
-
-	/** folders */
-
-	/**
-	 * classes folder name
-	 */
-	public static final String FOLDER_CLASS = "classes"; //$NON-NLS-1$
-
-	/**
-	 * icons folder name
-	 */
-	public static final String FOLDER_ICONS = "icons"; //$NON-NLS-1$
-
-	/**
-	 * the meta-inf folder name
-	 */
-	public static final String FOLDER_METAINF = "META-INF"; //$NON-NLS-1$
-
-	/**
-	 * the src folder name
-	 */
-	public static final String FOLDER_SOURCE = "src"; //$NON-NLS-1$
-
-	/**
-	 * the web-inf folder name
-	 */
-	public static final String FOLDER_WEBINF = "WEB-INF"; //$NON-NLS-1$
-
-	/** the webroot folder depth relative to the project */
-	public static final int WEBROOT_FOLDER_DEPTH = 2;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/JSFUICommonPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/JSFUICommonPlugin.java
deleted file mode 100644
index b4a1f00..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/JSFUICommonPlugin.java
+++ /dev/null
@@ -1,418 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.Properties;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Version;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class JSFUICommonPlugin extends AbstractUIPlugin {
-	// Properties contains general properties and defaults to preferences.
-	private static final String PROPERTIES = "default.properties"; //$NON-NLS-1$
-	// preferences will
-	// contain this string
-	// in the key.
-
-	private static final String P_CONSOLE_LOGGING = "console.logging.on"; //$NON-NLS-1$
-
-	private static final String P_CONSOLE_LOG_LEVEL = "console.logging.max.level"; //$NON-NLS-1$
-
-	private static final String P_ECLIPSE_LOGGING = "eclipse.logging.on"; //$NON-NLS-1$
-
-	private static final String P_ECLIPSE_LOG_LEVEL = "eclipse.logging.max.level"; //$NON-NLS-1$
-
-	private static final String P_FILE_LOGGING = "file.logging.on"; //$NON-NLS-1$
-
-	private static final String P_FILE_LOG_LEVEL = "file.logging.max.level"; //$NON-NLS-1$
-
-	private static final String P_FILE_PATH = "file.logging.path"; //$NON-NLS-1$
-
-	private static final String P_FILE_CLEAR = "file.logging.startup.clear"; //$NON-NLS-1$
-
-	private static final String P_FILE_ROLLOVER_FREQUENCY = "file.logging.rollover.frequency"; //$NON-NLS-1$
-
-	private static final int DEBUG_LEVEL = 0;
-
-	private static final int INFO_LEVEL = 1;
-
-	private static final int WARN_LEVEL = 2;
-
-	private static final int ERROR_LEVEL = 3;
-
-	private static final int FATAL_LEVEL = 4;
-	
-	// What version of the platform are we on.
-	private static boolean TWO_DOT_ONE;
-
-	private static boolean THREE_DOT;
-
-	private static String _version;
-
-	// The shared instance.
-	private static JSFUICommonPlugin _plugin;
-
-	private Logger _log;
-
-	private ResourceBundle _resourceBundle;
-
-	private Properties _properties;
-
-	private URL _pluginBase;
-
-	private static Alerts _alerts;
-
-	/**
-	 * The constructor.
-	 */
-	public JSFUICommonPlugin() {
-		super();
-		_plugin = this;
-		versionCheck();
-	}
-
-	private void versionCheck() {
-		String version = (String) ResourcesPlugin.getPlugin().getBundle()
-				.getHeaders().get(org.osgi.framework.Constants.BUNDLE_VERSION);
-		Version identifier = new Version(version);
-
-		TWO_DOT_ONE = ((identifier.getMajor() == 2) && (identifier
-				.getMinor() == 1));
-		THREE_DOT = (identifier.getMajor() == 3);
-		_version = identifier.toString();
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		// This plugin is for 3.0 only, do a version check.
-		if (isThreeDot() == false) {
-			throw new CoreException(new Status(IStatus.ERROR, getBundle()
-					.getSymbolicName(), IStatus.OK,
-					"Requires eclipse version 3.x", null)); //$NON-NLS-1$
-		}
-
-		try {
-			// get resource bundle.
-			_resourceBundle = ResourceBundle
-					.getBundle("org.eclipse.jst.jsf.common.ui.CommonResources"); //$NON-NLS-1$
-			_alerts = new Alerts(this, _resourceBundle);
-
-			// get properties.
-			_properties = new Properties();
-			InputStream input = null;
-			_pluginBase = getBundle().getEntry("/"); //$NON-NLS-1$
-			try {
-				input = (new URL(_pluginBase, PROPERTIES)).openStream();
-				_properties.load(input);
-			} finally {
-				try {
-					input.close();
-				} catch (IOException ee)// NOPMD
-				{
-					// nothing to do when IOException throwed in closing files.
-				}
-			}
-
-			// set up logging for this plugin and everthing under it.
-			_log = new Logger(this.getBundle(), _resourceBundle);
-
-			// NOTE: add in any other plugin code statup HERE!!!!
-
-			// log.CommonPlugin=Web Application Development Common Plugin
-			// initialized on eclipse version {0}.
-
-			// log.info("log.CommonPlugin", version);
-
-		} catch (Exception ee) {
-			// only log if the logger was configured correctly.
-			if (_log != null) {
-				_log
-						.error(
-								"log.msg", //$NON-NLS-1$
-								"Problems starting plug-in Web Application Development Common.", //$NON-NLS-1$
-								ee);
-			}
-
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							getBundle().getSymbolicName(),
-							IStatus.OK,
-							"Problems starting plug-in Web Application Development Common", //$NON-NLS-1$
-							ee));
-		}
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the plugin instance
-	 */
-	public static JSFUICommonPlugin getDefault() {
-		return _plugin;
-	}
-
-	/**
-	 * get the alerts objects associated with this plugin for alerting the user.
-	 * 
-	 * @return the alerts object
-	 */
-	public static Alerts getAlerts() {
-		return _alerts;
-	}
-
-	/**
-	 * Returns a logger for the new class using this plugin for reference.
-	 * @param theClass 
-	 * @return the logger
-	 */
-    // TODO: theClass is never used!!
-	public static Logger getLogger(Class theClass) {
-		return getDefault().getRootLogger();
-	}
-
-	/**
-	 * Returns the plugin's root logger
-	 * @return the root logger
-	 */
-	public Logger getRootLogger() {
-		return _log;
-	}
-
-	/**
-	 * Returns this plugin's unique identifier
-	 * 
-	 * @return this plugin's unique identifier
-	 * 
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 * @return the resource bundle
-	 */
-	public ResourceBundle getResourceBundle() {
-		return _resourceBundle;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 * @param key 
-	 * @return the resource string
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = JSFUICommonPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's descriptor's resource bundle,
-	 * @return the bundle
-	 */
-	public ResourceBundle getPluginDecriptorBundle() {
-		return Platform.getResourceBundle(getDefault().getBundle());
-	}
-
-	/**
-	 * Returns the plugin's default properties. These are normally used for
-	 * default preferences.
-	 * @return the properties
-	 */
-	public Properties getProperties() {
-		return _properties;
-	}
-
-	/**
-	 * Returns a shared image for the given name
-	 * <p>
-	 * Note: Images returned from this method will be automitically disposed of
-	 * when this plug-in shuts down. Callers must not dispose of these images
-	 * themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the image name found in /icons (with extension)
-	 * @return the image, null on error or not found.
-	 */
-	public Image getImage(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		Image image = images.get(name);
-		if (image == null) {
-			try {
-				ImageDescriptor id = ImageDescriptor.createFromURL(new URL(
-						_pluginBase, "icons/" + name)); //$NON-NLS-1$
-				images.put(name, id);
-
-				image = images.get(name);
-			} catch (MalformedURLException ee) {
-				// log.CommonPlugin.image.error=Image {0} not found.
-				_log.error("log.msg", "log.CommonPlugin.image.error", name, ee); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		return image;
-	}
-
-	/**
-	 * Returns a shared ImageDescriptor for the given name
-	 * <p>
-	 * Note: ImageDescriptor returned from this method will be automitically
-	 * disposed of when this plug-in shuts down. Callers must not dispose of
-	 * these ImageDescriptor themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the ImageDescriptor name found in /icons (with extension)
-	 * @return the ImageDescriptor, null on error or not found.
-	 */
-	public ImageDescriptor getImageDescriptor(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		ImageDescriptor id = images.getDescriptor(name);
-		if (id == null) {
-			try {
-				id = ImageDescriptor.createFromURL(new URL(_pluginBase,
-						"icons/" + name)); //$NON-NLS-1$
-				images.put(name, id);
-			} catch (MalformedURLException ee) {
-				// log.CommonPlugin.image.error=Image {0} not found.
-				_log.error("log.msg", "log.CommonPlugin.image.error", name, ee); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		return id;
-	}
-
-	/**
-	 * Is this eclipse version 2.1
-	 * 
-	 * @return true if version is 2.1
-	 */
-	public static boolean isTwoDotOne() {
-		return TWO_DOT_ONE;
-	}
-
-	/**
-	 * Is this eclipse version 3.x
-	 * 
-	 * @return true if version is 3.x
-	 */
-	public static boolean isThreeDot() {
-		return THREE_DOT;
-	}
-
-	/**
-	 * get the eclipse version
-	 * 
-	 * @return version string.
-	 */
-	public static String getVersion() {
-		return _version;
-	}
-
-
-
-	/**
-	 * Initializes the preference controls to the default values. These values
-	 * are used the first time the preference page is displayed or when the user
-	 * presses the Defaults button in the preferences page.
-	 */
-	protected void initializeDefaultPreferences(IPreferenceStore store) {
-		// NOTE: no logging can happen here since we haven't initialized logging
-		// yet because it
-		// depends on preferences!!!!
-
-		store.setDefault(P_CONSOLE_LOGGING, _properties.getProperty(
-				P_CONSOLE_LOGGING, Boolean.TRUE.toString()));
-		store.setDefault(P_CONSOLE_LOG_LEVEL, strToIntLogLevel(_properties
-				.getProperty(P_CONSOLE_LOG_LEVEL, "ERROR"))); //$NON-NLS-1$
-
-		store.setDefault(P_ECLIPSE_LOGGING, _properties.getProperty(
-				P_ECLIPSE_LOGGING, Boolean.TRUE.toString()));
-		store.setDefault(P_ECLIPSE_LOG_LEVEL, strToIntLogLevel(_properties
-				.getProperty(P_ECLIPSE_LOG_LEVEL, "ERROR"))); //$NON-NLS-1$
-
-		store.setDefault(P_FILE_LOGGING, _properties.getProperty(
-				P_FILE_LOGGING, Boolean.FALSE.toString()));
-		store.setDefault(P_FILE_LOG_LEVEL, strToIntLogLevel(_properties
-				.getProperty(P_FILE_LOG_LEVEL, "ERROR"))); //$NON-NLS-1$
-		store.setDefault(P_FILE_PATH, _properties.getProperty(P_FILE_PATH, "")); //$NON-NLS-1$
-		store.setDefault(P_FILE_CLEAR, _properties.getProperty(P_FILE_CLEAR,
-				Boolean.TRUE.toString()));
-		store.setDefault(P_FILE_ROLLOVER_FREQUENCY, _properties.getProperty(
-				P_FILE_ROLLOVER_FREQUENCY, "DAILY")); //$NON-NLS-1$
-	}
-
-	/**
-	 * Converts the log level from string to int. The level defaults to
-	 * ERROR_LEVEL.
-	 * 
-	 * @param str
-	 *            String representation of log level
-	 * @return integer representation of log level
-	 */
-	private int strToIntLogLevel(String str) {
-		if (str == null) {
-			return ERROR_LEVEL;
-		}
-		if (str.equalsIgnoreCase("DEBUG")) { //$NON-NLS-1$
-			return DEBUG_LEVEL;
-		}
-		if (str.equalsIgnoreCase("INFO")) { //$NON-NLS-1$
-			return INFO_LEVEL;
-		}
-		if (str.equalsIgnoreCase("WARN")) { //$NON-NLS-1$
-			return WARN_LEVEL;
-		}
-		if (str.equalsIgnoreCase("FATAL")) { //$NON-NLS-1$
-			return FATAL_LEVEL;
-		}
-		return ERROR_LEVEL;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/IOpenPage.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/IOpenPage.java
deleted file mode 100644
index 8456083..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/IOpenPage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.actions;
-
-/**
- * Editors should implement this if they can handle reseting to a page based on
- * the class defined for that page.
- * 
- * @author collinsc,jchoi
- */
-public interface IOpenPage {
-	/**
-	 * Sets the currently active page from the id of the page.
-	 * 
-	 * @param pageID
-	 */
-	public void setActiveEditorPage(String pageID);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadCheatSheetAction.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadCheatSheetAction.java
deleted file mode 100644
index de7406f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadCheatSheetAction.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.cheatsheets.OpenCheatSheetAction;
-
-/**
- * This class is used to open the cheat sheet based on the configuration
- * parameter.
- * 
- * @author mengbo
- */
-public class LoadCheatSheetAction extends Action implements
-		IExecutableExtension {
-	private String _cheatSheetName = null;
-
-	/**
-	 * 
-	 */
-	public LoadCheatSheetAction() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		if (_cheatSheetName != null) {
-			OpenCheatSheetAction action = new OpenCheatSheetAction(
-					_cheatSheetName);
-			action.run();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config,
-			String propertyName, Object data) throws CoreException {
-		_cheatSheetName = config.getAttribute("actionparameters"); //$NON-NLS-1$
-	}
-
-	/**
-	 * set the cheatSheetName name to open.
-	 * 
-	 * @param cheatSheetName
-	 */
-	public void setCheatSheetName(String cheatSheetName) {
-		_cheatSheetName = cheatSheetName;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadHelpAction.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadHelpAction.java
deleted file mode 100644
index 18b927d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/LoadHelpAction.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IHelpResource;
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * This class is used to open the help page for a configuration param.
- * 
- * @author mengbo
- */
-public class LoadHelpAction extends Action implements IExecutableExtension {
-	private String _helpContextId = null;
-
-	/**
-	 * 
-	 */
-	public LoadHelpAction() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		IContext context = HelpSystem.getContext(_helpContextId);
-		if (context != null) {
-			IHelpResource[] topics = context.getRelatedTopics();
-			if (topics != null && topics.length == 1) {
-				PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(
-						topics[0].getHref());
-			} else {
-				PlatformUI.getWorkbench().getHelpSystem().displayHelp(
-						_helpContextId);
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config,
-			String propertyName, Object data) throws CoreException {
-		_helpContextId = config.getAttribute("actionparameters"); //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/OpenPageAction.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/OpenPageAction.java
deleted file mode 100644
index 252e44c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/actions/OpenPageAction.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.actions;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.editor.FormEditor;
-
-/**
- * This class is used to open a page in the editor based on the configuration
- * parameter.
- * 
- * @author collinsc,jchoi
- */
-public class OpenPageAction extends Action implements IExecutableExtension {
-	private String pageID = null;
-
-	private ISelection selection;
-
-	/**
-	 * 
-	 */
-	public OpenPageAction() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		if (pageID != null) {
-			// get the active editor
-			IEditorPart editor = getActiveEditor();
-			IOpenPage openPage = (IOpenPage)editor.getAdapter(IOpenPage.class);
-			if(openPage != null){
-				openPage.setActiveEditorPage(pageID);
-				if (selection != null && editor instanceof FormEditor) {
-					IEditorPart activePage = ((FormEditor) editor)
-							.getActiveEditor();
-					if (activePage instanceof ISelectionProvider) {
-						((ISelectionProvider) activePage)
-								.setSelection(selection);
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config,
-			String propertyName, Object data) throws CoreException {
-		pageID = config.getAttribute("actionparameters"); //$NON-NLS-1$
-	}
-
-	/**
-	 * set the class name to open.
-	 * @param className 
-	 */
-	public void setPageName(String className) {
-		this.pageID = className;
-	}
-
-	/**
-	 * get the current active editor
-	 * 
-	 * @return the active editor part
-	 */
-	public static IEditorPart getActiveEditor() {
-		IEditorPart editor = null;
-		IWorkbenchWindow win = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (win != null) {
-			IWorkbenchPage page = win.getActivePage();
-			if (page != null) {
-				editor = page.getActiveEditor();
-			}
-		}
-		return editor;
-	}
-
-	/**
-	 * @return stored selection
-	 */
-	public ISelection getSelection() {
-		return selection;
-	}
-
-	/**
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-		this.selection = selection;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/AbstractClassButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/AbstractClassButtonDialogField.java
deleted file mode 100644
index 165846a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/AbstractClassButtonDialogField.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ abstract class AbstractClassButtonDialogField extends
-		StringButtonDialogField {
-	private IProject _project;
-
-	private String _superClass;
-
-	private List _interfacesList;
-
-	private IType _type;
-
-	private int _typeFlag = IJavaElementSearchConstants.CONSIDER_ALL_TYPES;
-
-	private boolean _autoOpenResource = true;
-
-	/**
-	 * @param autoOpenResource
-	 */
-	public void setAutoOpenResource(boolean autoOpenResource) {
-		_autoOpenResource = autoOpenResource;
-	}
-
-	/**
-	 * @param project
-	 */
-	public AbstractClassButtonDialogField(IProject project) {
-		super(null);
-		this._project = project;
-
-		setHyperLink(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				activeLink();
-			}
-		});
-
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				browseButtonPressed();
-			}
-		});
-	}
-
-	private void activeLink() {
-		String className = getText();
-		className = trimNonAlphaChars(className);
-		if (className.length() > 0
-				&& JavaUIHelper.doesClassExist(_project, className)) {
-			JavaUIHelper.doOpenClass(_project, className);
-		} else {
-			try {
-				if (_project == null || !_project.hasNature(JavaCore.NATURE_ID)) {
-					ResourceBundle rb = ResourceBundle
-							.getBundle("org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldResources"); //$NON-NLS-1$
-					Alerts alerts = new Alerts(JSFUICommonPlugin.getDefault(), rb);
-					alerts.error("ClassButtonDialogField.Alert.Title", //$NON-NLS-1$
-							"ClassButtonDialogField.Alert.Msg"); //$NON-NLS-1$
-					return;
-				}
-			} catch (CoreException e) {
-				e.printStackTrace();
-				return;
-			}
-			JavaClassWizard wizard = new JavaClassWizard(_project, className,
-					_superClass, getImplementInterfaces());
-			wizard.setAutoOpenResource(_autoOpenResource);
-			WizardDialog dialog = new WizardDialog(getShell(), wizard);
-			dialog.create();
-
-			setDialogSize(dialog, 400, 500);
-			if (dialog.open() == WizardDialog.OK) {
-				String newValue = wizard.getClassNameWithArgs();
-				if (!newValue.equals(className)) {
-					setText(newValue);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return the interfaces 
-	 * TODO: the contract seems inconsistent
-	 * as whether to return null or empty list when none
-	 */
-	protected abstract List getImplementInterfaces();
-
-	/**
-	 * @return the java search scope to be used.  Must not be null
-	 */
-	protected abstract IJavaSearchScope getJavaSearchScope();
-
-	private void browseButtonPressed() {
-		Shell shell = getShell();
-		SelectionDialog dialog = JavaUIHelper.openSelectionDialog(shell,
-				getJavaSearchScope(), _typeFlag);
-		dialog.setTitle(JSFUICommonPlugin
-				.getResourceString("DialogField.ClassButton.SelectType"));//$NON-NLS-1$
-
-		if (dialog.open() == SelectionDialog.OK) {
-			String oldClassName = getText();
-			if (dialog.getResult() != null) {
-				_type = (IType) dialog.getResult()[0];
-				String newClassName = _type.getFullyQualifiedName();
-				if (!oldClassName.equals(newClassName)) {
-					setText(newClassName);
-				}
-			}
-		}
-	}
-
-	private void setDialogSize(Dialog dialog, int width, int height) {
-		Point computedSize = dialog.getShell().computeSize(SWT.DEFAULT,
-				SWT.DEFAULT);
-		width = Math.max(computedSize.x, width);
-		height = Math.max(computedSize.y, height);
-		dialog.getShell().setSize(width, height);
-	}
-
-	private String trimNonAlphaChars(String className) {
-		className = className.trim();
-		while (className.length() > 0
-				&& !Character.isLetter(className.charAt(0))) {
-			className = className.substring(1, className.length());
-		}
-		int loc = className.indexOf(":"); //$NON-NLS-1$
-		if (loc != -1 && loc > 0) {
-			className = className.substring(0, loc);
-		} else if (loc == 0) {
-			className = ""; //$NON-NLS-1$
-		}
-		return className;
-	}
-
-	/**
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * @param project
-	 *            The project to set.
-	 */
-	public void setProject(IProject project) {
-		this._project = project;
-	}
-
-	/**
-	 * @return Returns the superClassName.
-	 */
-	public String getSuperClassName() {
-		return _superClass;
-	}
-
-	/**
-	 * @param superClassName
-	 *            The superClassName to set.
-	 */
-	public void setSuperClassName(String superClassName) {
-		this._superClass = superClassName;
-	}
-
-	/**
-	 * @return Returns the interfacesList.
-	 */
-	protected List getInterfacesList() {
-		return _interfacesList;
-	}
-
-	/**
-	 * Sets (replaces) the interface list
-	 * TODO: this list can have at most one element
-	 * @param interfaceName
-	 */
-	public void setInterface(String interfaceName) {
-		_interfacesList = new ArrayList();
-		_interfacesList.add(interfaceName);
-	}
-
-	/**
-	 * @return Returns the _type.
-	 */
-	public IType getType() {
-		return _type;
-	}
-
-	/**
-	 * @return Returns the typeFalg.
-	 */
-	public int getTypeFlag() {
-		return _typeFlag;
-	}
-
-	/**
-	 * @param typeFalg
-	 *            The typeFalg to set.
-	 */
-	public void setTypeFlag(int typeFalg) {
-		this._typeFlag = typeFalg;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ClassButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ClassButtonDialogField.java
deleted file mode 100644
index baed42b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ClassButtonDialogField.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-/**
- * @author mengbo
- */
-public class ClassButtonDialogField extends AbstractClassButtonDialogField {
-	/**
-	 * @param project
-	 */
-	public ClassButtonDialogField(IProject project) {
-		super(project);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.AbstractClassButtonDialogField#getImplementInterfaces()
-	 */
-	protected List getImplementInterfaces() {
-		return getInterfacesList();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.AbstractClassButtonDialogField#getJavaSearchScope()
-	 */
-	protected IJavaSearchScope getJavaSearchScope() {
-		IJavaSearchScope scope;
-		String superType = getSuperClassName();
-		List interfaceList = getInterfacesList();
-		if (superType == null && interfaceList != null
-				&& interfaceList.size() > 0) {
-			superType = interfaceList.get(0).toString();
-		}
-		if (getSuperClassName() != null && interfaceList != null
-				&& interfaceList.size() > 0) {
-			superType = null;
-		}
-		if (superType == null) {
-			scope = SearchEngine
-					.createJavaSearchScope(new IJavaProject[] { JavaCore
-							.create(getProject()) });
-		} else {
-			scope = JavaUIHelper.findSearchScope(getProject(), superType);
-		}
-		return scope;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorButtonDialogField.java
deleted file mode 100644
index 8228414..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorButtonDialogField.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.ColorDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * This class provides a common color choice DialogFiled.
- * 
- * @author mengbo
- */
-public class ColorButtonDialogField extends StyleComboDialogField {
-	// color selection button
-	private Button _button;
-
-	// the button enable flag
-	private boolean _buttonEnabled;
-
-	// the current color
-	private Color _color;
-
-	// the current color RGB
-	private RGB _colorValue;
-
-	// the combo control
-	private StyleCombo _combo;
-
-	// when no color is set or selected, using the empty image
-	private Image _emptyImage;
-
-	// size of color image
-	private Point _extent;
-
-	// the color image
-	private Image _image;
-    
-    private ColorPalette    _colorPalette;
-
-	/**
-	 * @param flags
-	 * @param colorPalette
-	 */
-	public ColorButtonDialogField(int flags, ColorPalette colorPalette) {
-		super(flags);
-		_buttonEnabled = true;
-        _colorPalette = colorPalette;
-	}
-
-	private void buttonPressed() {
-		ColorDialog colorDialog = new ColorDialog(_button.getShell());
-		colorDialog.setRGB(_colorValue);
-		RGB newColor = colorDialog.open();
-		if (newColor != null && !newColor.equals(_colorValue)) {
-			_colorValue = newColor;
-			setText(ColorPalette.getStringColor(newColor));
-			updateColorImage();
-		}
-	}
-
-	/**
-	 * Compute the size of the image to be displayed.
-	 * 
-	 * @param window -
-	 *            the window used to calculate
-	 * @return <code>Point</code>
-	 */
-	private Point computeImageSize(Control window) {
-		GC gc = new GC(window);
-		Font f = _button.getFont();
-		gc.setFont(f);
-		int height = gc.getFontMetrics().getHeight();
-
-		Point p = new Point(height * 3 - 6, height - 2);
-		gc.dispose();
-		return p;
-	}
-
-	private void disposeResources() {
-		if (_image != null) {
-			_image.dispose();
-			_image = null;
-		}
-		if (_emptyImage != null) {
-			_emptyImage.dispose();
-			_emptyImage = null;
-		}
-		if (_color != null) {
-			_color.dispose();
-			_color = null;
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#doFillIntoGrid(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite, int)
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		StyleCombo combo = getComboControl(toolkit, parent);
-		combo.setLayoutData(gridDataForCombo(nColumns - 3));
-
-		_button = getChangeControl(toolkit, parent);
-		_button.setLayoutData(gridDataForButton(1));
-
-		return new Control[] { requiredLabel, label, combo, _button };
-	}
-
-	/**
-	 * Sets the enable state of the button.
-	 * @param enable 
-	 */
-	public void enableButton(boolean enable) {
-		if (isOkToUse(_button)) {
-			_button.setEnabled(isEnabled() && enable);
-		}
-		_buttonEnabled = enable;
-	}
-
-	/**
-	 * Creates or returns the created buttom widget.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 * @return  the button widget
-	 */
-	public Button getChangeControl(FormToolkit toolkit, Composite parent) {
-		if (_button == null) {
-			assertCompositeNotNull(parent);
-			if (toolkit != null) {
-				_button = toolkit.createButton(parent, "", SWT.PUSH); //$NON-NLS-1$
-			} else {
-				_button = new Button(parent, SWT.PUSH);
-			}
-			_button.setEnabled(isEnabled() && _buttonEnabled);
-
-			_button.addSelectionListener(new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					buttonPressed();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					buttonPressed();
-				}
-			});
-
-			_button.addDisposeListener(new DisposeListener() {
-				public void widgetDisposed(DisposeEvent event) {
-					disposeResources();
-				}
-			});
-
-			_extent = computeImageSize(parent);
-			_image = new Image(parent.getDisplay(), _extent.x, _extent.y);
-			_emptyImage = new Image(parent.getDisplay(), _extent.x, _extent.y);
-			initEmptyImage(_button);
-			updateColorImage();
-		}
-
-		return _button;
-	}
-
-	private String[] getColorList() {
-		Map map = _colorPalette.getExtendedColorMap();
-		List list = new ArrayList(map.keySet());
-		Collections.sort(list);
-		return (String[]) list.toArray(new String[list.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField#getTextControl(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public StyleCombo getComboControl(FormToolkit toolkit, Composite parent) {
-
-		if (_combo == null) {
-			_combo = super.getComboControl(toolkit, parent);
-
-			_combo.addSelectionListener(new SelectionListener() {
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-					updateImageAfterChanged();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					updateImageAfterChanged();
-				}
-			});
-			_combo.addFocusListener(new FocusAdapter() {
-				public void focusLost(FocusEvent e) {
-					updateImageAfterChanged();
-				}
-			});
-			_combo.setItems(getColorList());
-		}
-		return _combo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#getNumberOfControls()
-	 */
-	public int getNumberOfControls() {
-		return 4;
-	}
-	private GridData gridDataForButton(int span) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		gd.widthHint = LayoutUtil.getButtonWidthHint(_button);
-		gd.heightHint = _combo.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
-		return gd;
-	}
-
-	private void initEmptyImage(Control parent) {
-		Color transparentColor = parent.getForeground();
-		ImageData imageData = _emptyImage.getImageData();
-		imageData.transparentPixel = 0;
-		GC gc = new GC(_emptyImage);
-		gc.setBackground(transparentColor);
-		gc.fillRectangle(0, 0, _emptyImage.getBounds().width, _emptyImage
-				.getBounds().height);
-	}
-
-	/**
-	 * Set the current color value and update the control.
-	 * 
-	 * @param rgb
-	 *            The new color.
-	 */
-	public void setColorValue(RGB rgb) {
-		_colorValue = rgb;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField#setTextWithoutUpdate(java.lang.String)
-	 */
-	public void setTextWithoutUpdate(String text) {
-		super.setTextWithoutUpdate(text);
-		updateImageAfterChanged();
-	}
-
-	/**
-	 * Update the image being displayed on the button using the current color
-	 * setting.
-	 */
-	protected void updateColorImage() {
-		if (_button.isDisposed()) {
-			return;
-		}
-
-		if (_colorValue == null) {
-			_button.setImage(_emptyImage);
-			return;
-		}
-
-		Display display = _button.getDisplay();
-		GC gc = new GC(_image);
-		gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
-		gc.drawRectangle(0, 0, _extent.x - 1, _extent.y - 1);
-		if (_color != null) {
-			_color.dispose();
-		}
-		_color = new Color(display, _colorValue);
-		gc.setBackground(_color);
-		gc.fillRectangle(1, 1, _extent.x - 2, _extent.y - 2);
-		gc.dispose();
-		_button.setImage(_image);
-	}
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_button)) {
-			_button.setEnabled(isEnabled() && _buttonEnabled);
-		}
-	}
-
-	private void updateImageAfterChanged() {
-		String newColor = getText().trim();
-		setColorValue(_colorPalette.getExtendedColorRGB(newColor));
-		updateColorImage();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorPalette.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorPalette.java
deleted file mode 100644
index 454a4c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ColorPalette.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Defines a two sets: one of basic and one of extended colors.  Clients extending
- * this class must provide the two maps
- * 
- * @author cbateman
- *
- */
-public abstract class ColorPalette 
-{
-    /**
-     * @param cssText
-     * @return the basic color matching the cssText key or null if color doesn't exist
-     */
-    public final Color getBasicColor(String cssText) {
-        return (Color) getBasicColorMap().get(cssText.toLowerCase());
-    }
-
-    /**
-     * @param cssText
-     * @return the extended color matching the cssText key or null if color doesn't exist
-     */
-    public final Color getExtendedColor(String cssText) {
-        Set keys = getExtendedColorMap().keySet();
-        for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
-            String key = (String) iterator.next();
-            if (key.equalsIgnoreCase(cssText)) {
-                return (Color) getExtendedColorMap().get(key);
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @return the map of basic colors where the key is the color name (a string)
-     * and the value is an RGB object
-     */
-    public abstract Map getBasicColorMap();
-
-    /**
-     * @return the map of extended colors where the key is the color name (a string)
-     * and the value is an Color object
-     */
-    public abstract Map getExtendedColorMap();
-
-    /**
-     * @param textColor
-     * @return same as getExtendedColor but returns value as an RGB object
-     */
-    public final RGB getExtendedColorRGB(String textColor) {
-        if (textColor == null || textColor.length() == 0) {
-            return null;
-        }
-
-        Color color = getExtendedColor(textColor);
-        if (color != null) {
-            return color.getRGB();
-        }
-
-        if (textColor.charAt(0) == '#' && textColor.length() == 4) {
-            char[] rgbChars = textColor.toCharArray();
-            char[] fullChars = { rgbChars[0], rgbChars[1], rgbChars[1],
-                    rgbChars[2], rgbChars[2], rgbChars[3], rgbChars[3] };
-
-            textColor = String.valueOf(fullChars);
-        }
-
-        if (textColor.charAt(0) == '#' && textColor.length() == 7) {
-            try {
-                int intColor = Integer.decode(textColor).intValue();
-
-                if (intColor > 0xFFFFFF || intColor < 0) {
-                    return null;
-                }
-                int r = intColor >> 16;
-                int g = (intColor >> 8) & 0xFF;
-                int b = intColor & 0xFF;
-                return new RGB(r, g, b);
-
-            } catch (NumberFormatException e) {
-                return null;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param rgb
-     * @return the hex string for equivalent of the rgb color
-     */
-    public static String getStringColor(RGB rgb) {
-        if (rgb == null) {
-            return ""; //$NON-NLS-1$
-        }
-
-        StringBuffer buffer = new StringBuffer("#"); //$NON-NLS-1$
-        int[] intRGBs = new int[] { rgb.red, rgb.green, rgb.blue };
-        for (int i = 0; i < 3; i++) {
-            if (intRGBs[i] < 16) {
-                buffer.append("0"); //$NON-NLS-1$
-            }
-            buffer.append(Integer.toHexString(intRGBs[i]).toUpperCase());
-        }
-        return buffer.toString();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ComboDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ComboDialogField.java
deleted file mode 100644
index 582634e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ComboDialogField.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Dialog field containing a label and a combo control.
- * 
- * If the combo control is editable, then when user type in the field, will only
- * fire dialogFieldChanged, without dialogFieldApplied just as text control. But
- * when user change selection using the drop down, will fire both
- * dialogFieldChanged and dialogFieldApplied
- * 
- * @author mengbo
- */
-public class ComboDialogField extends DialogFieldBase implements
-		ISupportTextValue {
-	final static private int WIDTH_HINT = 10;
-
-	private String _text;
-
-	private int _selectionIndex;
-
-	private String[] _items;
-
-	private CCombo _comboControl;
-
-	private ModifyListener _modifyListener;
-
-	private int _flags;
-
-	private boolean _pending = false;
-
-	private Map _entryMap;
-
-	/**
-	 * @param flags
-	 */
-	public ComboDialogField(int flags) {
-		super();
-		_text = ""; //$NON-NLS-1$
-		_items = new String[0];
-		_flags = flags;
-		_selectionIndex = -1;
-	}
-
-	// ------- layout helpers
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		CCombo combo = getComboControl(toolkit, parent);
-		combo.setLayoutData(gridDataForCombo(nColumns - 2));
-
-		return new Control[] { requiredLabel, label, combo };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 3;
-	}
-
-	private static GridData gridDataForCombo(int span) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		gd.widthHint = WIDTH_HINT;
-		return gd;
-	}
-
-	// ------- focus methods
-
-	/*
-	 * @see DialogField#setFocus
-	 */
-	public boolean setFocus() {
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setFocus();
-		}
-		return true;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created combo control.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> when the widget
-	 *            has already been created.
-	 * @return the custom combo control
-	 */
-	public CCombo getComboControl(FormToolkit toolkit, Composite parent) {
-		if (_comboControl == null || _comboControl.isDisposed()) {
-			assertCompositeNotNull(parent);
-			_modifyListener = new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					doModifyText(e);
-				}
-			};
-			SelectionListener selectionListener = new SelectionListener() {
-				public void widgetSelected(SelectionEvent e) {
-					doSelectionChanged(e);
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-					handleDefaultSelection(e);
-				}
-			};
-
-			if (toolkit != null) {
-				_comboControl = new CCombo(parent, _flags);
-				toolkit.adapt(_comboControl);
-			} else {
-				_comboControl = new CCombo(parent, _flags | SWT.BORDER);
-				_comboControl.setBackground(Display.getCurrent()
-						.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-			}
-
-			// moved up due to 1GEUNW2
-			_comboControl.setItems(_items);
-			if (_selectionIndex != -1) {
-				_comboControl.select(_selectionIndex);
-			} else {
-				_comboControl.setText(_text);
-			}
-			_comboControl.setFont(parent.getFont());
-			_comboControl.addModifyListener(_modifyListener);
-			_comboControl.addSelectionListener(selectionListener);
-			_comboControl.addFocusListener(new FocusAdapter() {
-				public void focusLost(FocusEvent e) {
-					doFocusLost(e);
-				}
-			});
-			_comboControl.setEnabled(isEnabled());
-			_comboControl.setToolTipText(getToolTip());
-		}
-		return _comboControl;
-	}
-
-	private void handleDefaultSelection(SelectionEvent e) {
-		// commit value
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	private void doFocusLost(FocusEvent e) {
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	private void doModifyText(ModifyEvent e) {
-		if (isOkToUse(_comboControl)) {
-			_text = getEntryKey(_comboControl.getText());
-			_selectionIndex = _comboControl.getSelectionIndex();
-		}
-		_pending = true;
-		dialogFieldChanged();
-	}
-
-	private void doSelectionChanged(SelectionEvent e) {
-		if (isOkToUse(_comboControl)) {
-			_items = _comboControl.getItems();
-			_text = getEntryKey(_comboControl.getText());
-			_selectionIndex = _comboControl.getSelectionIndex();
-		}
-		_pending = false;
-		dialogFieldChangedAndApplied();
-	}
-
-	// ------ enable / disable management
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setEnabled(isEnabled());
-		}
-	}
-
-	// ------ text access
-
-
-	/**
-	 * Sets the combo items. Triggers a dialog-changed event.
-	 * @param items 
-	 */
-	public void setItems(String[] items) {
-		_items = items;
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setItems(items);
-		}
-		_pending = false;
-		// dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Gets the text.
-	 */
-	public String getText() {
-		return _text;
-	}
-
-	/**
-	 * Sets the text. Triggers a dialog-changed event.
-	 */
-	public void setText(String text) {
-		setTextWithoutUpdate(text);
-		_pending = false;
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Selects an item.
-	 * @param index 
-	 */
-	public void selectItem(int index) {
-		if (isOkToUse(_comboControl)) {
-			_comboControl.select(index);
-		} else {
-			if (index >= 0 && index < _items.length) {
-				_text = getEntryKey(_items[index]);
-				_selectionIndex = index;
-			}
-		}
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Sets the text without triggering a dialog-changed event.
-	 */
-	public void setTextWithoutUpdate(String text) {
-		_pending = false;
-		if (text == null) {
-			text = "";//$NON-NLS-1$
-		}
-		_text = text;
-		if (isOkToUse(_comboControl)) {
-			_comboControl.removeModifyListener(_modifyListener);
-			_comboControl.setText(getEntryValue(text));
-			_comboControl.addModifyListener(_modifyListener);
-		}
-	}
-
-	private String getEntryValue(String key) {
-		if (_entryMap == null || !_entryMap.containsKey(key)) {
-			return key;
-		}
-		return _entryMap.get(key).toString();
-	}
-
-	private String getEntryKey(String value) {
-		if (_entryMap == null || !_entryMap.containsValue(value)) {
-			return value;
-		}
-
-		Entry[] entries = (Entry[]) _entryMap.entrySet().toArray(new Entry[0]);
-		for (int i = 0; i < entries.length; i++) {
-			if (entries[i].getValue() == value
-					|| (value != null && value.equals(entries[i].getValue()))) {
-				return entries[i].getKey().toString();
-			}
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		LayoutUtil.setGrabHorizontal(_comboControl, true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogField.java
deleted file mode 100644
index 0ff86f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogField.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface DialogField {
-	/**
-	 * this method must be called directly after constructor, in this case,
-	 * system will create a hyper link label, and when the hyper link is
-	 * clicked, the corresponding method on the listener will be called. A
-	 * RuntimeException will throw out if this method is called after the label
-	 * has been created.
-	 * 
-	 * @param listener
-	 *            can't be null
-	 */
-	public abstract void setHyperLink(IHyperlinkListener listener);
-
-	/**
-	 * Sets the label of the dialog field.
-	 * @param labeltext 
-	 */
-	public abstract void setLabelText(String labeltext);
-
-	// ------ change listener
-	/**
-	 * Listener that is notified on a field change
-	 * @param listener
-	 */
-	public abstract void setDialogFieldChangeListener(
-			IDialogFieldChangeListener listener);
-
-	/**
-	 * Listener  that is notified on a field apply
-	 * @param listener
-	 */
-	public abstract void setDialogFieldApplyListener(
-			IDialogFieldApplyListener listener);
-
-	// ------- focus management
-	/**
-	 * Tries to set the focus to the dialog field. Returns <code>true</code>
-	 * if the dialog field can take focus. To be re-implemented by dialog field
-	 * implementors.
-	 * @return true if dialog field can take focus
-	 */
-	public abstract boolean setFocus();
-
-	/**
-	 * Creates all controls of the dialog field and fills it to a composite. The
-	 * composite is assumed to have <code>MGridLayout</code> as layout. The
-	 * dialog field will adjust its controls' spans to the number of columns
-	 * given. To be reimplemented by dialog field implementors.
-	 * @param toolkit 
-	 * @param parent 
-	 * @param nColumns 
-	 * @return the controls
-	 */
-	public abstract Control[] doFillIntoGrid(FormToolkit toolkit,
-			Composite parent, int nColumns);
-
-	/**
-	 * Returns the number of columns of the dialog field. To be reimplemented by
-	 * dialog field implementors.
-	 * @return the number of columns
-	 */
-	public abstract int getNumberOfControls();
-
-	// ------- ui creation
-	/**
-	 * @param _formToolkit
-	 * @param parent
-	 * @return the label control
-	 */
-	public abstract Control getLabelControl(FormToolkit _formToolkit,
-			Composite parent);
-
-	// --------- enable / disable management
-	/**
-	 * @param enabled
-	 */
-	public abstract void setEnabled(boolean enabled);
-
-	/**
-	 * Gets the enable state of the dialog field.
-	 * @return true if enabled is set
-	 */
-	public abstract boolean isEnabled();
-
-	/**
-	 * Get attached data by key.
-	 * 
-	 * @param key
-	 * @return the attached data object for key
-	 */
-	public abstract Object getAttachedData(Object key);
-
-	/**
-	 * You can attach any data to the DialogField, and get it using the
-	 * <code>getAttachedData</code> method.
-	 * 
-	 * @param key
-	 * @param value
-	 */
-	public abstract void putAttachedData(Object key, Object value);
-
-	/**
-	 * this method give the DialogField a chance to set the correct column to
-	 * grab horizontal space. In the implementation of this method, should only
-	 * change the GridData of control, should not do anything else.
-	 * 
-	 * The caller is responsible to make sure the controls for the dialog field
-	 * has been created before calling this method.
-	 */
-	public abstract void handleGrabHorizontal();
-
-	/**
-	 * @return true if is required field
-	 */
-	public abstract boolean isRequired();
-
-	/**
-	 * @param toolTip
-	 */
-	public abstract void setToolTip(String toolTip);
-	
-	/**
-	 * @return the field's enclosing shell or null if none
-	 */
-	public Shell getShell();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldBase.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldBase.java
deleted file mode 100644
index 7d61f49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldBase.java
+++ /dev/null
@@ -1,559 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseTrackAdapter;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-
-/**
- * Base class of all Dialog fields. Dialog fields manage controls together with
- * the model, independed from the creation time of the widgets. - support for
- * automated layouting. - enable / disable, set focus a concept of the base
- * class. DialogField have a label.
- * 
- * DialogField may be used in two different context:
- * <ol>
- * <li> In side dialog. In this case, whenever there is anything change in the
- * dialog field, such as user type anything, the dialog should listen to the
- * dialogFieldChanged() events and do things like validation. When user press
- * the "OK" button, dialog should call getXXX to get the value from the dialog
- * field and apply them.
- * <li> In side form based editor or properties view. In this case, whenever
- * there is anything change in the dialog field, such as user type anything, the
- * editor/view should listen to the dialogFieldChanged() events and do things
- * like validation. When user press "Enter" or move the focus out of the control
- * (finish editing), the dialog field will fire out dialogFieldApplied() events,
- * and the editor/view should listen to this event and apply the value to the
- * underlying model.
- * </ol>
- * 
- * The basic idea of the DialogField framework is comming from
- * <code>org.eclipse.jface.preference.FieldEditor</code> and
- * <code>org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField</code>
- * 
- * @author mengbo
- */
-public class DialogFieldBase implements DialogField {
-	private Label _label;
-
-	private Label _requiredLabel;
-
-	private String _labelText;
-
-	private IDialogFieldChangeListener _dialogFieldChangeListener;
-
-	private IDialogFieldApplyListener _dialogFieldApplyListener;
-
-	private boolean _enabled;
-
-	private FontMetrics _fontMetrics;
-
-	private IHyperlinkListener _listener;
-
-	private Hyperlink _hyperlink;
-
-	private Map _attachedData;
-
-	private boolean _isRequired;
-
-	private String toolTip;
-
-	/**
-	 * default constructor
-	 */
-	public DialogFieldBase() {
-		_enabled = true;
-		_label = null;
-		_requiredLabel = null;
-		_hyperlink = null;
-		_labelText = ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * this method must be called directly after constructor, in this case,
-	 * system will create a hyper link label, and when the hyper link is
-	 * clicked, the corresponding method on the listene will be called. A
-	 * RuntimeException will throw out if this method is called after the label
-	 * has been created.
-	 * 
-	 * @param listener
-	 *            can't be null
-	 */
-	public void setHyperLink(IHyperlinkListener listener) {
-		if (_label != null) {
-			throw new RuntimeException(
-					"The Label instance does not support the listener"); //$NON-NLS-1$
-		}
-        this._listener = listener;
-	}
-
-	/**
-	 * Sets the label of the dialog field.
-	 */
-	public void setLabelText(String labeltext) {
-		_labelText = labeltext == null ? "" : labeltext; //$NON-NLS-1$
-		// if (_isRequired)
-		// {
-		// _labelText = "* " + _labelText;
-		// }
-		// else
-		// {
-		// _labelText = " " + _labelText;
-		// }
-		if (_label != null && !_label.isDisposed()) {
-			_label.setText(_labelText);
-		} else if (_hyperlink != null && !_hyperlink.isDisposed()) {
-			_hyperlink.setText(_labelText);
-		}
-	}
-
-	/**
-	 * @return return the enclosing Shell or null if one cannot be determined
-	 */
-	public Shell getShell() {
-		if (_label != null && !_label.isDisposed()) {
-			return _label.getShell();
-		} else if (_hyperlink != null && !_hyperlink.isDisposed()) {
-			return _hyperlink.getShell();
-		}
-		return null;
-	}
-
-	// ------ change listener
-
-	/**
-	 * Defines the listener for this dialog field.
-	 */
-	public final void setDialogFieldChangeListener(
-			IDialogFieldChangeListener listener) {
-		_dialogFieldChangeListener = listener;
-	}
-
-	public final void setDialogFieldApplyListener(
-			IDialogFieldApplyListener listener) {
-		_dialogFieldApplyListener = listener;
-	}
-
-	/**
-	 * fire both dialogFieldChanged and dialogFieldApplied events.
-	 */
-	public void dialogFieldChangedAndApplied() {
-		if (_dialogFieldChangeListener != null) {
-			_dialogFieldChangeListener.dialogFieldChanged(this);
-		}
-		if (_dialogFieldApplyListener != null) {
-			_dialogFieldApplyListener.dialogFieldApplied(this);
-		}
-	}
-
-	/**
-	 * fire dialogFieldChanged event.
-	 * 
-	 */
-	public void dialogFieldChanged() {
-		if (_dialogFieldChangeListener != null) {
-			_dialogFieldChangeListener.dialogFieldChanged(this);
-		}
-	}
-
-	/**
-	 * fire dialogFieldApplied event.
-	 * 
-	 */
-	public void dialogFieldApplied() {
-		if (_dialogFieldApplyListener != null) {
-			_dialogFieldApplyListener.dialogFieldApplied(this);
-		}
-	}
-
-	// ------- focus management
-
-
-	public boolean setFocus() {
-		return false;
-	}
-
-	//
-	// /**
-	// * Posts <code>setFocus</code> to the display event queue.
-	// */
-	// public void postSetFocusOnDialogField(Display display)
-	// {
-	// if (display != null)
-	// {
-	// display.asyncExec(new Runnable()
-	// {
-	// public void run()
-	// {
-	// setFocus();
-	// }
-	// }
-	// );
-	// }
-	// }
-
-	// ------- layout helpers
-
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(nColumns));
-
-		return new Control[] { label };
-	}
-
-	/**
-	 * Initializes the computation of horizontal and vertical dialog units based
-	 * on the size of current font.
-	 * <p>
-	 * This method must be called before any of the dialog unit based conversion
-	 * methods are called.
-	 * </p>
-	 * 
-	 * @param control
-	 *            a control from which to obtain the current font
-	 * @return the font metrics for control
-	 */
-	protected FontMetrics getDialogUnits(Control control) {
-		if (_fontMetrics == null) {
-			// Compute and store a font metric
-			GC gc = new GC(control);
-			gc.setFont(control.getFont());
-			_fontMetrics = gc.getFontMetrics();
-			gc.dispose();
-		}
-		return _fontMetrics;
-	}
-
-	/**
-	 * Returns the number of columns of the dialog field. To be reimplemented by
-	 * dialog field implementors.
-	 */
-	public int getNumberOfControls() {
-		return 1;
-	}
-
-	/**
-	 * @param span
-	 * @return a new GridData for the horizontal 'span' value
-	 */
-	protected static GridData gridDataForLabel(int span) {
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gd.horizontalSpan = span;
-		return gd;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created label widget.
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 */
-	public Control getLabelControl(FormToolkit _formToolkit, Composite parent) {
-		Control control = null;
-		if ((_label == null || _label.isDisposed()) && (_hyperlink == null  || _hyperlink.isDisposed())) {
-			assertCompositeNotNull(parent);
-
-			String label = null;
-			if (_labelText != null && !"".equals(_labelText)) { //$NON-NLS-1$
-				//$NON-NLS-1$
-				label = _labelText;
-			} else {
-				label = "."; //$NON-NLS-1$
-			}
-
-			if (_listener == null) {
-				control = createLabel(_formToolkit, parent, label);
-			} else {
-				control = createHyperlink(_formToolkit, parent, label);
-			}
-			/**
-			 * if(isRequired) { FontData[] fontData =
-			 * parent.getFont().getFontData(); FontData[] newFontData = new
-			 * FontData[fontData.length]; for(int i=0; i<fontData.length; i++) {
-			 * newFontData[i] = new FontData(fontData[i].getName(),
-			 * fontData[i].getHeight(), fontData[i].getStyle() | SWT.BOLD); }
-			 * final Font font = new Font(control.getDisplay(),newFontData);
-			 * control.setFont(font); control.addDisposeListener(new
-			 * DisposeListener() {
-			 * 
-			 * public void widgetDisposed(DisposeEvent e) { font.dispose(); }
-			 * }); } else { control.setFont(parent.getFont()); }
-			 */
-			control.setFont(parent.getFont());
-			control.setEnabled(_enabled);
-		} else {
-			if (_label != null) {
-				control = _label;
-			} else {
-				control = _hyperlink;
-			}
-		}
-		return control;
-	}
-
-	/**
-	 * @param _formToolkit
-	 * @param parent
-	 * @return get the Label control for required
-	 */
-	public Control getRequiredLabelControl(FormToolkit _formToolkit,
-			Composite parent) {
-		if (_requiredLabel == null || _requiredLabel.isDisposed()) {
-			if (_formToolkit == null) {
-				_requiredLabel = new Label(parent, SWT.LEFT | SWT.WRAP);
-			} else {
-				_requiredLabel = _formToolkit.createLabel(parent, "", SWT.LEFT //$NON-NLS-1$
-						| SWT.WRAP);
-				_requiredLabel.setForeground(getLabelColor());
-			}
-			if (_isRequired) {
-				_requiredLabel.setText(DialogFieldResources.getInstance()
-						.getString("DialogFieldBase.Label.RequiredSymbol")); //$NON-NLS-1$
-			}
-		}
-		return _requiredLabel;
-	}
-
-	private Control createLabel(FormToolkit _formToolkit, Composite parent,
-			String labelString) {
-		if (_formToolkit == null) {
-			_label = new Label(parent, SWT.LEFT | SWT.WRAP);
-			_label.setText(labelString);
-		} else {
-			_label = _formToolkit.createLabel(parent, labelString, SWT.LEFT
-					| SWT.WRAP);
-			_label.setForeground(getLabelColor());
-		}
-		return _label;
-	}
-
-	/**
-	 * get color for label
-	 */
-	private Color getLabelColor() {
-		String osname = System.getProperty("os.name").toLowerCase(); //$NON-NLS-1$
-		if (osname.startsWith("mac os")) { //$NON-NLS-1$
-			return Display.getCurrent().getSystemColor(
-					SWT.COLOR_LIST_FOREGROUND);
-		}
-        return Display.getCurrent()
-                .getSystemColor(SWT.COLOR_LIST_SELECTION);
-	}
-
-	private Control createHyperlink(FormToolkit _formToolkit, Composite parent,
-			String label) {
-		if (_formToolkit == null) {
-			_hyperlink = new Hyperlink(parent, SWT.LEFT | SWT.WRAP);
-			_hyperlink.setForeground(getLabelColor());
-			_hyperlink.setUnderlined(true);
-			_hyperlink.addMouseTrackListener(new MouseTrackAdapter() {
-
-				public void mouseEnter(MouseEvent e) {
-					_hyperlink.setForeground(Display.getCurrent()
-							.getSystemColor(SWT.COLOR_BLUE));
-				}
-
-				public void mouseExit(MouseEvent e) {
-					_hyperlink.setForeground(getLabelColor());
-				}
-			});
-			_hyperlink.setText(label);
-		} else {
-			_hyperlink = _formToolkit.createHyperlink(parent, label, SWT.LEFT
-					| SWT.WRAP);
-		}
-		_hyperlink.addHyperlinkListener(_listener);
-		return _hyperlink;
-	}
-
-	/**
-	 * Creates a spacer control.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite
-	 * @return a spacer control
-	 */
-	public Control createEmptySpace(FormToolkit toolkit, Composite parent) {
-		return createEmptySpace(toolkit, parent, 1);
-	}
-
-	/**
-	 * Creates a spacer control with the given span. The composite is assumed to
-	 * have <code>MGridLayout</code> as layout.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite
-	 * @param span 
-	 * @return a label that creates empty space
-	 */
-	public Control createEmptySpace(FormToolkit toolkit, Composite parent,
-			int span) {
-		Label label;
-		if (toolkit != null) {
-			label = toolkit.createLabel(parent, ""); //$NON-NLS-1$
-		} else {
-			label = new Label(parent, SWT.LEFT);
-		}
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.BEGINNING;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		gd.horizontalIndent = 0;
-		gd.widthHint = 0;
-		gd.heightHint = 0;
-		label.setLayoutData(gd);
-		return label;
-	}
-
-	/**
-	 * Tests is the control is not <code>null</code> and not disposed.
-	 * @param control 
-	 * @return true if the control is valid for use
-	 */
-	protected final boolean isOkToUse(Control control) {
-		return (control != null) && !(control.isDisposed());
-	}
-
-	// --------- enable / disable management
-
-	/**
-	 * Sets the enable state of the dialog field.
-	 */
-	public final void setEnabled(boolean enabled) {
-		if (enabled != _enabled) {
-			_enabled = enabled;
-			updateEnableState();
-		}
-	}
-
-	/**
-	 * Called when the enable state changed. To be extended by dialog field
-	 * implementors.
-	 */
-	protected void updateEnableState() {
-		if (_label != null && !_label.isDisposed()) {
-			_label.setEnabled(_enabled);
-		}
-		if (_hyperlink != null && !_hyperlink.isDisposed()) {
-			_hyperlink.setEnabled(_enabled);
-		}
-	}
-
-	/**
-	 * Gets the enable state of the dialog field.
-	 */
-	public final boolean isEnabled() {
-		return _enabled;
-	}
-
-	/**
-	 * @param comp
-	 */
-	protected final void assertCompositeNotNull(Composite comp) {
-		Assert.isNotNull(comp,
-				"uncreated control requested with composite null"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param nColumns
-	 */
-	protected final void assertEnoughColumns(int nColumns) {
-		Assert.isTrue(nColumns >= getNumberOfControls(),
-				"given number of columns is too small"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Get attached data by key.
-	 * 
-	 * @param key
-	 * @return the attached data object for key
-	 */
-	public Object getAttachedData(Object key) {
-		if (_attachedData != null) {
-			return _attachedData.get(key);
-		}
-        return null;
-	}
-
-	/**
-	 * You can attach any data to the DialogField, and get it using the
-	 * <code>getAttachedData</code> method.
-	 * 
-	 * @param key
-	 * @param value
-	 */
-	public void putAttachedData(Object key, Object value) {
-		if (_attachedData == null) {
-			_attachedData = new HashMap();
-		}
-		_attachedData.put(key, value);
-	}
-
-	/**
-	 * this method give the DialogField a chance to set the correct column to
-	 * grab horizontal space. In the implementation of this method, should only
-	 * change the GridData of control, should not do anything else.
-	 * 
-	 * The caller is responsible to make sure the controls for the dialog field
-	 * has been created before calling this method.
-	 */
-	public void handleGrabHorizontal() {
-		// do nothing.
-	}
-
-	public boolean isRequired() {
-		return _isRequired;
-	}
-
-	/**
-	 * @param isRequired
-	 */
-	public void setRequired(boolean isRequired) {
-		this._isRequired = isRequired;
-	}
-
-	/**
-	 * @return gthe tool tip text
-	 */
-	protected String getToolTip() {
-		return toolTip;
-	}
-
-	public void setToolTip(String toolTip) {
-		this.toolTip = toolTip;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroup.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroup.java
deleted file mode 100644
index 0ed7b3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroup.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * This class represents a group of dialog fields, following the normal dialog
- * field's lifecycle.
- * 
- * The design of this class is to make a section could be reused in both dialog
- * environment and form based editor environment.
- * 
- * @author mengbo
- */
-public abstract class DialogFieldGroup {
-	private IDialogFieldChangeListener _defaultChangeListener;
-
-	private IDialogFieldApplyListener _defaultApplyListener;
-
-	/**
-	 * set default handler, should be called before <code>initialize()</code>
-	 * @param changelistener 
-	 * 
-	 */
-	public void setDefaultChangeListener(
-			IDialogFieldChangeListener changelistener) {
-		_defaultChangeListener = changelistener;
-	}
-
-	/**
-	 * Normally, the client should call this method in <code>initialize()</code>
-	 * for those field that wants to use the default event handler.
-	 * 
-	 * @return could be null
-	 */
-	public IDialogFieldChangeListener getDefaultChangeListener() {
-		return _defaultChangeListener;
-	}
-
-	/**
-	 * set default handler, should be called before <code>initialize()</code>
-	 * 
-	 * @param applylistener
-	 */
-	public void setDefaultApplyListener(IDialogFieldApplyListener applylistener) {
-		_defaultApplyListener = applylistener;
-	}
-
-	/**
-	 * Normally, the client should call this method in <code>initialize()</code>
-	 * for those field that wants to use the default event handler.
-	 * 
-	 * @return could be null
-	 */
-	public IDialogFieldApplyListener getDefaultApplyListener() {
-		return _defaultApplyListener;
-	}
-
-	/**
-	 * it is supposed to create all dialog fields and setup event listeners in
-	 * this method.
-	 * 
-	 * Normally client will create DialogFieldSection first, then
-	 * setDefaultChangeListener()/setDefaultApplyListener(), then call
-	 * initialize().
-	 */
-	public abstract void initialize();
-
-	/**
-	 * reload data from underlying model and set them into the dialog fields.
-	 * 
-	 */
-	public abstract void refreshData();
-
-	/**
-	 * layout the dialog fields.
-	 * 
-	 * @param toolkit
-	 *            could be null
-	 * @param parent
-	 * 
-	 */
-	public abstract void layoutDialogFields(FormToolkit toolkit,
-			Composite parent);
-
-	/**
-	 * validate whether the values in the dialog fields are valid. This method
-	 * should also enable/disable dialog fields based on their current value and
-	 * relationship
-	 * 
-	 * @return could return null. or an array containing null elements.
-	 */
-	public abstract IStatus[] validateDialogFields();
-	
-	/**
-	 * Intended to allow subclasses to recreate controls.  Default implementation does nothing.
-	 */
-	public void reset(){
-		//do nothing by default	
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroupPage.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroupPage.java
deleted file mode 100644
index 2e10f45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldGroupPage.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @author mengbo
- */
-public class DialogFieldGroupPage extends WizardPage {
-	private DialogFieldGroup _group;
-
-	private IDialogFieldChangeListener _defaultChangeListener = new IDialogFieldChangeListener() {
-		public void dialogFieldChanged(DialogField field) {
-			validate();
-		}
-	};
-
-	/**
-	 * @param pageName
-	 * @param section
-	 */
-	public DialogFieldGroupPage(String pageName, DialogFieldGroup section) {
-		super(pageName);
-		_group = section;
-		initializeGroup(_group);
-	}
-
-	/**
-	 * child class could override this method.
-	 * 
-	 * @param group
-	 */
-	protected void initializeGroup(DialogFieldGroup group) {
-		group.setDefaultChangeListener(_defaultChangeListener);
-		group.initialize();
-	}
-
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		_group.layoutDialogFields(null, container);
-		_group.refreshData();
-		validate();
-		this.setControl(container);
-	}
-
-	/**
-	 * @return the dialog field group
-	 */
-	public DialogFieldGroup getDialogFieldGroup() {
-		return _group;
-	}
-
-	/**
-	 * validate all the dialog fields.  Updates
-	 * status line and sets page completion if there are no errors
-	 */
-	private void validate() {
-		IStatus[] statuses = _group.validateDialogFields();
-		IStatus status = StatusUtil.getMostSevere(statuses);
-		StatusUtil.applyToStatusLine(this, status);
-		setPageComplete(status == null || status.getSeverity() != IStatus.ERROR);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.java
deleted file mode 100644
index 30828e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-
-/**
- * Resource bundle class for datastore wizard and it's pages
- * 
- * @author mengbo
- */
-/*package*/ class DialogFieldResources extends ResourceUtils {
-	/** Create the logger for this class */
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(DialogFieldResources.class);
-
-	private static DialogFieldResources _resource; // singleton
-
-	private static final String BUNDLE = DialogFieldResources.class.getName();
-
-	/**
-	 * Empty Constructor.
-	 * 
-	 * @return WizardsResources
-	 */
-
-	public static DialogFieldResources getInstance() {
-		if (_resource == null) {
-			_resource = new DialogFieldResources();
-		}
-		return _resource;
-	}
-
-	/**
-	 * The constructor create a resource bundle
-	 */
-	protected DialogFieldResources() {
-		try {
-			_resources = ResourceBundle.getBundle(BUNDLE);
-			// NOTE: this throws a runtime "MissingResourceException".
-		} catch (MissingResourceException ee) {
-			// Wizards.WizardResource.Error.ResourceNotFound = Unable to locate
-			// resource.
-			_log.error("Wizards.WizardResource.Error.ResourceNotFound", ee); //$NON-NLS-1$
-		}
-		setBundle(_resources, BUNDLE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.properties
deleted file mode 100644
index ad34404..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/DialogFieldResources.properties
+++ /dev/null
@@ -1,48 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-##################################################################
-# Resource message for SourceFolderButtonDialogField.
-##################################################################
-SourceFolderButtonDialogField.container.label = Source Folder:
-SourceFolderButtonDialogField.container.button = Browse...
-
-SourceFolderButtonDialogField.ChooseSourceContainerDialog.Title = Folder Selection
-SourceFolderButtonDialogField.ChooseSourceContainerDialog.Description = Choose a folder:
-
-SourceFolderButtonDialogField.error.EnterContainerName = Folder name is empty.
-SourceFolderButtonDialogField.error.NotSameProject = The project should be \''{0}\''.
-SourceFolderButtonDialogField.error.ContainerIsBinary=''{0}'' is a JAR archive.
-SourceFolderButtonDialogField.error.ContainerDoesNotExist=Folder ''{0}'' does not exist.
-SourceFolderButtonDialogField.error.NotAFolder=''{0}'' must be a project or folder.
-SourceFolderButtonDialogField.error.ProjectClosed=Project ''{0}'' must be accessible.
-SourceFolderButtonDialogField.warning.NotAJavaProject=Folder ''{0}'' is not a Java project.
-SourceFolderButtonDialogField.warning.NotInAJavaProject=Folder ''{0}'' is not in a Java project.
-SourceFolderButtonDialogField.warning.NotOnClassPath=Folder ''{0}'' is not on the Java build class path.
-
-
-##################################################################
-# Resource message for PackageButtonDialogField.
-##################################################################
-PackageButtonDialogField.package.label=Pac&kage:
-PackageButtonDialogField.package.button=Bro&wse...
-
-PackageButtonDialogField.error.InvalidPackageName=Package name  ''{0}'' is not valid.
-PackageButtonDialogField.error.ClashOutputLocation=Package clashes with project output folder.
-PackageButtonDialogField.warning.DiscouragedPackageName=This package name ''{0}'' is discouraged. 
-PackageButtonDialogField.warning.DefaultPackageDiscouraged=The use of the default package is discouraged.
-
-PackageButtonDialogField.ChoosePackageDialog.title=Package Selection
-PackageButtonDialogField.ChoosePackageDialog.description=&Choose a folder:
-PackageButtonDialogField.ChoosePackageDialog.empty=Cannot find packages to select.
-
-ClassButtonDialogField.Alert.Title=Error Open Type
-ClassButtonDialogField.Alert.Msg=The project does not have Java Nature.
-DialogFieldBase.Label.RequiredSymbol=*
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldApplyListener.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldApplyListener.java
deleted file mode 100644
index e8be7b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldApplyListener.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-
-/**
- * @author mengbo
- */
-public interface IDialogFieldApplyListener {
-	/**
-	 * when the DialogField believe it should apply its value in UI, will fire
-	 * this event.
-	 * 
-	 * Normally, for text input, when user is typing, will only fire
-	 * dialogFieldChanged(), when lose focus will fire dialogFieldApplied().
-	 * 
-	 * For other control, such as readonly combo box, whenever user change
-	 * selection, will fire both dialogFieldChanged() and dialogFieldApplied()
-	 * 
-	 * @param field
-	 */
-	void dialogFieldApplied(DialogField field);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldChangeListener.java
deleted file mode 100644
index b5ead67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IDialogFieldChangeListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-
-/**
- * Change listener used by <code>DialogField</code>
- * 
- * @author mengbo
- */
-public interface IDialogFieldChangeListener {
-
-	/**
-	 * The dialog field has changed.
-	 * @param field
-	 */
-	void dialogFieldChanged(DialogField field);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IStringButtonAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IStringButtonAdapter.java
deleted file mode 100644
index 466e355..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/IStringButtonAdapter.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-
-/**
- * Change listener used by <code>StringButtonDialogField</code>
- */
-public interface IStringButtonAdapter {
-
-	/**
-	 * @param field
-	 */
-	void changeControlPressed(DialogField field);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ISupportTextValue.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ISupportTextValue.java
deleted file mode 100644
index 014752d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ISupportTextValue.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-/**
- * DialogField can choose to also implement this interface. The purpose of this
- * interface is to make DialogFields to be more easily used to edit element
- * attributes, since attributes are all of string type.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ISupportTextValue {
-	/**
-	 * @param value
-	 */
-	public void setTextWithoutUpdate(String value);
-
-	/**
-	 * @return the text
-	 */
-	public String getText();
-
-	/**
-	 * @param value
-	 */
-	public void setText(String value);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizard.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizard.java
deleted file mode 100644
index 7458740..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizard.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-
-/**
- * @author mengbo
- */
-/*package*/ class JavaClassWizard extends Wizard {
-	private static String STORE_SECTION = "JavaClassWizard"; //$NON-NLS-1$
-
-	private JavaClassWizardPage _mainPage;
-
-	private String _className, _classArgs;
-
-	private IProject _project;
-
-	private String _superClass;
-
-	private List _interfaceList;
-
-	private boolean _autoOpenResource = true;
-
-	/**
-	 * @param autoOpenResource
-	 */
-	public void setAutoOpenResource(boolean autoOpenResource) {
-		_autoOpenResource = autoOpenResource;
-	}
-
-	/**
-	 * @param project
-	 * @param className
-	 */
-	public JavaClassWizard(IProject project, String className) {
-		this(project, className, null, null);
-	}
-
-	/**
-	 * @param project
-	 * @param className
-	 * @param superClass
-	 * @param superInterfaces
-	 */
-	public JavaClassWizard(IProject project, String className,
-			String superClass, List superInterfaces) {
-		this._project = project;
-		this._className = className;
-		this._superClass = superClass;
-		this._interfaceList = superInterfaces;
-		IDialogSettings masterSettings = JSFUICommonPlugin.getDefault()
-				.getDialogSettings();
-		setDialogSettings(getSettingsSection(masterSettings));
-		setWindowTitle(JSFUICommonPlugin
-				.getResourceString("DialogField.JavaClassWizard.NewClass"));//$NON-NLS-1$
-		setNeedsProgressMonitor(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#addPages()
-	 */
-	public void addPages() {
-		_mainPage = new JavaClassWizardPage(_project, _className, _superClass,
-				_interfaceList);
-		addPage(_mainPage);
-		_mainPage.init();
-	}
-
-	private IDialogSettings getSettingsSection(IDialogSettings master) {
-		IDialogSettings setting = master.getSection(STORE_SECTION);
-		if (setting == null) {
-			setting = master.addNewSection(STORE_SECTION);
-		}
-		return setting;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		if (_mainPage.getPackageText() != null
-				&& _mainPage.getPackageText().length() > 0) {
-			StringBuffer buffer = new StringBuffer(_mainPage.getPackageText());
-			buffer.append(".");//$NON-NLS-1$
-			buffer.append(_mainPage.getTypeName());
-			_className = buffer.toString();
-		} else {
-			_className = _mainPage.getTypeName();
-		}
-		_classArgs = _mainPage.getClassArgs();
-		IRunnableWithProgress op = new WorkspaceModifyOperation() {
-			protected void execute(IProgressMonitor monitor)
-					throws CoreException, InvocationTargetException,
-					InterruptedException {
-				_mainPage.createType(monitor);
-				IResource resource = _mainPage.getModifiedResource();
-				if (resource != null && _autoOpenResource) {
-					selectAndReveal(resource);
-					if (_project.hasNature(JavaCore.NATURE_ID)) {
-						IJavaProject jProject = JavaCore.create(_project);
-						IJavaElement jElement = jProject.findElement(resource
-								.getProjectRelativePath()
-								.removeFirstSegments(1));
-						if (jElement != null) {
-							JavaUI.openInEditor(jElement);
-						}
-					} else if (resource instanceof IFile) {
-						IWorkbenchPage page = PlatformUI.getWorkbench()
-								.getActiveWorkbenchWindow().getActivePage();
-						IDE.openEditor(page, (IFile) resource, true);
-					}
-				}
-			}
-
-		};
-		try {
-			getContainer().run(false, true, op);
-		} catch (InvocationTargetException e) {
-			e.printStackTrace(); // PDEPlugin.logException(e);
-		} catch (InterruptedException e) {
-			e.printStackTrace();// PDEPlugin.logException(e);
-		}
-		return true;
-	}
-
-	private void selectAndReveal(IResource newResource) {
-		BasicNewResourceWizard.selectAndReveal(newResource,
-				getWorkbenchWindow());
-	}
-
-	private IWorkbenchWindow getWorkbenchWindow() {
-		return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	private String getClassName() {
-		return _className;
-	}
-
-	/**
-	 * @return the class name including args
-	 */
-	public String getClassNameWithArgs() {
-		if (_classArgs != null && _classArgs.length() > 0) {
-			StringBuffer buffer = new StringBuffer(_className);
-			buffer.append(":");//$NON-NLS-1$
-			buffer.append(_classArgs);
-			return buffer.toString();
-		}
-		return getClassName();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizardPage.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizardPage.java
deleted file mode 100644
index b445c60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaClassWizardPage.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.ui.wizards.NewClassWizardPage;
-
-/**
- * @author mengbo
- */
-/*package*/ class JavaClassWizardPage extends NewClassWizardPage {
-	private String _className;
-
-	private final IProject _project;
-
-	private final InitialClassProperties _initialValues;
-
-	private IJavaProject _javaProject;
-
-	private IStatus _fClassNameStatus, _fPackageNameStatus;
-
-	private final static String  SOURCE_COMPLIANCE_1_3 = JavaCore.VERSION_1_3;
-	
-	static class InitialClassProperties {
-		// populate new wizard page
-		private String superClassName;
-
-		private List interfacesName;
-
-		private String className;
-
-		private String classArgs;
-
-		private String packageName;
-
-		private IPackageFragmentRoot packageFragmentRoot;
-
-		private IPackageFragment packageFragment;
-
-		InitialClassProperties() {
-			this.superClassName = ""; //$NON-NLS-1$
-			this.interfacesName = null;
-			this.className = null;
-			this.classArgs = null;
-			this.packageName = null;
-			this.packageFragment = null;
-			this.packageFragmentRoot = null;
-		}
-	}
-
-	/**
-	 * @param project
-	 * @param className
-	 * @param superClassName
-	 * @param interfacesName
-	 */
-	public JavaClassWizardPage(IProject project, String className,
-			String superClassName, List interfacesName) {
-		super();
-		this._className = className;
-		this._project = project;
-		try {
-			if (project != null && project.hasNature(JavaCore.NATURE_ID)) {
-				this._javaProject = JavaCore.create(project);
-			} else {
-				this._javaProject = null;
-			}
-		} catch (CoreException e) {
-			e.printStackTrace();// PDEPlugin.logException(e);
-		}
-		_initialValues = new InitialClassProperties();
-		_initialValues.className = className;
-		_initialValues.superClassName = superClassName;
-		_initialValues.interfacesName = interfacesName;
-	}
-
-	/**
-	 * @param project
-	 * @param className
-	 */
-	public JavaClassWizardPage(IProject project, String className) {
-		this(project, className, null, null);
-	}
-
-	/**
-	 * Call when page is added to wizard to initialize
-	 */
-	public void init() {
-		initializeExpectedValues();
-		initializeWizardPage();
-	}
-
-	private void initializeExpectedValues() {
-		// source folder name, package name, class name
-		int loc = _className.indexOf(":"); //$NON-NLS-1$
-		if (loc != -1) {
-			if (loc < _className.length()) {
-				_initialValues.classArgs = _className.substring(loc + 1,
-						_className.length());
-				_className = _className.substring(0, loc);
-			}
-			if (loc > 0) {
-				_initialValues.className = _className.substring(0, loc);
-			} else if (loc == 0) {
-				_initialValues.className = ""; //$NON-NLS-1$
-			}
-		}
-		_fClassNameStatus = JavaConventions
-		    .validateJavaTypeName(_initialValues.className, SOURCE_COMPLIANCE_1_3,SOURCE_COMPLIANCE_1_3);
-
-		loc = _className.lastIndexOf('.');
-		if (loc != -1) {
-			_initialValues.packageName = _className.substring(0, loc);
-			_initialValues.className = _className.substring(loc + 1);
-			_fPackageNameStatus = JavaConventions
-                    .validateJavaTypeName(_initialValues.packageName, SOURCE_COMPLIANCE_1_3,SOURCE_COMPLIANCE_1_3);
-			_fClassNameStatus = JavaConventions
-                    .validateJavaTypeName(_initialValues.className, SOURCE_COMPLIANCE_1_3,SOURCE_COMPLIANCE_1_3);
-		}
-		if (_javaProject == null) {
-			return;
-		}
-		try {
-			if (_initialValues.packageFragmentRoot == null) {
-				IPackageFragmentRoot srcEntryDft = null;
-				IPackageFragmentRoot[] roots = _javaProject
-						.getPackageFragmentRoots();
-				for (int i = 0; i < roots.length; i++) {
-					if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE) {
-						srcEntryDft = roots[i];
-						break;
-					}
-				}
-				if (srcEntryDft != null) {
-					_initialValues.packageFragmentRoot = srcEntryDft;
-				} else {
-					_initialValues.packageFragmentRoot = _javaProject
-							.getPackageFragmentRoot(_javaProject.getResource());
-				}
-				if (_initialValues.packageFragment == null
-						&& _initialValues.packageFragmentRoot != null
-						&& _initialValues.packageName != null
-						&& _initialValues.packageName.length() > 0) {
-					IFolder packageFolder = _project
-							.getFolder(_initialValues.packageName);
-					_initialValues.packageFragment = _initialValues.packageFragmentRoot
-							.getPackageFragment(packageFolder
-									.getProjectRelativePath().toOSString());
-				}
-			}
-			// superclass and interface
-			if (_initialValues.superClassName == null) {
-				_initialValues.superClassName = "java.lang.Object"; //$NON-NLS-1$
-			}
-//			_initialValues.superClassType = findTypeForName(_initialValues.superClassName);
-		} catch (JavaModelException e) {
-			e.printStackTrace();// PDEPlugin.logException(e);
-		}
-	}
-
-	/**
-	 * initialize the wizard page
-	 */
-	protected void initializeWizardPage() {
-		setPackageFragmentRoot(_initialValues.packageFragmentRoot, true);
-		setPackageFragment(_initialValues.packageFragment, true);
-		setEnclosingType(null, true);
-		setEnclosingTypeSelection(false, true);
-		setTypeName(_initialValues.className, true);
-		setSuperClass(_initialValues.superClassName, true);
-		if (_initialValues.interfacesName != null) {
-			setSuperInterfaces(_initialValues.interfacesName, true);
-		}
-		boolean hasSuperClass = _initialValues.superClassName != null
-				&& _initialValues.superClassName.length() > 0;
-		boolean hasInterface = _initialValues.interfacesName != null
-				&& _initialValues.interfacesName.size() > 0;
-		setMethodStubSelection(false, hasSuperClass, hasInterface
-				|| hasSuperClass, true);
-	}
-
-//	private IType findTypeForName(String typeName) throws JavaModelException {
-//		if (typeName == null || typeName.length() == 0) {
-//			return null;
-//		}
-//		IType type = null;
-//		String fileName = typeName.replace('.', '/') + ".java"; //$NON-NLS-1$
-//		IJavaElement element = _javaProject.findElement(new Path(fileName));
-//		if (element == null) {
-//			return null;
-//		}
-//		if (element instanceof IClassFile) {
-//			type = ((IClassFile) element).getType();
-//		} else if (element instanceof ICompilationUnit) {
-//			IType[] types = ((ICompilationUnit) element).getTypes();
-//			type = types[0];
-//		}
-//		return type;
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.ui.wizards.NewClassWizardPage#setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		// policy: wizards are not allowed to come up with an error message;
-		// in this wizard, some fields may need initial validation and thus,
-		// potentially start with an error message.
-		if (_fClassNameStatus != null && !_fClassNameStatus.isOK()) {
-			updateStatus(_fClassNameStatus);
-		}
-		if (_fPackageNameStatus != null && !_fPackageNameStatus.isOK()) {
-			updateStatus(_fPackageNameStatus);
-		}
-	}
-
-	/**
-	 * @return the class arguments or "" if not set
-	 */
-	public String getClassArgs() {
-		if (_initialValues.classArgs == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return _initialValues.classArgs;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScope.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScope.java
deleted file mode 100644
index 8ac5807..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScope.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-
-/**
- * @author mengbo
- */
-/*package*/ class JavaSearchScope implements IJavaSearchScope {
-	private final IProject _project;
-
-	private final String _superType;
-
-	private HashSet _allowedTypeSet;
-
-	private IPath[] _enclosingProjectsAndJars;
-
-	private IProject[] _relativeProjects;
-
-	/**
-	 * @param project
-	 * @param superType
-	 */
-	public JavaSearchScope(IProject project, String superType) {
-		this._project = project;
-		this._superType = superType;
-		computeRelativeProjects();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#enclosingProjectsAndJars()
-	 */
-	public IPath[] enclosingProjectsAndJars() {
-		if (_enclosingProjectsAndJars == null) {
-			ArrayList list = new ArrayList();
-			for (int i = 0; i < _relativeProjects.length; i++) {
-				try {
-					if (_relativeProjects[i].hasNature(JavaCore.NATURE_ID)) {
-						IJavaProject javaProject = JavaCore
-								.create(_relativeProjects[i]);
-						IClasspathEntry[] classpath = javaProject
-								.getResolvedClasspath(true);
-						for (int j = 0; j < classpath.length; j++) {
-							list.add(classpath[j].getPath());
-						}
-						list.add(javaProject.getPath());
-					}
-				} catch (CoreException e)// NOPMD
-				{
-					// skip the project.
-				}
-			}
-			_enclosingProjectsAndJars = (IPath[]) list.toArray(new IPath[(list
-					.size())]);
-		}
-		return _enclosingProjectsAndJars;
-	}
-
-	private void computeRelativeProjects() {
-		try {
-			IProject[] referencedProjects = _project.getReferencedProjects();
-			_relativeProjects = new IProject[referencedProjects.length + 1];
-			System.arraycopy(referencedProjects, 0, _relativeProjects, 1,
-					referencedProjects.length);
-			_relativeProjects[0] = _project;
-		} catch (CoreException e) {
-			_relativeProjects = new IProject[] { _project };
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(java.lang.String)
-	 */
-	public boolean encloses(String resourcePath) {
-		if (_allowedTypeSet == null) {
-			try {
-				_allowedTypeSet = findAllowedTypes(_superType);
-			} catch (CoreException e) {
-				e.printStackTrace();
-			}
-		}
-		if (_allowedTypeSet == null) {
-			_allowedTypeSet = new HashSet();
-		}
-		int separatorIndex = resourcePath.indexOf(JAR_FILE_ENTRY_SEPARATOR);
-		if (separatorIndex != -1) {
-			String className = resourcePath.substring(separatorIndex + 1,
-					resourcePath.length() - 6).replace('/', '.');
-			if (_allowedTypeSet.contains(className)) {
-				return true;
-			}
-		} else if (_allowedTypeSet.contains(resourcePath)) {
-			return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(org.eclipse.jdt.core.IJavaElement)
-	 */
-	public boolean encloses(IJavaElement element) {
-		return encloses(element.getPath().toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#includesBinaries()
-	 */
-	public boolean includesBinaries() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#includesClasspaths()
-	 */
-	public boolean includesClasspaths() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesBinaries(boolean)
-	 */
-	public void setIncludesBinaries(boolean includesBinaries) {
-	    //    do nothing, includeBinaries always true
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesClasspaths(boolean)
-	 */
-	public void setIncludesClasspaths(boolean includesClasspaths) {
-        // do nothing, includeClasspaths always trues
-	}
-
-	private HashSet findAllowedTypes(String superType) throws CoreException {
-		HashSet set = new HashSet();
-
-		IProject[] projects = _relativeProjects;
-
-		for (int i = 0; i < projects.length; i++) {
-			IType type = null;
-			if (projects[i].hasNature(JavaCore.NATURE_ID)) {
-				IJavaProject javaProject = JavaCore.create(projects[i]);
-				if (superType != null) {
-					try {
-						type = javaProject.findType(superType);
-						if (type != null) {
-							ITypeHierarchy typeHierarchy = type
-									.newTypeHierarchy(javaProject, null);
-							IType[] subtypes = typeHierarchy
-									.getAllSubtypes(type);
-							for (int j = 0; j < subtypes.length; j++) {
-								if (!subtypes[j].isBinary()) {
-									set.add(subtypes[j].getPath().toString());
-								} else {
-									String path = subtypes[j].getPath()
-											.toString();
-									if (path != null
-											&& path
-													.endsWith(IFileFolderConstants.DOT
-															+ IFileFolderConstants.EXT_JAR)) {
-										set.add(subtypes[j]
-												.getFullyQualifiedName());
-									} else {
-										set.add(path);
-									}
-								}
-							}
-						}
-					} catch (JavaModelException e) {
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		return set;
-	}
-
-	/**
-	 * @return Returns the superType.
-	 */
-	public String getSuperType() {
-		return _superType;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScopeDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScopeDecorator.java
deleted file mode 100644
index 94cd55c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaSearchScopeDecorator.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class JavaSearchScopeDecorator implements IJavaSearchScope {
-	JavaSearchScope[] _scopes = new JavaSearchScope[0];
-
-	/**
-	 * @param project
-	 * @param superTypes
-	 */
-	public JavaSearchScopeDecorator(IProject project, List superTypes) {
-		List scopeList = new ArrayList();
-		if (superTypes != null) {
-			for (int i = 0; i < superTypes.size(); i++) {
-				scopeList.add(new JavaSearchScope(project, superTypes.get(i)
-						.toString()));
-			}
-		}
-		_scopes = (JavaSearchScope[]) scopeList
-				.toArray(new JavaSearchScope[scopeList.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(java.lang.String)
-	 */
-	public boolean encloses(String resourcePath) {
-		for (int i = 0; i < _scopes.length; i++) {
-			if (_scopes[i].encloses(resourcePath) == true) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#encloses(org.eclipse.jdt.core.IJavaElement)
-	 */
-	public boolean encloses(IJavaElement element) {
-		for (int i = 0; i < _scopes.length; i++) {
-			if (_scopes[i].encloses(element) == true) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#enclosingProjectsAndJars()
-	 */
-	public IPath[] enclosingProjectsAndJars() {
-		Set set = new HashSet();
-		for (int i = 0; i < _scopes.length; i++) {
-			set.addAll(Arrays.asList(_scopes[i].enclosingProjectsAndJars()));
-		}
-		return (IPath[]) set.toArray(new IPath[set.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#includesBinaries()
-	 */
-	public boolean includesBinaries() {
-		for (int i = 0; i < _scopes.length; i++) {
-			if (_scopes[i].includesBinaries() == true) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#includesClasspaths()
-	 */
-	public boolean includesClasspaths() {
-		for (int i = 0; i < _scopes.length; i++) {
-			if (_scopes[i].includesClasspaths() == true) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesBinaries(boolean)
-	 */
-	public void setIncludesBinaries(boolean includesBinaries) {
-		for (int i = 0; i < _scopes.length; i++) {
-			_scopes[i].setIncludesBinaries(includesBinaries);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jdt.core.search.IJavaSearchScope#setIncludesClasspaths(boolean)
-	 */
-	public void setIncludesClasspaths(boolean includesClasspaths) {
-		for (int i = 0; i < _scopes.length; i++) {
-			_scopes[i].setIncludesClasspaths(includesClasspaths);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaUIHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaUIHelper.java
deleted file mode 100644
index 8bee860..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/JavaUIHelper.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.ide.IDE;
-
-/**
- * @author mengbo
- */
-public final class JavaUIHelper {
-	/**
-	 * @param project
-	 * @param className
-	 */
-	static void doOpenClass(IProject project, String className) {
-		String path = className.replace('.', '/') + ".java"; //$NON-NLS-1$
-		try {
-			if (project.hasNature(JavaCore.NATURE_ID)) {
-				IJavaProject javaProject = JavaCore.create(project);
-				IJavaElement result = javaProject.findElement(new Path(path));
-				JavaUI.openInEditor(result);
-			} else {
-				IResource resource = project.findMember(new Path(path));
-				if (resource instanceof IFile) {
-					IWorkbenchPage page = PlatformUI.getWorkbench()
-							.getActiveWorkbenchWindow().getActivePage();
-					IDE.openEditor(page, (IFile) resource, true);
-				}
-			}
-		} catch (PartInitException e) {
-			e.printStackTrace();// PDEPlugin.logException(e);
-		} catch (JavaModelException e) {
-			e.printStackTrace();// Display.getCurrent().beep();
-		} catch (CoreException e) {
-			e.printStackTrace();// PDEPlugin.logException(e);
-		}
-	}
-
-	/**
-	 * @param project
-	 * @param className
-	 * @return true if the class exists in project
-	 */
-	static boolean doesClassExist(IProject project, String className) {
-		String path = className.replace('.', '/') + ".java"; //$NON-NLS-1$
-		try {
-			if (project.hasNature(JavaCore.NATURE_ID)) {
-				IJavaProject javaProject = JavaCore.create(project);
-
-				IJavaElement result = javaProject.findElement(new Path(path));
-				return result != null;
-			}
-            IResource resource = project.findMember(new Path(path));
-            return resource != null;
-		} catch (JavaModelException e) {
-			return false;
-		} catch (CoreException e) {
-			return false;
-		}
-	}
-
-	/**
-	 * @param shell
-	 * @param searchScope
-	 * @param typeFlag
-	 * @return the selection dialog
-	 */
-	static SelectionDialog openSelectionDialog(Shell shell,
-			IJavaSearchScope searchScope, int typeFlag) {
-		try {
-			return JavaUI.createTypeDialog(shell, new ProgressMonitorDialog(
-					shell), searchScope, typeFlag, false);
-		} catch (JavaModelException e) {
-            JSFUICommonPlugin.getLogger(JavaUIHelper.class).error(e);
-			return null;
-		}
-	}
-
-	/**
-	 * @param shell
-	 * @param project
-	 * @param superType
-	 * @param typeFlag
-	 * @return the selection  dialog
-	 */
-	public static SelectionDialog openSelectionDialog(Shell shell,
-			IProject project, String superType, int typeFlag) {
-		IJavaSearchScope searchScope = findSearchScope(project, superType);
-		return openSelectionDialog(shell, searchScope, typeFlag);
-	}
-
-	/**
-	 * @param project
-	 * @param superType
-	 * @return the search scope
-	 */
-	static IJavaSearchScope findSearchScope(IProject project,
-			String superType) {
-		if (project != null) {
-			if (superType == null || "".equals(superType)) { //$NON-NLS-1$
-				superType = "java.lang.Object";//$NON-NLS-1$
-			}
-			return new JavaSearchScope(project, superType);
-		}
-		return SearchEngine.createWorkspaceScope();
-	}
-	
-	private JavaUIHelper()
-	{
-		// static helper, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/LayoutUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/LayoutUtil.java
deleted file mode 100644
index 2457cd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/LayoutUtil.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A layout utility class
- *
- */
-public final class LayoutUtil {
-	// The Text control looks higher then Button control when they have the same
-	// height,
-	// Increasing the height of 5 pixels will make them looks the same height.
-	private final static int BUTTON_HEIGHT_ADJUSTMENT = 5;
-
-
-	/**
-	 * @param control
-	 * @param grab
-	 */
-	public static void setGrabHorizontal(Control control, boolean grab) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).grabExcessHorizontalSpace = grab;
-		}
-	}
-
-	/**
-	 * Sets the width hint of a control. Assumes that GridData is used.
-	 * @param control 
-	 * @param widthHint 
-	 */
-	public static void setWidthHint(Control control, int widthHint) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).widthHint = widthHint;
-		}
-	}
-
-
-	/**
-	 * Sets the horizontal indent of a control. Assumes that GridData is used.
-	 * @param control 
-	 * @param horizontalIndent 
-	 */
-	static void setHorizontalIndent(Control control, int horizontalIndent) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).horizontalIndent = horizontalIndent;
-		}
-	}
-
-	/**
-	 * Sets the horizontal indent of a control. Assumes that GridData is used.
-	 * @param control 
-	 */
-	public static void setHorizontalGrabbing(Control control) {
-		Object ld = control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData) ld).grabExcessHorizontalSpace = true;
-		}
-	}
-
-	/**
-	 * Returns a width hint for a button control.
-	 * @param button 
-	 * @return the hint value
-	 */
-	static int getButtonWidthHint(Button button) {
-		if (button.getFont().equals(JFaceResources.getDefaultFont()))
-			button.setFont(JFaceResources.getDialogFont());
-
-		GC gc = new GC(button);
-		gc.setFont(button.getFont());
-		FontMetrics fontMetrics = gc.getFontMetrics();
-		gc.dispose();
-
-		int length = button.getText().length();
-		int widthHint = Dialog.convertWidthInCharsToPixels(fontMetrics,
-				length < 2 ? 2 : length);
-		return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-				true).x);
-	}
-
-	static int getButtonHeightHint(FormToolkit toolkit, Text text) {
-		if (toolkit != null) {
-			return text.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).y
-					+ BUTTON_HEIGHT_ADJUSTMENT;
-		}
-        return text.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).y;
-	}
-	
-	private LayoutUtil()
-	{
-		// static utility class; no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/RadiosDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/RadiosDialogField.java
deleted file mode 100644
index 7db537b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/RadiosDialogField.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * This will display a labal and a group of radio buttons. The group of radio
- * buttons will be layed out horizontally use a RowLayout, and them as a group
- * will use one cell in the GridLayout.
- * 
- * Whenever the radios selection change will fire both dialogFieldChanged() and
- * dialogFieldApplied() event.
- * 
- * @author mengbo
- */
-public class RadiosDialogField extends DialogFieldBase {
-	final static private String INDEXKEY = "INDEX"; //$NON-NLS-1$
-
-	private Composite _group;
-
-	private String[] _items;
-
-	private Button[] _button;
-
-	private int _selectIndex = -1;
-
-	private boolean _fireEvent = true;
-
-	/**
-	 * Default constructor
-	 */
-	public RadiosDialogField() {
-		super();
-	}
-
-	/**
-	 * this method must be called before create control
-	 * 
-	 * @param items
-	 */
-	public void setItems(String[] items) {
-		_items = items;
-		_button = new Button[_items.length];
-	}
-
-	// ------- layout helpers
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		_group = getGroup(toolkit, parent);
-		_group.setLayoutData(gridDataForGroup(nColumns - 2));
-
-		return new Control[] { requiredLabel, label, _group };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 3;
-	}
-
-	/**
-	 * @param span
-	 * @return the grid data
-	 */
-	protected static GridData gridDataForGroup(int span) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		return gd;
-	}
-
-	// ------- focus methods
-
-	/*
-	 * @see DialogField#setFocus
-	 */
-	public boolean setFocus() {
-		if (isOkToUse(_group)) {
-			_group.setFocus();
-		}
-		return true;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 * @return the group composite
-	 */
-	public Composite getGroup(FormToolkit toolkit, Composite parent) {
-		if (_group == null || _group.isDisposed()) {
-			assertCompositeNotNull(parent);
-			if (toolkit != null) {
-				_group = toolkit.createComposite(parent);
-			} else {
-				_group = new Composite(parent, SWT.NONE);
-			}
-			RowLayout layout = new RowLayout();
-			layout.marginBottom = 0;
-			_group.setLayout(layout);
-			for (int i = 0; i < _items.length; i++) {
-				if (toolkit != null) {
-					_button[i] = toolkit.createButton(_group, _items[i],
-							SWT.RADIO);
-				} else {
-					_button[i] = new Button(_group, SWT.RADIO);
-					_button[i].setText(_items[i]);
-				}
-				_button[i].setData(INDEXKEY, new Integer(i));
-				_button[i].addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_fireEvent) {
-							_selectIndex = ((Integer) e.widget
-									.getData(INDEXKEY)).intValue();
-							// FIXME: seemed will fire widgetSelected twice, one
-							// for the deselect one,
-							// one for the newly selected one. Need investigate.
-							if (((Button) e.widget).getSelection()) {
-								dialogFieldChangedAndApplied();
-							}
-						}
-					}
-
-				});
-			}
-		}
-		return _group;
-	}
-
-	// ------ enable / disable management
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_group)) {
-			_group.setEnabled(isEnabled());
-		}
-	}
-
-	// ------ text access
-
-	/**
-	 * Sets the text. Triggers a dialog-changed event.
-	 * @param index 
-	 */
-	public void setSelectedIndex(int index) {
-		_selectIndex = index;
-		if (isOkToUse(_group)) {
-			if (_selectIndex >= 0 && _selectIndex < _items.length) {
-				_button[_selectIndex].setSelection(true);
-			} else {
-				for (int i = 0; i < _items.length; i++) {
-					if (_button[i].getSelection()) {
-						_button[i].setSelection(false);
-					}
-				}
-			}
-		}
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Sets the text without triggering a dialog-changed event.
-	 * @param index 
-	 */
-	public void setSelectedIndexWithoutUpdate(int index) {
-		_selectIndex = index;
-		if (isOkToUse(_group)) {
-			_fireEvent = false;
-			if (_selectIndex >= 0 && _selectIndex < _items.length) {
-				_button[_selectIndex].setSelection(true);
-			} else {
-				for (int i = 0; i < _items.length; i++) {
-					if (_button[i].getSelection()) {
-						_button[i].setSelection(false);
-					}
-				}
-			}
-			_fireEvent = true;
-		}
-	}
-
-	/**
-	 * @return the index selected
-	 */
-	public int getSelectedIndex() {
-		return _selectIndex;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		LayoutUtil.setGrabHorizontal(this._group, true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ResourceButtonDialogField.java
deleted file mode 100644
index 8ab30f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/ResourceButtonDialogField.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This class provides a common resource choice DialogFiled. You must set a
- * no-null IProject instance to enable it working. You should give it a suffix
- * list if you want to choose files ended with specific file extensions. The
- * selection result will be a relative path based on the _referredFile's value
- * if it is set, or else based on the _project path.
- * 
- * The usage: Shell shell = new Shell(); IProject project = getProject();
- * ResourceButtonDialogField localeField = new
- * ResourceButtonDialogField(project);
- * localeField.setResourceDescription("image"); localeField.setSuffixs(new
- * String[]{"bmp","jpg","gif"});
- * localeField.setReferredFile(StructuredModelUtil.getFileFor(_element.getModel()));
- * 
- * @author mengbo
- */
-public class ResourceButtonDialogField extends StringButtonDialogField {
-	private IProject _project;
-
-	private String[] _suffixs;
-
-	private String _resourceDescription;
-
-	private IFile _referredFile;
-
-	private boolean _isWebPath = false;
-
-	private IFolder _folder;
-
-	private String _separator = ""; //$NON-NLS-1$
-
-	/**
-	 * @param project
-	 */
-	public ResourceButtonDialogField(IProject project) {
-		this(null, project);
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				String oldValue = getText();
-				String newValue = browseButtonPressed();
-				if (newValue != null && !newValue.equals(oldValue)) {
-					setText(newValue);
-				}
-			}
-		});
-	}
-
-	/**
-	 * @param adapter
-	 * @param project
-	 */
-	public ResourceButtonDialogField(IStringButtonAdapter adapter,
-			IProject project) {
-		super(adapter);
-		this._project = project;
-	}
-
-	/**
-	 * @return the string
-	 */
-	protected String browseButtonPressed() {
-		Shell shell = getShell();
-		CommonResourceDialog dialog = null;
-		int style = "".equals(_separator) ? SWT.NONE : SWT.MULTI | SWT.H_SCROLL //$NON-NLS-1$
-				| SWT.V_SCROLL;
-		if (_folder != null) {
-			dialog = new CommonResourceDialog(shell, _folder.getProject(), style);
-		} else {
-			dialog = new CommonResourceDialog(shell, _project, style);
-		}
-		dialog.setTitle(JSFUICommonPlugin
-				.getResourceString("DialogField.ResourceButton.SelectFile"));//$NON-NLS-1$
-		dialog.setSuffixs(_suffixs);
-		dialog.setResourceDescription(_resourceDescription);
-
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			StringBuffer buffer = new StringBuffer();
-			for (int i = 0; i < result.length; i++) {
-				String newValue = null;
-				IPath path = ((IFile) result[i]).getLocation();
-
-				IPath referredPath = null;
-				if (_referredFile != null) {
-					referredPath = _referredFile.getLocation();
-				} else {
-					referredPath = _project.getLocation();
-				}
-				if (this._isWebPath) {
-					IFile selectedFile = ((IFile) result[i]);
-					newValue = WebrootUtil.getWebPath(selectedFile
-							.getFullPath());
-				} else {
-					newValue = PathUtil.convertToRelativePath(path.toString(),
-							referredPath.toString());
-				}
-				buffer.append(newValue);
-				buffer.append(_separator);
-			}
-			if (buffer.length() > 0) {
-				return buffer.substring(0, buffer.length()
-						- _separator.length());
-			}
-
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * @param project
-	 *            The project to set.
-	 */
-	public void setProject(IProject project) {
-		this._project = project;
-	}
-
-	/**
-	 * @return Returns the relative folder.
-	 */
-	public IFolder getFolder() {
-		return _folder;
-	}
-
-	/**
-	 * @param folder
-	 *            The relative folder to set.
-	 */
-	public void setFolder(IFolder folder) {
-		this._folder = folder;
-	}
-
-	/**
-	 * @return Returns the referredFile.
-	 */
-	public IFile getReferredFile() {
-		return _referredFile;
-	}
-
-	/**
-	 * @param referredFile
-	 *            The referredFile to set.
-	 */
-	public void setReferredFile(IFile referredFile) {
-		this._referredFile = referredFile;
-	}
-
-	/**
-	 * @return Returns the resourceDescription.
-	 */
-	public String getResourceDescription() {
-		return _resourceDescription;
-	}
-
-	/**
-	 * @param resourceDescription
-	 *            The resourceDescription to set.
-	 */
-	public void setResourceDescription(String resourceDescription) {
-		this._resourceDescription = resourceDescription;
-	}
-
-	/**
-	 * @return Returns the suffixs.
-	 */
-	public String[] getSuffixs() {
-		return _suffixs;
-	}
-
-	/**
-	 * @param suffixs
-	 *            The suffixs to set.
-	 */
-	public void setSuffixs(String[] suffixs) {
-		this._suffixs = suffixs;
-	}
-
-	/**
-	 * set some special path to web path instead of relative path
-	 * 
-	 * @param isWebPath
-	 */
-	public void setWebPath(boolean isWebPath) {
-		this._isWebPath = isWebPath;
-	}
-
-	/**
-	 * @return the separator string
-	 */
-	public String getSeparator() {
-		return _separator;
-	}
-
-	/**
-	 * @param separator
-	 */
-	public void setSeparator(String separator) {
-		this._separator = separator;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/Separator.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/Separator.java
deleted file mode 100644
index f54722a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/Separator.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Dialog field describing a separator.
- */
-public class Separator extends DialogFieldBase {
-
-	private Label _separator;
-
-	private int _style;
-
-	/**
-	 * Default constructor
-	 */
-	public Separator() {
-		this(SWT.NONE);
-	}
-
-	/**
-	 * @param style
-	 *            of the separator. See <code>Label</code> for possible
-	 *            styles.
-	 */
-	public Separator(int style) {
-		_style = style;
-	}
-
-	// ------- layout helpers
-
-	/**
-	 * Creates the separator and fills it in a MGridLayout.
-	 * @param toolkit 
-	 * @param parent 
-	 * @param nColumns 
-	 * 
-	 * @param height
-	 *            The heigth of the separator
-	 * @return the controls or empty array
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns, int height) {
-		assertEnoughColumns(nColumns);
-
-		Control separator = getSeparator(toolkit, parent);
-		separator.setLayoutData(gridDataForSeperator(nColumns, height));
-
-		return new Control[] { separator };
-	}
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		return doFillIntoGrid(toolkit, parent, nColumns, 4);
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 1;
-	}
-
-	/**
-	 * @param span
-	 * @param height
-	 * @return the grid data
-	 */
-	protected static GridData gridDataForSeperator(int span, int height) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.verticalAlignment = GridData.BEGINNING;
-		gd.heightHint = height;
-		gd.horizontalSpan = span;
-		return gd;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created separator.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 * @return  the separator
-	 */
-	private Control getSeparator(FormToolkit toolkit, Composite parent) {
-		if (_separator == null || _separator.isDisposed()) {
-			assertCompositeNotNull(parent);
-			if (toolkit != null) {
-				_separator = toolkit.createSeparator(parent, _style);
-			} else {
-				_separator = new Label(parent, _style);
-			}
-		}
-		return _separator;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		// do nothing.
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/SourceFolderButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/SourceFolderButtonDialogField.java
deleted file mode 100644
index 420a950..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/SourceFolderButtonDialogField.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.ui.JavaElementComparator;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-
-/**
- * This class provides a source folder selection DialogFiled. There are two
- * conditions: 1. If you set the IProject instance, the source folder selection
- * will only be limited in the specified project 2. If you set null, the source
- * folder selection is allowed in all workspaces
- * 
- * 
- * @author mengbo
- * @version 1.5
- */
-public class SourceFolderButtonDialogField extends StringButtonDialogField {
-	/** Create the logger for this class */
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(SourceFolderButtonDialogField.class);
-
-	/**
-	 * package fragment root corresponding to the input type (can be null)
-	 */
-	private IPackageFragmentRoot _fCurrRoot;
-
-	private IProject _project;
-
-	/**
-	 * @param project 
-	 */
-	public SourceFolderButtonDialogField(IProject project) {
-		super(null);
-
-		_project = project;
-
-		setLabelText(DialogFieldResources.getInstance().getString(
-				"SourceFolderButtonDialogField.container.label")); //$NON-NLS-1$
-
-		setButtonLabel(DialogFieldResources.getInstance().getString(
-				"SourceFolderButtonDialogField.container.button")); //$NON-NLS-1$
-
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				containerChangeControlPressed(field);
-			}
-
-		});
-	}
-
-	/**
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * @param project
-	 *            The project to set.
-	 */
-	public void setProject(IProject project) {
-		this._project = project;
-	}
-
-	/**
-	 * @param field
-	 */
-	protected void containerChangeControlPressed(DialogField field) {
-		// take the current jproject as init element of the dialog
-		IPackageFragmentRoot root = getPackageFragmentRoot();
-		root = chooseSourceContainer(root);
-		if (root != null) {
-			setPackageFragmentRoot(root, true);
-		}
-	}
-
-	/**
-	 * Sets the current source folder (model and text field) to the given
-	 * package fragment root.
-	 * 
-	 * @param root
-	 *            The new root.
-	 * @param canBeModified
-	 *            if <code>false</code> the source folder field can not be
-	 *            changed by the user. If <code>true</code> the field is
-	 *            editable
-	 */
-	public void setPackageFragmentRoot(IPackageFragmentRoot root,
-			boolean canBeModified) {
-		_fCurrRoot = root;
-		String str = (root == null) ? "" : root.getPath().makeRelative().toString(); //$NON-NLS-1$
-		setText(str);
-		setEnabled(canBeModified);
-	}
-
-	/**
-	 * Returns the <code>IPackageFragmentRoot</code> that corresponds to the
-	 * current value of the source folder field.
-	 * 
-	 * @return the IPackageFragmentRoot or <code>null</code> if the current
-	 *         source folder value is not a valid package fragment root
-	 * 
-	 */
-	public IPackageFragmentRoot getPackageFragmentRoot() {
-		return _fCurrRoot;
-	}
-
-	/**
-	 * Returns the current text of source folder text field.
-	 * 
-	 * @return the text of the source folder text field
-	 */
-	public String getPackageFragmentRootText() {
-		return getText();
-	}
-
-	/**
-	 * choose source container dialog
-	 * 
-	 * @param initElement
-	 * @return
-	 */
-	private IPackageFragmentRoot chooseSourceContainer(IJavaElement initElement) {
-		Class[] acceptedClasses = new Class[] { IPackageFragmentRoot.class,
-				IJavaProject.class, };
-
-		TypedElementSelectionValidator validator = new TypedElementSelectionValidator(
-				acceptedClasses, false) {
-            // TODO: never used
-//			public boolean isSelectedValid(Object element) {
-//				try {
-//					if (element instanceof IJavaProject) {
-//						IJavaProject jproject = (IJavaProject) element;
-//						IPath path = jproject.getProject().getFullPath();
-//						return (jproject.findPackageFragmentRoot(path) != null);
-//					} else if (element instanceof IPackageFragmentRoot) {
-//						return (((IPackageFragmentRoot) element).getKind() == IPackageFragmentRoot.K_SOURCE);
-//					}
-//					return true;
-//				} catch (JavaModelException e) {
-//					_log.error("JavaModelException"); // just log, no ui in
-//					// validation
-//				}
-//				return false;
-//			}
-		};
-
-		acceptedClasses = new Class[] { IJavaModel.class,
-				IPackageFragmentRoot.class, IJavaProject.class, };
-		ViewerFilter filter = new TypedViewerFilter(acceptedClasses) {
-			public boolean select(Viewer viewer, Object parent, Object element) {
-				if (element instanceof IPackageFragmentRoot) {
-					try {
-						return (((IPackageFragmentRoot) element).getKind() == IPackageFragmentRoot.K_SOURCE);
-					} catch (JavaModelException e) {
-						_log.error(e); // just log, no ui
-						// in validation
-						return false;
-					}
-				}
-				return super.select(viewer, parent, element);
-			}
-		};
-
-		StandardJavaElementContentProvider provider = new StandardJavaElementContentProvider();
-		ILabelProvider labelProvider = new JavaElementLabelProvider(
-				JavaElementLabelProvider.SHOW_DEFAULT);
-		ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(
-				getShell(), labelProvider, provider);
-		dialog.setValidator(validator);
-		dialog.setComparator(new JavaElementComparator());
-		// HibernateWizardPage.ChooseSourceContainerDialog.Title = Folder
-		// Selection
-		dialog
-				.setTitle(DialogFieldResources
-						.getInstance()
-						.getString(
-								"SourceFolderButtonDialogField.ChooseSourceContainerDialog.Title")); //$NON-NLS-1$
-		// HibernateWizardPage.ChooseSourceContainerDialog.Description = Choose
-		// a folder:
-		dialog
-				.setMessage(DialogFieldResources
-						.getInstance()
-						.getString(
-								"SourceFolderButtonDialogField.ChooseSourceContainerDialog.Description")); //$NON-NLS-1$
-		dialog.addFilter(filter);
-		if (_project != null) {
-			dialog.setInput(JavaCore.create(_project));
-		} else {
-			dialog.setInput(JavaCore.create(ResourcesPlugin.getWorkspace()
-					.getRoot()));
-		}
-		dialog.setInitialSelection(initElement);
-
-		if (dialog.open() == Window.OK) {
-			Object element = dialog.getFirstResult();
-			if (element instanceof IJavaProject) {
-				IJavaProject jproject = (IJavaProject) element;
-				return jproject.getPackageFragmentRoot(jproject.getProject());
-			} else if (element instanceof IPackageFragmentRoot) {
-				return (IPackageFragmentRoot) element;
-			}
-			return null;
-		}
-		return null;
-	}
-
-	/**
-	 * This method updates the model and returns an error status. The underlying
-	 * model is only valid if the returned status is OK.
-	 * 
-	 * @return the model's error status
-	 */
-	public IStatus getChangedStatus() {
-		StatusInfo status = new StatusInfo();
-
-		_fCurrRoot = null;
-		String str = getPackageFragmentRootText();
-		if (str.length() == 0) {
-			// SourceFolderButtonDialogField.error.EnterContainerName = Folder
-			// name is empty.
-			status.setError(DialogFieldResources.getInstance().getString(
-					"SourceFolderButtonDialogField.error.EnterContainerName")); //$NON-NLS-1$
-			return status;
-		}
-		IPath path = new Path(str);
-		IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(
-				path);
-		if (res != null) {
-			int resType = res.getType();
-			if (resType == IResource.PROJECT || resType == IResource.FOLDER) {
-				IProject proj = res.getProject();
-				if (!proj.isOpen()) {
-					status
-							.setError(DialogFieldResources
-									.getInstance()
-									.getString(
-											"SourceFolderButtonDialogField.error.ProjectClosed", proj.getFullPath().toString())); //$NON-NLS-1$
-					return status;
-				}
-				if (_project != null && proj != _project) {
-					// HibernateWizardPage.error.NotSameProject = The project
-					// should be \''{0}\''.
-					status
-							.setError(DialogFieldResources
-									.getInstance()
-									.getString(
-											"SourceFolderButtonDialogField.error.NotSameProject", _project.getName())); //$NON-NLS-1$
-					return status;
-				}
-				IJavaProject jproject = JavaCore.create(proj);
-				_fCurrRoot = jproject.getPackageFragmentRoot(res);
-				if (res.exists()) {
-					try {
-						if (!proj.hasNature(JavaCore.NATURE_ID)) {
-							if (resType == IResource.PROJECT) {
-								status
-										.setError(DialogFieldResources
-												.getInstance()
-												.getString(
-														"SourceFolderButtonDialogField.warning.NotAJavaProject", proj.getName())); //$NON-NLS-1$
-							} else {
-								status
-										.setWarning(DialogFieldResources
-												.getInstance()
-												.getString(
-														"SourceFolderButtonDialogField.warning.NotInAJavaProject", proj.getName())); //$NON-NLS-1$
-							}
-							return status;
-						}
-					} catch (CoreException e) {
-						status
-								.setWarning(DialogFieldResources
-										.getInstance()
-										.getString(
-												"SourceFolderButtonDialogField.warning.NotAJavaProject", proj.getName())); //$NON-NLS-1$
-					}
-					if (!jproject.isOnClasspath(_fCurrRoot)) {
-						status
-								.setWarning(DialogFieldResources
-										.getInstance()
-										.getString(
-												"SourceFolderButtonDialogField.warning.NotOnClassPath", str)); //$NON-NLS-1$
-					}
-					if (_fCurrRoot.isArchive()) {
-						status
-								.setError(DialogFieldResources
-										.getInstance()
-										.getString(
-												"SourceFolderButtonDialogField.error.ContainerIsBinary", str)); //$NON-NLS-1$
-						return status;
-					}
-				}
-				return status;
-			}
-            status.setError(DialogFieldResources.getInstance().getString(
-                    "SourceFolderButtonDialogField.error.NotAFolder", str)); //$NON-NLS-1$
-            return status;
-		}
-        status
-                 .setError(DialogFieldResources
-                        .getInstance()
-                        .getString(
-                                "SourceFolderButtonDialogField.error.ContainerDoesNotExist", str)); //$NON-NLS-1$
-        return status;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusInfo.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusInfo.java
deleted file mode 100644
index 8a8c9b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusInfo.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-
-/**
- * A settable IStatus. Can be an error, warning, info or ok. For error, info and
- * warning states, a message describes the problem.
- * 
- * TODO: couldn't have sub-classed Status?
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class StatusInfo implements IStatus {
-
-	/**
-	 * a default status info for IStatus.OK
-	 */
-	public static final IStatus OK_STATUS = new StatusInfo();
-
-	private String fStatusMessage;
-
-	private int fSeverity;
-
-	/**
-	 * Creates a status set to OK (no message)
-	 */
-	public StatusInfo() {
-		this(OK, null);
-	}
-
-	/**
-	 * Creates a status .
-	 * 
-	 * @param severity
-	 *            The status severity: ERROR, WARNING, INFO and OK.
-	 * @param message
-	 *            The message of the status. Applies only for ERROR, WARNING and
-	 *            INFO.
-	 */
-	public StatusInfo(int severity, String message) {
-		fStatusMessage = message;
-		fSeverity = severity;
-	}
-
-	/**
-	 * Returns if the status' severity is OK.
-	 */
-	public boolean isOK() {
-		return fSeverity == IStatus.OK;
-	}
-
-	/**
-	 * Returns if the status' severity is WARNING.
-	 * @return true if severity is IStatus.WARNING
-	 */
-	public boolean isWarning() {
-		return fSeverity == IStatus.WARNING;
-	}
-
-	/**
-	 * Returns if the status' severity is INFO.
-	 * @return true if severity is INFO
-	 */
-	public boolean isInfo() {
-		return fSeverity == IStatus.INFO;
-	}
-
-	/**
-	 * Returns if the status' severity is ERROR.
-	 * @return true if severity is error
-	 */
-	public boolean isError() {
-		return fSeverity == IStatus.ERROR;
-	}
-
-	/**
-	 * @see IStatus#getMessage
-	 */
-	public String getMessage() {
-		return fStatusMessage;
-	}
-
-	/**
-	 * Sets the status to ERROR.
-	 * 
-	 * @param errorMessage
-	 *            The error message (can be empty, but not null)
-	 */
-	public void setError(String errorMessage) {
-		Assert.isNotNull(errorMessage);
-		fStatusMessage = errorMessage;
-		fSeverity = IStatus.ERROR;
-	}
-
-	/**
-	 * Sets the status to WARNING.
-	 * 
-	 * @param warningMessage
-	 *            The warning message (can be empty, but not null)
-	 */
-	public void setWarning(String warningMessage) {
-		Assert.isNotNull(warningMessage);
-		fStatusMessage = warningMessage;
-		fSeverity = IStatus.WARNING;
-	}
-
-	/**
-	 * Sets the status to INFO.
-	 * 
-	 * @param infoMessage
-	 *            The info message (can be empty, but not null)
-	 */
-	public void setInfo(String infoMessage) {
-		Assert.isNotNull(infoMessage);
-		fStatusMessage = infoMessage;
-		fSeverity = IStatus.INFO;
-	}
-
-	/**
-	 * Sets the status to OK.
-	 */
-	public void setOK() {
-		fStatusMessage = null;
-		fSeverity = IStatus.OK;
-	}
-
-	/*
-	 * @see IStatus#matches(int)
-	 */
-	public boolean matches(int severityMask) {
-		return (fSeverity & severityMask) != 0;
-	}
-
-	/**
-	 * Returns always <code>false</code>.
-	 * 
-	 * @see IStatus#isMultiStatus()
-	 */
-	public boolean isMultiStatus() {
-		return false;
-	}
-
-	/*
-	 * @see IStatus#getSeverity()
-	 */
-	public int getSeverity() {
-		return fSeverity;
-	}
-
-	/*
-	 * @see IStatus#getPlugin()
-	 */
-	public String getPlugin() {
-		return JSFUICommonPlugin.getPluginId();
-	}
-
-	/**
-	 * Returns always <code>null</code>.
-	 * 
-	 * @see IStatus#getException()
-	 */
-	public Throwable getException() {
-		return null;
-	}
-
-	/**
-	 * Returns always the error severity.
-	 * 
-	 * @see IStatus#getCode()
-	 */
-	public int getCode() {
-		return fSeverity;
-	}
-
-	/**
-	 * Returns always <code>null</code>.
-	 * 
-	 * @see IStatus#getChildren()
-	 */
-	public IStatus[] getChildren() {
-		return new IStatus[0];
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusUtil.java
deleted file mode 100644
index 22fe6d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StatusUtil.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.DialogPage;
-
-/**
- * copied from org.eclipse.jdt.internal.dialogs. Enhanced to support null status
- * as parameter
- * 
- * A utility class to work with IStatus.
- */
-public class StatusUtil {
-
-	/**
-	 * Compares two instances of <code>IStatus</code>. The more severe is
-	 * returned: An error is more severe than a warning, and a warning is more
-	 * severe than ok. If the two stati have the same severity, the second is
-	 * returned.
-	 * @param s1 
-	 * @param s2 
-	 * 
-	 * @return Could be null.
-	 */
-	public static IStatus getMoreSevere(IStatus s1, IStatus s2) {
-		if (s1 == null && s2 == null) {
-			return null;
-		} else if (s1 == null) {
-			return s2;
-		} else if (s2 == null) {
-			return s1;
-		} else if (s1.getSeverity() > s2.getSeverity()) {
-			return s1;
-		} else {
-			return s2;
-		}
-	}
-
-	/**
-	 * Finds the most severe status from a array of stati. An error is more
-	 * severe than a warning, and a warning is more severe than ok.
-	 * @param status 
-	 * 
-	 * @return could be null
-	 */
-	public static IStatus getMostSevere(IStatus[] status) {
-		if (status == null)
-			return null;
-		IStatus max = null;
-		for (int i = 0; i < status.length; i++) {
-			IStatus curr = status[i];
-			if (curr == null)
-				continue;
-
-			if (curr.matches(IStatus.ERROR)) {
-				return curr;
-			}
-			if (max == null || curr.getSeverity() > max.getSeverity()) {
-				max = curr;
-			}
-		}
-		if (max != null)
-        {
-			return max;
-        }
-
-        return null;
-	}
-
-	/**
-	 * Applies the status to the status line of a dialog page.
-	 * @param page 
-	 * @param status 
-	 */
-	public static void applyToStatusLine(DialogPage page, IStatus status) {
-		if (status == null) {
-			page.setMessage(null);
-			page.setErrorMessage(null);
-		} else {
-			String message = status.getMessage();
-			switch (status.getSeverity()) {
-			case IStatus.OK:
-				page.setMessage(message, DialogPage.NONE);
-				page.setErrorMessage(null);
-				break;
-			case IStatus.WARNING:
-				page.setMessage(message, DialogPage.WARNING);
-				page.setErrorMessage(null);
-				break;
-			case IStatus.INFO:
-				page.setMessage(message, DialogPage.INFORMATION);
-				page.setErrorMessage(null);
-				break;
-			default:
-				if (message.length() == 0) {
-					message = null;
-				}
-				page.setMessage(null);
-				page.setErrorMessage(message);
-				break;
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringButtonDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringButtonDialogField.java
deleted file mode 100644
index eebc9e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringButtonDialogField.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Dialog field containing a label, text control and a button control.
- */
-public class StringButtonDialogField extends StringDialogField {
-	private Button _browseButton;
-
-	private String _browseButtonLabel;
-
-	private IStringButtonAdapter _stringButtonAdapter;
-
-	private boolean _buttonEnabled;
-
-	/**
-	 * @param adapter
-	 */
-	public StringButtonDialogField(IStringButtonAdapter adapter) {
-		_stringButtonAdapter = adapter;
-		_browseButtonLabel = JSFUICommonPlugin
-				.getResourceString("DialogField.Browse"); //$NON-NLS-1$
-		_buttonEnabled = true;
-	}
-
-	/**
-	 * Sets the label of the button.
-	 * @param label 
-	 */
-	public void setButtonLabel(String label) {
-		_browseButtonLabel = label;
-	}
-
-	// ------ adapter communication
-
-	/**
-	 * Programmatical pressing of the button
-	 */
-	public void changeControlPressed() {
-		_stringButtonAdapter.changeControlPressed(this);
-	}
-
-	// ------- layout helpers
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		Text text = getTextControl(toolkit, parent);
-		text.setLayoutData(gridDataForText(nColumns - 3));
-		Button button = getChangeControl(toolkit, parent);
-		button.setLayoutData(gridDataForButton(toolkit, button, text, 1));
-
-		return new Control[] { requiredLabel, label, text, button };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 4;
-	}
-
-	/**
-	 * @param toolkit
-	 * @param button
-	 * @param text
-	 * @param span
-	 * @return the grid data for the button
-	 */
-	protected static GridData gridDataForButton(FormToolkit toolkit,
-			Button button, Text text, int span) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		// gd.heightHint = SWTUtil.getButtonHeightHint(button);
-		gd.widthHint = LayoutUtil.getButtonWidthHint(button);
-		gd.heightHint = LayoutUtil.getButtonHeightHint(toolkit, text);
-		return gd;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created buttom widget.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> if the widget has
-	 *            already been created.
-	 * @return the button
-	 */
-	public Button getChangeControl(FormToolkit toolkit, Composite parent) {
-		if (_browseButton == null || _browseButton.isDisposed()) {
-			assertCompositeNotNull(parent);
-			if (toolkit != null) {
-				_browseButton = toolkit.createButton(parent,
-						_browseButtonLabel, SWT.PUSH);
-			} else {
-				_browseButton = new Button(parent, SWT.PUSH);
-				_browseButton.setText(_browseButtonLabel);
-			}
-			_browseButton.setEnabled(isEnabled() && _buttonEnabled);
-			_browseButton.addSelectionListener(new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					changeControlPressed();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					changeControlPressed();
-				}
-			});
-
-		}
-		return _browseButton;
-	}
-
-	// ------ enable / disable management
-
-	/**
-	 * Sets the enable state of the button.
-	 * @param enable 
-	 */
-	public void enableButton(boolean enable) {
-		if (isOkToUse(_browseButton)) {
-			_browseButton.setEnabled(isEnabled() && enable);
-		}
-		_buttonEnabled = enable;
-	}
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_browseButton)) {
-			_browseButton.setEnabled(isEnabled() && _buttonEnabled);
-		}
-	}
-
-	/**
-	 * @return Returns the _stringButtonAdapter.
-	 */
-	public IStringButtonAdapter getStringButtonAdapter() {
-		return _stringButtonAdapter;
-	}
-
-	/**
-	 * @param buttonAdapter
-	 *            The _stringButtonAdapter to set.
-	 */
-	public void setStringButtonAdapter(IStringButtonAdapter buttonAdapter) {
-		_stringButtonAdapter = buttonAdapter;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringDialogField.java
deleted file mode 100644
index bf334a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StringDialogField.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Dialog field containing a label and a text control.
- */
-public class StringDialogField extends DialogFieldBase implements
-		ISupportTextValue {
-	final static private int TEXT_WIDTH_HINT = 10;
-
-	private String _text;
-
-	private Text _textControl;
-
-	private ModifyListener _modifyListener;
-
-	private int _numRows;
-
-	/**
-	 * whether there is change in the UI but not fire applied event yet.
-	 */
-	private boolean _pending = false;
-
-	/**
-	 * default constructor
-	 * numRows == 1
-	 */
-	public StringDialogField() {
-		this(1);
-		_text = ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * @param numRows
-	 */
-	public StringDialogField(int numRows) {
-		super();
-		_text = ""; //$NON-NLS-1$
-		_numRows = numRows;
-	}
-
-	// ------- layout helpers
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit kit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(kit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(kit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		Text text = getTextControl(kit, parent);
-		int heightHint = -1;
-		if (_numRows > 1) {
-			heightHint = getDialogUnits(parent).getHeight() * _numRows;
-		}
-		text.setLayoutData(gridDataForText(nColumns - 2, heightHint));
-
-		return new Control[] { requiredLabel, label, text };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 3;
-	}
-
-	protected static GridData gridDataForLabel(int span) {
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gd.horizontalSpan = span;
-		return gd;
-	}
-
-	/**
-	 * @param span
-	 * @param heightHint
-	 * @return the grid data for text
-	 */
-	protected static GridData gridDataForText(int span, int heightHint) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.heightHint = heightHint;
-		gd.horizontalSpan = span;
-		gd.widthHint = TEXT_WIDTH_HINT;
-		return gd;
-	}
-
-	/**
-	 * @param span
-	 * @return the grid data for text
-	 */
-	protected static GridData gridDataForText(int span) {
-		GridData gd = gridDataForText(span, -1);
-		return gd;
-	}
-
-	// ------- focus methods
-
-	/*
-	 * @see DialogField#setFocus
-	 */
-	public boolean setFocus() {
-		if (isOkToUse(_textControl)) {
-			_textControl.setFocus();
-			_textControl.setSelection(0, _textControl.getText().length());
-		}
-		return true;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created text control.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> when the widget
-	 *            has already been created.
-	 * @return the text control
-	 */
-	public Text getTextControl(FormToolkit toolkit, Composite parent) {
-		if (_textControl == null || _textControl.isDisposed()) {
-			assertCompositeNotNull(parent);
-			_modifyListener = new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					doModifyText(e);
-				}
-			};
-
-			if (toolkit != null) {
-				if (_numRows <= 1) {
-					_textControl = toolkit.createText(parent, ""); //$NON-NLS-1$
-				} else {
-					_textControl = toolkit.createText(parent, "", SWT.V_SCROLL); //$NON-NLS-1$
-				}
-			} else {
-				if (_numRows <= 1) {
-
-					_textControl = new Text(parent, SWT.SINGLE | SWT.BORDER);
-				} else {
-					_textControl = new Text(parent, SWT.V_SCROLL | SWT.WRAP
-							| SWT.BORDER);
-				}
-			}
-
-			_textControl.setText(_text);
-			_textControl.setFont(parent.getFont());
-			_textControl.addModifyListener(_modifyListener);
-			_textControl.addFocusListener(new FocusAdapter() {
-
-				public void focusLost(FocusEvent e) {
-					doFocusLost(e);
-				}
-
-			});
-			_textControl.addKeyListener(new KeyAdapter() {
-				public void keyReleased(KeyEvent e) {
-					doKeyReleased(e);
-				}
-			});
-
-			_textControl.setEnabled(isEnabled());
-
-			_textControl.setToolTipText(getToolTip());
-		}
-		return _textControl;
-	}
-
-	/**
-	 * @param e
-	 */
-	protected void doKeyReleased(KeyEvent e) {
-		if (e.character == '\r') {
-			// commit value
-			if (_pending) {
-				_pending = false;
-				dialogFieldApplied();
-			}
-		}
-	}
-
-	/**
-	 * @param e
-	 */
-	protected void doFocusLost(FocusEvent e) {
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	/**
-	 * some get changed in the Text. As in <code>setText</code> and
-	 * <code>setTextWithoutUpdate</code> we removed the listener, so this must
-	 * be user typing in the text field.
-	 * 
-	 * @param e
-	 */
-	private void doModifyText(ModifyEvent e) {
-		if (isOkToUse(_textControl)) {
-			_text = _textControl.getText();
-		}
-		_pending = true;
-		dialogFieldChanged();
-	}
-
-	// ------ enable / disable management
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_textControl)) {
-			_textControl.setEnabled(isEnabled());
-		}
-	}
-
-	// ------ text access
-
-	/**
-	 * Gets the text. Can not be <code>null</code>
-	 */
-	public String getText() {
-		return _text;
-	}
-
-	/**
-	 * Sets the text. Triggers a dialog-changed event.
-	 */
-	public void setText(String text) {
-		setTextWithoutUpdate(text);
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Sets the text without triggering a dialog-changed event.
-	 */
-	public void setTextWithoutUpdate(String text) {
-		// reset _pending state.
-		_pending = false;
-
-		if (text == null)
-			text = ""; //$NON-NLS-1$
-		_text = text;
-		if (isOkToUse(_textControl)) {
-			_textControl.removeModifyListener(_modifyListener);
-			_textControl.setText(text);
-			_textControl.addModifyListener(_modifyListener);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		LayoutUtil.setGrabHorizontal(_textControl, true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StyleComboDialogField.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StyleComboDialogField.java
deleted file mode 100644
index 93c9332..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/StyleComboDialogField.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.Map.Entry;
-
-import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.forms.FormColors;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A dialog field for style combos
- *
- */
-public class StyleComboDialogField extends DialogFieldBase implements
-		ISupportTextValue {
-	final static private int WIDTH_HINT = 10;
-
-	private String _text;
-
-	private int _selectionIndex;
-
-	private String[] _items;
-
-	private StyleCombo _comboControl;
-
-	private ModifyListener _modifyListener;
-
-	private int _flags;
-
-	private boolean _pending = false;
-
-	private Map _entryMap;
-
-	private String _defaultValue;
-
-
-	/**
-	 * @param defaultValue
-	 */
-	public void setDefaultValue(String defaultValue) {
-		this._defaultValue = defaultValue;
-		if (_comboControl != null && ! _comboControl.isDisposed())
-			_comboControl.setDefaultValue(_defaultValue);
-	}
-
-	/**
-	 * @param flags
-	 */
-	public StyleComboDialogField(int flags) {
-		super();
-		_text = ""; //$NON-NLS-1$
-		_items = new String[0];
-		_flags = flags;
-		_selectionIndex = -1;
-	}
-
-	// ------- layout helpers
-
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		assertEnoughColumns(nColumns);
-
-		Control requiredLabel = getRequiredLabelControl(toolkit, parent);
-		requiredLabel.setLayoutData(gridDataForLabel(1));
-
-		Control label = getLabelControl(toolkit, parent);
-		label.setLayoutData(gridDataForLabel(1));
-
-		StyleCombo combo = getComboControl(toolkit, parent);
-		combo.setLayoutData(gridDataForCombo(nColumns - 2));
-
-		return new Control[] { requiredLabel, label, combo };
-	}
-
-	/*
-	 * @see DialogField#getNumberOfControls
-	 */
-	public int getNumberOfControls() {
-		return 3;
-	}
-
-	/**
-	 * @param span
-	 * @return the grid data for the combo
-	 */
-	protected static GridData gridDataForCombo(int span) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.grabExcessHorizontalSpace = false;
-		gd.horizontalSpan = span;
-		gd.widthHint = WIDTH_HINT;
-		return gd;
-	}
-
-	// ------- focus methods
-
-	/*
-	 * @see DialogField#setFocus
-	 */
-	public boolean setFocus() {
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setFocus();
-		}
-		return true;
-	}
-
-	// ------- ui creation
-
-	/**
-	 * Creates or returns the created combo control.
-	 * @param toolkit 
-	 * 
-	 * @param parent
-	 *            The parent composite or <code>null</code> when the widget
-	 *            has already been created.
-	 * @return the combo control
-	 */
-	public StyleCombo getComboControl(FormToolkit toolkit,
-			final Composite parent) {
-		if (_comboControl == null || _comboControl.isDisposed()) {
-			assertCompositeNotNull(parent);
-			_modifyListener = new ModifyListener() {
-				public void modifyText(ModifyEvent e) {
-					doModifyText(e);
-				}
-			};
-			SelectionListener selectionListener = new SelectionListener() {
-				public void widgetSelected(SelectionEvent e) {
-					doSelectionChanged(e);
-				}
-
-				public void widgetDefaultSelected(SelectionEvent e) {
-					handleDefaultSelection(e);
-				}
-			};
-
-			if (toolkit != null) {
-				_comboControl = new StyleCombo(parent, _flags);
-                final FormColors colors = new FormColors(parent.getDisplay());
-				parent.addPaintListener(new PaintListener() {
-
-					public void paintControl(PaintEvent event) {
-						Composite composite = (Composite) event.widget;
-						Control[] children = composite.getChildren();
-						for (int i = 0; i < children.length; i++) {
-							Control c = children[i];
-							if (!(c instanceof StyleCombo) || !c.isVisible()) {
-								continue;
-							}
-							Rectangle b = c.getBounds();
-							GC gc = event.gc;
-							gc.setForeground(colors.getBorderColor());
-							gc.drawRectangle(b.x - 1, b.y - 1, b.width + 1,
-									b.height + 1);
-						}
-					}
-				});
-                
-                // when the parent is disposed, the colors should no
-                // no longer be needed.
-                parent.addDisposeListener(new DisposeListener()
-                {
-                    public void widgetDisposed(DisposeEvent e) {
-                        colors.dispose();
-                    }
-                }
-                );
-				toolkit.adapt(_comboControl);
-			} else {
-				_comboControl = new StyleCombo(parent, _flags | SWT.BORDER);
-				_comboControl.setBackground(Display.getCurrent()
-						.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-			}
-
-			// moved up due to 1GEUNW2
-			_comboControl.setItems(_items);
-			_comboControl.setDefaultValue(_defaultValue);
-			if (_selectionIndex != -1) {
-				_comboControl.select(_selectionIndex);
-			} else {
-				_comboControl.setText(_text);
-			}
-			_comboControl.setFont(parent.getFont());
-			_comboControl.addModifyListener(_modifyListener);
-			_comboControl.addSelectionListener(selectionListener);
-			_comboControl.addFocusListener(new FocusAdapter() {
-				public void focusLost(FocusEvent e) {
-					doFocusLost(e);
-				}
-			});
-			_comboControl.setEnabled(isEnabled());
-			_comboControl.setToolTipText(getToolTip());
-		}
-		return _comboControl;
-	}
-
-	/**
-	 * @param e
-	 */
-	protected void handleDefaultSelection(SelectionEvent e) {
-		// commit value
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	/**
-	 * @param e
-	 */
-	protected void doFocusLost(FocusEvent e) {
-		if (_pending) {
-			_pending = false;
-			dialogFieldApplied();
-		}
-	}
-
-	private void doModifyText(ModifyEvent e) {
-		if (isOkToUse(_comboControl)) {
-			_text = getEntryKey(_comboControl.getText());
-			_selectionIndex = _comboControl.getSelectionIndex();
-		}
-		_pending = true;
-		dialogFieldChanged();
-	}
-
-	private void doSelectionChanged(SelectionEvent e) {
-		if (isOkToUse(_comboControl)) {
-			_items = _comboControl.getItems();
-			_text = getEntryKey(_comboControl.getText());
-			_selectionIndex = _comboControl.getSelectionIndex();
-		}
-		_pending = false;
-		dialogFieldChangedAndApplied();
-	}
-
-	// ------ enable / disable management
-
-	/*
-	 * @see DialogField#updateEnableState
-	 */
-	protected void updateEnableState() {
-		super.updateEnableState();
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setEnabled(isEnabled());
-		}
-	}
-
-	// ------ text access
-
-	/**
-	 * Sets the combo items. Triggers a dialog-changed event.
-	 * @param items 
-	 */
-	public void setItems(String[] items) {
-		_items = items;
-		if (isOkToUse(_comboControl)) {
-			_comboControl.setItems(items);
-		}
-		_pending = false;
-		// dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * @param map
-	 */
-	public void setEntryMap(Map map) {
-		this._entryMap = map;
-		if (_entryMap == null) {
-			_entryMap = new TreeMap();
-		}
-		Entry[] entries = (Entry[]) _entryMap.entrySet().toArray(new Entry[0]);
-		String[] items = new String[entries.length];
-		for (int i = 0; i < entries.length; i++) {
-			items[i] = entries[i].getValue().toString();
-		}
-		setItems(items);
-	}
-
-	/**
-	 * Gets the text.
-	 */
-	public String getText() {
-		return _text;
-	}
-
-	/**
-	 * Sets the text. Triggers a dialog-changed event.
-	 */
-	public void setText(String text) {
-		setTextWithoutUpdate(text);
-		_pending = false;
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * Selects an item.
-	 * @param index 
-	 */
-	public void selectItem(int index) {
-		if (isOkToUse(_comboControl)) {
-			_comboControl.select(index);
-		} else {
-			if (index >= 0 && index < _items.length) {
-				_text = getEntryKey(_items[index]);
-				_selectionIndex = index;
-			}
-		}
-		dialogFieldChangedAndApplied();
-	}
-
-	/**
-	 * @return the selection index
-	 */
-	public int getSelectionIndex() {
-		return _selectionIndex;
-	}
-
-	/**
-	 * Sets the text without triggering a dialog-changed event.
-	 */
-	public void setTextWithoutUpdate(String text) {
-		_pending = false;
-		if (text == null) {
-			text = "";//$NON-NLS-1$
-		}
-		_text = text;
-		if (isOkToUse(_comboControl)) {
-			_comboControl.removeModifyListener(_modifyListener);
-			_comboControl.setText(getEntryValue(text));
-			_comboControl.addModifyListener(_modifyListener);
-		}
-	}
-
-	private String getEntryValue(String key) {
-		if (_entryMap == null || !_entryMap.containsKey(key)) {
-			return key;
-		}
-		return _entryMap.get(key).toString();
-	}
-
-	private String getEntryKey(String value) {
-		if (_entryMap == null || !_entryMap.containsValue(value)) {
-			return value;
-		}
-
-		Entry[] entries = (Entry[]) _entryMap.entrySet().toArray(new Entry[0]);
-		for (int i = 0; i < entries.length; i++) {
-			if (entries[i].getValue() == value
-					|| (value != null && value.equals(entries[i].getValue()))) {
-				return entries[i].getKey().toString();
-			}
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		LayoutUtil.setGrabHorizontal(_comboControl, true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedElementSelectionValidator.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedElementSelectionValidator.java
deleted file mode 100644
index 8d0e091..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedElementSelectionValidator.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-import java.util.Collection;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-
-/**
- * Implementation of a <code>ISelectionValidator</code> to validate the type
- * of an element. Empty selections are not accepted.
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TypedElementSelectionValidator implements
-		ISelectionStatusValidator {
-
-	private IStatus _fgErrorStatus = new StatusInfo(IStatus.ERROR, ""); //$NON-NLS-1$
-
-	private IStatus _fgOKStatus = new StatusInfo();
-
-	private Class[] _fAcceptedTypes;
-
-	private boolean _fAllowMultipleSelection;
-
-	private Collection _fRejectedElements;
-
-	/**
-	 * @param acceptedTypes
-	 *            The types accepted by the validator
-	 * @param allowMultipleSelection
-	 *            If set to <code>true</code>, the validator allows multiple
-	 *            selection.
-	 */
-	public TypedElementSelectionValidator(Class[] acceptedTypes,
-			boolean allowMultipleSelection) {
-		this(acceptedTypes, allowMultipleSelection, null);
-	}
-
-	/**
-	 * @param acceptedTypes
-	 *            The types accepted by the validator
-	 * @param allowMultipleSelection
-	 *            If set to <code>true</code>, the validator allows multiple
-	 *            selection.
-	 * @param rejectedElements
-	 *            A list of elements that are not accepted
-	 */
-	public TypedElementSelectionValidator(Class[] acceptedTypes,
-			boolean allowMultipleSelection, Collection rejectedElements) {
-		Assert.isNotNull(acceptedTypes);
-		_fAcceptedTypes = acceptedTypes;
-		_fAllowMultipleSelection = allowMultipleSelection;
-		_fRejectedElements = rejectedElements;
-	}
-
-	/*
-	 * @see org.eclipse.ui.dialogs.ISelectionValidator#isValid(java.lang.Object)
-	 */
-	public IStatus validate(Object[] elements) {
-		if (isValid(elements)) {
-			return _fgOKStatus;
-		}
-		return _fgErrorStatus;
-	}
-
-	private boolean isOfAcceptedType(Object o) {
-		for (int i = 0; i < _fAcceptedTypes.length; i++) {
-			if (_fAcceptedTypes[i].isInstance(o)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean isRejectedElement(Object elem) {
-		return (_fRejectedElements != null)
-				&& _fRejectedElements.contains(elem);
-	}
-
-	private boolean isValid(Object[] selection) {
-		if (selection.length == 0) {
-			return false;
-		}
-
-		if (!_fAllowMultipleSelection && selection.length != 1) {
-			return false;
-		}
-
-		for (int i = 0; i < selection.length; i++) {
-			Object o = selection[i];
-			if (!isOfAcceptedType(o) || isRejectedElement(o)) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedViewerFilter.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedViewerFilter.java
deleted file mode 100644
index 52ecb6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogfield/TypedViewerFilter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogfield;
-
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-/**
- * Viewer filter used in selection dialogs.
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TypedViewerFilter extends ViewerFilter {
-
-	private Class[] _fAcceptedTypes;
-
-	private Object[] _fRejectedElements;
-
-	/**
-	 * Creates a filter that only allows elements of gives types.
-	 * 
-	 * @param acceptedTypes
-	 *            The types of accepted elements
-	 */
-	public TypedViewerFilter(Class[] acceptedTypes) {
-		this(acceptedTypes, null);
-	}
-
-	/**
-	 * Creates a filter that only allows elements of gives types, but not from a
-	 * list of rejected elements.
-	 * 
-	 * @param acceptedTypes
-	 *            Accepted elements must be of this types
-	 * @param rejectedElements
-	 *            Element equals to the rejected elements are filtered out
-	 */
-	public TypedViewerFilter(Class[] acceptedTypes, Object[] rejectedElements) {
-		Assert.isNotNull(acceptedTypes);
-		_fAcceptedTypes = acceptedTypes;
-		_fRejectedElements = rejectedElements;
-	}
-
-	/**
-	 * @see ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-		if (_fRejectedElements != null) {
-			for (int i = 0; i < _fRejectedElements.length; i++) {
-				if (element.equals(_fRejectedElements[i])) {
-					return false;
-				}
-			}
-		}
-		for (int i = 0; i < _fAcceptedTypes.length; i++) {
-			if (_fAcceptedTypes[i].isInstance(element)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonResourceDialog.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonResourceDialog.java
deleted file mode 100644
index debc2f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonResourceDialog.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogs;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.views.navigator.ResourceComparator;
-
-/**
- * This dialog shows IFile type resources within a IProject domain for
- * selection. The client can prvide the suffixs of files to filter when
- * candidates are shown on the tree.
- * 
- * The usage: Shell shell = new Shell(); IProject project = getProject();
- * CommonResourceDialog dlg = new CommonResourceDialog(shell, project);
- * dlg.setResourceDescription("image"); dlg.setSuffixs(new
- * String[]{"bmp","jpg","gif"}); if(dlg.open() == Window.OK) { IFile
- * selectedFile = (IFile)dlg.getResult()[0]; }
- * 
- * Note: In code above, what you get is an absolute resource path. You can use
- * <code>org.eclipse.wst.sse.core.util.PathHelper.convertToRelative(String input, String base)</code>
- * to convert a absolute resource path to a relative path based on one path.
- * 
- * @author mengbo
- */
-public class CommonResourceDialog extends TreeViewerSelectionDialog {
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(CommonResourceDialog.class);
-
-	// private static final String STATUS_MESSAGE_0 = CommonPlugin
-	// .getResourceString("Dialog.CommonResourceDialog.StatusMessage0");
-	// //$NON-NLS-1$
-
-	private IProject _project = null;
-
-	private String _suffixs[] = null;
-
-	private CommonResourceFilter _filter = null;
-
-	// The resource type resourceDescription, such as "image", "jsp", "java
-	// class" etc.
-	private String _resourceDescription = null;
-
-	private IFolder _folder;
-
-	// The content provider
-	class ProjectFileDialogContentProvider implements ITreeContentProvider {
-		/**
-		 * The visual part that is using this content provider is about to be
-		 * disposed. Deallocate all allocated SWT resources.
-		 */
-		public void dispose() {
-            // nothing to dispose
-		}
-
-		/**
-		 * @see ITreeContentProvider#getChildren
-		 */
-		public Object[] getChildren(Object element) {
-			if (element instanceof Object[]) {
-				return (Object[]) element;
-			} else if (element instanceof IContainer) {
-				IContainer container = (IContainer) element;
-				if (container.isAccessible()) {
-					try {
-						return container.members();
-					} catch (CoreException e) {
-						_log.error(
-								"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-					}
-				}
-
-			}
-			return new Object[0];
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
-		 */
-		public Object[] getElements(Object element) {
-			return getChildren(element);
-		}
-
-		/**
-		 * @see ITreeContentProvider#getParent
-		 */
-		public Object getParent(Object element) {
-			if (element instanceof IResource) {
-				return ((IResource) element).getParent();
-			}
-			return null;
-		}
-
-		/**
-		 * @see ITreeContentProvider#hasChildren
-		 */
-		public boolean hasChildren(Object element) {
-			return getChildren(element).length > 0;
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(Viewer, Object, Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            // no viewer change support required
-		}
-
-	}
-
-	// The default resource filter
-	class CommonResourceFilter extends ViewerFilter {
-		private String _filterSuffixs[] = null;
-
-		/**
-		 * @return Returns the _suffixs.
-		 */
-		public String[] getSuffixs() {
-			return _filterSuffixs;
-		}
-
-		/**
-		 * @param _suffixs
-		 *            The _suffixs to set.
-		 */
-		public void setSuffixs(String[] _suffixs) {
-			this._filterSuffixs = _suffixs;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			if (element instanceof IFile) {
-				IFile file = (IFile) element;
-				if (!WebrootUtil.isUnderWebContentFolder(file)) {
-					return false;
-				}
-				if (isSuffixBlank()) {
-					return true;
-				}
-				if (file.getFileExtension() != null) {
-					if (Arrays.asList(_filterSuffixs).contains(
-							file.getFileExtension().toLowerCase())) {
-						return true;
-					}
-				}
-			} else if (element instanceof IContainer) {
-				if (!((IContainer) element).isAccessible()) {
-					return false;
-				}
-				if (element instanceof IProject) {
-					return true;
-				} else if (element instanceof IFolder) {
-					IContainer container = (IContainer) element;
-					try {
-						IResource[] members = container.members();
-						for (int i = 0; i < members.length; i++) {
-							if (select(viewer, members[i].getParent(),
-									members[i])) {
-								return true;
-							}
-						}
-					} catch (CoreException e) {
-						_log.error(
-								"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						return false;
-					}
-				}
-			}
-			return false;
-		}
-
-	}
-
-	/**
-	 * This is a dialog for common resource selection, the resouce supported
-	 * include IFolder, IProject, IFile, user can provide
-	 * 
-	 * @param parentShell
-	 * @param project
-	 * @param style 
-	 */
-	public CommonResourceDialog(Shell parentShell, IProject project, int style) {
-		super(parentShell, "", style); //$NON-NLS-1$
-		if (project == null) {
-			throw new IllegalArgumentException(
-					"Argument(project) cannot be null"); //$NON-NLS-1$
-		}
-		_project = project;
-		setContentProvider(new ProjectFileDialogContentProvider());
-		setLabelProvider(WorkbenchLabelProvider
-				.getDecoratingWorkbenchLabelProvider());
-		_filter = new CommonResourceFilter();
-		setFilter(_filter);
-		setViewerComparator(new ResourceComparator(ResourceComparator.TYPE));
-		_project = project;
-		setStatusMessage(getStatusMessage());
-	}
-
-	/**
-	 * Same as CommonResourceDialog(parentShell, project, SWT.NONE)
-	 * 
-	 * @param parentShell
-	 * @param project
-	 */
-	public CommonResourceDialog(Shell parentShell, IProject project) {
-		this(parentShell, project, SWT.NONE);
-	}
-
-	private String getStatusMessage() {
-		if (_resourceDescription == null) {
-			return ""; //$NON-NLS-1$
-		}
-		return _resourceDescription;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#findInputElement()
-	 */
-	protected Object findInputElement() {
-		if (_folder != null) {
-			return new Object[] { _folder, };
-		}
-		return new Object[] { _project, };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection(java.lang.Object)
-	 */
-	protected boolean isValidSelection(Object selection) {
-		if (selection instanceof Object[]) {
-			for (int i = 0, n = ((Object[]) selection).length; i < n; i++) {
-				if (isValidElement(((Object[]) selection)[i]) == true) {
-					return true;
-				}
-			}
-			return false;
-		}
-        return isValidElement(selection);
-	}
-
-	private boolean isValidElement(Object selection) {
-		if ((selection instanceof IFile)) {
-			// Null means no filter is set
-			if (isSuffixBlank()) {
-				return true;
-			}
-			// The extension is supported?
-			else if (_suffixs != null
-					&& Arrays.asList(_suffixs).contains(
-							((IFile) selection).getFileExtension()
-									.toLowerCase())) {
-				return true;
-			}
-		}
-		// None of above conditions, invalid.
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		List list = new ArrayList();
-		for (int i = 0; i < objects.length; i++) {
-			if (objects[i] instanceof IFile) {
-				list.add(objects[i]);
-			}
-		}
-		return list.toArray();
-	}
-
-	/**
-	 * @param suffixs
-	 *            The suffixs to set.
-	 */
-	public void setSuffixs(String[] suffixs) {
-		this._suffixs = convertTolowercase(suffixs);
-		_filter.setSuffixs(_suffixs);
-		setStatusMessage(getStatusMessage());
-	}
-
-	private String[] convertTolowercase(String[] suffixs) {
-		if (suffixs != null) {
-			String[] newSuffixs = new String[suffixs.length];
-			for (int i = 0; i < suffixs.length; i++) {
-				newSuffixs[i] = suffixs[i].toLowerCase();
-			}
-			return newSuffixs;
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the sourceDescription.
-	 */
-	public String getResourceDescription() {
-		return _resourceDescription;
-	}
-
-	/**
-	 * @param sourceDescription
-	 *            The sourceDescription to set.
-	 */
-	public void setResourceDescription(String sourceDescription) {
-		this._resourceDescription = sourceDescription;
-		setStatusMessage(getStatusMessage());
-	}
-
-	private boolean isSuffixBlank() {
-		boolean isSuffixBlank = false;
-		if (_suffixs == null) {
-			isSuffixBlank = true;
-		} else {
-			int count = 0;
-			for (int i = 0, size = _suffixs.length; i < size; i++) {
-				if (_suffixs[i] != null && !"".equals(_suffixs[i])) { //$NON-NLS-1$
-					count++;
-					break;
-				}
-			}
-			if (count == 0) {
-				isSuffixBlank = true;
-			}
-		}
-		return isSuffixBlank;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonWizardDialog.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonWizardDialog.java
deleted file mode 100644
index 3fd719c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/CommonWizardDialog.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogs;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Wizard Dialog with a Finish set to OK if no previous
- * or next buttons are needed
- *
- */
-public class CommonWizardDialog extends WizardDialog {
-
-	/**
-	 * @param parentShell
-	 * @param newWizard
-	 */
-	public CommonWizardDialog(Shell parentShell, IWizard newWizard) {
-		super(parentShell, newWizard);
-	}
-
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-
-		IWizard wizard = getWizard();
-		if (!wizard.needsPreviousAndNextButtons()) {
-			getButton(IDialogConstants.FINISH_ID).setText(
-					IDialogConstants.OK_LABEL);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/ResourceOnClasspathDialog.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/ResourceOnClasspathDialog.java
deleted file mode 100644
index 934957d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/ResourceOnClasspathDialog.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogs;
-
-import java.io.File;
-import java.util.Arrays;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJarEntryResource;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This dialog will let client to select resources that located on a
- * IJavaProject classpath, the client can provide a list of files suffixs to
- * filter.
- * 
- * @author mengbo
- */
-// TODO: Since many jar files might do nothing to do with client's selection, we
-// may need to provides more filter choice
-// to clients to exclude unnecessary jar files, such as that are located in JDK
-// dir.
-public class ResourceOnClasspathDialog extends TreeViewerSelectionDialog {
-	// ResourcesOnClasspathDialog.statusMessage = Please select a property file
-	private static final String STATUS_MESSAGE = JSFUICommonPlugin
-			.getResourceString("Dialog.ResourceOnClasspathDialog.StatusMessage"); //$NON-NLS-1$
-
-	private IJavaProject _javaProject;
-
-	// the suffixs of files that can be selected
-	private String _suffixs[];
-
-	// IJMTConstants.DEFAULT_SUFFIX;
-
-	private ResourceOnClasspathFilter _filter;
-
-	// Client doesn't need to know it.
-	class ResourceOnClasspathFilter extends ViewerFilter {
-		StandardJavaElementContentProvider _javaContentProvider;
-
-		/**
-		 * @param contentProvider
-		 */
-		public ResourceOnClasspathFilter(
-				StandardJavaElementContentProvider contentProvider) {
-			_javaContentProvider = contentProvider;
-		}
-
-		/**
-		 * Set the suffixs of files need to be selected.
-		 * 
-		 * @param suffixs
-		 */
-		public void setSuffixs(String suffixs[]) {
-			_suffixs = suffixs;
-		}
-
-		/**
-		 * @param contentProvider
-		 *            The _javaContentProvider to set.
-		 */
-		public void setJavaContentProvider(
-				StandardJavaElementContentProvider contentProvider) {
-			_javaContentProvider = contentProvider;
-		}
-
-		/**
-		 * @param project
-		 *            The _javaProject to set.
-		 */
-		public void setJavaProject(IJavaProject project) {
-			_javaProject = project;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			// TODO: This logic can be improved by add caching mechanism
-			if (element instanceof IJavaProject) {
-				String currentProjectName = ((IJavaProject) element)
-						.getProject().getFullPath().toString().trim();
-				String projectName = _javaProject.getProject().getFullPath()
-						.toString().trim();
-				if (projectName.equalsIgnoreCase(currentProjectName)) {
-					return true;
-				}
-                return false;
-			} else if (element instanceof IResource) {
-				if (((_javaProject != null) && !_javaProject
-						.isOnClasspath((IResource) element))) {
-					return false;
-				}
-				if (element instanceof IFile) {
-					if (Arrays.asList(_suffixs).contains(
-							((IFile) element).getFileExtension())) {
-						return true;
-					}
-				}
-				return false;
-			}
-
-			if (element instanceof IJarEntryResource) {
-				String ext = ((IJarEntryResource) element).getFullPath()
-						.getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				}
-                return false;
-			}
-			if (!(element instanceof IJavaElement)) {
-				return false;
-			}
-			if (((_javaProject != null) && !_javaProject
-					.isOnClasspath((IJavaElement) element))) {
-				return false;
-			}
-			IJavaElement javaElement = (IJavaElement) element;
-			Object[] children = null;
-			switch (javaElement.getElementType()) {
-			case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.IMPORT_CONTAINER:
-				return true;
-			case IJavaElement.PACKAGE_FRAGMENT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.CLASS_FILE:
-				if (Arrays.asList(_suffixs).contains(
-						IFileFolderConstants.EXT_CLASS)) {
-					return true;
-				} 
-                return false;
-			case IJavaElement.COMPILATION_UNIT:
-				String ext = javaElement.getPath().getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				} 
-                return false;
-			default:
-				return false;
-			}
-
-			for (int i = 0; i < children.length; i++) {
-				if (select(viewer, javaElement, children[i])) {
-					return true;
-				}
-			}
-			// Either the resouce or its children are not for displaying.
-			return false;
-		}
-	}
-
-	/**
-	 * Set the suffixs of files need to be selected.
-	 * 
-	 * @param suffixs
-	 */
-	public void setSuffixs(String suffixs[]) {
-		_suffixs = suffixs;
-		_filter.setSuffixs(suffixs);
-	}
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 */
-	public ResourceOnClasspathDialog(Shell parentShell, IJavaProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		// set provider and filter
-		StandardJavaElementContentProvider contentProvider = new StandardJavaElementContentProvider();
-		setContentProvider(contentProvider);
-		setLabelProvider(new JavaElementLabelProvider());
-		_filter = new ResourceOnClasspathFilter(contentProvider);
-		setFilter(_filter);
-		// store the project
-		_javaProject = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		IPath path = PathUtil.getPathOnClasspath(_javaProject, objects[0]);
-		String result = null;
-		if (path.segmentCount() == 0) {
-			return new Object[] { "" }; //$NON-NLS-1$
-		}
-		path = path.removeFileExtension();
-		result = path.toOSString();
-		result = result.replace(File.separatorChar, '.');
-		return new Object[] { result };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection()
-	 */
-	protected boolean isValidSelection(Object selection) {
-		String extension = PathUtil.getPathOnClasspath(_javaProject, selection)
-				.getFileExtension();
-		return (extension != null && Arrays.asList(_suffixs).contains(extension));
-	}
-
-	protected Object findInputElement() {
-		Object input = ResourcesPlugin.getWorkspace();
-		if (input instanceof IWorkspace) {
-			return JavaCore.create(((IWorkspace) input).getRoot());
-		} else if (input instanceof IContainer) {
-			IJavaElement element = JavaCore.create((IContainer) input);
-			if (element != null && element.exists()) {
-				return element;
-			}
-			return input;
-		}
-        return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/TreeViewerSelectionDialog.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/TreeViewerSelectionDialog.java
deleted file mode 100644
index 3214dbd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/dialogs/TreeViewerSelectionDialog.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.dialogs;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.part.DrillDownComposite;
-
-/**
- * This is a base dialog that uses TreeViewer to show selections, subclass needs
- * to provide IContentProvider, ILabelProvider and ViewerFilter for the
- * TreeViewer. Subclass needs to implement isValidSelection(), which valids the
- * selection, and findInputElement() which provides the root element of the
- * tree. Besides, subclass might need to implement getResult() to return a
- * customized result.
- * 
- * @author mengbo
- * 
- */
-public abstract class TreeViewerSelectionDialog extends SelectionDialog {
-	private static final String DEFAULT_TITLE = JSFUICommonPlugin
-			.getResourceString("Dialog.TreeViewerSelectionDialog.DefaultTitle"); //$NON-NLS-1$
-
-	/** Used to tag the image type */
-	public static final int STYLE_NONE = 0;
-
-	private static final int STYLE_INFORMATION = 1;
-
-	private static final int STYLE_ERROR = 2;
-
-	private static final int STYLE_WARNING = 3;
-
-	/** Sizi of the TreeViewer composite */
-	private static final int SIZING_SELECTION_PANE_HEIGHT = 300;
-
-	private static final int SIZING_SELECTION_PANE_WIDTH = 320;
-
-	private String _title = DEFAULT_TITLE;
-
-	// the seleciton on the treeviewer.
-	private static Object[] _selection;
-
-	// providers
-	private ITreeContentProvider _contentProvider;
-
-	private ILabelProvider _labelProvider;
-
-	private ViewerFilter _filter;
-
-	/** The validation image */
-	private Label _statusImage;
-
-	/** The validation message */
-	private Label _statusLabel;
-
-	private String _statusMessage;
-
-	/** The selection tree */
-	private TreeViewer _treeViewer;
-
-	private int _style;
-
-	private ViewerSorter _viewerSorter = null;
-	private ViewerComparator _viewerComparator = null;
-	/**
-	 * @param parentShell
-	 * @param statusMessage 
-	 * @param style 
-	 */
-	public TreeViewerSelectionDialog(Shell parentShell, String statusMessage,
-			int style) {
-		super(parentShell);
-		_statusMessage = statusMessage;
-		_style = style;
-		setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.BORDER
-				| SWT.APPLICATION_MODAL | SWT.RESIZE);
-	}
-
-	/**
-	 * Convenience for TreeViewerSelectionDialog(parentShell, statusMessage, SWT.NONE)
-	 * 
-	 * @param parentShell
-	 * @param statusMessage
-	 */
-	public TreeViewerSelectionDialog(Shell parentShell, String statusMessage) {
-		this(parentShell, statusMessage, SWT.NONE);
-	}
-
-	public void setTitle(String title) {
-		super.setTitle(title);
-		_title = title;
-	}
-
-	/**
-	 * Returns a new drill down viewer for this dialog.
-	 * @param parent 
-	 */
-	protected void createTreeViewer(Composite parent) {
-		// Create drill down
-		DrillDownComposite drillDown = new DrillDownComposite(parent,
-				SWT.BORDER);
-		GridData spec = new GridData(GridData.FILL_BOTH);
-		spec.widthHint = SIZING_SELECTION_PANE_WIDTH;
-		spec.heightHint = SIZING_SELECTION_PANE_HEIGHT;
-		drillDown.setLayoutData(spec);
-		_treeViewer = new TreeViewer(drillDown, _style);
-		drillDown.setChildTree(_treeViewer);
-	}
-
-	private void setTreeViewerProviders() {
-		_treeViewer.setContentProvider(_contentProvider);
-		_treeViewer.setLabelProvider(_labelProvider);
-		if (_viewerSorter == null) {
-			_viewerSorter = new ViewerSorter();
-		}
-		_treeViewer.setSorter(_viewerSorter);
-		
-		// override if not null.. setSorter is discouraged.
-		if (_viewerComparator != null)
-		{
-		    _treeViewer.setComparator(_viewerComparator);
-		}
-		_treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						_selection = getSelectedElements((IStructuredSelection) event
-								.getSelection());
-						updateStatus();
-					}
-				});
-		_treeViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				ISelection selection = event.getSelection();
-				if (selection instanceof IStructuredSelection) {
-					Object item = ((IStructuredSelection) selection)
-							.getFirstElement();
-					if (item instanceof IFile) {
-						okPressed();
-					} else if (_treeViewer.getExpandedState(item)) {
-						_treeViewer.collapseToLevel(item, 1);
-					} else {
-						_treeViewer.expandToLevel(item, 1);
-					}
-				}
-			}
-		});
-		_treeViewer.setInput(findInputElement());
-
-		if (_filter != null) {
-			_treeViewer.addFilter(_filter);
-		}
-	}
-
-	/**
-	 * Creates the contents of the composite.
-	 * @param parent 
-	 */
-	protected void createTreeViewerComposite(Composite parent) {
-		Composite treeViewerComposite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		treeViewerComposite.setLayout(layout);
-
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		treeViewerComposite.setLayoutData(gridData);
-		Label label = new Label(treeViewerComposite, SWT.WRAP);
-		label.setText(_title);
-		label.setFont(treeViewerComposite.getFont());
-		createTreeViewer(treeViewerComposite);
-		Dialog.applyDialogFont(treeViewerComposite);
-	}
-
-	/**
-	 * Sets the selected existing container.
-	 * @param selection 
-	 */
-	public void setSelectedElement(Object[] selection) {
-		// Expand to and select the specified container
-		if (selection == null) {
-			return;
-		}
-
-		for (int i = 0; i < selection.length; i++) {
-			if (_selection[i] != null) {
-				_treeViewer.expandToLevel(_selection[i], 1);
-
-			}
-		}
-		_treeViewer.setSelection(new StructuredSelection(selection), true);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite area = (Composite) super.createDialogArea(parent);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		area.setLayout(gridLayout);
-
-		// Container treeviewer composite
-		createTreeViewerComposite(area);
-
-		_statusImage = createLabel(area);
-		_statusImage.setImage(getMessageImage(STYLE_ERROR));
-		_statusLabel = createLabel(area);
-		// Link to model
-		setTreeViewerProviders();
-
-		return dialogArea;
-	}
-
-	private Label createLabel(Composite parent) {
-		Label label = new Label(parent, SWT.LEFT);
-		GridData data = new GridData();
-		data.horizontalSpan = 1;
-		data.horizontalAlignment = GridData.FILL;
-		label.setLayoutData(data);
-		label.setText(_statusMessage == null ? "" : _statusMessage); //$NON-NLS-1$
-		return label;
-	}
-
-	private Object[] getSelectedElements(IStructuredSelection selection) {
-		return selection.toArray();
-	}
-
-	/**
-	 * @param provider
-	 *            The _contentProvider to set.
-	 */
-	public void setContentProvider(ITreeContentProvider provider) {
-		_contentProvider = provider;
-	}
-
-	/**
-	 * @param provider
-	 *            The _labelProvider to set.
-	 */
-	public void setLabelProvider(ILabelProvider provider) {
-		_labelProvider = provider;
-	}
-
-	/**
-	 * @param filter
-	 *            The _filter to set.
-	 */
-	public void setFilter(ViewerFilter filter) {
-		this._filter = filter;
-	}
-
-	/**
-	 * @param sorter
-	 *            The _viewerSorter to set.
-	 */
-	public void setViewerSorter(ViewerSorter sorter) {
-		_viewerSorter = sorter;
-	}
-
-	/**
-	 * Set the viewer comparator.  If not null, it's set after after the
-	 * viewer sorter and thus overrides it.
-	 * 
-	 * @param viewerComparator
-	 */
-	public void setViewerComparator(ViewerComparator viewerComparator)
-    {
-        _viewerComparator = viewerComparator;
-    }
-
-    /**
-	 * @param message
-	 */
-	public void setStatusMessage(String message) {
-		_statusMessage = message;
-	}
-
-	/**
-	 * Update the status message
-	 */
-	private void updateStatus() {
-		Object selection = _selection;
-		if (_selection != null && _selection.length == 1) {
-			selection = _selection[0];
-		}
-		if (isValidSelection(selection)) {
-			_statusImage.setVisible(false);
-			_statusLabel.setText(""); //$NON-NLS-1$
-			getOkButton().setEnabled(true);
-		} else {
-			_statusImage.setVisible(true);
-			_statusImage.setImage(getMessageImage(STYLE_ERROR));
-			_statusImage.redraw();
-			_statusLabel.setText(_statusMessage);
-			getOkButton().setEnabled(false);
-		}
-
-	}
-
-	/**
-	 * Get the different message according the message type.
-	 * @param imageType 
-	 * 
-	 * @return Image - the message image
-	 */
-	protected Image getMessageImage(int imageType) {
-		switch (imageType) {
-		case STYLE_ERROR:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
-		case STYLE_WARNING:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING);
-		case STYLE_INFORMATION:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
-		default:
-			return null;
-		}
-	}
-
-	/**
-	 * The <code>ContainerSelectionDialog</code> implementation of this
-	 * <code>Dialog</code> method builds a list of the selected resource
-	 * containers for later retrieval by the client and closes this dialog.
-	 */
-	protected void okPressed() {
-		List chosenContainerPathList = new ArrayList();
-		if (_selection != null) {
-			chosenContainerPathList.addAll(Arrays.asList(_selection));
-		}
-		setResult(chosenContainerPathList);
-		super.okPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Control control = super.createContents(parent);
-		if (_selection != null) {
-			this.setSelectedElement(_selection);
-		}
-		return control;
-	}
-
-	/**
-	 * @param selection
-	 * @return true if selection is valid
-	 */
-	protected abstract boolean isValidSelection(Object selection);
-
-	/**
-	 * Used to set the input element on the tree viewer
-	 * @return the input element
-	 */
-	protected abstract Object findInputElement();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractDetailsForm.java
deleted file mode 100644
index 887d57f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractDetailsForm.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.form;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * The parent of all detail forms.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDetailsForm
-{
-    private FormToolkit _toolkit;
-
-    /**
-     * 
-     */
-    protected AbstractDetailsForm()
-    {
-        super();
-    }
-
-    /**
-     * Called to refresh model if stale
-     */
-    public void refresh()
-    {
-        // do nothing by default
-    }
-
-    /**
-     * Called before createContents.
-     * 
-     * @param toolkit
-     */
-    public final void initialize(final FormToolkit toolkit)
-    {
-        _toolkit = toolkit;
-        doInitialize();
-    }
-    
-    /**
-     * Override to customize initialization.  getToolkit() is safe to call
-     * from this method.  You should not make other state assumptions.
-     */
-    protected void doInitialize()
-    {
-        // do nothing by default; 
-    }
-    
-    /**
-     * Callled by MasterDetailBlock during it's dispose
-     */
-    public abstract void dispose();
-
-    /**
-     * @param onSave
-     */
-    public abstract void commit(boolean onSave);
-
-    /**
-     * Called on this details form before it is shown, when it becomes active
-     * due to a matching selection change in the master form.  Implementer
-     * should use newSelection as the new instance of their model and 
-     * reinitialize UI as appropriate.
-     * @param newSelection
-     */
-    protected abstract void doUpdateSelection(final Object newSelection);
-
-    /**
-     * @return the contents control.  Must not be called before createContents.
-     */
-    public abstract Control getControl();
-
-    /**
-     * Fired to indicate that this detail form is now selected based on the
-     * master form selected.
-     * 
-     * @param selection
-     */
-    public void selectionChanged(final ISelection selection)
-    {
-        // by default, get the first element of the selection if there is
-        // one and call doUpdateSelection on it.  Sub-classes may change
-        // this behaviour
-        if (selection instanceof IStructuredSelection)
-        {
-            final Object selectionObj = ((IStructuredSelection) selection)
-                    .getFirstElement();
-            doUpdateSelection(selectionObj);
-        }
-    }
-
-    /**
-     * Create the contents of the detail form using 'parent'.  Should not be
-     * called before initialize.
-     * 
-     * @param parent
-     */
-    public abstract void createContents(Composite parent);
-
-    /**
-     * @return the form toolkit in use.  Should not be called before 
-     * initialize.
-     */
-    protected final FormToolkit getToolkit()
-    {
-        return _toolkit;
-    }
-
-    /**
-     * @return true if the form is dirty
-     */
-    public boolean isDirty()
-    {
-        // never dirty by default
-        return false;
-    }
-
-    /**
-     * @return true if form is stale
-     */
-    public boolean isStale()
-    {
-        // always stale by default
-        return true;
-    }
-
-    /**
-     * Called to set focus on the detail form's control
-     */
-    public abstract void setFocus();
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterDetailBlock.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterDetailBlock.java
deleted file mode 100644
index 7141dcb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterDetailBlock.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.form;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.StackLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.Form;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * An alternative to MasterDetailBlock that doesn't use the ScrolledForm
- * that causes problems as described here:
- * 
- * http://dev.eclipse.org/newslists/news.eclipse.platform/msg73145.html
-
- * @author cbateman
- *
- */
-public abstract class AbstractMasterDetailBlock implements
-        ISelectionChangedListener
-{
-    private AbstractMasterForm        _masterForm;
-    private Composite                 _detailsPanel;
-    private AbstractDetailsForm       _curPage;
-    private FormToolkit               _toolkit;
-    private StackLayout               _detailLayout;
-    private List<AbstractDetailsForm> _detailForms;
-    private BlankDetailsForm          _blankDetails;
-
-    /**
-     * 
-     */
-    protected AbstractMasterDetailBlock()
-    {
-        super();
-    }
-
-    /**
-     * Disposes the master detail form
-     */
-    public final void dispose()
-    {
-        _masterForm.dispose();
-
-        for (final AbstractDetailsForm detailsForm : _detailForms)
-        {
-            detailsForm.dispose();
-        }
-
-        doDispose();
-    }
-
-    /**
-     * Override to get custom dispose logic. Do not use this to dispose of
-     * master or details forms. This is done automatically for you before
-     * doDispose is called.
-     */
-    protected void doDispose()
-    {
-        // do nothing by default
-    }
-
-    /**
-     * @param toolkit
-     * @param form
-     */
-    public final void createContent(final FormToolkit toolkit, final Form form)
-    {
-        _toolkit = toolkit;
-
-        final GridLayout layout = new GridLayout();
-        layout.marginWidth = 5;
-        layout.marginHeight = 5;
-        form.getBody().setLayout(layout);
-        final SashForm sashForm = new SashForm(form.getBody(), SWT.NULL);
-        // sashForm.setData("form", managedForm); //$NON-NLS-1$
-        _toolkit.adapt(sashForm, false, false);
-        sashForm.setMenu(form.getBody().getMenu());
-        sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-        initializeMasterPart(_toolkit, sashForm);
-        createDetailsPart(sashForm);
-
-        _masterForm.createHead(form);
-        createToolBarActions(form);
-        form.updateToolBar();
-    }
-
-    /**
-     * @param toolkit
-     * @return the master form.
-     */
-    protected abstract AbstractMasterForm createMasterPart(
-            final FormToolkit toolkit);
-
-    private void initializeMasterPart(final FormToolkit toolkit,
-            final Composite parent)
-    {
-        _masterForm = createMasterPart(toolkit);
-        _masterForm.initialize(this);
-        _masterForm.createClientArea(parent);
-    }
-
-    private void createToolBarActions(final Form form)
-    {
-        _masterForm.contributeActions(form.getToolBarManager());
-    }
-
-    private void createDetailsPart(final Composite parent)
-    {
-        _detailsPanel = new Composite(parent, SWT.NONE);
-        _detailLayout = new StackLayout();
-        _detailsPanel.setLayout(_detailLayout);
-
-        _detailForms = createDetailPages();
-
-        for (final AbstractDetailsForm detailForm : _detailForms)
-        {
-            detailForm.initialize(_toolkit);
-            detailForm.createContents(_detailsPanel);
-        }
-
-        // create default blank page
-        _blankDetails = new BlankDetailsForm();
-        _blankDetails.initialize(_toolkit);
-        _blankDetails.createContents(_detailsPanel);
-
-        _curPage = _blankDetails;
-        _detailLayout.topControl = _curPage.getControl();
-        _detailsPanel.layout();
-    }
-
-    public final void selectionChanged(final SelectionChangedEvent event)
-    {
-        final Object selectedObj = ((IStructuredSelection) event.getSelection())
-                .getFirstElement();
-        final AbstractDetailsForm page = selectPage(selectedObj);
-        if (page != null)
-        {
-            final AbstractDetailsForm fpage = page;
-            BusyIndicator.showWhile(_detailsPanel.getDisplay(), new Runnable()
-            {
-                public void run()
-                {
-                    final AbstractDetailsForm oldPage = _curPage;
-                    _curPage = fpage;
-                    // commit the current page
-                    if (oldPage != null && oldPage.isDirty())
-                    {
-                        oldPage.commit(false);
-                    }
-                    // refresh the new page
-                    if (fpage.isStale())
-                    {
-                        fpage.refresh();
-                    }
-                    _curPage.selectionChanged(event.getSelection());
-                    // _pageBook.showPage(_curPage.getTextSection().getControl());
-                    _detailLayout.topControl = _curPage.getControl();
-                    _detailsPanel.layout();
-                }
-            });
-        }
-    }
-
-    /**
-     * @return a list of detail forms
-     */
-    protected abstract List<AbstractDetailsForm> createDetailPages();
-
-    /**
-     * @param forModel
-     * @return the details form for 'forModel'. If implementer returns null,
-     *         then a blank page will be provided
-     */
-    protected abstract AbstractDetailsForm doSelectPage(final Object forModel);
-
-    private AbstractDetailsForm selectPage(final Object forModel)
-    {
-        final AbstractDetailsForm clientForm = doSelectPage(forModel);
-
-        if (clientForm != null)
-        {
-            return clientForm;
-        }
-        return _blankDetails;
-    }
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterForm.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterForm.java
deleted file mode 100644
index 46ec864..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractMasterForm.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.form;
-
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.ui.forms.widgets.Form;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractMasterForm
-{
-
-    private final FormToolkit         _toolkit;
-    private ISelectionChangedListener _listener;
-    private ToolBarManager            _toolBarManager;
-
-    /**
-     * @param toolkit
-     */
-    protected AbstractMasterForm(FormToolkit toolkit)
-    {
-        super();
-        _toolkit = toolkit;
-    }
-
-    /**
-     * @param listener
-     *            the selection listener that is signalled to indicate the
-     *            selection in the master has changed and the detail should be
-     *            updated.
-     */
-    public final void initialize(final ISelectionChangedListener listener)
-    {
-        _listener = listener;
-        doInitialize();
-    }
-
-    /**
-     * It is safe to call getListener() and get getToolkit() in this method. All
-     * other methods should be considered unavailable.
-     */
-    protected void doInitialize()
-    {
-        // do nothing by default; override to do customize init
-    }
-
-    /**
-     * @param parent
-     * @return the client area for the master form, using parent is the parent
-     * control.
-     */
-    public abstract Control createClientArea(final Composite parent);
-
-    /**
-     * @param form
-     */
-    public final void createHead(final Form form)
-    {
-        final Composite head = form.getHead();
-        final Composite container = getToolkit().createComposite(head);
-        container.setLayout(new RowLayout());
-
-        // sub-class contribution
-        contributeToHeadArea(getToolkit(), container);
-
-        _toolBarManager = new ToolBarManager(SWT.FLAT);
-        ToolBar toolbar = _toolBarManager.createControl(container);
-        // _toolkit.adapt(toolbar, false, false);
-
-        toolbar.setBackground(form.getHead().getBackground());
-        toolbar.setForeground(form.getHead().getForeground());
-        //toolbar.setCursor(FormsResources.getHandCursor());
-        container.addDisposeListener(new DisposeListener()
-        {
-            public void widgetDisposed(DisposeEvent e)
-            {
-                if (_toolBarManager != null)
-                {
-                    _toolBarManager.dispose();
-                    _toolBarManager = null;
-                }
-            }
-        });
-
-        form.setHeadClient(container);
-
-    }
-
-    /**
-     * Override to add client area before the toolbar.
-     * 
-     * @param toolkit
-     * @param container
-     */
-    protected void contributeToHeadArea(FormToolkit toolkit, Composite container)
-    {
-        // do nothing by default
-    }
-
-    /**
-     * @param formManager
-     */
-    public final void contributeActions(final IToolBarManager formManager)
-    {
-        contributeActions(formManager, _toolBarManager);
-    }
-
-    /**
-     * @param formManager
-     *            adds to the toolkit's toolbar
-     * @param localManager
-     *            adds to AbstractMasterForm's toolbar.
-     */
-    protected void contributeActions(final IToolBarManager formManager,
-            final IToolBarManager localManager)
-    {
-        // do nothing by default. Override to add actions.
-    }
-
-    /**
-     * Should be called at any time after initialize and createContents when the
-     * owner is finished with the master-detail form block.
-     */
-    public void dispose()
-    {
-        // do nothing by default;
-    }
-
-    /**
-     * @return the tool kit in use.
-     */
-    protected final FormToolkit getToolkit()
-    {
-        return _toolkit;
-    }
-
-    /**
-     * @return the selection listener
-     */
-    protected final ISelectionChangedListener getListener()
-    {
-        return _listener;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractXMLSectionsDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractXMLSectionsDetailsForm.java
deleted file mode 100644
index 902ec7e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/AbstractXMLSectionsDetailsForm.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.form;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowData;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * A detail form that uses XML text sections.
- * 
- * @author cbateman
- * 
- */
-public abstract class AbstractXMLSectionsDetailsForm extends
-        AbstractDetailsForm
-{
-    private Map<Object, XMLTextSection> _textSections;
-    private Composite                   _detailFormComposite;
-
-    /**
-     * @param parent
-     */
-    @Override
-    public final void createContents(final Composite parent)
-    {
-        _detailFormComposite = getToolkit().createComposite(parent, SWT.NONE);
-        final RowLayout rowLayout = new RowLayout(SWT.VERTICAL);
-        rowLayout.fill = true;
-        _detailFormComposite.setLayout(rowLayout);
-        // take a copy of what's returned so the sub-class can't control
-        // the map reference
-        _textSections = Collections
-                .unmodifiableMap(new HashMap<Object, XMLTextSection>(
-                        createXMLTextSections(_detailFormComposite)));
-
-        final Set<XMLTextSection> expandedSections = getInitiallyExpanded(_textSections);
-        for (final Map.Entry<? extends Object, XMLTextSection> entry : _textSections
-                .entrySet())
-        {
-            final XMLTextSection section = entry.getValue();
-            if (expandedSections.contains(section))
-            {
-                section._section.setExpanded(true);
-            }
-        }
-    }
-
-    /**
-     * @param parent
-     *            the parent that should be used for all XMLTextSections
-     * @return a map keyed by an object type understood by the sub-class
-     *         containing as values the XMLTextSections
-     */
-    protected abstract Map<? extends Object, XMLTextSection> createXMLTextSections(
-            final Composite parent);
-
-    /**
-     * @param sections
-     * @return the subset of XMLTextSections in the provided map that are to be
-     *         expanded. NOTE: all elements in the returned set must be in
-     *         sections.getValues.
-     */
-    protected abstract Set<XMLTextSection> getInitiallyExpanded(
-            final Map<Object, XMLTextSection> sections);
-
-    /**
-     * @return the control for this form
-     */
-    @Override
-    public Control getControl()
-    {
-        return _detailFormComposite;
-    }
-
-    /**
-     * @param selection
-     */
-    public final void selectionChanged(final ISelection selection)
-    {
-        if (selection instanceof IStructuredSelection)
-        {
-            final Object selectionObj = ((IStructuredSelection) selection)
-                    .getFirstElement();
-            doUpdateSelection(selectionObj);
-        }
-    }
-
-    @Override
-    public void commit(final boolean onSave)
-    {
-        // do nothing
-    }
-
-    @Override
-    public void dispose()
-    {
-        // do nothing
-    }
-
-    @Override
-    public void setFocus()
-    {
-        // do nothing; sub-classes should override to pick an XMLTextSection
-        // where they want focus.
-    }
-
-    /**
-     * An XML text section
-     * 
-     */
-    protected final static class XMLTextSection
-    {
-        private final Section _section;
-        private FormText      _formText;
-
-        /**
-         * @param toolkit
-         * @param parent
-         * @param title
-         */
-        public XMLTextSection(final FormToolkit toolkit,
-                final Composite parent, final String title)
-        {
-            _section = toolkit.createSection(parent,
-                    ExpandableComposite.TREE_NODE
-                            | ExpandableComposite.CLIENT_INDENT);
-            _section.setLayoutData(new RowData());
-            _section.setText(title);
-
-            _formText = toolkit.createFormText(_section, true);
-            _formText.setText("", false, false); //$NON-NLS-1$
-
-            _section.setClient(_formText);
-        }
-
-        /**
-         * @param text
-         * @param parseTags
-         * @param expandURLs
-         */
-        public void setText(final String text, final boolean parseTags,
-                final boolean expandURLs)
-        {
-            _formText.setText(text, parseTags, expandURLs);
-        }
-
-        /**
-         * @return the parent control.
-         */
-        public Control getControl()
-        {
-            return _section;
-        }
-
-        /**
-         * Force a visual relayout and update.
-         */
-        public void refresh()
-        {
-            _section.getParent().layout(true, true);
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/BlankDetailsForm.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/BlankDetailsForm.java
deleted file mode 100644
index 7678b03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/form/BlankDetailsForm.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.form;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A blank details form.
- * 
- * @author cbateman
- * 
- */
-public final class BlankDetailsForm extends AbstractDetailsForm
-{
-    private Composite _emptyPanel;
-
-    @Override
-    public void createContents(Composite parent)
-    {
-        _emptyPanel = getToolkit().createComposite(parent);
-    }
-
-    @Override
-    public Control getControl()
-    {
-        return _emptyPanel;
-    }
-
-    @Override
-    protected void doUpdateSelection(Object newSelection)
-    {
-        // do nothing
-    }
-
-    @Override
-    public void commit(boolean onSave)
-    {
-        // nothing to commit
-    }
-
-    @Override
-    public void dispose()
-    {
-       // nothing to dispose
-    }
-
-    @Override
-    public void setFocus()
-    {
-        // don't bother changing focus
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Alerts.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Alerts.java
deleted file mode 100644
index 54c3a27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Alerts.java
+++ /dev/null
@@ -1,837 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * This class will provide UI alert dialogs to the user. These will
- * automatically get the message from the plugin's resource bundle.
- * 
- * NOTE: there are some generic exception methods included in this file. They
- * need resource bundles also, and they make the alerts bettern when the
- * exception is caught at a later stage.
- * 
- * @author mengbo
- */
-public class Alerts {
-	// this is used for junit testing to turn off all alerts and return the
-	// default on yes/no dialogs.
-	private static boolean _noAlerts = false;
-
-	private ResourceBundle _rb;
-
-	private String _pluginId;
-
-	/**
-	 * Construct a alerts with the provided attributes. This constructor should
-	 * be used from the root plugin that has access to the resource bundle for
-	 * this plugin.
-	 * 
-	 * @param plugin 
-	 * @param rb
-	 *            the resource bundle to use.
-	 */
-	public Alerts(AbstractUIPlugin plugin, ResourceBundle rb) {
-		_rb = rb;
-		if (_rb == null) {
-			throw new NullPointerException(
-					"No resource bundle was provided to the Alerts."); //$NON-NLS-1$
-		}
-		if (plugin == null) {
-			throw new NullPointerException(
-					"No plugin was provided to the Alerts."); //$NON-NLS-1$
-		}
-		_pluginId = plugin.getBundle().getSymbolicName();
-	}
-
-	/**
-	 * Returns the text entered by a user in a simple request dialog.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param initialValue -
-	 *            initial value in the text area.
-	 * @param validator -
-	 *            something that checks for validity on the name.
-	 * @return null is returned if the user hits cancel, otherwise it is the
-	 *         text they entered.
-	 */
-	public String getInput(String titleKey, String msgKey, String initialValue,
-			IInputValidator validator) {
-		if (_noAlerts) {
-			return null;
-		}
-
-		InputDialog inDialog = new InputDialog(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey),
-				initialValue, validator);
-		inDialog.open();
-		return inDialog.getValue();
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void error(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0, Object arg1) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg2 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0, Object arg1,
-			Object arg2) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[3];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg2 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg3 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void error(String titleKey, String msgKey, Object arg0, Object arg1,
-			Object arg2, Object arg3) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[4];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-		args[3] = arg3;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openError(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an Error message to the user.
-	 * 
-	 * @param shell -
-	 *            the shell for the error dialog
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void error(Shell shell, String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openError(shell, getResourceString(titleKey),
-				getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void detailError(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		final IStatus fstatus = new Status(IStatus.ERROR, _pluginId,
-				IStatus.OK, getResourceString(msgKey), null);
-		final String ftitle = getResourceString(titleKey);
-
-		Display display = getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(null, ftitle, null, fstatus);
-			}
-		});
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param tt -
-	 *            exception to place in the details.
-	 */
-	public void detailError(String titleKey, String msgKey, Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		internalDetailError(getResourceString(titleKey),
-				getResourceString(msgKey), tt);
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param tt -
-	 *            exception to place in the details.
-	 */
-	public void detailError(String titleKey, String msgKey, Object arg0,
-			Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		internalDetailError(getResourceString(titleKey),
-				formatter.format(args), tt);
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param tt -
-	 *            exception to place in the details.
-	 */
-	public void detailError(String titleKey, String msgKey, Object arg0,
-			Object arg1, Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		internalDetailError(getResourceString(titleKey),
-				formatter.format(args), tt);
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param title -
-	 *            the title message
-	 * @param message -
-	 *            message displayed to the user
-	 */
-	private void internalDetailError(String title, String msg, Throwable tt) {
-		if (_noAlerts) {
-			return;
-		}
-
-		if (tt instanceof InvocationTargetException) {
-			tt = ((InvocationTargetException) tt).getTargetException();
-		}
-
-		IStatus status = null;
-		if (tt instanceof CoreException) {
-			status = ((CoreException) tt).getStatus();
-
-			if ((status instanceof MultiStatus) == false) {
-				// convert to a multistatus to show the exception details.
-
-				Throwable th = status.getException();
-				if (th == null) {
-					th = tt;
-				}
-
-				status = buildStackTraceStatus(IStatus.ERROR, status
-						.getPlugin(), status.getMessage(), th);
-			}
-		} else {
-			status = buildStackTraceStatus(IStatus.ERROR, _pluginId, tt
-					.getMessage(), tt);
-		}
-
-		final String ftitle = title;
-		final IStatus fstatus = status;
-		final String fmsg = msg;
-		Display display = getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(null, ftitle, fmsg, fstatus);
-			}
-		});
-	}
-
-	/**
-	 * Builds a multistatus, so that the stack trace shows up in the alery
-	 * message for detailed alerts.
-	 * 
-	 * @param code
-	 * @param pluginId
-	 * @param message
-	 * @param tt
-	 * @return the result of the operation
-	 */
-	public IStatus buildStackTraceStatus(int code, String pluginId,
-			String message, Throwable tt) {
-		if (tt == null) {
-			return new Status(code, pluginId, IStatus.OK, message, tt);
-		}
-
-		MultiStatus mstat = new MultiStatus(pluginId, code, message, tt);
-
-		StackTraceElement[] trace = tt.getStackTrace();
-
-		mstat.add(new Status(code, pluginId, IStatus.OK, tt.toString(), null));
-		for (int ii = 0; ii < trace.length; ii++) {
-			mstat.add(new Status(code, pluginId, IStatus.OK, trace[ii]
-					.toString(), null));
-		}
-		return mstat;
-	}
-
-	/**
-	 * Displays an Error message to the user with a status using the Display
-	 * background thread. This will give the details button.
-	 * 
-	 * @param status -
-	 *            the status
-	 * @param title -
-	 *            the title of the message
-	 */
-	public void detailError(String title, IStatus status) {
-		if (_noAlerts) {
-			return;
-		}
-
-		final IStatus fstatus = status;
-		final String ftitle = title;
-		Display display = getStandardDisplay();
-		display.asyncExec(new Runnable() {
-			public void run() {
-				ErrorDialog.openError(null, ftitle, null, fstatus);
-			}
-		});
-	}
-
-	/**
-	 * Displays an information message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void info(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openInformation(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an information message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void info(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openInformation(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an confirmation message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @return true if the user presses the OK button, false otherwise
-	 */
-	public boolean confirm(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		return MessageDialog.openConfirm(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an confirmation message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @return true if the user presses the OK button, false otherwise
-	 */
-	public boolean confirm(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		return MessageDialog.openConfirm(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an question message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @return true if the user presses the "yes" button, false otherwise
-	 */
-	public boolean question(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		return MessageDialog.openQuestion(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an question message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @return true if the user presses the "yes" button, false otherwise
-	 */
-	public boolean question(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return true;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		return MessageDialog.openQuestion(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Displays an warning message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 */
-	public void warning(String titleKey, String msgKey) {
-		if (_noAlerts) {
-			return;
-		}
-
-		MessageDialog.openWarning(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), getResourceString(msgKey));
-	}
-
-	/**
-	 * Displays an warning message to the user.
-	 * 
-	 * @param titleKey -
-	 *            the title resource bundle key for the message
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 */
-	public void warning(String titleKey, String msgKey, Object arg0) {
-		if (_noAlerts) {
-			return;
-		}
-
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		MessageDialog.openWarning(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getShell(),
-				getResourceString(titleKey), formatter.format(args));
-	}
-
-	/**
-	 * Returns the standard display to be used. The method first checks, if the
-	 * thread calling this method has an associated dispaly. If so, this display
-	 * is returned. Otherwise the method returns the default display.
-	 * 
-	 * TODO: should probably use the workbench display
-	 */
-	private Display getStandardDisplay() {
-		Display display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;
-	}
-
-	/**
-	 * Returns the string from the resource bundle, or 'key' if not found.
-	 */
-	private String getResourceString(String key) {
-		if (key == null) {
-			return null;
-		}
-
-		try {
-			return _rb.getString(key);
-		} catch (MissingResourceException ee) {
-			return key;
-		}
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey) throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				getResourceString(msgKey), null);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param ee -
-	 *            the real exception.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(Throwable ee) throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK, ee
-				.getMessage(), ee);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param ee -
-	 *            the real exception.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey, Throwable ee)
-			throws CoreException {
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				getResourceString(msgKey), ee);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey, Object arg0)
-			throws CoreException {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				formatter.format(args), null);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param ee -
-	 *            the real exception.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey, Object arg0, Throwable ee)
-			throws CoreException {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				formatter.format(args), ee);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey, Object arg0, Object arg1)
-			throws CoreException {
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				formatter.format(args), null);
-		throw new CoreException(status);
-	}
-
-	/**
-	 * Throw a core exception built around the message with the correct plugin
-	 * id and resource bundle string.
-	 * 
-	 * @param msgKey -
-	 *            message resource bundle key for the message displayed to the
-	 *            user
-	 * @param arg0 -
-	 *            arg to place into the resource bundle message.
-	 * @param arg1 -
-	 *            arg to place into the resource bundle message.
-	 * @param ee -
-	 *            the real exception.
-	 * @throws CoreException
-	 */
-	public void throwCoreException(String msgKey, Object arg0, Object arg1,
-			Throwable ee) throws CoreException {
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getResourceString(msgKey));
-
-		IStatus status = new Status(IStatus.ERROR, _pluginId, IStatus.OK,
-				formatter.format(args), ee);
-		throw new CoreException(status);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/BrowserWindow.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/BrowserWindow.java
deleted file mode 100644
index 33ce9fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/BrowserWindow.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.jface.window.ApplicationWindow;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.LocationAdapter;
-import org.eclipse.swt.browser.LocationEvent;
-import org.eclipse.swt.browser.OpenWindowListener;
-import org.eclipse.swt.browser.StatusTextEvent;
-import org.eclipse.swt.browser.StatusTextListener;
-import org.eclipse.swt.browser.WindowEvent;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-
-/**
- * Brings up a browser into a separate window.
- * 
- * @author mengbo.  
- * 
- * Unused???
- */
-public class BrowserWindow extends ApplicationWindow {
-
-	private static final String RELOAD_ITEM_IMAGE_FILE = "reload_nav_16.gif"; //$NON-NLS-1$
-
-	private static final String REFRESH_ITEM_IMAGE_FILE = "refresh_nav_16.gif"; //$NON-NLS-1$
-
-	private static final String STOP_ITEM_IMAGE_FILE = "stop_nav_16.gif"; //$NON-NLS-1$
-
-	private static final String FORWARD_ITEM_IMAGE_FILE = "forward_nav_16.gif"; //$NON-NLS-1$
-
-	private static final String BACK_ITEM_IMAGE_FILE = "back_nav_16.gif"; //$NON-NLS-1$
-
-	
-	/**
-	 * Command to send to the browser.
-	 */
-	private static final int BROWSER_CMD_BACK = 1;
-
-	private static final int BROWSER_CMD_FORWARD = 2;
-
-	private static final int BROWSER_CMD_STOP = 3;
-
-	private static final int BROWSER_CMD_REFRESH = 4;
-
-	private static final int BROWSER_CMD_RELOAD = 5;
-
-	private boolean _bIncludeToolbar;
-
-	private boolean _bPopups;
-
-	private String _title;
-
-	private ScrolledComposite _scomp;
-
-	private Composite _browserComposite;
-
-	private Browser _browser;
-
-	private String _startLocation;
-
-	private String _startContent;
-
-	// these items are browser context sensitive.
-	private ToolItem _backItem;
-
-	private ToolItem _forwardItem;
-
-	/**
-	 * @param parentShell
-	 *            owner of this window.
-	 */
-	public BrowserWindow(Shell parentShell) {
-		this(parentShell, false, null, false);
-	}
-
-	/**
-	 * @param parentShell
-	 *            owner of this window.
-	 * @param bPopups
-	 *            allow popup windows?
-	 * @param title
-	 *            Tittle on window.
-	 */
-	public BrowserWindow(Shell parentShell, boolean bPopups, String title) {
-		this(parentShell, bPopups, title, false);
-	}
-
-	/**
-	 * @param parentShell
-	 *            owner of this window.
-	 * @param bPopups
-	 *            allow popup windows?
-	 * @param title
-	 *            Tittle on window.
-	 * @param bModal
-	 *            pretend to a be a dialog?
-	 */
-	public BrowserWindow(Shell parentShell, boolean bPopups, String title,
-			boolean bModal) {
-		super(parentShell);
-		addStatusLine();
-		_bPopups = bPopups;
-		_title = title;
-		includeToolbar(true);
-
-		if (bModal && (parentShell != null)) {
-			// APPLICATION_MODAL, MODELESS, PRIMARY_MODAL, SYSTEM_MODAL
-			setShellStyle(getShellStyle() | SWT.APPLICATION_MODAL);
-			setBlockOnOpen(true);
-		}
-	}
-
-	/**
-	 * Default is true, set whether to include the toolbar at the top. This must
-	 * be called before the window is opened.
-	 * 
-	 * @param bIncludeToolbar
-	 */
-	public void includeToolbar(boolean bIncludeToolbar) {
-		_bIncludeToolbar = bIncludeToolbar;
-	}
-
-	/**
-	 * @param title
-	 */
-	public void setTitle(String title) {
-		if ((title != null) && (super.getShell() != null)) {
-			super.getShell().setText(title);
-		}
-	}
-
-	/**
-	 * @param startLocation
-	 */
-	/**
-	 * @param startLocation
-	 */
-	public void setStartLocation(String startLocation) {
-		_startLocation = startLocation;
-	}
-
-	/**
-	 * @param startContent
-	 */
-	public void setStartContent(String startContent) {
-		_startContent = startContent;
-	}
-
-	/**
-	 * @return the browser object
-	 */
-	public Browser getBrowser() {
-		return _browser;
-	}
-
-	protected Control createContents(Composite parent) {
-		// Create the scroll composite as the one inside the parent.
-		_scomp = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-
-		// Create the composite that goes inside the scroller. We will use this
-		// for
-		// everything else from here.
-		Composite innerComposite = SWTUtils.createComposite(_scomp, 1, 10, -1);
-		_scomp.setContent(innerComposite);
-		ControlListener listener = new ControlAdapter() {
-			// this will handle resizing the browser when the window is resized.
-			public void controlResized(ControlEvent e) {
-				Point pt = _scomp.getParent().getSize();
-				Rectangle rect = _browserComposite.getBounds();
-
-				pt.x -= rect.x;
-				pt.y -= rect.y;
-
-				// spacing offsets in the composites.
-				pt.x -= 10;
-				pt.y -= 60; // need status bar at bottom...30 more than normal.
-
-				// do the sanity check here since it prevents further checks.
-				if ((pt.x <= 0) || (pt.y <= 0)) {
-					return;
-				}
-
-				Rectangle innerRect = _scomp.getContent().getBounds();
-				Rectangle outerRect = _scomp.getBounds();
-
-				// substract if the scroll bars are visible.
-				if (innerRect.width > outerRect.width) {
-					pt.y -= _scomp.getHorizontalBar().getSize().y;
-				}
-				if (innerRect.height > outerRect.height) {
-					pt.x -= _scomp.getVerticalBar().getSize().x;
-				}
-
-				_browserComposite.setSize(pt);
-				_browserComposite.getParent().layout(true);
-			}
-		};
-		_scomp.addControlListener(listener);
-
-		if (_bIncludeToolbar) {
-			// ////////////////////////////////////////
-			// toobar
-			// ////////////////////////////////////////
-			ToolBar tb = new ToolBar(innerComposite, SWT.HORIZONTAL | SWT.FLAT);
-			fillToolbar(tb);
-		}
-
-		// ////////////////////////////////////////
-		// browser
-		// ////////////////////////////////////////
-		_browserComposite = new Composite(innerComposite, SWT.NULL);
-		_browserComposite.setLayout(new FillLayout());
-
-		_browser = new Browser(_browserComposite, SWT.NULL);
-
-		if (_startLocation != null) {
-			_browser.setUrl(_startLocation);
-		} else if (_startContent != null) {
-			_browser.setText(_startContent);
-		} else {
-			_browser.setText(Messages.BrowserWindow_loading);
-		}
-
-		// send the browser status messages to eclipse.
-		_browser.addStatusTextListener(new StatusTextListener() {
-			public void changed(StatusTextEvent event) {
-				setStatus(event.text);
-			}
-		});
-
-		if (_bIncludeToolbar) {
-			// check for change in location so we can enable the back/forward
-			// buttons.
-			_browser.addLocationListener(new LocationAdapter() {
-				public void changed(LocationEvent event) {
-					// check if there is something in the forward or back queue.
-					_backItem.setEnabled(_browser.isBackEnabled());
-					_forwardItem.setEnabled(_browser.isForwardEnabled());
-				}
-			});
-		}
-
-		// check is we need to open a new window.
-		_browser.addOpenWindowListener(new OpenWindowListener() {
-			public void open(WindowEvent event) {
-				if (_bPopups) {
-					BrowserWindow window = new BrowserWindow(getShell());
-					window.open();
-					event.browser = window.getBrowser();
-				} else {
-					event.browser = getBrowser();
-				}
-			}
-		});
-
-		setTitle(_title);
-		SWTUtils.computeScrollArea(_scomp, innerComposite);
-		return _scomp;
-	}
-
-	/**
-	 * Fill the toolbar for this window. This method can be overwritten to place
-	 * other toolbar controls in the bar.
-	 * 
-	 * @param tb
-	 */
-	protected void fillToolbar(ToolBar tb) {
-		// Back browser
-		_backItem = new ToolItem(tb, SWT.PUSH);
-		_backItem.setImage(JSFUICommonPlugin.getDefault()
-				.getImage(BACK_ITEM_IMAGE_FILE));
-		_backItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.back.tooltip")); //$NON-NLS-1$
-		SelectionListener backSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_BACK);
-			}
-		};
-		_backItem.addSelectionListener(backSelectionListener);
-
-		// Forward Browser
-		_forwardItem = new ToolItem(tb, SWT.PUSH);
-		_forwardItem.setImage(JSFUICommonPlugin.getDefault().getImage(
-				FORWARD_ITEM_IMAGE_FILE));
-		_forwardItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.forward.tooltip")); //$NON-NLS-1$
-		SelectionListener forwardSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_FORWARD);
-			}
-		};
-		_forwardItem.addSelectionListener(forwardSelectionListener);
-
-		// Stop Browser
-		ToolItem stopItem = new ToolItem(tb, SWT.PUSH);
-		stopItem
-				.setImage(JSFUICommonPlugin.getDefault().getImage(STOP_ITEM_IMAGE_FILE));
-		stopItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.stop.tooltip")); //$NON-NLS-1$
-		SelectionListener stopSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_STOP);
-			}
-		};
-		stopItem.addSelectionListener(stopSelectionListener);
-
-		// Refresh Browser
-		ToolItem refreshItem = new ToolItem(tb, SWT.PUSH);
-		refreshItem.setImage(JSFUICommonPlugin.getDefault().getImage(
-				REFRESH_ITEM_IMAGE_FILE));
-		refreshItem.setToolTipText(JSFUICommonPlugin
-				.getResourceString("BrowserWindow.refresh.tooltip")); //$NON-NLS-1$
-		SelectionListener refreshServiceSelectionListener = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				browserCmd(BROWSER_CMD_REFRESH);
-			}
-		};
-		refreshItem.addSelectionListener(refreshServiceSelectionListener);
-
-		if ((_startLocation != null) || (_startContent != null)) {
-			// Reload Browser.
-			ToolItem reloadItem = new ToolItem(tb, SWT.PUSH);
-			reloadItem.setImage(JSFUICommonPlugin.getDefault().getImage(
-					RELOAD_ITEM_IMAGE_FILE));
-			reloadItem.setToolTipText(JSFUICommonPlugin
-					.getResourceString("BrowserWindow.reload.tooltip")); //$NON-NLS-1$
-			SelectionListener reloadSelectionListener = new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent event) {
-					browserCmd(BROWSER_CMD_RELOAD);
-				}
-			};
-			reloadItem.addSelectionListener(reloadSelectionListener);
-		}
-	}
-
-	/**
-	 * send the browser widget a command as defined by the cmd constant defines.
-	 * @param cmd
-	 * 
-	 * @return true if the command was successful.
-	 */
-	public boolean browserCmd(int cmd) {
-		switch (cmd) {
-		case BROWSER_CMD_BACK:
-			return _browser.back();
-		case BROWSER_CMD_FORWARD:
-			return _browser.forward();
-		case BROWSER_CMD_STOP:
-			_browser.stop();
-			return true;
-		case BROWSER_CMD_REFRESH:
-			_browser.refresh();
-			return true;
-		case BROWSER_CMD_RELOAD:
-			if (_startLocation != null) {
-				_browser.setUrl(_startLocation);
-			} else if (_startContent != null) {
-				_browser.setText(_startContent);
-			}
-			return true;
-
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/CollapsableSection.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/CollapsableSection.java
deleted file mode 100644
index f787c22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/CollapsableSection.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.events.ExpansionAdapter;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-
-/**
- * Creates a class to be used to build a control for a collapseable area inside
- * a scrollable composite. This will take care of scrollbar resize.
- * 
- * Example use:
- * 
- * CollapsableSection cs = new CollapsableSection(toolkit, scomp, "General",
- * true) { public void setCollapsableContent(Composite composite) { // place
- * your content on this composite.... } }); cs.createControl(composite,
- * horizontalSpan);
- * 
- * @author mengbo
- * 
- */
-public abstract class CollapsableSection {
-	// internal fields needed for doing the section and computing the scrollbar
-	// on a collapse.
-	private FormToolkit _toolkit;
-
-	private Section _section;
-
-	private ScrolledComposite _scomp;
-
-	private String _title;
-
-	private int _expansionStyle;
-
-	/**
-	 * Creates a class to be used to build the control for a collapseable area.
-	 * 
-	 * @param toolkit 
-	 * 
-	 * @param scomp
-	 *            the scrollable composite used inside the container. This is
-	 *            used to force resizing of the bars on dinking the control.
-	 * @param title
-	 *            the string to place next to the collapsable icon.
-	 * @param bCollapsed
-	 *            should this area start collapsed?
-	 */
-	public CollapsableSection(FormToolkit toolkit, ScrolledComposite scomp,
-			String title, boolean bCollapsed) {
-		_toolkit = toolkit;
-		_scomp = scomp;
-		_title = title;
-		_expansionStyle = ExpandableComposite.TWISTIE
-				| ExpandableComposite.FOCUS_TITLE;
-		if (bCollapsed) {
-			_expansionStyle |= ExpandableComposite.COMPACT;
-		} else {
-			_expansionStyle |= ExpandableComposite.EXPANDED;
-		}
-	}
-
-	/**
-	 * Build the GUI parts of the Collapsable area into the given composite.
-	 * NOTE: you must set the layout on this composite before adding swt
-	 * widgets.
-	 * 
-	 * @param composite
-	 */
-	abstract public void setCollapsableContent(Composite composite);
-
-	/**
-	 * A convient way to build the widget into a control and place it on the
-	 * page. NOTE: this method will build the Section and call
-	 * setCollapsableContent with a composite to fill in the inner area.
-	 * 
-	 * @param parent
-	 * @param horizontalSpan
-	 *            how many columns should this control span.
-	 * @return Control that was added to the composite.
-	 */
-	public Control createControl(Composite parent, int horizontalSpan) {
-		_section = _toolkit.createSection(parent, _expansionStyle);
-		_section.clientVerticalSpacing = 5; // space between the dink and the
-		// controls in when opened.
-		// _section.marginHeight = 5; // indents the entire section.
-		// _section.marginWidth = 5; // indents the entire section.
-		_section.setText(_title);
-		_toolkit.createCompositeSeparator(_section);
-		_section.addExpansionListener(new ExpansionAdapter() {
-			public void expansionStateChanged(ExpansionEvent event) {
-				SWTUtils.computeScrollArea(_scomp, (Composite) _scomp
-						.getContent());
-			}
-		});
-
-		Composite content = new Composite(_section, SWT.NULL);
-		setCollapsableContent(content);
-
-		_section.setClient(content);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = horizontalSpan;
-		_section.setLayoutData(gd);
-
-		return _section;
-	}
-
-	/**
-	 * Programmatically changes expanded state.
-	 * 
-	 * @param expanded
-	 *            the new expanded state
-	 */
-	public void setExpanded(boolean expanded) {
-		if (_section != null) {
-			_section.setExpanded(expanded);
-
-			// NOTE: internal calling of expanding doesn't fire
-			// the event to resize. We do it here.
-			SWTUtils.computeScrollArea(_scomp, (Composite) _scomp.getContent());
-		}
-	}
-
-	/**
-	 * Return the internal Section control for more advanced things.
-	 * 
-	 * @return Section
-	 */
-	public Section getSection() {
-		return _section;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/FavoriteSection.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/FavoriteSection.java
deleted file mode 100644
index be9882c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/FavoriteSection.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import java.util.Properties;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.FavoriteConfigurations;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * Builds a favorites with the given name in the plugins resources. This build a
- * generic looking favorites section.
- * 
- * @author mengbo
- */
-public abstract class FavoriteSection {
-	private FavoriteConfigurations _favorites;
-
-	private Combo _favoriteCombo;
-
-	/**
-	 * @param plugin
-	 * @param favoriteName
-	 */
-	public FavoriteSection(AbstractUIPlugin plugin, String favoriteName) {
-		_favorites = new FavoriteConfigurations(plugin, favoriteName);
-	}
-
-	/**
-	 * @param parent
-	 * @param horizontalSpan
-	 * @param comboMinWidth
-	 * @return the combo
-	 */
-	public Combo createFavoriteGroup(Composite parent, int horizontalSpan,
-			int comboMinWidth) {
-		Group favGroup = SWTUtils.createGroup(parent, JSFUICommonPlugin
-				.getResourceString("favorites.group.label"), 4, horizontalSpan, //$NON-NLS-1$
-				GridData.BEGINNING | GridData.CENTER);
-
-		// Add favorite text field
-		SWTUtils.createLabel(favGroup, JSFUICommonPlugin
-				.getResourceString("favorites.label"), 1); //$NON-NLS-1$
-		_favoriteCombo = SWTUtils.createCombo(favGroup, _favorites
-				.getFavoritesList(), 1, comboMinWidth, true);
-		_favoriteCombo.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.tooltip")); //$NON-NLS-1$
-		_favoriteCombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String favName = _favoriteCombo.getText().trim();
-				if (favName.length() > 0) {
-					Properties favProp = _favorites.getFavorite(_favoriteCombo
-							.getText().trim());
-					if (favProp != null) {
-						setFavorites(favProp);
-					}
-				}
-			}
-		});
-
-		// Add Save button
-		Button saveButton = SWTUtils.createPushButton(favGroup, JSFUICommonPlugin
-				.getResourceString("button.save")); //$NON-NLS-1$
-		saveButton.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.save.tooltip")); //$NON-NLS-1$
-		saveButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String favName = _favoriteCombo.getText().trim();
-				if (favName.length() == 0) {
-					favName = JSFUICommonPlugin
-							.getResourceString("favorites.default"); //$NON-NLS-1$
-				}
-				Properties favProp = new Properties();
-				saveFavorites(favProp);
-
-				_favorites.addFavorite(favName, favProp);
-				_favorites.saveFavorites();
-
-				_favoriteCombo.removeAll();
-				String[] names = _favorites.getFavoritesList();
-
-				_favoriteCombo.setItems(names);
-				_favoriteCombo.setText(favName);
-			}
-		});
-
-		// Add Remove button
-		Button removeButton = SWTUtils.createPushButton(favGroup, JSFUICommonPlugin
-				.getResourceString("button.remove")); //$NON-NLS-1$
-		removeButton.setToolTipText(JSFUICommonPlugin
-				.getResourceString("favorites.remove.tooltip")); //$NON-NLS-1$
-		removeButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String favName = _favoriteCombo.getText().trim();
-				if (favName.length() > 0) {
-					_favorites.removeFavorite(favName);
-					_favorites.saveFavorites();
-
-					removeFavorites();
-
-					_favoriteCombo.removeAll();
-					String[] names = _favorites.getFavoritesList();
-					_favoriteCombo.setItems(names);
-				}
-			}
-		});
-
-		return _favoriteCombo;
-	}
-
-	/**
-	 * This method will be called when a new favorite is set. This allows the
-	 * caller to set their values from the properties supplied.
-	 * 
-	 * @param prop
-	 */
-	public abstract void setFavorites(Properties prop);
-
-	/**
-	 * This method will be called when a new favorite is saved. This allows the
-	 * caller to save their values into the properties supplied.
-	 * 
-	 * @param prop
-	 */
-	public abstract void saveFavorites(Properties prop);
-
-	/**
-	 * This method will be called when the active favorite is removed. It allows
-	 * for clearing fields.
-	 */
-	public void removeFavorites() {
-		// do nothing.
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/ImageContainer.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/ImageContainer.java
deleted file mode 100644
index 8f697d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/ImageContainer.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A general purpose class for displying an image in a composite. There is no
- * eclipse tool for doing this other than CLabl which is bulkly.
- * 
- * This was original written by Karl Reti.
- * 
- * @author mengbo
- */
-public class ImageContainer extends Composite {
-	private Image _image = null;
-
-	private boolean _bCleanupImage;
-
-	/**
-	 * @param parent
-	 */
-	public ImageContainer(Composite parent) {
-		super(parent, SWT.NONE);// SWT.NO_BACKGROUND );//|
-		// SWT.NO_REDRAW_RESIZE);
-		setBackground(ColorConstants.white);
-		// paint the image
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				if (_image != null) {
-					e.gc.drawImage(_image, 0, 0);
-				}
-			}
-
-		});
-
-		addControlListener(new ControlAdapter() {
-			public void controlResized(ControlEvent e) {
-				setSize(_image.getBounds().width, _image.getBounds().height);
-			}
-		});
-
-		// tidy up
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				if (_bCleanupImage && _image != null && !_image.isDisposed()) {
-					_image.dispose();
-				}
-			}
-		});
-	}
-
-	/**
-	 * @return Returns the image.
-	 */
-	public Image getImage() {
-		return _image;
-	}
-
-	/**
-	 * @return should the image be disposed of on cleanup. Set false if the
-	 *         image is cached.
-	 */
-	public boolean isCleanupImage() {
-		return _bCleanupImage;
-	}
-
-	/**
-	 * @param image
-	 *            The image to set.
-	 */
-	public void setImage(Image image) {
-		setImage(image, false);
-	}
-
-	/**
-	 * @param image
-	 *            The image to set.
-	 * @param bCleanupImage 
-	 */
-	public void setImage(Image image, boolean bCleanupImage) {
-		_image = image;
-		_bCleanupImage = bCleanupImage;
-		setSize(image.getBounds().width, image.getBounds().height);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/IntroductionSection.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/IntroductionSection.java
deleted file mode 100644
index a022c1b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/IntroductionSection.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IHelpResource;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.SectionPart;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * Provides a standard looking introduction section for a intro page for the
- * editors. This was taken and is suppose to look like the standard Sybase
- * workspace service editors intro page.
- * 
- * this was original written by Collinsc
- * 
- * TODO: Should this be moved into the facesconfig ui plugin since it is only
- * really used there?
- * 
- * @author collinsc,jchoi
- */
-public class IntroductionSection extends SectionPart {
-
-	private static final String HELP_IMAGE_FILE = "help.gif"; //$NON-NLS-1$
-
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(IntroductionSection.class);
-
-	private String _editorId;
-
-	private FormToolkit _toolkit;
-
-	// private ImageHyperlink _helpImage;
-	private Composite _textClient;
-
-	private String _helpContextId;
-
-	private String _helpTooltip;
-
-	/**
-	 * Basic constructor - no help with this one.
-	 * 
-	 * @param editorId
-	 *            id of the editor this page is for.
-	 * @param managedForm
-	 * @param toolkit
-	 */
-	public IntroductionSection(String editorId, IManagedForm managedForm,
-			FormToolkit toolkit) {
-		this(editorId, managedForm, toolkit, null, null);
-	}
-
-	/**
-	 * Constructor with help option.
-	 * 
-	 * @param editorId
-	 *            id of the editor this page is for.
-	 * @param managedForm
-	 * @param toolkit
-	 * @param contextId 
-	 * @param helpTooltip
-	 */
-	public IntroductionSection(String editorId, IManagedForm managedForm,
-			FormToolkit toolkit, final String contextId, String helpTooltip) {
-		super(managedForm.getForm().getBody(), toolkit,
-				ExpandableComposite.TITLE_BAR | Section.DESCRIPTION);
-		super.initialize(managedForm);
-		this._editorId = editorId;
-		this._toolkit = toolkit;
-		this._helpContextId = contextId;
-		this._helpTooltip = helpTooltip;
-
-		this._textClient = this._toolkit.createComposite(getSection(), SWT.NONE);
-		this._textClient.setSize(32, 16);
-
-		RowLayout rowLayout = new RowLayout();
-		rowLayout.wrap = false;
-		rowLayout.pack = false;
-		rowLayout.justify = true;
-		rowLayout.type = SWT.HORIZONTAL;
-		rowLayout.marginLeft = 0;
-		rowLayout.marginTop = 0;
-		rowLayout.marginRight = 0;
-		rowLayout.marginBottom = 0;
-		rowLayout.spacing = 0;
-		this._textClient.setLayout(rowLayout);
-
-		this._toolkit.adapt(this._textClient, true, true);
-		getSection().setTextClient(this._textClient);
-
-		if (this._helpContextId != null) {
-			// setup the help image.
-			ImageHyperlink helpImage = new ImageHyperlink(this._textClient,
-					SWT.NONE);
-			this._toolkit.adapt(helpImage, true, true);
-			helpImage.setImage(JSFUICommonPlugin.getDefault().getImage(HELP_IMAGE_FILE));
-			if (this._helpTooltip != null) {
-				helpImage.setToolTipText(this._helpTooltip);
-			}
-			helpImage.setBackground(getSection()
-					.getTitleBarGradientBackground());
-			helpImage.addHyperlinkListener(new HyperlinkAdapter() {
-				public void linkActivated(HyperlinkEvent e) {
-					IContext context = HelpSystem.getContext(_helpContextId);
-					if (context != null) {
-						IHelpResource[] topics = context.getRelatedTopics();
-						if (topics != null && topics.length == 1) {
-                            PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(topics[0]
-									.getHref());
-						} else {
-                            PlatformUI.getWorkbench().getHelpSystem().displayHelp(_helpContextId);
-						}
-					}
-				}
-			});
-		}
-
-		Composite client = this._toolkit.createComposite(getSection());
-		createClient(client, this._toolkit);
-		getSection().setClient(client);
-	}
-
-	private Composite createClient(Composite container, FormToolkit factory) {
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.numColumns = 2;
-		layout.makeColumnsEqualWidth = false;
-		layout.horizontalSpacing = 20;
-		layout.verticalSpacing = 20;
-		container.setLayout(layout);
-
-		IConfigurationElement element = getExtensions();
-
-		if (element != null) {
-			setPageDetails(element);
-
-			IConfigurationElement[] children = element.getChildren();
-			for (int ii = 0; ii < children.length; ii++) {
-				processItems(container, factory, children[ii]);
-			}
-		} else {
-			setText(Messages.IntroductionSection_noIntroTitle);
-
-			setDescription(Messages.IntroductionSection_noIntroDescription);
-		}
-
-		factory.paintBordersFor(container);
-        PlatformUI.getWorkbench().getHelpSystem().setHelp(container, _helpContextId);
-		return container;
-	}
-
-	/**
-	 * set the page details from the extensionpoint
-	 * 
-	 * @param element
-	 */
-	private void setPageDetails(IConfigurationElement element) {
-		setText(element.getAttribute("name")); //$NON-NLS-1$
-		setDescription(element.getAttribute("description")); //$NON-NLS-1$
-	}
-
-	/**
-	 * add the extension elements to the page
-	 * 
-	 * @param parent
-	 * @param toolkit_
-	 * @param element
-	 */
-	private void processItems(Composite parent, FormToolkit toolkit_,
-			IConfigurationElement element) {
-		String hyperlink = element.getAttribute("hyperlink"); //$NON-NLS-1$
-		String iconPath = element.getAttribute("icon"); //$NON-NLS-1$
-		String text = element.getAttribute("text"); //$NON-NLS-1$
-		String heading = element.getAttribute("heading"); //$NON-NLS-1$
-		String action = element.getAttribute("hyperlinkaction"); //$NON-NLS-1$
-		//String actionparameters = element.getAttribute("actionparameters"); //$NON-NLS-1$
-
-		if (iconPath != null && iconPath.length() > 0) {
-			// add an icon to the page
-			String iconName;
-			if (iconPath.indexOf(IPath.SEPARATOR) != -1) {
-				iconName = new Path(iconPath).lastSegment();
-			} else {
-				iconName = iconPath;
-			}
-
-			ImageDescriptor imageDescriptor = AbstractUIPlugin
-					.imageDescriptorFromPlugin(
-							element.getDeclaringExtension()
-									.getContributor().getName(), iconPath);
-			
-			if (imageDescriptor != null)
-			{
-				ImageRegistry imageRegistry =
-					JSFUICommonPlugin.getDefault().getImageRegistry();
-				
-				
-				Image image = imageRegistry.get(iconName);
-				
-				if (image == null)
-				{
-					image = imageDescriptor.createImage();
-					
-					if (image != null)
-					{
-						imageRegistry.put(iconName, image);
-					}
-					else
-					{
-						image = ImageDescriptor.getMissingImageDescriptor().createImage();
-					}
-				}
-				
-				if (image != null)
-				{
-					ImageContainer img = new ImageContainer(parent);
-					img.setImage(image);
-					TableWrapData td = new TableWrapData();
-					td.rowspan = 2;
-					img.setLayoutData(td);
-				}
-				else
-				{
-					JSFUICommonPlugin.getLogger(this.getClass()).error(new Throwable("Image not created for "+element)); //$NON-NLS-1$
-				}
-			}
-			else
-			{
-				JSFUICommonPlugin.getLogger(this.getClass()).error(new Throwable("Image Descriptor not found for "+element)); //$NON-NLS-1$
-			}
-		}
-
-		if (heading != null && heading.length() > 0) {
-			// add a header
-			Label lbl = toolkit_.createLabel(parent, heading);
-			lbl.setFont(JFaceResources.getHeaderFont());
-		}
-
-		if (hyperlink != null && hyperlink.length() > 0) {
-			Hyperlink hypr = toolkit_.createHyperlink(parent, hyperlink,
-					SWT.NONE);
-			if (action != null && action.length() > 0) {
-				try {
-					final IAction thisAction = (IAction) element
-							.createExecutableExtension("hyperlinkaction"); //$NON-NLS-1$
-					hypr.addHyperlinkListener(new HyperlinkAdapter() {
-						public void linkActivated(HyperlinkEvent e) {
-							thisAction.run();
-						}
-					});
-				} catch (Exception ee) {
-					// log.IntroductionSection.action.error=Failed to launch the
-					// link {0}.
-					_log.error("log.IntroductionSection.action.error", //$NON-NLS-1$
-							hyperlink, ee);
-					JSFUICommonPlugin.getAlerts().detailError(hyperlink,
-							"log.IntroductionSection.action.error", hyperlink, //$NON-NLS-1$
-							ee);
-				}
-			}
-		}
-
-		if (text != null && text.length() > 0) {
-			FormText form = toolkit_.createFormText(parent, false);
-			form.setText(text, false, false);
-		}
-	}
-
-	/**
-	 * Get the extension elements for the Introduction pages
-	 */
-	private IConfigurationElement getExtensions() {
-		// find all service editor page extensions
-		IConfigurationElement element = null;
-
-		// find all service editor parameter dialog extensions
-		IConfigurationElement[] elements = Platform
-				.getExtensionRegistry()
-				.getConfigurationElementsFor(
-						"org.eclipse.jst.jsf.common.ui.introductionPage"); //$NON-NLS-1$
-		if (elements.length > 0) {
-			for (int ii = 0; ii < elements.length; ii++) {
-				// get extensions for this dialog
-				// String extPluginId =
-				// elements[ii].getDeclaringExtension().getNamespace();
-				String editorId1 = elements[ii].getDeclaringExtension()
-						.getSimpleIdentifier();
-
-				// see if we have any contributuins of dialogs
-				if (this._editorId.equals(editorId1)) {
-					element = elements[ii];
-					break;
-				}
-			}
-		}
-		return element;
-	}
-
-	private void setText(String text) {
-		getSection().setText(text);
-	}
-
-	private void setDescription(String text) {
-		getSection().setDescription(text);
-	}
-
-	/**
-	 * Set this section's layout data
-	 * @param layoutData
-	 */
-	public void setLayoutData(Object layoutData) {
-		getSection().setLayoutData(layoutData);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Messages.java
deleted file mode 100644
index b877236..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/Messages.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Debajit Adhikary - Oracle
- */
-
-public class Messages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.common.ui.internal.guiutils.messages"; //$NON-NLS-1$
-	
-	/**
-	 * See messages.properties.
-	 */
-	public static String IntroductionSection_noIntroDescription;
-	
-	/**
-	 * See messages.properties.
-	 */
-	public static String IntroductionSection_noIntroTitle;
-	
-	/**
-	 * See messages.properties.
-	 */
-	public static String BrowserWindow_loading;
-
-	
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/OverviewSection.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/OverviewSection.java
deleted file mode 100644
index 4654c40..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/OverviewSection.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IHelpResource;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.SectionPart;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormText;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-
-/**
- * @author jchoi
- * @version
- */
-public class OverviewSection extends SectionPart {
-
-	private static final String HELP_IMAGE_FILE = "help.gif"; //$NON-NLS-1$
-
-	private static Logger log = JSFUICommonPlugin.getLogger(OverviewSection.class);
-
-	private String editorId;
-
-	private FormToolkit toolkit;
-
-	private ImageHyperlink helpImage;
-
-	private Composite textClient;
-
-	private String helpContextId;
-
-	private String helpTooltip;
-
-	/**
-	 * @param editorId 
-	 * @param managedForm 
-	 * @param toolkit
-	 */
-	public OverviewSection(String editorId, IManagedForm managedForm,
-			FormToolkit toolkit) {
-		this(editorId, managedForm, toolkit, null, null);
-
-	}
-
-	/**
-	 * Constructor with help option.
-	 * 
-	 * @param editorId
-	 *            id of the editor this page is for.
-	 * @param managedForm
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public OverviewSection(String editorId, IManagedForm managedForm,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(managedForm.getForm().getBody(), toolkit,
-				ExpandableComposite.TITLE_BAR | Section.DESCRIPTION);
-		super.initialize(managedForm);
-		this.editorId = editorId;
-		this.toolkit = toolkit;
-		this.helpContextId = helpContextId;
-		this.helpTooltip = helpTooltip;
-
-		this.textClient = this.toolkit.createComposite(getSection(), SWT.NONE);
-		this.textClient.setSize(32, 16);
-
-		init();
-
-		Composite client = this.toolkit.createComposite(getSection());
-		//createClient(client, this.toolkit);
-		getSection().setClient(client);
-	}
-
-	/**
-	 * @param editor 
-	 * @param managedForm 
-	 * @param toolkit
-	 * @param style
-	 */
-	public OverviewSection(FormEditor editor, IManagedForm managedForm,
-			FormToolkit toolkit, int style) {
-		super(managedForm.getForm().getBody(), toolkit,
-				ExpandableComposite.TITLE_BAR | style);
-		super.initialize(managedForm);
-		this.toolkit = toolkit;
-
-		this.textClient = this.toolkit.createComposite(getSection(), SWT.NONE);
-		this.textClient.setSize(32, 16);
-
-		init();
-	}
-
-	/**
-	 * @param editor
-	 * @param managedForm
-	 * @param toolkit
-	 * @param style
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public OverviewSection(FormEditor editor, IManagedForm managedForm,
-			FormToolkit toolkit, int style, String helpContextId,
-			String helpTooltip) {
-		super(managedForm.getForm().getBody(), toolkit,
-				ExpandableComposite.TITLE_BAR | style);
-		super.initialize(managedForm);
-		this.toolkit = toolkit;
-
-		this.textClient = toolkit.createComposite(getSection(), SWT.NONE);
-		this.textClient.setSize(32, 16);
-		this.helpContextId = helpContextId;
-		this.helpTooltip = helpTooltip;
-		init();
-	}
-
-	/**
-	 * 
-	 */
-	public void initialize() {
-		Composite client = toolkit.createComposite(getSection());
-		//createClient(client, toolkit);
-		getSection().setClient(client);
-	}
-
-	private void init() {
-		RowLayout rowLayout = new RowLayout();
-		rowLayout.wrap = false;
-		rowLayout.pack = false;
-		rowLayout.justify = true;
-		rowLayout.type = SWT.HORIZONTAL;
-		rowLayout.marginLeft = 0;
-		rowLayout.marginTop = 0;
-		rowLayout.marginRight = 0;
-		rowLayout.marginBottom = 0;
-		rowLayout.spacing = 0;
-		textClient.setLayout(rowLayout);
-
-		helpImage = new ImageHyperlink(textClient, SWT.NONE);
-		toolkit.adapt(helpImage, true, true);
-		toolkit.adapt(textClient, true, true);
-		helpImage.setImage(JSFUICommonPlugin.getDefault().getImage(HELP_IMAGE_FILE)); 
-		getSection().setTextClient(textClient);
-		if (helpTooltip != null) {
-			helpImage.setToolTipText(helpTooltip);
-		}
-		helpImage.setBackground(getSection().getTitleBarGradientBackground());
-		helpImage.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				IContext context = HelpSystem.getContext(helpContextId);
-				if (context != null) {
-					IHelpResource[] topics = context.getRelatedTopics();
-					if (topics != null && topics.length == 1) {
-                        PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(topics[0].getHref());
-					} else {
-                        PlatformUI.getWorkbench().getHelpSystem().displayHelp(helpContextId);
-					}
-				}
-			}
-		});
-
-		/*
-		 * Composite client = _toolkit.createComposite(getSection());
-		 * createClient(client, _toolkit); getSection().setClient(client);
-		 */
-	}
-
-	/**
-	 * set the page details from the extensionpoint
-	 * 
-	 * @param element
-	 */
-	protected void setPageDetails(IConfigurationElement element) {
-		setText(element.getAttribute("name")); //$NON-NLS-1$
-		setDescription(element.getAttribute("description")); //$NON-NLS-1$
-	}
-
-	/**
-	 * add the extension elements to the page
-	 * 
-	 * @param parent
-	 * @param toolkit_
-	 * @param element
-	 */
-	public void processItems(Composite parent, FormToolkit toolkit_,
-			IConfigurationElement element) {
-		String hyperlink = element.getAttribute("hyperlink"); //$NON-NLS-1$      
-		String text = element.getAttribute("text"); //$NON-NLS-1$
-		String action = element.getAttribute("hyperlinkaction"); //$NON-NLS-1$
-		//String actionparameters = element.getAttribute("actionparameters"); //$NON-NLS-1$
-
-		if (hyperlink != null && hyperlink.length() > 0) {
-			Hyperlink hypr = toolkit_.createHyperlink(parent, hyperlink,
-					SWT.NONE);
-			if (action != null && action.length() > 0) {
-				try {
-					final IAction thisAction = (IAction) element
-							.createExecutableExtension("hyperlinkaction"); //$NON-NLS-1$
-					hypr.addHyperlinkListener(new HyperlinkAdapter() {
-						public void linkActivated(HyperlinkEvent e) {
-							thisAction.run();
-						}
-					});
-				} catch (Exception ee) {
-					// log.IntroductionSection.action.error=Failed to launch the
-					// link {0}.
-					log
-							.error("log.OverviewSection.action.error", //$NON-NLS-1$
-									hyperlink, ee);
-					JSFUICommonPlugin.getAlerts().detailError(hyperlink,
-							"log.OverviewSection.action.error", hyperlink, ee); //$NON-NLS-1$
-				}
-			}
-		}
-
-		if (text != null && text.length() > 0) {
-			FormText form = toolkit_.createFormText(parent, false);
-			form.setText(text, false, false);
-		}
-	}
-
-	/**
-	 * Get the extension elements for the Introduction pages
-	 * @param extensionPoint 
-	 * @return the configuration element
-	 */
-	public IConfigurationElement getExtensions(String extensionPoint) {
-		// find all service editor page extensions
-		IConfigurationElement element = null;
-
-		// find all service editor parameter dialog extensions
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor(extensionPoint);
-		if (elements.length > 0) {
-			for (int ii = 0; ii < elements.length; ii++) {
-				// get extensions for this dialog
-				// String extPluginId =
-				// elements[ii].getDeclaringExtension().getNamespace();
-				String anEditorId = elements[ii].getDeclaringExtension()
-						.getSimpleIdentifier();
-
-				// see if we have any contributuins of dialogs
-				if (this.editorId.equals(anEditorId)) {
-					element = elements[ii];
-					break;
-				}
-			}
-		}
-		return element;
-	}
-
-	private void setText(String text) {
-		getSection().setText(text);
-	}
-
-	private void setDescription(String text) {
-		getSection().setDescription(text);
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/SWTUtils.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/SWTUtils.java
deleted file mode 100644
index 862b26b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/SWTUtils.java
+++ /dev/null
@@ -1,1032 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * This utility class provides convenience methods in creating controls on
- * preference pages.
- * 
- * @author mengbo
- */
-public class SWTUtils {
-	// Defaults of controls
-	private static final int DEFAULT_BUTTON_WIDTH = 70;
-
-	private static final int DEFAULT_COMBO_WIDTH = 100;
-
-	private static final int DEFAULT_TEXTBOX_WIDTH = 100;
-
-	private static final int DEFAULT_RADIO_FILL = GridData.HORIZONTAL_ALIGN_BEGINNING
-			| GridData.VERTICAL_ALIGN_CENTER;
-
-	/**
-	 * Creates a new checkbox and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the checkbox
-	 * @return the new checkbox
-	 */
-	public static Button createCheckBox(Composite parent) {
-		return createCheckBox(parent, null, 1, 0);
-	}
-
-	/**
-	 * Creates a new checkbox and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the checkbox
-	 * @param label
-	 *            the string to set into the checkbox
-	 * @param numColumns
-	 *            the number of columns the new checkbox is to occupy
-	 * @return the new checkbox
-	 */
-	public static Button createCheckBox(Composite parent, String label,
-			int numColumns) {
-		return createCheckBox(parent, label, numColumns, 0);
-	}
-
-	/**
-	 * Creates a new checkbox and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the checkbox
-	 * @param label
-	 *            the string to set into the checkbox
-	 * @param numColumns
-	 *            the number of columns the new checkbox is to occupy
-	 * @param indent
-	 *            the number of pixels to indent from the left
-	 * @return the new checkbox
-	 */
-	public static Button createCheckBox(Composite parent, String label,
-			int numColumns, int indent) {
-		Button button = new Button(parent, SWT.CHECK | SWT.LEFT);
-		if (label == null) {
-			button.setAlignment(SWT.CENTER);
-		}
-		GridData data = new GridData(GridData.FILL);
-		data.horizontalSpan = numColumns;
-		data.horizontalIndent = indent;
-		button.setLayoutData(data);
-		if (label != null) {
-			button.setText(label);
-		}
-		return button;
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param items
-	 *            the items in the combo
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String[] items,
-			int numColumns) {
-		return createCombo(parent, items, numColumns, DEFAULT_COMBO_WIDTH);
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param tokenString
-	 *            a tokenized string that will be split into the fields.
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String tokenString,
-			int numColumns) {
-		return createCombo(parent, getTokenNames(tokenString), numColumns,
-				DEFAULT_COMBO_WIDTH);
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param tokenString
-	 *            a tokenized string that will be split into the fields.
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @param minWidth
-	 *            minimum width of combo box in pixels
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String tokenString,
-			int numColumns, int minWidth) {
-		return createCombo(parent, getTokenNames(tokenString), numColumns,
-				minWidth);
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param items
-	 *            the items in the combo
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @param minWidth
-	 *            minimum width of combo box in pixels
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String[] items,
-			int numColumns, int minWidth) {
-		return createCombo(parent, items, numColumns, minWidth, false);
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param tokenString 
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @param minWidth
-	 *            minimum width of combo box in pixels
-	 * @param editable
-	 *            whether the items in the combo is editable
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String tokenString,
-			int numColumns, int minWidth, boolean editable) {
-		return createCombo(parent, getTokenNames(tokenString), numColumns,
-				minWidth, editable);
-	}
-
-	/**
-	 * Creates a combo box and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the composite in which to create the combo
-	 * @param items
-	 *            the items in the combo
-	 * @param numColumns
-	 *            the number of columns the new combo is to occupy
-	 * @param minWidth
-	 *            minimum width of combo box in pixels
-	 * @param editable
-	 *            whether the items in the combo is editable
-	 * @return the new combo box
-	 */
-	public static Combo createCombo(Composite parent, String[] items,
-			int numColumns, int minWidth, boolean editable) {
-		Combo combo;
-		GridData data;
-		if (editable) {
-			combo = new Combo(parent, SWT.DROP_DOWN);
-			data = new GridData(GridData.FILL_HORIZONTAL);
-		} else {
-			combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
-			data = new GridData(GridData.FILL);
-		}
-		data.horizontalSpan = numColumns;
-		data.widthHint = minWidth;
-		combo.setLayoutData(data);
-		combo.setItems(items);
-		return combo;
-	}
-
-	/**
-	 * Creates composite control and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent of the new composite
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @return the newly-created coposite
-	 */
-	public static Composite createComposite(Composite parent, int numColumns) {
-		return createComposite(parent, numColumns, -1, -1,
-				GridData.FILL_HORIZONTAL, -1, -1, -1);
-	}
-
-	/**
-	 * Creates composite control and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent of the new composite
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param verticalSpacing
-	 *            the spacing between rows.
-	 * @param horizontalSpan
-	 *            the span for this new composite over the original composite.
-	 * @return the newly-created coposite
-	 */
-	public static Composite createComposite(Composite parent, int numColumns,
-			int verticalSpacing, int horizontalSpan) {
-		return createComposite(parent, numColumns, verticalSpacing,
-				horizontalSpan, GridData.FILL_HORIZONTAL, -1, -1, -1);
-	}
-
-	/**
-	 * Creates composite control and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent of the new composite
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param verticalSpacing
-	 *            the spacing between rows.
-	 * @param horizontalSpan
-	 *            the span for this new composite over the original composite.
-	 * @param gridDataFill
-	 *            the fill to use for this composite.
-	 * @return the newly-created coposite
-	 */
-	public static Composite createComposite(Composite parent, int numColumns,
-			int verticalSpacing, int horizontalSpan, int gridDataFill) {
-		return createComposite(parent, numColumns, verticalSpacing,
-				horizontalSpan, gridDataFill, -1, -1, -1);
-	}
-
-	/**
-	 * Creates composite control and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent of the new composite
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param verticalSpacing
-	 *            the spacing between rows.
-	 * @param horizontalSpan
-	 *            the span for this new composite over the original composite.
-	 * @param gridDataFill
-	 *            the fill to use for this composite.
-	 * @param horizontalSpacing
-	 *            the spacing between objects.
-	 * @param marginWidth
-	 *            the spacing at start and end of composite.
-	 * @param marginHeight
-	 *            the spacing above and below composite.
-	 * @return the newly-created coposite
-	 */
-	public static Composite createComposite(Composite parent, int numColumns,
-			int verticalSpacing, int horizontalSpan, int gridDataFill,
-			int horizontalSpacing, int marginWidth, int marginHeight) {
-		Composite composite = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numColumns;
-		if (verticalSpacing >= 0) {
-			layout.verticalSpacing = verticalSpacing;
-		}
-		if (horizontalSpacing >= 0) {
-			layout.horizontalSpacing = horizontalSpacing;
-		}
-		if (marginWidth >= 0) {
-			layout.marginWidth = marginWidth;
-		}
-		if (marginHeight >= 0) {
-			layout.marginHeight = marginHeight;
-		}
-		composite.setLayout(layout);
-		GridData gd = new GridData(gridDataFill);
-		if (horizontalSpan > 0) {
-			gd.horizontalSpan = horizontalSpan;
-		}
-		composite.setLayoutData(gd);
-
-		return composite;
-	}
-
-	/**
-	 * Utility method that creates a group and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new group
-	 * @param title
-	 *            the label for the new group
-	 * @param numColumns
-	 *            the number of columns for the new group
-	 * @return the newly created group
-	 */
-	public static Group createGroup(Composite parent, String title,
-			int numColumns) {
-		return createGroup(parent, title, numColumns, -1,
-				GridData.FILL_HORIZONTAL);
-	}
-
-	/**
-	 * Utility method that creates a group and sets the default layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new group
-	 * @param title
-	 *            the label for the new group
-	 * @param numColumns
-	 *            the number of columns for the new group
-	 * @param horizontalSpan
-	 *            the number of columns this group should span on the parent
-	 *            composite.
-	 * @param gridDataFill
-	 *            the fill style of the new group -- set to for filling just
-	 *            around the object: GridData.BEGINNING | GridData.CENTER
-	 * @return the newly created group
-	 */
-	public static Group createGroup(Composite parent, String title,
-			int numColumns, int horizontalSpan, int gridDataFill) {
-		Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numColumns;
-		group.setLayout(layout);
-		GridData data = new GridData(gridDataFill);
-
-		if (horizontalSpan > 0) {
-			data.horizontalSpan = horizontalSpan;
-		}
-		group.setLayoutData(data);
-		group.setText(title);
-		return group;
-	}
-
-	/**
-	 * Utility method that creates a label instance and sets the default layout
-	 * data.
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param text
-	 *            the text for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @return the new label
-	 */
-	public static Label createLabel(Composite parent, String text,
-			int numColumns) {
-		return createLabel(parent, text, numColumns, 0);
-	}
-
-	/**
-	 * Utility method that creates a label instance and sets the default layout
-	 * data.
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param text
-	 *            the text for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param indent
-	 *            number of pixels to indent from the left
-	 * @return the new label
-	 */
-	public static Label createLabel(Composite parent, String text,
-			int numColumns, int indent) {
-		Label label = new Label(parent, SWT.LEFT);
-		GridData data = new GridData();
-		data.horizontalSpan = numColumns;
-		data.horizontalAlignment = GridData.FILL;
-		data.horizontalIndent = indent;
-		label.setLayoutData(data);
-		label.setText(text);
-		return label;
-	}
-
-	/**
-	 * Create a image label for sticking in a composite. The backgroud color is
-	 * optional. Because images can have "transparent" natures, you might want
-	 * to say the background is something other than the defaults composites
-	 * background.
-	 * 
-	 * NOTE: the caller is responsible for cleanup of the image and color
-	 * objects.
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param theImage
-	 *            the image for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param background
-	 *            pass null to use the composites background.
-	 * @return the new label
-	 */
-	public static Label createLabelImage(Composite parent, Image theImage,
-			int numColumns, Color background) {
-		Label label = new Label(parent, SWT.LEFT);
-		GridData data = new GridData();
-		data.horizontalSpan = numColumns;
-		data.horizontalAlignment = GridData.FILL;
-		label.setLayoutData(data);
-		if (background != null) {
-			label.setBackground(background);
-		}
-		label.setImage(theImage);
-		return label;
-	}
-
-	/**
-	 * Utility method that creates a push button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param label
-	 *            the label for the new button
-	 * @return the newly-created button
-	 */
-	public static Button createPushButton(Composite parent, String label) {
-		return createPushButton(parent, label, DEFAULT_BUTTON_WIDTH);
-	}
-
-	/**
-	 * Utility method that creates a push button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param label
-	 *            the label for the new button
-	 * @param widthHint
-	 *            use this width for the button.
-	 * @return the newly-created button
-	 */
-	public static Button createPushButton(Composite parent, String label,
-			int widthHint) {
-		Button button = new Button(parent, SWT.PUSH);
-		GridData data = new GridData();
-		data.horizontalAlignment = GridData.FILL_HORIZONTAL;
-		data.widthHint = widthHint;
-		button.setLayoutData(data);
-		button.setText(label);
-		return button;
-	}
-
-	/**
-	 * Utility method that creates a push button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param theImage
-	 *            the label for the new button
-	 * @param widthHint
-	 *            use this width for the button.
-	 * @return the newly-created button
-	 */
-	public static Button createPushButton(Composite parent, Image theImage,
-			int widthHint) {
-		Button button = new Button(parent, SWT.PUSH);
-		GridData data = new GridData();
-		data.horizontalAlignment = GridData.FILL_HORIZONTAL;
-		data.widthHint = widthHint;
-		button.setLayoutData(data);
-		button.setImage(theImage);
-		button.setAlignment(SWT.CENTER);
-		return button;
-	}
-
-	/**
-	 * Utility method that creates a radio button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param label
-	 *            the label for the new button
-	 * @return the newly-created button
-	 */
-	public static Button createRadioButton(Composite parent, String label) {
-		return createRadioButton(parent, label, DEFAULT_RADIO_FILL);
-	}
-
-	/**
-	 * Utility method that creates a radio button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param label
-	 *            the label for the new button
-	 * @param gridDataFill 
-	 * @return the newly-created button
-	 */
-	public static Button createRadioButton(Composite parent, String label,
-			int gridDataFill) {
-		return createRadioButton(parent, label, gridDataFill, 1);
-	}
-
-	/**
-	 * Utility method that creates a radio button instance and sets the default
-	 * layout data.
-	 * 
-	 * @param parent
-	 *            the parent for the new button
-	 * @param label
-	 *            the label for the new button
-	 * @param gridDataFill 
-	 * @param horizontalSpan
-	 *            number of columns occupied by button
-	 * @return the newly-created button
-	 */
-	public static Button createRadioButton(Composite parent, String label,
-			int gridDataFill, int horizontalSpan) {
-		Button button = new Button(parent, SWT.RADIO | SWT.LEFT);
-		GridData data = new GridData(gridDataFill);
-		data.horizontalSpan = horizontalSpan;
-		button.setLayoutData(data);
-		button.setText(label);
-		return button;
-	}
-
-	/**
-	 * Utility method that creates an empty line
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 */
-	public static void createSpacer(Composite parent, int numColumns) {
-		createSpacer(parent, numColumns, 0);
-	}
-
-	/**
-	 * Utility method that creates an empty line
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 * @param minWidth
-	 *            minimum width of spacer
-	 */
-	public static void createSpacer(Composite parent, int numColumns,
-			int minWidth) {
-		Label label = new Label(parent, SWT.NONE);
-		GridData data = new GridData();
-		data.horizontalSpan = numColumns;
-		data.widthHint = minWidth;
-		label.setLayoutData(data);
-	}
-
-	/**
-	 * Create a separator that goes across the entire page
-	 * 
-	 * @param parent
-	 *            the parent for the new label
-	 * @param numColumns
-	 *            the number of columns for the new composite
-	 */
-	public static void createSeparator(Composite parent, int numColumns) {
-		Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
-		GridData data = new GridData();
-		data.horizontalSpan = numColumns;
-		data.horizontalAlignment = GridData.FILL;
-		data.grabExcessHorizontalSpace = true;
-		separator.setLayoutData(data);
-	}
-
-	/**
-	 * Create a table from a Composite object
-	 * 
-	 * @param composite
-	 *            the Composite this table is to be created from
-	 * @param tokenString
-	 *            A string containing names of the columns in the order that
-	 *            they should be displayed in the table with each column
-	 *            separated by a comma(',') or null if no columns need to be
-	 *            created.
-	 * @param tablewidth
-	 *            the minimum width for the table
-	 * @param tableHeight 
-	 * @return the new table
-	 */
-	public static Table createTable(Composite composite, String tokenString,
-			int tablewidth, int tableHeight) {
-		// SINGLE, MULTI, CHECK, FULL_SELECTION, HIDE_SELECTION
-		int style = SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE | SWT.BORDER
-				| SWT.FULL_SELECTION;
-		Table table = new Table(composite, style);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		if (tablewidth > 0) {
-			gridData.widthHint = tablewidth;
-		}
-		if (tableHeight > 0) {
-			gridData.heightHint = tableHeight;
-		}
-		table.setLayoutData(gridData);
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-
-		if (tokenString != null) {
-			String[] columns = getTokenNames(tokenString);
-
-			int columnSize = 50;
-			if (tablewidth > 0) {
-				columnSize = tablewidth / columns.length;
-			}
-			for (int ii = 0; ii < columns.length; ii++) {
-				/*(void)*/ createTableColumn(table, columns[ii], ii,
-						columnSize);
-			}
-		}
-
-		return table;
-	}
-
-	/**
-	 * Create a table from a Composite object
-	 * 
-	 * @param composite
-	 *            the Composite this table is to be created from
-	 * @param columns
-	 *            A string array containing names of the columns in the order
-	 *            that they should be displayed in the table, or null if no
-	 *            columns need to be created.
-	 * @param tablewidth
-	 *            the minimum width for the table
-	 * @return the new table
-	 */
-	public static Table createTable(Composite composite, String[] columns,
-			int tablewidth) {
-		int style = SWT.BORDER | SWT.FULL_SELECTION;
-		Table table = new Table(composite, style);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		gridData.widthHint = tablewidth;
-		table.setLayoutData(gridData);
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-
-		if (columns != null) {
-			for (int i = 0; i < columns.length; i++) {
-				/*(void)*/ createTableColumn(table, columns[i], i);
-			}
-		}
-
-		return table;
-	}
-
-	/**
-	 * Create a table column
-	 * 
-	 * @param parent
-	 *            the table that contains this column
-	 * @param name
-	 *            name of this column
-	 * @param index
-	 *            the column within the parent composite
-	 * @return the new table column
-	 */
-	public static TableColumn createTableColumn(Table parent, String name,
-			int index) {
-		TableColumn column = new TableColumn(parent, SWT.LEFT, index);
-		column.setText(name);
-		return column;
-	}
-
-	/**
-	 * Create a table column with the image and the width of the column is set
-	 * to the image width.
-	 * 
-	 * @param parent
-	 *            the table that contains this column
-	 * @param image
-	 *            iamge for this column
-	 * @param index 
-	 * @return the new table column
-	 */
-	public static TableColumn createTableColumn(Table parent, Image image,
-			int index) {
-		TableColumn column = new TableColumn(parent, SWT.LEFT, index);
-		column.setImage(image);
-		column.setWidth(image.getBounds().width);
-		column.setResizable(false);
-		return column;
-	}
-
-	/**
-	 * Create a table column
-	 * 
-	 * @param parent
-	 *            the table that contains this column
-	 * @param name
-	 *            name of this column
-	 * @param index
-	 *            the column within the parent composite
-	 * @param tablewidth
-	 *            the width for the column
-	 * @return the new table column
-	 */
-	public static TableColumn createTableColumn(Table parent, String name,
-			int index, int tablewidth) {
-		TableColumn column = new TableColumn(parent, SWT.LEFT, index);
-		column.setText(name);
-		column.setWidth(tablewidth);
-		return column;
-	}
-
-	/**
-	 * Create a text field
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent) {
-		return createTextBox(parent, 1, DEFAULT_TEXTBOX_WIDTH);
-	}
-
-	/**
-	 * Create a text field
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param text 
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent, String text) {
-		Text textbox = createTextBox(parent, 1);
-		textbox.setText(text);
-		return textbox;
-	}
-
-	/**
-	 * Create a text field
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent, int numColumns) {
-		return createTextBox(parent, numColumns, DEFAULT_TEXTBOX_WIDTH);
-	}
-
-	/**
-	 * Create a text field
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @param minWidth
-	 *            minimum width of text field
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent, int numColumns,
-			int minWidth) {
-		return createTextBox(parent, numColumns, minWidth, SWT.DEFAULT);
-	}
-
-	/**
-	 * Create a text field
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @param minWidth
-	 *            minimum width of text field
-	 * @param minHeight 
-	 * @return the new text field
-	 */
-	public static Text createTextBox(Composite parent, int numColumns,
-			int minWidth, int minHeight) {
-		Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
-		GridData data = new GridData(GridData.FILL);
-		data.horizontalSpan = numColumns;
-		data.widthHint = minWidth;
-		data.heightHint = minHeight;
-		text.setLayoutData(data);
-		return text;
-	}
-
-	/**
-	 * Create a text field that is scrollable.
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @param minWidth
-	 *            minimum width of text field
-	 * @param minHeight
-	 *            minimum height of text field
-	 * @return the new text field
-	 */
-	public static Text createTextBoxScrollable(Composite parent,
-			int numColumns, int minWidth, int minHeight) {
-		Text text = new Text(parent, SWT.BORDER | SWT.V_SCROLL | SWT.WRAP);
-		GridData data = new GridData((minWidth > 0) ? GridData.FILL
-				: GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = numColumns;
-		if (minWidth > 0) {
-			data.widthHint = minWidth;
-		}
-		data.heightHint = minHeight;
-
-		text.setLayoutData(data);
-		return text;
-	}
-
-	/**
-	 * Create a list with the items listed in it.
-	 * 
-	 * @param parent
-	 *            the parent of the new text field
-	 * @param numColumns
-	 *            number of columns the text box is to occupy
-	 * @param minWidth
-	 *            minimum width of text field
-	 * @param minHeight
-	 *            minimum height of text field
-	 * @param items
-	 *            the items in the list
-	 * @return the new list
-	 */
-	public static List createList(Composite parent, int numColumns,
-			int minWidth, int minHeight, String[] items) {
-		return createList(parent, numColumns, minWidth, minHeight, items, true);
-	}
-
-	/**
-	 * Create a list with the items listed in it.
-	 * 
-	 * @param parent
-	 *            the parent of the new list box
-	 * @param numColumns
-	 *            number of columns the list box is to occupy
-	 * @param minWidth
-	 *            minimum width of list box
-	 * @param minHeight
-	 *            minimum height of list box
-	 * @param items
-	 *            the items in the list
-	 * @param bmulti
-	 *            whether multiple item selection is allowed
-	 * @return the new list
-	 */
-	public static List createList(Composite parent, int numColumns,
-			int minWidth, int minHeight, String[] items, boolean bmulti) {
-		return createList(parent, numColumns, minWidth, minHeight, items,
-				bmulti, 1);
-	}
-
-	/**
-	 * Create a list with the items listed in it.
-	 * 
-	 * @param parent
-	 *            the parent of the new list box
-	 * @param numColumns
-	 *            number of columns the list box is to occupy
-	 * @param minWidth
-	 *            minimum width of list box
-	 * @param minHeight
-	 *            minimum height of list box
-	 * @param items
-	 *            the items in the list
-	 * @param bmulti
-	 *            whether multiple item selection is allowed
-	 * @param verticalSpan
-	 *            the number of rows the list box is to occupy
-	 * @return the new list
-	 */
-	public static List createList(Composite parent, int numColumns,
-			int minWidth, int minHeight, String[] items, boolean bmulti,
-			int verticalSpan) {
-		List theList;
-		if (bmulti)
-			theList = new List(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI
-					| SWT.BORDER);
-		else
-			theList = new List(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE
-					| SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING | GridData.FILL_VERTICAL);
-		data.horizontalSpan = numColumns;
-		data.widthHint = minWidth;
-		data.heightHint = minHeight;
-		data.verticalSpan = verticalSpan;
-		theList.setLayoutData(data);
-		if (items != null) {
-			theList.setItems(items);
-		}
-
-		return theList;
-	}
-
-	/**
-	 * Computes the size of the composite inside the scroll area so that scroll
-	 * bars show up correctly.
-	 * 
-	 * @param parentComposite
-	 * @param childComposite
-	 */
-	public static void computeScrollArea(ScrolledComposite parentComposite,
-			Composite childComposite) {
-		// Point pt = childComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		// childComposite.setSize(pt);
-
-		Point pt = childComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		parentComposite.setExpandHorizontal(true);
-		parentComposite.setExpandVertical(true);
-		parentComposite.setMinWidth(pt.x);
-		parentComposite.setMinHeight(pt.y);
-	}
-
-	/**
-	 * Builds an array of strings from a token list string. The token separator
-	 * is a comma (',').
-	 * 
-	 * @param tokenString
-	 * @return String[]
-	 */
-	public static String[] getTokenNames(String tokenString) {
-		if (tokenString == null) {
-			return new String[0];
-		}
-
-		return tokenString.split(","); //$NON-NLS-1$
-	}
-
-	/**
-	 * Enable/Disable the widget and all its children.
-	 * 
-	 * @param widget
-	 *            The widget to be enabled/disabled.
-	 * @param state
-	 *            Enable widget if true. Disable otherwise.
-	 */
-	public static void setWidgetState(Control widget, boolean state) {
-		if (widget instanceof Composite) {
-			Control widgets[] = ((Composite) widget).getChildren();
-			for (int i = 0; i < widgets.length; i++) {
-				setWidgetState(widgets[i], state);
-			}
-		}
-		widget.setEnabled(state);
-	}
-
-	// ---------------------------------------------------------------------------
-	// following is for workaround eclipse problem
-	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=40281
-	static ControlListener _listener = new ControlListener() {
-		public void controlResized(ControlEvent e) {
-			final Composite c = (Composite) e.widget;
-			c.getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					if (!c.isDisposed()) {
-						// XXX: in 3.0, should use c.layout(true)
-						// in 3.1, should use c.layout(true, true)
-						c.layout(true);
-						c.redraw();
-					}
-				}
-			});
-		}
-
-		public void controlMoved(ControlEvent e) {
-		    // nothing for move
-		}
-	};
-
-	/**
-	 * @param composite
-	 */
-	public static void workaroundResize(Composite composite) {
-		composite.addControlListener(_listener);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/TextWindow.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/TextWindow.java
deleted file mode 100644
index b829cd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/TextWindow.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.guiutils;
-
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.window.ApplicationWindow;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Brings up a simple text window.
- * 
- * @author mengbo
- */
-public class TextWindow extends ApplicationWindow {
-	private String _content;
-
-	private Point _size = new Point(600, 600);
-
-	/**
-	 * empty for passing from events.
-	 * @param parentShell 
-	 * @param content 
-	 */
-	public TextWindow(Shell parentShell, String content) {
-		super(parentShell);
-		// addStatusLine();
-		_content = content;
-		// addCoolBar(SWT.BORDER);
-		// addMenuBar();
-		// addToolBar(SWT.BORDER);
-	}
-
-	protected Control createContents(Composite parent) {
-		// _text = new Text(parent, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
-		// _text.setText(_content);
-		// return _text;
-
-		TextViewer tview = new TextViewer(parent, SWT.BORDER | SWT.V_SCROLL
-				| SWT.H_SCROLL);
-		tview.setDocument(new Document(_content));
-
-		return tview.getControl();
-	}
-
-
-	protected Point getInitialSize() {
-		return _size;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/messages.properties
deleted file mode 100644
index 6291ec0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/guiutils/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-IntroductionSection_noIntroDescription=No Introduction page configuration found in the plugin.xml
-IntroductionSection_noIntroTitle=No Introduction
-BrowserWindow_loading=<b>Loading...</b>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/logging/Logger.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/logging/Logger.java
deleted file mode 100644
index 3b71b83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/logging/Logger.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.logging;
-
-import java.text.MessageFormat;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.Bundle;
-
-/**
- * A resource bundle driven logger
- *
- */
-public class Logger {
-	private ResourceBundle resourceBundle;
-
-	private ILog log;
-
-	private String bundleId;
-
-	/**
-	 * @param bundle
-	 * @param resourceBundle
-	 */
-	public Logger(Bundle bundle, ResourceBundle resourceBundle) {
-		log = Platform.getLog(bundle);
-		this.resourceBundle = resourceBundle;
-		bundleId = bundle.getSymbolicName();
-		if (resourceBundle == null) {
-			IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-					"The resource Bundle for logger could not be null!", null); //$NON-NLS-1$
-			log.log(status);
-		}
-	}
-	/**
-	 * @param key
-	 * @param arg0
-	 */
-	public void info(String key, String arg0) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, null);
-		log.log(status);
-	}
-
-	/**
-	 * @param message
-	 */
-	public void info(String message) {
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, null);
-		log.log(status);
-	}
-
-	/**
-	 * @param key
-	 * @param e
-	 */
-	public void info(String key, Throwable e) {
-		String message = getString(key);
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-
-	/**
-	 * @param key
-	 * @param arg0
-	 * @param e
-	 */
-	public void info(String key, String arg0, Throwable e) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, null);
-		log.log(status);
-	}
-	
-	/**
-	 * @param key
-	 * @param arg0
-	 * @param arg1
-	 * @param e
-	 */
-	public void info(String key, String arg0, String arg1, Throwable e) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.INFO, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-
-    /**
-     * @param key
-     */
-    public void error(String key) {
-        
-        String message = getString(key);
-        IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-                message, null);
-        log.log(status);
-    }
-
-	/**
-	 * @param e
-	 */
-	public void error(Throwable e) {
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK, "", e); //$NON-NLS-1$
-		log.log(status);
-	}
-
-	/**
-	 * @param key
-	 * @param e
-	 */
-	public void error(String key, Throwable e) {
-		String message = getString(key);
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-	
-	/**
-	 * @param key
-	 * @param arg0
-	 */
-	public void error(String key, String arg0) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-				message, null);
-		log.log(status);
-	}
-
-	/**
-	 * @param key
-	 * @param arg
-	 * @param e
-	 */
-	public void error(String key, String arg, Throwable e) {
-		Object[] args = new Object[1];
-		args[0] = arg;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-
-	/**
-	 * @param key
-	 * @param arg0
-	 * @param arg1
-	 * @param e
-	 */
-	public void error(String key, String arg0, String arg1, Throwable e) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		String message = formatter.format(args);
-		IStatus status = new Status(IStatus.ERROR, bundleId, IStatus.OK,
-				message, e);
-		log.log(status);
-	}
-    
-    /**
-     * @param key
-     * @return the resource for the key, or an error message if
-     * resourceBundle.getString(key) throws an Exception
-     */
-    private String getString(String key)
-    {
-        try
-        {
-            return resourceBundle.getString(key);
-        }
-        // suppress non-error exceptions so that the logging operation
-        // itself (usually called in response to an exception) does not
-        // throw a new exception
-        catch(Exception e)
-        {
-            return "!!missing resource: " + key + "!!"; //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.java
deleted file mode 100644
index 8202245..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author cbateman
- *
- */
-public class OrderingMessages extends NLS
-{
-    private static final String BUNDLE_NAME= "org.eclipse.jst.jsf.common.ui.internal.preferences.OrderingMessages";//$NON-NLS-1$
-
-    private OrderingMessages() {
-        // Do not instantiate
-    }
-
-    /**
-     * see OrderMessages.properties
-     */
-    public static String Ordering_Up;
-    /**
-     * see OrderMessages.properties
-     */
-    public static String Ordering_Down;
-    
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, OrderingMessages.class);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.properties
deleted file mode 100644
index 282ee23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/OrderingMessages.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-Ordering_Up=Up
-Ordering_Down=Down
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/StrategyOrderingPanel.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/StrategyOrderingPanel.java
deleted file mode 100644
index c438b96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/preferences/StrategyOrderingPanel.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.preferences;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider;
-import org.eclipse.jst.jsf.common.internal.policy.OrderedListProvider.OrderableObject;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PixelConverter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * Creates a composite with a checked table viewer and up/down buttons that
- * allow ordering and enablement of a list of items in the table.
- * 
- * Largely derived from
- * org.eclipse.jdt.internal.ui.preferences.CodeAssistAdvancedConfigurationBlock
- * 
- * @author cbateman
- * 
- */
-public class StrategyOrderingPanel
-{
-    private CheckboxTableViewer       _viewer;
-    private Button                    fUpButton;
-    private Button                    fDownButton;
-
-    private final OrderedListProvider _provider;
-    private final ITableLabelProvider _labelProvider;
-    private final String              _title;
-
-    /**
-     * @param provider
-     * @param labelProvider
-     * @param title 
-     */
-    public StrategyOrderingPanel(final OrderedListProvider provider,
-            final ITableLabelProvider labelProvider, final String title)
-    {
-        _provider = provider;
-        _labelProvider = labelProvider;
-        _title = title;
-    }
-
-    /**
-     * @param parent
-     * @return the control
-     */
-    public Control createContents(final Composite parent)
-    {
-        final Composite panel = new Composite(parent, SWT.NONE);
-        final GridLayout layout = new GridLayout(2, false);
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        panel.setLayout(layout);
-
-        final Label titleLabel = new Label(panel, SWT.NONE);
-        titleLabel.setText(_title);
-        final GridData gridData = new GridData(GridData.FILL,
-                GridData.BEGINNING, true, false, 2, 1);
-        titleLabel.setLayoutData(gridData);
-
-        createTableViewer(panel);
-        createButtonList(panel);
-
-        return panel;
-    }
-
-    /**
-     * Refresh the UI from model. Must not be called before createContents
-     */
-    public void refresh()
-    {
-        _provider.resetOrderedObjects();
-        _viewer.refresh();
-        for (final OrderableObject object : _provider.getOrderedObjects())
-        {
-            _viewer.setChecked(object, object.isEnabled());
-        }
-    }
-
-    private void createTableViewer(final Composite parent)
-    {
-        _viewer = CheckboxTableViewer.newCheckList(parent, SWT.SINGLE
-                | SWT.BORDER);
-        final Table table = _viewer.getTable();
-        table.setHeaderVisible(false);
-        table.setLinesVisible(false);
-        table.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING,
-                true, false, 1, 1));
-
-        final TableColumn nameColumn = new TableColumn(table, SWT.NONE);
-        // nameColumn
-        // .setText(PreferencesMessages.CodeAssistAdvancedConfigurationBlock_separate_table_category_column_title);
-        nameColumn.setResizable(false);
-
-        _viewer.setContentProvider(new ContentProvider());
-
-        _viewer.setLabelProvider(_labelProvider);
-        _viewer.setInput(_provider);
-
-        final int ICON_AND_CHECKBOX_WITH = 50;
-        final int HEADER_MARGIN = 20;
-        int minNameWidth = computeWidth(table, nameColumn.getText())
-                + HEADER_MARGIN;
-        for (int i = 0; i < _provider.getOrderedObjects().size(); i++)
-        {
-            minNameWidth = Math.max(minNameWidth, computeWidth(table,
-                    _labelProvider.getColumnText(_provider.getOrderedObjects()
-                            .get(i), 0))
-                    + ICON_AND_CHECKBOX_WITH);
-        }
-
-        nameColumn.setWidth(minNameWidth);
-
-        _viewer.addCheckStateListener(new ICheckStateListener()
-        {
-            public void checkStateChanged(final CheckStateChangedEvent event)
-            {
-                final boolean checked = event.getChecked();
-                final OrderableObject element = (OrderableObject) event
-                        .getElement();
-                element.setEnabled(checked);
-            }
-        });
-
-        table.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                handleTableSelection();
-            }
-        });
-
-    }
-
-    private void createButtonList(final Composite parent)
-    {
-        final Composite composite = new Composite(parent, SWT.NONE);
-        composite.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING,
-                false, false));
-
-        final GridLayout layout = new GridLayout();
-        layout.marginWidth = 0;
-        layout.marginHeight = 0;
-        composite.setLayout(layout);
-
-        fUpButton = new Button(composite, SWT.PUSH | SWT.CENTER);
-        fUpButton.setText(OrderingMessages.Ordering_Up);
-        fUpButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final int index = getSelectionIndex();
-                if (index != -1)
-                {
-                    final OrderableObject object = _provider
-                            .getOrderedObjects().get(index);
-                    _provider.moveUp(object);
-                    _viewer.refresh();
-                    handleTableSelection();
-                }
-            }
-        });
-        fUpButton.setLayoutData(new GridData());
-        setButtonDimensionHint(fUpButton);
-
-        fDownButton = new Button(composite, SWT.PUSH | SWT.CENTER);
-        fDownButton.setText(OrderingMessages.Ordering_Down);
-        fDownButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final int index = getSelectionIndex();
-                if (index != -1)
-                {
-                    final OrderableObject object = _provider
-                            .getOrderedObjects().get(index);
-                    _provider.moveDown(object);
-                    _viewer.refresh();
-                    handleTableSelection();
-                }
-            }
-        });
-        fDownButton.setLayoutData(new GridData());
-        setButtonDimensionHint(fDownButton);
-    }
-
-    private int computeWidth(final Control control, final String name)
-    {
-        if (name == null)
-        {
-            return 0;
-        }
-        final GC gc = new GC(control);
-        try
-        {
-            gc.setFont(JFaceResources.getDialogFont());
-            return gc.stringExtent(name).x + 10;
-        }
-        finally
-        {
-            gc.dispose();
-        }
-    }
-
-    private void handleTableSelection()
-    {
-        final OrderableObject item = getSelectedItem();
-        if (item != null)
-        {
-            final int index = getSelectionIndex();
-            fUpButton.setEnabled(index > 0);
-            fDownButton
-                    .setEnabled(index < _provider.getOrderedObjects().size() - 1);
-        }
-        else
-        {
-            fUpButton.setEnabled(false);
-            fDownButton.setEnabled(false);
-        }
-    }
-
-    private OrderableObject getSelectedItem()
-    {
-        return (OrderableObject) ((IStructuredSelection) _viewer.getSelection())
-                .getFirstElement();
-    }
-
-    private int getSelectionIndex()
-    {
-        return _viewer.getTable().getSelectionIndex();
-    }
-
-    /**
-     * Returns a width hint for a button control.
-     */
-    private static int getButtonWidthHint(final Button button)
-    {
-        button.setFont(JFaceResources.getDialogFont());
-        PixelConverter converter = new PixelConverter(button);
-        final int widthHint = converter
-                .convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-        return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-                true).x);
-    }
-
-    /**
-     * Sets width and height hint for the button control. <b>Note:</b> This is
-     * a NOP if the button's layout data is not an instance of
-     * <code>GridData</code>.
-     * 
-     * @param button
-     *            the button for which to set the dimension hint
-     */
-    private static void setButtonDimensionHint(final Button button)
-    {
-        Assert.isNotNull(button);
-        final Object gd = button.getLayoutData();
-        if (gd instanceof GridData)
-        {
-            ((GridData) gd).widthHint = getButtonWidthHint(button);
-            ((GridData) gd).horizontalAlignment = GridData.FILL;
-        }
-    }
-
-    private static class ContentProvider implements IStructuredContentProvider
-    {
-
-        public Object[] getElements(final Object inputElement)
-        {
-            if (inputElement instanceof OrderedListProvider)
-            {
-                return ((OrderedListProvider) inputElement).getOrderedObjects()
-                        .toArray();
-            }
-            return new Object[0];
-        }
-
-        public void dispose()
-        {
-            // do nothing
-        }
-
-        public void inputChanged(final Viewer viewer, final Object oldInput,
-                final Object newInput)
-        {
-            // do nothing
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/FavoriteConfigurations.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/FavoriteConfigurations.java
deleted file mode 100644
index aa7744b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/FavoriteConfigurations.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.XMLMemento;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * This provides a means to store common properties for pages.
- * 
- * Holds a <code>List</code> of <code>Properties</code> which can be
- * manipulated by the user.
- * 
- * @author mengbo
- */
-public class FavoriteConfigurations {
-	private static Logger _log = JSFUICommonPlugin
-			.getLogger(FavoriteConfigurations.class);
-
-	private final static String FAV_EXTENSIONS = ".xml"; //$NON-NLS-1$
-
-	private final static String ELEMENT_ROOT = "favorite"; //$NON-NLS-1$
-
-	private final static String ELEMENT_CONFIG = "config"; //$NON-NLS-1$
-
-	private final static String ELEMENT_NAME = "name"; //$NON-NLS-1$
-
-	private final static String ELEMENT_PROPERTY = "property"; //$NON-NLS-1$
-
-	private final static String ELEMENT_VALUE = "value"; //$NON-NLS-1$
-
-	private Map _favorites;
-
-	private IPath _favoriteFile;
-
-	private String _favoriteName;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param plugin
-	 *            used for location of favorite file.
-	 * @param favoriteName
-	 *            used for name of file and for mapping the properties of this
-	 *            favorite.
-	 */
-	public FavoriteConfigurations(AbstractUIPlugin plugin, String favoriteName) {
-		super();
-		_favoriteFile = plugin.getStateLocation().append(
-				scanFileName(favoriteName) + FAV_EXTENSIONS);
-		readFavorites();
-	}
-
-	/**
-	 * Returns the favorite entry that is mapped under the given name.
-	 * 
-	 * @param name
-	 *            the favorite
-	 * @return <code>Properties</code> config entry for the favorite.
-	 */
-	public Properties getFavorite(String name) {
-		return (Properties) _favorites.get(name);
-	}
-
-	/**
-	 * Stores the Favorites into the plugin directory.
-	 */
-	public void saveFavorites() {
-		FileWriter fw = null;
-		try {
-			XMLMemento memento = XMLMemento.createWriteRoot(ELEMENT_ROOT);
-			for (Iterator it = _favorites.keySet().iterator(); it.hasNext();) {
-				String favName = (String) it.next();
-				Map props = new HashMap((Properties) _favorites.get(favName));
-
-				IMemento config = memento.createChild(ELEMENT_CONFIG);
-				config.putString(ELEMENT_NAME, favName);
-
-				for (Iterator it1 = props.keySet().iterator(); it1.hasNext();) {
-					IMemento entry = config.createChild(ELEMENT_PROPERTY);
-					String name = (String) it1.next();
-					entry.putString(ELEMENT_NAME, name);
-					entry.putString(ELEMENT_VALUE, (String) props.get(name));
-				}
-			}
-			fw = new FileWriter(_favoriteFile.toFile());
-			memento.save(fw);
-		} catch (Exception ee) {
-			// log.FavoriteConfigurations.save.error=Failed to save {0}
-			// favorites. File={1}
-			_log.info("log.FavoriteConfigurations.save.error", _favoriteName, //$NON-NLS-1$
-					_favoriteFile.toOSString(), ee);
-		} finally {
-			if (fw != null) {
-				try {
-					fw.close();
-				} catch (IOException ee)// NOPMD
-				{
-					// nothing to do when IOException throwed in closing files.
-				}
-			}
-		}
-	}
-
-	/**
-	 * Add the favorite into the internal structure but don't save until
-	 * saveFavorites() is called.
-	 * 
-	 * @param name
-	 * @param config
-	 */
-	public void addFavorite(String name, Properties config) {
-		_favorites.put(name, config);
-	}
-
-	/**
-	 * Removes the Favorite that is mapped under the given name.
-	 * 
-	 * @param name
-	 *            the name of the configuration
-	 */
-	public void removeFavorite(String name) {
-		_favorites.remove(name);
-	}
-
-	/**
-	 * Read the favorites from the disk into the memory structure.
-	 */
-	protected void readFavorites() {
-		_favorites = new HashMap();
-		FileReader fr = null;
-		try {
-			try {
-				fr = new FileReader(_favoriteFile.toFile());
-			} catch (FileNotFoundException ee)// NOPMD
-			{
-				// no error here since they don't have to have a favorites...
-			}
-			if (fr != null) {
-				XMLMemento memento = XMLMemento.createReadRoot(fr);
-				IMemento[] children = memento.getChildren(ELEMENT_CONFIG);
-				for (int ii = 0; ii < children.length; ii++) {
-					Properties props = new Properties();
-					IMemento config = children[ii];
-					String name = config.getString(ELEMENT_NAME);
-
-					IMemento[] configProperties = config
-							.getChildren(ELEMENT_PROPERTY);
-					for (int jj = 0; jj < configProperties.length; jj++) {
-						IMemento entry = configProperties[jj];
-						setProperty(props, entry.getString(ELEMENT_NAME), entry
-								.getString(ELEMENT_VALUE));
-					}
-					_favorites.put(name, props);
-				}
-			}
-		} catch (Exception ee) {
-			// log.FavoriteConfigurations.read.error=Failed to save {0}
-			// favorites. File={1}
-			_log.error("log.FavoriteConfigurations.read.error", _favoriteName, //$NON-NLS-1$
-					_favoriteFile.toOSString(), ee);
-		} finally {
-			if (fr != null) {
-				try {
-					fr.close();
-				} catch (IOException ee)// NOPMD
-				{
-					// nothing to do when IOException throwed in closing files.
-				}
-			}
-		}
-	}
-
-	/**
-	 * Set the value in the properties object.
-	 * 
-	 * @param props
-	 * @param name
-	 * @param value
-	 */
-	private void setProperty(Properties props, String name, String value) {
-		if (name != null && value != null) {
-			props.setProperty(name, value);
-		}
-	}
-
-	/**
-	 * Get a list of all the favorites stored in this file.
-	 * 
-	 * @return list of favorites
-	 */
-	public String[] getFavoritesList() {
-		Object[] objs = _favorites.keySet().toArray();
-		String[] names = new String[objs.length];
-
-		for (int ii = 0; ii < objs.length; ii++) {
-			names[ii] = (String) objs[ii];
-		}
-		Arrays.sort(names);
-
-		return names;
-	}
-
-	/**
-	 * scan the file name for any bad character that would fail when trying to
-	 * create the file. We replace bad characters with '_'
-	 */
-	private static String scanFileName(String filename) {
-		StringBuffer strBuf = new StringBuffer();
-		char[] chars = filename.toCharArray();
-
-		for (int ii = 0; ii < chars.length; ii++) {
-			switch (chars[ii]) {
-			case '&':
-			case '\\':
-			case '/':
-			case ' ':
-			case '\t':
-			case ':':
-			case '.':
-			case '\"':
-			case '\'':
-			case '@':
-				strBuf.append('_');
-				break;
-			default:
-				strBuf.append(chars[ii]);
-				break;
-			}
-		}
-
-		return strBuf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JSFSharedImages.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JSFSharedImages.java
deleted file mode 100644
index 2b67a67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JSFSharedImages.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-/**
- * Constants that can be passed to JSFUICommonPlugin.getImageDescriptor and
- * getImage to obtain common images.
- * 
- * @author cbateman
- *
- */
-public interface JSFSharedImages
-{
-    /**
-     * The icon use for default/unknown tags.  Consists of blue open/close
-     * angled braces on a neutral background. 
-     * 
-     * Size: 16x16
-     */
-    public final static String DEFAULT_PALETTE_TAG_IMG = "PD_Palette_Default.gif"; //$NON-NLS-1$
-    
-    /**
-     * A yellow cube on a white background.  Suitable for representing 
-     * generic objects and components.
-     * 
-     * Size: 16x16
-     */
-    public final static String GENERIC_OBJECT_IMG = "object.gif"; //$NON-NLS-1$
-    
-    /**
-     * A generic image suitable for representing JSF validators.  Consists of
-     * a white box with a blue check mark.
-     * 
-     * Size: 16x16
-     */
-    public final static String GENERIC_VALIDATOR_IMG = "jsf_validator.gif"; //$NON-NLS-1$
-
-    /**
-     * A generic image suitable for representing JSF converter.  Consists of
-     * yellow blob being "converted".
-     * 
-     * Size: 16x16
-     */
-    public final static String GENERIC_CONVERTER_IMG = "jsf_converter.gif"; //$NON-NLS-1$
-
-    /**
-     * A generic image suitable for representing a view root.  Same as the
-     * default image generally associated with f:view.
-     * 
-     * Size: 16x16.
-     */
-    public static final String GENERIC_VIEWROOT_IMG = "jsf_view.gif"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java
deleted file mode 100644
index c4086ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/JavaModelUtil.java
+++ /dev/null
@@ -1,1032 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.ClasspathContainerInitializer;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IClasspathContainer;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IImportDeclaration;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.core.compiler.CharOperation;
-
-/**
- * Original code is from JDT Utility methods for the Java Model.
- */
-public final class JavaModelUtil {
-
-	/**
-	 * Finds a type by its qualified type name (dot separated).
-	 * 
-	 * @param jproject
-	 *            The java project to search in
-	 * @param fullyQualifiedName
-	 *            The fully qualified name (type name with enclosing type names
-	 *            and package (all separated by dots))
-	 * @return The type found, or null if not existing
-	 * @throws JavaModelException 
-	 */
-	public static IType findType(IJavaProject jproject,
-			String fullyQualifiedName) throws JavaModelException {
-		// workaround for bug 22883
-		IType type = jproject.findType(fullyQualifiedName);
-		if (type != null) {
-			return type;
-		}
-		IPackageFragmentRoot[] roots = jproject.getPackageFragmentRoots();
-		for (int i = 0; i < roots.length; i++) {
-			IPackageFragmentRoot root = roots[i];
-			type = findType(root, fullyQualifiedName);
-			if (type != null && type.exists()) {
-				return type;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns <code>true</code> if the given package fragment root is
-	 * referenced. This means it is own by a different project but is referenced
-	 * by the root's parent. Returns <code>false</code> if the given root
-	 * doesn't have an underlying resource.
-	 * @param root 
-	 * @return true if root is referenced
-	 */
-	public static boolean isReferenced(IPackageFragmentRoot root) {
-		IResource resource = root.getResource();
-		if (resource != null) {
-			IProject jarProject = resource.getProject();
-			IProject container = root.getJavaProject().getProject();
-			return !container.equals(jarProject);
-		}
-		return false;
-	}
-
-	private static IType findType(IPackageFragmentRoot root,
-			String fullyQualifiedName) throws JavaModelException {
-		IJavaElement[] children = root.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			IJavaElement element = children[i];
-			if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) {
-				IPackageFragment pack = (IPackageFragment) element;
-				if (!fullyQualifiedName.startsWith(pack.getElementName())) {
-					continue;
-				}
-				IType type = findType(pack, fullyQualifiedName);
-				if (type != null && type.exists()) {
-					return type;
-				}
-			}
-		}
-		return null;
-	}
-
-	private static IType findType(IPackageFragment pack,
-			String fullyQualifiedName) throws JavaModelException {
-		ICompilationUnit[] cus = pack.getCompilationUnits();
-		for (int i = 0; i < cus.length; i++) {
-			ICompilationUnit unit = cus[i];
-			IType type = findType(unit, fullyQualifiedName);
-			if (type != null && type.exists()) {
-				return type;
-			}
-		}
-		return null;
-	}
-
-	private static IType findType(ICompilationUnit cu, String fullyQualifiedName)
-			throws JavaModelException {
-		IType[] types = cu.getAllTypes();
-		for (int i = 0; i < types.length; i++) {
-			IType type = types[i];
-			if (getFullyQualifiedName(type).equals(fullyQualifiedName)) {
-				return type;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds a type by package and type name.
-	 * 
-	 * @param jproject
-	 *            the java project to search in
-	 * @param pack
-	 *            The package name
-	 * @param typeQualifiedName
-	 *            the type qualified name (type name with enclosing type names
-	 *            (separated by dots))
-	 * @return the type found, or null if not existing
-	 * @throws JavaModelException 
-	 * @deprecated Use IJavaProject.findType(String, String) instead
-	 */
-	public static IType findType(IJavaProject jproject, String pack,
-			String typeQualifiedName) throws JavaModelException {
-		return jproject.findType(pack, typeQualifiedName);
-	}
-
-	/**
-	 * Finds a type container by container name. The returned element will be of
-	 * type <code>IType</code> or a <code>IPackageFragment</code>.
-	 * <code>null</code> is returned if the type container could not be found.
-	 * 
-	 * @param jproject
-	 *            The Java project defining the context to search
-	 * @param typeContainerName
-	 *            A dot separarted name of the type container
-	 * @return the java element
-	 * @throws JavaModelException 
-	 * @see #getTypeContainerName(IType)
-	 */
-	public static IJavaElement findTypeContainer(IJavaProject jproject,
-			String typeContainerName) throws JavaModelException {
-		// try to find it as type
-		IJavaElement result = jproject.findType(typeContainerName);
-		if (result == null) {
-			// find it as package
-			IPath path = new Path(typeContainerName.replace('.', '/'));
-			result = jproject.findElement(path);
-			if (!(result instanceof IPackageFragment)) {
-				result = null;
-			}
-
-		}
-		return result;
-	}
-
-	/**
-	 * Finds a type in a compilation unit. Typical usage is to find the
-	 * corresponding type in a working copy.
-	 * 
-	 * @param cu
-	 *            the compilation unit to search in
-	 * @param typeQualifiedName
-	 *            the type qualified name (type name with enclosing type names
-	 *            (separated by dots))
-	 * @return the type found, or null if not existing
-	 * @throws JavaModelException 
-	 */
-	public static IType findTypeInCompilationUnit(ICompilationUnit cu,
-			String typeQualifiedName) throws JavaModelException {
-		IType[] types = cu.getAllTypes();
-		for (int i = 0; i < types.length; i++) {
-			String currName = getTypeQualifiedName(types[i]);
-			if (typeQualifiedName.equals(currName)) {
-				return types[i];
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds a a member in a compilation unit. Typical usage is to find the
-	 * corresponding member in a working copy.
-	 * 
-	 * @param cu
-	 *            the compilation unit (eg. working copy) to search in
-	 * @param member
-	 *            the member (eg. from the original)
-	 * @return the member found, or null if not existing
-	 */
-	public static IMember findMemberInCompilationUnit(ICompilationUnit cu,
-			IMember member) {
-		IJavaElement[] elements = cu.findElements(member);
-		if (elements != null && elements.length > 0) {
-			return (IMember) elements[0];
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the element of the given compilation unit which is "equal" to the
-	 * given element. Note that the given element usually has a parent different
-	 * from the given compilation unit.
-	 * 
-	 * @param cu
-	 *            the cu to search in
-	 * @param element
-	 *            the element to look for
-	 * @return an element of the given cu "equal" to the given element
-	 */
-	public static IJavaElement findInCompilationUnit(ICompilationUnit cu,
-			IJavaElement element) {
-		IJavaElement[] elements = cu.findElements(element);
-		if (elements != null && elements.length > 0) {
-			return elements[0];
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the qualified type name of the given type using '.' as
-	 * separators. This is a replace for IType.getTypeQualifiedName() which uses
-	 * '$' as separators. As '$' is also a valid character in an id this is
-	 * ambiguous. JavaCore PR: 1GCFUNT
-	 * @param type 
-	 * @return the type qualified name
-	 */
-	public static String getTypeQualifiedName(IType type) {
-		return type.getTypeQualifiedName('.');
-	}
-
-	/**
-	 * Returns the fully qualified name of the given type using '.' as
-	 * separators. This is a replace for IType.getFullyQualifiedTypeName which
-	 * uses '$' as separators. As '$' is also a valid character in an id this is
-	 * ambiguous. JavaCore PR: 1GCFUNT
-	 * @param type 
-	 * @return the fully qualified name using . as the separator
-	 */
-	public static String getFullyQualifiedName(IType type) {
-		return type.getFullyQualifiedName('.');
-	}
-
-	/**
-	 * Returns the fully qualified name of a type's container. (package name or
-	 * enclosing type name)
-	 * @param type 
-	 * @return the container name
-	 */
-	public static String getTypeContainerName(IType type) {
-		IType outerType = type.getDeclaringType();
-		if (outerType != null) {
-			return outerType.getFullyQualifiedName('.');
-		}
-        return type.getPackageFragment().getElementName();
-	}
-
-	/**
-	 * Concatenates two names. Uses a dot for separation. Both strings can be
-	 * empty or <code>null</code>.
-	 * @param name1 
-	 * @param name2 
-	 * @return name1 + name2
-	 */
-	public static String concatenateName(String name1, String name2) {
-		StringBuffer buf = new StringBuffer();
-		if (name1 != null && name1.length() > 0) {
-			buf.append(name1);
-		}
-		if (name2 != null && name2.length() > 0) {
-			if (buf.length() > 0) {
-				buf.append('.');
-			}
-			buf.append(name2);
-		}
-		return buf.toString();
-	}
-
-	/**
-	 * Concatenates two names. Uses a dot for separation. Both strings can be
-	 * empty or <code>null</code>.
-	 * @param name1 
-	 * @param name2 
-	 * @return name1 + name2
-	 */
-	public static String concatenateName(char[] name1, char[] name2) {
-		StringBuffer buf = new StringBuffer();
-		if (name1 != null && name1.length > 0) {
-			buf.append(name1);
-		}
-		if (name2 != null && name2.length > 0) {
-			if (buf.length() > 0) {
-				buf.append('.');
-			}
-			buf.append(name2);
-		}
-		return buf.toString();
-	}
-
-	/**
-	 * Evaluates if a member (possible from another package) is visible from
-	 * elements in a package.
-	 * 
-	 * @param member
-	 *            The member to test the visibility for
-	 * @param pack
-	 *            The package in focus
-	 * @return true if visible
-	 * @throws JavaModelException 
-	 */
-	public static boolean isVisible(IMember member, IPackageFragment pack)
-			throws JavaModelException {
-
-		int type = member.getElementType();
-		if (type == IJavaElement.INITIALIZER
-				|| (type == IJavaElement.METHOD && member.getElementName()
-						.startsWith("<"))) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			return false;
-		}
-
-		int otherflags = member.getFlags();
-		IType declaringType = member.getDeclaringType();
-		if (Flags.isPublic(otherflags)
-				|| (declaringType != null && declaringType.isInterface())) {
-			return true;
-		} else if (Flags.isPrivate(otherflags)) {
-			return false;
-		}
-
-		IPackageFragment otherpack = (IPackageFragment) findParentOfKind(
-				member, IJavaElement.PACKAGE_FRAGMENT);
-		return (pack != null && otherpack != null && isSamePackage(pack,
-				otherpack));
-	}
-
-	/**
-	 * Evaluates if a member in the focus' element hierarchy is visible from
-	 * elements in a package.
-	 * 
-	 * @param member
-	 *            The member to test the visibility for
-	 * @param pack
-	 *            The package of the focus element focus
-	 * @return true if is visible in hiearchy
-	 * @throws JavaModelException 
-	 */
-	public static boolean isVisibleInHierarchy(IMember member,
-			IPackageFragment pack) throws JavaModelException {
-		int type = member.getElementType();
-		if (type == IJavaElement.INITIALIZER
-				|| (type == IJavaElement.METHOD && member.getElementName()
-						.startsWith("<"))) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			return false;
-		}
-
-		int otherflags = member.getFlags();
-
-		IType declaringType = member.getDeclaringType();
-		if (Flags.isPublic(otherflags) || Flags.isProtected(otherflags)
-				|| (declaringType != null && declaringType.isInterface())) {
-			return true;
-		} else if (Flags.isPrivate(otherflags)) {
-			return false;
-		}
-
-		IPackageFragment otherpack = (IPackageFragment) findParentOfKind(
-				member, IJavaElement.PACKAGE_FRAGMENT);
-		return (pack != null && pack.equals(otherpack));
-	}
-
-	/**
-	 * Returns the package fragment root of <code>IJavaElement</code>. If the
-	 * given element is already a package fragment root, the element itself is
-	 * returned.
-	 * @param element 
-	 * @return the package fragment root
-	 */
-	public static IPackageFragmentRoot getPackageFragmentRoot(
-			IJavaElement element) {
-		return (IPackageFragmentRoot) element
-				.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
-	}
-
-	/**
-	 * Returns the parent of the supplied java element that conforms to the
-	 * given parent type or <code>null</code>, if such a parent doesn't exit.
-	 * 
-	 * @deprecated Use element.getParent().getAncestor(kind);
-	 */
-	private static IJavaElement findParentOfKind(IJavaElement element, int kind) {
-		if (element != null && element.getParent() != null) {
-			return element.getParent().getAncestor(kind);
-		}
-		return null;
-	}
-
-	/**
-	 * Finds a method in a type. This searches for a method with the same name
-	 * and signature. Parameter types are only compared by the simple name, no
-	 * resolving for the fully qualified type name is done. Constructors are
-	 * only compared by parameters, not the name.
-	 * 
-	 * @param name
-	 *            The name of the method to find
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param isConstructor
-	 *            If the method is a constructor
-	 * @param type 
-	 * @return The first found method or <code>null</code>, if nothing found
-	 * @throws JavaModelException 
-	 */
-	public static IMethod findMethod(String name, String[] paramTypes,
-			boolean isConstructor, IType type) throws JavaModelException {
-		return findMethod(name, paramTypes, isConstructor, type.getMethods());
-	}
-
-	/**
-	 * Finds a method by name. This searches for a method with a name and
-	 * signature. Parameter types are only compared by the simple name, no
-	 * resolving for the fully qualified type name is done. Constructors are
-	 * only compared by parameters, not the name.
-	 * 
-	 * @param name
-	 *            The name of the method to find
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param isConstructor
-	 *            If the method is a constructor
-	 * @param methods
-	 *            The methods to search in
-	 * @return The found method or <code>null</code>, if nothing found
-	 * @throws JavaModelException 
-	 */
-	public static IMethod findMethod(String name, String[] paramTypes,
-			boolean isConstructor, IMethod[] methods) throws JavaModelException {
-		for (int i = methods.length - 1; i >= 0; i--) {
-			if (isSameMethodSignature(name, paramTypes, isConstructor,
-					methods[i])) {
-				return methods[i];
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds a method declararion in a type's hierarchy. The search is top down,
-	 * so this returns the first declaration of the method in the hierarchy.
-	 * This searches for a method with a name and signature. Parameter types are
-	 * only compared by the simple name, no resolving for the fully qualified
-	 * type name is done. Constructors are only compared by parameters, not the
-	 * name.
-	 * @param hierarchy 
-	 * 
-	 * @param type
-	 *            Searches in this type's supertypes.
-	 * @param name
-	 *            The name of the method to find
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param isConstructor
-	 *            If the method is a constructor
-	 * @return The first method found or null, if nothing found
-	 * @throws JavaModelException 
-	 */
-	public static IMethod findMethodDeclarationInHierarchy(
-			ITypeHierarchy hierarchy, IType type, String name,
-			String[] paramTypes, boolean isConstructor)
-			throws JavaModelException {
-		IType[] superTypes = hierarchy.getAllSupertypes(type);
-		for (int i = superTypes.length - 1; i >= 0; i--) {
-			IMethod first = findMethod(name, paramTypes, isConstructor,
-					superTypes[i]);
-			if (first != null && !Flags.isPrivate(first.getFlags())) {
-				// the order getAllSupertypes does make assumptions of the order
-				// of inner elements -> search recursivly
-				IMethod res = findMethodDeclarationInHierarchy(hierarchy, first
-						.getDeclaringType(), name, paramTypes, isConstructor);
-				if (res != null) {
-					return res;
-				}
-				return first;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Finds a method implementation in a type's classhierarchy. The search is
-	 * bottom-up, so this returns the nearest overridden method. Does not find
-	 * methods in interfaces or abstract methods. This searches for a method
-	 * with a name and signature. Parameter types are only compared by the
-	 * simple name, no resolving for the fully qualified type name is done.
-	 * Constructors are only compared by parameters, not the name.
-	 * @param hierarchy 
-	 * 
-	 * @param type
-	 *            Type to search the superclasses
-	 * @param name
-	 *            The name of the method to find
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param isConstructor
-	 *            If the method is a constructor
-	 * @return The first method found or null, if nothing found
-	 * @throws JavaModelException 
-	 */
-	public static IMethod findMethodImplementationInHierarchy(
-			ITypeHierarchy hierarchy, IType type, String name,
-			String[] paramTypes, boolean isConstructor)
-			throws JavaModelException {
-		IType[] superTypes = hierarchy.getAllSuperclasses(type);
-		for (int i = 0; i < superTypes.length; i++) {
-			IMethod found = findMethod(name, paramTypes, isConstructor,
-					superTypes[i]);
-			if (found != null) {
-				if (Flags.isAbstract(found.getFlags())) {
-					return null;
-				}
-				return found;
-			}
-		}
-		return null;
-	}
-
-	private static IMethod findMethodInHierarchy(ITypeHierarchy hierarchy,
-			IType type, String name, String[] paramTypes, boolean isConstructor)
-			throws JavaModelException {
-		IMethod method = findMethod(name, paramTypes, isConstructor, type);
-		if (method != null) {
-			return method;
-		}
-		IType superClass = hierarchy.getSuperclass(type);
-		if (superClass != null) {
-			IMethod res = findMethodInHierarchy(hierarchy, superClass, name,
-					paramTypes, isConstructor);
-			if (res != null) {
-				return res;
-			}
-		}
-		if (!isConstructor) {
-			IType[] superInterfaces = hierarchy.getSuperInterfaces(type);
-			for (int i = 0; i < superInterfaces.length; i++) {
-				IMethod res = findMethodInHierarchy(hierarchy,
-						superInterfaces[i], name, paramTypes, false);
-				if (res != null) {
-					return res;
-				}
-			}
-		}
-		return method;
-	}
-
-	/**
-	 * Finds the method that is defines/declares the given method. The search is
-	 * bottom-up, so this returns the nearest defining/declaring method.
-	 * @param typeHierarchy 
-	 * @param type 
-	 * @param methodName 
-	 * @param paramTypes 
-	 * @param isConstructor 
-	 * 
-	 * @param testVisibility
-	 *            If true the result is tested on visibility. Null is returned
-	 *            if the method is not visible.
-	 * @return the method or null
-	 * @throws JavaModelException
-	 */
-	public static IMethod findMethodDefininition(ITypeHierarchy typeHierarchy,
-			IType type, String methodName, String[] paramTypes,
-			boolean isConstructor, boolean testVisibility)
-			throws JavaModelException {
-		IType superClass = typeHierarchy.getSuperclass(type);
-		if (superClass != null) {
-			IMethod res = findMethodInHierarchy(typeHierarchy, superClass,
-					methodName, paramTypes, isConstructor);
-			if (res != null && !Flags.isPrivate(res.getFlags())) {
-				if (!testVisibility
-						|| isVisibleInHierarchy(res, type.getPackageFragment())) {
-					return res;
-				}
-			}
-		}
-		if (!isConstructor) {
-			IType[] interfaces = typeHierarchy.getSuperInterfaces(type);
-			for (int i = 0; i < interfaces.length; i++) {
-				IMethod res = findMethodInHierarchy(typeHierarchy,
-						interfaces[i], methodName, paramTypes, false);
-				if (res != null) {
-					return res; // methods from interfaces are always public and
-					// therefore visible
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Tests if a method equals to the given signature. Parameter types are only
-	 * compared by the simple name, no resolving for the fully qualified type
-	 * name is done. Constructors are only compared by parameters, not the name.
-	 * 
-	 * @param name
-	 *            Name of the method
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param isConstructor
-	 *            Specifies if the method is a constructor
-	 * @param curr 
-	 * @return Returns <code>true</code> if the method has the given name and
-	 *         parameter types and constructor state.
-	 * @throws JavaModelException 
-	 */
-	public static boolean isSameMethodSignature(String name,
-			String[] paramTypes, boolean isConstructor, IMethod curr)
-			throws JavaModelException {
-		if (isConstructor || name.equals(curr.getElementName())) {
-			if (isConstructor == curr.isConstructor()) {
-				String[] currParamTypes = curr.getParameterTypes();
-				if (paramTypes.length == currParamTypes.length) {
-					for (int i = 0; i < paramTypes.length; i++) {
-						String t1 = Signature.getSimpleName(Signature
-								.toString(paramTypes[i]));
-						String t2 = Signature.getSimpleName(Signature
-								.toString(currParamTypes[i]));
-						if (!t1.equals(t2)) {
-							return false;
-						}
-					}
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Tests if two <code>IPackageFragment</code>s represent the same logical
-	 * java package.
-	 * @param pack1 
-	 * @param pack2 
-	 * 
-	 * @return <code>true</code> if the package fragments' names are equal.
-	 */
-	public static boolean isSamePackage(IPackageFragment pack1,
-			IPackageFragment pack2) {
-		return pack1.getElementName().equals(pack2.getElementName());
-	}
-
-	/**
-	 * Checks whether the given type has a valid main method or not.
-	 * @param type 
-	 * @return true if type has a main method
-	 * @throws JavaModelException 
-	 */
-	public static boolean hasMainMethod(IType type) throws JavaModelException {
-		IMethod[] methods = type.getMethods();
-		for (int i = 0; i < methods.length; i++) {
-			if (methods[i].isMainMethod()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks if the field is boolean.
-	 * @param field 
-	 * @return true if the file is of primitive boolean type
-	 * @throws JavaModelException 
-	 */
-	public static boolean isBoolean(IField field) throws JavaModelException {
-		return field.getTypeSignature().equals(Signature.SIG_BOOLEAN);
-	}
-
-	/**
-	 * Tests if the given element is on the class path of its containing
-	 * project. Handles the case that the containing project isn't a Java
-	 * project.
-	 * @param element 
-	 * @return true if element in on the class path?
-	 */
-	public static boolean isOnClasspath(IJavaElement element) {
-		IJavaProject project = element.getJavaProject();
-		if (!project.exists())
-			return false;
-		return project.isOnClasspath(element);
-	}
-
-	/**
-	 * Resolves a type name in the context of the declaring type.
-	 * 
-	 * @param refTypeSig
-	 *            the type name in signature notation (for example 'QVector')
-	 *            this can also be an array type, but dimensions will be
-	 *            ignored.
-	 * @param declaringType
-	 *            the context for resolving (type where the reference was made
-	 *            in)
-	 * @return returns the fully qualified type name or build-in-type name. if a
-	 *         unresoved type couldn't be resolved null is returned
-	 * @throws JavaModelException 
-	 */
-	public static String getResolvedTypeName(String refTypeSig,
-			IType declaringType) throws JavaModelException {
-		int arrayCount = Signature.getArrayCount(refTypeSig);
-		char type = refTypeSig.charAt(arrayCount);
-		if (type == Signature.C_UNRESOLVED) {
-			int semi = refTypeSig
-					.indexOf(Signature.C_SEMICOLON, arrayCount + 1);
-			if (semi == -1) {
-				throw new IllegalArgumentException();
-			}
-			String name = refTypeSig.substring(arrayCount + 1, semi);
-
-			String[][] resolvedNames = declaringType.resolveType(name);
-			if (resolvedNames != null && resolvedNames.length > 0) {
-				return JavaModelUtil.concatenateName(resolvedNames[0][0],
-						resolvedNames[0][1]);
-			}
-			return null;
-		}
-        return Signature.toString(refTypeSig.substring(arrayCount));
-	}
-
-	/**
-	 * Returns if a CU can be edited.
-	 * @param cu 
-	 * @return true if cu is editable
-	 */
-	public static boolean isEditable(ICompilationUnit cu) {
-		IResource resource = toOriginal(cu).getResource();
-		return (resource.exists() && !resource.getResourceAttributes()
-				.isReadOnly());
-	}
-
-	/**
-	 * Finds a qualified import for a type name.
-	 * @param cu 
-	 * @param simpleName 
-	 * @return the import declaration or null
-	 * @throws JavaModelException 
-	 */
-	public static IImportDeclaration findImport(ICompilationUnit cu,
-			String simpleName) throws JavaModelException {
-		IImportDeclaration[] existing = cu.getImports();
-		for (int i = 0; i < existing.length; i++) {
-			String curr = existing[i].getElementName();
-			if (curr.endsWith(simpleName)) {
-				int dotPos = curr.length() - simpleName.length() - 1;
-				if ((dotPos == -1)
-						|| (dotPos > 0 && curr.charAt(dotPos) == '.')) {
-					return existing[i];
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the original if the given member. If the member is already an
-	 * original the input is returned. The returned member might not exist
-	 * @param member 
-	 * @return the original IMember
-	 */
-	public static IMember toOriginal(IMember member) {
-		if (member instanceof IMethod) {
-			return toOriginalMethod((IMethod) member);
-		}
-
-		return (IMember) member.getPrimaryElement();
-		/*
-		 * ICompilationUnit cu= member.getCompilationUnit(); if (cu != null &&
-		 * cu.isWorkingCopy()) return (IMember)cu.getOriginal(member); return
-		 * member;
-		 */
-	}
-
-	/*
-	 * XXX workaround for bug 18568
-	 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=18568 to be removed once the
-	 * bug is fixed
-	 */
-	private static IMethod toOriginalMethod(IMethod method) {
-		ICompilationUnit cu = method.getCompilationUnit();
-		if (cu == null || isPrimary(cu)) {
-			return method;
-		}
-		try {
-			// use the workaround only if needed
-			if (!method.getElementName().equals(
-					method.getDeclaringType().getElementName()))
-				return (IMethod) method.getPrimaryElement();
-
-			IType originalType = (IType) toOriginal(method.getDeclaringType());
-			IMethod[] methods = originalType.findMethods(method);
-			boolean isConstructor = method.isConstructor();
-			for (int i = 0; i < methods.length; i++) {
-				if (methods[i].isConstructor() == isConstructor)
-					return methods[i];
-			}
-			return null;
-		} catch (JavaModelException e) {
-			return null;
-		}
-	}
-
-	// private static boolean PRIMARY_ONLY = false;
-
-	/**
-	 * Returns the original cu if the given cu is a working copy. If the cu is
-	 * already an original the input cu is returned. The returned cu might not
-	 * exist
-	 * @param cu 
-	 * @return the original compiliation unit
-	 */
-	public static ICompilationUnit toOriginal(ICompilationUnit cu) {
-		// To stay compatible with old version returned null
-		// if cu is null
-		if (cu == null)
-			return cu;
-		return cu.getPrimary();
-	}
-
-	/**
-	 * Returns the original element if the given element is a working copy. If
-	 * the cu is already an original the input element is returned. The returned
-	 * element might not exist
-	 * @param element 
-	 * @return element's primary element
-	 */
-	public static IJavaElement toOriginal(IJavaElement element) {
-		return element.getPrimaryElement();
-	}
-
-	/**
-	 * Returns true if a cu is a primary cu (original or shared working copy)
-	 * @param cu 
-	 * @return true if cu  is primary
-	 */
-	public static boolean isPrimary(ICompilationUnit cu) {
-		return cu.getOwner() == null;
-	}
-
-	/**
-	 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=19253
-	 * 
-	 * Reconciling happens in a separate thread. This can cause a situation
-	 * where the Java element gets disposed after an exists test has been done.
-	 * So we should not log not present exceptions when they happen in working
-	 * copies.
-	 * @param exception 
-	 * @return true if filter not present
-	 */
-	public static boolean filterNotPresentException(CoreException exception) {
-		if (!(exception instanceof JavaModelException)) {
-			return true;
-		}
-		JavaModelException je = (JavaModelException) exception;
-		if (!je.isDoesNotExist()) {
-			return true;
-		}
-		IJavaElement[] elements = je.getJavaModelStatus().getElements();
-		for (int i = 0; i < elements.length; i++) {
-			IJavaElement element = elements[i];
-			ICompilationUnit unit = (ICompilationUnit) element
-					.getAncestor(IJavaElement.COMPILATION_UNIT);
-			if (unit == null) {
-				return true;
-			}
-			if (!unit.isWorkingCopy()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param type
-	 * @param pm
-	 * @return all supertypes of type
-	 * @throws JavaModelException
-	 */
-	public static IType[] getAllSuperTypes(IType type, IProgressMonitor pm)
-			throws JavaModelException {
-		// workaround for 23656
-		Set types = new HashSet(Arrays.asList(type.newSupertypeHierarchy(pm)
-				.getAllSupertypes(type)));
-		IType objekt = type.getJavaProject().findType("java.lang.Object");//$NON-NLS-1$
-		if (objekt != null) {
-			types.add(objekt);
-		}
-		return (IType[]) types.toArray(new IType[types.size()]);
-	}
-
-	/**
-	 * @param resourcePath
-	 * @param exclusionPatterns
-	 * @return true if resourcePath is excluded by exclusion patterns
-	 */
-	public static boolean isExcludedPath(IPath resourcePath,
-			IPath[] exclusionPatterns) {
-		char[] path = resourcePath.toString().toCharArray();
-		for (int i = 0, length = exclusionPatterns.length; i < length; i++) {
-			char[] pattern = exclusionPatterns[i].toString().toCharArray();
-			if (CharOperation.pathMatch(pattern, path, true, '/')) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-
-	 * @see IClasspathEntry#getExclusionPatterns
-	 */
-	/**
-	 * Returns whether the given resource path matches one of the exclusion
-	 * patterns.
-	 * 
-	 * @param resourcePath
-	 * @param exclusionPatterns
-	 * @return true if resourcePath is excluded
-	 */
-	public static boolean isExcluded(IPath resourcePath,
-			char[][] exclusionPatterns) {
-		if (exclusionPatterns == null) {
-			return false;
-		}
-		char[] path = resourcePath.toString().toCharArray();
-		for (int i = 0, length = exclusionPatterns.length; i < length; i++) {
-			if (CharOperation.pathMatch(exclusionPatterns[i], path, true, '/')) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private static Boolean fgIsJDTCore_1_5 = null;
-
-	/**
-	 * @return true if JRE 1.5 in enabled.
-	 */
-	public static boolean isJDTCore_1_5() {
-		if (fgIsJDTCore_1_5 == null) {
-			fgIsJDTCore_1_5 = JavaCore
-					.getDefaultOptions()
-					.containsKey(
-							"org.eclipse.jdt.core.compiler.problem.unsafeTypeOperation") ? Boolean.TRUE //$NON-NLS-1$
-					: Boolean.FALSE;
-		}
-		return fgIsJDTCore_1_5.booleanValue();
-	}
-
-	/**
-	 * Helper method that tests if an classpath entry can be found in a
-	 * container. <code>null</code> is returned if the entry can not be found
-	 * or if the container does not allows the configuration of source
-	 * attachments
-	 * 
-	 * @param jproject
-	 *            The container's parent project
-	 * @param containerPath
-	 *            The path of the container
-	 * @param libPath
-	 *            The path of the library to be found
-	 * @return IClasspathEntry A classpath entry from the container of
-	 *         <code>null</code> if the container can not be modified.
-	 * @throws JavaModelException 
-	 */
-	public static IClasspathEntry getClasspathEntryToEdit(
-			IJavaProject jproject, IPath containerPath, IPath libPath)
-			throws JavaModelException {
-		IClasspathContainer container = JavaCore.getClasspathContainer(
-				containerPath, jproject);
-		ClasspathContainerInitializer initializer = JavaCore
-				.getClasspathContainerInitializer(containerPath.segment(0));
-		if (container != null
-				&& initializer != null
-				&& initializer.canUpdateClasspathContainer(containerPath,
-						jproject)) {
-			IClasspathEntry[] entries = container.getClasspathEntries();
-			for (int i = 0; i < entries.length; i++) {
-				IClasspathEntry curr = entries[i];
-				IClasspathEntry resolved = JavaCore
-						.getResolvedClasspathEntry(curr);
-				if (resolved != null && libPath.equals(resolved.getPath())) {
-					return curr; // return the real entry
-				}
-			}
-		}
-		return null; // attachment not possible
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PathUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PathUtil.java
deleted file mode 100644
index 8eebe90..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PathUtil.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.io.File;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJarEntryResource;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Collection of helper methods to manage and convert links Originally part of
- * the LinksManager (com.ibm.iwt.parser.util)
- */
-public final class PathUtil {
-	private static final String FORWARD_SLASH = "/"; //$NON-NLS-1$
-
-	private static final String RELATIVE_PATH_SIGNAL = IFileFolderConstants.DOT
-			+ IFileFolderConstants.DOT + IFileFolderConstants.PATH_SEPARATOR;
-
-	/**
-	 * adjust relative path isside the absolute path
-	 * @param path 
-	 * @return the adjusted path
-	 */
-	public static String adjustPath(String path) {
-		int i = 0;
-		while ((i = path.indexOf(RELATIVE_PATH_SIGNAL)) > 0) {
-			// split the string into two
-			String part1 = path.substring(0, i - 1);
-			String part2 = path
-					.substring(i + RELATIVE_PATH_SIGNAL.length() - 1);
-			// strip one path seg from part1
-			int j = part1.lastIndexOf(FORWARD_SLASH);
-			if (j == -1) {
-				return "";//$NON-NLS-1$
-			}
-			part1 = part1.substring(0, j);
-			path = part1 + part2;
-		}
-		return path;
-	}
-
-	/**
-	 * Append trailing url slash if needed
-	 * @param input 
-	 * @return the string
-	 */
-	public static String appendTrailingURLSlash(String input) {
-		// check to see already a slash
-		if (!input.endsWith(FORWARD_SLASH)) {
-			input += FORWARD_SLASH;
-		}
-		return input;
-	}
-
-	/**
-	 * Convert to relative url based on base
-	 * @param input 
-	 * @param base 
-	 * @return the string
-	 */
-	public static String convertToRelativePath(String input, String base) {
-		// tokenize the strings
-		StringTokenizer inputTokenizer = new StringTokenizer(input,
-				FORWARD_SLASH);
-		StringTokenizer baseTokenizer = new StringTokenizer(base, FORWARD_SLASH);
-		String token1 = "", token2 = "";//$NON-NLS-2$//$NON-NLS-1$
-		//
-		// Go through until equls
-		while (true) {
-			if (!inputTokenizer.hasMoreTokens()
-					|| !baseTokenizer.hasMoreTokens()) {
-				break;
-			}
-			token1 = baseTokenizer.nextToken();
-			token2 = inputTokenizer.nextToken();
-			if (!token1.equals(token2)) {
-				break;
-			}
-		}
-		// now generate the backs
-		String output = "";//$NON-NLS-1$
-		while (baseTokenizer.hasMoreTokens()) {
-			baseTokenizer.nextToken();
-			output += RELATIVE_PATH_SIGNAL;
-		}
-		output += token2;
-		// generate the rest
-		while (inputTokenizer.hasMoreTokens()) {
-			output = output + FORWARD_SLASH + inputTokenizer.nextToken();
-		}
-		return output;
-	}
-
-	/**
-	 * @param projectName
-	 * @param path
-	 * @return the path in the project converted to a path relative to the
-	 * web folder
-	 */
-	public static String convertToWebPath(String projectName, String path) {
-		String name = ""; //$NON-NLS-1$
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-				projectName);
-		String webrootName = WebrootUtil.getWebContentFolder(project).getName();
-
-		if (path.indexOf(webrootName) != -1) {
-			name = projectName + IFileFolderConstants.PATH_SEPARATOR
-					+ webrootName;
-		} else {
-			name = projectName;
-		}
-		int index = path.indexOf(projectName);
-
-		return path.substring(index + name.length());
-	}
-
-	/**
-	 * convert path relative to current active file to absolute path in
-	 * filesystem
-	 * 
-	 * @param uri
-	 *            the relative path
-	 * @param curFile 
-	 * @return absolute path in file system
-	 */
-	public static String convertToAbsolutePath(String uri, IFile curFile) {
-		if (uri == null || uri.trim().equals("")) { //$NON-NLS-1$
-			return uri;
-		}
-		String webroot = ""; //$NON-NLS-1$
-		IFile jsp = curFile;
-		try {
-			if (jsp == null) {
-				jsp = ((IFileEditorInput) getActivePage()
-						.getActiveEditor().getEditorInput()).getFile();
-			}
-			if (jsp != null) {
-				String webrootName = WebrootUtil.getWebContentFolder(
-						jsp.getProject()).getName();
-				webroot = jsp.getProject().getFolder(webrootName).getLocation()
-						.toString();
-			}
-		} catch (NullPointerException e) {
-			return uri;
-		}
-		if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR))
-		{
-			return webroot + uri;
-		}
-		if (jsp != null) {
-			IContainer con = jsp.getParent();
-			if (con != null) {
-				IPath path = con.getLocation();
-				if (path != null) {
-					String aPath = path.toString() + File.separator + uri;
-					aPath = aPath.replace('/', File.separatorChar);
-					aPath = aPath.replace('\\', File.separatorChar);
-					if (aPath.endsWith(File.separator)) {
-						aPath += IFileFolderConstants.PATH_SEPARATOR;
-					}
-					File file = new File(aPath);
-					if (file.exists() && file.isFile()) {
-						return file.getAbsolutePath();
-					}
-                    return uri;
-				}
-			}
-		}
-		return uri;
-	}
-
-	/**
-	 * Returns the active workbench window.
-	 * 
-	 * @return the active workbench window. this can be null but I've never seen
-	 *         it.
-	 */
-	private static IWorkbenchWindow getActiveWorkbenchWindow() {
-		if (PlatformUI.getWorkbench() == null) {
-			return null;
-		}
-        return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	/**
-	 * Returns the active workbench page. Note that the active page may not be
-	 * the one that the user perceives as active in some situations so this
-	 * method of obtaining the activate page should only be used if no other
-	 * method is available.
-	 * 
-	 * @return the active workbench page
-	 */
-	private static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow window = getActiveWorkbenchWindow();
-		if (window == null) {
-			return null;
-		}
-		return window.getActivePage();
-	}
-	/**
-	 * @param javaProject
-	 * @param parent
-	 * @return the IPath for a a classpath object (?)
-	 */
-	public static IPath getPathOnClasspath(IJavaProject javaProject,
-			Object parent) {
-		IPath result = null;
-		if (javaProject == null || parent == null) {
-			return new Path(""); //$NON-NLS-1$
-		}
-		IClasspathEntry[] entries = javaProject.readRawClasspath();
-		IPath classPath = null;
-		if (parent instanceof IResource) {
-			if (((javaProject != null) && !javaProject
-					.isOnClasspath((IResource) parent))) {
-				return new Path(""); //$NON-NLS-1$
-			}
-			if (parent instanceof IFile) {
-				IPath elementPath = ((IFile) parent).getFullPath();
-				if (((IFile) parent).getFileExtension().equalsIgnoreCase(
-						IFileFolderConstants.EXT_PROPERTIES)) {
-					int machings = 0;
-					try {
-						for (int i = 0; i < entries.length; i++) {
-							// Determine whether on this classentry's path
-							int n = entries[i].getPath().matchingFirstSegments(
-									elementPath);
-							if (n > machings) {
-								// Get package name
-								machings = n;
-								classPath = elementPath.removeFirstSegments(
-										machings).removeLastSegments(1);
-							}
-						}
-
-						// Not on the classpath?
-						if (classPath == null) {
-							return null;
-						} else if (classPath.segmentCount() > 0) {
-							IJavaElement element = javaProject
-									.findElement(classPath);
-							if (element != null) {
-								IPath path = element.getPath();
-								if (path != null) {
-									IPath path1 = path
-											.removeFirstSegments(machings);
-
-									String fileName = ((IFile) parent)
-											.getName();
-									if (fileName != null) {
-										result = path1.append(fileName);
-									}
-								}
-							}
-
-						} else {
-							result = ((IFile) parent).getFullPath()
-									.removeFirstSegments(machings);
-						}
-					} catch (Exception e) {
-						return null;
-					}
-				}
-			}
-		} else if (parent instanceof IJarEntryResource) {
-			IPath elementPath = ((IJarEntryResource) parent).getFullPath();
-			if (elementPath.getFileExtension().equalsIgnoreCase(
-					IFileFolderConstants.EXT_PROPERTIES)) {
-				result = elementPath;
-			}
-		}
-		if (result != null) {
-			return result;
-		}
-		return new Path(""); //$NON-NLS-1$
-	}
-	
-	private PathUtil()
-	{
-		// utility class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PixelConverter.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PixelConverter.java
deleted file mode 100644
index 48d5b37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PixelConverter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle -- copied into common ui codebase for JSF use
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.jface.dialogs.Dialog;
-
-/**
- * @author cbateman
- *
- */
-public class PixelConverter {
-    
-    private final FontMetrics fFontMetrics;
-    
-    /**
-     * @param control
-     */
-    public PixelConverter(Control control) {
-        this(control.getFont());
-    }
-    
-    /**
-     * @param font
-     */
-    public PixelConverter(Font font) {
-        GC gc = new GC(font.getDevice());
-        gc.setFont(font);
-        fFontMetrics= gc.getFontMetrics();
-        gc.dispose();
-    }
-    
-
-    /**
-     * @param chars
-     * @return the convert height in  pixels
-     */
-    public int convertHeightInCharsToPixels(int chars) {
-        return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars);
-    }
-
-    /**
-     * @param dlus
-     * @return the pixel
-     */ 
-    public int convertHorizontalDLUsToPixels(int dlus) {
-        return Dialog.convertHorizontalDLUsToPixels(fFontMetrics, dlus);
-    }
-
-    /**
-     * @param dlus
-     * @return the vertical pixels
-     */
-    public int convertVerticalDLUsToPixels(int dlus) {
-        return Dialog.convertVerticalDLUsToPixels(fFontMetrics, dlus);
-    }
-    
-
-    /**
-     * @param chars
-     * @return the pixel value
-     */
-    public int convertWidthInCharsToPixels(int chars) {
-        return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
-    }   
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PluginImageHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PluginImageHelper.java
deleted file mode 100644
index 8ebcd03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PluginImageHelper.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.HashMap;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * @author mengbo
- */
-public class PluginImageHelper {
-	private static PluginImageHelper _instance = null;
-
-	/**
-	 * Gets the instance.
-	 * 
-	 * @return Returns a TaglibPluginImageHelper
-	 */
-	public synchronized static PluginImageHelper getInstance() {
-		if (_instance == null) {
-			_instance = new PluginImageHelper();
-		}
-		return _instance;
-	}
-
-	// save a descriptor for each image
-	private HashMap _imageDescRegistry = null;
-
-	private final String PLUGIN_SEPARATOR = "^"; //$NON-NLS-1$
-
-	/**
-	 * Creates an image from the given resource and adds the image to the image
-	 * registry.
-	 * 
-	 * @param resource
-	 * @param pluginId
-	 * @return Image
-	 */
-	private Image createImage(String resource, String pluginId) {
-		ImageDescriptor desc = getImageDescriptor(resource, pluginId);
-		Image image = null;
-
-		if (desc != null) {
-			image = desc.createImage();
-
-			// dont add the missing image descriptor image to the image
-			// registry
-			if (!desc.equals(ImageDescriptor.getMissingImageDescriptor())) {
-				String thePluginId = pluginId;
-				if (thePluginId == null) {
-					return null;
-				}
-				String key = thePluginId + PLUGIN_SEPARATOR + resource;
-				getImageRegistry().put(key, image);
-			}
-		}
-		return image;
-	}
-
-	/**
-	 * Creates an image descriptor from the given imageFilePath in the given
-	 * pluginId and adds the image descriptor to the image descriptor registry.
-	 * If an image descriptor could not be created, the default "missing" image
-	 * descriptor is returned but not added to the image descriptor registry.
-	 * 
-	 * @param imageFilePath
-	 * @param pluginId
-	 *            if null, look in this plugin
-	 * @return ImageDescriptor image descriptor for imageFilePath or default
-	 *         "missing" image descriptor if resource could not be found
-	 */
-	private ImageDescriptor createImageDescriptor(String imageFilePath,
-			String pluginId) {
-		String thePluginId = pluginId;
-		if (thePluginId == null) {
-			return null;
-		}
-
-		ImageDescriptor imageDescriptor = AbstractUIPlugin
-				.imageDescriptorFromPlugin(thePluginId, imageFilePath);
-		if (imageDescriptor != null) {
-			String key = thePluginId + PLUGIN_SEPARATOR + imageFilePath;
-			getImageDescriptorRegistry().put(key, imageDescriptor);
-		} else {
-			imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
-		}
-
-		return imageDescriptor;
-	}
-
-	/**
-	 * Retrieves the image associated with resource from the image registry. If
-	 * the image cannot be retrieved, attempt to find and load the image at the
-	 * location specified in resource.
-	 * 
-	 * @param resource
-	 *            the image to retrieve
-	 * @return Image the image associated with resource or null if one could not
-	 *         be found
-	 */
-	public Image getImage(String resource) {
-		return getImage(resource, null);
-	}
-
-	/**
-	 * Retrieves the image associated with resource from the image registry. If
-	 * the image cannot be retrieved, attempt to find and load the image at the
-	 * location specified in resource.
-	 * 
-	 * @param resource
-	 *            the image to retrieve
-	 * @param pluginId
-	 * @return Image the image associated with resource or null if one could not
-	 *         be found
-	 */
-	public Image getImage(String resource, String pluginId) {
-		String thePluginId = pluginId;
-		if (thePluginId == null) {
-			return null;
-		}
-
-		String key = thePluginId + PLUGIN_SEPARATOR + resource;
-
-		Image image = getImageRegistry().get(key);
-		if (image == null) {
-			// create an image
-			image = createImage(resource, pluginId);
-		}
-		return image;
-	}
-
-	/**
-	 * Retrieves the image descriptor associated with resource from the image
-	 * descriptor registry. If the image descriptor cannot be retrieved, attempt
-	 * to find and load the image descriptor at the location specified in
-	 * resource.
-	 * 
-	 * @param resource
-	 *            the image descriptor to retrieve
-	 * @return ImageDescriptor the image descriptor assocated with resource or
-	 *         the default "missing" image descriptor if one could not be found
-	 */
-	public ImageDescriptor getImageDescriptor(String resource) {
-		return getImageDescriptor(resource, null);
-	}
-
-	/**
-	 * Retrieves the image descriptor associated with resource in pluginId from
-	 * the image descriptor registry. If the image descriptor cannot be
-	 * retrieved, attempt to find and load the image descriptor at the location
-	 * specified in resource in pluginId.
-	 * 
-	 * @param resource
-	 *            the image descriptor to retrieve
-	 * @param pluginId
-	 *            the plugin the resource is located. if null, use look in this
-	 *            plugin
-	 * @return ImageDescriptor the image descriptor assocated with resource or
-	 *         the default "missing" image descriptor if one could not be found
-	 */
-	public ImageDescriptor getImageDescriptor(String resource, String pluginId) {
-		ImageDescriptor imageDescriptor = null;
-		String thePluginId = pluginId;
-		if (thePluginId == null) {
-			return null;
-		}
-
-		String key = thePluginId + PLUGIN_SEPARATOR + resource;
-		Object o = getImageDescriptorRegistry().get(key);
-		if (o == null) {
-			// create a descriptor
-			imageDescriptor = createImageDescriptor(resource, pluginId);
-		} else {
-			imageDescriptor = (ImageDescriptor) o;
-		}
-		return imageDescriptor;
-	}
-
-	/**
-	 * Returns the image descriptor registry for this plugin.
-	 * 
-	 * @return HashMap - image descriptor registry for this plugin
-	 */
-	private HashMap getImageDescriptorRegistry() {
-		if (_imageDescRegistry == null) {
-			_imageDescRegistry = new HashMap();
-		}
-		return _imageDescRegistry;
-	}
-
-	/**
-	 * Returns the image registry for this plugin.
-	 * 
-	 * @return ImageRegistry - image registry for this plugin
-	 */
-	private ImageRegistry getImageRegistry() {
-		return JFaceResources.getImageRegistry();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PropertyUtils.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PropertyUtils.java
deleted file mode 100644
index 47bded0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/PropertyUtils.java
+++ /dev/null
@@ -1,789 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.MissingResourceException;
-import java.util.Properties;
-import java.util.ResourceBundle;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-
-/**
- * The main purpose of this class is to give better access methods for property
- * and resource bundle access.
- * 
- * @author mengbo
- */
-public final class PropertyUtils {
-
-	private static final String ENCODED_CHAR_PERCENT = "%25"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_CARRIAGE_RETURN = "%0d"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_TAB = "%09"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_NEWLINE = "%0a"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_SPACE = "%20"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_COLON = "%3a"; //$NON-NLS-1$
-	private static final String ENCODED_CHAR_EQUALS = "%3d"; //$NON-NLS-1$
-
-	
-	// WARNING: There can be NO static logging line here since the logger uses
-	// this class to figure out the preferences
-	// for the logging system. "Logging" an error here would be useless since
-	// you might be setting up the logging system
-	// via a call to PropertyUtils.getServerProperty() instead it uses
-	// "System.err.println".
-
-	// This is the name for the properties file.
-	// The prop-name will be prepended to this string....
-	private static final String NAME_PROPERTIES = ".props"; //$NON-NLS-1$
-
-	private static final String STR_BOUNDS_END = ".bounds"; // assumes the //$NON-NLS-1$
-
-	// window name or
-	// name list is
-	// prepended
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Property get methods.
-	// //////////////////////////////////////////////////////////////////////////
-	/**
-	 * @param props
-	 * @param key
-	 * @param theDefault
-	 * @return the property
-	 */
-	public static String getProperty(Properties props, String key,
-			String theDefault) {
-		try {
-			String value = props.getProperty(key, theDefault);
-			if ((value != null) && (value.length() == 0)) {
-				value = null;
-			}
-			// check again for null, since some versions of the jdk ignore the
-			// default
-			// if an empty property exists.
-			if (value == null) {
-				value = theDefault;
-			}
-			return value;
-		} catch (Exception ee) {
-			return theDefault;
-		}
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @return the value for key in props, may return null
-	 */
-	public static String getProperty(Properties props, String key) {
-		try {
-			String value = props.getProperty(key);
-			if ((value != null) && (value.length() == 0)) {
-				value = null;
-			}
-			return value;
-		} catch (Exception ee) {
-			return null;
-		}
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @param defaultValue
-	 * @param minimumValue
-	 * @return the integer property value for key, or defaultValue
-	 * if none.  Enforces minimumValue in all cases
-	 */
-	public static int getPropertyValue(Properties props, String key,
-			int defaultValue, int minimumValue) {
-		int theValue = getPropertyValue(props, key, defaultValue);
-
-		if (theValue < minimumValue) {
-			theValue = minimumValue;
-		}
-		return theValue;
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @param defaultValue
-	 * @return the integer value for key in props or defaultValue if none
-	 */
-	public static int getPropertyValue(Properties props, String key,
-			int defaultValue) {
-		String stringValue = getProperty(props, key);
-		if (stringValue != null) {
-			try {
-				return Integer.parseInt(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @param defaultValue
-	 * @return the long value for key props or defaultValue if none
-	 */
-	public static long getPropertyLongValue(Properties props, String key,
-			long defaultValue) {
-		String stringValue = getProperty(props, key);
-		if (stringValue != null) {
-			try {
-				return Long.parseLong(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @param bDefault
-	 * @return true if props has a value for key
-	 */
-	public static boolean isProperty(Properties props, String key,
-			boolean bDefault) {
-		return getProperty(props, key, "" + bDefault).equals("" + true); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * @param props
-	 * @param key
-	 * @return the string values in props for key tokenized from
-	 * a comma-separated string
-	 */
-	public static String[] getPropertyStrings(Properties props, String key) {
-		String tokenString = getProperty(props, key);
-
-		if (tokenString == null) {
-			return new String[0];
-		}
-        StringTokenizer tokenizer = new StringTokenizer(tokenString, ","); //$NON-NLS-1$
-        String[] pNames = new String[tokenizer.countTokens()];
-
-        for (int ii = 0; ii < pNames.length; ii++) {
-        	pNames[ii] = ((String) tokenizer.nextElement()).trim();
-        }
-        return pNames;
-	}
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Resource bundle get methods.
-	// //////////////////////////////////////////////////////////////////////////
-	/**
-	 * @param bundle
-	 * @param key
-	 * @param theDefault
-	 * @return the string value from bundle for key or default if none
-	 */
-	public static String getResourceProperty(ResourceBundle bundle, String key,
-			String theDefault) {
-		try {
-			String value = bundle.getString(key);
-			if ((value == null) || (value.length() == 0)) {
-				value = theDefault;
-			}
-			return value;
-		} 
-		catch(NullPointerException npe)
-		{
-			return theDefault;
-		}
-		catch (MissingResourceException mre)
-		{
-			return theDefault;
-		}
-		catch (ClassCastException cce)
-		{
-			return theDefault;
-		}
-	}
-
-	/**
-	 * @param bundle
-	 * @param key
-	 * @return the value for key in bundle or null if none
-	 */
-	public static String getResourceProperty(ResourceBundle bundle, String key) {
-		try 
-		{
-			String value = bundle.getString(key);
-			if ((value != null) && (value.length() == 0)) 
-			{
-				value = null;
-			}
-				return value;
-		}
-		catch(NullPointerException npe)
-		{
-			return null;
-		}
-		catch (MissingResourceException mre)
-		{
-			return null;
-		}
-		catch (ClassCastException cce)
-		{
-			return null;
-		}
-	}
-
-	/**
-	 * @param bundle
-	 * @param key
-	 * @param defaultValue
-	 * @param minimumValue
-	 * @return the integer value for key in bundle or defaultValue if none
-	 * Enforces minimum value in all cases
-	 */
-	public static int getResourcePropertyValue(ResourceBundle bundle,
-			String key, int defaultValue, int minimumValue) {
-		int theValue = getResourcePropertyValue(bundle, key, defaultValue);
-
-		if (theValue < minimumValue) {
-			theValue = minimumValue;
-		}
-		return theValue;
-	}
-
-	/**
-	 * @param bundle
-	 * @param key
-	 * @param defaultValue
-	 * @return the integer value for key in bundle or defaultValue if  none
-	 */
-	public static int getResourcePropertyValue(ResourceBundle bundle,
-			String key, int defaultValue) {
-		String stringValue = getResourceProperty(bundle, key);
-		if (stringValue != null) {
-			try {
-				return Integer.parseInt(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * @param bundle
-	 * @param key
-	 * @param defaultValue
-	 * @return the long value for key in bundle or default value if none
-	 */
-	public static long getResourcePropertyLongValue(ResourceBundle bundle,
-			String key, long defaultValue) {
-		String stringValue = getResourceProperty(bundle, key);
-		if (stringValue != null) {
-			try {
-				return Long.parseLong(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * @param bundle
-	 * @param key
-	 * @param bDefault
-	 * @return true if bundle has a value for key
-	 */
-	public static boolean isResourceProperty(ResourceBundle bundle, String key,
-			boolean bDefault) {
-		return getResourceProperty(bundle, key, "" + bDefault) //$NON-NLS-1$
-				.equals("" + true); //$NON-NLS-1$
-	}
-
-	// ///////////////////////////////////////////////////////////////////////
-	// Property misc routines
-	// ///////////////////////////////////////////////////////////////////////
-	/**
-	 * @param theName
-	 * @return the encoded name
-	 */
-	public static String encodeName(String theName) {
-		int theSize = theName.length();
-		StringBuffer encoded = new StringBuffer(theSize);
-		char ch;
-
-		for (int ii = 0; ii < theSize; ii++) {
-			ch = theName.charAt(ii);
-			switch (ch) {
-			// these are the set of illegal characters in a Property name
-			case '=': // %3d
-				encoded.append(ENCODED_CHAR_EQUALS);
-				break;
-			case ':': // %3a
-				encoded.append(ENCODED_CHAR_COLON);
-				break;
-			case ' ': // %20
-				encoded.append(ENCODED_CHAR_SPACE);
-				break;
-			case '\n': // %0a
-				encoded.append(ENCODED_CHAR_NEWLINE);
-				break;
-			case '\t': // %09
-				encoded.append(ENCODED_CHAR_TAB);
-				break;
-			case '\r': // %0d
-				encoded.append(ENCODED_CHAR_CARRIAGE_RETURN);
-				break;
-			case '%': // %25
-				// added because its our encoding flag
-				encoded.append(ENCODED_CHAR_PERCENT);
-				break;
-			default:
-				encoded.append(ch);
-				break;
-			}
-		}
-
-		return encoded.toString();
-	}
-
-	/**
-	 * @param theName
-	 * @return the decoded name
-	 */
-	public static String decodeName(String theName) {
-		int theSize = theName.length();
-		int kk;
-		StringBuffer decoded = new StringBuffer(theSize);
-		char ch;
-
-		for (int ii = 0; ii < theSize; ii++) {
-			ch = theName.charAt(ii);
-			if (ch == '%') {
-				ch = theName.charAt(++ii);
-				kk = Character.digit(ch, 16);
-				kk *= 16;
-				ch = theName.charAt(++ii);
-				kk += Character.digit(ch, 16);
-				decoded.append((char) kk);
-			} else {
-				decoded.append(ch);
-			}
-		}
-
-		return decoded.toString();
-	}
-
-	/**
-	 * @param propName
-	 * @return the properties
-	 * @throws IOException
-	 * @throws FileNotFoundException
-	 */
-	public static Properties openProperties(String propName)
-			throws IOException, FileNotFoundException {
-		return openProperties(propName, null, true);
-	}
-
-	/**
-	 * @param propName
-	 * @param propDefaults
-	 * @return the properties
-	 * @throws IOException
-	 * @throws FileNotFoundException
-	 */
-	public static Properties openProperties(String propName,
-			Properties propDefaults) throws IOException, FileNotFoundException {
-		return openProperties(propName, propDefaults, true);
-	}
-
-	/**
-	 * @param propName
-	 * @param propDefaults
-	 * @param bCreatePropertiesPathname
-	 * @return the properties
-	 * @throws IOException
-	 * @throws FileNotFoundException
-	 */
-	public static Properties openProperties(String propName,
-			Properties propDefaults, boolean bCreatePropertiesPathname)
-			throws IOException, FileNotFoundException {
-		Properties theProperties = new Properties(propDefaults);
-
-		try {
-			String propertiesFilename = bCreatePropertiesPathname ? getPropertiesPathname(propName)
-					: propName;
-			InputStream theStream = new FileInputStream(propertiesFilename);
-			theProperties.load(theStream);
-			theStream.close();
-		} catch (FileNotFoundException ee) {
-			if (propDefaults == null) {
-				throw ee;
-			}
-		} catch (IOException ee) {
-			if (propDefaults == null) {
-				throw ee;
-			}
-		}
-
-		return theProperties;
-	}
-
-	/**
-	 * Combines two properties objects, with the second one as the default
-	 * properties
-	 * 
-	 * @param localProperties
-	 * @param defaultProperties
-	 * @return the combined properties
-	 * @throws IOException
-	 */
-	public static Properties combineProperties(Properties localProperties,
-			Properties defaultProperties) throws IOException {
-		Properties theNewProperties = new Properties();
-
-		ByteArrayOutputStream os = new ByteArrayOutputStream();
-		defaultProperties.store(os, ""); //$NON-NLS-1$
-		localProperties.store(os, ""); //$NON-NLS-1$
-		byte[] theData = os.toByteArray();
-		ByteArrayInputStream is = new ByteArrayInputStream(theData);
-		theNewProperties.load(is);
-
-		return theNewProperties;
-	}
-
-	/**
-	 * @param theFilename
-	 * @return the encoded file name
-	 */ 
-	public static String encodeFilename(String theFilename) {
-		// make theFilename legal on the local system....
-		String theSeparator = System.getProperty("file.separator"); //$NON-NLS-1$
-		// replace all occurrances of the file separator with a ' '
-		for (int ii = 0; ii < theSeparator.length(); ii++) {
-			char theChar = theSeparator.charAt(ii);
-			theFilename = theFilename.replace(theChar, ' ');
-		}
-
-		return theFilename;
-	}
-
-	/**
-	 * @param baseName
-	 * @return the properties path
-	 */
-	public static String getPropertiesPathname(String baseName) {
-		if (baseName.endsWith(NAME_PROPERTIES)) {
-			return System.getProperty("user.dir") //$NON-NLS-1$
-					+ System.getProperty("file.separator") //$NON-NLS-1$
-					+ encodeFilename(baseName);
-		}
-        return System.getProperty("user.dir") //$NON-NLS-1$
-        		+ System.getProperty("file.separator") //$NON-NLS-1$
-        		+ encodeFilename(baseName) + NAME_PROPERTIES;
-	}
-
-	// /////////////////////////////////////////////////////////////////////////
-	// These are generic routines that are used to get/set/save window bounds
-
-	private static final int INSET = 40;
-
-	/**
-	 * Set the initial bounds (size & location) of a component. This will get
-	 * the location from the preferences file based on the values of the "names"
-	 * parameter. These values will be encoded to make a legal properties name,
-	 * joined togther with ".", and the value STR_BOUNDS_END will be appended.
-	 * The resulting name will be used to obtain the intial bounds value from
-	 * the properties file, which will be decoded and the specified component
-	 * will then be set to that value.
-	 * @param props 
-	 * @param theComponent 
-	 * @param names 
-	 * @param defaultValue 
-	 */
-	public static void setComponentBounds(Properties props,
-			Component theComponent, String names[], String defaultValue) {
-		setComponentBounds(props, theComponent, names, defaultValue, false);
-	}
-
-	/**
-	 * @param props
-	 * @param theComponent
-	 * @param names
-	 * @param defaultValue
-	 * @param bEnsureDesktopVisibility
-	 */
-	public static void setComponentBounds(Properties props,
-			Component theComponent, String names[], String defaultValue,
-			boolean bEnsureDesktopVisibility) {
-		String tmpString = getComponentPropertyName(names, STR_BOUNDS_END);
-		setComponentBounds(props, theComponent, tmpString, defaultValue,
-				bEnsureDesktopVisibility);
-	}
-
-	/**
-	 * @param props
-	 * @param theComponent
-	 * @param thePropertyName
-	 * @param defaultValue
-	 */
-	public static void setComponentBounds(Properties props,
-			Component theComponent, String thePropertyName, String defaultValue) {
-		setComponentBounds(props, theComponent, thePropertyName, defaultValue,
-				false);
-	}
-
-	/**
-	 * @param props
-	 * @param theComponent
-	 * @param thePropertyName
-	 * @param defaultValue
-	 * @param bEnsureDesktopVisibility
-	 */
-	public static void setComponentBounds(Properties props,
-			Component theComponent, String thePropertyName,
-			String defaultValue, boolean bEnsureDesktopVisibility) {
-		String tmpString = props.getProperty(thePropertyName, defaultValue);
-		Rectangle theValue = decodeBounds(tmpString);
-		theComponent.setBounds(theValue);
-		if (bEnsureDesktopVisibility) {
-			// make sure that this component is visible on the desktop...
-			// verify that this window is visible...
-			Point theLoc = theComponent.getLocation();
-			// get width/height of desktop....
-			Dimension portSize = new Dimension(Toolkit.getDefaultToolkit()
-					.getScreenSize());
-			if (theLoc.x > portSize.width) // move it to top
-				theLoc.x = INSET;
-			if (theLoc.y > portSize.height) // move it to left
-				theLoc.y = INSET;
-			theComponent.setLocation(theLoc);
-		}
-	}
-
-	/**
-	 * @param props
-	 * @param theComponent
-	 * @param names
-	 */
-	public static void saveComponentBounds(Properties props,
-			Component theComponent, String names[]) {
-		String tmpString = getComponentPropertyName(names, STR_BOUNDS_END);
-		saveComponentBounds(props, theComponent, tmpString);
-	}
-
-	/**
-	 * @param props
-	 * @param theComponent
-	 * @param thePropertyName
-	 */
-	public static void saveComponentBounds(Properties props,
-			Component theComponent, String thePropertyName) {
-		Rectangle theBounds = theComponent.getBounds();
-		String theValue = encodeBounds(theBounds);
-		props.put(thePropertyName, theValue);
-	}
-
-	/**
-	 * @param names
-	 * @param subsystemName
-	 * @return the component property name or ""
-	 */
-	public static String getComponentPropertyName(String names[],
-			String subsystemName) {
-		String tmpString = ""; //$NON-NLS-1$
-
-		for (int ii = 0; ii < names.length; ii++) {
-			tmpString = tmpString + (ii > 0 ? "." : "") //$NON-NLS-1$ //$NON-NLS-2$
-					+ PropertyUtils.encodeName(names[ii]);
-		}
-		if (subsystemName.startsWith(".") == false) //$NON-NLS-1$
-			tmpString += "."; //$NON-NLS-1$
-		tmpString = tmpString + subsystemName;
-		return tmpString;
-	}
-
-	/**
-	 * Decode the comma separated values stored in sBounds. This method is
-	 * normally called to decode the location/size of a component which has been
-	 * saved into a Properties object. See encodeBounds(); Order of items in the
-	 * string is (x, y, w, h)
-	 * @param sBounds 
-	 * @return the rectangle
-	 */
-	public static Rectangle decodeBounds(String sBounds) {
-		int index;
-		int ii;
-		int theValue[] = new int[4];
-		String tmpString;
-		String restString = sBounds;
-
-		for (ii = 0; ii < 4; ii++) {
-			theValue[ii] = 0;
-		}
-		try {
-			for (ii = 0; ii < 4; ii++) {
-				index = restString.indexOf(","); //$NON-NLS-1$
-				if (index > 0) {
-					tmpString = restString.substring(0, index);
-					restString = restString.substring(index + 1);
-				} else {
-					tmpString = restString; // should only happen on the last
-					// one....
-					restString = null; // will cause an exception if not last
-					// one...
-				}
-				theValue[ii] = Integer.valueOf(tmpString).intValue();
-			}
-		} catch (Exception ee)// NOPMD
-		{
-			// the property value maybe an invalid value, the editor should show
-			// these to user.
-		}
-
-		return new Rectangle(theValue[0], theValue[1], theValue[2], theValue[3]);
-	}
-
-	/**
-	 * * Encode the bounds of a component into a comma separated list * that is
-	 * appropriate for storing in a Properties object. * See decodeBounds();
-	 * @param rBounds 
-	 * @return the encoded bounds
-	 */
-	public static String encodeBounds(Rectangle rBounds) {
-		return "" + rBounds.x + "," + rBounds.y + "," + rBounds.width + "," //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				+ rBounds.height;
-	}
-
-	/**
-	 * Methods for creating Properties objects from strings.
-	 * 
-	 * Then "Encoded" versions are used on values that are stored into a
-	 * properties file (think of them as sub-properties). They do the encoding
-	 * necessary to turn a properties object into a string that has legal
-	 * "value" syntax (they actually do more than they need to, but its all
-	 * non-destructive).
-	 * @param thePropertyString 
-	 * @return the properties from the string
-	 * @throws IOException 
-	 */
-	public static Properties getPropertiesFromString(String thePropertyString)
-			throws IOException {
-		if (thePropertyString == null)
-			return null;
-		ByteArrayInputStream in = new ByteArrayInputStream(thePropertyString
-				.getBytes());
-
-		Properties props = new Properties();
-		props.load(in); // throws IOException
-		in = null;
-		return props;
-	}
-
-	/**
-	 * @param theEncodedPropertyString
-	 * @return the properties
-	 * @throws IOException
-	 */
-	public static Properties getPropertiesFromEncodedString(
-			String theEncodedPropertyString) throws IOException {
-		if (theEncodedPropertyString == null)
-			return null;
-		return (getPropertiesFromString(decodeName(theEncodedPropertyString)));
-	}
-
-	/**
-	 * @param theEncodedPropertyString
-	 * @return the properties
-	 */
-	public static Properties encodedStringToProperties(
-			String theEncodedPropertyString) {
-		try {
-			return getPropertiesFromEncodedString(theEncodedPropertyString);
-		} catch (IOException ee) {
-			return null;
-		}
-	}
-
-	/**
-	 * @param props
-	 * @param comment
-	 * @return the string
-	 * @throws IOException
-	 */
-	public static String savePropertiesToString(Properties props, String comment)
-			throws IOException {
-		if (props == null)
-			return null;
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		props.store(out, comment);
-		String tmpString = out.toString();
-		out = null;
-		return tmpString;
-	}
-
-	/**
-	 * @param props
-	 * @param comment
-	 * @return the encoded string
-	 * @throws IOException
-	 */
-	public static String savePropertiesToEncodedString(Properties props,
-			String comment) throws IOException {
-		if (props == null)
-			return null;
-		return encodeName(savePropertiesToString(props, comment));
-	}
-
-	/**
-	 * @param props
-	 * @return the encoded string
-	 */
-	public static String propertiesToEncodedString(Properties props) {
-		try {
-			return savePropertiesToEncodedString(props, ""); //$NON-NLS-1$
-		} catch (IOException ee)// NOPMD
-		{
-            JSFUICommonPlugin.getLogger(PropertyUtils.class).error("saving properties", ee); //$NON-NLS-1$
-		}
-		return null;
-	}
-	
-	private PropertyUtils()
-	{
-		// no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/ResourceUtils.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/ResourceUtils.java
deleted file mode 100644
index e35ee83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/ResourceUtils.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-
-/**
- * Give easy access to a resource bundle.
- * 
- * @author mengbo
- */
-public abstract class ResourceUtils {
-	private static final String LOG_RESOURCE_UTILS_MSG_KEY = "log.ResourceUtils"; //$NON-NLS-1$
-	private static Logger _log = JSFUICommonPlugin.getLogger(ResourceUtils.class);
-	/**
-	 * the resource bundle accessible by all children
-	 */
-	protected ResourceBundle _resources;
-
-	/**
-	 * Empty Constructor.
-	 */
-	protected ResourceUtils() {
-        // restrict instantiation
-	}
-
-	/**
-	 * Easy way to set the bundle and get a fatal log messages and an alert if
-	 * the resource bundle is not found.
-	 * 
-	 * @param resource
-	 * @param bundleLocation
-	 */
-	protected void setBundle(ResourceBundle resource, String bundleLocation) {
-		_resources = resource;
-		if (_resources == null) {
-			// log.ResourceUtils=Missing Resource Bundle "{0}".
-			_log.error(LOG_RESOURCE_UTILS_MSG_KEY, bundleLocation);
-			// pluginName=Web Application Development Common
-			JSFUICommonPlugin.getAlerts().error("pluginName", LOG_RESOURCE_UTILS_MSG_KEY, //$NON-NLS-1$
-					bundleLocation);
-		}
-	}
-
-	/**
-	 * Get the property defined in the resource bundle for the given key. This
-	 * property should be an integer. If none is defined
-	 * (MissingResourceException), return the default.
-	 * 
-	 * @param key
-	 *            the key in the resource bundle.
-	 * @param defaultValue
-	 *            default int to return if no value is found for the key.
-	 * @return the integer value for key or defaultValue if none
-	 */
-	public int getValue(String key, int defaultValue) {
-		String stringValue = getString(key);
-		if (stringValue != null) {
-			try {
-				return Integer.parseInt(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * Get the property defined in the resource bundle for the given key. This
-	 * property should be an long. If none is defined
-	 * (MissingResourceException), return the default.
-	 * 
-	 * @param key
-	 *            the key in the resource bundle.
-	 * @param defaultValue
-	 *            default long to return if no value is found for the key.
-	 * @return the long value for key or defaultValue if none
-	 */
-	public long getValue(String key, long defaultValue) {
-		String stringValue = getString(key);
-		if (stringValue != null) {
-			try {
-				return Long.parseLong(stringValue);
-			} catch (NumberFormatException ee)// NOPMD
-			{
-				// the property value maybe an invalid value, the editor should
-				// show these to user.
-			}
-		}
-		return defaultValue;
-	}
-
-	/**
-	 * Get the property defined in the resource bundle for the given key. This
-	 * property should be boolean ("true" of "false"). If none is defined
-	 * (MissingResourceException), return the default.
-	 * 
-	 * @param key
-	 *            the key in the resource bundle.
-	 * @return true if there is a resource corresponding to key
-	 */
-	public boolean isResource(String key) {
-		return getString(key).equals("" + true); //$NON-NLS-1$
-	}
-
-	/**
-	 * Get the property defined in the resource bundle for the given key. If
-	 * none is defined (MissingResourceException), return null.
-	 * 
-	 * @param key
-	 *            the key in the resource bundle.
-	 * @return the string value for key or key if not found
-	 */
-	public String getString(String key) {
-		try {
-			return _resources.getString(key);
-		} catch (MissingResourceException ee) {
-			return key;
-		}
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object arg0) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object arg0, Object arg1) {
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @param arg2
-	 *            the third argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object arg0, Object arg1, Object arg2) {
-		Object[] args = new Object[3];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @param arg2
-	 *            the third argument.
-	 * @param arg3
-	 *            the forth argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object arg0, Object arg1, Object arg2,
-			Object arg3) {
-		Object[] args = new Object[4];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-		args[3] = arg3;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @param arg2
-	 *            the third argument.
-	 * @param arg3
-	 *            the forth argument.
-	 * @param arg4
-	 *            the forth argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object arg0, Object arg1, Object arg2,
-			Object arg3, Object arg4) {
-		Object[] args = new Object[5];
-		args[0] = arg0;
-		args[1] = arg1;
-		args[2] = arg2;
-		args[3] = arg3;
-		args[4] = arg4;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param args
-	 *            an array of arguments
-	 * @return the formated string with the argument inline.
-	 */
-	public String getString(String key, Object[] args) {
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Use in the try-finally idiom for inputStream to ensure close
-	 * and suppress exceptions on close
-	 * @param inputStream
-	 */
-	public static void ensureClosed(InputStream inputStream) {
-		if (inputStream != null) {
-			try {
-				inputStream.close();
-			} catch (IOException e) {
-				// Ignore
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StringUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StringUtil.java
deleted file mode 100644
index e914b60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StringUtil.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.regex.Pattern;
-
-/**
- * This is tool class for String processing.
- * 
- * @author mengbo
- */
-public class StringUtil {
-    
-    // pattern to find all end-of-paragraph and end-of-line html tags
-    // so they can be converted to newlines
-    final private static Pattern htmlToNewline = Pattern.compile("</p>|<br>"); //$NON-NLS-1$
-    
-    // pattern to strip all <x> and </x> HTML tags
-    final private static Pattern removeHTMLTags = Pattern.compile("<[/?\\w\\s=\"\\.\\#]+>"); //$NON-NLS-1$
-    
-    // pattern to find all runs of spaces longer than one
-    final private static Pattern trimInteriorWhitespace = Pattern.compile("[ ]+"); //$NON-NLS-1$
-    
-	/**
-	 * Split a java variable name into words For example, "_aJavaVariable" will
-	 * split to "A Java Variable", "_aWTPPackageImplementation" will be "A WTP
-	 * Package Implementation"
-	 * 
-	 * @param variable
-	 * @return String
-	 */
-	public static String splitVariable(String variable) {
-		StringBuffer output = new StringBuffer(""); //$NON-NLS-1$
-		boolean isCapitalLeading = false;
-		boolean isLastSpace = false;
-
-		for (int i = 0, n = variable.length(); i < n; i++) {
-			char letter = variable.charAt(i);
-
-			if (letter == '_' || letter == '$') {
-				output.append(" "); //$NON-NLS-1$
-				isCapitalLeading = false;
-				isLastSpace = true;
-				continue;
-			}
-
-			if (Character.isLowerCase(letter)) {
-				int nextIndex = i + 1;
-				if (nextIndex < n) {
-					char nextLetter = variable.charAt(nextIndex);
-					if (Character.isUpperCase(nextLetter)) {
-						if (isCapitalLeading) {
-							output.append(letter);
-							isLastSpace = false;
-						} else {
-							output.append(Character.toUpperCase(letter));
-							isLastSpace = false;
-						}
-						if (!isLastSpace) {
-							output.append(' ');
-							isLastSpace = true;
-						}
-						isCapitalLeading = false;
-						continue;
-					}
-				}
-			}
-			if (Character.isUpperCase(letter)) {
-				int nextIndex = i + 1;
-				if (nextIndex < n) {
-					char nextLetter = variable.charAt(nextIndex);
-					if (Character.isLowerCase(nextLetter)) {
-						if (!isLastSpace) {
-							output.append(' ');
-							isLastSpace = true;
-						}
-						output.append(letter);
-						isCapitalLeading = true;
-						isLastSpace = false;
-						continue;
-					}
-				}
-			}
-			if (isCapitalLeading) {
-				output.append(letter);
-				isLastSpace = false;
-			} else {
-				output.append(Character.toUpperCase(letter));
-				isCapitalLeading = true;
-				isLastSpace = false;
-			}
-		}
-
-		return output.toString().trim();
-	}
-
-	/**
-	 * @param str1
-	 * @param str2
-	 * @return boolean
-	 * 
-	 * Check if two strings match or not if str1=null and str2=null, it will
-	 * return true
-	 */
-	public static boolean isSameString(String str1, String str2) {
-		if (str1 == null) {
-			return str2 == null;
-		}
-        return str1.equals(str2);
-	}
-
-	/**
-	 * 
-	 * @param text
-	 * @return String Filter and convert a string, or normalize a string For
-	 *         example,
-	 *         <p>
-	 *         test
-	 *         </p>
-	 *         test1<a/> will be converted to: test\ntest1
-	 * 
-	 */
-	public static String filterConvertString(String text) {
-		if (text == null) {
-			return ""; //$NON-NLS-1$
-		}
-        
-		String result = htmlToNewline.matcher(text).replaceAll("\n");  //$NON-NLS-1$
-        result = removeHTMLTags.matcher(result).replaceAll(""); //$NON-NLS-1$
-        result = trimInteriorWhitespace.matcher(result).replaceAll(" "); //$NON-NLS-1$
-
-		return result;
-	}
-
-	/**
-	 * Determine whether a string is empty or not Example: null string -> return
-	 * true; Example: "" string -> return true; Otherwise, will return false;
-	 * @param str 
-	 * 
-	 * @return true if str is null or empty
-	 */
-	public static boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StyleCombo.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StyleCombo.java
deleted file mode 100644
index 4eccfa6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/StyleCombo.java
+++ /dev/null
@@ -1,1877 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.Arrays;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.ACC;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlAdapter;
-import org.eclipse.swt.accessibility.AccessibleControlEvent;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.accessibility.AccessibleTextAdapter;
-import org.eclipse.swt.accessibility.AccessibleTextEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.TypedListener;
-
-/**
- * The CCombo class represents a selectable user interface object that combines
- * a text field and a list and issues notification when an item is selected from
- * the list.
- * <p>
- * Note that although this class is a subclass of <code>Composite</code>, it
- * does not make sense to add children to it, or set a layout on it.
- * </p>
- * <dl>
- * <dt><b>Styles:</b>
- * <dd>BORDER, READ_ONLY, FLAT</dd>
- * <dt><b>Events:</b>
- * <dd>Selection</dd>
- * </dl>
- */
-public final class StyleCombo extends Composite {
-
-	Text text;
-
-	Table table;
-
-	int visibleItemCount = 4;
-
-	Shell popup;
-
-	Button arrow;
-
-	boolean hasFocus;
-
-	Listener listener, filter;
-
-	Color foreground, background;
-
-	Font font;
-
-	String defaultValue;
-
-	/**
-	 * Constructs a new instance of this class given its parent and a style
-	 * value describing its behavior and appearance.
-	 * <p>
-	 * The style value is either one of the style constants defined in class
-	 * <code>SWT</code> which is applicable to instances of this class, or
-	 * must be built by <em>bitwise OR</em>'ing together (that is, using the
-	 * <code>int</code> "|" operator) two or more of those <code>SWT</code>
-	 * style constants. The class description lists the style constants that are
-	 * applicable to the class. Style bits are also inherited from superclasses.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            a widget which will be the parent of the new instance (cannot
-	 *            be null)
-	 * @param style
-	 *            the style of widget to construct
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the parent</li>
-	 *                </ul>
-	 * 
-	 * @see SWT#BORDER
-	 * @see SWT#READ_ONLY
-	 * @see SWT#FLAT
-	 */
-	public StyleCombo(Composite parent, int style) {
-		super(parent, style = checkStyle(style));
-
-		listener = new Listener() {
-			public void handleEvent(Event event) {
-				if (popup == event.widget) {
-					popupEvent(event);
-					return;
-				}
-				if (text == event.widget) {
-					textEvent(event);
-					return;
-				}
-				if (table == event.widget) {
-					tableEvent(event);
-					return;
-				}
-				if (arrow == event.widget) {
-					arrowEvent(event);
-					return;
-				}
-				if (StyleCombo.this == event.widget) {
-					comboEvent(event);
-					return;
-				}
-				if (getShell() == event.widget) {
-					handleFocus(SWT.FocusOut);
-				}
-			}
-		};
-
-		filter = new Listener() {
-			public void handleEvent(Event event) {
-				Shell shell = ((Control) event.widget).getShell();
-				if (shell == StyleCombo.this.getShell()) {
-					handleFocus(SWT.FocusOut);
-				}
-			}
-		};
-
-		int[] comboEvents = { SWT.Dispose, SWT.Move, SWT.Resize };
-		for (int i = 0; i < comboEvents.length; i++)
-			this.addListener(comboEvents[i], listener);
-
-		createText(style);
-		createArrow(style);
-
-		createPopup(null, -1);
-		initAccessible();
-	}
-
-	/**
-	 * @param style
-	 */
-	private void createArrow(int style) {
-		int arrowStyle = SWT.ARROW | SWT.DOWN;
-		if ((style & SWT.FLAT) != 0) {
-			arrowStyle |= SWT.FLAT;
-		}
-		arrow = new Button(this, arrowStyle);
-		int[] arrowEvents = { SWT.Selection, SWT.FocusIn };
-		for (int i = 0; i < arrowEvents.length; i++) {
-			arrow.addListener(arrowEvents[i], listener);
-		}
-	}
-
-	/**
-	 * @param style
-	 */
-	private void createText(int style) {
-		int textStyle = SWT.SINGLE;
-		if ((style & SWT.READ_ONLY) != 0) {
-			textStyle |= SWT.READ_ONLY;
-		}
-		if ((style & SWT.FLAT) != 0) {
-			textStyle |= SWT.FLAT;
-		}
-		text = new Text(this, textStyle);
-		int[] textEvents = { SWT.KeyDown, SWT.KeyUp, SWT.Modify, SWT.MouseDown,
-				SWT.MouseUp, SWT.Traverse, SWT.FocusIn };
-		for (int i = 0; i < textEvents.length; i++) {
-			text.addListener(textEvents[i], listener);
-		}
-	}
-
-	static int checkStyle(int style) {
-		int mask = SWT.BORDER | SWT.READ_ONLY | SWT.FLAT | SWT.LEFT_TO_RIGHT
-				| SWT.RIGHT_TO_LEFT;
-		return style & mask;
-	}
-
-	/**
-	 * Adds the argument to the end of the receiver's list.
-	 * 
-	 * @param string
-	 *            the new item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see #add(String,int)
-	 */
-	public void add(String string) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		TableItem item = new TableItem(table, SWT.NONE);
-		item.setText(0, string);
-	}
-
-	/**
-	 * Adds the argument to the receiver's list at the given zero-relative
-	 * index.
-	 * <p>
-	 * Note: To add an item at the end of the list, use the result of calling
-	 * <code>getItemCount()</code> as the index or use
-	 * <code>add(String)</code>.
-	 * </p>
-	 * 
-	 * @param string
-	 *            the new item
-	 * @param index
-	 *            the index for the item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                <li>ERROR_INVALID_RANGE - if the index is not between 0
-	 *                and the number of elements in the list (inclusive)</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see #add(String)
-	 */
-	public void add(String string, int index) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		TableItem item = new TableItem(table, SWT.NONE, index);
-		item.setText(0, string);
-	}
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notified
-	 * when the receiver's text is modified, by sending it one of the messages
-	 * defined in the <code>ModifyListener</code> interface.
-	 * 
-	 * @param listener1
-	 *            the listener which should be notified
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see ModifyListener
-	 * @see #removeModifyListener
-	 */
-	public void addModifyListener(ModifyListener listener1) {
-		checkWidget();
-		if (listener1 == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		TypedListener typedListener = new TypedListener(listener1);
-		addListener(SWT.Modify, typedListener);
-	}
-
-	/**
-	 * Adds the listener to the collection of listeners who will be notified
-	 * when the receiver's selection changes, by sending it one of the messages
-	 * defined in the <code>SelectionListener</code> interface.
-	 * <p>
-	 * <code>widgetSelected</code> is called when the combo's list selection
-	 * changes. <code>widgetDefaultSelected</code> is typically called when
-	 * ENTER is pressed the combo's text area.
-	 * </p>
-	 * 
-	 * @param listener1
-	 *            the listener which should be notified
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see SelectionListener
-	 * @see #removeSelectionListener
-	 */
-	public void addSelectionListener(SelectionListener listener1) {
-		checkWidget();
-		if (listener1 == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		TypedListener typedListener = new TypedListener(listener1);
-		addListener(SWT.Selection, typedListener);
-		addListener(SWT.DefaultSelection, typedListener);
-	}
-
-	void arrowEvent(Event event) {
-		switch (event.type) {
-		case SWT.FocusIn: {
-			handleFocus(SWT.FocusIn);
-			break;
-		}
-		case SWT.Selection: {
-			dropDown(!isDropped());
-			break;
-		}
-		}
-	}
-
-	/**
-	 * Sets the selection in the receiver's text field to an empty selection
-	 * starting just before the first character. If the text field is editable,
-	 * this has the effect of placing the i-beam at the start of the text.
-	 * <p>
-	 * Note: To clear the selected items in the receiver's list, use
-	 * <code>deselectAll()</code>.
-	 * </p>
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see #deselectAll
-	 */
-	public void clearSelection() {
-		checkWidget();
-		text.clearSelection();
-		table.deselectAll();
-	}
-
-	void comboEvent(Event event) {
-		switch (event.type) {
-		case SWT.Dispose:
-			if (popup != null && !popup.isDisposed()) {
-				table.removeListener(SWT.Dispose, listener);
-				popup.dispose();
-			}
-			Shell shell = getShell();
-			shell.removeListener(SWT.Deactivate, listener);
-			Display display = getDisplay();
-			display.removeFilter(SWT.FocusIn, filter);
-			popup = null;
-			text = null;
-			table = null;
-			arrow = null;
-			break;
-		case SWT.Move:
-			dropDown(false);
-			break;
-		case SWT.Resize:
-			internalLayout(false);
-			break;
-		}
-	}
-
-	private String[] getTableItems() {
-		TableItem[] items = table.getItems();
-		String[] values = new String[items.length];
-		for (int i = 0; i < items.length; i++) {
-			values[i] = items[i].getText(0);
-		}
-		return values;
-	}
-
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		checkWidget();
-		int width = 0, height = 0;
-		String[] items = getTableItems();
-		int textWidth = 0;
-		GC gc = new GC(text);
-		int spacer = gc.stringExtent(" ").x; //$NON-NLS-1$
-		for (int i = 0; i < items.length; i++) {
-			textWidth = Math.max(gc.stringExtent(items[i]).x, textWidth);
-		}
-		gc.dispose();
-		Point textSize = text.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-		Point arrowSize = arrow.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
-		Point listSize = table.computeSize(wHint, SWT.DEFAULT, changed);
-		int borderWidth = getBorderWidth();
-
-		height = Math.max(hHint, Math.max(textSize.y, arrowSize.y) + 2
-				* borderWidth);
-		width = Math.max(wHint, Math.max(textWidth + 2 * spacer + arrowSize.x
-				+ 2 * borderWidth, listSize.x));
-		return new Point(width, height);
-	}
-
-	void createPopup(String[] items, int selectionIndex) {
-		// create shell and list
-		popup = new Shell(getShell(), SWT.NO_TRIM | SWT.ON_TOP);
-		table = new Table(popup, SWT.SINGLE | SWT.V_SCROLL | SWT.FULL_SELECTION);
-		new TableColumn(table, SWT.LEFT);
-		if (font != null) {
-			table.setFont(font);
-		}
-		if (foreground != null) {
-			table.setForeground(foreground);
-		}
-		if (background != null) {
-			table.setBackground(background);
-		}
-
-		int[] popupEvents = { SWT.Close, SWT.Paint, SWT.Deactivate };
-		for (int i = 0; i < popupEvents.length; i++) {
-			popup.addListener(popupEvents[i], listener);
-		}
-		int[] listEvents = { SWT.MouseUp, SWT.Selection, SWT.Traverse,
-				SWT.KeyDown, SWT.KeyUp, SWT.FocusIn, SWT.FocusOut, SWT.Dispose };
-		for (int i = 0; i < listEvents.length; i++) {
-			table.addListener(listEvents[i], listener);
-		}
-		if (items != null) {
-			setItems(items);
-		}
-		if (selectionIndex != -1) {
-			select(selectionIndex);
-		}
-	}
-
-	/**
-	 * Deselects the item at the given zero-relative index in the receiver's
-	 * list. If the item at the index was already deselected, it remains
-	 * deselected. Indices that are out of range are ignored.
-	 * 
-	 * @param index
-	 *            the index of the item to deselect
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void deselect(int index) {
-		checkWidget();
-		table.deselect(index);
-	}
-
-	/**
-	 * Deselects all selected items in the receiver's list.
-	 * <p>
-	 * Note: To clear the selection in the receiver's text field, use
-	 * <code>clearSelection()</code>.
-	 * </p>
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see #clearSelection
-	 */
-	public void deselectAll() {
-		checkWidget();
-		table.deselectAll();
-	}
-
-	void dropDown(boolean drop) {
-		if (drop == isDropped()) {
-			return;
-		}
-		if (!drop) {
-			popup.setVisible(false);
-			table.getColumns()[0].setWidth(0);
-			if (!isDisposed() && arrow.isFocusControl()) {
-				text.setFocus();
-			}
-			return;
-		}
-
-		if (getShell() != popup.getParent()) {
-			String[] items = getTableItems();
-			int selectionIndex = table.getSelectionIndex();
-			table.removeListener(SWT.Dispose, listener);
-			popup.dispose();
-			popup = null;
-			table = null;
-			createPopup(items, selectionIndex);
-		}
-
-		Point size = getSize();
-		int itemCount = table.getItemCount();
-		itemCount = (itemCount == 0) ? visibleItemCount : Math.min(
-				visibleItemCount, itemCount);
-		int itemHeight = table.getItemHeight() * itemCount;
-		Point tableSize = table.computeSize(SWT.DEFAULT, itemHeight, false);
-		// int tableWidth = this.getClientArea()
-		table.setBounds(1, 1, Math.max(size.x - 2, tableSize.x), tableSize.y
-				- table.getHorizontalBar().getSize().y + 2);
-
-		int index = table.getSelectionIndex();
-		if (index != -1) {
-			table.setTopIndex(index);
-		}
-		Display display = getDisplay();
-		Rectangle tableRect = table.getBounds();
-		Rectangle parentRect = display.map(getParent(), null, getBounds());
-		Point comboSize = getSize();
-		Rectangle displayRect = getMonitor().getClientArea();
-		int width = Math.max(comboSize.x, tableRect.width + 2);
-		int height = tableRect.height + 2;
-		int x = parentRect.x;
-		int y = parentRect.y + comboSize.y;
-		if (y + height > displayRect.y + displayRect.height) {
-			y = parentRect.y - height;
-		}
-		popup.setBounds(x, y, width, height);
-		popup.setVisible(true);
-
-		if (table.getItemCount() > visibleItemCount) {
-			table.getColumns()[0].setWidth(text.getSize().x - 2);
-		} else {
-			table.getColumns()[0].setWidth(table.getClientArea().width);
-		}
-		table.setFocus();
-	}
-
-	/*
-	 * Return the Label immediately preceding the receiver in the z-order, or
-	 * null if none.
-	 */
-	Label getAssociatedLabel() {
-		Control[] siblings = getParent().getChildren();
-		for (int i = 0; i < siblings.length; i++) {
-			if (siblings[i] == StyleCombo.this) {
-				if (i > 0 && siblings[i - 1] instanceof Label) {
-					return (Label) siblings[i - 1];
-				}
-			}
-		}
-		return null;
-	}
-
-	public Control[] getChildren() {
-		checkWidget();
-		return new Control[0];
-	}
-
-	/**
-	 * Gets the editable state.
-	 * 
-	 * @return whether or not the reciever is editable
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @since 3.0
-	 */
-	public boolean getEditable() {
-		checkWidget();
-		return text.getEditable();
-	}
-
-	/**
-	 * Returns the item at the given, zero-relative index in the receiver's
-	 * list. Throws an exception if the index is out of range.
-	 * 
-	 * @param index
-	 *            the index of the item to return
-	 * @return the item at the given index
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_INVALID_RANGE - if the index is not between 0
-	 *                and the number of elements in the list minus 1 (inclusive)</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public String getItem(int index) {
-		checkWidget();
-		return table.getItem(index).getText(0);
-	}
-
-	/**
-	 * Returns the number of items contained in the receiver's list.
-	 * 
-	 * @return the number of items
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int getItemCount() {
-		checkWidget();
-		return table.getItemCount();
-	}
-
-	/**
-	 * Returns the height of the area which would be used to display
-	 * <em>one</em> of the items in the receiver's list.
-	 * 
-	 * @return the height of one item
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int getItemHeight() {
-		checkWidget();
-		return table.getItemHeight();
-	}
-
-	/**
-	 * Returns an array of <code>String</code>s which are the items in the
-	 * receiver's list.
-	 * <p>
-	 * Note: This is not the actual structure used by the receiver to maintain
-	 * its list of items, so modifying the array will not affect the receiver.
-	 * </p>
-	 * 
-	 * @return the items in the receiver's list
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public String[] getItems() {
-		checkWidget();
-		return getTableItems();
-	}
-
-	char getMnemonic(String string) {
-		int index = 0;
-		int length = string.length();
-		do {
-			while ((index < length) && (string.charAt(index) != '&')) {
-				index++;
-			}
-			if (++index >= length) {
-				return '\0';
-			}
-			if (string.charAt(index) != '&') {
-				return string.charAt(index);
-			}
-			index++;
-		} while (index < length);
-		return '\0';
-	}
-
-	/**
-	 * Returns a <code>Point</code> whose x coordinate is the start of the
-	 * selection in the receiver's text field, and whose y coordinate is the end
-	 * of the selection. The returned values are zero-relative. An "empty"
-	 * selection as indicated by the the x and y coordinates having the same
-	 * value.
-	 * 
-	 * @return a point representing the selection start and end
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public Point getSelection() {
-		checkWidget();
-		return text.getSelection();
-	}
-
-	/**
-	 * Returns the zero-relative index of the item which is currently selected
-	 * in the receiver's list, or -1 if no item is selected.
-	 * 
-	 * @return the index of the selected item
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int getSelectionIndex() {
-		checkWidget();
-		return table.getSelectionIndex();
-	}
-
-	public int getStyle() {
-		int style = super.getStyle();
-		style &= ~SWT.READ_ONLY;
-		if (!text.getEditable()) {
-			style |= SWT.READ_ONLY;
-		}
-		return style;
-	}
-
-	/**
-	 * Returns a string containing a copy of the contents of the receiver's text
-	 * field.
-	 * 
-	 * @return the receiver's text
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public String getText() {
-		checkWidget();
-		return text.getText();
-	}
-
-	/**
-	 * Returns the height of the receivers's text field.
-	 * 
-	 * @return the text height
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int getTextHeight() {
-		checkWidget();
-		return text.getLineHeight();
-	}
-
-	/**
-	 * Returns the maximum number of characters that the receiver's text field
-	 * is capable of holding. If this has not been changed by
-	 * <code>setTextLimit()</code>, it will be the constant
-	 * <code>Combo.LIMIT</code>.
-	 * 
-	 * @return the text limit
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int getTextLimit() {
-		checkWidget();
-		return text.getTextLimit();
-	}
-
-	/**
-	 * Gets the number of items that are visible in the drop down portion of the
-	 * receiver's list.
-	 * 
-	 * @return the number of items that are visible
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @since 3.0
-	 */
-	public int getVisibleItemCount() {
-		checkWidget();
-		return visibleItemCount;
-	}
-
-	void handleFocus(int type) {
-		if (isDisposed()) {
-			return;
-		}
-		switch (type) {
-		case SWT.FocusIn: {
-			if (hasFocus) {
-				return;
-			}
-			if (getEditable()) {
-				text.selectAll();
-			}
-			hasFocus = true;
-			Shell shell = getShell();
-			shell.removeListener(SWT.Deactivate, listener);
-			shell.addListener(SWT.Deactivate, listener);
-			Display display = getDisplay();
-			display.removeFilter(SWT.FocusIn, filter);
-			display.addFilter(SWT.FocusIn, filter);
-			Event e = new Event();
-			notifyListeners(SWT.FocusIn, e);
-			break;
-		}
-		case SWT.FocusOut: {
-			if (!hasFocus) {
-				return;
-			}
-			Control focusControl = getDisplay().getFocusControl();
-			if (focusControl == arrow || focusControl == table
-					|| focusControl == text) {
-				return;
-			}
-			hasFocus = false;
-			Shell shell = getShell();
-			shell.removeListener(SWT.Deactivate, listener);
-			Display display = getDisplay();
-			display.removeFilter(SWT.FocusIn, filter);
-			Event e = new Event();
-			notifyListeners(SWT.FocusOut, e);
-			break;
-		}
-		}
-	}
-
-	/**
-	 * Searches the receiver's list starting at the first item (index 0) until
-	 * an item is found that is equal to the argument, and returns the index of
-	 * that item. If no item is found, returns -1.
-	 * 
-	 * @param string
-	 *            the search item
-	 * @return the index of the item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int indexOf(String string) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		return Arrays.asList(getTableItems()).indexOf(string);
-	}
-
-	/**
-	 * Searches the receiver's list starting at the given, zero-relative index
-	 * until an item is found that is equal to the argument, and returns the
-	 * index of that item. If no item is found or the starting index is out of
-	 * range, returns -1.
-	 * 
-	 * @param string
-	 *            the search item
-	 * @param start
-	 *            the zero-relative index at which to begin the search
-	 * @return the index of the item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public int indexOf(String string, int start) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		String[] items = getTableItems();
-		for (int i = start; i < items.length; i++) {
-			if (items[i].equals(string)) {
-				return i;
-			}
-		}
-		return -1;
-	}
-
-	void initAccessible() {
-		AccessibleAdapter accessibleAdapter = new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				String name = null;
-				Label label = getAssociatedLabel();
-				if (label != null) {
-					name = stripMnemonic(label.getText());
-				}
-				e.result = name;
-			}
-
-			public void getKeyboardShortcut(AccessibleEvent e) {
-				String shortcut = null;
-				Label label = getAssociatedLabel();
-				if (label != null) {
-					String text1 = label.getText();
-					if (text1 != null) {
-						char mnemonic = getMnemonic(text1);
-						if (mnemonic != '\0') {
-							shortcut = "Alt+" + mnemonic; //$NON-NLS-1$
-						}
-					}
-				}
-				e.result = shortcut;
-			}
-
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-			}
-		};
-		getAccessible().addAccessibleListener(accessibleAdapter);
-		text.getAccessible().addAccessibleListener(accessibleAdapter);
-		table.getAccessible().addAccessibleListener(accessibleAdapter);
-
-		arrow.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-			public void getName(AccessibleEvent e) {
-				e.result = isDropped() ? SWT.getMessage("SWT_Close") : SWT.getMessage("SWT_Open"); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-
-			public void getKeyboardShortcut(AccessibleEvent e) {
-				e.result = "Alt+Down Arrow"; //$NON-NLS-1$
-			}
-
-			public void getHelp(AccessibleEvent e) {
-				e.result = getToolTipText();
-			}
-		});
-
-		getAccessible().addAccessibleTextListener(new AccessibleTextAdapter() {
-			public void getCaretOffset(AccessibleTextEvent e) {
-				e.offset = text.getCaretPosition();
-			}
-		});
-
-		getAccessible().addAccessibleControlListener(
-				new AccessibleControlAdapter() {
-					public void getChildAtPoint(AccessibleControlEvent e) {
-						Point testPoint = toControl(e.x, e.y);
-						if (getBounds().contains(testPoint)) {
-							e.childID = ACC.CHILDID_SELF;
-						}
-					}
-
-					public void getLocation(AccessibleControlEvent e) {
-						Rectangle location = getBounds();
-						Point pt = toDisplay(location.x, location.y);
-						e.x = pt.x;
-						e.y = pt.y;
-						e.width = location.width;
-						e.height = location.height;
-					}
-
-					public void getChildCount(AccessibleControlEvent e) {
-						e.detail = 0;
-					}
-
-					public void getRole(AccessibleControlEvent e) {
-						e.detail = ACC.ROLE_COMBOBOX;
-					}
-
-					public void getState(AccessibleControlEvent e) {
-						e.detail = ACC.STATE_NORMAL;
-					}
-
-					public void getValue(AccessibleControlEvent e) {
-						e.result = getText();
-					}
-				});
-
-		text.getAccessible().addAccessibleControlListener(
-				new AccessibleControlAdapter() {
-					public void getRole(AccessibleControlEvent e) {
-						e.detail = text.getEditable() ? ACC.ROLE_TEXT
-								: ACC.ROLE_LABEL;
-					}
-				});
-
-		arrow.getAccessible().addAccessibleControlListener(
-				new AccessibleControlAdapter() {
-					public void getDefaultAction(AccessibleControlEvent e) {
-						e.result = isDropped() ? SWT.getMessage("SWT_Close") : SWT.getMessage("SWT_Open"); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-				});
-	}
-
-	boolean isDropped() {
-		return popup.getVisible();
-	}
-
-	public boolean isFocusControl() {
-		checkWidget();
-		if (text.isFocusControl() || arrow.isFocusControl()
-				|| table.isFocusControl() || popup.isFocusControl()) {
-			return true;
-		}
-		return super.isFocusControl();
-	}
-
-	void internalLayout(boolean changed) {
-		if (isDropped()) {
-			dropDown(false);
-		}
-		Rectangle rect = getClientArea();
-		int width = rect.width;
-		int height = rect.height;
-		Point arrowSize = arrow.computeSize(SWT.DEFAULT, height, changed);
-		text.setBounds(0, 0, width - arrowSize.x, height);
-		arrow.setBounds(width - arrowSize.x, 0, arrowSize.x, arrowSize.y);
-	}
-
-	void tableEvent(Event event) {
-		switch (event.type) {
-		case SWT.Dispose:
-			if (getShell() != popup.getParent()) {
-				String[] items = getTableItems();
-				int selectionIndex = table.getSelectionIndex();
-				popup = null;
-				table = null;
-				createPopup(items, selectionIndex);
-			}
-			break;
-		case SWT.FocusIn: {
-			handleFocus(SWT.FocusIn);
-			break;
-		}
-		case SWT.MouseUp: {
-			if (event.button != 1) {
-				return;
-			}
-			dropDown(false);
-			break;
-		}
-		case SWT.Selection: {
-			int index = table.getSelectionIndex();
-			if (index == -1)
-				return;
-			text.setText(table.getItem(index).getText());
-			text.selectAll();
-			table.setSelection(index);
-			Event e = new Event();
-			e.time = event.time;
-			e.stateMask = event.stateMask;
-			e.doit = event.doit;
-			notifyListeners(SWT.Selection, e);
-			event.doit = e.doit;
-			break;
-		}
-		case SWT.Traverse: {
-			switch (event.detail) {
-			case SWT.TRAVERSE_RETURN:
-			case SWT.TRAVERSE_ESCAPE:
-			case SWT.TRAVERSE_ARROW_PREVIOUS:
-			case SWT.TRAVERSE_ARROW_NEXT:
-				event.doit = false;
-				break;
-			}
-			Event e = new Event();
-			e.time = event.time;
-			e.detail = event.detail;
-			e.doit = event.doit;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			notifyListeners(SWT.Traverse, e);
-			event.doit = e.doit;
-			event.detail = e.detail;
-			break;
-		}
-		case SWT.KeyUp: {
-			Event e = new Event();
-			e.time = event.time;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			e.stateMask = event.stateMask;
-			notifyListeners(SWT.KeyUp, e);
-			break;
-		}
-		case SWT.KeyDown: {
-			if (event.character == SWT.ESC) {
-				// Escape key cancels popup list
-				dropDown(false);
-			}
-			if ((event.stateMask & SWT.ALT) != 0
-					&& (event.keyCode == SWT.ARROW_UP || event.keyCode == SWT.ARROW_DOWN)) {
-				dropDown(false);
-			}
-			if (event.character == SWT.CR) {
-				// Enter causes default selection
-				dropDown(false);
-				Event e = new Event();
-				e.time = event.time;
-				e.stateMask = event.stateMask;
-				notifyListeners(SWT.DefaultSelection, e);
-			}
-			// At this point the widget may have been disposed.
-			// If so, do not continue.
-			if (isDisposed()) {
-				break;
-			}
-			Event e = new Event();
-			e.time = event.time;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			e.stateMask = event.stateMask;
-			notifyListeners(SWT.KeyDown, e);
-			break;
-
-		}
-		}
-	}
-
-	void popupEvent(Event event) {
-		switch (event.type) {
-		case SWT.Paint:
-			// draw black rectangle around list
-			Rectangle listRect = table.getBounds();
-			Color black = getDisplay().getSystemColor(SWT.COLOR_BLACK);
-			event.gc.setForeground(black);
-			event.gc.drawRectangle(0, 0, listRect.width + 1,
-					listRect.height + 1);
-			break;
-		case SWT.Close:
-			event.doit = false;
-			dropDown(false);
-			break;
-		case SWT.Deactivate:
-			dropDown(false);
-			break;
-		}
-	}
-
-	public void redraw() {
-		super.redraw();
-		text.redraw();
-		arrow.redraw();
-		if (popup.isVisible()) {
-			table.redraw();
-		}
-	}
-
-	public void redraw(int x, int y, int width, int height, boolean all) {
-		super.redraw(x, y, width, height, true);
-	}
-
-	/**
-	 * Removes the item from the receiver's list at the given zero-relative
-	 * index.
-	 * 
-	 * @param index
-	 *            the index for the item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_INVALID_RANGE - if the index is not between 0
-	 *                and the number of elements in the list minus 1 (inclusive)</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void remove(int index) {
-		checkWidget();
-		table.remove(index);
-	}
-
-	/**
-	 * Removes the items from the receiver's list which are between the given
-	 * zero-relative start and end indices (inclusive).
-	 * 
-	 * @param start
-	 *            the start of the range
-	 * @param end
-	 *            the end of the range
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_INVALID_RANGE - if either the start or end are
-	 *                not between 0 and the number of elements in the list minus
-	 *                1 (inclusive)</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void remove(int start, int end) {
-		checkWidget();
-		table.remove(start, end);
-	}
-
-	/**
-	 * Searches the receiver's list starting at the first item until an item is
-	 * found that is equal to the argument, and removes that item from the list.
-	 * 
-	 * @param string
-	 *            the item to remove
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                <li>ERROR_INVALID_ARGUMENT - if the string is not found
-	 *                in the list</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void remove(String string) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		int index = Arrays.asList(getTableItems()).indexOf(string);
-		table.remove(index);
-	}
-
-	/**
-	 * Removes all of the items from the receiver's list and clear the contents
-	 * of receiver's text field.
-	 * <p>
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void removeAll() {
-		checkWidget();
-		text.setText(""); //$NON-NLS-1$
-		table.removeAll();
-	}
-
-	/**
-	 * Removes the listener from the collection of listeners who will be
-	 * notified when the receiver's text is modified.
-	 * 
-	 * @param listener1
-	 *            the listener which should no longer be notified
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see ModifyListener
-	 * @see #addModifyListener
-	 */
-	public void removeModifyListener(ModifyListener listener1) {
-		checkWidget();
-		if (listener1 == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		removeListener(SWT.Modify, listener1);
-	}
-
-	/**
-	 * Removes the listener from the collection of listeners who will be
-	 * notified when the receiver's selection changes.
-	 * 
-	 * @param listener1
-	 *            the listener which should no longer be notified
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @see SelectionListener
-	 * @see #addSelectionListener
-	 */
-	public void removeSelectionListener(SelectionListener listener1) {
-		checkWidget();
-		if (listener1 == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		removeListener(SWT.Selection, listener1);
-		removeListener(SWT.DefaultSelection, listener1);
-	}
-
-	/**
-	 * Selects the item at the given zero-relative index in the receiver's list.
-	 * If the item at the index was already selected, it remains selected.
-	 * Indices that are out of range are ignored.
-	 * 
-	 * @param index
-	 *            the index of the item to select
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void select(int index) {
-		checkWidget();
-		if (index == -1) {
-			table.deselectAll();
-			text.setText(""); //$NON-NLS-1$
-			return;
-		}
-		if (0 <= index && index < table.getItemCount()) {
-			if (index != getSelectionIndex()) {
-				text.setText(table.getItem(index).getText());
-				text.selectAll();
-				table.select(index);
-				table.showSelection();
-			}
-		}
-	}
-
-	public void setBackground(Color color) {
-		super.setBackground(color);
-		background = color;
-		if (text != null) {
-			text.setBackground(color);
-		}
-		if (table != null) {
-			table.setBackground(color);
-		}
-		if (arrow != null) {
-			arrow.setBackground(color);
-		}
-	}
-
-	/**
-	 * Sets the editable state.
-	 * 
-	 * @param editable
-	 *            the new editable state
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @since 3.0
-	 */
-	public void setEditable(boolean editable) {
-		checkWidget();
-		text.setEditable(editable);
-	}
-
-	public void setEnabled(boolean enabled) {
-		super.setEnabled(enabled);
-		if (popup != null) {
-			popup.setVisible(false);
-		}
-		if (text != null) {
-			text.setEnabled(enabled);
-		}
-		if (arrow != null) {
-			arrow.setEnabled(enabled);
-		}
-	}
-
-	public boolean setFocus() {
-		checkWidget();
-		return text.setFocus();
-	}
-
-	public void setFont(Font font) {
-		super.setFont(font);
-		this.font = font;
-		text.setFont(font);
-		table.setFont(font);
-		internalLayout(true);
-	}
-
-	public void setForeground(Color color) {
-		super.setForeground(color);
-		foreground = color;
-		if (text != null) {
-			text.setForeground(color);
-		}
-		if (table != null) {
-			table.setForeground(color);
-		}
-		if (arrow != null) {
-			arrow.setForeground(color);
-		}
-	}
-
-	/**
-	 * Sets the text of the item in the receiver's list at the given
-	 * zero-relative index to the string argument. This is equivalent to
-	 * <code>remove</code>'ing the old item at the index, and then
-	 * <code>add</code>'ing the new item at that index.
-	 * 
-	 * @param index
-	 *            the index for the item
-	 * @param string
-	 *            the new text for the item
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_INVALID_RANGE - if the index is not between 0
-	 *                and the number of elements in the list minus 1 (inclusive)</li>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setItem(int index, String string) {
-		checkWidget();
-		table.getItem(index).setText(0, string);
-	}
-
-	/**
-	 * Sets the receiver's list to be the given array of items.
-	 * 
-	 * @param items
-	 *            the array of items
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the items array is null</li>
-	 *                <li>ERROR_INVALID_ARGUMENT - if an item in the items
-	 *                array is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setItems(String[] items) {
-		checkWidget();
-		if (items == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-
-		for (int i = 0; i < items.length; i++) {
-			TableItem item = new TableItem(table, SWT.NONE);
-			if (items[i].equals(defaultValue)) {
-				item.setFont(JFaceResources.getFontRegistry().getBold(
-						JFaceResources.DEFAULT_FONT));
-			}
-			item.setText(0, items[i]);
-		}
-	}
-
-	/**
-	 * Sets the layout which is associated with the receiver to be the argument
-	 * which may be null.
-	 * <p>
-	 * Note : No Layout can be set on this Control because it already manages
-	 * the size and position of its children.
-	 * </p>
-	 * 
-	 * @param layout
-	 *            the receiver's new layout or null
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setLayout(Layout layout) {
-		checkWidget();
-		return;
-	}
-
-	/**
-	 * Sets the selection in the receiver's text field to the range specified by
-	 * the argument whose x coordinate is the start of the selection and whose y
-	 * coordinate is the end of the selection.
-	 * 
-	 * @param selection
-	 *            a point representing the new selection start and end
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the point is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setSelection(Point selection) {
-		checkWidget();
-		if (selection == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		text.setSelection(selection.x, selection.y);
-	}
-
-	/**
-	 * Sets the contents of the receiver's text field to the given string.
-	 * <p>
-	 * Note: The text field in a <code>Combo</code> is typically only capable
-	 * of displaying a single line of text. Thus, setting the text to a string
-	 * containing line breaks or other special characters will probably cause it
-	 * to display incorrectly.
-	 * </p>
-	 * 
-	 * @param string
-	 *            the new text
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_NULL_ARGUMENT - if the string is null</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setText(String string) {
-		checkWidget();
-		if (string == null) {
-			SWT.error(SWT.ERROR_NULL_ARGUMENT);
-		}
-		int index = Arrays.asList(getTableItems()).indexOf(string);
-		if (index == -1) {
-			table.deselectAll();
-			text.setText(string);
-			return;
-		}
-		text.setText(string);
-		text.selectAll();
-		table.setSelection(index);
-		table.showSelection();
-	}
-
-	/**
-	 * Sets the maximum number of characters that the receiver's text field is
-	 * capable of holding to be the argument.
-	 * 
-	 * @param limit
-	 *            new text limit
-	 * 
-	 * @exception IllegalArgumentException
-	 *                <ul>
-	 *                <li>ERROR_CANNOT_BE_ZERO - if the limit is zero</li>
-	 *                </ul>
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 */
-	public void setTextLimit(int limit) {
-		checkWidget();
-		text.setTextLimit(limit);
-	}
-
-	public void setToolTipText(String string) {
-		checkWidget();
-		super.setToolTipText(string);
-		arrow.setToolTipText(string);
-		text.setToolTipText(string);
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (!visible) {
-			popup.setVisible(false);
-		}
-	}
-
-	/**
-	 * Sets the number of items that are visible in the drop down portion of the
-	 * receiver's list.
-	 * 
-	 * @param count
-	 *            the new number of items to be visible
-	 * 
-	 * @exception org.eclipse.swt.SWTException
-	 *                <ul>
-	 *                <li>ERROR_WIDGET_DISPOSED - if the receiver has been
-	 *                disposed</li>
-	 *                <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
-	 *                thread that created the receiver</li>
-	 *                </ul>
-	 * 
-	 * @since 3.0
-	 */
-	public void setVisibleItemCount(int count) {
-		checkWidget();
-		if (count < 0) {
-			return;
-		}
-		visibleItemCount = count;
-	}
-
-	String stripMnemonic(String string) {
-		int index = 0;
-		int length = string.length();
-		do {
-			while ((index < length) && (string.charAt(index) != '&')) {
-				index++;
-			}
-			if (++index >= length) {
-				return string;
-			}
-			if (string.charAt(index) != '&') {
-				return string.substring(0, index - 1)
-						+ string.substring(index, length);
-			}
-			index++;
-		} while (index < length);
-		return string;
-	}
-
-	void textEvent(Event event) {
-		switch (event.type) {
-		case SWT.FocusIn: {
-			handleFocus(SWT.FocusIn);
-			break;
-		}
-		case SWT.KeyDown: {
-			if (event.character == SWT.CR) {
-				dropDown(false);
-				Event e = new Event();
-				e.time = event.time;
-				e.stateMask = event.stateMask;
-				notifyListeners(SWT.DefaultSelection, e);
-			}
-			// At this point the widget may have been disposed.
-			// If so, do not continue.
-			if (isDisposed()) {
-				break;
-			}
-
-			if (event.keyCode == SWT.ARROW_UP
-					|| event.keyCode == SWT.ARROW_DOWN) {
-				event.doit = false;
-				if ((event.stateMask & SWT.ALT) != 0) {
-					boolean dropped = isDropped();
-					text.selectAll();
-					if (!dropped) {
-						setFocus();
-					}
-					dropDown(!dropped);
-					break;
-				}
-
-				int oldIndex = getSelectionIndex();
-				if (event.keyCode == SWT.ARROW_UP) {
-					select(Math.max(oldIndex - 1, 0));
-				} else {
-					select(Math.min(oldIndex + 1, getItemCount() - 1));
-				}
-				if (oldIndex != getSelectionIndex()) {
-					Event e = new Event();
-					e.time = event.time;
-					e.stateMask = event.stateMask;
-					notifyListeners(SWT.Selection, e);
-				}
-				// At this point the widget may have been disposed.
-				// If so, do not continue.
-				if (isDisposed()) {
-					break;
-				}
-			}
-
-			// Further work : Need to add support for incremental search in
-			// pop up list as characters typed in text widget
-
-			Event e = new Event();
-			e.time = event.time;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			e.stateMask = event.stateMask;
-			notifyListeners(SWT.KeyDown, e);
-			break;
-		}
-		case SWT.KeyUp: {
-			Event e = new Event();
-			e.time = event.time;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			e.stateMask = event.stateMask;
-			notifyListeners(SWT.KeyUp, e);
-			break;
-		}
-		case SWT.Modify: {
-			table.deselectAll();
-			Event e = new Event();
-			e.time = event.time;
-			notifyListeners(SWT.Modify, e);
-			break;
-		}
-		case SWT.MouseDown: {
-			if (event.button != 1) {
-				return;
-			}
-			if (text.getEditable()) {
-				return;
-			}
-			boolean dropped = isDropped();
-			text.selectAll();
-			if (!dropped) {
-				setFocus();
-			}
-			dropDown(!dropped);
-			break;
-		}
-		case SWT.MouseUp: {
-			if (event.button != 1) {
-				return;
-			}
-			if (text.getEditable()) {
-				return;
-			}
-			text.selectAll();
-			break;
-		}
-		case SWT.Traverse: {
-			switch (event.detail) {
-			case SWT.TRAVERSE_RETURN:
-			case SWT.TRAVERSE_ARROW_PREVIOUS:
-			case SWT.TRAVERSE_ARROW_NEXT:
-				// The enter causes default selection and
-				// the arrow keys are used to manipulate the list contents so
-				// do not use them for traversal.
-				event.doit = false;
-				break;
-			}
-
-			Event e = new Event();
-			e.time = event.time;
-			e.detail = event.detail;
-			e.doit = event.doit;
-			e.character = event.character;
-			e.keyCode = event.keyCode;
-			notifyListeners(SWT.Traverse, e);
-			event.doit = e.doit;
-			event.detail = e.detail;
-			break;
-		}
-		}
-	}
-
-	/**
-	 * @param defaultValue
-	 */
-	public void setDefaultValue(String defaultValue) {
-		this.defaultValue = defaultValue;
-		int index = Arrays.asList(getTableItems()).indexOf(defaultValue);
-		if (index != -1) {
-			table.getItem(index).setFont(
-					JFaceResources.getFontRegistry().getBold(
-							JFaceResources.DEFAULT_FONT));
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/UTF8Util.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/UTF8Util.java
deleted file mode 100644
index 31aac19..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/UTF8Util.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-/**
- * TODO: this class doesn't seem to be in use
- * @author mengbo
- * @version 1.5
- */
-public final class UTF8Util {
-	private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
-			'6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
-
-	/**
-	 * @param s
-	 * @return the unwound string
-	 */
-	public static String unwindEscapeChars(String s) {
-		StringBuffer sb = new StringBuffer(s.length());
-		int length = s.length();
-		for (int i = 0; i < length; i++) {
-			char c = s.charAt(i);
-			sb.append(getUnwoundString(c));
-		}
-		return sb.toString();
-	}
-
-	private static String getUnwoundString(char c) {
-		switch (c) {
-		case '\b':
-			return "\\b";//$NON-NLS-1$
-		case '\t':
-			return "\\t";//$NON-NLS-1$
-		case '\n':
-			return "\\n";//$NON-NLS-1$
-		case '\f':
-			return "\\f";//$NON-NLS-1$	
-		case '\r':
-			return "\\r";//$NON-NLS-1$
-
-			// These can be used unescaped in properties file:
-		case '\"':
-			return "\\\"";//$NON-NLS-1$
-		case '\'':
-			return "\\\'";//$NON-NLS-1$
-
-		case '\\':
-			return "\\\\";//$NON-NLS-1$
-
-		case '=':
-			return "\\=";//$NON-NLS-1$
-
-			// This is only done when writing to the .properties file in
-			// #unwindValue(String)
-			// case '!':
-			// return "\\!";//$NON-NLS-1$
-			// case '#':
-			// return "\\#";//$NON-NLS-1$
-
-		default:
-			if (((c < 0x0020) || (c > 0x007e))) {
-				return new StringBuffer().append('\\').append('u').append(
-						toHex((c >> 12) & 0xF)).append(toHex((c >> 8) & 0xF))
-						.append(toHex((c >> 4) & 0xF)).append(toHex(c & 0xF))
-						.toString();
-
-			}
-			return String.valueOf(c);
-		}
-	}
-
-	private static char toHex(int halfByte) {
-		return HEX_DIGITS[(halfByte & 0xF)];
-	}
-
-	private UTF8Util()
-	{
-		// no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WebrootUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WebrootUtil.java
deleted file mode 100644
index 3a99bf3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WebrootUtil.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-
-/**
- * Web app utility methods
- */
-public class WebrootUtil {
-
-	/**
-	 * get the webpath for the project path. The project path is something like
-	 * "/projectname/webroot/filename.jsp", or "/projectname/webroot/folder".
-	 * The project information should be removed from project path, e.g,
-	 * "/filename.jsp" or "/folder/*";
-	 * 
-	 * @param path
-	 * @return the web path
-	 */
-	public static String getWebPath(IPath path) {
-		String strWebrootPath = ""; //$NON-NLS-1$
-		IProject project = WorkspaceUtil.getProjectFor(path);
-		IPath webContentPath = getWebContentPath(project);
-		if (webContentPath != null && webContentPath.isPrefixOf(path)) {
-			int start = path.matchingFirstSegments(webContentPath);
-			String[] segments = path.segments();
-			for (int i = start, n = path.segmentCount(); i < n; i++) {
-				strWebrootPath = strWebrootPath
-						+ IFileFolderConstants.PATH_SEPARATOR + segments[i];
-			}
-		}
-		return strWebrootPath;
-	}
-
-	/**
-	 * To see if a resource is under the webcontent folder.
-	 * 
-	 * @param resource
-	 * @return true if resource is within the web content folder hierarchy
-	 */
-	public static boolean isUnderWebContentFolder(IResource resource) {
-		IPath webContentPath = getWebContentPath(resource.getProject());
-		if (webContentPath != null) {
-			return webContentPath.isPrefixOf(resource.getFullPath());
-		}
-		return true;
-	}
-
-	/**
-	 * @param project
-	 * @return full path to web content folder
-	 */
-	public static IPath getWebContentPath(IProject project) {
-		if (project != null) {
-			IVirtualComponent component = ComponentCore.createComponent(project);
-			if (component != null) {
-				IVirtualFolder rootFolder = component.getRootFolder();
-				if (rootFolder != null) {
-					IContainer underlyingFolder = rootFolder.getUnderlyingFolder();
-					if (underlyingFolder != null) {
-						return underlyingFolder.getFullPath();
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Return the name of the web content folder. i.e, "WebContent"
-	 * 
-	 * @param project
-	 * @return the web content folder name
-	 */
-	public static String getWebContentFolderName(IProject project) {
-		IPath webContentPath = getWebContentPath(project);
-		if (webContentPath != null)
-			return webContentPath.lastSegment();
-		return null;
-	}
-
-	/**
-	 * @param project
-	 * @return folder where for web content
-	 */
-	public static IFolder getWebContentFolder(IProject project) {
-		IPath webContentPath = getWebContentPath(project);
-		IFolder folder = null;
-		if (webContentPath != null) {
-			folder = project.getFolder(webContentPath.removeFirstSegments(1));
-		}
-		return folder;
-	}
-
-	/**
-	 * return the depth of webcontent folder. For example, if the webcontent
-	 * folder path is /projectname/webContent, then return 2, if it's
-	 * /projectname/a/webContent, then return 3.
-	 * 
-	 * @param project
-	 * @return the depth of webcontent folder
-	 */
-	public static int getWebContentFolderDepth(IProject project) {
-		if (project != null) {
-			IPath webContentPath = getWebContentPath(project);
-			if (webContentPath != null) {
-				return webContentPath.segmentCount();
-			}
-		}
-		// default to 2
-		return 2;
-	}
-
-	/**
-	 * determine the path of web file is valid or not
-	 * 
-	 * @param path -
-	 *            the path of web file
-	 * @return - true - valid web file
-	 */
-	public static boolean isValidWebFile(IPath path) {
-		String[] jspExtensions = getJSPFileExtensions();
-
-		String extension = path.getFileExtension();
-		if (extension != null
-				&& Arrays.asList(jspExtensions).contains(extension))
-		{
-				return true;
-		}
-
-		return false;
-	}
-
-	/**
-	 * get the webpath for the project path. The project path is something like
-	 * "/projectname/webroot/filename.jsp", or "/projectname/webroot/folder".
-	 * The project information should be removed from project path, e.g,
-	 * "/filename.jsp" or "/folder/*";
-	 * 
-	 * @param strPath -
-	 *            the project path
-	 * @return - web path remove from "/projectname/webroot"
-	 * @deprecated use getWebPath(IPath path) instead.
-	 */
-	public static String getWebPath(String strPath) {
-		String strWebrootPath = ""; //$NON-NLS-1$
-		if (strPath != null) {
-			IPath path = new Path(strPath);
-			return getWebPath(path);
-		}
-		return strWebrootPath;
-	}
-
-	/**
-	 * @param strWebPath
-	 * @return the page name
-	 */
-	public static String getPageNameFromWebPath(String strWebPath) {
-		String pageName = strWebPath;
-
-		if (pageName.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
-			pageName = pageName.substring(1);
-		}
-
-		String[] jspExtensions = getJSPFileExtensions();
-		for (int i = 0, n = jspExtensions.length; i < n; i++) {
-			String extension = IFileFolderConstants.DOT + jspExtensions[i];
-			if (pageName.endsWith(extension)) {
-			pageName = pageName.substring(0, pageName.length()
-						- extension.length());
-				break;
-		}
-		}
-
-		return pageName;
-	}
-	/**
-	 * Get the JSP file extension from Eclipse preference
-	 * Windows->Preferences->General->Content Types
-	 * 
-	 * @return String Array for JSP file extensions
-	 */
-	public static String[] getJSPFileExtensions() {
-		IContentTypeManager typeManager = Platform.getContentTypeManager();
-		IContentType jspContentType = typeManager
-				.getContentType("org.eclipse.jst.jsp.core.jspsource"); //$NON-NLS-1$
-		if (jspContentType != null) {
-			return jspContentType
-					.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
-		}
-		return null;
-	}
-
-	/**
-	 * Tests if the passed IProject instance is a valid JSF project in the
-	 * following ways:
-	 * <ul>
-	 * <li>project is not null and is accessible, </li>
-	 * <li>project has the "jst.web" facet set on it.</li> 
-	 * </ul>
-	 * 
-	 * @param project
-	 *            IProject instance to be tested.
-	 * @return true if the IProject instance is a valid JSF project, else false.
-	 */
-	public static boolean isValidWebProject(IProject project) {
-		boolean isValid = false;
-		// check for null or inaccessible project
-		if (project != null && project.isAccessible()) {
-            // TODO: this was jst.jsf before, but we are checking for jst.web
-            // the javadoc seems out of sync with the method name
-			// check for "jst.web" facet on project
-			try {
-				IFacetedProject facetedProject = ProjectFacetsManager
-						.create(project);
-				if (facetedProject != null) {
-					Set projectFacets = facetedProject.getProjectFacets();
-					Iterator itProjectFacets = projectFacets.iterator();
-					while (itProjectFacets.hasNext()) {
-						IProjectFacetVersion projectFacetVersion = (IProjectFacetVersion) itProjectFacets
-								.next();
-						IProjectFacet projectFacet = projectFacetVersion
-								.getProjectFacet();
-						if ("jst.web".equals(projectFacet.getId())) { //$NON-NLS-1$
-							isValid = true;
-							break;
-						}
-					}
-				}
-			} catch (CoreException ce) {
-                JSFUICommonPlugin.getLogger(WebrootUtil.class).error("checking web project", ce); //$NON-NLS-1$
-			}
-		}
-		return isValid;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WorkspaceUtil.java b/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WorkspaceUtil.java
deleted file mode 100644
index 6c5dcba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.ui/src/org/eclipse/jst/jsf/common/ui/internal/utils/WorkspaceUtil.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.common.ui.internal.utils;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.InputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-
-/**
- * TODO: This class should be abstract to common utility.
- * 
- * This class implements management of resource in a workspace.
- */
-public final class WorkspaceUtil {
-	/** log instance */
-	private static final Logger log = JSFUICommonPlugin
-			.getLogger(WorkspaceUtil.class);
-
-	private WorkspaceUtil() {
-	    // no external instantiation
-	}
-
-	/**
-	 * Create the given file in the workspace resource info tree.
-	 * @param resource 
-	 * @param contents 
-	 */
-	public static void ensureExistsInWorkspace(final IFile resource,
-			final InputStream contents) {
-		if (resource == null) {
-			return;
-		}
-		IWorkspaceRunnable body = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				if (resource.exists()) {
-					resource.setContents(contents, true, false, null);
-				} else {
-					ensureExistsInWorkspace(resource.getParent(), true);
-					resource.create(contents, true, null);
-				}
-			}
-		};
-		try {
-			ResourcesPlugin.getWorkspace().run(body, null);
-		} catch (CoreException e) {
-			// Test.EclipseWorkspaceTest.Error.FileCreationInWorkspace = Fail in
-			// creating file:{0} in the workspace resource info tree.
-			log
-					.error(
-							"Test.EclipseWorkspaceTest.Error.FileCreationInWorkspace", resource.getName(), e);//$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Create the given file in the workspace resource info tree.
-	 * @param resource 
-	 * @param contents 
-	 */
-	public static void ensureExistsInWorkspace(IFile resource, String contents) {
-		// FIXME: We'll need some way for handing file encoding.
-		ensureExistsInWorkspace(resource, new ByteArrayInputStream(contents
-				.getBytes()));
-	}
-
-	/**
-	 * Create the given resource in the workspace resource info tree.
-	 * @param resource 
-	 * @param local 
-	 */
-	public static void ensureExistsInWorkspace(final IResource resource,
-			final boolean local) {
-		IWorkspaceRunnable body = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				create(resource, local);
-			}
-		};
-		try {
-			ResourcesPlugin.getWorkspace().run(body, null);
-		} catch (CoreException e) {
-			// Test.EclipseWorkspaceTest.Error.ResourceCreationInWorkspace =
-			// Fail in creating resource:{0} in the workspace resource info
-			// tree.
-			log
-					.error(
-							"Test.EclipseWorkspaceTest.Error.ResourceCreationInWorkspace", resource.getName(), e);//$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * crate the resource if the resource is not existed, create a new one.
-	 * 
-	 * @param resource -
-	 *            resource instance
-	 * @param local -
-	 *            a flag controlling whether or not the folder will be local
-	 *            after the creation
-	 * @throws CoreException
-	 */
-	protected static void create(final IResource resource, boolean local)
-			throws CoreException {
-		if (resource == null || resource.exists()) {
-			return;
-		}
-		if (!resource.getParent().exists()) {
-			create(resource.getParent(), local);
-		}
-		switch (resource.getType()) {
-		case IResource.FILE:
-			((IFile) resource).create(local ? new ByteArrayInputStream(
-					new byte[0]) : null, true, getMonitor());
-			break;
-		case IResource.FOLDER:
-			((IFolder) resource).create(true, local, getMonitor());
-			break;
-		case IResource.PROJECT:
-			((IProject) resource).create(getMonitor());
-			((IProject) resource).open(getMonitor());
-			break;
-		}
-	}
-
-	/**
-	 * create and return a NullProgressMonitor
-	 * 
-	 * @return - NullProgressMonitor
-	 */
-	public static IProgressMonitor getMonitor() {
-		return new NullProgressMonitor();
-	}
-
-	/**
-	 * Get the project reference for a given path
-	 * 
-	 * @param path -
-	 *            the path
-	 * @return IProject - the project reference
-	 */
-	public static IProject getProjectFor(IPath path) {
-		String[] segs = path.segments();
-		String projectPath = new String();
-		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
-				.getProjects();
-		IProject project = null;
-		for (int p = 0; p < projects.length; p++) {
-			if (projects[p].isOpen()) {
-				for (int s = 0; s < segs.length; s++) {
-					if (segs[s].equalsIgnoreCase(projects[p].getName())) {
-						// Once we have a match on the project name, then
-						// the remainder of the segments equals the project path
-						for (int s2 = s + 1; s2 < segs.length; s2++) {
-							projectPath = projectPath
-									+ IFileFolderConstants.PATH_SEPARATOR
-									+ segs[s2];
-						}
-						project = projects[p];
-						break;
-					}
-				}
-			}
-		}
-		if (project == null) {
-			return null;
-		}
-
-		// TODO: still don't understand why this refreshLocal is necessary
-		// for now, going to only allow it if this method is called 
-		// when the tree isn't locked.  This shouldn't cause a regression, since
-		// when the call fails currently things keep on going due to the catch
-		if (!project.getWorkspace().isTreeLocked())
-		{
-    		try {
-    			project.refreshLocal(IResource.DEPTH_INFINITE, null);
-    		} catch (CoreException e) {
-                // TODO C.B.:pushing this down to a warning because it creates really
-                // spurious output.  Don't know why we are calling refreshLocal at all.
-                JSFUICommonPlugin.getLogger(WorkspaceUtil.class).info("Error.RefreshingLocal", e); //$NON-NLS-1$
-    		}
-		}
-		
-		IResource res = project.findMember(new Path(projectPath));
-		if ((res != null) && (res.exists())) {
-			return project;
-		}
-		return null;
-	}
-
-	/**
-	 * Get the project reference for a given file
-	 * 
-	 * @param file -
-	 *            the IFile file reference
-	 * @return IProject - the project reference
-	 */
-	public static IProject getProjectFor(IFile file) {
-		IPath testPath = new Path(file.getFullPath().toOSString());
-		return getProjectFor(testPath);
-	}
-
-	/**
-	 * Get the project reference for a given file
-	 * 
-	 * @param file -
-	 *            the File file reference
-	 * @return IProject - the project reference
-	 */
-	public static IProject getProjectFor(File file) {
-		IPath testPath = new Path(file.getAbsolutePath());
-		return getProjectFor(testPath);
-	}
-
-	/**
-	 * Get the project-relative resource reference for a given path
-	 * 
-	 * @param path -
-	 *            the path
-	 * @return IResource - the project-relative resource
-	 */
-	public static IResource getProjectRelativeResource(IPath path) {
-		String[] segs = path.segments();
-		String projectPath = new String();
-		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot()
-				.getProjects();
-		IProject project = null;
-		for (int p = 0; p < projects.length; p++) {
-			if (projects[p].isOpen()) {
-				for (int s = 0; s < segs.length; s++) {
-					if (segs[s].equalsIgnoreCase(projects[p].getName())) {
-						// Once we have a match on the project name, then
-						// the remainder of the segments equals the project path
-						for (int s2 = s + 1; s2 < segs.length; s2++) {
-							projectPath = projectPath
-									+ IFileFolderConstants.PATH_SEPARATOR
-									+ segs[s2];
-						}
-						project = projects[p];
-						break;
-					}
-				}
-			}
-		}
-		if (project == null) {
-			return null;
-		}
-
-		return project.getFile(projectPath);
-	}
-
-	/**
-	 * Get the project-relative resource reference for a given file
-	 * 
-	 * @param file -
-	 *            the File file reference
-	 * @return IResource - the project-relative resource
-	 */
-	public static IResource getProjectRelativeResource(File file) {
-		IPath testPath = new Path(file.getAbsolutePath());
-		return getProjectRelativeResource(testPath);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.classpath b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.cvsignore
deleted file mode 100644
index 40e79ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-javaCompiler...args
-@dot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.project b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.project
deleted file mode 100644
index ca987a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.facesconfig.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index c9896cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:03:23 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9d11d52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Mon Jun 30 15:56:09 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index cd8bbb3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:55:44 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.wst.validation.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.wst.validation.prefs
deleted file mode 100644
index 97e2fd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/.settings/org.eclipse.wst.validation.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Tue Apr 25 16:26:29 CST 2006
-DELEGATES_PREFERENCE=delegateValidatorListorg.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator\=org.eclipse.wst.wsdl.validation.internal.eclipse.Validator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator\=org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator;
-USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.jst.jsp.core.internal.validation.JSPELValidator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.jst.jsp.core.internal.validation.JSPDirectiveValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;
-USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.jst.jsp.core.internal.validation.JSPELValidator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.jst.jsp.core.internal.validation.JSPJavaValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.jst.jsp.core.internal.validation.JSPDirectiveValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;
-USER_PREFERENCE=overrideGlobalPreferencesfalse
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 1868385..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,57 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.facesconfig.ui;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.help;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.2.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.3.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.jst.jsf.facesconfig;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.wst.common.project.facet.core;bundle-version="[1.2.0,2.0.0)",
- org.eclipse.emf.edit.ui;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.ui.views.properties.tabbed;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)"
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.jst.jsf.facesconfig.ui;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.dialog;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.page;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.page.detail;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.icons;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.layout;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.preference;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.provider;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.section;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.util;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.ui.wizard;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/about.html b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/build.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/build.properties
deleted file mode 100644
index e34e43f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               icons/,\
-               plugin.xml,\
-               plugin.properties,\
-               cheatsheets/,\
-               about.html
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/cheatsheets/facesconfigeditor.xml b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/cheatsheets/facesconfigeditor.xml
deleted file mode 100644
index aed958f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/cheatsheets/facesconfigeditor.xml
+++ /dev/null
@@ -1,276 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<cheatsheet title="Faces Configuration Editor">
-
-	<intro
-		href="/org.eclipse.platform.doc.user/reference/ref-cheatsheets.htm">
-		<description>
-			This cheat sheet will demonstrate how to edit a JSF
-			configuration file with Faces Config Editor.
-			<br />
-			<br />
-			To learn more about using cheat sheets, click the help
-			button in the top right corner (?).
-		</description>
-	</intro>
-
-	<!-- Item -->
-
-	<item title="Open the J2EE perspective"
-		href="/org.eclipse.jst.j2ee.doc.user/topics/cjpers.html"
-		dialog="false" skip="true">
-		<description>
-			To open the J2EE perspective, select
-			<b>Window-&gt;Open Perspective-&gt;Other...</b>
-			and choose
-			<b>J2EE</b>
-			.
-			<br />
-			<br />
-			Alternatively, click the following button to perform the
-			task.
-		</description>
-		<command
-			serialization="org.eclipse.ui.perspectives.showPerspective(org.eclipse.ui.perspectives.showPerspective.perspectiveId=org.eclipse.jst.j2ee.J2EEPerspective)" />
-	</item>
-
-	<!-- Item -->
-
-	<item title="Create the JSF web project"
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/create_jsf_app.html"
-		dialog="true" skip="false">
-		<description>
-			To create the JSF web application perform the following
-			steps
-		</description>
-		<subitem
-			label="Select &quot;File-&gt;New-&gt;Project...&quot; from the main menu and choose &quot;Dynamic Web Project&quot; from the resulting &quot;New Project&quot; dialog box"
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.jst.servlet.ui.project.facet.WebProjectWizard)" />
-		</subitem>
-		<subitem
-			label="Input &quot;JSFApplication&quot; into the &quot;Project Name&quot; text box"
-			skip="false" />
-		<subitem
-			label="Select &quot;JavaServer Faces v1.1 Project&quot; in the &quot;Configurations&quot; dropdown box"
-			skip="false" />
-		<subitem
-			label="Accept the rest of the default preloaded values on the &quot;Dynamic Web Project&quot; page and click &quot;Next&quot;"
-			skip="false" />
-		<subitem
-			label="Accept the rest of the default preloaded values on the &quot;Project Facets&quot; page and click &quot;Next&quot;"
-			skip="false" />
-		<subitem
-			label="Accept the rest of the default preloaded values on the &quot;Web Module&quot; page and click &quot;Next&quot;"
-			skip="false" />
-		<subitem
-			label="Specify JSF Facet Settings on the &quot;JSF Capabilities&quot; page and click &quot;Finish&quot;"
-			skip="false" />
-	</item>
-
-	<item title="Open the JSF configuration file"
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/use_facesconfig_editor.html"
-		dialog="true" skip="false">
-		<description>
-			To open the JSF configuration file, Expand the
-			WebContent/WEB-INF/ folder in the &quot;Project
-			Explorer&quot; view; Double click on the
-			&quot;faces-config.xml&quot; file to open it. Or right click
-			on it then select &quot;Open With&quot; -> &quot;FacesConfig
-			Editor&quot;
-		</description>
-		<subitem
-			label="Expand the /JSFApplication/WebContent/WEB-INF/ folder in the &quot;Project Explorer&quot; view; "
-			skip="true">
-		</subitem>
-		<subitem
-			label="Double click on the &quot;faces-config.xml&quot; file to open it.
-			Or right click on it then select &quot;Open With&quot; -> &quot;FacesConfig Editor&quot;"
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.navigate.openResource(filePath=JSFApplication/WebContent/WEB-INF/faces-config.xml)" />
-		</subitem>
-	</item>
-
-
-	<item href=" " title="Get an introduction on the FacesConfig Editor"
-		dialog="false" skip="true">
-		<description>
-			On the &quot;Introduction &quot; page, there are some
-			introductions about the FacesConfig Editor, and some links
-			to start work with it, or show user the tutorial and help
-			documentation.
-		</description>
-	</item>
-
-
-	<item href=" " title="Get an overview of the content" dialog="false"
-		skip="true">
-		<description>
-			On the &quot;Overview &quot; page, there are several tables
-			that list the main elements defined in the current faces
-			config file. By double-clicking on an element, user could be
-			guided to the corresponding page to edit it.
-		</description>
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/define_navigations.html"
-		title="Create a Navigation Rule">
-		<description>
-			To create a navigation rule perform the following steps
-		</description>
-		<subitem
-			label="Use the JSP Page wizard to create a page called &quot; login.jsp &quot; in the Web Content folder of the new application. 
-			In the Select Templates page of the wizard, select the &quot;New JSP(html) &quot; template. Click Finish."
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.jst.jsp.ui.internal.wizard.NewJSPWizard)" />
-		</subitem>
-		<subitem
-			label="In the same way, create a page called &quot;welcome.jsp &quot; ."
-			skip="false">
-			<command
-				serialization="org.eclipse.ui.newWizard(newWizardId=org.eclipse.jst.jsp.ui.internal.wizard.NewJSPWizard)" />
-		</subitem>
-		<subitem
-			label="Select the &quot;Page&quot; control from the &quot;Palette&quot; and drop it on the &quot;Navigation&quot; tab. 
-			Choose the page in the resulting &quot;Select JSP File&quot; dialog. "
-			skip="false" />
-		<subitem
-			label="Connect the two pages. Click on the &quot;Link&quot; control in the &quot;Palette&quot;, select the &quot;login&quot; page and draw a line to the &quot;welcome&quot; page. 
-			Select the line in the &quot;Navigation&quot; tab and in the property view, set the value of the &quot;from-outcome&quot; to &quot;login&quot; . "
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a navigation-rule element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/create_managedbean.html"
-		title="Create a Managed Bean">
-		<description>
-			To create a managed bean perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;ManagedBean&quot; page; click the &quot;New&quot; button, the new managed bean wizard pops up."
-			skip="false" />
-		<subitem
-			label="On the &quot;Java Class Selection&quot; page, choose &quot;Create a new Java class&quot;, then click &quot;Next&quot;."
-			skip="false" />
-		<subitem
-			label="On the &quot;Java Class&quot; page, input &quot;com.tutorial&quot; into the &quot;Package&quot; field and input &quot;LoginBean&quot; into the &quot;Name&quot; field, 
-			then click &quot;Next&quot; to the next page."
-			skip="false" />
-		<subitem
-			label="On the &quot;Managed Bean Configuration&quot; page, accept the default values and click &quot;Finish&quot; to finish this wizard."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a managed-bean element created."
-			skip="true" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_component.html"
-		title="Create a Component">
-		<description>
-			To create a component perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;Components&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty component element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this component, for example &quot;Component Type&quot;, &quot;Component Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a component element created."
-			skip="false" />
-	</item>
-
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_converter.html"
-		title="Create a Converter">
-		<description>
-			To create a converter perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;Converters&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty converter element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this converter, for example &quot;Converter ID&quot;, &quot;Converter Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a converter element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_renderkit.html"
-		title="Create a Render Kit">
-		<description>
-			To create a render-kit perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;RenderKits&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty render-kit element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this converter, for example &quot;Renderkit ID&quot;, &quot;Renderkit Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a render-kit element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/facesconfig_ui/add_validator.html"
-		title="Create a Validator">
-		<description>
-			To create a validator perform the following steps
-		</description>
-		<subitem
-			label="Switch to the &quot;Component&quot; page; expand the &quot;Validators&quot; section; "
-			skip="false" />
-		<subitem
-			label="Click the &quot;New&quot; button, a new empty validator element is created."
-			skip="false" />
-		<subitem
-			label="On the right part, fill in the essential fields for this converter, for example &quot;Validator ID&quot;, &quot;Validator Class&quot;."
-			skip="false" />
-		<subitem
-			label="Swith to the &quot;Source&quot; page, will find that there is a validator element created."
-			skip="false" />
-	</item>
-
-	<item
-		href="/org.eclipse.jst.jsf.doc.user/html/tasks/use_facesconfig_editor.html"
-		title="Editing other elements on the Others Page">
-		<description>
-			On the &quot;Others&quot; page, there are several sections
-			for editing the elements such as
-			&quot;action-listener&quot;, &quot;locale-config&quot;, and
-			so on.
-		</description>
-	</item>
-
-	<item title="Source Page">
-		<description>
-		   The &quot;Source&quot; page is a embeded XML editor, user can edit the xml source of faces config directly here.
-		</description>
-	</item>
-
-	<item title="Completion">
-		<description>
-			Congratulations, you should now be able to use this editor fluently.
-		</description>
-	</item>
-</cheatsheet>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_GotoEditor.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_GotoEditor.gif
deleted file mode 100644
index 0e5bcf6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_GotoEditor.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Introduction.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Introduction.gif
deleted file mode 100644
index 44cd044..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Introduction.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Tutorial.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Tutorial.gif
deleted file mode 100644
index ad8e5b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/FacesConfig_Tutorial.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope.gif
deleted file mode 100644
index d49078b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Application.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Application.gif
deleted file mode 100644
index 591ceb2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Application.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_None.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_None.gif
deleted file mode 100644
index 0a96aaa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_None.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Request.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Request.gif
deleted file mode 100644
index e875d01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Request.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Session.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Session.gif
deleted file mode 100644
index cbe011b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/Scope_Session.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_ManagedBean.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_ManagedBean.gif
deleted file mode 100644
index 6cdef7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_ManagedBean.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Pageflow16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Pageflow16.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Pageflow16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Plugin.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Plugin.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/FacesConfig_Plugin.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Action16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Action16.gif
deleted file mode 100644
index c241f5f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Action16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_BooleanValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_BooleanValue.gif
deleted file mode 100644
index 5002791..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_BooleanValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_GenericValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_GenericValue.gif
deleted file mode 100644
index 7ef81e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_GenericValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_IntegralValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_IntegralValue.gif
deleted file mode 100644
index fea95ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_IntegralValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link.gif
deleted file mode 100644
index 6c10cea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link24.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link24.gif
deleted file mode 100644
index 8004b19..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Link24.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline.gif
deleted file mode 100644
index f302d8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline_Overview.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline_Overview.gif
deleted file mode 100644
index 852dc81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Outline_Overview.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page.gif
deleted file mode 100644
index 97cafa9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page16.gif
deleted file mode 100644
index 5b56ee3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page24.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page24.gif
deleted file mode 100644
index 2fc426f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Page24.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Quickfix_Error.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Quickfix_Error.gif
deleted file mode 100644
index 1f0002b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_Quickfix_Error.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_TextValue.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_TextValue.gif
deleted file mode 100644
index d483f48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/facesconfig/Pageflow_TextValue.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/form_banner.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/form_banner.gif
deleted file mode 100644
index aebc0b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/form_banner.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/help.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/help.gif
deleted file mode 100644
index 9d70301..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/help.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/overview_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/overview_obj.gif
deleted file mode 100644
index 03f656f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/icons/overview_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.properties
deleted file mode 100644
index f8d99a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.properties
+++ /dev/null
@@ -1,60 +0,0 @@
-############################################################################
-# Copyright (c) 2004, 2005 Sybase, Inc. and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     Sybase, Inc. - initial API and implementation
-############################################################################
-plugin.name=JavaServer Faces Tools - FacesConfig Editor
-plugin.provider=Eclipse.org
-
-# Editors
-facesConfigEditor=Faces Config Editor
-facesConfigEditorIcon=icons/facesconfig/FacesConfig_Plugin.gif
-
-# Introduction
-pageflow.editor.intro.name = Introduction
-pageflow.editor.intro.description =
-pageflow.editor.intro.section.heading = The Faces Configuration Editor
-pageflow.editor.intro.section.description = The faces configuration editor helps you to complete the JSF web application development process by allowing you to edit faces configuration. Use the pages in this editor to define and edit page navigations, managed beans, component, converter, validator, renderkit and other element configurations.
-pageflow.editor.intro.cheatsheets.link = Tutorial
-pageflow.editor.intro.cheatsheets.text = Launch the cheat sheet for guidance in working with the editor.
-pageflow.editor.intro.help.link = Help
-pageflow.editor.intro.help.text = Launch the help system and review topics about working with faces configuration descriptor.
-pageflow.editor.intro.start.link = Start
-pageflow.editor.intro.start.text = Start working with the editor by selecting PageFlow and defining page navigations.
-
-#overview Section
-pageflow.editor.overview.name = Editor Information
-pageflow.editor.overview.description = This page summaries the editors information.
-pageflow.editor.overview.pageflow.link = PageFlow Editor
-pageflow.editor.overview.pageflow.text = Editor to create or modify Navigation Rules.
-
-pageflow.editor.intro.overview.mbean.text = Editor to create or modify Managed Beans.
-pageflow.editor.overview.mbean.link = ManagedBeans Editor
-pageflow.editor.intro.overview.components.text = Editor to create or modify component elements.
-pageflow.editor.overview.components.link = Components Editor
-pageflow.editor.intro.overview.others.text = Editor to create or modify other elements.
-pageflow.editor.overview.others.link = Others Editor
-pageflow.editor.intro.overview.source.text = Text Editor source.
-pageflow.editor.overview.source.link = Source Editor
-
-contentType.defaultFacesConfig.name = Default FacesConfig File
-contentType.webdotxmlfile.name = Web Application Description File
-
-#property tab's name
-propertyTab.general=Attributes
-propertyTab.attribute=Quick Edit
-
-# Cheatsheets
-cheatsheet.pagefloweditor.name = Pageflow Editor Cheat Sheet
-cheatsheet.pagefloweditor.description = Cheat Sheet for using the Pageflow Editor
-cheatsheet.jsf.title=JSF Development
-cheatsheet.jsf.facesconfig.title=Faces Configuration Editor
-
-#preference page
-preferencepage.jsffacesconfigui.name=FacesConfig Editor
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml
deleted file mode 100644
index be99224..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.xml
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-  <extension
-        point="org.eclipse.ui.preferencePages">
-     <page
-           category="org.eclipse.jst.jsf.ui.JSFRootPage"
-           class="org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences"
-           id="org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences"
-           name="%preferencepage.jsffacesconfigui.name"/>
-  </extension>
-	<extension point="org.eclipse.ui.editors">
-			
-		<editor
-	        class="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"
-	        contributorClass="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigActionBarContributor"
-	        default="false"        
-	        icon="icons/facesconfig/FacesConfig_Plugin.gif"
-	        id="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"
-	        name="%facesConfigEditor">
-			<contentTypeBinding
-					contentTypeId="org.eclipse.jst.jsf.facesconfig.facesConfigFile" />
-		</editor>
-		</extension>
-	
- 	<!-- ********** Introduction Page of PageFlow editor************** -->
-	<extension id="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"
-		name="%pageflow.editor.intro.name"
-		point="org.eclipse.jst.jsf.common.ui.introductionPage">
-		<introductionpage name="%pageflow.editor.intro.name"
-			description="%pageflow.editor.intro.description">
-			<introductionelement icon="icons/FacesConfig_Introduction.gif"
-				heading="%pageflow.editor.intro.section.heading"
-				text="%pageflow.editor.intro.section.description"/>
-			<introductionelement
-				actionparameters="org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor"
-				icon="icons/FacesConfig_GotoEditor.gif"
-				hyperlinkaction="org.eclipse.jst.jsf.common.ui.internal.actions.OpenPageAction"
-				text="%pageflow.editor.intro.start.text"
-				hyperlink="%pageflow.editor.intro.start.link"/>
-			<introductionelement
-				actionparameters="FacesConfigEditor.CheatSheet"
-				icon="icons/FacesConfig_Tutorial.gif"
-				hyperlinkaction="org.eclipse.jst.jsf.common.ui.internal.actions.LoadCheatSheetAction"
-				text="%pageflow.editor.intro.cheatsheets.text"
-				hyperlink="%pageflow.editor.intro.cheatsheets.link"/>
-			<introductionelement actionparameters="org.eclipse.jst.jsf.facesconfig.ui.use_facesconfig_editor"
-				icon="icons/overview_obj.gif"
-				hyperlinkaction="org.eclipse.jst.jsf.common.ui.internal.actions.LoadHelpAction"
-				text="%pageflow.editor.intro.help.text"
-				hyperlink="%pageflow.editor.intro.help.link"/>
-		</introductionpage>		
-	</extension>
-	<!-- ********** End Introduction Page ************** -->
-		<!-- ************* properties view ************** -->
-	<extension point="org.eclipse.ui.views.properties.tabbed.propertyTabs"> 
-		<propertyTabs 
-			contributorId="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor">
-			<propertyTab label="%propertyTab.attribute" category="attribute"
-				id="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.attribute"/>
-			<propertyTab label="%propertyTab.general" category="general"
-				id="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.general"/>
-		</propertyTabs>
-	</extension>
-		<extension point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-		<propertyContributor
-			sectionDescriptorProvider="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowSectionDescriptorProvider"
-			contributorId="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"
-			labelProvider="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowSectionLabelProvider">
-			<propertyCategory category="attribute" />
-			<propertyCategory category="general"/>
-		</propertyContributor>
-	</extension>
-  <extension
-        point="org.eclipse.ui.cheatsheets.cheatSheetContent">
-     <cheatsheet
-           category="org.eclipse.jst.jsf"
-           composite="false"
-           contentFile="$nl$/cheatsheets/facesconfigeditor.xml"
-           id="FacesConfigEditor.CheatSheet"
-           name="%cheatsheet.jsf.facesconfig.title"/>
-     <category
-           id="org.eclipse.jst.jsf"
-           name="%cheatsheet.jsf.title">
-     </category>
-  </extension>
-  <!--<extension
-        point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-     <propertyContributor
-           contributorId="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"
-           labelProvider="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowSectionLabelProvider">
-        <propertyCategory category="attribute"/>
-        <propertyCategory category="general"/>
-     </propertyContributor>
-  </extension>
-  <extension
-        point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-     <propertyTabs contributorId="org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor">
-        <propertyTab
-              category="attribute"
-              id="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.attribute"
-              label="%propertyTab.attribute"/>
-        <propertyTab
-              category="general"
-              id="org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.general"
-              label="%propertyTab.general"/>
-     </propertyTabs>
-  </extension>-->
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.java
deleted file mode 100644
index 274c5d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.java
+++ /dev/null
@@ -1,1567 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Provides localized messages from EditorMessages.properties.
- */
-public final class EditorMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.EditorMessages"; //$NON-NLS-1$
-
-	private EditorMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, EditorMessages.class);
-	}
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AddEditManagedPropertyDialog_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AddEditManagedPropertyDialog_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AddEditMapEntryDialog_NullValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_ErrorHandlingUndoConflicts_DialogMessage;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-    public static String FacesConfigEditor_ErrorHandlingUndoConflicts_DialogTitle;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-    public static String FacesConfigEditor_WaitForLoad_EditorTabTitle;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-    public static String UI_Button_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String UI_Button_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String UI_Button_Remove;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String UI_Button_Add_more;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String UI_Button_Edit_more;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String Remove_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String Remove_Msg;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FindType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FindType_Filter;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FindType_Error_CannotFindType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Introduction_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Overview_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Pageflow_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_ManagedBeans_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Components_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Others_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Source_TabName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String editor_pageflow_page_intro_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String editor_pageflow_page_intro_title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String editor_pageflow_page_intro_help_HelpContextID;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String editor_pageflow_page_intro_help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanMasterSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanMasterSection_Description;
-
-//	public static String ManagedBeanMasterSection_HelpContextID;
-//
-//	public static String ManagedBeanMasterSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanGeneralSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanGeneralSection_Desc;
-
-//	public static String ManagedBeanGeneralSection_HelpContextID;
-//
-//	public static String ManagedBeanGeneralSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanGeneralSection_ManagedBeanName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanGeneralSection_ManagedBeanClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanGeneralSection_ManagedBeanScope;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_Description;
-
-//	public static String InitializationSection_HelpContextID;
-//
-//	public static String InitializationSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Title_NewPropertyEntry;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Title_ExistingPropertyEntry;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_PropertyName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_PropertyClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_PropertyClass_Browse;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_ValueType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanProeprtyEditPage_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Value;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditWizard_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanProeprtyEditPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Value_Change;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_FindType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_FindType_Filter;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ClassType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ClassType_General;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ClassType_Map;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ClassType_List;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_PropertyTable_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_PropertyTable_Class;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_PropertyTable_Value;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_MapType_KeyClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_MapType_ValueClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_MapTable_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_MapTable_Key;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_MapTable_Value;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ListType_ValueClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ListTable_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String InitializationSection_ListTable_Value;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ListEntriesEditPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ListEntriesWizard_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ListEntriesEditPage_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_page_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_page_id;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_page_title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_PageflowOverview_summary;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_EditorSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_EditorSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_EditorSection_noplugin;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_EditorSection_nooverview;
-
-//	public static String OverviewPage_EditorSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_EditorSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_GeneralSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_GeneralSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_GeneralSection_label_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_GeneralSection_label_version;
-
-//	public static String OverviewPage_GeneralSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_GeneralSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_table_col1;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_table_col2;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_table_col3;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_NavigationSection_pageflowPageID;
-
-//	public static String OverviewPage_NavigationSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_NavigationSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_table_namecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_table_scopecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_table_classcol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ManagedBeanSection_managedbeanPageID;
-
-//	public static String OverviewPage_ManagedBeanSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_ManagedBeanSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ComponentsSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ComponentsSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ComponentsSection_table_typecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ComponentsSection_table_namecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_ComponentsSection_componentsPageID;
-
-//	public static String OverviewPage_ComponentsSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_ComponentsSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_table_typecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_table_namecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_table_valuecol;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OverviewPage_OthersSection_othersPageID;
-
-//	public static String OverviewPage_OthersSection_Help_HelpContextID;
-//
-//	public static String OverviewPage_OthersSection_Help_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyGroup_error_EmptyName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ManagedBeanPropertyGroup_error_EmptyClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntriesEditGroup_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntriesEditPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntriesWizard_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditGroup_Key;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditGroup_error_EmptyKey;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditGroup_error_DuplicateKey;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditWizard_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntriesEditPage_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MapEntryEditPage_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValueEditDialog_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValueEditWizard_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValueEditPage_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValueEditGroup_Value;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValueEditPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentsPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentMasterSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentMasterSection_Description;
-
-//	public static String ComponentMasterSection_HelpContextID;
-//
-//	public static String ComponentMasterSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Description;
-
-//	public static String ComponentGeneralSection_HelpContextID;
-//
-//	public static String ComponentGeneralSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Label_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Label_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Label_ComponentType;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ComponentGeneralSection_Label_ComponentClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitMasterSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitMasterSection_Description;
-
-//	public static String RenderKitMasterSection_HelpContextID;
-//
-//	public static String RenderKitMasterSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Description;
-
-//	public static String RenderKitGeneralSection_HelpContextID;
-//
-//	public static String RenderKitGeneralSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Label_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Label_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Label_RenderKitID;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitGeneralSection_Label_RenderKitClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Description;
-
-//	public static String RendererSection_HelpContextID;
-//
-//	public static String RendererSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Table_NameColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Table_ComponentFamilyColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Table_TypeColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Table_ClassColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Title_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Title_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Tab_General;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_ComponentFamilyValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_TypeValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_RendererClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Error_ComponentFamilyEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Error_RendererTypeEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_Error_RendererClassEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_SelectComponentFamilyDialog_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_ComponentFamilyCaption;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RendererSection_Dialog_ComponentFamilyLabel;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterMasterSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterMasterSection_Description;
-
-//	public static String ConverterMasterSection_HelpContextID;
-//
-//	public static String ConverterMasterSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Description;
-
-//	public static String ConverterGeneralSection_HelpContextID;
-//
-//	public static String ConverterGeneralSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Label_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Label_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Label_ConverterID;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Label_ConverterForClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ConverterGeneralSection_Label_ConverterClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorMasterSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorMasterSection_Description;
-
-//	public static String ValidatorMasterSection_HelpContextID;
-//
-//	public static String ValidatorMasterSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Description;
-
-//	public static String ValidatorGeneralSection_HelpContextID;
-//
-//	public static String ValidatorGeneralSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Label_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Label_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Label_ValidatorID;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ValidatorGeneralSection_Label_ValidatorClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Description;
-
-//	public static String AttributeSection_HelpContextID;
-//
-//	public static String AttributeSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Table_NameColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Table_ClassColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Table_DefaultValueColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Table_SuggestedValueColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_Title_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_Title_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_Tab_General;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_AttributeName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_AttributeClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_DefaultValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_SuggestedValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_Error_NameEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String AttributeSection_Dialog_Error_ClassEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Description;
-
-//	public static String PropertySection_HelpContextID;
-//
-//	public static String PropertySection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Table_NameColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Table_ClassColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Table_DefaultValueColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Table_SuggestedValueColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_Title_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_Title_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_Tab_General;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_PropertyName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_PropertyClass;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_DefaultValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_SuggestedValue;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_Error_NameEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertySection_Dialog_Error_ClassEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Description;
-
-//	public static String FacetSection_HelpContextID;
-//
-//	public static String FacetsSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Table_DisplayNameColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Table_FacetNameColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Table_DescriptionColumn;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_Title_Add;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_Title_Edit;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_Tab_General;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_FacetName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_DisplayName;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacetSection_Dialog_Error_NameEmpty;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String OthersPage_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ActionListenerSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ActionListenerSection_Description;
-
-//	public static String ActionListenerSection_HelpContextID;
-//
-//	public static String ActionListenerSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MessageBundleSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MessageBundleSection_Description;
-
-//	public static String MessageBundleSection_HelpContextID;
-//
-//	public static String MessageBundleSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MessageBundleSection_Dialog_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MessageBundleSection_Dialog_Message_SelectPropertyFile;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MessageBundleSection_Dialog_Message_AlreadyExists;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Description;
-
-//	public static String LocaleConfigSection_HelpContextID;
-//
-//	public static String LocaleConfigSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_WindowTitle;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_Page_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_Page_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_Page_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_Page_LabelText;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LocaleConfigSection_Wizard_Page_AlreadyExistsError;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Description;
-
-//	public static String DefaultRenderKitIDSection_HelpContextID;
-//
-//	public static String DefaultRenderKitIDSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_WindowTitle;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_Page_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_Page_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_Page_Description;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_Page_LabelText;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String DefaultRenderKitIDSection_Wizard_Page_AlreadyExistsError;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String NavigationHandlerSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String NavigationHandlerSection_Description;
-
-//	public static String NavigationHandlerSection_HelpContextID;
-//
-//	public static String NavigationHandlerSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ViewHandlerSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ViewHandlerSection_Description;
-
-//	public static String ViewHandlerSection_HelpContextID;
-//
-//	public static String ViewHandlerSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String StateManagerSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String StateManagerSection_Description;
-
-//	public static String StateManagerSection_HelpContextID;
-//
-//	public static String StateManagerSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertyResolverSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PropertyResolverSection_Description;
-
-//	public static String PropertyResolverSection_HelpContextID;
-//
-//	public static String PropertyResolverSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String VariableResolverSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String VariableResolverSection_Description;
-
-//	public static String VariableResolverSection_HelpContextID;
-//
-//	public static String VariableResolverSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ApplicationFactorySection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ApplicationFactorySection_Description;
-
-//	public static String ApplicationFactorySection_HelpContextID;
-//
-//	public static String ApplicationFactorySection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesContextFactorySection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesContextFactorySection_Description;
-
-//	public static String FacesContextFactorySection_HelpContextID;
-//
-//	public static String FacesContextFactorySection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LifecycleFactorySection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String LifecycleFactorySection_Description;
-
-//	public static String LifecycleFactorySection_HelpContextID;
-//
-//	public static String LifecycleFactorySection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitFactorySection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String RenderKitFactorySection_Description;
-
-//	public static String RenderKitFactorySection_HelpContextID;
-//
-//	public static String RenderKitFactorySection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PhaseListenerSection_Name;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String PhaseListenerSection_Description;
-
-//	public static String PhaseListenerSection_HelpContextID;
-//
-//	public static String PhaseListenerSection_HelpToolTip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String MultiPageEditorOutlinePage_noOutline;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Error_OpenModel_Title;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_Error_OpenModel;
-	
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String FacesConfigEditor_WaitForLoadPage_Title;
-	
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String ModelLoader_LoadingModelJobName;
-
-	/**
-	 * Align bottom action label.
-	 */
-	public static String AlignmentAction_AlignBottomAction_Label;
-
-	/**
-	 * Align bottom action tooltip.
-	 */
-	public static String AlignmentAction_AlignBottomAction_Tooltip;
-
-	/**
-	 * Align center action label.
-	 */
-	public static String AlignmentAction_AlignCenterAction_Label;
-
-	/**
-	 * Align center action tooltip.
-	 */
-	public static String AlignmentAction_AlignCenterAction_Tooltip;
-
-	/**
-	 * Align left action label.
-	 */
-	public static String AlignmentAction_AlignLeftAction_Label;
-
-	/**
-	 * Align left action tooltip.
-	 */
-	public static String AlignmentAction_AlignLeftAction_Tooltip;
-
-	/**
-	 * Align middle action label.
-	 */
-	public static String AlignmentAction_AlignMiddleAction_Label;
-
-	/**
-	 * Align middle action tooltip.
-	 */
-	public static String AlignmentAction_AlignMiddleAction_Tooltip;
-
-	/**
-	 * Align right action label.
-	 */
-	public static String AlignmentAction_AlignRightAction_Label;
-
-	/**
-	 * Align right action tooltip.
-	 */
-	public static String AlignmentAction_AlignRightAction_Tooltip;
-
-	/**
-	 * Align top action label.
-	 */
-	public static String AlignmentAction_AlignTopAction_Label;
-
-	/**
-	 * Align top action tooltip.
-	 */
-	public static String AlignmentAction_AlignTopAction_Tooltip;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String EditListEntriesDialog_EditingListEntries;
-
-	/**
-	 * see EditorMessages.properties
-	 */
-	public static String EditMapEntriesDialog_EditingMapEntries;
-
-    /**
-     * User can turn off intro page in faces-config editor
-     */
-    public static String editor_pageflow_page_intro_NoIntroPage;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.properties
deleted file mode 100644
index 8891323..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.properties
+++ /dev/null
@@ -1,453 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Common UI resources
-####################################################
-UI_Button_Add = Add
-UI_Button_Edit = Edit
-UI_Button_Remove = Remove
-UI_Button_Add_more = Add...
-UI_Button_Edit_more = Edit...
-
-##Message for remove confirm alerter.
-Remove_Title = Confirm Remove
-Remove_Msg = Are you sure you want to remove {0}?
-
-FindType = Find Type
-FindType_Filter = Choose a type (?=any character, *=any string):
-FindType_Error_CannotFindType = Can not find java class
-
-FacesConfigEditor_Error_OpenModel_Title = Error
-FacesConfigEditor_ErrorHandlingUndoConflicts_DialogTitle=File Conflict
-FacesConfigEditor_ErrorHandlingUndoConflicts_DialogMessage=There are unsaved changes that conflict with changes made outside the editor.  Do you wish to discard this editor's changes?
-FacesConfigEditor_Error_OpenModel = Cannot open the faces-config file, this project is not a web project.
-####################################################
-# Tab's name for multipageeditor of faces-config 
-####################################################
-FacesConfigEditor_Introduction_TabName = Introduction
-FacesConfigEditor_Overview_TabName = Overview
-FacesConfigEditor_Pageflow_TabName = Navigation Rule
-FacesConfigEditor_ManagedBeans_TabName = ManagedBean
-FacesConfigEditor_Components_TabName = Component
-FacesConfigEditor_Others_TabName = Others
-FacesConfigEditor_Source_TabName = Source
-
-
-####################################################
-#Introduction page 
-####################################################
-editor_pageflow_page_intro_name = Introduction
-editor_pageflow_page_intro_title = Faces Configuration Introduction
-editor_pageflow_page_intro_help_HelpContextID = com.sybase.stf.jmt.faces_config_editor_introduction
-editor_pageflow_page_intro_help_HelpToolTip = Introduction
-editor_pageflow_page_intro_NoIntroPage=Don't show this page next time. 
-
-####################################################
-#ManagedBean page 
-####################################################
-ManagedBeanPage_Title = Faces Configuration Managed Bean
-
-##managed bean section
-ManagedBeanMasterSection_Name = Managed Bean Elements
-ManagedBeanMasterSection_Description = The following managed beans are defined
-
-
-##managed bean general section
-ManagedBeanGeneralSection_Name = Managed Bean
-
-ManagedBeanGeneralSection_Desc = This section describes general configuration of this managed bean
-
-ManagedBeanGeneralSection_ManagedBeanName = Managed Bean name*:
-ManagedBeanGeneralSection_ManagedBeanClass = Managed Bean class*:
-ManagedBeanGeneralSection_ManagedBeanScope = Managed Bean scope*:
-
-##managed bean initialization section
-InitializationSection_Name = Initialization
-InitializationSection_Description = You can initialize the managed bean's properties or itself if it is a subclass of java.util.Map or java.util.List
-
-ManagedBeanPropertyEditDialog_Title_NewPropertyEntry = Create New Property
-ManagedBeanPropertyEditDialog_Title_ExistingPropertyEntry = Edit Existing Property
-ManagedBeanPropertyEditDialog_PropertyName = Property name*:
-ManagedBeanPropertyEditDialog_PropertyClass = Property class*:
-ManagedBeanPropertyEditDialog_PropertyClass_Browse = Browse...
-ManagedBeanPropertyEditDialog_ValueType = Value type:
-ManagedBeanProeprtyEditPage_Description = Editing managed bean property.
-ManagedBeanPropertyEditDialog_Value = Value:
-ManagedBeanPropertyEditWizard_Title = Editing Managed Bean Property
-ManagedBeanProeprtyEditPage_Title = Edit Property
-ManagedBeanPropertyEditDialog_Value_Change = Edit...
-
-ManagedBeanPropertyEditDialog_FindType = Find Type
-ManagedBeanPropertyEditDialog_FindType_Filter = Choose a type (?=any character, *=any string):
-
-InitializationSection_ClassType = Managed Bean class type:
-
-InitializationSection_ClassType_General = General class
-InitializationSection_ClassType_Map = Map
-InitializationSection_ClassType_List = List
-
-InitializationSection_PropertyTable_Name = Name
-InitializationSection_PropertyTable_Class = Class
-InitializationSection_PropertyTable_Value = Value
-
-InitializationSection_MapType_KeyClass = Key class:
-InitializationSection_MapType_ValueClass = Value class:
-
-InitializationSection_MapTable_Title = Values:
-InitializationSection_MapTable_Key = Key
-
-InitializationSection_MapTable_Value = Value
-
-InitializationSection_ListType_ValueClass = Value class:
-InitializationSection_ListTable_Title = Values:
-InitializationSection_ListTable_Value = Value
-
-
-##ListEntriesEditGroup
-ListEntriesEditPage_Title = Editing list-entries
-ListEntriesWizard_Title = Editing list-entries
-ListEntriesEditPage_Description = Editing list-entries of managed bean property.
-
-
-
-####################################################
-#Overview Page
-####################################################
-#OverviewPage.help = Help
-OverviewPage_page_name = Overview
-OverviewPage_page_id = PageflowOverview
-OverviewPage_page_title = PageFlow Overview
-OverviewPage_PageflowOverview_summary = Faces Configuration Overview
-
-# editor section 
-OverviewPage_EditorSection_name = Editors Information
-OverviewPage_EditorSection_description = This section information about editors
-OverviewPage_EditorSection_noplugin = No plugin.xml file
-OverviewPage_EditorSection_nooverview = No Overview section found in plugin.xml file
-
-# general section
-OverviewPage_GeneralSection_name = General information of faces-config.xml
-OverviewPage_GeneralSection_description = This section describes general information
-OverviewPage_GeneralSection_label_name = Faces Config Name:
-OverviewPage_GeneralSection_label_version = Version:
-
-#navigation section
-OverviewPage_NavigationSection_name = Navigation Information
-OverviewPage_NavigationSection_description = This section describes the navigation rules
-OverviewPage_NavigationSection_table_col1 = From View ID
-OverviewPage_NavigationSection_table_col2 = From Outcome
-OverviewPage_NavigationSection_table_col3 = To View ID
-OverviewPage_NavigationSection_pageflowPageID = org.eclipse.wtp.jsf.facesconfig.editor.pageflow.PageflowEditor
-
-
-# managed bean section
-OverviewPage_ManagedBeanSection_name = ManagedBean Information
-OverviewPage_ManagedBeanSection_description = This section describes the managed beans
-OverviewPage_ManagedBeanSection_table_namecol = Name
-OverviewPage_ManagedBeanSection_table_scopecol = Scope
-OverviewPage_ManagedBeanSection_table_classcol = Class
-OverviewPage_ManagedBeanSection_managedbeanPageID = com.sybase.stf.jmt.editors.pageflow.managedbean.DataBindingPage
-
-#components section
-OverviewPage_ComponentsSection_name = Component Information
-OverviewPage_ComponentsSection_description = This section describes component, render-kit, converter and validator elements
-OverviewPage_ComponentsSection_table_typecol = Element Type
-OverviewPage_ComponentsSection_table_namecol = Element Name
-OverviewPage_ComponentsSection_componentsPageID = com.sybase.stf.jmt.editors.pageflow.components.ComponentsPage
-
-#other section
-OverviewPage_OthersSection_name = Others Information
-OverviewPage_OthersSection_description = This section describes application, factory and lifecycle elements
-OverviewPage_OthersSection_table_typecol = Element Type
-OverviewPage_OthersSection_table_namecol = Element Name
-OverviewPage_OthersSection_table_valuecol = Element Value
-OverviewPage_OthersSection_othersPageID = com.sybase.stf.jmt.editors.pageflow.OthersPage
-
-ManagedBeanPropertyGroup_error_EmptyName = The property name should be selected.
-ManagedBeanPropertyGroup_error_EmptyClass = The property class should be selected or input.
-MapEntriesEditGroup_Edit = Edit...
-MapEntriesEditPage_Title = Editing map-entries
-MapEntriesWizard_Title = Editing map-entries
-MapEntryEditGroup_Key = Key*:
-MapEntryEditGroup_error_EmptyKey = The key is empty.
-MapEntryEditGroup_error_DuplicateKey = The key ''{0}'' is duplicated.
-
-
-MapEntryEditPage_Title = Edit map-entry
-MapEntryEditWizard_Title = Edit Map Entry
-MapEntriesEditPage_Description = Editing map-entries of managed bean property.
-MapEntryEditPage_Description = Editing map-entry of managed bean property.
-ValueEditDialog_Title = Edit Value
-ValueEditWizard_Title = Edit Value
-ValueEditPage_Description = Editing value of managed bean property.
-ValueEditGroup_Value = Value:
-ValueEditPage_Title = Edit Value
-
-####################################################
-#Components page 
-####################################################
-ComponentsPage_Title = Faces Configuration Components
-
-##Component Master Section
-ComponentMasterSection_Name = Components
-ComponentMasterSection_Description = The following components are defined:
-
-
-##Components General Section
-ComponentGeneralSection_Name = General
-ComponentGeneralSection_Description = This section describes the general information of this component.
-ComponentGeneralSection_Label_DisplayName = Display Name:
-ComponentGeneralSection_Label_Description = Description:
-ComponentGeneralSection_Label_ComponentType = Component Type*:
-ComponentGeneralSection_Label_ComponentClass = Component Class*:
-
-##RenderKit Master Section
-RenderKitMasterSection_Name = Render Kits
-RenderKitMasterSection_Description = The following render-kits are defined:
-
-
-##RenderKits General Section
-RenderKitGeneralSection_Name = General
-RenderKitGeneralSection_Description = This section describes the general information of this render-kit.
-RenderKitGeneralSection_Label_DisplayName = Display Name:
-RenderKitGeneralSection_Label_Description = Description:
-RenderKitGeneralSection_Label_RenderKitID = Renderkit ID:
-RenderKitGeneralSection_Label_RenderKitClass = Renderkit Class:
-
-##Renderer Section
-RendererSection_Name = Renderers
-RendererSection_Description = This section lists all the renderers of this render-kit.
-RendererSection_Table_NameColumn = Name
-RendererSection_Table_ComponentFamilyColumn = Component Family
-RendererSection_Table_TypeColumn = Type
-RendererSection_Table_ClassColumn = Class
-
-##Add/Edit Renderer Dialog
-RendererSection_Dialog_Title_Add = Add Renderer
-RendererSection_Dialog_Title_Edit = Edit Renderer
-RendererSection_Dialog_Tab_General = General
-RendererSection_Dialog_DisplayName = Display Name:
-RendererSection_Dialog_ComponentFamilyValue = Component Family*:
-RendererSection_Dialog_TypeValue = Renderer Type*:
-RendererSection_Dialog_RendererClass = Renderer Class*:
-RendererSection_Dialog_Error_ComponentFamilyEmpty = The component family is empty.
-RendererSection_Dialog_Error_RendererTypeEmpty = The renderer type is empty.
-RendererSection_Dialog_Error_RendererClassEmpty = The renderer class is empty.
-
-RendererSection_Dialog_SelectComponentFamilyDialog_Title = Select Component Family
-#RendererSection.Dialog.Page.SelectComponentFamilyDialogPage.Title = Select Component Family
-#RendererSection.Dialog.Page.SelectComponentFamilyDialogPage.Description = Enter or select a component family.
-#RendererSection.Dialog.Page.SelectComponentFamilyDialogPage.LabelText = Enter or select a component family:
-RendererSection_Dialog_ComponentFamilyCaption = Select Component Family
-RendererSection_Dialog_ComponentFamilyLabel = Enter or select a component family:
-##Converter Master Section
-ConverterMasterSection_Name = Converters
-ConverterMasterSection_Description = The following Converters are defined:
-
-
-##Converter General Section
-ConverterGeneralSection_Name = General
-ConverterGeneralSection_Description = This section describes the general information of this converter.
-ConverterGeneralSection_Label_DisplayName = Display Name:
-ConverterGeneralSection_Label_Description = Description:
-ConverterGeneralSection_Label_ConverterID = Converter ID:
-ConverterGeneralSection_Label_ConverterForClass = or Converter For Class:
-ConverterGeneralSection_Label_ConverterClass = Converter Class*:
-
-##Validator Section
-ValidatorMasterSection_Name = Validators
-ValidatorMasterSection_Description = The following Validators are defined:
-
-
-##Validator General Section
-ValidatorGeneralSection_Name = General
-ValidatorGeneralSection_Description = This section describes general information of this Validator
-ValidatorGeneralSection_Label_DisplayName = Display Name:
-ValidatorGeneralSection_Label_Description = Description:
-ValidatorGeneralSection_Label_ValidatorID = Validator ID*:
-ValidatorGeneralSection_Label_ValidatorClass = Validator Class*:
-
-##Attribute Section
-AttributeSection_Name = Attributes
-AttributeSection_Description = This section lists all the attributes.
-
-AttributeSection_Table_NameColumn = Name
-AttributeSection_Table_ClassColumn = Class
-AttributeSection_Table_DefaultValueColumn = Default Value
-AttributeSection_Table_SuggestedValueColumn = Suggested Value
-
-##Add/Edit Attribute Dialog
-AttributeSection_Dialog_Title_Add = Add Attribute
-AttributeSection_Dialog_Title_Edit = Edit Attribute
-AttributeSection_Dialog_Tab_General = General
-AttributeSection_Dialog_AttributeName = Attribute Name*:
-AttributeSection_Dialog_AttributeClass = Attribute Class*:
-AttributeSection_Dialog_DefaultValue = Default value:
-AttributeSection_Dialog_SuggestedValue = Suggested value:
-AttributeSection_Dialog_Error_NameEmpty = The attribute name is empty.
-AttributeSection_Dialog_Error_ClassEmpty = The attribute class is empty.
-
-##Property Section
-PropertySection_Name = Properties
-PropertySection_Description = This section lists all the properties.
-
-PropertySection_Table_NameColumn = Name
-PropertySection_Table_ClassColumn = Class
-PropertySection_Table_DefaultValueColumn = Default Value
-PropertySection_Table_SuggestedValueColumn = Suggested Value
-
-
-##Add/Edit Property Dialog
-PropertySection_Dialog_Title_Add = Add Property
-PropertySection_Dialog_Title_Edit = Edit Property
-PropertySection_Dialog_Tab_General = General
-PropertySection_Dialog_PropertyName = Property Name*:
-PropertySection_Dialog_PropertyClass = Property Class*:
-PropertySection_Dialog_DefaultValue = Default value:
-PropertySection_Dialog_SuggestedValue = Suggested value:
-PropertySection_Dialog_Error_NameEmpty = The property name is empty.
-PropertySection_Dialog_Error_ClassEmpty = The property class is empty.
-
-##Facet Section
-FacetSection_Name = Facets
-FacetSection_Description = This section lists all the facets.
-
-FacetSection_Table_DisplayNameColumn = Display Name
-FacetSection_Table_FacetNameColumn = Facet Name
-FacetSection_Table_DescriptionColumn = Description
-
-FacetSection_Dialog_Title_Add = Add Facet
-FacetSection_Dialog_Title_Edit = Edit Facet
-FacetSection_Dialog_Tab_General = General
-FacetSection_Dialog_FacetName = Facet Name*:
-FacetSection_Dialog_DisplayName = Display Name:
-FacetSection_Dialog_Description = Description:
-FacetSection_Dialog_Error_NameEmpty = The facet name is empty.
-
-####################################################
-#Others page 
-####################################################
-OthersPage_Title = Faces Configuration Others
-
-##Application ActionListener Section
-ActionListenerSection_Name = Action Listener
-ActionListenerSection_Description = 
-
-
-##Application Message Bundle Section
-MessageBundleSection_Name = Message Bundle
-MessageBundleSection_Description = 
-
-
-MessageBundleSection_Dialog_Title = Select Message Bundle
-MessageBundleSection_Dialog_Message_SelectPropertyFile = Please select a message bundle file.
-MessageBundleSection_Dialog_Message_AlreadyExists = This message bundle already exists.
-
-##Application Locale Config Section
-LocaleConfigSection_Name = Locale Config
-LocaleConfigSection_Description = 
-
-LocaleConfigSection_Wizard_WindowTitle = Add New Locale
-LocaleConfigSection_Wizard_Page_Name = addLocalePage
-LocaleConfigSection_Wizard_Page_Title = Add Supported Locale
-LocaleConfigSection_Wizard_Page_Description = 
-LocaleConfigSection_Wizard_Page_LabelText = Enter or select a locale:
-LocaleConfigSection_Wizard_Page_AlreadyExistsError = This locale already exists.
-
-##Application Default RenderKit ID Section
-DefaultRenderKitIDSection_Name = Default RenderKit ID
-DefaultRenderKitIDSection_Description = 
-
-
-DefaultRenderKitIDSection_Wizard_WindowTitle = Add Default Render Kit ID
-DefaultRenderKitIDSection_Wizard_Page_Name = addDefaultRenderKitIDPage
-DefaultRenderKitIDSection_Wizard_Page_Title = Add Default Render Kit ID
-DefaultRenderKitIDSection_Wizard_Page_Description = 
-DefaultRenderKitIDSection_Wizard_Page_LabelText = Enter or select a render kit id:
-DefaultRenderKitIDSection_Wizard_Page_AlreadyExistsError = This render kit ID already exists.
-
-##Application Navigation Handler Section
-NavigationHandlerSection_Name = Navigation Handler
-NavigationHandlerSection_Description = 
-
-
-##Application View Handler Section
-ViewHandlerSection_Name = View Handler
-ViewHandlerSection_Description = 
-
-
-##Application State Manager Section
-StateManagerSection_Name = State Manager
-StateManagerSection_Description = 
-
-
-##Application Property Resolver Section
-PropertyResolverSection_Name = Property Resolver
-PropertyResolverSection_Description = 
-
-##Application Variable Resolver Section
-VariableResolverSection_Name = Variable Resolver
-VariableResolverSection_Description = 
-
-
-##Factory Application Factory Section
-ApplicationFactorySection_Name = Application Factory
-ApplicationFactorySection_Description = 
-
-
-##Factory Faces Context Factory Section
-FacesContextFactorySection_Name = Faces Context Factory
-FacesContextFactorySection_Description = 
-
-
-##Factory Lifecycle Factory Section
-LifecycleFactorySection_Name = Lifecycle Factory
-LifecycleFactorySection_Description = 
-
-
-##Factory Render Kit Factory Section
-RenderKitFactorySection_Name = Render Kit Factory
-RenderKitFactorySection_Description = 
-
-##LifeCycle Phase Listener Section
-PhaseListenerSection_Name = Phase Listener
-PhaseListenerSection_Description = 
-
-####################################################
-#Resource for MultiPageEditorOutlinePage
-####################################################
-MultiPageEditorOutlinePage_noOutline = An outline is not available.
-
-
-FacesConfigEditor_WaitForLoadPage_Title= Please wait while the editor finishes loading...
-FacesConfigEditor_WaitForLoad_EditorTabTitle=Wait for Load
-ModelLoader_LoadingModelJobName="Loading faces-config model"
-
-###########################
-# AlignmentAction messages
-###########################
-AlignmentAction_AlignLeftAction_Tooltip=Align Left
-AlignmentAction_AlignLeftAction_Label=Align &Left
-AlignmentAction_AlignRightAction_Tooltip=Align Right
-AlignmentAction_AlignRightAction_Label=Align &Right
-AlignmentAction_AlignTopAction_Tooltip=Align Top
-AlignmentAction_AlignTopAction_Label=Align &Top
-AlignmentAction_AlignBottomAction_Tooltip=Align Bottom
-AlignmentAction_AlignBottomAction_Label=Align &Bottom
-AlignmentAction_AlignCenterAction_Tooltip=Align Center
-AlignmentAction_AlignCenterAction_Label=Align &Center
-AlignmentAction_AlignMiddleAction_Tooltip=Align Middle
-AlignmentAction_AlignMiddleAction_Label=Align &Middle
-AddEditManagedPropertyDialog_Add=Add Managed Property
-AddEditManagedPropertyDialog_Edit=Edit Managed Property
-AddEditMapEntryDialog_NullValue=Null Value
-EditListEntriesDialog_EditingListEntries=Editing list-entries
-EditMapEntriesDialog_EditingMapEntries=Editing map-entries
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPlugin.java
deleted file mode 100644
index d65ef67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPlugin.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class EditorPlugin extends AbstractUIPlugin {//implements IStartup {
-
-	// The shared instance.
-	private static EditorPlugin plugin;
-
-	private Logger log;
-
-	private ResourceBundle resourceBundle;
-
-	private static Alerts alerts;
-
-	private URL pluginBase;
-
-	/**
-	 * The constructor.
-	 */
-	public EditorPlugin() {
-		super();
-		plugin = this;
-	}
-	
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		try {
-			// get resource bundle.
-			resourceBundle = ResourceBundle
-					.getBundle("org.eclipse.jst.jsf.facesconfig.ui.EditorPluginResources"); //$NON-NLS-1$
-			alerts = new Alerts(this, resourceBundle);
-			pluginBase = getBundle().getEntry("/"); //$NON-NLS-1$
-
-			// set up logging for this plugin and everthing under it.
-			log = new Logger(this.getBundle(), resourceBundle);
-
-			// log.info("log.StartMessage", CommonPlugin.getVersion());
-		} catch (Exception ee) {
-			// only log if the logger was configured correctly.
-			if (log != null) {
-				log.error("log.msg", //$NON-NLS-1$
-						"Problems starting plug-in Faces Config Editor.", ee); //$NON-NLS-1$
-			}
-
-			throw new CoreException(new Status(IStatus.ERROR, getBundle()
-					.getSymbolicName(), IStatus.OK,
-					"Problems starting plug-in Faces Config Editor", ee)); //$NON-NLS-1$
-		}
-		
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * @return the shared instance.
-	 */
-	public static EditorPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * @return the alerts objects associated with this plugin for alerting the user.
-	 */
-	public static Alerts getAlerts() {
-		return alerts;
-	}
-
-	/**
-	 * Returns a logger for the new class using this plugin for reference.
-	 * @param theClass 
-	 * @return the default root logger
-	 */
-	public static Logger getLogger(Class theClass) {
-		return getDefault().getRootLogger(); // .getLogger(theClass);
-	}
-
-	/**
-	 * Returns the plugin's root logger
-	 * @return the root logger
-	 */
-	public Logger getRootLogger() {
-		return log;
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 * @return the resource bundle
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 * @param key 
-	 * @return the resource bundle string for key
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the standard display to be used. The method first checks, if the
-	 * thread calling this method has an associated dispaly. If so, this display
-	 * is returned. Otherwise the method returns the default display.
-	 * @return the standard display
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;
-	}
-
-	/**
-	 * Returns the active workbench window.
-	 * 
-	 * @return the active workbench window. this can be null but I've never seen
-	 *         it.
-	 */
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		if (getDefault().getWorkbench() == null) {
-			return null;
-		}
-        return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	/**
-	 * @return the active shell
-	 */
-	public static Shell getActiveShell() {
-		Shell shell = null;
-		IWorkbenchWindow workbenchWindow = getActiveWorkbenchWindow();
-		if (workbenchWindow.getShell() != null) {
-			shell = workbenchWindow.getShell();
-		} else {
-			shell = new Shell();
-		}
-		return shell;
-	}
-
-	/**
-	 * Returns a shared image for the given name
-	 * <p>
-	 * Note: Images returned from this method will be automitically disposed of
-	 * when this plug-in shuts down. Callers must not dispose of these images
-	 * themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the image name found in /icons (with extension)
-	 * @return the image, null on error or not found.
-	 */
-	public Image getImage(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		Image image = images.get(name);
-		if (image == null) {
-			try {
-				ImageDescriptor id = ImageDescriptor.createFromURL(new URL(
-						pluginBase, "icons/" + name)); //$NON-NLS-1$
-				images.put(name, id);
-
-				image = images.get(name);
-			} catch (MalformedURLException ee) {
-				// log.EditorPlugin.image.error=Image {0} not found.
-				log.error("log.msg", "log.EditorPlugin.image.error", name, ee); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		return image;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in
-	 * relative path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image descriptor
-	 */
-	public ImageDescriptor getImageDescriptor(String path) {
-		if (path == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		ImageDescriptor id = images.getDescriptor(path);
-		if (id == null) {
-			try {
-				id = ImageDescriptor.createFromURL(new URL(pluginBase, "icons/" //$NON-NLS-1$
-						+ path));
-				images.put(path, id);
-			} catch (MalformedURLException ee) {
-				// log.EditorPlugin.image.error=Image {0} not found.
-				log.error("log.msg", "log.EditorPlugin.image.error", path, ee); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		return id;
-	}
-
-	/**
-	 * Returns this plugin's unique identifier
-	 * 
-	 * @return this plugin's unique identifier
-	 * 
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	protected void initializeDefaultPluginPreferences() {
-		GEMPreferences.initializeDefaults();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPluginResources.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPluginResources.properties
deleted file mode 100644
index a8dd34c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorPluginResources.properties
+++ /dev/null
@@ -1,85 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-common.error=Error
-common.warning=Warning
-log.StartMessage=Faces Config Editor initialized on eclipse version {0}.
-####################################################
-# Resource message for Logging
-####################################################
-
-log.msg={0}
-
-log.EditorPlugin=Faces Config Editor Plugin initialized on eclipse version {0}.
-log.EditorPlugin.image.error=Image ''{0}'' not found.
-
-####################################################
-# Resource message for Alert
-####################################################
-
-Pageflow.PageflowEditor.Alert.errorOpenEditorTitle 	= Open Pageflow Error
-Pageflow.PageflowEditor.Alert.errorOpenEditorInfo 	= An error occured during opening the editor.
-Pageflow.PageflowEditor.Alert.errorSaveFileTitle 	= Save Pageflow Error
-Pageflow.PageflowEditor.Alert.errorSaveFileInfo 	= The current pageflow model could not be saved.
-Pageflow.PageflowEditor.Alert.nullModelManager 	= No model manager found for saving the file.
-Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle 	= Open JSF File Error
-Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFInfo 	= The JSF file ''{0}'' does not exist.
-Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFFolderInfo = Cannot open the page in the page editor.
-
-Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFileTitle = Confirm
-Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFile = No jsp file is related with this page.
-
-Pageflow.PageflowEditor.Alert.syncWithFacesConfigTitle = Confirm
-Pageflow.PageflowEditor.Alert.syncWithFacesConfigInfo = Synchronizing with faces-config will update the current pageflow model! \nThis command CAN NOT undo. Are you sure?
-Pageflow.PageflowEditor.Alert.errorSyncPageflowModel = The current pageflow model could not be synchronized with the specified faces-config file.
-
-Pageflow.PageflowEditor.Alert.updateFacesConfigTitle = Confirm
-Pageflow.PageflowEditor.Alert.updateFacesConfigInfo = Update the related faces config file. Are you sure?
-Pageflow.PageflowEditor.Alert.errorUpdateFacesConfig = The related faces-config file could not be updated.
-
-Pageflow.Transform.Alert.ResourceTitle = Resource Error
-Pageflow.Transform.Alert.LoadResourceError = Error loading resource
-Pageflow.Transform.Alert.SaveResourceError = Error saving resource
-
-Pageflow.PageflowEditor.Alert.DNDResourceTitle	= Pageflow Creation Error 
-Pageflow.PageflowEditor.Alert.ExistingPage	= The web page ''{0}'' already exists in current PageFlow.
-Pageflow.PageflowEditor.Alert.ExistingAction	= The action ''{0}'' already exists in current PageFlow.
-Pageflow.PageflowEditor.Alert.PageFromOtherProject 	= The web page ''{0}'' does not belong to current project.
-
-Pageflow.FacesConfig.Alert.ResourceTitle = Faces Configuration File Warning
-Pageflow.FacesConfig.Alert.LoadFileError = Invalid content in faces configuration file ''{0}''.
-Pageflow.FacesConfig.Alert.ErrorUpdateFacesConfigFromPageflow = Invalid content in faces configuration file. \nThe pageflow diagram can not be transformed.
-Pageflow.FacesConfig.Alert.SaveFileError = Failed to save faces configuration file ''{0}''.
-
-ManagedBeanInitializationSection.Remove.Title	= Confirm Remove
-ManagedBeanInitializationSection.RemoveManagedProperty = Are you sure you want to remove all the managed-properties?
-ManagedBeanInitializationSection.RemoveMapEntries = Are you sure you want to remove map-entries?
-ManagedBeanInitializationSection.RemoveListEntries = Are you sure you want to remove list-entries?
-
-Alert.Error.CompletionProcessor.HTML.AttributeCompletionProp=No completions found
-Alert.Info.JSPPageEditorContributor.CreateAction.Message=Sample Action Executed
-
-Pageflow.PageflowEditor.Error.invalidPageflowFile 	= The specified input is not a valid pageflow.
-Pageflow.PageflowEditor.Error.invalidPageflowModel 	= The model in the pageflow file is not a valid pageflow model.
-Pageflow.PageflowEditor.Error.canNotOpenEditor4JSF 	= The jsf file can not be opened in the editor.
-Pageflow.PageflowEditor.Error.ResourceChange 	= Failed in the resource change.
-Pageflow.PageflowEditor.Error.canNotShowPropertyView	= Failed to show property sheet view.
-Pageflow.PageflowEditor.Error.canNotShowPaletteView 	= Failed to show palette sheet view.
-
-Pageflow.PageflowResources.Error.invalidResourceBundle     = The specified resource file is not a valid resourece bundle file.
-Pageflow.Transform.Resource.LoadError = Error loading resource ''{0}''
-
-Pageflow.PageflowEditor.Error.UnableRemoveAllMarkers 	= Unable to remove all markers
-Pageflow.PageflowEditor.Error.UnableAddMarker 	= Unable to add a marker
-Pageflow.PageflowEditor.Error.UnableRemoveMarker 	= Unable to remove a marker
-Pageflow.PageflowEditor.Error.invalidMarkerAttribute 	= Unable to get marker's attribute
-
-PageflowEditor.Encoding.Unsupported 			= Unsupported Encoding.
-PageflowEditor.Transform.Error.GetPageflowFromFacesConfig 	= Failed to get pageflow model from faces-config'a navigation rule.
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigActionBarContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigActionBarContributor.java
deleted file mode 100644
index 7171e35..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigActionBarContributor.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-import org.eclipse.jface.action.ICoolBarManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowActionBarContributor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.xml.ui.internal.tabletree.SourcePageActionContributor;
-
-/**
- * The faces-config editor itself is composed by a set of pages. Each page has
- * its own action contributor. This FacesConfigActionBarContributor will work as
- * a proxy to delegate the action contributing to target nested action
- * contributor.
- * 
- * @author hmeng
- */
-
-public class FacesConfigActionBarContributor extends
-		MultiPageEditorActionBarContributor {
-	private SourcePageActionContributor sourceActionContributor = null;
-
-	private PageflowActionBarContributor pageflowActionContributor = null;
-
-	private EditingDomainActionBarContributor formbasedPageActionContributor = null;
-
-	private IEditorPart activeNestedEditor;
-
-	/**
-	 * Default constructor
-	 */
-	public FacesConfigActionBarContributor() {
-		super();
-	}
-
-	public void setActivePage(IEditorPart activeEditor) {
-		if (activeEditor != activeNestedEditor) {
-			if (getActionContributor(activeNestedEditor) != null) {
-				getActionContributor(activeNestedEditor).setActiveEditor(
-						activeEditor);
-			}
-			activeNestedEditor = activeEditor;
-			EditorActionBarContributor activeContributor = getActionContributor(activeEditor);
-			if (activeContributor != null)
-				activeContributor.setActiveEditor(activeEditor);
-			else
-				super.setActiveEditor(activeEditor);
-			updateActionBars();
-		}
-	}
-
-	public void contributeToCoolBar(ICoolBarManager coolBarManager) {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor != null)
-			activeContributor.contributeToCoolBar(coolBarManager);
-	}
-
-	public void contributeToMenu(IMenuManager menuManager) {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor != null) {
-			activeContributor.contributeToMenu(menuManager);
-		}
-	}
-
-	public void contributeToStatusLine(IStatusLineManager statusLineManager) {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor != null) {
-			activeContributor.contributeToStatusLine(statusLineManager);
-		}
-	}
-
-	public void contributeToToolBar(IToolBarManager toolBarManager) {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor != null) {
-			activeContributor.contributeToToolBar(toolBarManager);
-		}
-	}
-
-	public void dispose() {
-		getFormbasedPageActionContributor().dispose();
-		getPageflowActionContributor().dispose();
-		getSourceActionContributor().dispose();
-	}
-
-	public IActionBars getActionBars() {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor != null) {
-			return activeContributor.getActionBars();
-		}
-        return super.getActionBars();
-	}
-
-	public IWorkbenchPage getPage() {
-		return super.getPage();
-	}
-
-	public void init(IActionBars bars, IWorkbenchPage page) {
-		getPageflowActionContributor().init(bars, page);
-		getSourceActionContributor().init(bars, page);
-		getFormbasedPageActionContributor().init(bars, page);
-		super.init(bars, page);
-	}
-
-//	private IEditorPart getActiveNestedEditor(IEditorPart targetEditor) {
-//		IEditorPart activeNestedEditor_;
-//		if (targetEditor instanceof FormEditor) {
-//			activeNestedEditor_ = ((FormEditor) targetEditor).getActiveEditor();
-//		} else {
-//			activeNestedEditor_ = targetEditor;
-//		}
-//		return activeNestedEditor_;
-//	}
-
-	private EditorActionBarContributor getActionContributor(
-			IEditorPart activeNestedEditor_) {
-		EditorActionBarContributor activeContributor = null;
-		if (activeNestedEditor_ instanceof PageflowEditor) {
-			activeContributor = getPageflowActionContributor();
-		} else if (activeNestedEditor_ instanceof StructuredTextEditor) {
-			activeContributor = getSourceActionContributor();
-		} else if (activeNestedEditor_ != null) {
-			activeContributor = getFormbasedPageActionContributor();
-		}
-		return activeContributor;
-	}
-
-	private SourcePageActionContributor getSourceActionContributor() {
-		if (sourceActionContributor == null) {
-			sourceActionContributor = new SourcePageActionContributor();
-		}
-		return sourceActionContributor;
-	}
-
-	private EditingDomainActionBarContributor getFormbasedPageActionContributor() {
-		if (formbasedPageActionContributor == null) {
-			formbasedPageActionContributor = new MyEditingDomainActionContributor();
-		}
-		return formbasedPageActionContributor;
-	}
-
-	private PageflowActionBarContributor getPageflowActionContributor() {
-		if (pageflowActionContributor == null) {
-			pageflowActionContributor = new PageflowActionBarContributor();
-		}
-		return pageflowActionContributor;
-
-	}
-
-	/**
-	 * update the action bars
-	 */
-	public void updateActionBars() {
-		EditorActionBarContributor activeContributor = getActionContributor(activeNestedEditor);
-		if (activeContributor instanceof INestedActionContributor)
-			((INestedActionContributor) activeContributor).update();
-		// getActionBars().getMenuManager().removeAll();
-		// activeContributor.contributeToMenu(getActionBars().getMenuManager());
-		getActionBars().updateActionBars();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java
deleted file mode 100644
index 15db4c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java
+++ /dev/null
@@ -1,1411 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackListener;
-import org.eclipse.gef.editparts.ZoomManager;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.EditorPartAction;
-import org.eclipse.gef.ui.actions.SaveAction;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.views.palette.PaletteView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.actions.IOpenPage;
-import org.eclipse.jst.jsf.core.IJSFCoreConstants;
-import org.eclipse.jst.jsf.facesconfig.edit.provider.FacesConfigItemProviderAdapterFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ComponentsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IntroductionPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ManagedBeanPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OverviewPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.WaitForLoadPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.DelegatingZoomManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.DelegatingCommandStack;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.EMFCommandStackGEFAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.layout.PageflowLayoutManager;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.dialogs.SaveAsDialog;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.editor.IFormPage;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.internal.BaseSaveAction;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.wst.common.project.facet.core.IFacetedProject;
-import org.eclipse.wst.common.project.facet.core.IProjectFacet;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * This is the main editor for the faces-config file.  Note that the model
- * load can involve long-running socket operations (shouldn't but can),
- * so the editor UI is load asynchronously.  This is means that any 
- * operations that need to be executed on editor open should be run
- * using AddPagesTask.pageSafeExecute() to ensure that they occur
- * after all editor pages have finished loading.
- * 
- * @author sfshi
- * 
- */
-public class FacesConfigEditor extends FormEditor implements
-		IEditingDomainProvider, ISelectionProvider {
-
-    /**
-     * This editor's ID.  TODO: this should prob be in plugin.properties?
-     */
-    public static final String EDITOR_ID = "org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor"; //$NON-NLS-1$
-    
-    
-    /**
-     * Page id for Source page.   Used for testing only.
-     */
-    public static final String SOURCE_PAGE_ID = "SourcePageId"; //$NON-NLS-1$
-	/**
-	 * editing domain that is used to track all changes to the model
-	 */
-	private AdapterFactoryEditingDomain editingDomain;
-
-	/**
-	 * adapter factory used for providing views of the model
-	 */
-	private ComposedAdapterFactory adapterFactory;
-
-	/** id of the pageflowPage */
-	private int pageflowPageID;
-
-	private int managedBeanPageID;
-
-	private int componentsPageID;
-
-	private int othersPageID;
-
-	private int sourcePageId;
-
-	private PageflowEditor pageflowPage;
-
-	/** The source text editor. */
-	private StructuredTextEditor sourcePage;
-
-	private Collection selectionChangedListeners = new ArrayList();
-
-	private ISelection editorSelection = StructuredSelection.EMPTY;
-
-	private IContentOutlinePage outlinePage;
-
-	private IProject currentProject;
-
-	private boolean isWebProject;
-	
-	private ModelLoader        _modelLoader;
-	
-	/**
-	 * only true once dispose() has been called
-	 * used to signal that the editor was disposed.
-	 */
-	private boolean _isDisposed; // = false;
-	
-    /**
-     * Used to load editor pages when the model is loaded
-     */
-    private final AddPagesTask     _addPagesTask = new AddPagesTask();
-        
-	/**
-	 * Default constructor
-	 */
-	public FacesConfigEditor() {
-		initializeEMF();
-	}
-
-	/**
-	 * This listens for workspace changes. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener() {
-		public void resourceChanged(IResourceChangeEvent event) {
-			// Only listening to these.
-			// if (event.getType() == IResourceDelta.POST_CHANGE)
-			{
-				IResourceDelta delta = event.getDelta();
-				try {
-					class ResourceDeltaVisitor implements IResourceDeltaVisitor {
-						protected ResourceSet resourceSet = editingDomain
-								.getResourceSet();
-
-						@SuppressWarnings("hiding") 
-                        protected Collection changedResources = new ArrayList();
-
-						@SuppressWarnings("hiding") 
-                        protected Collection removedResources = new ArrayList();
-
-						public boolean visit(IResourceDelta delta_) {
-							if (delta_.getFlags() != IResourceDelta.MARKERS
-									&& delta_.getResource().getType() == IResource.FILE) {
-								if ((delta_.getKind() & (IResourceDelta.CHANGED | IResourceDelta.REMOVED)) != 0) {
-									Resource resource = resourceSet
-											.getResource(URI.createURI(delta_
-													.getFullPath().toString()),
-													false);
-									if (resource != null) {
-										if ((delta_.getKind() & IResourceDelta.REMOVED) != 0) {
-											removedResources.add(resource);
-										} else {
-											changedResources.add(resource);
-										}
-									}
-								}
-							}
-
-							return true;
-						}
-
-						public Collection getChangedResources() {
-							return changedResources;
-						}
-
-						public Collection getRemovedResources() {
-							return removedResources;
-						}
-					}
-
-					ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
-					delta.accept(visitor);
-
-					if (!visitor.getRemovedResources().isEmpty()) {
-						removedResources.addAll(visitor.getRemovedResources());
-						if (!isDirty()) {
-							getSite().getShell().getDisplay().asyncExec(
-									new Runnable() {
-										public void run() {
-											getSite().getPage().closeEditor(
-													FacesConfigEditor.this,
-													false);
-											FacesConfigEditor.this.dispose();
-										}
-									});
-						}
-					}
-
-					if (!visitor.getChangedResources().isEmpty()) {
-						changedResources.addAll(visitor.getChangedResources());
-					}
-				} catch (CoreException exception) {
-					// log it.
-					EditorPlugin.getDefault().getLog().log(
-							new Status(IStatus.ERROR, EditorPlugin
-									.getPluginId(), IStatus.OK, exception
-									.getMessage() == null ? "" : exception //$NON-NLS-1$
-									.getMessage(), exception));
-				}
-			}
-		}
-	};
-
-	/**
-	 * Resources that have been removed since last activation.
-	 * 
-	 * @generated
-	 */
-	Collection removedResources = new ArrayList();
-
-	/**
-	 * Resources that have been changed since last activation.
-	 * 
-	 * @generated
-	 */
-	Collection changedResources = new ArrayList();
-
-	/**
-	 * Resources that have been saved.
-	 * 
-	 * @generated
-	 */
-	Collection savedResources = new ArrayList();
-
-	/**
-	 * Initializes the EMF support.
-	 */
-	private void initializeEMF() {
-		// create an adapter factory that yields item providers
-		List factories = new ArrayList();
-		factories.add(new ResourceItemProviderAdapterFactory());
-		factories.add(new FacesConfigItemProviderAdapterFactory());
-		factories.add(new ReflectiveItemProviderAdapterFactory());
-		adapterFactory = new ComposedAdapterFactory(factories);
-
-		// create the command stack that will notify this editor as commands are
-		// executed
-		BasicCommandStack commandStack = new BasicCommandStack();
-		commandStack
-				.addCommandStackListener(new org.eclipse.emf.common.command.CommandStackListener() {
-					public void commandStackChanged(final EventObject event) {
-						getContainer().getShell().getDisplay().asyncExec(
-								new Runnable() {
-									public void run() {
-										editorDirtyStateChanged();
-										getActionBarContributor()
-												.updateActionBars();
-									}
-								});
-					}
-				});
-		// commandStack.addCommandStackListener(this);
-		// create the editing domain with a special command stack
-		editingDomain = new AdapterFactoryEditingDomain(adapterFactory,
-				commandStack, new HashMap());
-	}
-
-	/*
-	 * @see org.eclipse.ui.IEditorPart#init(org.eclipse.ui.IEditorSite,
-	 *      org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		try {
-			super.init(site, input);
-		} catch (Exception e) {
-			MessageDialog.openError(null,
-					EditorMessages.FacesConfigEditor_Error_OpenModel_Title,
-					EditorMessages.FacesConfigEditor_Error_OpenModel);
-			throw new PartInitException(
-					EditorMessages.FacesConfigEditor_Error_OpenModel);
-		}
-
-		setPartName(input.getName());
-		if (!isValidInput(input)) {
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().openEditor(input,
-							"org.eclipse.ui.DefaultTextEditor"); //$NON-NLS-1$
-
-			close(false);
-			return;
-		}
-
-		createActions();
-
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(
-				resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
-	}
-
-	/*
-	 * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	protected void setInput(IEditorInput input) 
-	{
-        isWebProject = matches(input);
-        super.setInput(input);
-
-		IFile inputFile = (IFile) input.getAdapter(IFile.class);
-		if (inputFile != null) 
-		{
-			final IProject project = inputFile.getProject();
-			final IPath inputPath = inputFile.getFullPath();
-			
-			_modelLoader = new ModelLoader(); 
-			_modelLoader.load(project, inputPath, isWebProject, _addPagesTask);
-		}
-	}
-
-
-	protected void addPages() 
-	{
-	    // try loading wait page
-	    // if we get to here before model load completes,
-	    // then wait page will give the user the indication
-	    // that something is happening in the background before
-	    // the editor full loads.
-	    // if the model is already loaded, this call should do nothing
-	    _addPagesTask.maybeAddWaitPage();
-	}
-
-	/**
-	 * This runnable is used to used to manage the loading of the 
-	 * editor pages for editor in a deferred fashion.  Because the model
-	 * loading for this editor can be noticably long and (unfortunately)
-	 * may involve socket calls that block, loadModel(), runs this on a
-	 * separate thread. This class is intended to be used in two ways:
-	 * 
-	 * 1) by the model loading code to signal it is finished by executing
-	 * the run() via a display.asyncExec().
-	 * 
-	 * 2) by the addPages() call back on the the main editor as a way to
-	 * load a "Please wait for loading" page if the loading is still running
-	 * by the time the editor is ready to visualize itself.
-	 * 
-	 * Note that in both cases methods of this class *must* be running on the
-	 * main display thread.
-	 * 
-	 * @author cbateman
-	 *
-	 */
-	private class AddPagesTask extends ModelLoader.ModelLoaderComplete
-	{
-	    private final AtomicBoolean    _arePagesLoaded = new AtomicBoolean(false);     // set to true when the regular editor pages are loaded
-	    private FormPage               _waitPage;
-	    private List<Runnable>         _deferredRunnables = new ArrayList<Runnable>();
-	    
-	    /**
-	     * If the editor pages are loaded, runnable.run() is invoked immediately
-	     * If the editor pages are not loaded yet, runnable is queued and will be 
-	     * executed in the order they are added immediately after the pages are loaded
-	     * 
-	     * @param runnable
-	     */
-	    public synchronized void pageSafeExecute(Runnable runnable)
-	    {
-	        if (!_isDisposed)
-	        {
-    	        if (!_arePagesLoaded.get())
-    	        {
-    	            _deferredRunnables.add(runnable);
-    	        }
-    	        else
-    	        {
-    	            runnable.run();
-    	        }
-	        }
-	    }
-	    
-        /**
-         * @return true if the pages are loaded
-         */
-        public synchronized boolean getArePagesLoaded() 
-        {
-            return _arePagesLoaded.get();
-        }
-        
-        /**
-         * Remove the wait page if present.
-         */
-        public synchronized void removeWaitPage()
-        {
-            if (_waitPage != null 
-            		&& !_waitPage.getPartControl().isDisposed()) 
-            {
-                int index = _waitPage.getIndex();
-                
-                if (index >= 0)
-                {
-                    removePage(index);
-                }
-            }
-        }
-        
-        /**
-         * Add the wait page if the main pages aren't already loaded
-         */
-        public synchronized void maybeAddWaitPage()
-        {
-            // only load the wait page if the other pages haven't been loaded
-            if (!getArePagesLoaded())
-            {
-                _waitPage = new WaitForLoadPage(FacesConfigEditor.this, "WaitForLoad", EditorMessages.FacesConfigEditor_WaitForLoad_EditorTabTitle); //$NON-NLS-1$
-                
-                try
-                {
-                    addPage(0,_waitPage);
-                }
-                catch(PartInitException pie)
-                {
-                    _waitPage =null;
-                    EditorPlugin.getDefault().getLog().log(
-                            new Status(IStatus.ERROR, EditorPlugin.getPluginId(),
-                                    IStatus.OK, pie.getMessage() == null ? "" : pie //$NON-NLS-1$
-                                            .getMessage(), pie));
-                }
-            }
-        }
-
-        /**
-         * Must be run on the UI thread
-         */
-        public void doRun(FacesConfigArtifactEdit  edit) 
-        {
-            synchronized(this)
-            {
-                // ensure wait page gets removed
-                removeWaitPage();
-                
-                if (!getArePagesLoaded()
-                        && !_isDisposed)  // NOTE: we assume that access to variable does not need to
-                                          // to be synchronous since this method must 
-                                          // be run on the UI thread.  The only way
-                                          // that isDisposed should be true is if model loading took a long
-                                          // time and the user closed the editor before it completed (trigger dispose to be called)
-                {
-                    try 
-                    {
-                        if (isWebProject && edit != null && edit.getFacesConfig() != null) 
-                        {
-                            // only add the intro editor if the preference
-                            // is set to do so.
-                            if (GEMPreferences.getShowIntroEditor())
-                            {
-                                IntroductionPage page1 = new IntroductionPage(FacesConfigEditor.this);
-                                addPage(page1, FacesConfigEditor.this.getEditorInput());
-                            }
-                            
-                            IFormPage overviewPage = new OverviewPage(FacesConfigEditor.this);
-                            addPage(overviewPage, FacesConfigEditor.this.getEditorInput());
-        
-                            // Page flow
-                            createAndAddPageflowPage();
-        
-                            // pages
-                            IFormPage managedBeanPage = new ManagedBeanPage(FacesConfigEditor.this);
-                            managedBeanPageID = addPage(managedBeanPage, FacesConfigEditor.this.getEditorInput());
-                            IFormPage componentsPage = new ComponentsPage(FacesConfigEditor.this);
-                            componentsPageID = addPage(componentsPage, FacesConfigEditor.this.getEditorInput());
-                            IFormPage othersPage = new OthersPage(FacesConfigEditor.this);
-                            othersPageID = addPage(othersPage, FacesConfigEditor.this.getEditorInput());
-                        }
-        
-                        sourcePage = new StructuredTextEditor();
-                        sourcePage.setEditorPart(FacesConfigEditor.this);
-                        sourcePageId = addPage(sourcePage, FacesConfigEditor.this.getEditorInput());
-                        setPageText(sourcePageId, EditorMessages.FacesConfigEditor_Source_TabName);
-                        sourcePage.update();
-
-                        /* Bug 263806 - Problems saving file from source tab of faces-config editor
-                         * 
-                         * Getting the save action and calling partDeactivated on it will attach
-                         * the internal listener necessary for the save action to receive subsequent
-                         * property change events. (There is no public method available to just hook
-                         * up the internal listener to our part.)
-                         */
-                        IAction sourcePageSaveAction = sourcePage.getAction("save"); //$NON-NLS-1$
-                        if (sourcePageSaveAction instanceof BaseSaveAction) {
-                        	((BaseSaveAction)sourcePageSaveAction).partDeactivated(FacesConfigEditor.this);
-                        }
-
-                        // default active page to 0
-                        setActivePage(0);
-
-                        // execute deferred runnables
-                        for (Runnable runnable : _deferredRunnables)
-                        {
-                            runnable.run();
-                        }
-                        
-                        // flag the fact that the regular editor pages have been added
-                        _arePagesLoaded.set(true);
-                    } catch (PartInitException e) {
-                        EditorPlugin.getDefault().getLog().log(
-                                new Status(IStatus.ERROR, EditorPlugin.getPluginId(),
-                                        IStatus.OK, e.getMessage() == null ? "" : e //$NON-NLS-1$
-                                                .getMessage(), e));
-                    }
-                }
-            }
-        }
-	}
-	
-	/**
-	 * Creates the pageflow page of the multi-page editor.
-	 * @throws PartInitException 
-	 */
-	protected void createAndAddPageflowPage() throws PartInitException {
-		pageflowPage = new PageflowEditor(this);
-		pageflowPageID = addPage(pageflowPage, getEditorInput());
-		setPageText(pageflowPageID,
-				EditorMessages.FacesConfigEditor_Pageflow_TabName);
-		addPageActionRegistry(pageflowPage);
-		pageflowPage.getModelsTransform().setFacesConfig(getFacesConfig());
-		pageflowPage.getModelsTransform().setPageflow(
-				pageflowPage.getPageflow());
-		boolean fornew = pageflowPage.getModelsTransform()
-				.updatePageflowModelFromEMF();
-		pageflowPage.setGraphicalViewerContents(pageflowPage.getPageflow());
-		if (fornew) {
-			PageflowLayoutManager.getInstance().layoutPageflow(
-					pageflowPage.getPageflow());
-		}
-		pageflowPage.getModelsTransform().setListenToNotify(true);
-	}
-
-	/**
-	 * TODO: this is used only for testing
-	 * @return the page flow editor
-	 */
-	public PageflowEditor getPageflowPage() {
-		return pageflowPage;
-	}
-
-	/**
-	 * get the action's registry of sub pages.
-	 * @param page 
-	 * 
-	 */
-	protected void addPageActionRegistry(IEditorPart page) {
-		if (page != null) {
-			ActionRegistry pageActionRegisty = (ActionRegistry) page
-					.getAdapter(ActionRegistry.class);
-			if (pageActionRegisty != null) {
-				for (Iterator iter = pageActionRegisty.getActions(); iter
-						.hasNext();) {
-					getActionRegistry().registerAction((IAction) iter.next());
-				}
-			}
-		}
-	}
-
-	/** the editor's action registry */
-	private ActionRegistry actionRegistry = null;
-
-	/**
-	 * Returns the action registry of this editor.
-	 * 
-	 * @return - the action registry
-	 */
-	protected ActionRegistry getActionRegistry() {
-		if (null == actionRegistry)
-			actionRegistry = new ActionRegistry();
-
-		return actionRegistry;
-	}
-
-	/**
-	 * Returns the root object of the configuration model.
-	 * 
-	 * @return the root object.  Should not, but may return null.
-	 */
-	public FacesConfigType getFacesConfig() 
-	{
-	    FacesConfigArtifactEdit  edit = _modelLoader.getEdit();
-	    if (edit != null)
-	    {
-	        return edit.getFacesConfig();
-	    }
-	    return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() { 
-		return ((BasicCommandStack) editingDomain.getCommandStack()) 
-				.isSaveNeeded()
-				|| super.isDirty(); 
-	}
-
-	/**
-	 * This class listens for command stack changes of the pages contained in
-	 * this editor and decides if the editor is dirty or not.
-	 */
-	private class MultiPageCommandStackListener implements CommandStackListener {
-
-		/** the observed command stacks */
-		private List commandStacks = new ArrayList(2);
-
-		/** to get the editorpart from command stack */
-		private HashMap mapEditorCommandStack = new HashMap();
-
-		private boolean saveLocation = false;
-
-		/**
-		 * Adds a <code>CommandStack</code> to observe.
-		 * 
-		 * @param commandStack
-		 * @param editor 
-		 */
-		public void addCommandStack(CommandStack commandStack,
-				IEditorPart editor) {
-			if (commandStack == null)
-				return;
-
-			if (mapEditorCommandStack.get(commandStack) == editor)
-				return;
-
-			commandStacks.add(commandStack);
-			commandStack.addCommandStackListener(this);
-			mapEditorCommandStack.put(commandStack, editor);
-		}
-
-		/**
-		 * set the dirty status for the models of different editor
-		 * 
-		 * @param editor -
-		 *            editor, e.g., pageflow or databinding page.
-		 * @param dirty -
-		 *            true or false
-		 */
-		private void setEditorDirty(IEditorPart editor, boolean dirty) {
-            // do nothing
-		}
-
-		/** the list of action ids that are to CommandStack actions */
-		private List stackActionIDs = new ArrayList();
-
-		/**
-		 * Updates the specified actions.
-		 * 
-		 * @param actionIds -
-		 *            the list of ids of actions to update
-		 */
-		private void updateActions(List actionIds) {
-			for (Iterator ids = actionIds.iterator(); ids.hasNext();) {
-				IAction action = getActionRegistry().getAction(ids.next());
-				if (null != action && action instanceof UpdateAction) {
-					((UpdateAction) action).update();
-				}
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see CommandStackListener#commandStackChanged(java.util.EventObject)
-		 */
-		public void commandStackChanged(EventObject event) {
-			// enable or disable the actions
-			updateActions(stackActionIDs);
-			if (((CommandStack) event.getSource()).isDirty()) {
-				// set the editor's model dirty status
-				setEditorDirty((IEditorPart) mapEditorCommandStack
-						.get(event.getSource()), true);
-				// at least one command stack is dirty,
-				// so the multi page editor is dirty too
-				setDirty(true);
-			} else {
-				// set the editor's model dirty status, if it is from not save
-				// location.
-				if (!saveLocation) {
-					setEditorDirty((IEditorPart) mapEditorCommandStack
-							.get(event.getSource()), true);
-					setDirty(true);
-				} else {
-					setDirty(false);
-				}
-			}
-		}
-
-		/** the pageflow page editor's dirty state */
-		private boolean isDirty = false;
-
-		/**
-		 * Changes the dirty state.
-		 * 
-		 * @param dirty -
-		 *            dirty state
-		 */
-		public void setDirty(boolean dirty) {
-			if (isDirty != dirty) {
-				isDirty = dirty;
-				firePropertyChange(IEditorPart.PROP_DIRTY);
-			}
-		}
-
-		/**
-		 * Disposed the listener
-		 */
-		public void dispose() {
-			for (Iterator stacks = commandStacks.iterator(); stacks.hasNext();) {
-				((CommandStack) stacks.next()).removeCommandStackListener(this);
-			}
-			commandStacks.clear();
-		}
-
-		/**
-		 * Marks every observed command stack beeing saved. This method should
-		 * be called whenever the editor/model was saved.
-		 */
-		public void markSaveLocations() {
-			saveLocation = true;
-			for (Iterator stacks = commandStacks.iterator(); stacks.hasNext();) {
-				CommandStack stack = (CommandStack) stacks.next();
-				stack.markSaveLocation();
-			}
-			saveLocation = false;
-		}
-
-		/**
-		 * Flushes every observed command stack and resets the save location to
-		 * zero.
-		 */
-//		public void flush() {
-//			for (Iterator stacks = commandStacks.iterator(); stacks.hasNext();) {
-//				CommandStack stack = (CommandStack) stacks.next();
-//				stack.flush();
-//			}
-//		}
-	}
-
-	/** the <code>CommandStackListener</code> */
-	private MultiPageCommandStackListener multiPageCommandStackListener = null;
-
-	/**
-	 * Returns the global command stack listener.
-	 * 
-	 * @return the <code>CommandStackListener</code>
-	 */
-	protected MultiPageCommandStackListener getMultiPageCommandStackListener() {
-		if (null == multiPageCommandStackListener)
-			multiPageCommandStackListener = new MultiPageCommandStackListener();
-
-		return multiPageCommandStackListener;
-	}
-
-	/*
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		// do the work within an operation because this is a long running
-		// activity that modifies the workbench
-		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-			public void execute(IProgressMonitor monitor_) {
-				try {
-					if (isWebProject &&
-					        _modelLoader.getEdit() != null) {
-						// modelResource.save(Collections.EMPTY_MAP);
-						Resource deploymentDescriptorResource = _modelLoader.getEdit()
-                                      .getDeploymentDescriptorResource();
-                        if (deploymentDescriptorResource != null)
-                        {
-                            deploymentDescriptorResource.save(
-                                   Collections.EMPTY_MAP);
-						}
-						IFile file = ((IFileEditorInput) getEditorInput())
-								.getFile();
-						pageflowPage.doSave(file, monitor_);
-					}
-					sourcePage.doSave(monitor_);
-					getMultiPageCommandStackListener().markSaveLocations();
-				} catch (Exception e) {
-					EditorPlugin.getDefault().getLog().log(
-							new Status(IStatus.ERROR, EditorPlugin
-									.getPluginId(), IStatus.OK,
-									e.getMessage() == null ? "" : e //$NON-NLS-1$
-											.getMessage(), e));
-				}
-			}
-		};
-		try {
-			// commit all pending changes in form pages
-			for (Iterator iter = pages.iterator(); iter.hasNext();) {
-				Object obj = iter.next();
-				if (obj instanceof FormPage) {
-					((FormPage) obj).doSave(monitor);
-				}
-				// else if (obj instanceof PageflowEditor) {
-				// ((PageflowEditor) obj).doSave(monitor);
-				// }
-
-			}
-			operation.run(null);// .run(true, false,
-			// operation;
-			// runs the operation, and shows progress
-			// new ProgressMonitorDialog();
-
-			// refresh the necessary state
-			((BasicCommandStack) editingDomain.getCommandStack()).saveIsDone();
-
-			editorDirtyStateChanged();
-		} catch (Exception e) {
-			EditorPlugin.getDefault().getLog().log(
-					new Status(IStatus.ERROR, EditorPlugin.getPluginId(),
-							IStatus.OK, e.getMessage(), e));
-		}
-	}
-
-	public void doSaveAs() {
-		SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
-		saveAsDialog.open();
-		IPath path = saveAsDialog.getResult();
-		if (path != null) {
-			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-			if (file != null) {
-				doSaveAs(URI.createPlatformResourceURI(file.getFullPath()
-						.toString(), false), new FileEditorInput(file));
-			}
-		}
-	}
-
-	/**
-	 * @param uri
-	 * @param editorInput
-	 */
-	protected void doSaveAs(URI uri, IEditorInput editorInput) {
-		editingDomain.getResourceSet().getResources().get(0)
-				.setURI(uri);
-		setInputWithNotify(editorInput);
-		setPartName(editorInput.getName());
-		IProgressMonitor progressMonitor = getActionBars()
-				.getStatusLineManager() != null ? getActionBars()
-				.getStatusLineManager().getProgressMonitor()
-				: new NullProgressMonitor();
-		doSave(progressMonitor);
-	}
-
-	public boolean isSaveAsAllowed() {
-		return true;
-	}
-
-	/**
-	 * Returns the <code>TabbedPropertySheetPage</code> for this editor.
-	 * 
-	 * @return - the <code>TabbedPropertySheetPage</code>
-	 */
-	protected IPropertySheetPage getPropertySheetPage() {
-		return new TabbedPropertySheetPage(
-				new ITabbedPropertySheetPageContributor() {
-
-					public String getContributorId() {
-						return EDITOR_ID;
-					}
-				});
-	}
-
-	/** the delegating ZoomManager */
-	private DelegatingZoomManager delegatingZoomManager = null;
-
-	/**
-	 * check whether the input is related with IFile.
-	 * 
-	 * @param input
-	 * @return
-	 */
-	private boolean isValidInput(IEditorInput input) {
-		if (input != null) {
-			IFile file = (IFile) input.getAdapter(IResource.class);
-			if (file != null) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Returns the <code>DelegatingZoomManager</code> for this editor.
-	 * 
-	 * @return - the <code>DelegatingZoomManager</code>
-	 */
-	protected DelegatingZoomManager getDelegatingZoomManager() {
-		if (!isValidInput(getEditorInput()) || !isWebProject || !_addPagesTask.getArePagesLoaded()) {
-			return null;
-		}
-		if (null == delegatingZoomManager) {
-			delegatingZoomManager = new DelegatingZoomManager();
-			delegatingZoomManager
-					.setCurrentZoomManager((ZoomManager) pageflowPage
-							.getAdapter(ZoomManager.class));
-		}
-		return delegatingZoomManager;
-	}
-
-	/** the delegating CommandStack */
-	private DelegatingCommandStack delegatingCommandStack = null;
-
-	/**
-	 * Returns the <code>CommandStack</code> for this editor.
-	 * 
-	 * @return - the <code>CommandStack</code>
-	 */
-	public DelegatingCommandStack getDelegatingCommandStack() {
-		if (null == delegatingCommandStack) {
-			delegatingCommandStack = new DelegatingCommandStack();
-		}
-		return delegatingCommandStack;
-	}
-
-	/*
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter == IEditingDomainProvider.class) {
-			return new IEditingDomainProvider() {
-				public EditingDomain getEditingDomain() {
-					return editingDomain;
-				}
-			};
-		}
-		if (adapter == EditingDomain.class) {
-			return editingDomain;
-		}
-		if (adapter == AdapterFactory.class) {
-			return adapterFactory;
-		}
-		if (adapter == IEditorPart.class) {
-			return getActiveEditor();
-		}
-
-		if (adapter == CommandStack.class) {
-			return getDelegatingCommandStack();
-		}
-		if (adapter == ZoomManager.class) {
-			return getDelegatingZoomManager();
-		}
-
-		if (adapter == ActionRegistry.class) {
-			return getActionRegistry();
-		}
-		if (adapter == IGotoMarker.class) {
-			return new IGotoMarker() {
-				public void gotoMarker(final IMarker marker) {
-				    // this may be called on an editor open (i.e. double-click the Problems view)
-				    // so ensure it runs safely with respect to the page load
-				    _addPagesTask.pageSafeExecute(new Runnable()
-				    {
-				        public void run()
-				        {
-		                    FacesConfigEditor.this.gotoMarker(marker);
-				        }
-				    });
-				}
-			};
-		}
-		if (adapter == StructuredTextEditor.class) {
-			return sourcePage;
-		}
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		if (adapter == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		}
-
-		if (adapter == IProject.class) {
-			return getProject();
-		}
-
-		if (adapter == CTabFolder.class) {
-			return getContainer();
-		}
-
-		if (adapter == IOpenPage.class) {
-			return new IOpenPage() {
-
-				public void setActiveEditorPage(String pageID) {
-					FacesConfigEditor.this.setActiveEditorPage(pageID);
-
-				}
-			};
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private EMFCommandStackGEFAdapter sourceCommandStack;
-
-	/**
-	 * get or create the source page's GEF command stack based on its EMF
-	 * command stack.
-	 * 
-	 * @return
-	 */
-	private CommandStack getSourcePageCommandStack() {
-		if (sourceCommandStack == null) {
-            IDocument doc = sourcePage.getDocumentProvider().getDocument(getEditorInput());
-            if (doc instanceof IStructuredDocument) {
-            	sourceCommandStack = new EMFCommandStackGEFAdapter(doc);
-            }
-            else
-            {
-                EditorPlugin.getDefault().getLog().log(
-                   new Status(IStatus.ERROR, EditorPlugin.getPluginId(), 0, 
-                           "Error getting undo stack for Faces Config editor.  Undo may be disabled", //$NON-NLS-1$
-                           new Throwable()));
-            }
-		}
-		return sourceCommandStack;
-	}
-
-	/** the list of action ids that are to CommandStack actions */
-	// private List stackActionIDs = new ArrayList();
-	/** the list of action ids that are editor actions */
-	private List editorActionIDs = new ArrayList();
-
-	/**
-	 * Adds an editor action to this editor.
-	 * <p>
-	 * Editor actions are actions that depend and work on the editor.
-	 * 
-	 * @param action -
-	 *            the editor action
-	 */
-	protected void addEditorAction(EditorPartAction action) {
-		getActionRegistry().registerAction(action);
-		editorActionIDs.add(action.getId());
-	}
-
-	/**
-	 * Creates different kinds of actions and registers them to the
-	 * ActionRegistry.
-	 */
-	protected void createActions() {
-		// register save action
-		addEditorAction(new SaveAction(this));
-	}
-
-	/**
-	 * Indicates that the current page has changed.
-	 * <p>
-	 * We update the DelegatingCommandStack, OutlineViewer and other things
-	 * here. //
-	 */
-	protected void currentPageChanged() {
-		IEditorPart activeEditor = getActiveEditor();
-		if (activeEditor == null) {
-			return;
-		}
-
-		// update command stack
-		CommandStack cmdStack = null;
-
-		if (activeEditor == pageflowPage) {
-			cmdStack = (CommandStack) activeEditor
-					.getAdapter(CommandStack.class);
-		} else if (activeEditor == sourcePage)// other page will delegate the
-		// GEF command stack to source
-		// page's.
-		{
-			cmdStack = this.getSourcePageCommandStack();
-		}
-
-		// Add command stacks
-		getMultiPageCommandStackListener().addCommandStack(cmdStack,
-				activeEditor);
-		getDelegatingCommandStack().setCurrentCommandStack(cmdStack);
-
-		// enable or disable the actions
-		// updateActions(stackActionIDs);
-
-		// update zoom actions
-		ZoomManager zoomManager = null;
-		zoomManager = (ZoomManager) activeEditor.getAdapter(ZoomManager.class);
-
-		if (zoomManager != null) {
-			getDelegatingZoomManager().setCurrentZoomManager(zoomManager);
-		}
-
-		IEditorActionBarContributor contributor = getEditorSite()
-				.getActionBarContributor();
-		if (contributor != null
-				&& contributor instanceof FacesConfigActionBarContributor) {
-			((FacesConfigActionBarContributor) contributor)
-					.setActivePage(activeEditor);
-			PaletteView paletteView = (PaletteView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(PaletteView.ID);
-			if(paletteView != null) {
-				paletteView.partActivated(activeEditor);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see MultiPageEditorPart#pageChange(int)
-	 */
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-		// getActionBarContributor().setActivePage(getActiveEditor());
-		// refresh content depending on current page
-		currentPageChanged();
-	}
-
-	public void dispose() 
-	{
-        // signal that we have been disposed
-        // do this before anything else
-	    _isDisposed = true;
-	    _modelLoader.dispose();
-	    
-	    ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-				resourceChangeListener);
-
-		adapterFactory.dispose();
-
-		if (this.outlinePage != null) 
-			outlinePage.dispose();		
-		
-		if (sourcePage != null) 
-			sourcePage.dispose();
-		
-		if (sourceCommandStack != null)
-			sourceCommandStack.dispose();
-		
-		if (pageflowPage != null) 
-			pageflowPage.dispose();					
-		
-	    if (multiPageCommandStackListener != null)
-	    	multiPageCommandStackListener.dispose();	    
-	    
-		//do not call dispose on delegatingCommandStack.   source and multiPage are already disposed
-		
-		super.dispose();
-	}
-
-	/**
-	 * get the project of the faces config file that the editor is working on.
-	 * 
-	 * @return IProject
-	 */
-	public IProject getProject() {
-		if (currentProject == null) {
-			if (_modelLoader.getEdit() != null) {
-				IFile file = _modelLoader.getEdit().getFile();
-				if (file != null)
-					currentProject = file.getProject();
-			}
-		}
-		return currentProject;
-	}
-
-	public EditingDomain getEditingDomain() {
-		return editingDomain;
-	}
-
-	/**
-	 * Returns the <code>IContentOutlinePage</code> for this editor.
-	 * 
-	 * @return - the <code>IContentOutlinePage</code>
-	 */
-	protected IContentOutlinePage getOutlinePage() {
-		if (null == outlinePage) {
-			outlinePage = new MultiPageEditorOutlinePage();
-		}
-		return outlinePage;
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	public ISelection getSelection() {
-		return editorSelection;
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	public void setSelection(ISelection selection) {
-		editorSelection = selection;
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener
-					.selectionChanged(new SelectionChangedEvent(this, selection));
-		}
-	}
-
-	private void gotoMarker(IMarker marker) {
-		setActivePage(sourcePageId);
-		IDE.gotoMarker(this.sourcePage, marker);
-	}
-
-	/**
-	 * FIXME: this is used only for testing. Should isolate better
-	 * @return the action bar
-	 */
-	public FacesConfigActionBarContributor getActionBarContributor() {
-		return (FacesConfigActionBarContributor) getEditorSite()
-				.getActionBarContributor();
-	}
-
-	private IActionBars getActionBars() {
-		return getActionBarContributor().getActionBars();
-	}
-
-	public Object getSelectedPage() {
-		IFormPage page = getActivePageInstance();
-		if (page != null) 
-			return page;
-			
-		if (getActiveEditor() instanceof PageflowEditor)
-			return getActiveEditor();
-		
-		return null;
-	}
-
-	/**
-	 * Shows a dialog that asks if conflicting changes should be discarded.
-	 * @return the user's response.
-	 */
-	protected boolean handleDirtyConflict() {
-		return MessageDialog
-				.openQuestion(
-						getSite().getShell(),
-						EditorMessages.FacesConfigEditor_ErrorHandlingUndoConflicts_DialogTitle,
-						EditorMessages.FacesConfigEditor_ErrorHandlingUndoConflicts_DialogMessage);
-	}
-
-	/**
-	 * Handles what to do with changed resources on activation.
-	 * 
-	 * @generated
-	 */
-	protected void handleChangedResources() {
-		if (!changedResources.isEmpty()
-				&& (!isDirty() || handleDirtyConflict())) {
-			editingDomain.getCommandStack().flush();
-
-			for (Iterator i = changedResources.iterator(); i.hasNext();) {
-				Resource resource = (Resource) i.next();
-				if (resource.isLoaded()) {
-					resource.unload();
-					try {
-						resource.load(Collections.EMPTY_MAP);
-					} catch (IOException exception) {
-						EditorPlugin.getDefault().getLog().log(
-								new Status(IStatus.ERROR, EditorPlugin
-										.getPluginId(), IStatus.OK, exception
-										.getMessage() == null ? "" : exception //$NON-NLS-1$
-										.getMessage(), exception));
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * TODO this is used only for testing.  Should be able to remove if we
-	 * go to true automated UI testing
-	 * @param pageID
-	 */
-	public void setActiveEditorPage(String pageID) {
-		if (pageID.equals(PageflowEditor.PAGE_ID)) {
-			setActivePage(pageflowPageID);
-		} else if (pageID.equals(ManagedBeanPage.PAGE_ID)) {
-			setActivePage(managedBeanPageID);
-		} else if (pageID.equals(ComponentsPage.PAGE_ID)) {
-			setActivePage(componentsPageID);
-		} else if (pageID.equals(OthersPage.PAGE_ID)) {
-			setActivePage(othersPageID);
-		} else if (pageID.equals(SOURCE_PAGE_ID)) {
-			setActivePage(sourcePageId);			
-		}
-	}
-
-	private boolean matches(IEditorInput input) {
-		final IResource file = (IResource) input.getAdapter(IResource.class);
-		boolean hasWebFacet = false;
-		boolean hasJSFFacet = false;
-
-		if (file != null) {
-			final IProject project = file.getProject();
-
-			if (project != null) {
-				try {
-					final IFacetedProject facetedProject = ProjectFacetsManager
-							.create(project);
-
-					if (facetedProject != null) {
-						final Set facets = facetedProject.getProjectFacets();
-
-						for (final Iterator it = facets.iterator(); it
-								.hasNext();) {
-							final IProjectFacetVersion version = (IProjectFacetVersion) it
-									.next();
-
-							IProjectFacet facet = version.getProjectFacet();
-							if (IJSFCoreConstants.JSF_CORE_FACET_ID.equals(facet.getId())) {
-								hasJSFFacet = true;
-							} else if ("jst.web".equals(facet.getId())) { //$NON-NLS-1$
-								hasWebFacet = true;
-							}
-						}
-					}
-				} catch (CoreException ex) {
-					EditorPlugin.getDefault().getLog().log(
-							new Status(IStatus.ERROR, EditorPlugin
-									.getPluginId(), IStatus.OK,
-									ex.getMessage() == null ? "" : ex //$NON-NLS-1$
-											.getMessage(), ex));
-				}
-			}
-		}
-
-		return hasWebFacet && hasJSFFacet;
-	}
-	
-    /**
-     * DANGER!  This call is for testing only!  Should not be used,
-     * even internally, by production code.
-     * @param timeoutMs the time to wait in milliseconds
-     * @throws InterruptedException 
-     */	
-	public void doPageLoad(long timeoutMs) throws InterruptedException
-	{
-	    _modelLoader.waitForLoad(timeoutMs);
-	    _addPagesTask.doRun(_modelLoader.getEdit());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/IFacesConfigConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/IFacesConfigConstants.java
deleted file mode 100644
index c13cff1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/IFacesConfigConstants.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-/**
- * @author jchoi
- * @version
- */
-public interface IFacesConfigConstants {
-
-	/**
-	 * 
-	 */
-	public static final String FACES_CONFIG = "faces-config"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_PROPERTY = "managed-property"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String VALUE = "value"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String NULL_VALUE = "null-value"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MAP_ENTRIES = "map-entries"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MAP_ENTRY = "map-entry"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String LIST_ENTRIES = "list-entries"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String NAVIGATION_RULE = "navigation-rule"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String COMPONENT_SUPER_CLASS = "javax.faces.component.UIComponent"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String RENDER_KIT_SUPER_CLASS = "javax.faces.render.RenderKit"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String CONVERTER_INTERFACE = "javax.faces.convert.Converter"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String VALIDATOR_INTERFACE = "javax.faces.validator.Validator"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String RENDERER_SUPER_CLASS = "javax.faces.render.Renderer"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String ACTION_LISTENER_INTERFACE = "javax.faces.event.ActionListener"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String NAVIGATION_HANDLE_SUPER_CLASS = "javax.faces.application.NavigationHandler"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String PROPERTY_RESOLVER_SUPER_CLASS = "javax.faces.el.PropertyResolver"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String STATE_MANAGER_SUPER_CLASS = "javax.faces.application.StateManager"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String VARIABLE_RESOLVER_SUPER_CLASS = "javax.faces.el.VariableResolver"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String VIEW_HANDLER_SUPER_CLASS = "javax.faces.application.ViewHandler"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String APPLICATION_FACTORY_SUPER_CLASS = "javax.faces.application.ApplicationFactory"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String FACES_CONTEXT_FACTORY_SUPER_CLASS = "javax.faces.context.FacesContextFactory"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String LIFECYCLE_FACTORY_SUPER_CLASS = "javax.faces.lifecycle.LifecycleFactory"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String RENDER_KIT_FACTORY_SUPER_CLASS = "javax.faces.render.RenderKitFactory"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String PHASE_LISTENER_INTERFACE = "javax.faces.event.PhaseListener"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_APPLICATION = "application"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_SESSION = "session"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_REQUEST = "request"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String MANAGED_BEAN_SCOPE_NONE = "none"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/INestedActionContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/INestedActionContributor.java
deleted file mode 100644
index a36a2f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/INestedActionContributor.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-/**
- * The nested action contributor should be able to update its actions as
- * required.
- */
-public interface INestedActionContributor {
-	/**
-	 * Updated nested actions
-	 */
-	void update();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/ModelLoader.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/ModelLoader.java
deleted file mode 100644
index 417b949..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/ModelLoader.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigArtifactEdit;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Centralizes logic to load the faces config model off of the UI thread for
- * the FacesConfig Editor.
- * 
- * Also encapsulates the lifecycle for the instance of the faces artifact 
- * created for its editor.  All creation, access and destruction of the artifact
- * should be centralized through this class
- * 
- * @author cbateman
- *
- */
-class ModelLoader 
-{
-    private FacesConfigArtifactEdit     _edit;
-    private Job                         _loadModelJob;
-    private CountDownLatch              _modelLoaded = new CountDownLatch(1);    
-    
-    /**
-     * @return  the artifact edit or null if not loaded.  Should only be called
-     * after load() is called and has executed its callback 
-     */
-    public synchronized FacesConfigArtifactEdit getEdit() {
-        return _edit;
-    }
-
-    private synchronized void setEdit(FacesConfigArtifactEdit edit)
-    {
-        _edit = edit;
-    }
-    
-    void waitForLoad(long timeoutMs) throws InterruptedException
-    {
-        _modelLoaded.await(timeoutMs, TimeUnit.MILLISECONDS);
-    }
-    
-    /**
-     * Dispose of the model and any unfinished loading operations
-     * 
-     * Must be run on the UI thread.
-     */
-    public synchronized void dispose()
-    {
-        assertOnDisplayThread();
-       
-        // if the load model job has not completed, cancel it
-        if (_loadModelJob != null
-                && _loadModelJob.getResult() == null)
-        {
-            _loadModelJob.cancel();
-        }
-        
-        if (_edit != null)
-        {
-            _edit.dispose();
-            //System.out.println("FacesConfigEditor.dispose(): isDisposed == "+_edit.isDisposed());
-        }
-    }
-    
-    /**
-     * Load the model file located by path in project. Must be called from the UI thread.
-     * 
-     * Method does not block.
-     * 
-     * @param project
-     * @param path
-     * @param isWebProject 
-     * @param signalComplete to be asyncExec'd on the UI thread when the model is loaded
-     */
-    public void load(final IProject project, final IPath path, final boolean isWebProject, final ModelLoaderComplete signalComplete)
-    {
-        assertOnDisplayThread();
-        _loadModelJob = new ModelLoaderJob(project, path, isWebProject, signalComplete);
-        _loadModelJob.schedule();
-    }
-    
-    private class ModelLoaderJob extends Job
-    {
-        private final IProject                  _project;
-        private final IPath                     _path;
-        private final ModelLoaderComplete       _runnable;
-        private final boolean                   _isWebProject;
-
-        ModelLoaderJob(final IProject project, final IPath path, final boolean isWebProject, final ModelLoaderComplete signalComplete)
-        {
-            super(EditorMessages.ModelLoader_LoadingModelJobName);
-            _project = project;
-            _path = path;
-            _runnable = signalComplete;
-            _isWebProject = isWebProject;
-        }
-        
-        @Override
-        protected IStatus run(IProgressMonitor monitor) 
-        {
-            FacesConfigArtifactEdit artifactEdit = loadModel(_project, _path);
-            
-            // synchrnoize on the ModelLoader.  Ensure that any call to dispose()
-            // that occurs before we set the edit is done atomically.
-            synchronized(ModelLoader.this)
-            {
-                // only bother with this if the task hasn't been signalled for cancel
-                if (!monitor.isCanceled())
-                {
-                    setEdit(artifactEdit);
-                    
-                    _runnable.setFacesConfigArtifactEdit(artifactEdit);
-                    
-                    // finish as quickly possible; we are holding the ModelLoader
-                    // lock so we must ensure that we don't block.
-                    // NEVER USE syncExec here.
-                    PlatformUI.getWorkbench().getDisplay().asyncExec(_runnable);
-                }
-                // if we were cancelled, then dispose of the artifact edit
-                else
-                {
-                    if (artifactEdit != null)
-                    {
-                        artifactEdit.dispose();
-                    }
-                }
-            }
-            
-            // signal that we are done loading
-            _modelLoaded.countDown();
-            return Status.OK_STATUS;
-        }
-        
-        /**
-         * Loads the configuration model from the given path.
-         * 
-         */
-        private FacesConfigArtifactEdit loadModel(IProject project, IPath modelPath) 
-        {
-            if (_isWebProject) 
-            {
-                IFolder webContentFolder = WebrootUtil.getWebContentFolder(project);
-                Assert
-                        .isTrue(webContentFolder != null
-                                && webContentFolder.exists());
-
-                IPath relativePath = modelPath;
-                if (webContentFolder.getFullPath().isPrefixOf(modelPath)) {
-                    relativePath = modelPath.removeFirstSegments(webContentFolder
-                            .getFullPath().segmentCount());
-                }
-
-                
-                return FacesConfigArtifactEdit
-                        .getFacesConfigArtifactEditForWrite(project, relativePath
-                                .toString());
-            }
-            
-            return null;
-        }
-    }
-    
-    abstract static class ModelLoaderComplete implements Runnable
-    {
-        private FacesConfigArtifactEdit  _edit;
-        
-        private void setFacesConfigArtifactEdit(FacesConfigArtifactEdit  edit)
-        {
-            _edit = edit;
-        }
-        
-        public final void run() 
-        {
-            assertOnDisplayThread();
-            doRun(_edit);
-        }
-        
-        /**
-         * Called by the runnable.  Implementer should _not_ cache the edit variable
-         * edit may be null
-         * 
-         * @param edit
-         */
-        protected abstract void doRun(FacesConfigArtifactEdit edit);
-    }
-    
-    private static void assertOnDisplayThread()
-    {
-        if (Thread.currentThread() != PlatformUI.getWorkbench().getDisplay().getThread())
-        {
-            throw new IllegalStateException("ModelLoaderComplete must be called on the UI thread"); //$NON-NLS-1$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MultiPageEditorOutlinePage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MultiPageEditorOutlinePage.java
deleted file mode 100644
index d9110dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MultiPageEditorOutlinePage.java
+++ /dev/null
@@ -1,706 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.SubActionBars;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.IPage;
-import org.eclipse.ui.part.IPageBookViewPage;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.part.MessagePage;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * @author Xiao-guang Zhang
- * 
- * The outline page class for mulitPage Editorpart.
- */
-public class MultiPageEditorOutlinePage extends Page implements
-		IContentOutlinePage, SelectionListener {
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(MultiPageEditorOutlinePage.class);
-
-	/**
-	 * Selection change listeners.
-	 */
-	private ListenerList selectionChangedListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/** the pagebook */
-	private PageBook pageBook = null;
-
-	/**
-	 * Selection change listener to listen for page selection changes
-	 */
-	private ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener() {
-		public void selectionChanged(SelectionChangedEvent event) {
-			pageSelectionChanged(event);
-		}
-	};
-
-	/**
-	 * A data structure used to store the information about a single page within
-	 * a MultiPageEditorOutlinePage
-	 */
-	protected static class PageRec {
-
-		/**
-		 * The part including editorpart, or Control
-		 */
-		public IWorkbenchPart part;
-
-		/**
-		 * The page.
-		 */
-		public IPage page;
-
-		/**
-		 * The page's action bars
-		 */
-		public SubActionBars subActionBars;
-
-		/**
-		 * Creates a new page record initialized to the given part and page.
-		 * 
-		 * @param part
-		 * @param page
-		 */
-		public PageRec(IWorkbenchPart part, IPage page) {
-			this.part = part;
-			this.page = page;
-		}
-
-		/**
-		 * Disposes of this page record by <code>null</code>ing its fields.
-		 */
-		public void dispose() {
-			part = null;
-			page = null;
-		}
-	}
-
-	/**
-	 * The page record for the default page.
-	 */
-	private PageRec defaultPageRec;
-
-	/**
-	 * Map from parts to part records (key type: <code>IWorkbenchPart</code>;
-	 * value type: <code>PartRec</code>).
-	 */
-	private Map mapPartToRec = new HashMap();
-
-	/**
-	 * Map from pages to view sites Note that view sites were not added to page
-	 * recs to avoid breaking binary compatibility with previous builds
-	 */
-	private Map mapPageToSite = new HashMap();
-
-	/**
-	 * The page rec which provided the current page or <code>null</code>
-	 */
-	private PageRec activeRec;
-
-	/**
-	 * the container composite control of MutliPageEditorPart
-	 */
-	private CTabFolder tabFolder;
-
-	/**
-	 * Creates a new MultiPageEditorOutlinePage instance.
-	 * 
-	 * 
-	 */
-	public MultiPageEditorOutlinePage() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.Page#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		// pagebook
-		pageBook = new PageBook(parent, SWT.NONE);
-
-		// Create the default page rec.
-		IPage defaultPage = createDefaultPage(pageBook);
-		defaultPageRec = new PageRec(null, defaultPage);
-		preparePage(defaultPageRec);
-
-		// Show the default page
-		showPageRec(defaultPageRec);
-
-		// get the tab control and add the page selection listener.
-		if (getContainerForMultiPageEditorPart() != null) {
-			getContainerForMultiPageEditorPart().addSelectionListener(this);
-		}
-
-		// show the activate part page.
-		showBootstrapPart();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Page#dispose()
-	 */
-	public void dispose() {
-		// Deref all of the pages.
-		activeRec = null;
-		if (defaultPageRec != null) {
-			// check for null since the default page may not have
-			// been created (ex. perspective never visible)
-			defaultPageRec.page.dispose();
-			defaultPageRec = null;
-		}
-		Map clone = (Map) ((HashMap) mapPartToRec).clone();
-		Iterator iterator = clone.values().iterator();
-		while (iterator.hasNext()) {
-			PageRec rec = (PageRec) iterator.next();
-			removePage(rec);
-		}
-
-		// important: always call super implementation of dispose
-		super.dispose();
-	}
-
-	/**
-	 * Creates and returns the default page for this view.
-	 * 
-	 * @param book -
-	 *            the pagebook control
-	 * @return - the default page
-	 */
-	protected IPage createDefaultPage(PageBook book) {
-		// Message to show on the default page
-		String defaultText = EditorMessages.MultiPageEditorOutlinePage_noOutline;
-
-		MessagePage page = new MessagePage();
-		initPage(page);
-		page.createControl(book);
-		page.setMessage(defaultText);
-		return page;
-	}
-
-	/**
-	 * Prepares the page in the given page rec for use in this view.
-	 * 
-	 * @param rec -
-	 *            the page rec
-	 */
-	private void preparePage(PageRec rec) {
-		IPageSite site = null;
-
-		if (!doesPageExist(rec.page)) {
-			if (rec.page instanceof IPageBookViewPage) {
-				site = ((IPageBookViewPage) rec.page).getSite();
-			}
-			if (site == null) {
-				// We will create a site for our use
-				site = new SubPageSite(getSite());
-			}
-			mapPageToSite.put(rec.page, site);
-
-			rec.subActionBars = (SubActionBars) site.getActionBars();
-			// rec.subActionBars.addPropertyChangeListener(actionBarPropListener);
-			// for backward compability with IPage
-			rec.page.setActionBars(rec.subActionBars);
-
-		} else {
-			site = (IPageSite) mapPageToSite.get(rec.page);
-			rec.subActionBars = (SubActionBars) site.getActionBars();
-		}
-	}
-
-	/**
-	 * Returns the currently visible page for this view or <code>null</code>
-	 * if no page is currently visible.
-	 * 
-	 * @return the currently visible page
-	 */
-	public IPage getCurrentPage() {
-		if (activeRec == null)
-			return null;
-		return activeRec.page;
-	}
-
-	/**
-	 * Returns the view site for the given page of this view.
-	 * 
-	 * @param page
-	 *            the page
-	 * @return the corresponding site, or <code>null</code> if not found
-	 */
-	protected SubPageSite getPageSite(IPage page) {
-		return (SubPageSite) mapPageToSite.get(page);
-	}
-
-	/**
-	 * Shows page contained in the given page record in this view. The page
-	 * record must be one from this pagebook view.
-	 * <p>
-	 * The <code>PageBookView</code> implementation of this method asks the
-	 * pagebook control to show the given page's control, and records that the
-	 * given page is now current. Subclasses may extend.
-	 * </p>
-	 * 
-	 * @param pageRec
-	 *            the page record containing the page to show
-	 */
-	protected void showPageRec(PageRec pageRec) {
-		IPageSite pageSite = getPageSite(pageRec.page);
-		ISelectionProvider provider = pageSite.getSelectionProvider();
-		if (provider == null && (pageRec.page instanceof IContentOutlinePage)) {
-			// This means that the page did not set a provider during its
-			// initialization
-			// so for backward compatibility we will set the page itself as the
-			// provider.
-			pageSite.setSelectionProvider((IContentOutlinePage) pageRec.page);
-		}
-
-		// If already showing do nothing
-		if (activeRec == pageRec) {
-			return;
-		}
-		// If the page is the same, just set activeRec to pageRec
-		if (activeRec != null && pageRec != null
-				&& activeRec.page == pageRec.page) {
-			activeRec = pageRec;
-			return;
-		}
-
-		// Hide old page.
-		if (activeRec != null) {
-			activeRec.subActionBars.deactivate();
-			// remove our selection listener
-			provider = ((SubPageSite) mapPageToSite.get(activeRec.page))
-					.getSelectionProvider();
-			if (provider != null) {
-				provider
-						.removeSelectionChangedListener(selectionChangedListener);
-			}
-		}
-		// Show new page.
-		activeRec = pageRec;
-		Control pageControl = activeRec.page.getControl();
-		if (pageControl != null && !pageControl.isDisposed()) {
-			// Verify that the page control is not disposed
-			// If we are closing, it may have already been disposed
-			pageBook.showPage(pageControl);
-			activeRec.subActionBars.activate();
-			refreshGlobalActionHandlers();
-			// add our selection listener
-			provider = ((SubPageSite) mapPageToSite.get(activeRec.page))
-					.getSelectionProvider();
-			if (provider != null) {
-				provider.addSelectionChangedListener(selectionChangedListener);
-			}
-			// Update action bars.
-			getSite().getActionBars().updateActionBars();
-		}
-	}
-
-	/**
-	 * Refreshes the global actions for the active page.
-	 */
-	private void refreshGlobalActionHandlers() {
-		// Clear old actions.
-		IActionBars bars = getSite().getActionBars();
-		bars.clearGlobalActionHandlers();
-
-		// Set new actions.
-		Map newActionHandlers = activeRec.subActionBars
-				.getGlobalActionHandlers();
-		if (newActionHandlers != null) {
-			Set keys = newActionHandlers.entrySet();
-			Iterator iter = keys.iterator();
-			while (iter.hasNext()) {
-				Map.Entry entry = (Map.Entry) iter.next();
-				bars.setGlobalActionHandler((String) entry.getKey(),
-						(IAction) entry.getValue());
-			}
-		}
-	}
-
-	/**
-	 * Creates a page for a given part. Adds it to the pagebook but does not
-	 * show it.
-	 * 
-	 * @param part
-	 *            The part we are making a page for.
-	 * @return IWorkbenchPart
-	 */
-	private PageRec createPage(IWorkbenchPart part) {
-		PageRec rec = doCreatePage(part);
-		if (rec != null) {
-			mapPartToRec.put(part, rec);
-			preparePage(rec);
-		}
-		return rec;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on PageBookView.
-	 */
-	private PageRec doCreatePage(IWorkbenchPart part) {
-		// Try to get an outline page.
-		Object obj = part.getAdapter(IContentOutlinePage.class);
-		if (obj instanceof IContentOutlinePage) {
-			IContentOutlinePage page = (IContentOutlinePage) obj;
-			if (page instanceof IPageBookViewPage) {
-				initPage((IPageBookViewPage) page);
-			}
-			page.createControl(getPageBook());
-			return new PageRec(part, page);
-		}
-		// There is no content outline
-		return null;
-	}
-
-	/**
-	 * Returns the pagebook control for this view.
-	 * 
-	 * @return the pagebook control, or <code>null</code> if not initialized
-	 */
-	protected PageBook getPageBook() {
-		return pageBook;
-	}
-
-	/**
-	 * Returns the page record for the given part.
-	 * 
-	 * @param part
-	 *            the part
-	 * @return the corresponding page record, or <code>null</code> if not
-	 *         found
-	 */
-	protected PageRec getPageRec(Object part) {
-		return (PageRec) mapPartToRec.get(part);
-	}
-
-	/**
-	 * Initializes the given page with a page site.
-	 * <p>
-	 * Subclasses should call this method after the page is created but before
-	 * creating its controls.
-	 * </p>
-	 * <p>
-	 * Subclasses may override
-	 * </p>
-	 * 
-	 * @param page
-	 *            The page to initialize
-	 */
-	protected void initPage(IPageBookViewPage page) {
-		try {
-			page.init(new SubPageSite(getSite()));
-		} catch (PartInitException e) {
-			log.error(e.getMessage());
-		}
-	}
-
-	/**
-	 * Shows a page for the active workbench part.
-	 */
-	private void showBootstrapPart() {
-		IWorkbenchPart part = getBootstrapPart();
-		if (part != null) {
-			partActivated(part);
-		}
-	}
-
-	/**
-	 * Returns the active, important workbench part for this view.
-	 * 
-	 * @return the active important part, or <code>null</code> if none
-	 */
-	private IWorkbenchPart getBootstrapPart() {
-		IWorkbenchPage page = getSite().getPage();
-		if (page != null
-				&& page.getActiveEditor() instanceof MultiPageEditorPart) {
-			// get active editor of mutli-page editor.
-			return (IWorkbenchPart) page.getActiveEditor().getAdapter(
-					IEditorPart.class);
-		}
-        return null;
-	}
-
-	/**
-	 * This method shows the page when the given part is activated. Subclasses
-	 * may extend.
-	 */
-	private void partActivated(IWorkbenchPart part) {
-		// Is this an important part? If not just return.
-		if (!isImportant(part)) {
-			return;
-		}
-
-		// Create a page for the part.
-		PageRec rec = getPageRec(part);
-		if (rec == null) {
-			rec = createPage(part);
-		}
-
-		// Show the page.
-		if (rec != null) {
-			showPageRec(rec);
-		} else {
-			showPageRec(defaultPageRec);
-		}
-	}
-
-	/**
-	 * Returns true if the page has already been created.
-	 * 
-	 * @param page
-	 *            the page to test
-	 * @return true if this page has already been created.
-	 */
-	private boolean doesPageExist(IPage page) {
-		return mapPageToSite.containsKey(page);
-	}
-
-	/**
-	 * Returns whether the given part should be added to this view.
-	 * 
-	 * @param part
-	 *            the input part
-	 * @return <code>true</code> if the part is relevant, and
-	 *         <code>false</code> otherwise
-	 */
-	protected boolean isImportant(IWorkbenchPart part) {
-		// We only care about editors
-		return (part instanceof IEditorPart);
-	}
-
-	/**
-	 * get the composite control (Container) of source MultiPageEditorPart
-	 * 
-	 * @return - the composite control (Container)
-	 */
-	private CTabFolder getContainerForMultiPageEditorPart() {
-		if (null == tabFolder) {
-			tabFolder = ((CTabFolder) (getSite().getPage().getActiveEditor()
-					.getAdapter(CTabFolder.class)));
-		}
-		return tabFolder;
-	}
-
-	/**
-	 * Removes a page record. If it is the last reference to the page dispose of
-	 * it - otherwise just decrement the reference count.
-	 * 
-	 * @param rec
-	 */
-	private void removePage(PageRec rec) {
-		mapPartToRec.remove(rec.part);
-		IPageSite site = (IPageSite) mapPageToSite.remove(rec.page);
-
-		if (rec.subActionBars != null) {
-			rec.subActionBars.dispose();
-		}
-
-		Control control = rec.page.getControl();
-		if (control != null && !control.isDisposed()) {
-			// Dispose the page's control so pages don't have to do this in
-			// their
-			// dispose method.
-			// The page's control is a child of this view's control so if this
-			// view
-			// is closed, the page's control will already be disposed.
-			control.dispose();
-		}
-
-		if (site instanceof SubPageSite) {
-			((SubPageSite) site).dispose();
-		}
-
-		// free the page
-		doDestroyPage(rec.part, rec);
-	}
-
-	/**
-	 * Destroys a page in the pagebook for a particular part.
-	 * 
-	 * @param part
-	 *            the input part
-	 * @param rec
-	 *            a page record for the part
-	 */
-	protected void doDestroyPage(IWorkbenchPart part, PageRec rec) {
-		IContentOutlinePage page = (IContentOutlinePage) rec.page;
-		page.dispose();
-		rec.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.Page#getControl()
-	 */
-	public Control getControl() {
-		return pageBook;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.Page#setFocus()
-	 */
-	public void setFocus() {
-		if (getControl() != null) {
-			getControl().setFocus();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		// get the selection provider from the current page
-		IPage currentPage = getCurrentPage();
-		// during workbench startup we may be in a state when
-		// there is no current page
-		if (currentPage == null) {
-			return StructuredSelection.EMPTY;
-		}
-		IPageSite site = getPageSite(currentPage);
-		if (site == null) {
-			return StructuredSelection.EMPTY;
-		}
-		ISelectionProvider selProvider = site.getSelectionProvider();
-		if (selProvider != null) {
-			return selProvider.getSelection();
-		}
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		// get the selection provider from the current page
-		IPage currentPage = getCurrentPage();
-		// during workbench startup we may be in a state when
-		// there is no current page
-		if (currentPage == null) {
-			return;
-		}
-		IPageSite site = getPageSite(currentPage);
-		if (site == null) {
-			return;
-		}
-		ISelectionProvider selProvider = site.getSelectionProvider();
-		// and set its selection
-		if (selProvider != null) {
-			selProvider.setSelection(selection);
-		}
-	}
-
-	/**
-	 * The selection has changed. Process the event.
-	 * 
-	 * @param event
-	 */
-	public void pageSelectionChanged(final SelectionChangedEvent event) {
-		// pass on the notification to listeners
-		Object[] listeners = selectionChangedListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-			SafeRunner.run(new SafeRunnable() {
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see SelectionListener#widgetSelected(SelectionEvent)
-	 */
-	public void widgetSelected(SelectionEvent e) {
-		EditorPart part = (EditorPart) ((CTabItem) e.item).getData();
-
-		if (part != null) {
-			partActivated(part);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see SelectionListener#widgetDefaultSelected(SelectionEvent)
-	 */
-	public void widgetDefaultSelected(SelectionEvent e) {
-        // do nothing: no handling of default selected event
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MyEditingDomainActionContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MyEditingDomainActionContributor.java
deleted file mode 100644
index 6c2559a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/MyEditingDomainActionContributor.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * The action contributor for form based page.
- * 
- * @author hmeng
- * 
- */
-public class MyEditingDomainActionContributor extends
-		EditingDomainActionBarContributor implements INestedActionContributor {
-	/**
-	 * Default constructor
-	 */
-	public MyEditingDomainActionContributor() {
-		super();
-	}
-
-	public void setActiveEditor(IEditorPart part) {
-		if (getActiveEditor() != null) {
-			deactivate();
-		}
-		super.setActiveEditor(part);
-		IActionBars actionBars = getActionBars();
-		actionBars.clearGlobalActionHandlers();
-		if (part instanceof IEditingDomainProvider) {
-			actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(),
-					deleteAction);
-			actionBars.setGlobalActionHandler(ActionFactory.UNDO.getId(),
-					undoAction);
-			actionBars.setGlobalActionHandler(ActionFactory.REDO.getId(),
-					redoAction);
-			// actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(),
-			// cutAction);
-			// actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(),
-			// copyAction);
-			// actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(),
-			// pasteAction);
-			activate();
-		}
-	}
-
-	public void update() {
-		if (getActiveEditor() instanceof IEditingDomainProvider) {
-			super.update();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/SubPageSite.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/SubPageSite.java
deleted file mode 100644
index 9b459e8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/SubPageSite.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.SubActionBars;
-import org.eclipse.ui.part.IPageSite;
-
-/**
- * 
- * This implementation of <code>IPageSite</code> provides a site for a sub
- * page within a <code>Page</code>. Most methods are forwarded to the parent
- * page's site.
- * 
- * @author Xiao-guang Zhang
- */
-public class SubPageSite implements IPageSite {
-
-	/**
-	 * The "parent" Page site
-	 */
-	private IPageSite parentSite;
-
-	/**
-	 * A selection provider set by the page. Value is <code>null</code> until
-	 * set.
-	 */
-	private ISelectionProvider selectionProvider;
-
-	/**
-	 * The action bars for this site
-	 */
-	private SubActionBars subActionBars;
-
-	/**
-	 * The list of menu extender for each registered menu.
-	 */
-//	private ArrayList menuExtenders;
-
-	/**
-	 * Creates a new sub page site of the given parent page site.
-	 * 
-	 * @param parentSite
-	 *            the parent view site
-	 */
-	public SubPageSite(IPageSite parentSite) {
-		Assert.isNotNull(parentSite);
-		this.parentSite = parentSite;
-		subActionBars = new SubActionBars(this.parentSite.getActionBars());
-	}
-
-	/**
-	 * Disposes of the menu extender contributions.
-	 */
-	protected void dispose() {
-		// if (menuExtenders != null) {
-		// for (int i = 0; i < menuExtenders.size(); i++) {
-		// ((PopupMenuExtender) menuExtenders.get(i)).dispose();
-		// }
-		// menuExtenders = null;
-		//		}
-		subActionBars.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IPageSite#registerContextMenu(java.lang.String,
-	 *      org.eclipse.jface.action.MenuManager,
-	 *      org.eclipse.jface.viewers.ISelectionProvider)
-	 */
-	public void registerContextMenu(String menuId, MenuManager menuManager,
-			ISelectionProvider selectionProvider1) {
-
-		parentSite.registerContextMenu(menuId, menuManager, selectionProvider1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.IPageSite#getActionBars()
-	 */
-	public IActionBars getActionBars() {
-		return subActionBars;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchSite#getPage()
-	 */
-	public IWorkbenchPage getPage() {
-		return parentSite.getPage();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchSite#getSelectionProvider()
-	 */
-	public ISelectionProvider getSelectionProvider() {
-		return selectionProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchSite#getShell()
-	 */
-	public Shell getShell() {
-		return parentSite.getShell();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchSite#getWorkbenchWindow()
-	 */
-	public IWorkbenchWindow getWorkbenchWindow() {
-		return parentSite.getWorkbenchWindow();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchSite#setSelectionProvider(org.eclipse.jface.viewers.ISelectionProvider)
-	 */
-	public void setSelectionProvider(ISelectionProvider provider) {
-		selectionProvider = provider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return parentSite.getAdapter(adapter);
-	}
-
-	public Object getService(Class api) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public boolean hasService(Class api) {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditAttributeDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditAttributeDialog.java
deleted file mode 100644
index 5017085..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditAttributeDialog.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * The dialog is for adding and editing attribute.
- * 
- * @author sfshi
- * 
- */
-public class AddEditAttributeDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private StringDialogField attributeNameField;
-
-	private ClassButtonDialogField attributeClassField;
-
-	private StringDialogField defaultValueField;
-
-	private StringDialogField suggestedValueField;
-
-	private IProject project;
-
-	private String attributeName;
-
-	private String attributeClass;
-
-	private String defaultValue;
-
-	private String suggestedValue;
-
-	private boolean isNew;
-
-	/**
-	 * @param parentShell
-	 * @param isNew
-	 */
-	public AddEditAttributeDialog(Shell parentShell, boolean isNew) {
-		super(parentShell);
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param attributeName
-	 * @param attributeClass
-	 * @param defaultValue
-	 * @param suggestedValue
-	 */
-	public AddEditAttributeDialog(Shell parentShell, String attributeName,
-			String attributeClass, String defaultValue, String suggestedValue) {
-		super(parentShell);
-		this.attributeName = attributeName;
-		this.attributeClass = attributeClass;
-		this.defaultValue = defaultValue;
-		this.suggestedValue = suggestedValue;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.AttributeSection_Dialog_Title_Add);
-		else
-			newShell
-					.setText(EditorMessages.AttributeSection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem
-				.setText(EditorMessages.AttributeSection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		attributeNameField = new StringDialogField();
-//		attributeNameField.setRequired(true);
-		attributeNameField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_AttributeName);
-
-		attributeClassField = new ClassButtonDialogField(getProject());
-//		attributeClassField.setRequired(true);
-		attributeClassField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_AttributeClass);
-
-		attributeClassField.setAutoOpenResource(false);
-
-		defaultValueField = new StringDialogField();
-		defaultValueField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_DefaultValue);
-
-		suggestedValueField = new StringDialogField();
-		suggestedValueField
-				.setLabelText(EditorMessages.AttributeSection_Dialog_SuggestedValue);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		attributeNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		attributeClassField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		defaultValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		suggestedValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(attributeClassField.getTextControl(
-				null, composite));
-
-		// set the initial value for these fields.
-		attributeNameField.setText(attributeName);
-		attributeClassField.setText(attributeClass);
-		defaultValueField.setText(defaultValue);
-		suggestedValueField.setText(suggestedValue);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	private IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-		attributeName = attributeNameField.getText();
-		attributeClass = attributeClassField.getText();
-		defaultValue = defaultValueField.getText();
-		suggestedValue = suggestedValueField.getText();
-
-		super.okPressed();
-	}
-
-	/**
-	 * @return the attribute class
-	 */
-	public String getAttributeClass() {
-		return attributeClass;
-	}
-
-	/**
-	 * @param attributeClass
-	 */
-	public void setAttributeClass(String attributeClass) {
-		this.attributeClass = attributeClass;
-	}
-
-	/**
-	 * @return the attribute name
-	 */
-	public String getAttributeName() {
-		return attributeName;
-	}
-
-	/**
-	 * @param attributeName
-	 */
-	public void setAttributeName(String attributeName) {
-		this.attributeName = attributeName;
-	}
-
-	/**
-	 * @return the default value
-	 */
-	public String getDefaultValue() {
-		return defaultValue;
-	}
-
-	/**
-	 * @param defaultValue
-	 */
-	public void setDefaultValue(String defaultValue) {
-		this.defaultValue = defaultValue;
-	}
-
-	/**
-	 * @return the suggested value
-	 */
-	public String getSuggestedValue() {
-		return suggestedValue;
-	}
-
-	/**
-	 * @param suggestedValue
-	 */
-	public void setSuggestedValue(String suggestedValue) {
-		this.suggestedValue = suggestedValue;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditFacetDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditFacetDialog.java
deleted file mode 100644
index d0df52d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditFacetDialog.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * The dialog is for adding and editing a facet.
- * 
- * @author sfshi
- * 
- */
-public class AddEditFacetDialog extends Dialog {
-
-	private StringDialogField facetNameField;
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private boolean isNew;
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private String facetName;
-
-	private String displayName;
-
-	private String description;
-
-	/**
-	 * Constructor of this dialog, could be used for adding and editing, usually
-	 * it is used for adding;
-	 * 
-	 * @param parentShell
-	 * @param isNew
-	 *            whether this dialog is used for create a new facet or not;
-	 */
-	public AddEditFacetDialog(Shell parentShell, boolean isNew) {
-		super(parentShell);
-		this.isNew = isNew;
-	}
-
-	/**
-	 * Usually this contructor is used for editing a facet, passing the original
-	 * values of facet here.
-	 * 
-	 * @param parentShell
-	 * @param facetName
-	 *            the original text value of facet-name element;
-	 * @param displayName
-	 *            the original text value of display-name element;
-	 * @param description
-	 *            the original text value of description element;
-	 */
-	public AddEditFacetDialog(Shell parentShell, String facetName,
-			String displayName, String description) {
-		super(parentShell);
-		this.facetName = facetName;
-		this.displayName = displayName;
-		this.description = description;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.FacetSection_Dialog_Title_Add);
-		else
-			newShell.setText(EditorMessages.FacetSection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem.setText(EditorMessages.FacetSection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		facetNameField = new StringDialogField();
-//		facetNameField.setRequired(true);
-		facetNameField
-				.setLabelText(EditorMessages.FacetSection_Dialog_FacetName);
-
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.FacetSection_Dialog_DisplayName);
-
-		descriptionField = new StringDialogField();
-		descriptionField
-				.setLabelText(EditorMessages.FacetSection_Dialog_Description);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		facetNameField.doFillIntoGrid(null, composite, numberOfColumns);
-		displayNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		descriptionField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(facetNameField.getTextControl(null,
-				composite));
-
-		// set the initial value for these fields.
-		facetNameField.setText(facetName);
-		displayNameField.setText(displayName);
-		descriptionField.setText(description);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	protected void okPressed() {
-		facetName = facetNameField.getText();
-		displayName = displayNameField.getText();
-		description = descriptionField.getText();
-		super.okPressed();
-	}
-
-	/**
-	 * @return the description
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/**
-	 * @return the display name
-	 */
-	public String getDisplayName() {
-		return displayName;
-	}
-
-	/**
-	 * @return the facet name
-	 */
-	public String getFacetName() {
-		return facetName;
-	}
-
-	/**
-	 * @param description
-	 */
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	/**
-	 * @param displayName
-	 */
-	public void setDisplayName(String displayName) {
-		this.displayName = displayName;
-	}
-
-	/**
-	 * @param facetName
-	 */
-	public void setFacetName(String facetName) {
-		this.facetName = facetName;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditManagedPropertyDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditManagedPropertyDialog.java
deleted file mode 100644
index b54adc4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditManagedPropertyDialog.java
+++ /dev/null
@@ -1,530 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaBeanProperty;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaBeanUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaClassUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The dialog is for adding and editing managed property.
- * 
- * @author sfshi
- * 
- */
-public class AddEditManagedPropertyDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private static final int DEFAULT_CONTROL_WIDTH = 200;
-
-	private ComboDialogField nameField;
-
-	private ClassButtonDialogField classField;
-
-	private ComboDialogField valueTypeField;
-
-	private StringButtonDialogField valueField;
-
-	private IProject project;
-
-	private String propertyName;
-
-	private String propertyClass;
-
-	private String valueType;
-
-	/**
-	 * the value could be a string, or instance of <code>NullValueType</code>,
-	 * <code>MapEntriesType</code> and <code>ListEntriesType</code>.
-	 */
-	private Object valueObject;
-
-	private ManagedBeanType managedBean;
-
-	/**
-	 * the list of this bean properties.
-	 */
-	private List beanPropertyList;
-
-	/**
-	 * the managed-property object that is editing, but it will be read-only.
-	 */
-	private ManagedPropertyType managedProperty;
-
-	// private FormToolkit toolkit;
-
-	private Composite parent;
-
-	private static final String[] valueTypes = { IFacesConfigConstants.VALUE,
-			IFacesConfigConstants.NULL_VALUE,
-			IFacesConfigConstants.MAP_ENTRIES,
-			IFacesConfigConstants.LIST_ENTRIES };
-
-	private boolean isNew;
-
-	private AbstractFacesConfigSection section;
-
-	/**
-	 * constructor for adding a managed property.
-	 * 
-	 * @param parentShell
-	 * @param managedBean
-	 * @param section 
-	 */
-	public AddEditManagedPropertyDialog(Shell parentShell,
-			ManagedBeanType managedBean, AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.isNew = true;
-		this.managedBean = managedBean;
-		this.section = section;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param managedProperty
-	 * @param section
-	 */
-	public AddEditManagedPropertyDialog(Shell parentShell,
-			ManagedPropertyType managedProperty, AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.isNew = false;
-		this.managedProperty = managedProperty;
-		this.managedBean = (ManagedBeanType) managedProperty.eContainer();
-		this.section = section;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.AddEditManagedPropertyDialog_Add);
-		else
-			newShell.setText(EditorMessages.AddEditManagedPropertyDialog_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent_) {
-		Composite container = new Composite(parent_, SWT.FILL);
-		this.parent = container;
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		nameField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY
-				| SWT.BORDER);
-		nameField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_PropertyName);
-
-		int propertyCount = 0;
-		beanPropertyList = getBeanPropertyList(managedBean);
-		if (beanPropertyList != null)
-			propertyCount = beanPropertyList.size();
-
-		if (propertyCount > 0) {
-			String[] propertyNames = new String[propertyCount];
-
-			for (int i = 0; i < propertyCount; i++) {
-				JavaBeanProperty property = (JavaBeanProperty) beanPropertyList
-						.get(i);
-				propertyNames[i] = property.getName();
-			}
-			nameField.setItems(propertyNames);
-		}
-
-		nameField.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-			public void dialogFieldApplied(DialogField field) {
-				handleNameSelection(((ComboDialogField) field).getText());
-			}
-		});
-
-		classField = new ClassButtonDialogField(null);
-		classField.setProject(getProject());
-		classField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_PropertyClass);
-
-		valueTypeField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY
-				| SWT.BORDER);
-		valueTypeField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_ValueType);
-
-		valueTypeField.setItems(valueTypes);
-		valueTypeField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						updateValueStatus();
-					}
-				});
-
-		valueField = new StringButtonDialogField(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				handleChangeValue(valueTypeField.getText(),
-						((StringButtonDialogField) field).getText());
-			}
-
-		});
-
-		valueField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_Value);
-		valueField.setButtonLabel(EditorMessages.UI_Button_Edit_more);
-
-		valueField.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-			public void dialogFieldApplied(DialogField field) {
-				valueObject = ((StringButtonDialogField) field).getText();
-
-			}
-		});
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(data);
-
-		int numberOfColumns = 5;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		container.setLayout(gl);
-
-		nameField.doFillIntoGrid(null, container, numberOfColumns);
-		LayoutUtil.setWidthHint(nameField.getComboControl(null, container),
-				DEFAULT_CONTROL_WIDTH);
-
-		classField.doFillIntoGrid(null, container, numberOfColumns - 1);
-		data = new GridData(SWT.FILL, SWT.CENTER, false, false);
-		data.horizontalSpan = 2;
-		classField.getChangeControl(null, container).setLayoutData(data);
-		LayoutUtil.setWidthHint(classField.getTextControl(null, container),
-				DEFAULT_CONTROL_WIDTH);
-
-		valueTypeField.doFillIntoGrid(null, container, numberOfColumns);
-
-		valueField.doFillIntoGrid(null, container, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(classField.getTextControl(null,
-				container));
-
-		valueTypeField.selectItem(0);
-
-		if (!isNew && managedProperty != null) {
-			initFields();
-		}
-
-		return container;
-	}
-
-	private void initFields() {
-
-		if (managedProperty.getPropertyName() != null)
-			nameField.setText(managedProperty.getPropertyName()
-					.getTextContent());
-
-		if (managedProperty.getPropertyClass() != null)
-			classField.setText(managedProperty.getPropertyClass()
-					.getTextContent());
-
-		if (managedProperty.getValue() != null) {
-			valueTypeField.setText(valueTypes[0]);
-			valueField.setText(managedProperty.getValue().getTextContent());
-		} else if (managedProperty.getNullValue() != null)
-			valueTypeField.setText(valueTypes[1]);
-		else if (managedProperty.getMapEntries() != null)
-			valueTypeField.setText(valueTypes[2]);
-		else if (managedProperty.getListEntries() != null)
-			valueTypeField.setText(valueTypes[3]);
-		else
-			valueTypeField.setText(valueTypes[0]);
-		updateValueStatus();
-	}
-
-	/**
-	 * @param text
-	 */
-	protected void handleNameSelection(String text) {
-		int propertyCount = 0;
-		if (beanPropertyList != null)
-			propertyCount = beanPropertyList.size();
-
-		if (propertyCount > 0) {
-			for (int i = 0; i < propertyCount; i++) {
-				JavaBeanProperty property = (JavaBeanProperty) beanPropertyList
-						.get(i);
-
-				if (property.getName().equals(text.trim())) {
-					classField.setText(property.getQualifiedType());
-					break;
-				}
-			}
-		}
-
-	}
-
-	private void updateValueStatus() {
-		if (valueField == null) {
-			return;
-		}
-		valueObject = null;
-		if (valueTypeField.getText().equalsIgnoreCase(
-				IFacesConfigConstants.NULL_VALUE)) {
-			valueField.setEnabled(false);
-			valueObject = FacesConfigFactory.eINSTANCE.createNullValueType();
-		} else if (valueTypeField.getText().equalsIgnoreCase(
-				IFacesConfigConstants.MAP_ENTRIES)
-				|| valueTypeField.getText().equalsIgnoreCase(
-						IFacesConfigConstants.LIST_ENTRIES)) {
-			valueField.getTextControl(null, parent).setEditable(false);
-			valueField.setEnabled(true);
-		} else {
-			
-			valueObject = valueField.getText(); //Bug 173831
-			valueField.getTextControl(null, parent).setEditable(true);
-			valueField.setEnabled(true);
-		}
-	}
-
-	/**
-	 * @param valueType_ 
-	 * @param value 
-	 */
-	protected void handleChangeValue(String valueType_, String value) {
-		if (valueType_.equalsIgnoreCase(IFacesConfigConstants.VALUE)) {
-			handleChangeLongStringValue(value);
-		} else if (valueType_
-				.equalsIgnoreCase(IFacesConfigConstants.MAP_ENTRIES)) {
-			handleChangeMapEntries();
-		} else if (valueType_
-				.equalsIgnoreCase(IFacesConfigConstants.LIST_ENTRIES)) {
-			handleChangeListEntries();
-		}
-	}
-
-	/**
-	 * @param textControl
-	 */
-	private void handleChangeLongStringValue(String value) {
-		EditValueDialog valueDialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), value);
-		if (valueDialog.open() == Window.OK) {
-			valueField.setText((String) valueDialog.getResultData());
-			valueObject = valueDialog.getResultData();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void handleChangeMapEntries() {
-
-		MapEntriesType mapEntries;
-
-		if (valueObject instanceof MapEntriesType)
-			mapEntries = (MapEntriesType) valueObject;
-		else if (isNew || managedProperty.getMapEntries() == null) {
-			mapEntries = FacesConfigFactory.eINSTANCE.createMapEntriesType();
-		} else {
-			mapEntries = EcoreUtil.copy(managedProperty
-					.getMapEntries());
-		}
-
-		EditMapEntriesDialog dialog = new EditMapEntriesDialog(EditorPlugin
-				.getActiveShell(), mapEntries, section);
-		if (dialog.open() == Dialog.OK) {
-			valueObject = dialog.getMapEntries();
-		} else {
-			//user cancel the dialog, then restore.
-			if (!isNew && managedProperty.getMapEntries() != null)
-				valueObject = EcoreUtil.copy(managedProperty
-						.getMapEntries());
-			// else
-			//				valueObject = null;
-		}
-	}
-
-	private void handleChangeListEntries() {
-		ListEntriesType listEntries;
-
-		if (valueObject instanceof ListEntriesType)
-			listEntries = (ListEntriesType) valueObject;
-		else if (isNew || managedProperty.getListEntries() == null) {
-			listEntries = FacesConfigFactory.eINSTANCE.createListEntriesType();
-		} else {
-			listEntries = EcoreUtil.copy(managedProperty
-					.getListEntries());
-		}
-
-		EditListEntriesDialog dialog = new EditListEntriesDialog(EditorPlugin
-				.getActiveShell(), listEntries, section);
-		if (dialog.open() == Dialog.OK) {
-			valueObject = dialog.getListEntries();
-		} else {
-			//user cancel the dialog, then restore.
-			if (!isNew && managedProperty.getListEntries() != null)
-				valueObject = EcoreUtil.copy(managedProperty
-						.getListEntries());
-			// else
-			// valueObject = null;
-		}
-	}
-
-	/**
-	 * Get a list of JavaBeanProperty that from the managed bean class.
-	 * 
-	 * @return
-	 */
-	private List getBeanPropertyList(ManagedBeanType managedBean_) {
-		if (managedBean_.getManagedBeanClass() == null)
-			return null;
-		String beanClassName = managedBean_.getManagedBeanClass()
-				.getTextContent();
-		IType classType = JavaClassUtils.getType(getProject(), beanClassName);
-		if (classType == null) {
-			return null;
-		}
-		List list = new ArrayList();
-		JavaBeanProperty[] properties = JavaBeanUtils
-				.getBeanProperties(classType);
-		if (properties != null) {
-			for (int i = 0; i < properties.length; i++) {
-				list.add(properties[i]);
-			}
-		}
-		return list;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * @return the project
-	 */
-	public IProject getProject() {
-		if (project == null) {
-			project = (IProject) section.getPage().getEditor().getAdapter(
-					IProject.class);
-		}
-		return project;
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-		propertyName = nameField.getText();
-		propertyClass = classField.getText();
-		valueType = valueTypeField.getText();
-
-		super.okPressed();
-	}
-
-	/**
-	 * @return the property class
-	 */
-	public String getPropertyClass() {
-		return propertyClass;
-	}
-
-	/**
-	 * @param attributeClass
-	 */
-	public void setAttributeClass(String attributeClass) {
-		this.propertyClass = attributeClass;
-	}
-
-	/**
-	 * @return the property name
-	 */
-	public String getPropertyName() {
-		return propertyName;
-	}
-
-	/**
-	 * @param attributeName
-	 */
-	public void setAttributeName(String attributeName) {
-		this.propertyName = attributeName;
-	}
-
-	/**
-	 * @return the value type
-	 */
-	public String getValueType() {
-		return valueType;
-	}
-
-	/**
-	 * @param defaultValue
-	 */
-	public void setValueType(String defaultValue) {
-		this.valueType = defaultValue;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-	/**
-	 * @return the value object
-	 */
-	public Object getValueObject() {
-		return valueObject;
-	}
-
-	/**
-	 * @param valueObject
-	 */
-	public void setValueObject(Object valueObject) {
-		this.valueObject = valueObject;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditMapEntryDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditMapEntryDialog.java
deleted file mode 100644
index fb254fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditMapEntryDialog.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The dialog is for adding and editing map-entry.
- * 
- * @author sfshi
- * 
- */
-public class AddEditMapEntryDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private static final int VALUE_DEFAULT_LINENUMS = 10;
-
-	private boolean isNew;
-
-	private StringDialogField keyField;
-
-	private Button nullValueTypeButton;
-
-	private StringDialogField valueField;
-
-	private String key;
-
-	private String value;
-
-	private boolean isNullValue;
-
-	/**
-	 * @param parentShell
-	 * @param isNew
-	 */
-	public AddEditMapEntryDialog(Shell parentShell, boolean isNew) {
-		super(parentShell);
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param attributeName
-	 * @param attributeClass
-	 * @param defaultValue
-	 * @param suggestedValue
-	 */
-	public AddEditMapEntryDialog(Shell parentShell, String attributeName,
-			String attributeClass, String defaultValue, String suggestedValue) {
-		super(parentShell);
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			// TODO change it to "add"
-			newShell.setText(EditorMessages.MapEntryEditPage_Title);
-		else
-			newShell.setText(EditorMessages.MapEntryEditPage_Title);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.numColumns = 1;
-		container.setLayout(gl);
-
-		layoutKeySection(container);
-		layoutValueSection(container);
-		if (!isNew) {
-			initFields();
-		}
-		return container;
-	}
-
-	private void initFields() {
-		keyField.setText(key);
-		if (this.isNullValue) {
-			nullValueTypeButton.setSelection(true);
-			valueField.setText(""); //$NON-NLS-1$
-			valueField.setEnabled(false);
-		} else {
-			nullValueTypeButton.setSelection(false);
-			valueField.setEnabled(true);
-			valueField.setText(value);
-		}
-	}
-
-	/**
-	 * @param parent
-	 */
-	public void layoutKeySection(Composite parent) {
-		keyField = new StringDialogField();
-		keyField.setLabelText(EditorMessages.MapEntryEditGroup_Key);
-		Composite
-
-		keySection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		keySection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		keySection.setLayout(gl);
-
-		keyField.doFillIntoGrid(null, keySection, numberOfColumns);
-
-		LayoutUtil.setGrabHorizontal(keyField.getTextControl(null, keySection),
-				true);
-
-	}
-
-	/**
-	 * @param parent
-	 */
-	public void layoutValueSection(Composite parent) {
-		Composite valueSection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		valueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		gl.verticalSpacing = 10;
-		gl.marginHeight = 10;
-		valueSection.setLayout(gl);
-
-		nullValueTypeButton = SWTUtils.createCheckBox(valueSection,
-				EditorMessages.AddEditMapEntryDialog_NullValue, 2);
-
-		nullValueTypeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				valueField.setEnabled(!nullValueTypeButton.getSelection());
-
-			}
-
-		});
-		valueField = new StringDialogField(VALUE_DEFAULT_LINENUMS);
-
-		valueField.setLabelText(EditorMessages.ValueEditGroup_Value);
-		valueField.doFillIntoGrid(null, valueSection, numberOfColumns);
-
-		gd = (GridData) valueField.getLabelControl(null, valueSection)
-				.getLayoutData();
-		gd.verticalAlignment = gd.verticalAlignment | GridData.GRAB_VERTICAL;
-		LayoutUtil.setHorizontalGrabbing(valueField.getTextControl(null,
-				valueSection));
-
-		gd = (GridData) valueField.getTextControl(null, valueSection)
-				.getLayoutData();
-		gd.verticalAlignment = gd.verticalAlignment | GridData.FILL_VERTICAL;
-
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-
-		key = this.keyField.getText().trim();
-		value = this.valueField.getText().trim();
-		isNullValue = nullValueTypeButton.getSelection();
-		super.okPressed();
-	}
-
-	/**
-	 * @return true if is null
-	 */
-	public boolean isNullValue() {
-		return isNullValue;
-	}
-
-	/**
-	 * @param isNullValue
-	 */
-	public void setNullValue(boolean isNullValue) {
-		this.isNullValue = isNullValue;
-	}
-
-	/**
-	 * @return the key 
-	 */ 
-	public String getKey() {
-		return key;
-	}
-
-	/**
-	 * @param key
-	 */
-	public void setKey(String key) {
-		this.key = key;
-	}
-
-	/**
-	 * @return the value
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this.value = value;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditPropertyDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditPropertyDialog.java
deleted file mode 100644
index 432d064..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditPropertyDialog.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * The dialog is for adding and editing property.
- * 
- * @author sfshi
- * 
- */
-public class AddEditPropertyDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private StringDialogField propertyNameField;
-
-	private ClassButtonDialogField propertyClassField;
-
-	private StringDialogField defaultValueField;
-
-	private StringDialogField suggestedValueField;
-
-	private IProject project;
-
-	private boolean isNew;
-
-	private String propertyName;
-
-	private String propertyClass;
-
-	private String defaultValue;
-
-	private String suggestedValue;
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param isNew
-	 */
-	public AddEditPropertyDialog(Shell parentShell, boolean isNew) {
-		super(parentShell);
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param propertyName
-	 * @param propertyClass
-	 * @param defaultValue
-	 * @param suggestedValue
-	 */
-	public AddEditPropertyDialog(Shell parentShell, String propertyName,
-			String propertyClass, String defaultValue, String suggestedValue) {
-		super(parentShell);
-		this.propertyName = propertyName;
-		this.propertyClass = propertyClass;
-		this.defaultValue = defaultValue;
-		this.suggestedValue = suggestedValue;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell
-					.setText(EditorMessages.PropertySection_Dialog_Title_Add);
-		else
-
-			newShell
-					.setText(EditorMessages.PropertySection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem
-				.setText(EditorMessages.PropertySection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		propertyNameField = new StringDialogField();
-		// propertyNameField.setRequired(true);
-		propertyNameField
-				.setLabelText(EditorMessages.PropertySection_Dialog_PropertyName);
-
-		propertyClassField = new ClassButtonDialogField(getProject());
-		// propertyClassField.setRequired(true);
-		propertyClassField
-				.setLabelText(EditorMessages.PropertySection_Dialog_PropertyClass);
-
-		propertyClassField.setAutoOpenResource(false);
-
-		defaultValueField = new StringDialogField();
-		defaultValueField
-				.setLabelText(EditorMessages.PropertySection_Dialog_DefaultValue);
-
-		suggestedValueField = new StringDialogField();
-		suggestedValueField
-				.setLabelText(EditorMessages.PropertySection_Dialog_SuggestedValue);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		propertyNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		propertyClassField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		defaultValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		suggestedValueField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(propertyClassField.getTextControl(
-				null, composite));
-
-		// set the initial value for these fields.
-		propertyNameField.setText(propertyName);
-		propertyClassField.setText(propertyClass);
-		defaultValueField.setText(defaultValue);
-		suggestedValueField.setText(suggestedValue);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	private IProject getProject() {
-		return project;
-	}
-
-	protected void okPressed() {
-		propertyName = propertyNameField.getText();
-		propertyClass = propertyClassField.getText();
-		defaultValue = defaultValueField.getText();
-		suggestedValue = suggestedValueField.getText();
-
-		super.okPressed();
-	}
-
-	/**
-	 * @return the default value
-	 */
-	public String getDefaultValue() {
-		return defaultValue;
-	}
-
-	/**
-	 * @param defaultValue
-	 */
-	public void setDefaultValue(String defaultValue) {
-		this.defaultValue = defaultValue;
-	}
-
-	/**
-	 * @return the property class
-	 */
-	public String getPropertyClass() {
-		return propertyClass;
-	}
-
-	/**
-	 * @param propertyClass
-	 */
-	public void setPropertyClass(String propertyClass) {
-		this.propertyClass = propertyClass;
-	}
-
-	/**
-	 * @return the property name
-	 */
-	public String getPropertyName() {
-		return propertyName;
-	}
-
-	/**
-	 * @param propertyName
-	 */
-	public void setPropertyName(String propertyName) {
-		this.propertyName = propertyName;
-	}
-
-	/**
-	 * @return the suggested value
-	 */
-	public String getSuggestedValue() {
-		return suggestedValue;
-	}
-
-	/**
-	 * @param suggestedValue
-	 */
-	public void setSuggestedValue(String suggestedValue) {
-		this.suggestedValue = suggestedValue;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditRendererDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditRendererDialog.java
deleted file mode 100644
index 8e40eef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/AddEditRendererDialog.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class AddEditRendererDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private StringDialogField rendererNameField;
-
-	private ClassButtonDialogField rendererClassField;
-
-	private StringButtonDialogField componentFamilyField;
-
-	private StringDialogField renderTypeField;
-
-	private IProject project;
-
-	private String rendererName;
-
-	private String rendererClass;
-
-	private String componentFamily;
-
-	private String rendererType;
-
-	private boolean isNew;
-
-	private IFacesConfigPage page;
-
-	/**
-	 * @param parentShell
-	 * @param page
-	 * @param isNew
-	 */
-	public AddEditRendererDialog(Shell parentShell, IFacesConfigPage page,
-			boolean isNew) {
-		super(parentShell);
-		this.page = page;
-		this.isNew = isNew;
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param rendererName 
-	 * @param rendererClass 
-	 * @param componentFamily 
-	 * @param renderType 
-	 */
-	public AddEditRendererDialog(Shell parentShell, String rendererName,
-			String rendererClass, String componentFamily, String renderType) {
-		super(parentShell);
-		this.rendererName = rendererName;
-		this.rendererClass = rendererClass;
-		this.componentFamily = componentFamily;
-		this.rendererType = renderType;
-		this.isNew = false;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		if (isNew)
-			newShell.setText(EditorMessages.RendererSection_Dialog_Title_Add);
-		else
-			newShell.setText(EditorMessages.RendererSection_Dialog_Title_Edit);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		TabFolder tabFolder = new TabFolder(container, SWT.FILL);
-		tabFolder.setLayoutData(gd);
-		TabItem generalTabItem = new TabItem(tabFolder, SWT.NONE);
-		generalTabItem
-				.setText(EditorMessages.RendererSection_Dialog_Tab_General);
-		Control control = createGeneralTabControl(generalTabItem.getParent());
-		generalTabItem.setControl(control);
-		return container;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private Control createGeneralTabControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 5;
-		composite.setLayout(layout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		composite.setFont(parent.getFont());
-
-		rendererNameField = new StringDialogField();
-		rendererNameField
-				.setLabelText(EditorMessages.RendererSection_Dialog_DisplayName);
-
-		rendererClassField = new ClassButtonDialogField(getProject());
-//		rendererClassField.setRequired(true);
-		rendererClassField
-				.setLabelText(EditorMessages.RendererSection_Dialog_RendererClass);
-		rendererClassField.setProject(getProject());
-		rendererClassField.setSuperClassName(IFacesConfigConstants.RENDERER_SUPER_CLASS);
-		rendererClassField.setAutoOpenResource(false);
-
-		componentFamilyField = new StringButtonDialogField(
-				new IStringButtonAdapter() {
-					public void changeControlPressed(DialogField field) {
-						Shell shell = EditorPlugin.getActiveShell();
-						ComponentListDialog dialog = new ComponentListDialog(
-								shell,
-								page,
-								page.getInput(),
-								EditorMessages.RendererSection_Dialog_ComponentFamilyCaption,
-								EditorMessages.RendererSection_Dialog_ComponentFamilyLabel);
-						if (dialog.open() == Dialog.OK) {
-							componentFamilyField.setText(dialog.getValue());
-						}
-					}
-				});
-		componentFamilyField
-				.setLabelText(EditorMessages.RendererSection_Dialog_ComponentFamilyValue);
-//		componentFamilyField.setRequired(true);
-
-		renderTypeField = new StringDialogField();
-//		renderTypeField.setRequired(true);
-		renderTypeField
-				.setLabelText(EditorMessages.RendererSection_Dialog_TypeValue);
-
-		GridData data = new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(data);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		composite.setLayout(gl);
-
-		rendererNameField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		componentFamilyField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		renderTypeField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		rendererClassField.doFillIntoGrid(null, composite, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(rendererClassField.getTextControl(
-				null, composite));
-
-		// set the initial value for these fields.
-		rendererNameField.setText(rendererName);
-		rendererClassField.setText(rendererClass);
-		componentFamilyField.setText(componentFamily);
-		renderTypeField.setText(rendererType);
-
-		return composite;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * @return the associated project
-	 */
-	public IProject getProject() {
-		return project;
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-		rendererName = rendererNameField.getText();
-		rendererClass = rendererClassField.getText();
-		componentFamily = componentFamilyField.getText();
-		rendererType = renderTypeField.getText();
-
-		super.okPressed();
-	}
-
-	/**
-	 * @return the renderer clas
-	 */
-	public String getRendererClass() {
-		return rendererClass;
-	}
-
-	/**
-	 * @param rendererClass
-	 */
-	public void setRendererClass(String rendererClass) {
-		this.rendererClass = rendererClass;
-	}
-
-	/**
-	 * @return the renderer name
-	 */
-	public String getRendererName() {
-		return rendererName;
-	}
-
-	/**
-	 * @param rendererName
-	 */
-	public void setRendererName(String rendererName) {
-		this.rendererName = rendererName;
-	}
-
-	/**
-	 * @return the component family
-	 */
-	public String getComponentFamily() {
-		return componentFamily;
-	}
-
-	/**
-	 * @param componentFamily
-	 */
-	public void setComponentFamily(String componentFamily) {
-		this.componentFamily = componentFamily;
-	}
-
-	/**
-	 * @return the renderer type
-	 */
-	public String getRendererType() {
-		return rendererType;
-	}
-
-	/**
-	 * @param rendererType
-	 */
-	public void setRendererType(String rendererType) {
-		this.rendererType = rendererType;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/CommonListDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/CommonListDialog.java
deleted file mode 100644
index 5cae0b1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/CommonListDialog.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class CommonListDialog extends Dialog implements
-		ISelectionChangedListener, ISelectionProvider {
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private Text inputText;
-
-	private StructuredViewer structuredViewer;
-
-	private String value;
-
-	private IFacesConfigPage page;
-
-	private Object input;
-
-	private String label;
-	
-	private String caption;
-
-	/** The mini width for the text control */
-	private static final int TEXT_MINI_WIDTH = 100;
-
-	/**
-	 * @param parentShell
-	 * @param page
-	 * @param input
-	 * @param caption
-	 * @param label
-	 */
-	protected CommonListDialog(Shell parentShell, IFacesConfigPage page,
-			Object input, String caption, String label) {
-		super(parentShell);
-		this.page = page;
-		this.input = input;
-		this.label = label;
-		this.caption = caption;
-		parentShell.setText(caption);
-	}
-	
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(caption);
-	}
-
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = SWTUtils.createComposite(parent, 1);
-
-		SWTUtils.createLabel(composite, label, 1);
-
-		inputText = SWTUtils.createTextBox(composite, 1);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = TEXT_MINI_WIDTH;
-		inputText.setLayoutData(gd);
-
-		structuredViewer = createViewer(composite);
-		structuredViewer.addSelectionChangedListener(this);
-
-		return composite;
-	}
-
-	/**
-	 * Create the structured viewer, set up content & label provider for it.
-	 * Defaultly create a tableviewer.
-	 * 
-	 * @param parent
-	 * @return the structured viewer
-	 */
-	protected StructuredViewer createViewer(Composite parent) {
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 200;
-		gd.widthHint = 150;
-		parent.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-		parent.setLayout(layout);
-
-		TableViewer tableViewer = new TableViewer(parent, SWT.SINGLE
-				| SWT.H_SCROLL | SWT.V_SCROLL);
-		gd = new GridData(GridData.FILL_BOTH);
-		tableViewer.getControl().setLayoutData(gd);
-
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-		configViewer(tableViewer);
-		tableViewer.setInput(input);
-
-		return tableViewer;
-	}
-
-	/**
-	 * set the structuredViewer's input
-	 * 
-	 * @param input
-	 */
-	private void setViewerInput(Object input) {
-		structuredViewer.setInput(input);
-		this.input = input;
-	}
-
-	/**
-	 * get the input object of this section.
-	 * @return the input
-	 */
-	public Object getInput() {
-		return input;
-	}
-
-	/**
-	 * set input object for this section.
-	 * @param newInput 
-	 */
-	public void setInput(Object newInput) {
-		input = newInput;
-		setViewerInput(input);
-	}
-
-	/**
-	 * Config the viewer, such as set a filter and so on. Sub classes should
-	 * override this method to add filter.
-	 * 
-	 * @param structuredViewer_
-	 */
-	protected void configViewer(StructuredViewer structuredViewer_) {
-        // do nothing; sub-classes should override
-	}
-
-     //TODO: why bother with this interface?
-	public void selectionChanged(SelectionChangedEvent event) {
-		// selectionChanged not handled
-
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        // do nothing; not handling setSelection
-	}
-
-	public ISelection getSelection() {
-		return structuredViewer.getSelection();
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		// do nothing; not handling setSelection
-	}
-
-	public void setSelection(ISelection selection) {
-        // do nothing; not handling change in selection
-	}
-
-	/**
-	 * the convenient method to get the AdapterFactory instance of the editor;
-	 * 
-	 * @return the AdapterFactory instance.
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return (AdapterFactory) page.getEditor().getAdapter(
-				AdapterFactory.class);
-	}
-
-	/**
-	 * the convenient method to get the EditingDomain instance of the editor;
-	 * 
-	 * @return the EditingDomain instance.
-	 */
-	public EditingDomain getEditingDomain() {
-		return (EditingDomain) page.getEditor().getAdapter(EditingDomain.class);
-	}
-
-	/**
-	 * @return the value
-	 */
-	public String getValue() {
-		return value;
-	}
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this.value = value;
-		refresh();
-	}
-	
-	private void refresh()
-	{
-	   inputText.setText(value)	;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ComponentListDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ComponentListDialog.java
deleted file mode 100644
index 8c83c04..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ComponentListDialog.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author Bryan Yang
- *
- */
-public class ComponentListDialog extends CommonListDialog {
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			for (Iterator iter = ssel.iterator(); iter.hasNext();) {
-				ComponentType element = (ComponentType) iter.next();
-				if (element.getComponentType() != null)
-					setValue(element.getComponentType().getTextContent());
-				else
-					setValue(""); //$NON-NLS-1$
-			}
-
-		}
-	}
-
-	/**
-	 * @param parentShell
-	 * @param page
-	 * @param input
-	 * @param caption
-	 * @param label
-	 */
-	protected ComponentListDialog(Shell parentShell, IFacesConfigPage page,
-			Object input, String caption, String label) {
-		super(parentShell, page, input, caption, label);
-	}
-
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getComponentType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/DialogUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/DialogUtil.java
deleted file mode 100644
index 7ced390..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/DialogUtil.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.JavaUIHelper;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public final class DialogUtil {
-
-	/**
-	 * @param shell
-	 * @param project
-	 * @param superType
-	 * @param tyle
-	 * @return fully qualified class name or null
-	 */
-	public static String openClassDialog(Shell shell, IProject project,
-			String superType, int tyle) {
-		SelectionDialog dialog = JavaUIHelper
-				.openSelectionDialog(shell, project, superType, tyle);
-        
-        // dialog could be null
-        if (dialog != null)
-        {
-    		dialog.setTitle(EditorMessages.FindType);
-    		dialog.setMessage(EditorMessages.FindType_Filter);
-    		if (dialog.open() == SelectionDialog.OK) {
-    			Object[] result = dialog.getResult();
-    			IType searchedType = (IType) result[0];
-    			return searchedType.getFullyQualifiedName();
-    		}
-        }
-		return null;
-	}
-
-	/**
-	 * @param shell
-	 * @param facesConfig
-	 * @return the name of the renderkit or null
-	 */
-	public static String openRenderKitDialog(Shell shell,
-			FacesConfigType facesConfig) {
-		if (facesConfig != null) {
-			EList list = facesConfig.getRenderKit();
-			ArrayList ids = new ArrayList();
-			for (int i = 0, n = list.size(); i < n; i++) {
-				RenderKitIdType renderKitId = ((RenderKitType) list.get(i))
-						.getRenderKitId();
-				if (renderKitId != null) {
-					if (!"".equals(renderKitId.getTextContent())) { //$NON-NLS-1$
-						ids.add(renderKitId.getTextContent());
-					}
-				}
-			}
-			String[] idArray = (String[]) ids.toArray(new String[ids.size()]);
-			Arrays.sort(idArray);
-			ListChoiceDialog dialog = new ListChoiceDialog(
-					shell,
-					idArray,
-					EditorMessages.DefaultRenderKitIDSection_Wizard_Page_LabelText);
-			if (dialog.open() == SelectionDialog.OK) {
-				String result = dialog.getResult();
-				if (!"".equals(result)) { //$NON-NLS-1$
-					return result;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param shell
-	 * @param existedLocaleList
-	 * @return the locale or null
-	 */
-	public static String openLocaleDialog(Shell shell, List existedLocaleList) {
-		LocaleDialog dialog = new LocaleDialog(shell, existedLocaleList);
-		if (dialog.open() == Window.OK) {
-			String result = dialog.getResult();
-			if (!"".equals(result)) { //$NON-NLS-1$
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param shell
-	 * @param project
-	 * @param existedBundleList
-	 * @return the message bundle or null
-	 */
-	public static String openMessageBundleDialog(Shell shell, IProject project,
-			List existedBundleList) {
-		IJavaProject javaProject = null;
-
-		try {
-			if (project != null && project.hasNature(JavaCore.NATURE_ID)) {
-				javaProject = JavaCore.create(project);
-			} else {
-				return null;
-			}
-		} catch (CoreException e) {
-			// Ignore
-		}
-		MessageBundleSelectionDialog dialog = new MessageBundleSelectionDialog(
-				shell, javaProject, existedBundleList);
-
-		if (dialog.open() == SelectionDialog.OK) {
-			String newValue = (String) dialog.getResult()[0];
-			if (!"".equalsIgnoreCase(newValue)) { //$NON-NLS-1$
-				return newValue;
-			}
-		}
-		return null;
-	}
-	
-	private DialogUtil()
-	{
-		// no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditListEntriesDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditListEntriesDialog.java
deleted file mode 100644
index 89b6da9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditListEntriesDialog.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class EditListEntriesDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private ClassButtonDialogField valueClassField;
-
-	private IProject project;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private ListEntriesType listEntries;
-
-	private AbstractFacesConfigSection section;
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param listEntries
-	 *            the list-entries element that working on.
-	 * @param section 
-	 */
-	public EditListEntriesDialog(Shell parentShell,
-			ListEntriesType listEntries, AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.listEntries = listEntries;
-		this.section = section;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(EditorMessages.EditListEntriesDialog_EditingListEntries);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridData data = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		// gl.marginHeight = 0;
-		container.setLayout(gl);
-		createKeyValueSection(container);
-		createTableSection(container);
-
-		initFields();
-		return container;
-	}
-
-	private void initFields() {
-
-		if (listEntries.getValueClass() != null)
-			valueClassField.setText(listEntries.getValueClass()
-					.getTextContent());
-
-		tableViewer.setInput(listEntries);
-	}
-
-	private void createKeyValueSection(Composite parent) {
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);
-		Composite typeSelectionSection = SWTUtils.createComposite(parent,
-				SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-
-		valueClassField.doFillIntoGrid(null, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(valueClassField.getTextControl(null,
-				parent));
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 */
-	private void createTableSection(Composite parent) {
-		Composite mapValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		mapValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		mapValueSection.setLayout(gl);
-
-		DialogField valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);    
-
-		valuesTitle.doFillIntoGrid(null, mapValueSection, numberOfColumns);
-
-		Table mapTable = new Table(mapValueSection, SWT.FULL_SELECTION
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-
-		mapTable.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				updateButtonsStatus();
-
-			}
-
-		});
-		mapTable.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected(null);
-			}
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		mapTable.setLayoutData(gd);
-		mapTable.setHeaderVisible(true);
-		mapTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		layout.addColumnData(new ColumnWeightData(1, true));
-		mapTable.setLayout(layout);
-
-		TableColumn keyCol = new TableColumn(mapTable, SWT.NONE);
-		keyCol
-				.setText(EditorMessages.InitializationSection_MapTable_Value);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		keyCol.setResizable(true);
-
-		tableViewer = new TableViewer(mapTable);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getValueType().isInstance(
-						element)
-						|| FacesConfigPackage.eINSTANCE.getNullValueType()
-								.isInstance(element);
-			}
-		});
-
-		Composite operationContainer = null;
-
-		operationContainer = SWTUtils
-				.createComposite(mapValueSection, SWT.NONE);
-
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Add_more);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		editButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-		editButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected(e);
-			}
-
-		});
-		removeButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Remove);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-		editButton.setEnabled(false);
-		removeButton.setEnabled(false);
-	}
-
-	private AdapterFactory getAdapterFactory() {
-		return section.getAdapterFactory();
-	}
-
-	private void addButtonSelected(SelectionEvent e) {
-
-		EditValueDialog dialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), true, false, null);
-		if (dialog.open() == Dialog.OK) {
-			if (dialog.isNullValue()) {
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				listEntries.getNullValue().add(nullValue);
-			} else {
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent((String) dialog.getResultData());
-				listEntries.getValue().add(value);
-			}
-		}
-
-	}
-
-	private void editButtonSelected(SelectionEvent e) {
-		Object select = ((IStructuredSelection) tableViewer.getSelection())
-				.getFirstElement();
-		boolean isNullValue;
-		String valueText = null;
-		if (select instanceof NullValueType)
-			isNullValue = true;
-		else {
-			isNullValue = false;
-			valueText = ((ValueType) select).getTextContent();
-		}
-
-		EditValueDialog dialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), true, isNullValue, valueText);
-		if (dialog.open() == Dialog.OK) {
-			if (isNullValue && !dialog.isNullValue()) {
-				listEntries.getNullValue().remove(select);
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent((String) dialog.getResultData());
-				listEntries.getValue().add(value);
-			} else if (!isNullValue && dialog.isNullValue()) {
-				listEntries.getValue().remove(select);
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				listEntries.getNullValue().add(nullValue);
-			} else if (!isNullValue && !dialog.isNullValue()) {
-				((ValueType) select).setTextContent((String) dialog
-						.getResultData());
-			}
-		}
-	}
-
-	private void removeButtonSelected() {
-		Object select = ((IStructuredSelection) tableViewer.getSelection())
-				.getFirstElement();
-		if (select instanceof NullValueType)
-			listEntries.getNullValue().remove(select);
-		else
-			listEntries.getValue().remove(select);
-		tableViewer.refresh();
-		updateButtonsStatus();
-	}
-
-	/**
-	 * update the status buttons
-	 */
-	public void updateButtonsStatus() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-
-		String valueClass = valueClassField.getText();
-		if (listEntries.getValueClass() != null) {
-			listEntries.getValueClass().setTextContent(valueClass);
-		} else {
-			ValueClassType valueClassType = FacesConfigFactory.eINSTANCE
-					.createValueClassType();
-			valueClassType.setTextContent(valueClass);
-			listEntries.setValueClass(valueClassType);
-		}
-		super.okPressed();
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * @return the current project
-	 */
-	public IProject getProject() {
-		if (project == null) {
-			project = (IProject) section.getPage().getEditor().getAdapter(
-					IProject.class);
-		}
-		return project;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-	/**
-	 * @return the list entries
-	 */
-	public ListEntriesType getListEntries() {
-		return listEntries;
-	}
-
-	/**
-	 * @param listEntries
-	 */
-	public void setListEntries(ListEntriesType listEntries) {
-		this.listEntries = listEntries;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditMapEntriesDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditMapEntriesDialog.java
deleted file mode 100644
index ee91462..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditMapEntriesDialog.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class EditMapEntriesDialog extends Dialog {
-
-	private static final int MIN_DIALOG_WIDTH = 300;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private ClassButtonDialogField keyClassField;
-
-	private ClassButtonDialogField valueClassField;
-
-	private IProject project;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private MapEntriesType mapEntries;
-
-	private AbstractFacesConfigSection section;
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param mapEntries
-	 *            the map-entries element that working on.
-	 * @param section 
-	 */
-	public EditMapEntriesDialog(Shell parentShell, MapEntriesType mapEntries,
-			AbstractFacesConfigSection section) {
-		super(parentShell);
-		this.mapEntries = mapEntries;
-		this.section = section;
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(EditorMessages.EditMapEntriesDialog_EditingMapEntries);
-	}
-
-	/*
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridData data = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		// gl.marginHeight = 0;
-		container.setLayout(gl);
-		createKeyValueSection(container);
-		createTableSection(container);
-
-		initFields();
-		return container;
-	}
-
-	private void initFields() {
-
-		if (mapEntries.getKeyClass() != null)
-			keyClassField.setText(mapEntries.getKeyClass().getTextContent());
-
-		if (mapEntries.getValueClass() != null)
-			valueClassField
-					.setText(mapEntries.getValueClass().getTextContent());
-
-		tableViewer.setInput(mapEntries);
-	}
-
-	private void createKeyValueSection(Composite parent) {
-		keyClassField = new ClassButtonDialogField(getProject());
-		keyClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_KeyClass);
-
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);
-
-		Composite typeSelectionSection = SWTUtils.createComposite(parent,
-				SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-
-		keyClassField.doFillIntoGrid(null, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(keyClassField.getTextControl(null,
-				parent));
-
-		valueClassField.doFillIntoGrid(null, typeSelectionSection,
-				numberOfColumns);
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 */
-	private void createTableSection(Composite parent) {
-		Composite mapValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		mapValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		mapValueSection.setLayout(gl);
-
-		DialogField valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);    
-
-		valuesTitle.doFillIntoGrid(null, mapValueSection, numberOfColumns);
-
-		Table mapTable = new Table(mapValueSection, SWT.FULL_SELECTION
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-
-		mapTable.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				updateButtonsStatus();
-
-			}
-
-		});
-		mapTable.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected(null);
-			}
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		mapTable.setLayoutData(gd);
-		mapTable.setHeaderVisible(true);
-		mapTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		mapTable.setLayout(layout);
-
-		TableColumn keyCol = new TableColumn(mapTable, SWT.NONE);
-		keyCol
-				.setText(EditorMessages.InitializationSection_MapTable_Key);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		keyCol.setResizable(true);
-
-		TableColumn valueCol = new TableColumn(mapTable, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-
-		valueCol
-				.setText(EditorMessages.InitializationSection_MapTable_Value);
-		valueCol.setResizable(true);
-
-		tableViewer = new TableViewer(mapTable);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getMapEntryType()
-						.isInstance(element);
-			}
-		});
-
-		// map's operation buttons
-		Composite operationContainer = null;
-
-		operationContainer = SWTUtils
-				.createComposite(mapValueSection, SWT.NONE);
-
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Add_more);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		editButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-		editButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected(e);
-			}
-
-		});
-		removeButton = SWTUtils.createPushButton(operationContainer,
-				EditorMessages.UI_Button_Remove);
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-		editButton.setEnabled(false);
-		removeButton.setEnabled(false);
-	}
-	
-	/**
-	 * @return the current project
-	 */
-	public IProject getProject() {
-		if (project == null) {
-			project = (IProject) section.getPage().getEditor().getAdapter(
-					IProject.class);
-		}
-		return project;
-	}
-	private AdapterFactory getAdapterFactory() {
-		return section.getAdapterFactory();
-	}
-
-	private void addButtonSelected(SelectionEvent e) {
-		AddEditMapEntryDialog dialog = new AddEditMapEntryDialog(EditorPlugin
-				.getActiveShell(), true);
-		if (dialog.open() == Dialog.OK) {
-			MapEntryType mapEntry = FacesConfigFactory.eINSTANCE
-					.createMapEntryType();
-			if (dialog.getKey() != null) {
-				KeyType key = FacesConfigFactory.eINSTANCE.createKeyType();
-				key.setTextContent(dialog.getKey());
-				mapEntry.setKey(key);
-			}
-			if (dialog.isNullValue()) {
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				mapEntry.setNullValue(nullValue);
-			} else {
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent(dialog.getValue());
-				mapEntry.setValue(value);
-			}
-
-			mapEntries.getMapEntry().add(mapEntry);
-		}
-
-	}
-
-	private void editButtonSelected(SelectionEvent e) {
-		MapEntryType mapEntry = (MapEntryType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		AddEditMapEntryDialog dialog = new AddEditMapEntryDialog(EditorPlugin
-				.getActiveShell(), false);
-		if (mapEntry.getKey() != null)
-			dialog.setKey(mapEntry.getKey().getTextContent());
-		if (mapEntry.getNullValue() != null)
-			dialog.setNullValue(true);
-		else if (mapEntry.getValue() != null)
-			dialog.setValue(mapEntry.getValue().getTextContent());
-
-		if (dialog.open() == Dialog.OK) {
-			if (mapEntry.getKey() != null)
-				mapEntry.getKey().setTextContent(dialog.getKey());
-			else {
-				KeyType keyType = FacesConfigFactory.eINSTANCE.createKeyType();
-				keyType.setTextContent(dialog.getKey());
-				mapEntry.setKey(keyType);
-			}
-			if (dialog.isNullValue()) {
-				if (mapEntry.getValue() != null)
-					EcoreUtil.remove(mapEntry.getValue());
-				// mapEntry.eUnset(FacesConfigPackage.eINSTANCE.getMapEntryType_Value());
-				mapEntry.setNullValue(FacesConfigFactory.eINSTANCE
-						.createNullValueType());
-
-			} else {
-				if (mapEntry.getNullValue() != null)
-					EcoreUtil.remove(mapEntry.getNullValue());
-				if (mapEntry.getValue() != null)
-					mapEntry.getValue().setTextContent(dialog.getValue());
-				else {
-					ValueType value = FacesConfigFactory.eINSTANCE
-							.createValueType();
-					value.setTextContent(dialog.getValue());
-					mapEntry.setValue(value);
-				}
-
-			}
-			tableViewer.refresh(mapEntry);
-		}
-
-	}
-
-	private void removeButtonSelected() {
-		MapEntryType mapEntry = (MapEntryType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		mapEntries.getMapEntry().remove(mapEntry);
-		tableViewer.refresh();
-		updateButtonsStatus();
-	}
-
-	/**
-	 * update the button status
-	 */
-	public void updateButtonsStatus() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * 
-	 */
-	protected void okPressed() {
-		KeyClassType keyClass = FacesConfigFactory.eINSTANCE
-				.createKeyClassType();
-		keyClass.setTextContent(this.keyClassField.getText().trim());
-		mapEntries.setKeyClass(keyClass);
-		ValueClassType valueClass = FacesConfigFactory.eINSTANCE
-				.createValueClassType();
-		valueClass.setTextContent(this.valueClassField.getText().trim());
-		mapEntries.setValueClass(valueClass);
-		super.okPressed();
-	}
-
-	/*
-	 * @see org.eclipse.jface.window.Window#getInitialSize()
-	 */
-	protected Point getInitialSize() {
-		Point shellSize = super.getInitialSize();
-		return new Point(Math.max(
-				convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
-				shellSize.y);
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
-
-	/**
-	 * @return the map entries
-	 */
-	public MapEntriesType getMapEntries() {
-		return mapEntries;
-	}
-
-	/**
-	 * @param mapEntries
-	 */
-	public void setMapEntries(MapEntriesType mapEntries) {
-		this.mapEntries = mapEntries;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditValueDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditValueDialog.java
deleted file mode 100644
index d69d66d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/EditValueDialog.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * This dialog is used to edit managed bean's property. if the
- * bDefinitionEditable is true, the property's name, class type, and initial
- * value can be edit and changed. otherwise, only initial value can be changed.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class EditValueDialog extends Dialog {
-
-	/** default dialog width and height */
-	private static final int VALUE_WIDTH = 380;
-
-	private static final int VALUE_HEIGHT = 220;
-
-	private String value;
-
-	/** property's initla value text control */
-	private Text valueText;
-
-	private Button nullValueTypeButton;
-
-	private boolean isNullButtonShown;
-
-	private boolean isNullValue;
-
-	/**
-	 * Equivilent to EditValueDialog(parentShell, false, false, value)
-	 * 
-	 * @param parentShell
-	 * @param value
-	 */
-	public EditValueDialog(Shell parentShell, String value) {
-		this(parentShell, false, false, value);
-		this.value = value;
-		this.isNullButtonShown = false;
-	}
-
-	/**
-	 * @param parentShell
-	 * @param isNullButtonShown
-	 * @param isNullValue
-	 * @param value
-	 */
-	public EditValueDialog(Shell parentShell, boolean isNullButtonShown,
-			boolean isNullValue, String value) {
-		super(parentShell);
-		this.isNullValue = isNullValue;
-		this.value = value;
-		this.isNullButtonShown = isNullButtonShown;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createDialogArea(Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		GridLayout gridLayout;
-		Composite container = (Composite) super.createDialogArea(parent);
-		gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginHeight = 10;
-		gridLayout.marginWidth = 10;
-		container.setLayout(gridLayout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		if (this.isNullButtonShown) {
-			nullValueTypeButton = SWTUtils.createCheckBox(container,
-					IFacesConfigConstants.NULL_VALUE, 2);
-			nullValueTypeButton.addSelectionListener(new SelectionAdapter() {
-
-				public void widgetSelected(SelectionEvent e) {
-					valueText.setEnabled(!nullValueTypeButton.getSelection());
-					isNullValue = nullValueTypeButton.getSelection();
-				}
-
-			});
-		}
-
-		DialogField valueTitle = new DialogFieldBase();
-		// ManagedBeansPage.ManagedBeanInitializationSection.MapTable.Title =
-		// Values:
-		valueTitle
-				.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_Value);
-		valueTitle.doFillIntoGrid(null, container, 1);
-
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.widthHint = VALUE_WIDTH;
-		gd.heightHint = VALUE_HEIGHT;
-		valueText = new Text(container, SWT.MULTI | SWT.BORDER);
-		valueText.setLayoutData(gd);
-
-		initFields();
-		return container;
-	}
-
-	private void initFields() {
-
-		if (isNullButtonShown && isNullValue) {
-			nullValueTypeButton.setSelection(true);
-			valueText.setEnabled(false);
-		} else if (value != null) {
-			valueText.setText(value);
-		}
-	}
-
-	/**
-	 * create a inital value group
-	 * 
-	 * @param container -
-	 *            parent composite control
-	 */
-	protected void createValueSection(Composite container) {
-		Composite valueSection = new Composite(container, SWT.NONE);
-		GridLayout gl = new GridLayout();
-		// gl.marginHeight = 20;
-		gl.numColumns = 2;
-		valueSection.setLayout(gl);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		valueSection.setLayoutData(gd);
-
-		Label lblValue = new Label(valueSection, SWT.LEFT);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gd.widthHint = 100;
-		lblValue.setLayoutData(gd);
-
-		// ManagedBeanPropertyEditDialog.Value = Value:
-		lblValue
-				.setText(EditorMessages.ManagedBeanPropertyEditDialog_Value);
-
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.FILL_HORIZONTAL);
-		gd.widthHint = 200;
-		valueText = new Text(valueSection, SWT.BORDER);
-		valueText.setLayoutData(gd);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createButtonsForButtonBar(Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#configureShell(Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(EditorMessages.ValueEditDialog_Title);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.CANCEL_ID) {
-			setReturnCode(CANCEL);
-			close();
-			return;
-		} else if (buttonId == IDialogConstants.OK_ID) {
-			value = valueText.getText();
-			setReturnCode(OK);
-			close();
-			return;
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	/**
-	 * @return the result data
-	 */
-	public Object getResultData() {
-		return value;
-	}
-
-	/**
-	 * @return tru if isNullButtonShown and isNullValue are both true
-	 */
-	public boolean isNullValue() {
-		return this.isNullButtonShown && isNullValue;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ListChoiceDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ListChoiceDialog.java
deleted file mode 100644
index 9538b11..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/ListChoiceDialog.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public class ListChoiceDialog extends Dialog {
-	/** The mini width for the text control */
-	private static final int TEXT_MINI_WIDTH = 350;
-
-	/** The mini width for the table viewer control */
-	private static final int TABLEVIEWER_MINI_WIDTH = 200;
-
-	private Text inputText;
-
-	private TableViewer tableViewer;
-
-	private String[] items;
-
-	private String result;
-	
-	private String labelString;
-
-	/**
-	 * @param parentShell
-	 * @param items
-	 * @param labelString
-	 */
-	public ListChoiceDialog(Shell parentShell, String[] items, String labelString) {
-		super(parentShell);
-		// if passed null for items, make it an empty array of strings
-		this.items = items == null ? new String[0] : items;
-		this.labelString = labelString;
-		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = SWTUtils.createComposite(parent, 1);
-
-		SWTUtils.createLabel(composite, labelString, 1);
-
-		inputText = SWTUtils.createTextBox(composite, 1);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = TEXT_MINI_WIDTH;
-		inputText.setLayoutData(gd);
-
-		inputText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				result = inputText.getText();
-			}
-		});
-
-		createTableViewer(composite);
-		return composite;
-	}
-
-	/**
-	 * @param composite
-	 */
-	private void createTableViewer(Composite composite) {
-		tableViewer = new TableViewer(composite, SWT.BORDER | SWT.H_SCROLL
-				| SWT.V_SCROLL);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = TABLEVIEWER_MINI_WIDTH;
-		tableViewer.getControl().setLayoutData(gd);
-		tableViewer.add(items);
-		tableViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						IStructuredSelection selection = (IStructuredSelection) event
-								.getSelection();
-						if (selection != null) {
-							String text = (String) selection.getFirstElement();
-							if (text != null && text.length() > 0) {
-								result = text;
-								inputText.setText(text);
-							}
-						}
-					}
-				});
-	}
-	
-	/**
-	 * @return the result
-	 */
-	public String getResult()
-	{
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/LocaleDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/LocaleDialog.java
deleted file mode 100644
index 21e5169..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/LocaleDialog.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public class LocaleDialog extends StatusDialog {
-	private Text inputText;
-
-	private TableViewer tableViewer;
-
-	private String newLocale;
-
-	private List existedLocaleList;
-
-	private List itemsList;
-
-	/** The mini width for the text control */
-	private static final int TEXT_MINI_WIDTH = 350;
-
-	/** The mini width for the table viewer control */
-	private static final int TABLEVIEWER_MINI_WIDTH = 200;
-
-	class LocaleViewerFilter extends ViewerFilter {
-		private String locale;
-
-		LocaleViewerFilter(String locale) {
-			super();
-			this.locale = locale;
-		}
-
-		public boolean select(Viewer v, Object parent, Object object) {
-			if (object instanceof String) {
-				if (null == locale || locale.length() == 0) {
-					return true;
-				}
-                String aLocale = (String) object;
-                return aLocale.startsWith(this.locale);
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * 
-	 * @param parentShell
-	 * @param existedLocaleList
-	 */
-	public LocaleDialog(Shell parentShell, List existedLocaleList) {
-		super(parentShell);
-		this.existedLocaleList = existedLocaleList;
-		Locale[] locales = Locale.getAvailableLocales();
-		itemsList = new ArrayList(locales.length);
-
-		for (int i = 0, n = locales.length; i < n; i++) {
-			itemsList.add(locales[i].toString());
-		}
-		
-		setStatusMessage(EditorMessages.LocaleConfigSection_Wizard_Page_AlreadyExistsError);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(EditorMessages.LocaleConfigSection_Wizard_WindowTitle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.dialog.StatusDialog#createDialogContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogContents(Composite parent) {
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		parent.setLayout(layout);
-
-		SWTUtils
-				.createLabel(
-						parent,
-						EditorMessages.LocaleConfigSection_Wizard_Page_LabelText,
-						1);
-
-		inputText = SWTUtils.createTextBox(parent, 1);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.widthHint = TEXT_MINI_WIDTH;
-		inputText.setLayoutData(gd);
-
-		inputText.addKeyListener(new KeyAdapter() {
-			public void keyReleased(KeyEvent e) {
-				newLocale = inputText.getText();
-				tableViewer.resetFilters();
-				tableViewer.addFilter(new LocaleViewerFilter(newLocale));
-				tableViewer.add(itemsList.toArray());
-				updateStatus();
-			}
-		});
-
-		createTableViewer(parent);
-		return parent;
-	}
-
-	/**
-	 * @param composite
-	 */
-	private void createTableViewer(Composite composite) {
-		tableViewer = new TableViewer(composite, SWT.BORDER | SWT.H_SCROLL
-				| SWT.V_SCROLL);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = TABLEVIEWER_MINI_WIDTH;
-		tableViewer.getControl().setLayoutData(gd);
-		tableViewer.add(itemsList.toArray());
-
-		tableViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-
-						IStructuredSelection selection = (IStructuredSelection) event
-								.getSelection();
-						if (selection != null) {
-							String text = (String) selection.getFirstElement();
-							if (text != null && text.length() > 0) {
-								newLocale = text;
-								inputText.setText(text);
-								updateStatus();
-							}
-						}
-					}
-				});
-
-	}
-	
-	protected boolean isValid()
-	{
-		if (existedLocaleList != null && existedLocaleList.contains(newLocale)) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * @return the result
-	 */
-	public String getResult()
-	{
-		return newLocale;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleSelectionDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleSelectionDialog.java
deleted file mode 100644
index d4e34d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleSelectionDialog.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.ResourceOnClasspathDialog;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author sfshi
- * @version
- */
-public class MessageBundleSelectionDialog extends ResourceOnClasspathDialog {
-	/** A list contains the resoursebundles existing in faces config */
-	private List resourceBundles;
-
-	private String selectPropertyFileMessage = EditorMessages.MessageBundleSection_Dialog_Message_SelectPropertyFile; 
-
-	private String alreadyExistStatusMessage = EditorMessages.MessageBundleSection_Dialog_Message_AlreadyExists; 
-
-	private static final String[] PROPERTIES_FILES_SUFFIXS = new String[] { IFileFolderConstants.EXT_PROPERTIES };
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 * @param resourceBundles
-	 */
-	public MessageBundleSelectionDialog(Shell parentShell,
-			IJavaProject project, List resourceBundles) {
-		super(parentShell, project);
-		this.resourceBundles = resourceBundles;
-		setSuffixs(PROPERTIES_FILES_SUFFIXS);
-		
-		setTitle(EditorMessages.MessageBundleSection_Dialog_Title);
-		setViewerSorter(new MessageBundleViewerSorter());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogs.TreeViewerSelectionDialog#isValidSelection(java.lang.Object)
-	 */
-	protected boolean isValidSelection(Object selection) {
-		if (!(super.isValidSelection(selection))) {
-			setStatusMessage(selectPropertyFileMessage);
-			return false;
-		}
-
-		List selectionList = new ArrayList();
-		selectionList.add(selection);
-		this.setResult(selectionList);
-		Object result = super.getResult()[0];
-		if (null == result) {
-			setStatusMessage(selectPropertyFileMessage);
-			return false;
-		}
-
-		String newResourceBundle = (String) result;
-
-		if (isAlreadyExist(newResourceBundle)) {
-			this.setStatusMessage(alreadyExistStatusMessage);
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * Determine whether this resource bundle file has already been defined in
-	 * faces config.
-	 * 
-	 * @return boolean
-	 */
-	private boolean isAlreadyExist(String resourceBundleString) {
-		if (null == resourceBundleString || resourceBundleString.length() == 0) {
-			return true;
-		}
-
-		if (null == resourceBundles) {
-			return false;
-		}
-
-		for (int i = 0; i < resourceBundles.size(); i++) {
-			MessageBundleType node = (MessageBundleType) resourceBundles.get(i);
-			String rbName = node.getTextContent();
-			if (rbName != null && rbName.equalsIgnoreCase(resourceBundleString)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleViewerSorter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleViewerSorter.java
deleted file mode 100644
index 18a8129..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/MessageBundleViewerSorter.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import java.text.Collator;
-
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-
-/**
- * @author sfshi
- * @version
- */
-public class MessageBundleViewerSorter extends ViewerSorter {
-
-	/**
-	 * 
-	 */
-	public MessageBundleViewerSorter() {
-		super();
-	}
-
-	/**
-	 * @param collator
-	 */
-	public MessageBundleViewerSorter(Collator collator) {
-		super(collator);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ViewerSorter#category(java.lang.Object)
-	 */
-	public int category(Object element) {
-		if (element instanceof IPackageFragmentRoot
-				&& !((IPackageFragmentRoot)element).isArchive()) {
-			IPackageFragmentRoot root = (IPackageFragmentRoot) element;
-			if (IFileFolderConstants.FOLDER_SOURCE
-					.equals(root.getElementName())) {
-				return 0;
-			}
-			return 1;
-		}
-
-		return 2;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/StatusDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/StatusDialog.java
deleted file mode 100644
index 22485d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/dialog/StatusDialog.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.dialog;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-
-/**
- * A common Dialog with validation information.
- */
-public abstract class StatusDialog extends Dialog {
-	/** The validation image */
-	private Label statusImage;
-
-	/** The validation message */
-	private Label statusLabel;
-
-	/** The validation message content */
-	private String statusMessage;
-
-	/**
-	 * 
-	 * @param parentShell
-	 */
-	protected StatusDialog(Shell parentShell) {
-		super(parentShell);
-	}
-
-	/**
-	 * Creates and returns the contents of the upper part of this dialog (above
-	 * the validation widgets). User should create Layout for the parent parameter.
-	 * 
-	 * @param parent
-	 *            the parent composite to contain the dialog area
-	 * @return the dialog area control
-	 */
-	protected abstract Control createDialogContents(Composite parent);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite area = (Composite) super.createDialogArea(parent);
-		area.setLayout(new GridLayout(2,false));
-
-		Composite contents = new Composite(area, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 2;
-		contents.setLayoutData(gd);
-		createDialogContents(contents);
-
-		statusImage = createLabel(area);
-		statusImage.setImage(JFaceResources
-				.getImage(Dialog.DLG_IMG_MESSAGE_ERROR));
-		statusLabel = createLabel(area);
-		statusImage.setVisible(false);
-		return area;
-	}
-
-	private Label createLabel(Composite parent) {
-		Label label = new Label(parent, SWT.LEFT);
-		GridData data = new GridData();
-		data.horizontalSpan = 1;
-		data.horizontalAlignment = GridData.FILL;
-		label.setLayoutData(data);
-		return label;
-	}
-
-	/**
-	 * @return true if is status is valid
-	 */
-	protected abstract boolean isValid();
-
-	/**
-	 * update the status information
-	 */
-	protected void updateStatus() {
-		if (isValid()) {
-			statusImage.setVisible(false);
-			statusLabel.setText(""); //$NON-NLS-1$
-			getButton(IDialogConstants.OK_ID).setEnabled(true);
-		} else {
-			statusImage.setVisible(true);
-			statusLabel.setText(statusMessage == null ? "" : statusMessage);//$NON-NLS-1$
-			getButton(IDialogConstants.OK_ID).setEnabled(false);
-		}
-	}
-
-	/**
-	 * @return the current status message
-	 */
-	public String getStatusMessage() {
-		return statusMessage;
-	}
-
-	/**
-	 * @param statusMessage
-	 */
-	public void setStatusMessage(String statusMessage) {
-		this.statusMessage = statusMessage;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ComponentsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ComponentsPage.java
deleted file mode 100644
index 7fb266e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ComponentsPage.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ComponentDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ConverterDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.RenderkitDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ValidatorDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ComponentMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ConverterMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacesConfigMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.RenderkitMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ValidatorMasterSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * The "Components" page of faces config editor.
- * 
- * @author sfshi
- * 
- */
-public class ComponentsPage extends FacesConfigMasterDetailPage {
-
-	/**
-	 * The id of this page in the faces-config editor.
-	 */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.ComponentsPage"; //$NON-NLS-1$
-
-	private IContentOutlinePage contentOutlinePage;
-
-	/**
-	 * Constructor of ComponentsPage;
-	 * 
-	 * @param editor
-	 *            the facesconfig editor;
-	 */
-	public ComponentsPage(FacesConfigEditor editor) {
-		super(editor, "ComponentsPage", //$NON-NLS-1$
-				EditorMessages.FacesConfigEditor_Components_TabName);
-	}
-
-	/**
-	 * Create the master sections;
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage#createMasterSections(Composite,
-	 *      IManagedForm, FormToolkit, FacesConfigMasterDetailPage)
-	 */
-	protected FacesConfigMasterSection[] createMasterSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page) {
-		FacesConfigMasterSection componentMaster = new ComponentMasterSection(
-				composite, managedForm, toolkit, page);
-		componentMaster.getSection().setExpanded(true);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		componentMaster.getSection().setLayoutData(gd);
-
-		FacesConfigMasterSection converterMaster = new ConverterMasterSection(
-				composite, managedForm, toolkit, page);
-		converterMaster.getSection().setExpanded(false);
-		GridData convertergd = new GridData(GridData.FILL_HORIZONTAL);
-		converterMaster.getSection().setLayoutData(convertergd);
-
-		FacesConfigMasterSection renderkitMaster = new RenderkitMasterSection(
-				composite, managedForm, toolkit, page);
-		renderkitMaster.getSection().setExpanded(false);
-		GridData renderkitgd = new GridData(GridData.FILL_HORIZONTAL);
-		renderkitMaster.getSection().setLayoutData(renderkitgd);
-
-		FacesConfigMasterSection validatorMaster = new ValidatorMasterSection(
-				composite, managedForm, toolkit, page);
-		validatorMaster.getSection().setExpanded(false);
-		GridData valicatorgd = new GridData(GridData.FILL_HORIZONTAL);
-		validatorMaster.getSection().setLayoutData(valicatorgd);
-
-		return new FacesConfigMasterSection[] { componentMaster,
-				converterMaster, renderkitMaster, validatorMaster };
-	}
-
-	/**
-	 * get the details page;
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage#getPageKey(Object
-	 *      object)
-	 * @param key
-	 *            the eClass object of a component.
-	 */
-	public IDetailsPage getPage(Object key) {
-		IDetailsPage detailsPage = null;
-		if (key instanceof EClass) {
-			EClass eClass = (EClass) key;
-			if (eClass.getClassifierID() == FacesConfigPackage.COMPONENT_TYPE) {
-				detailsPage = new ComponentDetailsPage(this);
-			} else if (eClass.getClassifierID() == FacesConfigPackage.RENDER_KIT_TYPE) {
-				detailsPage = new RenderkitDetailsPage(this);
-			} else if (eClass.getClassifierID() == FacesConfigPackage.CONVERTER_TYPE) {
-				detailsPage = new ConverterDetailsPage(this);
-			} else if (eClass.getClassifierID() == FacesConfigPackage.VALIDATOR_TYPE) {
-				detailsPage = new ValidatorDetailsPage(this);
-			}
-
-			if (detailsPage instanceof ISelectionProvider) {
-				((ISelectionProvider) detailsPage)
-						.addSelectionChangedListener(this);
-			}
-		}
-		return detailsPage;
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private IContentOutlinePage getOutlinePage() {
-
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class ComponentsContentOutlinePage extends ContentOutlinePage {
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					TreeViewer contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-							.getAdapter(AdapterFactory.class);
-					// Set up the tree viewer.
-					contentOutlineViewer
-							.setContentProvider(new AdapterFactoryContentProvider(
-									adapterFactory));
-					contentOutlineViewer
-							.setLabelProvider(new AdapterFactoryLabelProvider(
-									adapterFactory));
-					contentOutlineViewer.addFilter(new ViewerFilter() {
-
-						public boolean select(Viewer viewer,
-								Object parentElement, Object element) {
-							return FacesConfigPackage.eINSTANCE
-									.getComponentType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getConverterType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getRenderKitType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getValidatorType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getAttributeType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getPropertyType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getFacetType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getRendererType().isInstance(
-													element);
-						}
-					});
-
-					contentOutlineViewer.setSorter(new ViewerSorter());
-					contentOutlineViewer.setInput(getInput());
-				}
-
-			}
-
-			contentOutlinePage = new ComponentsContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special
-			// way.
-			//
-			contentOutlinePage
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						// This ensures that we handle selections correctly.
-						public void selectionChanged(SelectionChangedEvent event) {
-							setSelection(event.getSelection());
-						}
-					});
-
-			addSelectionChangedListener((ContentOutlinePage) contentOutlinePage);
-		}
-
-		return contentOutlinePage;
-
-	}
-
-	/**
-	 * handle the selection changed event from outline page.
-	 * 
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			IStructuredSelection currentSelection = (IStructuredSelection) this
-					.getSelection();
-			if ((!ss.isEmpty())
-					&& (!currentSelection.isEmpty())
-					&& (ss.getFirstElement() == currentSelection
-							.getFirstElement())) {
-				return;
-			}
-			EObject component = null;
-			if (ss.getFirstElement() instanceof AttributeType
-					|| ss.getFirstElement() instanceof PropertyType
-					|| ss.getFirstElement() instanceof FacetType
-					|| ss.getFirstElement() instanceof RendererType) {
-				component = ((EObject) ss.getFirstElement()).eContainer();
-			} else if (ss.getFirstElement() instanceof EObject) {
-				component = (EObject) ss.getFirstElement();
-			}
-
-			if (component != null) {
-				FacesConfigMasterSection section = null;
-				if (FacesConfigPackage.eINSTANCE.getComponentType().isInstance(
-						component)) {
-					section = getFacesConfigMasterSections()[0];
-				} else if (FacesConfigPackage.eINSTANCE.getConverterType()
-						.isInstance(component)) {
-					section = getFacesConfigMasterSections()[1];
-				} else if (FacesConfigPackage.eINSTANCE.getRenderKitType()
-						.isInstance(component)) {
-					section = getFacesConfigMasterSections()[2];
-				} else if (FacesConfigPackage.eINSTANCE.getValidatorType()
-						.isInstance(component)) {
-					section = getFacesConfigMasterSections()[3];
-				}
-
-				if (!section.getSection().isExpanded()) {
-					this.closeOtherSections(section);
-					GridData gd = new GridData(GridData.FILL_BOTH);
-					section.getSection().setLayoutData(gd);
-					section.getSection().setExpanded(true);
-				}
-				IStructuredSelection newselection = new StructuredSelection(
-						component);
-				section.getStructuredViewer().setSelection(newselection);
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java
deleted file mode 100644
index c9ff0ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java
+++ /dev/null
@@ -1,396 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.FacesConfigDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacesConfigMasterSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.forms.DetailsPart;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IDetailsPageProvider;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * In some cases the page is a master-detail style, the content of the right
- * side will change according user's selection on the left side. This is an
- * abstract implementation of IFacesConfigPage, with a FacesConfigMasterSection
- * array and a DetailsPart.
- * 
- * @author sfshi
- * 
- */
-public abstract class FacesConfigMasterDetailPage extends FormPage implements
-		IFacesConfigPage, IDetailsPageProvider, ISelectionChangedListener,
-		ISelectionProvider, IEditingDomainProvider {
-
-	private static final String BANNER_IMAGE_FILE = "form_banner.gif"; //$NON-NLS-1$
-
-	private final static Image BANNER_IMAGE = EditorPlugin.getDefault()
-			.getImage(BANNER_IMAGE_FILE);
-
-	private FacesConfigMasterSection[] facesConfigMasterSections;
-
-	private DetailsPart detailsPart;
-
-	private Object input;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	private IPropertySheetPage propertySheetPage;
-	
-	private ISelection currentSelection = null;
-
-	/**
-	 * 
-	 * @param editor
-	 *            the editor part that this page belongs to;
-	 * @param id
-	 *            page id;
-	 * @param title
-	 *            page title;
-	 */
-	public FacesConfigMasterDetailPage(FacesConfigEditor editor, String id,
-			String title) {
-		super(editor, id, title);
-	}
-
-	public void dispose() {
-		for(int i=0; i < facesConfigMasterSections.length;i++) {
-			FacesConfigMasterSection master = facesConfigMasterSections[i];
-			if (master != null)
-				master.dispose();
-		}
-		
-		selectionChangedListeners.clear();
-		
-		super.dispose();
-	}
-	public EditingDomain getEditingDomain() {
-		return ((FacesConfigEditor) getEditor()).getEditingDomain();
-	}
-
-	/**
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-
-		ScrolledForm form = managedForm.getForm();
-		form.setText(this.getTitle());
-		form.setBackgroundImage(BANNER_IMAGE); 
-		fillBody(managedForm, managedForm.getToolkit());
-		managedForm.refresh();
-	}
-
-	/**
-	 * set input for this page when the it got activated at the first time; if
-	 * it's not the first time, then refresh the page.
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean)
-	 */
-	public void setActive(boolean active) {
-		super.setActive(active);
-		if (active) {
-			if (getInput() != ((FacesConfigEditor) getEditor())
-					.getFacesConfig()) {
-				setInput(((FacesConfigEditor) getEditor()).getFacesConfig());
-			} else {
-				this.refresh();
-			}
-		}
-	}
-
-	public boolean isEditor() {
-		return true;
-	}
-
-	/**
-	 * 
-	 * @param managedForm
-	 * @param toolkit
-	 */
-	private void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
-		Composite body = managedForm.getForm().getBody();
-
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.horizontalSpacing = 0;
-		gridLayout.verticalSpacing = 0;
-		gridLayout.numColumns = 2;
-		gridLayout.marginHeight = 0;
-		gridLayout.marginWidth = 0;
-		body.setLayout(gridLayout);
-
-		SashForm sashForm = new SashForm(body, SWT.NULL);
-		managedForm.getToolkit().adapt(sashForm, false, false);
-		sashForm.setMenu(body.getMenu());
-		sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		Composite leftContainer = toolkit.createComposite(sashForm);
-		GridLayout gl = new GridLayout();
-		gl.marginHeight = 0;
-		leftContainer.setLayout(gl);
-
-		// create master sections here
-		facesConfigMasterSections = createMasterSections(leftContainer,
-				managedForm, toolkit, this);
-
-		if (facesConfigMasterSections != null) {
-			for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-				FacesConfigMasterSection aSection = facesConfigMasterSections[i];
-				aSection.initialize();
-				aSection.addSelectionChangedListener(this);
-
-			}
-		}
-
-		detailsPart = new DetailsPart(managedForm, sashForm, SWT.NULL);
-		managedForm.addPart(detailsPart);
-
-		detailsPart.setPageLimit(4);
-		detailsPart.setPageProvider(this);
-
-		detailsPart.initialize(managedForm);
-
-		sashForm.setWeights(new int[] { 40, 60 });
-
-		getSite().setSelectionProvider(this);
-	}
-
-	/**
-	 * Create the detail sections, and set layout data and initial expand state
-	 * for them.
-	 * 
-	 * @param composite
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 * @return the detail sections
-	 */
-	abstract protected FacesConfigMasterSection[] createMasterSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page);
-
-	/**
-	 * set input object; also set into all the master sections.
-	 */
-	public void setInput(Object input) {
-		if (facesConfigMasterSections != null) {
-			for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-				facesConfigMasterSections[i].setInput(input);
-			}
-		}
-		this.input = input;
-	}
-
-	/**
-	 * get the input object.
-	 */
-	public Object getInput() {
-		return input;
-	}
-
-	/**
-	 * Defaultly use the EClass object of the selected object as page key. Sub
-	 * classes can override this method if there has other ways.
-	 * 
-	 * @param object
-	 */
-	public Object getPageKey(Object object) {
-		if (object instanceof EObject) {
-			EObject eObject = (EObject) object;
-			return eObject.eClass();
-		}
-		return null;
-	}
-
-	/**
-	 * Subclasses should create and return an IDetailsPage instance according
-	 * what the key is. Defaultly the EClass object of the selected object in
-	 * the structured viewer will be taken as the page key.
-	 * 
-	 * @see #getPageKey
-	 * 
-	 */
-	abstract public IDetailsPage getPage(Object key);
-
-	/**
-	 * transfer the selection changed event to detail part.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-
-		currentSelection = event.getSelection();
-		if (event.getSource() instanceof FacesConfigMasterSection) {
-			FacesConfigMasterSection source = (FacesConfigMasterSection) event
-					.getSource();
-
-			detailsPart.selectionChanged(source, event.getSelection());
-
-			if (source.getSection().isExpanded()) {
-				for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
-					((ISelectionChangedListener) selectionChangedListeners
-							.get(i)).selectionChanged(event);
-				}
-			}
-		} else if (event.getSource() instanceof FacesConfigDetailsPage) {
-			for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
-				((ISelectionChangedListener) selectionChangedListeners.get(i))
-						.selectionChanged(event);
-			}
-		}
-	}
-
-	/**
-	 * set other sections' expand state to false, except this section;
-	 * 
-	 * @param section
-	 *            the section that be expanded.
-	 */
-	public void closeOtherSections(FacesConfigMasterSection section) {
-
-		for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-			FacesConfigMasterSection aSection = facesConfigMasterSections[i];
-			if (aSection != section && aSection.getSection().isExpanded()) {
-				aSection.getSection().setExpanded(false);
-				GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-				aSection.getSection().setLayoutData(gd);
-			}
-		}
-	}
-
-	/**
-	 * refresh this page, the expanded section and the detail page will got
-	 * refreshed.
-	 */
-	public void refresh() {
-
-		// only refresh the expanded section;
-		for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-			if (facesConfigMasterSections[i].getSection().isExpanded()) {
-				facesConfigMasterSections[i].refresh();
-			}
-		}
-
-		// refresh the detail page, it will call detail sections
-		// to got refreshed.
-		if (detailsPart.getCurrentPage() != null) {
-			detailsPart.getCurrentPage().refresh();
-		}
-	}
-
-	/**
-	 * get the section that is expanded.
-	 * 
-	 * @return the master section
-	 */
-	protected FacesConfigMasterSection getActiveSection() {
-		for (int i = 0, n = facesConfigMasterSections.length; i < n; i++) {
-
-			if (facesConfigMasterSections[i].getSection().isExpanded()) {
-				return facesConfigMasterSections[i];
-			}
-		}
-		return null;
-
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	public ISelection getSelection() {
-		if(currentSelection != null)
-			return currentSelection;
-		return StructuredSelection.EMPTY;
-
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	public void setSelection(ISelection selection) {
-	    // no selection setting
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		}
-		return super.getAdapter(adapter);
-	}
-
-	private IPropertySheetPage getPropertySheetPage() {
-
-		AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) getEditor()
-				.getAdapter(EditingDomain.class);
-		AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-				.getAdapter(AdapterFactory.class);
-		if (propertySheetPage == null) {
-			propertySheetPage = new ExtendedPropertySheetPage(editingDomain) {
-				public void setSelectionToViewer(List selection) {
-					// FacesConfigEditor.this.setSelectionToViewer(selection);
-					// FacesConfigEditor.this.setFocus();
-				}
-
-				public void setActionBars(IActionBars actionBars) {
-					super.setActionBars(actionBars);
-					// getActionBarContributor().shareGlobalActions(this,
-					// actionBars);
-				}
-			};
-			((ExtendedPropertySheetPage) propertySheetPage)
-					.setPropertySourceProvider(new AdapterFactoryContentProvider(
-							adapterFactory));
-			// this.addSelectionChangedListener((ExtendedPropertySheetPage)
-			// propertySheetPage);
-		}
-
-		return propertySheetPage;
-
-	}
-
-	/**
-	 * @return the facesConfigMasterSections
-	 */
-	public FacesConfigMasterSection[] getFacesConfigMasterSections() {
-		return facesConfigMasterSections;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IFacesConfigPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IFacesConfigPage.java
deleted file mode 100644
index 42afa4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IFacesConfigPage.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.ui.forms.editor.IFormPage;
-
-/**
- * Implemented by IFormPage's that want to support EditorInput-like
- * model set/get/refresh
- * 
- * @author sfshi
- * 
- */
-public interface IFacesConfigPage extends IFormPage {
-
-	/**
-	 * Set the input.  Implementer may choose to ignore
-	 * 
-	 * @param input
-	 */
-	void setInput(Object input);
-
-	/**
-	 * @return the input or null if none set
-	 */
-	Object getInput();
-
-	/**
-	 * signal to a form page that the data in its input has changed
-	 * and it should refresh its view.
-	 */
-	void refresh();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IntroductionPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IntroductionPage.java
deleted file mode 100644
index f3e1354..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/IntroductionPage.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.IntroductionSection;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-/**
- * Handle the Introduction page for the pageflow editor.
- * 
- * @author jchoi
- */
-public class IntroductionPage extends FormPage implements IFacesConfigPage, ISelectionProvider, IPropertyChangeListener{
-	
-	private static final String FORM_BANNER_IMAGE_FILE = "form_banner.gif"; //$NON-NLS-1$
-	
-	private Button noIntroPageButton = null;
-
-	/**
-	 * @param facesConfigEditor
-	 */
-	public IntroductionPage(FacesConfigEditor facesConfigEditor) {
-		super(facesConfigEditor, IntroductionPage.class.getName(),
-				EditorMessages.editor_pageflow_page_intro_name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-		// get the form
-		ScrolledForm form = managedForm.getForm();
-		FormToolkit toolkit = getEditor().getToolkit();
-		form.setText(EditorMessages.editor_pageflow_page_intro_title);
-
-		form.setBackgroundImage(EditorPlugin.getDefault().getImage(FORM_BANNER_IMAGE_FILE));
-
-		// create a layout
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.numColumns = 1;
-		layout.makeColumnsEqualWidth = true;
-		layout.verticalSpacing = 20;
-		form.getBody().setLayout(layout);
-
-		IntroductionSection introPart = new IntroductionSection(
-				FacesConfigEditor.EDITOR_ID, managedForm, toolkit,
-				EditorMessages.editor_pageflow_page_intro_help_HelpContextID,
-				EditorMessages.editor_pageflow_page_intro_help_HelpToolTip);
-		
-		noIntroPageButton = toolkit.createButton(form.getBody(), EditorMessages.editor_pageflow_page_intro_NoIntroPage, SWT.CHECK);
-		noIntroPageButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean selection = ((Button) e.widget).getSelection();
-				EditorPlugin.getDefault().getPreferenceStore().setValue(GEMPreferences.SHOW_INTRO_EDITOR, !selection);
-			}
-		});
-		TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB);
-		td.colspan = 1;
-		introPart.setLayoutData(td);
-
-		getSite().setSelectionProvider(this);
-		
-		IPreferenceStore preferenceStore = EditorPlugin.getDefault().getPreferenceStore();
-		preferenceStore.addPropertyChangeListener(this);
-		updatePrefenceControls(preferenceStore);
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-		
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.IFormPage#isEditor()
-	 */
-	public boolean isEditor() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void setSelection(ISelection selection) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage#getInput()
-	 */
-	public Object getInput() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage#refresh()
-	 */
-	public void refresh() {
-		// TODO Auto-generated method stub
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage#setInput(java.lang.Object)
-	 */
-	public void setInput(Object input) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		if (event != null) {
-			String property = event.getProperty();
-			if (property == null || property.equals(GEMPreferences.SHOW_INTRO_EDITOR)) {
-				//assume that we are in an ui thread, as other listeners assume this too:
-				updatePrefenceControls(EditorPlugin.getDefault().getPreferenceStore());
-			}
-		}
-	}
-
-	private void updatePrefenceControls(IPreferenceStore preferenceStore) {
-		boolean noIntroPage = !GEMPreferences.getShowIntroEditor();
-		noIntroPageButton.setSelection(noIntroPage);
-	}
-
-	public void dispose() {
-		EditorPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-		super.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ManagedBeanPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ManagedBeanPage.java
deleted file mode 100644
index ad6ef9a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ManagedBeanPage.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.detail.ManagedBeanDetailsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacesConfigMasterSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanMasterSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanPage extends FacesConfigMasterDetailPage {
-
-    /**
-     * The id of this page in the faces-config editor.
-     */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.ManagedBeanPage"; //$NON-NLS-1$
-
-	private IContentOutlinePage contentOutlinePage;
-
-	/**
-	 * @param editor
-	 */
-	public ManagedBeanPage(FacesConfigEditor editor) {
-		super(editor, "ManagedBeanPage", //$NON-NLS-1$
-				EditorMessages.FacesConfigEditor_ManagedBeans_TabName);
-	}
-
-	public void dispose() {
-		if (contentOutlinePage != null) {
-			contentOutlinePage.dispose();
-			contentOutlinePage = null;
-		}
-		super.dispose();
-	}
-	protected FacesConfigMasterSection[] createMasterSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page) {
-		FacesConfigMasterSection managedBeanMaster = new ManagedBeanMasterSection(
-				composite, managedForm, toolkit, page);
-		managedBeanMaster.getSection().setExpanded(true);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		managedBeanMaster.getSection().setLayoutData(gd);
-		return new FacesConfigMasterSection[] { managedBeanMaster };
-	}
-
-	public IDetailsPage getPage(Object key) {
-		IDetailsPage detailsPage = null;
-		if (key instanceof EClass) {
-			EClass eClass = (EClass) key;
-			if (eClass.getClassifierID() == FacesConfigPackage.MANAGED_BEAN_TYPE) {
-				detailsPage = new ManagedBeanDetailsPage(this);
-			}
-			
-			if (detailsPage instanceof ISelectionProvider) {
-				((ISelectionProvider) detailsPage)
-						.addSelectionChangedListener(this);
-			}
-		}
-		return detailsPage;
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private IContentOutlinePage getOutlinePage() {
-
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class ManagedBeanContentOutlinePage extends ContentOutlinePage {
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					TreeViewer contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-							.getAdapter(AdapterFactory.class);
-					// Set up the tree viewer.
-					contentOutlineViewer
-							.setContentProvider(new AdapterFactoryContentProvider(
-									adapterFactory));
-					contentOutlineViewer
-							.setLabelProvider(new AdapterFactoryLabelProvider(
-									adapterFactory));
-					contentOutlineViewer.addFilter(new ViewerFilter() {
-
-						public boolean select(Viewer viewer,
-								Object parentElement, Object element) {
-							return FacesConfigPackage.eINSTANCE
-									.getManagedBeanType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getManagedPropertyType()
-											.isInstance(element);
-						}
-					});
-
-					contentOutlineViewer.setSorter(new ViewerSorter());
-					contentOutlineViewer.setInput(getInput());
-				}
-
-			}
-
-			contentOutlinePage = new ManagedBeanContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special
-			// way.
-			//
-			contentOutlinePage
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						// This ensures that we handle selections correctly.
-						public void selectionChanged(SelectionChangedEvent event) {
-							setSelection(event.getSelection());
-						}
-					});
-
-			// this.addSelectionChangedListener((ContentOutlinePage)
-			// contentOutlinePage);
-		}
-
-		return contentOutlinePage;
-
-	}
-
-	/**
-	 * handle the selection changed event from outline page.
-	 * 
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			ManagedBeanType bean = null;
-			if (ss.getFirstElement() instanceof ManagedBeanType) {
-				bean = (ManagedBeanType) ss.getFirstElement();
-			} else if (ss.getFirstElement() instanceof ManagedPropertyType) {
-				bean = (ManagedBeanType) ((ManagedPropertyType) ss
-						.getFirstElement()).eContainer();
-			}
-
-			if (bean != null) {
-				if (!getManagedBeanMasterSection().getSection().isExpanded()) {
-					GridData gd = new GridData(GridData.FILL_BOTH);
-					getManagedBeanMasterSection().getSection()
-							.setLayoutData(gd);
-					getManagedBeanMasterSection().getSection()
-							.setExpanded(true);
-				}
-				IStructuredSelection newselection = new StructuredSelection(
-						bean);
-				getManagedBeanMasterSection().getStructuredViewer()
-						.setSelection(newselection);
-			}
-		}
-
-	}
-
-	private ManagedBeanMasterSection getManagedBeanMasterSection() {
-		return (ManagedBeanMasterSection) getFacesConfigMasterSections()[0];
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OthersPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OthersPage.java
deleted file mode 100644
index 021e7b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OthersPage.java
+++ /dev/null
@@ -1,836 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ApplicationSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FactorySection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.LifecycleSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.LocaleConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OthersPageBaseSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-
-/**
- * This class is the "Others" page.
- */
-public class OthersPage extends FormPage implements IFacesConfigPage,
-		ISelectionProvider, ISelectionChangedListener, IEditingDomainProvider {
-
-    private static final String BANNER_IMAGE_FILE = "form_banner.gif"; //$NON-NLS-1$
-
-	/**
-     * The id of this page in the faces-config editor.
-     */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage"; //$NON-NLS-1$
-
-	private final static Image BANNER_IMAGE = EditorPlugin.getDefault()
-			.getImage(BANNER_IMAGE_FILE);
-
-	private List leftSections;
-
-	private List rightSections;
-
-	private Object input;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	private IPropertySheetPage propertySheetPage;
-
-	private IContentOutlinePage contentOutlinePage;
-
-	private ISelection currentSelection;
-
-	private FacesConfigOthersAdapter _facesConfigOthersAdapter;
-
-	/**
-	 * Constructor of OthersPage;
-	 * 
-	 * @param editor
-	 *            the facesconfig editor;
-	 */
-	public OthersPage(FacesConfigEditor editor) {
-		super(editor, "OthersPage", //$NON-NLS-1$
-				EditorMessages.FacesConfigEditor_Others_TabName);
-	}
-
-	protected void createFormContent(IManagedForm managedForm) {
-		super.createFormContent(managedForm);
-		ScrolledForm form = managedForm.getForm();
-		form.setText(EditorMessages.OthersPage_Title);
-		form.setBackgroundImage(BANNER_IMAGE);
-		fillBody(managedForm, managedForm.getToolkit());
-		managedForm.refresh();
-	}
-
-	private void initSection(OthersPageBaseSection section, String name,
-			String description, ArrayList list) {
-		section.getSection().setText(name);
-		section.getSection().setDescription(description);
-		section.initialize();
-		section.addSelectionChangedListener(this);
-		section.getSection().setExpanded(false);
-		section.getSection().setLayoutData(
-				new GridData(GridData.FILL_HORIZONTAL));
-		list.add(section);
-	}
-
-	public void dispose() {
-		disposeFormSections(rightSections);
-		disposeFormSections(leftSections);
-		removeAdapterFromInput(getInput());
-		getSite().setSelectionProvider(null);
-		super.dispose();
-	}
-
-	private void disposeFormSections(List sections) {
-		for (int i=0; i < sections.size();i++) {
-			OthersPageBaseSection section = (OthersPageBaseSection) sections.get(i);
-			section.removeSelectionChangedListener(this);
-			section.dispose();
-		}
-	}
-	
-	private void fillBody(IManagedForm managedForm, FormToolkit toolkit) {
-		Composite body = managedForm.getForm().getBody();
-
-		body.setLayout(new GridLayout());
-
-		SashForm sashForm = new SashForm(body, SWT.NONE);
-		managedForm.getToolkit().adapt(sashForm, false, false);
-		sashForm.setMenu(body.getMenu());
-		sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		Composite leftContainer = toolkit.createComposite(sashForm);
-		leftContainer.setLayout(new GridLayout());
-
-		ArrayList sectionList = new ArrayList();
-
-		OthersPageBaseSection section = new ApplicationSection(
-				FacesConfigPackage.eINSTANCE.getActionListenerType(),
-				leftContainer, managedForm, this, toolkit);
-		initSection(section, EditorMessages.ActionListenerSection_Name,
-				EditorMessages.ActionListenerSection_Description,
-				sectionList);
-		section.getSection().setLayoutData(new GridData(GridData.FILL_BOTH));
-		section.getSection().setExpanded(true);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getDefaultRenderKitIdType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.DefaultRenderKitIDSection_Name,
-				EditorMessages.DefaultRenderKitIDSection_Description,
-				sectionList);
-
-		section = new LocaleConfigSection(FacesConfigPackage.eINSTANCE
-				.getSupportedLocaleType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.LocaleConfigSection_Name,
-				EditorMessages.LocaleConfigSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getMessageBundleType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.MessageBundleSection_Name,
-				EditorMessages.MessageBundleSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getNavigationHandlerType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.NavigationHandlerSection_Name,
-				EditorMessages.NavigationHandlerSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getPropertyResolverType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.PropertyResolverSection_Name,
-				EditorMessages.PropertyResolverSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getStateManagerType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.StateManagerSection_Name,
-				EditorMessages.StateManagerSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getVariableResolverType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.VariableResolverSection_Name,
-				EditorMessages.VariableResolverSection_Description,
-				sectionList);
-
-		section = new ApplicationSection(FacesConfigPackage.eINSTANCE
-				.getViewHandlerType(), leftContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.ViewHandlerSection_Name,
-				EditorMessages.ViewHandlerSection_Description,
-				sectionList);
-
-		leftSections = sectionList;
-
-		sectionList = new ArrayList();
-
-		Composite rightContainer = toolkit.createComposite(sashForm);
-		rightContainer.setLayout(new GridLayout());
-		rightContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getApplicationFactoryType(), rightContainer, managedForm,
-				this, toolkit);
-		initSection(section,
-				EditorMessages.ApplicationFactorySection_Name,
-				EditorMessages.ApplicationFactorySection_Description,
-				sectionList);
-		section.getSection().setLayoutData(new GridData(GridData.FILL_BOTH));
-		section.getSection().setExpanded(true);
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getFacesContextFactoryType(), rightContainer, managedForm,
-				this, toolkit);
-		initSection(section,
-				EditorMessages.FacesContextFactorySection_Name,
-				EditorMessages.FacesContextFactorySection_Description,
-				sectionList);
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getLifecycleFactoryType(), rightContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.LifecycleFactorySection_Name,
-				EditorMessages.LifecycleFactorySection_Description,
-				sectionList);
-
-		section = new FactorySection(FacesConfigPackage.eINSTANCE
-				.getRenderKitFactoryType(), rightContainer, managedForm, this,
-				toolkit);
-		initSection(section,
-				EditorMessages.RenderKitFactorySection_Name,
-				EditorMessages.RenderKitFactorySection_Description,
-				sectionList);
-
-		section = new LifecycleSection(FacesConfigPackage.eINSTANCE
-				.getPhaseListenerType(), rightContainer, managedForm, this,
-				toolkit);
-		initSection(section, EditorMessages.PhaseListenerSection_Name,
-				EditorMessages.PhaseListenerSection_Description,
-				sectionList);
-
-		rightSections = sectionList;
-
-		getSite().setSelectionProvider(this);
-	}
-
-	/**
-	 * set input for this page when the it got activated at the first time; if
-	 * it's not the first time, then refresh the page.
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean)
-	 */
-	public void setActive(boolean active) {
-		super.setActive(active);
-		if (active) {
-			if (getInput() != ((FacesConfigEditor) getEditor())
-					.getFacesConfig()) {
-				setInput(((FacesConfigEditor) getEditor()).getFacesConfig());
-			} else {
-				this.refresh();
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void setInput(Object input) {
-		if (input instanceof FacesConfigType) {
-			this.input = input;
-			FacesConfigType facesConfig = (FacesConfigType) input;
-			facesConfig.eAdapters().add(getFacesConfigAdapter());
-			setInputForApplicationSections(facesConfig);
-			setInputForFactorySections(facesConfig);
-			setInputForLifecycleSections(facesConfig);
-		}
-	}
-
-	private void removeAdapterFromInput(Object input_) {
-		if (_facesConfigOthersAdapter != null && input_ != null && input_ instanceof FacesConfigType) {
-			((FacesConfigType)input_).eAdapters().remove(_facesConfigOthersAdapter);
-		}
-	}
-	
-	private Adapter getFacesConfigAdapter() {
-		if (_facesConfigOthersAdapter == null) {
-			_facesConfigOthersAdapter = new FacesConfigOthersAdapter();
-		}
-		return _facesConfigOthersAdapter;
-	}
-
-	public boolean isEditor() {
-		return true;
-	}
-
-	/**
-	 * Reset the editor input for the application section
-	 */
-	public void resetApplicationInput() {
-		if (getInput() instanceof FacesConfigType) {
-			setInputForApplicationSections((FacesConfigType) getInput());
-		}
-	}
-
-	/**
-	 * Reset the editor input for the factory sections
-	 */
-	public void resetFactoryInput() {
-		if (getInput() instanceof FacesConfigType) {
-			setInputForFactorySections((FacesConfigType) getInput());
-		}
-	}
-
-	/**
-	 * Reset the editor input for the lifecycle section
-	 */
-	public void resetLifecycleInput() {
-		if (getInput() instanceof FacesConfigType) {
-			setInputForLifecycleSections((FacesConfigType) getInput());
-		}
-	}
-
-	/**
-	 * Sets the model for all Application sub-model elements to facesConfig
-	 * @param facesConfig
-	 */
-	protected void setInputForApplicationSections(FacesConfigType facesConfig) {
-		ApplicationType application;
-		if (facesConfig.getApplication().size() > 0) {
-			application = (ApplicationType) facesConfig.getApplication().get(0);
-		} else {
-			application = null;
-		}
-		for (Iterator it = leftSections.iterator(); it.hasNext();) {
-			ApplicationSection section = (ApplicationSection) it.next();
-			section.setInput(application);
-		}
-	}
-
-	/**
-	 * Sets the model for all Factory  sub-model elements to facesConfig
-	 * @param facesConfig
-	 */
-	protected void setInputForFactorySections(FacesConfigType facesConfig) {
-		FactoryType factory;
-		if (facesConfig.getFactory().size() > 0) {
-			factory = (FactoryType) facesConfig.getFactory().get(0);
-		} else {
-			factory = null;
-		}
-
-		for (Iterator it = rightSections.iterator(); it.hasNext();) {
-			Object section = it.next();
-			if (section instanceof FactorySection)
-				((FactorySection) section).setInput(factory);
-		}
-	}
-
-	/**
-	 * Sets the model for all Lifecycle sub-model elements to facesConfig
-	 * @param facesConfig
-	 */
-	protected void setInputForLifecycleSections(FacesConfigType facesConfig) {
-		LifecycleType lifecycle;
-		if (facesConfig.getLifecycle().size() > 0) {
-			lifecycle = (LifecycleType) facesConfig.getLifecycle().get(0);
-
-		} else {
-			lifecycle = null;
-		}
-		for (Iterator it = rightSections.iterator(); it.hasNext();) {
-			Object section = it.next();
-			if (section instanceof LifecycleSection)
-				((LifecycleSection) section).setInput(lifecycle);
-		}
-	}
-
-	public Object getInput() {
-		return input;
-	}
-
-	public void refresh() {
-
-		// only refresh the expanded section;
-		for (int i = 0, n = leftSections.size(); i < n; i++) {
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				section.refresh();
-			}
-		}
-
-		for (int i = 0, n = rightSections.size(); i < n; i++) {
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				section.refresh();
-			}
-		}
-
-	}
-
-	/**
-	 * set other sections' expand state to false, except this section;
-	 * 
-	 * @param section
-	 *            the section that be expanded.
-	 */
-	public void closeOtherSections(AbstractFacesConfigSection section) {
-		OthersPageBaseSection[] sections;
-		if (leftSections.contains(section)) {
-			sections = (OthersPageBaseSection[]) leftSections
-					.toArray(new OthersPageBaseSection[leftSections.size()]);
-		} else {
-			sections = (OthersPageBaseSection[]) rightSections
-					.toArray(new OthersPageBaseSection[rightSections.size()]);
-		}
-		for (int i = 0, n = sections.length; i < n; i++) {
-			AbstractFacesConfigSection aSection = sections[i];
-			if (aSection != section && aSection.getSection().isExpanded()) {
-				aSection.getSection().setExpanded(false);
-				GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-				aSection.getSection().setLayoutData(gd);
-			}
-		}
-	}
-
-	/**
-	 * An adapter on faces config.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class FacesConfigOthersAdapter extends AdapterImpl {
-		public void notifyChanged(Notification msg) {
-			if (msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.ADD) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Application()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						resetApplicationInput();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								resetApplicationInput();
-							}
-						});
-					}
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Factory()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						resetFactoryInput();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								resetFactoryInput();
-							}
-						});	
-					}
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Lifecycle()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						resetLifecycleInput();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								resetLifecycleInput();
-							}
-						});	
-					}
-				}
-			}
-		}
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-
-		selectionChangedListeners.add(listener);
-	}
-
-	public ISelection getSelection() {
-		if (currentSelection != null)
-			return currentSelection;
-
-		return StructuredSelection.EMPTY;
-	}
-
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		// TODO Auto-generated method stub
-
-		selectionChangedListeners.remove(listener);
-	}
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		currentSelection = event.getSelection();
-		if (event.getSource() instanceof OthersPageBaseSection) {
-			OthersPageBaseSection source = (OthersPageBaseSection) event
-					.getSource();
-
-			if (source.getSection().isExpanded()) {
-				for (int i = 0, n = selectionChangedListeners.size(); i < n; i++) {
-					((ISelectionChangedListener) selectionChangedListeners
-							.get(i)).selectionChanged(event);
-				}
-			}
-		}
-	}
-
-	/**
-	 * get the section that is expanded.
-	 * 
-	 * @return the page section
-	 */
-	protected OthersPageBaseSection getActiveSection() {
-		for (int i = 0, n = leftSections.size(); i < n; i++) {
-
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				return section;
-			}
-		}
-
-		for (int i = 0, n = rightSections.size(); i < n; i++) {
-
-			OthersPageBaseSection section = (OthersPageBaseSection) leftSections
-					.get(i);
-			if (section.getSection().isExpanded()) {
-				return section;
-			}
-		}
-		return null;
-
-	}
-
-	public Object getAdapter(Class adapter) {
-
-		if (adapter == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		}
-
-		if (adapter == IContentOutlinePage.class) {
-			return getOutlinePage();
-		}
-
-		return super.getAdapter(adapter);
-	}
-
-	private IPropertySheetPage getPropertySheetPage() {
-
-		AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) getEditor()
-				.getAdapter(EditingDomain.class);
-		AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-				.getAdapter(AdapterFactory.class);
-		if (propertySheetPage == null) {
-			propertySheetPage = new ExtendedPropertySheetPage(editingDomain) {
-				public void setSelectionToViewer(List selection) {
-					// FacesConfigEditor.this.setSelectionToViewer(selection);
-					// FacesConfigEditor.this.setFocus();
-				}
-
-				public void setActionBars(IActionBars actionBars) {
-					super.setActionBars(actionBars);
-					// getActionBarContributor().shareGlobalActions(this,
-					// actionBars);
-				}
-			};
-			((ExtendedPropertySheetPage) propertySheetPage)
-					.setPropertySourceProvider(new AdapterFactoryContentProvider(
-							adapterFactory));
-			// this.addSelectionChangedListener((ExtendedPropertySheetPage)
-			// propertySheetPage);
-		}
-
-		return propertySheetPage;
-
-	}
-
-	private IContentOutlinePage getOutlinePage() {
-
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class OthersContentOutlinePage extends ContentOutlinePage {
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					TreeViewer contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					AdapterFactory adapterFactory = (AdapterFactory) getEditor()
-							.getAdapter(AdapterFactory.class);
-					// Set up the tree viewer.
-					contentOutlineViewer
-							.setContentProvider(new AdapterFactoryContentProvider(
-									adapterFactory));
-					contentOutlineViewer
-							.setLabelProvider(new AdapterFactoryLabelProvider(
-									adapterFactory));
-					contentOutlineViewer.addFilter(new ViewerFilter() {
-
-						public boolean select(Viewer viewer,
-								Object parentElement, Object element) {
-							return FacesConfigPackage.eINSTANCE
-									.getApplicationType().isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getFactoryType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getLifecycleType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getActionListenerType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getDefaultRenderKitIdType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getLocaleConfigType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getDefaultLocaleType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getSupportedLocaleType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getMessageBundleType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getNavigationHandlerType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getPropertyResolverType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getStateManagerType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getVariableResolverType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getViewHandlerType().isInstance(
-													element)
-									|| FacesConfigPackage.eINSTANCE
-											.getApplicationFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getFacesContextFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getLifecycleFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getRenderKitFactoryType()
-											.isInstance(element)
-									|| FacesConfigPackage.eINSTANCE
-											.getPhaseListenerType().isInstance(
-													element)
-
-							;
-						}
-					});
-
-					contentOutlineViewer.setSorter(new ViewerSorter());
-					contentOutlineViewer.setInput(getInput());
-				}
-
-			}
-
-			contentOutlinePage = new OthersContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special
-			// way.
-			//
-			contentOutlinePage
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-						// This ensures that we handle selections correctly.
-						public void selectionChanged(SelectionChangedEvent event) {
-							setSelection(event.getSelection());
-						}
-					});
-
-		}
-
-		return contentOutlinePage;
-
-	}
-
-	/**
-	 * handle the selection changed event from outline page.
-	 * 
-	 * @param selection
-	 */
-	public void setSelection(ISelection selection) {
-
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			if (ss.isEmpty())
-				return;
-
-			final EObject object = (EObject) ss.getFirstElement();
-			OthersPageBaseSection section = null;
-
-			if (FacesConfigPackage.eINSTANCE.getActionListenerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(0);
-			} else if (FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(1);
-			} else if (FacesConfigPackage.eINSTANCE.getLocaleConfigType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getDefaultLocaleType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getSupportedLocaleType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getMessageBundleType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(3);
-			} else if (FacesConfigPackage.eINSTANCE.getNavigationHandlerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(4);
-			} else if (FacesConfigPackage.eINSTANCE.getPropertyResolverType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(5);
-			} else if (FacesConfigPackage.eINSTANCE.getStateManagerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(6);
-			} else if (FacesConfigPackage.eINSTANCE.getVariableResolverType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(7);
-			} else if (FacesConfigPackage.eINSTANCE.getViewHandlerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) leftSections.get(8);
-			} else if (FacesConfigPackage.eINSTANCE.getApplicationFactoryType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(0);
-			} else if (FacesConfigPackage.eINSTANCE
-					.getFacesContextFactoryType().isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(1);
-			} else if (FacesConfigPackage.eINSTANCE.getLifecycleFactoryType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(2);
-			} else if (FacesConfigPackage.eINSTANCE.getRenderKitFactoryType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(3);
-			} else if (FacesConfigPackage.eINSTANCE.getPhaseListenerType()
-					.isInstance(object)) {
-				section = (OthersPageBaseSection) rightSections.get(4);
-			}
-			if (section != null) {
-				if ((Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread())) {
-					 setSelectionInSection(section, object);
-				} 
-				else {
-					final OthersPageBaseSection baseSection = section;
-					PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
-						public void run() {
-							setSelectionInSection(baseSection, object);							
-						}
-					});
-				 }
-			}
-		}
-	}
-
-	private void setSelectionInSection(final OthersPageBaseSection section, final Object object) {
-		if (!section.getSection().isExpanded()) {
-			this.closeOtherSections(section);
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			section.getSection().setLayoutData(gd);
-			section.getSection().setExpanded(true);
-		}
-		IStructuredSelection newselection = new StructuredSelection(
-				object);
-		section.getTableViewer().setSelection(newselection);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.edit.domain.IEditingDomainProvider#getEditingDomain()
-	 */
-	public EditingDomain getEditingDomain() {
-		return ((FacesConfigEditor) getEditor()).getEditingDomain();
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OverviewPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OverviewPage.java
deleted file mode 100644
index 808a89f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OverviewPage.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewComponentsSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewGeneralSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewManagedBeanSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewNavigationSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.OverviewOthersSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * @author jchoi, Xiao-guang Zhang
- * @version
- */
-public class OverviewPage extends FormPage implements ISelectionProvider,
-		IFacesConfigPage {
-
-
-    /**
-     * The id of this page in the faces-config editor.
-     */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.OverviewPage"; //$NON-NLS-1$
-	
-	private static final int LAYOUT_MARGIN_HEIGHT = 2;
-
-	private static final int LAYOUT_MARGIN_WIDTH = 2;
-
-	private Object input;
-
-	private OverviewGeneralSection generalSection;
-
-	private OverviewManagedBeanSection beanSection;
-
-	private OverviewComponentsSection componentsSection;
-
-	//
-	private OverviewNavigationSection navigationSection;
-
-	//
-	private OverviewOthersSection otherSection;
-
-	/**
-	 * 
-	 * @param editor
-	 */
-	public OverviewPage(FormEditor editor) {
-		super(editor, "OverviewPage", EditorMessages.OverviewPage_page_name); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
-	 */
-	protected void createFormContent(IManagedForm managedForm) {
-
-		ScrolledForm form = managedForm.getForm();
-		form.setText(EditorMessages.OverviewPage_PageflowOverview_summary);
-		form.setBackgroundImage(EditorPlugin.getDefault().getImage(
-				"form_banner.gif")); //$NON-NLS-1$
-		Composite body = form.getBody();
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.marginWidth = LAYOUT_MARGIN_WIDTH;
-		gridLayout.marginHeight = LAYOUT_MARGIN_HEIGHT;
-		body.setLayout(gridLayout);
-		gridLayout = new GridLayout(2, true);
-		form.getBody().setLayout(gridLayout);
-		FormEditor editor = getEditor();
-		FormToolkit toolkit = editor.getToolkit();
-
-		// add overview general information
-		generalSection = new OverviewGeneralSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		generalSection.initialize();
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		generalSection.getSection().setLayoutData(gd);
-
-		// Navigation section
-		navigationSection = new OverviewNavigationSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		navigationSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		navigationSection.getSection().setLayoutData(gd);
-		navigationSection.getSection().setExpanded(true);
-
-		// ManagedBeans section
-		beanSection = new OverviewManagedBeanSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		beanSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		beanSection.getSection().setLayoutData(gd);
-		beanSection.getSection().setExpanded(true);
-
-		/* components section */
-		componentsSection = new OverviewComponentsSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		componentsSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		componentsSection.getSection().setLayoutData(gd);
-		componentsSection.getSection().setExpanded(true);
-
-		/* other sections */
-		otherSection = new OverviewOthersSection(managedForm.getForm()
-				.getBody(), managedForm, this, toolkit);
-		otherSection.initialize();
-		gd = new GridData(GridData.FILL_BOTH);
-		otherSection.getSection().setLayoutData(gd);
-		otherSection.getSection().setExpanded(true);
-
-		this.getSite().setSelectionProvider(this);
-
-	}
-
-	/**
-	 * set input for this page when the it got activated at the first time; if
-	 * it's not the first time, then refresh the page.
-	 * 
-	 * @see org.eclipse.ui.forms.editor.FormPage#setActive(boolean)
-	 */
-	public void setActive(boolean active) {
-		super.setActive(active);
-		if (active) {
-			if (getInput() != ((FacesConfigEditor) getEditor())
-					.getFacesConfig()) {
-				setInput(((FacesConfigEditor) getEditor()).getFacesConfig());
-			} else {
-				this.refresh();
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void setInput(Object input) {
-		if (input instanceof FacesConfigType) {
-			this.input = input;
-			navigationSection.setInput(input);
-			beanSection.setInput(input);
-			componentsSection.setInput(input);
-			otherSection.setInput(input);
-		}
-	}
-
-	/**
-	 * Call refreshAll on all sections on this page
-	 */
-	public void refreshAll() {
-		generalSection.refreshAll();
-		navigationSection.refreshAll();
-		beanSection.refreshAll();
-		componentsSection.refreshAll();
-		otherSection.refreshAll();
-	}
-
-	public Object getInput() {
-		return input;
-	}
-
-	public void refresh() {
-		generalSection.refresh();
-		navigationSection.refresh();
-		beanSection.refresh();
-		componentsSection.refresh();
-		otherSection.refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.forms.editor.IFormPage#isEditor()
-	 */
-	public boolean isEditor() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        // do not support change in selection
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-        // do not support change in selection
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // do not support change in selection
-	}
-	
-	public void dispose() {
-		beanSection.dispose();
-		componentsSection.dispose();
-		generalSection.dispose();
-		navigationSection.dispose();
-		otherSection.dispose();
-		super.dispose();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/WaitForLoadPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/WaitForLoadPage.java
deleted file mode 100644
index 1b20160..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/WaitForLoadPage.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page;
-
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-/**
- * A page the exists only be used before the editor's model is fully loaded
- * as a status placeholder while the user waits.
- * 
- * @author cbateman
- *
- */
-public class WaitForLoadPage extends FormPage 
-{
-
-    /**
-     * @param editor the parent
-     * @param id  the id of the editor within its parent
-     * @param title the title displayed to the user on the editor's tab
-     */
-    public WaitForLoadPage(FormEditor editor, String id, String title) {
-        super(editor, id, title);
-    }
-
-    @Override
-    protected void createFormContent(IManagedForm managedForm) {
-        // get the form
-        ScrolledForm form = managedForm.getForm();
-        //FormToolkit toolkit = getEditor().getToolkit();
-        form.setText(EditorMessages.FacesConfigEditor_WaitForLoadPage_Title);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ComponentDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ComponentDetailsPage.java
deleted file mode 100644
index 9a882d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ComponentDetailsPage.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AttributeSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ComponentGeneralSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.FacetSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.PropertySection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ComponentDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ComponentDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ComponentGeneralSection generalSection = new ComponentGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		AttributeSection attributeSection = new AttributeSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		attributeSection.getSection().setLayoutData(gd);
-
-		FacetSection facetSection = new FacetSection(composite, managedForm,
-				getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		facetSection.getSection().setLayoutData(gd);
-
-		PropertySection propertySection = new PropertySection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.getSection().setLayoutData(gd);
-		return new IFacesConfigSection[] { generalSection, attributeSection, facetSection,
-				propertySection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ConverterDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ConverterDetailsPage.java
deleted file mode 100644
index 0e720f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ConverterDetailsPage.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AttributeSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ConverterGeneralSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.PropertySection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- *
- */
-public class ConverterDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ConverterDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ConverterGeneralSection generalSection = new ConverterGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		AttributeSection attributeSection = new AttributeSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		attributeSection.getSection().setLayoutData(gd);
-
-
-		PropertySection propertySection = new PropertySection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.getSection().setLayoutData(gd);
-		return new IFacesConfigSection[] { generalSection, attributeSection,
-				propertySection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/FacesConfigDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/FacesConfigDetailsPage.java
deleted file mode 100644
index eec368a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/FacesConfigDetailsPage.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.AbstractFormPart;
-import org.eclipse.ui.forms.IDetailsPage;
-import org.eclipse.ui.forms.IFormPart;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * The detail part of a page. It contains several IFacesConfigSection instances.
- * 
- * @author sfshi
- * 
- */
-public abstract class FacesConfigDetailsPage extends AbstractFormPart implements
-		IDetailsPage, ISelectionProvider, ISelectionChangedListener {
-
-	private FacesConfigMasterDetailPage page;
-
-	private IFacesConfigSection[] detailSections;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/**
-	 * @param page
-	 */
-	public FacesConfigDetailsPage(FacesConfigMasterDetailPage page) {
-		super();
-		this.page = page;
-	}
-
-	public void createContents(Composite parent) {
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		parent.setLayout(layout);
-
-		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		FormToolkit toolkit = getManagedForm().getToolkit();
-		Composite detailsContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(detailsContainer);
-		detailsContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.marginHeight = 0;
-		detailsContainer.setLayout(gl);
-
-		detailSections = createDetailSections(detailsContainer,
-				getManagedForm(), toolkit, page);
-		if (detailSections != null) {
-			for (int i = 0, n = detailSections.length; i < n; i++) {
-				detailSections[i].initialize();
-				if (detailSections[i] instanceof ISelectionProvider) {
-					((ISelectionProvider) detailSections[i])
-							.addSelectionChangedListener(this);
-				}
-			}
-		}
-	}
-
-	/**
-	 * create the sub detail sections and set layout data for them.
-	 * 
-	 * @param composite
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page_ 
-	 * @return the detail sections
-	 */
-	abstract protected IFacesConfigSection[] createDetailSections(
-			Composite composite, IManagedForm managedForm, FormToolkit toolkit,
-			FacesConfigMasterDetailPage page_);
-
-	/**
-	 * 
-	 */
-	public void selectionChanged(IFormPart part, ISelection selection) {
-		Object selectedItem = ((StructuredSelection) selection)
-				.getFirstElement();
-		if (detailSections != null) {
-			for (int i = 0, n = detailSections.length; i < n; i++) {
-				IFacesConfigSection aSection = detailSections[i];
-				aSection.setInput(selectedItem);
-			}
-		}
-
-	}
-
-	/**
-	 * @return the master/detail page for this page
-	 */
-	public FacesConfigMasterDetailPage getPage() {
-		return page;
-	}
-
-	public void refresh() {
-		super.refresh();
-		if (detailSections != null) {
-			for (int i = 0, n = detailSections.length; i < n; i++) {
-				detailSections[i].refresh();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // no selection allowed
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ManagedBeanDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ManagedBeanDetailsPage.java
deleted file mode 100644
index 9ee1641..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ManagedBeanDetailsPage.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.InitializationSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanGeneralSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ManagedBeanDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ManagedBeanGeneralSection generalSection = new ManagedBeanGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		InitializationSection initializationSection  = new InitializationSection(
-				composite, managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_FILL);
-		initializationSection.getSection().setLayoutData(gd);
-	
-		return new IFacesConfigSection[] { generalSection, initializationSection};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/RenderkitDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/RenderkitDetailsPage.java
deleted file mode 100644
index efb8dd7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/RenderkitDetailsPage.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.RendererSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.RenderkitGeneralSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RenderkitDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public RenderkitDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		RenderkitGeneralSection generalSection = new RenderkitGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-		
-		RendererSection rendererSection = new RendererSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH | GridData.VERTICAL_ALIGN_FILL);
-		rendererSection.getSection().setLayoutData(gd);
-
-		return new IFacesConfigSection[] { generalSection,rendererSection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ValidatorDetailsPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ValidatorDetailsPage.java
deleted file mode 100644
index a238578..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/detail/ValidatorDetailsPage.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.page.detail;
-
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.section.AttributeSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.PropertySection;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ValidatorGeneralSection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ValidatorDetailsPage extends FacesConfigDetailsPage {
-
-	/**
-	 * 
-	 * @param page
-	 */
-	public ValidatorDetailsPage(FacesConfigMasterDetailPage page) {
-		super(page);
-	}
-
-	/**
-	 * create the detail sections and set layout for them.
-	 */
-	protected IFacesConfigSection[] createDetailSections(Composite composite,
-			IManagedForm managedForm, FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		ValidatorGeneralSection generalSection = new ValidatorGeneralSection(
-				composite, managedForm, getPage(), toolkit);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.getSection().setLayoutData(gd);
-
-		AttributeSection attributeSection = new AttributeSection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		attributeSection.getSection().setLayoutData(gd);
-
-		PropertySection propertySection = new PropertySection(composite,
-				managedForm, getPage(), toolkit);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.getSection().setLayoutData(gd);
-		return new IFacesConfigSection[] { generalSection, attributeSection,
-				propertySection };
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/DelegatingZoomManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/DelegatingZoomManager.java
deleted file mode 100644
index 0a8f335..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/DelegatingZoomManager.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-// import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.draw2d.ScalableFigure;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.editparts.ZoomListener;
-import org.eclipse.gef.editparts.ZoomManager;
-
-/**
- * A delegating ZoomManager.
- * 
- */
-public class DelegatingZoomManager extends ZoomManager implements ZoomListener {
-	/** Default string or double value of zoom level */
-	private static final String DEFAULT_ZOOM_LEVEL_STRING = "100%"; //$NON-NLS-1$
-
-	private static final double DEFAULT_ZOOM_LEVEL = 1;
-
-	/** the current ZoomManager all work is delegated to */
-	private ZoomManager currentZoomManager = null;
-
-	/** listeners of zoom */
-	private ListenerList zoomListeners = new ListenerList(
-			ListenerList.IDENTITY);
-
-	/**
-	 * Creates a new DelegatingZoomManager instance.
-	 */
-	public DelegatingZoomManager() {
-		super((ScalableFigure) null, (Viewport) null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomListener#zoomChanged(double)
-	 */
-	public void zoomChanged(double zoom) {
-		Object[] listeners = zoomListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((ZoomListener) listeners[i]).zoomChanged(zoom);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#addZoomListener(ZoomListener)
-	 */
-	public void addZoomListener(ZoomListener listener) {
-		zoomListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#removeZoomListener(oZoomListener)
-	 */
-	public void removeZoomListener(ZoomListener listener) {
-		zoomListeners.remove(listener);
-	}
-
-	/**
-	 * Sets the ZoomManager all work should be delegated to.
-	 * 
-	 * @param zoomManager
-	 */
-	public void setCurrentZoomManager(ZoomManager zoomManager) {
-		if (null != currentZoomManager) {
-			currentZoomManager.removeZoomListener(this);
-		}
-
-		currentZoomManager = zoomManager;
-		if (null != currentZoomManager) {
-			currentZoomManager.addZoomListener(this);
-			zoomChanged(currentZoomManager.getZoom());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#canZoomIn()
-	 */
-	public boolean canZoomIn() {
-		if (null == currentZoomManager) {
-			return false;
-		}
-
-		return currentZoomManager.canZoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#canZoomOut()
-	 */
-	public boolean canZoomOut() {
-		if (null == currentZoomManager) {
-			return false;
-		}
-
-		return currentZoomManager.canZoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getMaxZoom()
-	 */
-	public double getMaxZoom() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getMaxZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getMinZoom()
-	 */
-	public double getMinZoom() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getMinZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getNextZoomLevel()
-	 */
-	public double getNextZoomLevel() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getNextZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getPreviousZoomLevel()
-	 */
-	public double getPreviousZoomLevel() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getPreviousZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getScalableFigure()
-	 */
-	public ScalableFigure getScalableFigure() {
-		if (null == currentZoomManager) {
-			return null;
-		}
-
-		return currentZoomManager.getScalableFigure();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getUIMultiplier()
-	 */
-	public double getUIMultiplier() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getUIMultiplier();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getViewport()
-	 */
-	public Viewport getViewport() {
-		if (null == currentZoomManager) {
-			return null;
-		}
-
-		return currentZoomManager.getViewport();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoom()
-	 */
-	public double getZoom() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL;
-		}
-
-		return currentZoomManager.getZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoomAsText()
-	 */
-	public String getZoomAsText() {
-		if (null == currentZoomManager) {
-			return DEFAULT_ZOOM_LEVEL_STRING;
-		}
-
-		return currentZoomManager.getZoomAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoomLevels()
-	 */
-	public double[] getZoomLevels() {
-		if (null == currentZoomManager) {
-			return new double[] { DEFAULT_ZOOM_LEVEL };
-		}
-
-		return currentZoomManager.getZoomLevels();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#getZoomLevelsAsText()
-	 */
-	public String[] getZoomLevelsAsText() {
-		if (null == currentZoomManager) {
-			return new String[] { DEFAULT_ZOOM_LEVEL_STRING };
-		}
-
-		return currentZoomManager.getZoomLevelsAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setUIMultiplier(double)
-	 */
-	public void setUIMultiplier(double multiplier) {
-		if (null == currentZoomManager) {
-			return;
-		}
-
-		currentZoomManager.setUIMultiplier(multiplier);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setViewLocation(Point)
-	 */
-	public void setViewLocation(Point p) {
-		if (null == currentZoomManager) {
-			return;
-		}
-
-		currentZoomManager.setViewLocation(p);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoom(double)
-	 */
-	public void setZoom(double zoom) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoom(zoom);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoomAnimationStyle(int)
-	 */
-	public void setZoomAnimationStyle(int style) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoomAnimationStyle(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoomAsText(String)
-	 */
-	public void setZoomAsText(String zoomString) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoomAsText(zoomString);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#setZoomLevels(double[])
-	 */
-	public void setZoomLevels(double[] zoomLevels) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.setZoomLevels(zoomLevels);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#zoomIn()
-	 */
-	public void zoomIn() {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.zoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#zoomOut()
-	 */
-	public void zoomOut() {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.zoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ZoomManager#zoomTo(Rectangle)
-	 */
-	public void zoomTo(Rectangle rect) {
-		if (null == currentZoomManager) {
-			return;
-		}
-		currentZoomManager.zoomTo(rect);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowActionBarContributor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowActionBarContributor.java
deleted file mode 100644
index 349b69d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowActionBarContributor.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.gef.editparts.ZoomManager;
-import org.eclipse.gef.ui.actions.ActionBarContributor;
-import org.eclipse.gef.ui.actions.AlignmentRetargetAction;
-import org.eclipse.gef.ui.actions.DeleteRetargetAction;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gef.ui.actions.RedoRetargetAction;
-import org.eclipse.gef.ui.actions.UndoRetargetAction;
-import org.eclipse.gef.ui.actions.ZoomComboContributionItem;
-import org.eclipse.gef.ui.actions.ZoomInRetargetAction;
-import org.eclipse.gef.ui.actions.ZoomOutRetargetAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.facesconfig.ui.INestedActionContributor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * The action bar contributor for the page flow editor
- *
- */
-public class PageflowActionBarContributor extends ActionBarContributor
-		implements INestedActionContributor {
-
-	IEditorPart activeEditor;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ActionBarContributor#buildActions()
-	 */
-	protected void buildActions() {
-		addRetargetAction(new UndoRetargetAction());
-		addRetargetAction(new RedoRetargetAction());
-		addRetargetAction(new DeleteRetargetAction());
-		addRetargetAction(new ZoomInRetargetAction());
-		addRetargetAction(new ZoomOutRetargetAction());
-
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.LEFT));
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.CENTER));
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.RIGHT));
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.TOP));
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.MIDDLE));
-		addRetargetAction(new AlignmentRetargetAction(PositionConstants.BOTTOM));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ActionBarContributor#declareGlobalActionKeys()
-	 */
-	public void declareGlobalActionKeys() {
-		// do nothing
-	}
-
-	/**
-	 * Update the action keys
-	 */
-	public void updateActionKeys() {
-		declareGlobalActionKeys();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditorActionBarContributor#contributeToToolBar(IToolBarManager)
-	 */
-	public void contributeToToolBar(IToolBarManager tbm) {
-		tbm.add(getAction(ActionFactory.UNDO.getId()));
-		tbm.add(getAction(ActionFactory.REDO.getId()));
-		tbm.add(new Separator());
-		tbm.add(getAction(GEFActionConstants.ALIGN_LEFT));
-		tbm.add(getAction(GEFActionConstants.ALIGN_CENTER));
-		tbm.add(getAction(GEFActionConstants.ALIGN_RIGHT));
-		tbm.add(new Separator());
-		tbm.add(getAction(GEFActionConstants.ALIGN_TOP));
-		tbm.add(getAction(GEFActionConstants.ALIGN_MIDDLE));
-		tbm.add(getAction(GEFActionConstants.ALIGN_BOTTOM));
-
-		tbm.add(new Separator());
-		String[] zoomStrings = new String[] { ZoomManager.FIT_ALL,
-				ZoomManager.FIT_HEIGHT, ZoomManager.FIT_WIDTH };
-		tbm.add(new ZoomComboContributionItem(getPage(), zoomStrings));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditorActionBarContributor#contributeToMenu(IMenuManager)
-	 */
-	public void contributeToMenu(IMenuManager menubar) {
-		super.contributeToMenu(menubar);
-		MenuManager viewMenu = new MenuManager("View"); //$NON-NLS-1$
-		viewMenu.add(getAction(GEFActionConstants.ZOOM_IN));
-		viewMenu.add(getAction(GEFActionConstants.ZOOM_OUT));
-		menubar.insertAfter(IWorkbenchActionConstants.M_EDIT, viewMenu);
-	}
-
-	public void setActiveEditor(IEditorPart editor) {
-		if (editor instanceof PageflowEditor) {
-			activeEditor = editor;
-			// updateActionKeys();
-			super.setActiveEditor(editor);
-		}
-	}
-
-	public void update() {
-		if (activeEditor != null) {
-			((PageflowEditor) activeEditor).updateActions();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java
deleted file mode 100644
index f65230a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditor.java
+++ /dev/null
@@ -1,1225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.KeyHandler;
-import org.eclipse.gef.KeyStroke;
-import org.eclipse.gef.RootEditPart;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackEvent;
-import org.eclipse.gef.commands.CommandStackEventListener;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.editparts.ZoomManager;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.DeleteAction;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gef.ui.actions.RedoAction;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.gef.ui.actions.StackAction;
-import org.eclipse.gef.ui.actions.UndoAction;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.actions.ZoomInAction;
-import org.eclipse.gef.ui.actions.ZoomOutAction;
-import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
-import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.gef.ui.parts.SelectionSynchronizer;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.util.TransferDropTargetListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.AlignmentAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.OpenEditorAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.ShowPropertyViewAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.PreExecuteCommandStack;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.ConfigurableRootEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.IConnectionPreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.IFigurePreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.ILayerPanePreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.INodePreference;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowEditPartsFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.EditPartMarkerUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowModelManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowResourceFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.ide.IGotoMarker;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-
-/**
- * This the the main editor page for modifying a complete pageflow.
- */
-public class PageflowEditor extends GraphicalEditorWithFlyoutPalette implements
-		IAdaptable, IPropertyChangeListener, IGotoMarker {
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(PageflowEditor.class);
-
-	/** pageflow context menu registration ID */
-	private static final String PAGEFLOW_CONTEXTMENU_REG_ID = ".pageflow.editor.contextmenu"; //$NON-NLS-1$
-
-	/** the edit domain */
-	private final DefaultEditDomain domain;
-
-	/** the palette root */
-	private PaletteRoot paletteRoot = null;
-
-	/** the parent multi-page editor */
-	private IEditorPart parentEditor = null;
-
-	/** the graphical viewer */
-	private GraphicalViewer viewer = null;
-
-	/** the undoable <code>IPropertySheetPage</code> */
-	private PropertySheetPage undoablePropertySheetPage = null;
-
-	/** the editor's action registry */
-	private ActionRegistry actionRegistry = null;
-
-	/**
-	 * The id of the editor page
-	 */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor"; //$NON-NLS-1$
-
-	/** the list of action ids that are to EditPart actions */
-	private List editPartActionIDs = new ArrayList();
-
-	/** the selection listener */
-	private ISelectionListener selectionListener = new ISelectionListener() {
-		public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-			updateActions();
-		}
-	};
-
-	/** the selection synchronizer for the edit part viewer */
-	private SelectionSynchronizer synchronizer = null;
-
-	/** the shared key handler */
-	private KeyHandler sharedKeyHandler = null;
-
-	/** pageflow model manager */
-	private PageflowModelManager pageflowManager;
-
-	/** the dirty status of this page */
-	private boolean isDirty = false;
-
-	/** the command stack of this page */
-	private CommandStack commandStack;
-
-	private FC2PFTransformer modelsTransform;
-
-	List stackActions = new ArrayList();
-
-	/**
-	 * @return the faces-config to pageflow model
-	 */
-	public FC2PFTransformer getModelsTransform() {
-		if (modelsTransform == null) {
-			modelsTransform = new FC2PFTransformer();
-		}
-		return modelsTransform;
-	}
-
-	/**
-	 * update the editor actions
-	 */
-	public void updateActions() {
-		updateActions(stackActions);
-		updateActions(editPartActionIDs);
-	}
-
-	/**
-	 * This class listens for command stack changes of the page and decides if
-	 * the editor is dirty or not.
-	 * 
-	 */
-	private class PageCommandStackListener implements CommandStackEventListener {
-		public void stackChanged(CommandStackEvent event) {
-			if (((CommandStack) event.getSource()).isDirty()) {
-				// at least one command stack is dirty,
-				// so the multi page editor is dirty too
-				setDirty(true);
-			}
-			updateActions();
-		}
-	}
-
-	/**
-	 * This class listens to changes to the file system in the workspace, and
-	 * validate the current pageflow based on web files' status.
-	 */
-	private class ResourceTracker implements IResourceChangeListener,
-			IResourceDeltaVisitor {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
-		 */
-		public void resourceChanged(IResourceChangeEvent event) {
-			IResourceDelta delta = event.getDelta();
-			try {
-				if (delta != null) {
-					delta.accept(this);
-				}
-			} catch (CoreException exception) {
-				// Pageflow.PageflowEditor.Error.ResourceChange = Failed in the
-				// resource change.
-				log.error("Pageflow.PageflowEditor.Error.ResourceChange", //$NON-NLS-1$
-						exception);
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) {
-			// if the delta is not a file instance, just return true
-			if (!(delta.getResource() instanceof IFile)) {
-				return true;
-			}
-
-			// web file is changed.
-			if (WebrootUtil.isValidWebFile(((IFile) delta.getResource())
-					.getFullPath())) {
-				webPageChanged(((IFile) delta.getResource()).getFullPath());
-				return false;
-			}
-			return false;
-		}
-	}
-
-	/** the resource tracker instance */
-	private ResourceTracker resourceTracker = null;
-
-	/**
-	 * Returns the resource tracker instance
-	 * 
-	 * @return - Returns the resource tracker instance
-	 */
-	private ResourceTracker getResourceTracker() {
-		if (null == resourceTracker) {
-			resourceTracker = new ResourceTracker();
-		}
-		return resourceTracker;
-	}
-
-	/**
-	 * Changes the dirty state.
-	 * 
-	 * @param dirty -
-	 *            dirty state
-	 */
-	protected void setDirty(boolean dirty) {
-		if (isDirty != dirty) {
-			isDirty = dirty;
-		}
-	}
-
-	/**
-	 * Updates the specified actions.
-	 * 
-	 * @param actionIds -
-	 *            the list of ids of actions to update
-	 */
-	protected void updateActions(List actionIds) {
-		for (Iterator ids = actionIds.iterator(); ids.hasNext();) {
-			IAction action = getActionRegistry().getAction(ids.next());
-			if (null != action && action instanceof UpdateAction) {
-				((UpdateAction) action).update();
-			}
-		}
-	}
-
-	/**
-	 * Creates a new PageflowPage instance.
-	 * <p>
-	 * By design this page uses its own <code>EditDomain</code>. The main
-	 * goal of this approach is that this page has its own undo/redo command
-	 * stack.
-	 * 
-	 * @param parent -
-	 *            the parent multi page editor
-	 */
-	public PageflowEditor(IEditorPart parent) {
-		domain = new DefaultEditDomain(parent);
-		domain.setCommandStack(getCommandStack());
-		this.setEditDomain(domain);
-		parentEditor = parent;
-	}
-
-	/**
-	 * Adds an <code>CommandStack</code> action to this editor.
-	 * <p>
-	 * <code>CommandStack</code> actions are actions that depend and work on
-	 * the <code>CommandStack</code>.
-	 * 
-	 * @param action -
-	 *            the <code>CommandStack</code> action
-	 */
-	protected void addStackAction(StackAction action) {
-		getActionRegistry().registerAction(action);
-		stackActions.add(action.getId());
-	}
-
-	/**
-	 * Creates different kinds of actions and registers them to the
-	 * ActionRegistry.
-	 */
-	protected void createActions() {
-		// register delete action
-		addEditPartAction(new DeleteAction((IWorkbenchPart) this));
-		// register undo/redo action
-		addStackAction(new UndoAction(this));
-		addStackAction(new RedoAction(this));
-
-		// Allows opening of JSP files from the pageflow
-		addEditPartAction(new OpenEditorAction(this));
-
-		// Allows showing property view for the pageflow
-		SelectionAction action = new ShowPropertyViewAction(this);
-		action
-				.setImageDescriptor(getImageDescriptorForView("org.eclipse.ui.views.PropertySheet")); //$NON-NLS-1$
-		addEditPartAction(action);
-		// Allows showing property view for the pageflow
-		// addEditPartAction(new ShowPaletteViewAction((IWorkbenchPart) this));
-
-		// register alignment actions
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.LEFT));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.RIGHT));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.TOP));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.BOTTOM));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.CENTER));
-		addEditPartAction(new AlignmentAction((IWorkbenchPart) this,
-				PositionConstants.MIDDLE));
-
-		// register zoom in/out action
-		IAction zoomIn = new ZoomInAction(getZoomManager(getGraphicalViewer()));
-		IAction zoomOut = new ZoomOutAction(
-				getZoomManager(getGraphicalViewer()));
-		addAction(zoomIn);
-		addAction(zoomOut);
-
-//		getSite().getKeyBindingService().registerAction(zoomIn);
-//		getSite().getKeyBindingService().registerAction(zoomOut);
-	}
-
-	/**
-	 * Returns the zoom manager of the specified viewer.
-	 * 
-	 * @param viewer_ -
-	 *            the viewer to get the zoom manager from
-	 * @return - the zoom manager
-	 */
-	private ZoomManager getZoomManager(GraphicalViewer viewer_) {
-		// get zoom manager from root edit part
-		RootEditPart rootEditPart = viewer_.getRootEditPart();
-		ZoomManager zoomManager = null;
-		if (rootEditPart instanceof ScalableFreeformRootEditPart) {
-			zoomManager = ((ScalableFreeformRootEditPart) rootEditPart)
-					.getZoomManager();
-		} else if (rootEditPart instanceof ScalableRootEditPart) {
-			zoomManager = ((ScalableRootEditPart) rootEditPart)
-					.getZoomManager();
-		}
-		return zoomManager;
-	}
-
-	/**
-	 * Adds an action to this editor's <code>ActionRegistry</code>.
-	 * 
-	 * @param action -
-	 *            the action to add.
-	 */
-	protected void addAction(IAction action) {
-		getActionRegistry().registerAction(action);
-	}
-
-	/**
-	 * Adds an <code>EditPart</code> action to this editor.
-	 * <p>
-	 * <code>EditPart</code> actions are actions that depend and work on the
-	 * selected <code>EditPart</code>s.
-	 * 
-	 * @param action -
-	 *            the <code>EditPart</code> action
-	 */
-	protected void addEditPartAction(SelectionAction action) {
-		getActionRegistry().registerAction(action);
-		editPartActionIDs.add(action.getId());
-	}
-
-	/**
-	 * Returns the action registry of this editor.
-	 * 
-	 * @return - the action registry
-	 */
-	public ActionRegistry getActionRegistry() {
-		if (null == actionRegistry) {
-			actionRegistry = new ActionRegistry();
-		}
-
-		return actionRegistry;
-	}
-
-	/**
-	 * Creates the GraphicalViewer on the specified <code>Composite</code>.
-	 * 
-	 * @param parent -
-	 *            the parent composite
-	 */
-	public void createGraphicalViewer(Composite parent) {
-		viewer = new ScrollingGraphicalViewer();
-		viewer.createControl(parent);
-
-		// configure the viewer
-		viewer.getControl().setBackground(parent.getBackground());
-
-		viewer.setRootEditPart(new ConfigurableRootEditPart());
-		// _viewer.setRootEditPart(new ScalableFreeformRootEditPart());
-		viewer.setKeyHandler(new GraphicalViewerKeyHandler(viewer));
-
-		// hook the viewer into the editor
-		registerEditPartViewer(viewer);
-
-		// configure the viewer with context menu and template drag and drop
-		configureEditPartViewer(viewer);
-
-		// initialize the viewer with input
-		viewer.setEditPartFactory(new PageflowEditPartsFactory());
-		// viewer.setContents(getPageflow());
-
-		// support the resource drag&drop
-		viewer
-				.addDropTargetListener((TransferDropTargetListener) new ResourceTransferDropTargetListener(
-						viewer, getParentEditor()) {
-					protected CreationFactory getFactory(Object obj) {
-						return getResourceFactory((IResource) obj);
-					}
-				});
-
-		// apply Editor's preferences
-		// propertyChange(null);
-		// add listener to Editor's preferences changing
-		EditorPlugin.getDefault().getPreferenceStore()
-				.addPropertyChangeListener(this);
-	}
-
-	private CreationFactory getResourceFactory(IResource resource) {
-		return new PageflowResourceFactory(resource);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public final void doSave(IProgressMonitor monitor) {
-		// our policy: delegate saving to the parent
-		getParentEditor().doSave(monitor);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#doSaveAs()
-	 */
-	public final void doSaveAs() {
-		// our policy: delegate saving to the parent
-		getParentEditor().doSaveAs();
-	}
-
-	/**
-	 * Saves the pageflow under the specified path.
-	 * @param file 
-	 * 
-	 * @param progressMonitor
-	 * @throws CoreException 
-	 */
-	public void doSave(IFile file, IProgressMonitor progressMonitor)
-			throws CoreException {
-		if (((FileEditorInput) getEditorInput()).getFile() != file) {
-			// TODO: save to other page.
-		}
-		if (null == progressMonitor) {
-			progressMonitor = new NullProgressMonitor();
-		}
-		// Pageflow.Label.Saving = Saving
-		progressMonitor.beginTask(PageflowMessages.Pageflow_Label_Saving + " " //$NON-NLS-1$
-				+ file.getFullPath(), 2);
-
-		if (null == getPageflowManager()) {
-			// Pageflow.PageflowEditor.Alert.nullModelManager = No model manager
-			// found for saving the file.
-			EditorPlugin.getAlerts().throwCoreException(
-					"Pageflow.PageflowEditor.Alert.nullModelManager"); //$NON-NLS-1$
-		}
-
-		// save pageflow to file
-		try {
-			getPageflowManager().save(getPageflowFilePath(file));
-
-			progressMonitor.worked(1);
-			file.refreshLocal(IResource.DEPTH_ZERO, new SubProgressMonitor(
-					progressMonitor, 1));
-			progressMonitor.done();
-			setDirty(false);
-		} catch (FileNotFoundException e) {
-			// Pageflow.PageflowEditor.Alert.errorSaveFileInfo = The current
-			// pageflow model could not be saved.
-			EditorPlugin.getAlerts().throwCoreException(e);
-		} catch (IOException e) {
-			// Pageflow.PageflowEditor.Alert.errorSaveFileInfo = The current
-			// pageflow model could not be saved.
-			EditorPlugin.getAlerts().throwCoreException(e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IEditorPart#init(org.eclipse.ui.IEditorSite,
-	 *      org.eclipse.ui.IEditorInput)
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		setSite(site);
-		setInput(input);
-		IFile fileFacesConfig = null;
-		try {
-			fileFacesConfig = ((FileEditorInput) input).getFile();
-
-			// load and validate pageflow
-			if (null == createPageflow(getPageflowFilePath(fileFacesConfig))) {
-				// Pageflow.PageflowEditor.Error.invalidPageflowFile = The
-				// specified input is not a valid pageflow.
-				log.error("Pageflow.PageflowEditor.Error.invalidPageflowFile"); //$NON-NLS-1$
-				throw new PartInitException(
-						EditorPlugin
-								.getResourceString("Pageflow.PageflowEditor.Error.invalidPageflowFile")); //$NON-NLS-1$
-			}
-
-		} catch (CoreException e) {
-			// Pageflow.PageflowEditor.Error.invalidPageflowFile = The specified
-			// input is not a valid pageflow.
-			log.error("Pageflow.PageflowEditor.Error.invalidPageflowFile", e); //$NON-NLS-1$
-			throw new PartInitException(e.getStatus());
-		} catch (IOException e) {
-			// Pageflow.PageflowEditor.Alert.errorSaveFileInfo = The current
-			// pageflow model could not be saved.
-			log.error("Pageflow.PageflowEditor.Alert.errorSaveFileInfo", e); //$NON-NLS-1$
-		}
-
-		// add selection change listener
-		getSite().getWorkbenchWindow().getSelectionService()
-				.addSelectionListener(getSelectionListener());
-
-		// Add resource change listener
-		fileFacesConfig.getWorkspace().addResourceChangeListener(
-				getResourceTracker());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		// remove selection change listener
-		getModelsTransform().dispose();
-		getSite().getWorkbenchWindow().getSelectionService()
-				.removeSelectionListener(getSelectionListener());
-
-		// remove listener to Editor's preferences changing
-		EditorPlugin.getDefault().getPreferenceStore()
-				.removePropertyChangeListener(this);
-
-		if (getEditorInput() != null) {
-			IFile file = (IFile) getEditorInput().getAdapter(IResource.class);
-			if (file != null) {
-				file.getWorkspace().removeResourceChangeListener(
-						getResourceTracker());
-			}
-		}
-		super.dispose();
-	}
-
-	/**
-	 * get the pageflow file path based on faces-config.xml file path
-	 * 
-	 * @return
-	 */
-	private IPath getPageflowFilePath(IFile file) {
-		IPath pageflowFilePath;
-		pageflowFilePath = PageflowModelManager.makePageflowPath(file
-				.getFullPath());
-		return pageflowFilePath;
-	}
-
-	/**
-	 * Returns the pageflow object from the specified file.
-	 * 
-	 * @param file -
-	 *            the file resource
-	 * @return -the pageflow object from the specified file
-	 * @throws IOException
-	 */
-	private Pageflow createPageflow(IPath pathPageflow) throws CoreException,
-			IOException {
-		Pageflow pageflow = null;
-
-		try {
-			getPageflowManager().load(pathPageflow);
-		} catch (Exception e) {
-			// Pageflow.PageflowEditor.Error.invalidPageflowFile = The specified
-			// input is not a valid pageflow.
-			// _log.error("Pageflow.PageflowEditor.Error.invalidPageflowFile",
-			// e);
-			getPageflowManager().createPageflow(pathPageflow);
-		}
-		IFile fileFacesConfig = ((FileEditorInput) getEditorInput()).getFile();
-		// it should update related config file
-		if (!fileFacesConfig.getFullPath().toString().trim().equalsIgnoreCase(
-				getPageflowManager().getModel().getConfigfile())) {
-			getPageflowManager().getModel().setConfigfile(
-					fileFacesConfig.getFullPath().toString());
-			getPageflowManager().save(pathPageflow);
-		}
-		pageflow = getPageflowManager().getModel();
-		if (null == pageflow) {
-			// Pageflow.PageflowEditor.Error.invalidPageflowModel = The model in
-			// the pageflow file is not a valid pageflow model.
-			log.error("Pageflow.PageflowEditor.Error.invalidPageflowModel"); //$NON-NLS-1$
-			EditorPlugin.getAlerts().throwCoreException(
-					"Pageflow.PageflowEditor.Error.invalidPageflowModel"); //$NON-NLS-1$
-		}
-		return pageflow;
-	}
-
-	/** get the pageflow manager for this page 
-	 * @return  the model manager
-	 */
-	public PageflowModelManager getPageflowManager() {
-		if (pageflowManager == null) {
-			pageflowManager = new PageflowModelManager();
-		}
-		return pageflowManager;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#isDirty()
-	 */
-	public final boolean isDirty() {
-		return isDirty;
-	}
-
-	/**
-	 * Returns the <code>CommandStack</code> of this editor page.
-	 * 
-	 * @return - the <code>CommandStack</code> of this editor page
-	 */
-	public final CommandStack getCommandStack() {
-		if (commandStack == null) {
-			commandStack = new PreExecuteCommandStack();
-			commandStack
-					.addCommandStackEventListener(new PageCommandStackListener());
-		}
-		return commandStack;
-	}
-
-	/**
-	 * Returns the default <code>PaletteRoot</code> for this editor and all
-	 * its pages.
-	 * 
-	 * @return - the default <code>PaletteRoot</code>
-	 */
-	protected PaletteRoot getPaletteRoot() {
-		if (null == paletteRoot) {
-			// create root
-			paletteRoot = new PageflowPaletteRoot();
-		}
-		return paletteRoot;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISaveablePart#isSaveAsAllowed()
-	 */
-	public final boolean isSaveAsAllowed() {
-		// our policy: delegate saving to the parent
-		return getParentEditor().isSaveAsAllowed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		getGraphicalViewer().getControl().setFocus();
-	}
-
-	/**
-	 * Returns the multi page pageflow editor this editor page is contained in.
-	 * 
-	 * @return - the parent multi page editor
-	 */
-	protected final IEditorPart getParentEditor() {
-		return parentEditor;
-	}
-
-	/**
-	 * Returns the edit domain this editor page uses.
-	 * 
-	 * @return - the edit domain this editor page uses
-	 */
-	public final DefaultEditDomain getEditDomain() {
-		return domain;
-	}
-
-	/**
-	 * Hooks a <code>EditPartViewer</code> to the rest of the Editor.
-	 * <p>
-	 * By default, the viewer is added to the SelectionSynchronizer, which can
-	 * be used to keep 2 or more EditPartViewers in sync. The viewer is also
-	 * registered as the ISelectionProvider for the Editor's PartSite.
-	 * 
-	 * @param viewer_ -
-	 *            the viewer to hook into the editor
-	 */
-	protected void registerEditPartViewer(EditPartViewer viewer_) {
-		// register viewer to edit domain
-		getEditDomain().addViewer(viewer_);
-
-		// the multi page pageflow editor keeps track of synchronizing
-		getSelectionSynchronizer().addViewer(viewer_);
-
-		// add viewer as selection provider
-		getSite().setSelectionProvider(viewer_);
-	}
-
-	/**
-	 * Configures the specified <code>EditPartViewer</code> including context
-	 * menu, key handler, etc.
-	 * 
-	 * @param viewer_ -
-	 *            the pageflow graphical viewer.
-	 */
-	protected void configureEditPartViewer(EditPartViewer viewer_) {
-		// configure the shared key handler
-		if (null != viewer_.getKeyHandler()) {
-			viewer_.getKeyHandler().setParent(getSharedKeyHandler());
-		}
-		// create the ActionRegistry
-		createActions();
-
-		// append the parent editor's action registry.
-		ActionRegistry actionRegistry_ = (ActionRegistry) getParentEditor()
-				.getAdapter(ActionRegistry.class);
-		if (actionRegistry_ != null) {
-			for (Iterator iter = actionRegistry_.getActions(); iter.hasNext();) {
-				getActionRegistry().registerAction((IAction) iter.next());
-			}
-		}
-		// configure and register the context menu
-		ContextMenuProvider provider = new PageflowEditorContextMenuProvider(
-				viewer_, getActionRegistry());
-		viewer_.setContextMenu(provider);
-		getSite().registerContextMenu(
-				EditorPlugin.getPluginId() + PAGEFLOW_CONTEXTMENU_REG_ID,
-				provider, getSite().getSelectionProvider());
-
-		// enable viewer as drop target for template transfers
-		viewer_
-				.addDropTargetListener((TransferDropTargetListener) new PageflowTemplateTransferDropTargetListener(
-						viewer_));
-
-	}
-
-	/**
-	 * Returns the pageflow that is edited.
-	 * 
-	 * @return - the pageflow that is edited
-	 */
-	public Pageflow getPageflow() {
-		return getPageflowManager().getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditorPage#getGraphicalViewerForZoomSupport()
-	 */
-	public GraphicalViewer getGraphicalViewer() {
-		return viewer;
-	}
-
-	/**
-	 * @param contents
-	 */
-	public void setGraphicalViewerContents(Object contents) {
-		viewer.setContents(contents);
-		propertyChange(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class type) {
-		if (type == IContentOutlinePage.class) {
-			return getOutlinePage();
-		} else if (type == CommandStack.class) {
-			return getCommandStack();
-		} else if (type == ActionRegistry.class) {
-			return getActionRegistry();
-		} else if (type == IPropertySheetPage.class) {
-			return getPropertySheetPage();
-		} else if (type == ZoomManager.class) {
-			return getZoomManager(getGraphicalViewer());
-		}
-		return super.getAdapter(type);
-	}
-
-	/**
-	 * Returns the outline page for the outline view with lazy creation
-	 * 
-	 * @return - the outline page
-	 */
-	protected PageflowEditorOutlinePage getOutlinePage() {
-		PageflowEditorOutlinePage outlinePage = new PageflowEditorOutlinePage(
-				this);
-		outlinePage.initialize(this);
-		return outlinePage;
-	}
-
-	/**
-	 * Returns the undoable <code>PropertySheetPage</code> for this editor.
-	 * 
-	 * @return - the undoable <code>PropertySheetPage</code>
-	 */
-	protected IPropertySheetPage getPropertySheetPage() {
-		if (null == undoablePropertySheetPage) {
-			undoablePropertySheetPage = new PropertySheetPage();
-
-			/** set the property source for property sheet page */
-			undoablePropertySheetPage
-					.setRootEntry(new org.eclipse.gef.ui.properties.UndoablePropertySheetEntry(
-							(CommandStack) getAdapter(CommandStack.class)));
-
-		}
-
-		return undoablePropertySheetPage;
-	}
-
-	/**
-	 * Returns the selection syncronizer object. The synchronizer can be used to
-	 * sync the selection of 2 or more EditPartViewers.
-	 * 
-	 * @return - the syncrhonizer
-	 */
-	protected SelectionSynchronizer getSelectionSynchronizer() {
-		if (null == synchronizer) {
-			synchronizer = new SelectionSynchronizer();
-		}
-		return synchronizer;
-	}
-
-	/**
-	 * Returns the shared KeyHandler that should be used for all viewers.
-	 * 
-	 * @return - the shared KeyHandler
-	 */
-	protected KeyHandler getSharedKeyHandler() {
-		if (null == sharedKeyHandler) {
-			sharedKeyHandler = new KeyHandler();
-
-			// configure common keys for all viewers
-			sharedKeyHandler
-					.put(KeyStroke.getPressed(SWT.DEL, 127, 0),
-							getActionRegistry().getAction(
-									ActionFactory.DELETE.getId()));
-			sharedKeyHandler.put(KeyStroke.getPressed(SWT.F2, 0),
-					getActionRegistry().getAction(
-							GEFActionConstants.DIRECT_EDIT));
-		}
-		return sharedKeyHandler;
-	}
-
-	/**
-	 * Returns the selection listener.
-	 * 
-	 * @return - the <code>ISelectionListener</code>
-	 */
-	protected ISelectionListener getSelectionListener() {
-		return selectionListener;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		String property = (event == null) ? null : event.getProperty();
-
-		propagateProperty(property, viewer.getRootEditPart());
-	}
-
-	/**
-	 * propagate property change to children edit part
-	 * 
-	 * @param property -
-	 *            property's string name
-	 * @param part -
-	 *            parent edit part.
-	 */
-	private void propagateProperty(String property, EditPart part) {
-		processPropertyChange(property, part);
-
-		if (part instanceof GraphicalEditPart) {
-			// get the connections edit part
-			Iterator iterConns = ((GraphicalEditPart) part)
-					.getSourceConnections().iterator();
-			while (iterConns.hasNext()) {
-				EditPart child = (EditPart) iterConns.next();
-				propagateProperty(property, child);
-			}
-		}
-		Iterator iter = part.getChildren().iterator();
-		while (iter.hasNext()) {
-			EditPart child = (EditPart) iter.next();
-			propagateProperty(property, child);
-		}
-	}
-
-	/**
-	 * process the property change FIXME: The property change should be category
-	 * to improve the performance.
-	 * 
-	 * @param property -
-	 *            property's string name
-	 * @param part
-	 */
-	private void processPropertyChange(String property, EditPart part) {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-
-		if (property != null
-				&& property.equals(GEMPreferences.USE_SYSTEM_COLORS)) {
-			// reload all properties - it's easiest
-			property = null;
-		}
-
-		if (property == null || GEMPreferences.SNAP_TO_GRID.equals(property)) {
-			boolean bSnapToGrid = store.getBoolean(GEMPreferences.SNAP_TO_GRID);
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part).setGridVisible(bSnapToGrid);
-			}
-		}
-
-		if (property == null || GEMPreferences.GRID_WIDTH.equals(property)
-				|| GEMPreferences.GRID_HEIGHT.equals(property)) {
-			Dimension gridSpacing = new Dimension(store
-					.getInt(GEMPreferences.GRID_WIDTH), store
-					.getInt(GEMPreferences.GRID_HEIGHT));
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part).setGridSpacing(gridSpacing);
-			}
-		}
-
-		if (property == null || GEMPreferences.GRID_COLOR.equals(property)) {
-			Color gridFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.GRID_COLOR);
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part)
-						.setGridForegroundColor(gridFgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.CANVAS_COLOR.equals(property)) {
-			Color containerBgColor = GEMPreferences.getColor(store,
-					GEMPreferences.CANVAS_COLOR);
-			if (part instanceof IFigurePreference) {
-				((IFigurePreference) part).setBackgroundColor(containerBgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_WIDTH.equals(property)) {
-			int linkLineWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part).setLineWidth(linkLineWidth);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_COLOR.equals(property)) {
-			Color linkLineColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_COLOR);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part)
-						.setForegroundColor(linkLineColor);
-			}
-		}
-
-		if (property == null
-				|| GEMPreferences.SHOW_LINE_LABELS.equals(property)) {
-			boolean bLinkLabelVisible = store
-					.getBoolean(GEMPreferences.SHOW_LINE_LABELS);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part)
-						.setLabelVisible(bLinkLabelVisible);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_LABEL_FONT.equals(property)
-				|| GEMPreferences.LINE_LABEL_FONT_COLOR.equals(property)) {
-			Font linkLabelFont = getLinkLabelFont();
-			Color linkLabelFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_LABEL_FONT_COLOR);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part).setFont(linkLabelFont);
-				((IConnectionPreference) part)
-						.setLabelForegroundColor(linkLabelFgColor);
-			}
-		}
-
-		if (property == null
-				|| GEMPreferences.LINE_LABEL_COLOR.equals(property)) {
-			Color linkLabelBgColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_LABEL_COLOR);
-			if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part)
-						.setLabelBackgroundColor(linkLabelBgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.LINE_ROUTING.equals(property)) {
-			String connectionStyle = store
-					.getString(GEMPreferences.LINE_ROUTING);
-			int style;
-			if (GEMPreferences.LINE_ROUTING_MANHATTAN.equals(connectionStyle)) {
-				style = ILayerPanePreference.LINE_ROUTING_MANHATTAN;
-			} else {
-				style = ILayerPanePreference.LINE_ROUTING_MANUAL;
-			}
-
-			if (part instanceof ILayerPanePreference) {
-				((ILayerPanePreference) part).setConnectionRouterStyle(style);
-			} else if (part instanceof IConnectionPreference) {
-				((IConnectionPreference) part).setConnectionRouterStyle(style);
-			}
-		}
-
-		if (property == null
-				|| GEMPreferences.FIGURE_LABEL_FONT.equals(property)
-				|| GEMPreferences.FIGURE_LABEL_FONT_COLOR.equals(property)) {
-			Font nodeLabelFont = getNodeLabelFont();
-			Color nodeLabelFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.FIGURE_LABEL_FONT_COLOR);
-
-			if (part instanceof INodePreference) {
-				((INodePreference) part).setFont(nodeLabelFont);
-				((INodePreference) part).setForegroundColor(nodeLabelFgColor);
-			}
-		}
-
-		if (property == null || GEMPreferences.LABEL_PLACEMENT.equals(property)) {
-			int placement = PositionConstants.SOUTH;
-			String nodeLabelPlacement = store
-					.getString(GEMPreferences.LABEL_PLACEMENT);
-			if (GEMPreferences.LABEL_PLACEMENT_TOP.equals(nodeLabelPlacement))
-				placement = PositionConstants.NORTH;
-			else if (GEMPreferences.LABEL_PLACEMENT_BOTTOM
-					.equals(nodeLabelPlacement))
-				placement = PositionConstants.SOUTH;
-			else if (GEMPreferences.LABEL_PLACEMENT_LEFT
-					.equals(nodeLabelPlacement))
-				placement = PositionConstants.WEST;
-			else if (GEMPreferences.LABEL_PLACEMENT_RIGHT
-					.equals(nodeLabelPlacement))
-				placement = PositionConstants.EAST;
-			if (part instanceof INodePreference)
-				((INodePreference) part).setTextPlacement(placement);
-		}
-	}
-
-	private Font getLinkLabelFont() {
-		FontRegistry registry = JFaceResources.getFontRegistry();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		FontData fontData = PreferenceConverter.getFontData(store,
-				GEMPreferences.LINE_LABEL_FONT);
-		if (!registry.get(fontData.toString()).equals(registry.defaultFont()))
-			return registry.get(fontData.toString());
-		
-		registry.put(fontData.toString(), new FontData[] {fontData});
-		return registry.get(fontData.toString());
-	}
-
-	private Font getNodeLabelFont() {
-		FontRegistry registry = JFaceResources.getFontRegistry();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		FontData fontData = PreferenceConverter.getFontData(store,
-				GEMPreferences.FIGURE_LABEL_FONT);
-		if (!registry.get(fontData.toString()).equals(registry.defaultFont()))
-			return registry.get(fontData.toString());
-		
-		registry.put(fontData.toString(), new FontData[] {fontData});
-		return registry.get(fontData.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ide.IGotoMarker#gotoMarker(org.eclipse.core.resources.IMarker)
-	 */
-	public void gotoMarker(IMarker marker) {
-		// The LOCATION attribute in the marker should be the ID string
-		Object id = null;
-		try {
-			id = marker.getAttribute(IMarker.LOCATION);
-		} catch (CoreException e) {
-			// Pageflow.PageflowEditor.Error.invalidMarkerAttribute = Unable to
-			// get marker's attribute
-			log
-					.error(
-							"Pageflow.PageflowEditor.Error.invalidMarkerAttribute", //$NON-NLS-1$
-							e);
-		}
-		if (id instanceof String) {
-			GraphicalEditPart part = EditPartMarkerUtil.findEditPart(
-					(GraphicalEditPart) getGraphicalViewer().getRootEditPart(),
-					(String) id);
-			if (part != null) {
-				getGraphicalViewer().reveal(part);
-				getGraphicalViewer().select(part);
-				return;
-			}
-		}
-
-	}
-
-	/**
-	 * the related web page is changed in outside editor, the pageflow should be
-	 * revalidated to update the validation icons
-	 * 
-	 * @param fullPath
-	 */
-	public void webPageChanged(IPath fullPath) {
-		PageflowPage page = getPageflowManager().foundPage(
-				WebrootUtil.getWebPath(fullPath));
-
-		if (page != null && getGraphicalViewer() != null
-				&& getGraphicalViewer().getRootEditPart() != null) {
-			GraphicalEditPart pagePart = EditPartMarkerUtil.findEditPart(
-					(GraphicalEditPart) getGraphicalViewer().getRootEditPart(),
-					page.getId());
-			PageflowAnnotationUtil
-					.validatePage((PageflowNodeEditPart) pagePart);
-		}
-	}
-
-	/**
-	 * Get the image desriptor from the view's id.
-	 * 
-	 * @param viewid
-	 * @return
-	 */
-	private ImageDescriptor getImageDescriptorForView(String viewid) {
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.views"); //$NON-NLS-1$
-		for (int i = 0; i < elements.length; i++) {
-			String name = elements[i].getName();
-			String id = elements[i].getAttribute("id"); //$NON-NLS-1$
-			if ("view".equals(name) && viewid.equals(id)) { //$NON-NLS-1$
-				String iconPath = elements[i].getAttribute("icon"); //$NON-NLS-1$
-				if (iconPath != null) {
-					return AbstractUIPlugin.imageDescriptorFromPlugin(
-							elements[i].getDeclaringExtension().getContributor().getName(),
-							iconPath);
-				}
-			}
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java
deleted file mode 100644
index 3e23919..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorContextMenuProvider.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.ShowPropertyViewAction;
-import org.eclipse.ui.actions.ActionFactory;
-
-/**
- * This is the context menu provider for pageflow editor.
- * 
- */
-public class PageflowEditorContextMenuProvider extends ContextMenuProvider {
-	/** the action registry */
-	private final ActionRegistry actionRegistry;
-
-	/**
-	 * Creates a new PageflowEditorContextMenuProvider instance.
-	 * 
-	 * @param viewer -
-	 *            the editor viewer
-	 * @param actionRegistry -
-	 *            action registry of the editor
-	 */
-	public PageflowEditorContextMenuProvider(EditPartViewer viewer,
-			ActionRegistry actionRegistry) {
-		super(viewer);
-
-		this.actionRegistry = actionRegistry;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ContextMenuProvider#buildContextMenu(IMenuManager)
-	 */
-	public void buildContextMenu(IMenuManager menuManager) {
-		// add GEF menu groups, such as undo, edit, save, etc.
-		GEFActionConstants.addStandardActionGroups(menuManager);
-
-		// add typical undo/redo commands
-		appendActionToUndoGroup(menuManager, ActionFactory.UNDO.getId());
-		appendActionToUndoGroup(menuManager, ActionFactory.REDO.getId());
-		// add edit commands, including copy, paste, delete
-		appendActionToEditGroup(menuManager, ActionFactory.COPY.getId());
-		appendActionToEditGroup(menuManager, ActionFactory.PASTE.getId());
-		appendActionToEditGroup(menuManager, ActionFactory.DELETE.getId());
-		// Add Open Editor Action
-		appendActionToEditGroup(menuManager, FacesConfigEditor.EDITOR_ID);
-
-		// append the save submenu
-		appendActionToSaveGroup(menuManager, ActionFactory.SAVE.getId());
-
-		// append the alignment submenu, including top, bottom, middle, left,
-		// right and center.
-		appendAlignmentSubmenu(menuManager);
-
-		appendShowViewSubmenu(menuManager);
-
-	}
-
-	/**
-	 * Appends the alignment subment.
-	 * 
-	 * @param menuManager
-	 *            manager of workbench
-	 */
-	private void appendShowViewSubmenu(IMenuManager menuManager) {
-		// Show View Actions
-		MenuManager submenu = new MenuManager(
-				PageflowMessages.Pageflow_Contextmenu_ShowView_Label);
-
-		IAction action = getActionRegistry().getAction(
-				ShowPropertyViewAction.SHOW_PROPERTY_VIEW);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		// action = getActionRegistry().getAction(
-		// ShowPaletteViewAction.SHOW_PALETTE_VIEW);
-		// if (null != action && action.isEnabled()) {
-		// submenu.add(action);
-		// }
-
-		if (!submenu.isEmpty()) {
-			menuManager.appendToGroup(GEFActionConstants.GROUP_REST, submenu);
-		}
-	}
-
-	/**
-	 * Appends the alignment subment.
-	 * 
-	 * @param menuManager
-	 *            manager of workbench
-	 */
-	private void appendAlignmentSubmenu(IMenuManager menuManager) {
-		// Alignment Actions
-		MenuManager submenu = new MenuManager(
-				PageflowMessages.Pageflow_Contextmenu_Align_Label);
-
-		IAction action = getActionRegistry().getAction(
-				GEFActionConstants.ALIGN_LEFT);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_CENTER);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_RIGHT);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_TOP);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_MIDDLE);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		action = getActionRegistry().getAction(GEFActionConstants.ALIGN_BOTTOM);
-		if (null != action && action.isEnabled()) {
-			submenu.add(action);
-		}
-
-		if (!submenu.isEmpty()) {
-			menuManager.appendToGroup(GEFActionConstants.GROUP_EDIT, submenu);
-		}
-	}
-
-	/**
-	 * Returns the action registry.
-	 * 
-	 * @return - the action registry
-	 */
-	protected ActionRegistry getActionRegistry() {
-		return actionRegistry;
-	}
-
-	/**
-	 * Appends the specified action to the specified menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 * @param menuGroup -
-	 *            menu group name
-	 */
-	 // TODO: dead code
-//	private void appendActionToMenu(IMenuManager menu, String actionId,
-//			String menuGroup) {
-//		IAction action = getActionRegistry().getAction(actionId);
-//		if (null != action && action.isEnabled()) {
-//			menu.appendToGroup(menuGroup, action);
-//		}
-//	}
-
-	/**
-	 * Appends the specified action to the 'Undo' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	private void appendActionToUndoGroup(IMenuManager menu, String actionId) {
-		IAction action = getActionRegistry().getAction(actionId);
-		if (null != action && action.isEnabled()) {
-			menu.appendToGroup(GEFActionConstants.GROUP_UNDO, action);
-		}
-	}
-
-	/**
-	 * Appends the specified action to the 'edit' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	private void appendActionToEditGroup(IMenuManager menu, String actionId) {
-		IAction action = getActionRegistry().getAction(actionId);
-		if (null != action && action.isEnabled()) {
-			menu.appendToGroup(GEFActionConstants.GROUP_EDIT, action);
-		}
-	}
-
-	/**
-	 * Appends the specified action to the 'add' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	 // TODO: dead code
-//	private void appendActionToAddGroup(IMenuManager menu, String actionId) {
-//		IAction action = getActionRegistry().getAction(actionId);
-//		if (null != action && action.isEnabled()) {
-//			menu.appendToGroup(GEFActionConstants.GROUP_ADD, action);
-//		}
-//	}
-
-	/**
-	 * Appends the specified action to the 'save' menu group
-	 * 
-	 * @param menu -
-	 *            menu manager
-	 * @param actionId -
-	 *            action's ID
-	 */
-	private void appendActionToSaveGroup(IMenuManager menu, String actionId) {
-		IAction action = getActionRegistry().getAction(actionId);
-		if (null != action && action.isEnabled()) {
-			menu.appendToGroup(GEFActionConstants.GROUP_SAVE, action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorOutlinePage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorOutlinePage.java
deleted file mode 100644
index 82ca489..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowEditorOutlinePage.java
+++ /dev/null
@@ -1,545 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LightweightSystem;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.parts.ScrollableThumbnail;
-import org.eclipse.gef.ContextMenuProvider;
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartListener;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.RootEditPart;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.ui.parts.TreeViewer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowTreePartFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.Page;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * This is an implementation of an outline page showing an overview figure and
- * an tree outline of the main graphical viewer provided by the current active
- * page of an multi page editor.
- * 
- */
-public class PageflowEditorOutlinePage extends Page implements
-		IContentOutlinePage {
-	/** the pageflow editor */
-	private final PageflowEditor editor;
-
-	/** the outlineContent for the tree viewer */
-	private PageflowElement outlineContent = null;
-
-	/** the control of the overview */
-	private Canvas overview = null;
-
-	/** the root edit part (outlineContent for the thumbnail) */
-	private RootEditPart overviewContent = null;
-
-	/** the thumbnail */
-	private ScrollableThumbnail thumbnail = null;
-
-	/** the tree viewer */
-	private TreeViewer treeViewer = null;
-
-	/** the control of the tree view */
-	private Control outline = null;
-
-	/** the pagebook */
-	private PageBook pageBook = null;
-
-	/** action for showing the tree page */
-	private IAction showOutlineAction = null;
-
-	/** action for showing the overview page */
-	private IAction showOverviewAction = null;
-
-	/** the LightweightSystem */
-	private LightweightSystem lws = null;
-
-	/** the edit domain */
-	private EditDomain editDomain = null;
-
-	/**
-	 * Creates a new PageflowEditorOutlinePage instance.
-	 * 
-	 * @param editor -
-	 *            Pageflow Editor
-	 */
-	public PageflowEditorOutlinePage(EditorPart editor) {
-		super();
-		this.editor = (PageflowEditor) editor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#addSelectionChangedListener(ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		getTreeViewer().addSelectionChangedListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		// pagebook
-		pageBook = new PageBook(parent, SWT.NONE);
-
-		// tree viewer control
-		outline = getTreeViewer().createControl(pageBook);
-		configureEditPartViewer(getTreeViewer());
-
-		// overview canvas
-		overview = new Canvas(pageBook, SWT.NONE);
-		lws = new LightweightSystem(overview);
-
-		// create actions
-		IToolBarManager tbm = getSite().getActionBars().getToolBarManager();
-		showOutlineAction = new Action() {
-			public void run() {
-				showPage(outline);
-			}
-		};
-		showOutlineAction.setImageDescriptor(EditorPlugin.getDefault()
-				.getImageDescriptor("facesconfig/Pageflow_Outline.gif")); //$NON-NLS-1$
-		tbm.add(showOutlineAction);
-		showOverviewAction = new Action() {
-			public void run() {
-				showPage(overview);
-			}
-		};
-		showOverviewAction.setImageDescriptor(EditorPlugin.getDefault()
-				.getImageDescriptor("facesconfig/Pageflow_Outline_Overview.gif")); //$NON-NLS-1$
-		tbm.add(showOverviewAction);
-
-		// initialize outline page
-		initializeOutlineViewer();
-
-		// initialize overview
-		initializeOverview();
-
-		// initialize pagebook
-		showPage(outline);
-	}
-
-	/**
-	 * Configures the outline viewer
-	 */
-	private void initializeOutlineViewer() {
-		if (null != getEditDomain()) {
-			getEditDomain().addViewer(getTreeViewer());
-		}
-		// getTreeViewer().setEditPartFactory(new PageflowTreePartFactory());
-
-		// synchronize selections
-		editor.getSelectionSynchronizer().addViewer(getTreeViewer());
-
-		// add content
-		getTreeViewer().setContents(getOutlineContent());
-	}
-
-	/**
-	 * Shows the spcified page.
-	 * 
-	 * @param id -
-	 *            control id of pagebook in outline page. it is can be _outline
-	 *            or _overview
-	 */
-	protected void showPage(Control id) {
-		if (id == outline) {
-			showOutlineAction.setChecked(true);
-			showOverviewAction.setChecked(false);
-			pageBook.showPage(outline);
-			if (thumbnail != null) {
-				thumbnail.setVisible(false);
-			}
-		} else if (id == overview) {
-			showOutlineAction.setChecked(false);
-			showOverviewAction.setChecked(true);
-			pageBook.showPage(overview);
-			if (thumbnail != null) {
-				thumbnail.setVisible(true);
-			}
-		}
-	}
-
-	/**
-	 * Returns the current edit domain.
-	 * 
-	 * @return - the edit domain
-	 */
-	public EditDomain getEditDomain() {
-		return editDomain;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#dispose()
-	 */
-	public void dispose() {
-		editor.getSelectionSynchronizer().removeViewer(getTreeViewer());
-
-		if (null != thumbnail) {
-			thumbnail.deactivate();
-		}
-
-		super.dispose();
-	}
-
-	/**
-	 * initialize Overview.
-	 * 
-	 */
-	private void initializeOverview() {
-		// check if control was created
-		if (null == lws) {
-			return;
-		}
-
-		// deactivate old thumbnail
-		if (null != thumbnail) {
-			thumbnail.deactivate();
-		}
-
-		// create empty thumbnail
-		thumbnail = new ScrollableThumbnail();
-		thumbnail.setBorder(new MarginBorder(3));
-		lws.setContents(thumbnail);
-
-		// initialize thumbnail
-		if (null != getOverviewContent()) {
-			Viewport viewport = null;
-			IFigure source = null;
-			if (getOverviewContent() instanceof ScalableFreeformRootEditPart) {
-				viewport = (Viewport) ((ScalableFreeformRootEditPart) getOverviewContent())
-						.getFigure();
-				source = ((ScalableFreeformRootEditPart) getOverviewContent())
-						.getLayer(LayerConstants.PRINTABLE_LAYERS);
-			}
-			if (getOverviewContent() instanceof ScalableRootEditPart) {
-				viewport = (Viewport) ((ScalableRootEditPart) getOverviewContent())
-						.getFigure();
-				source = ((ScalableRootEditPart) getOverviewContent())
-						.getLayer(LayerConstants.PRINTABLE_LAYERS);
-			}
-
-			if (null != viewport && null != source) {
-				thumbnail.setViewport(viewport);
-				thumbnail.setSource(source);
-			}
-		}
-	}
-
-	/**
-	 * Returns the outlineContent.
-	 * 
-	 * @return - the outlineContent
-	 */
-	public PageflowElement getOutlineContent() {
-		return outlineContent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#getControl()
-	 */
-	public Control getControl() {
-		return pageBook;
-	}
-
-	/**
-	 * Returns the root edit part
-	 * 
-	 * @return - the root edit part
-	 */
-	public RootEditPart getOverviewContent() {
-		return overviewContent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return getTreeViewer().getSelection();
-	}
-
-	/**
-	 * Returns the tree viewer.
-	 * 
-	 * @return - the tree viewer
-	 */
-	public TreeViewer getTreeViewer() {
-		if (null == treeViewer) {
-			treeViewer = new TreeViewer();
-			treeViewer.setEditPartFactory(new PageflowTreePartFactory());
-		}
-
-		return treeViewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#removeSelectionChangedListener(ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		getTreeViewer().removeSelectionChangedListener(listener);
-	}
-
-	/**
-	 * Sets the outlineContent.
-	 * 
-	 * @param element -
-	 *            Pageflow Element
-	 */
-	public void setOutlineContent(PageflowElement element) {
-		if (outlineContent != element) {
-			outlineContent = element;
-
-			// refresh viewer
-			if (null != getTreeViewer().getControl()) {
-				getTreeViewer().setContents(element);
-
-				// bugfix: something is overwriting visibility
-				if (null != pageBook) {
-					if (showOverviewAction.isChecked()) {
-						showPage(outline);
-						showPage(overview);
-					} else {
-						showPage(outline);
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPage#setFocus()
-	 */
-	public void setFocus() {
-		if (getControl() != null) {
-			getControl().setFocus();
-		}
-	}
-
-	/**
-	 * Sets the root edit part.
-	 * 
-	 * @param part -
-	 *            root edit part for pageflow model
-	 */
-	public void setOverviewContent(RootEditPart part) {
-		if (overviewContent != part) {
-			overviewContent = part;
-			// reinitialize thumbnail
-			// if (null != thumbnail && thumbnail.isVisible())
-			initializeOverview();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISelectionProvider#setSelection(ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		getTreeViewer().setSelection(selection);
-	}
-
-	/**
-	 * Initializes this outline page from a given editor page.
-	 * 
-	 * @param newPage -
-	 *            Pageflow EditorPage
-	 */
-	public void initialize(PageflowEditor newPage) {
-		if (null != newPage.getGraphicalViewer()) {
-			setOverviewContent(newPage.getGraphicalViewer().getRootEditPart());
-			EditPart currentContent = newPage.getGraphicalViewer()
-					.getContents();
-			setOutlineContent(null != currentContent ? (PageflowElement) currentContent
-					.getModel()
-					: null);
-			setEditDomain(newPage.getEditDomain());
-			getViewerContentListener().setViewer(newPage.getGraphicalViewer());
-		} else {
-			setOverviewContent(null);
-			setOutlineContent(null);
-			setEditDomain(null);
-		}
-	}
-
-	/**
-	 * Sets the edit domain.
-	 * 
-	 * @param domain -
-	 *            editor's edit domain
-	 */
-	public void setEditDomain(EditDomain domain) {
-		if (editDomain != domain) {
-			// refresh viewer
-			if (null != getTreeViewer()) {
-				if (null != editDomain) {
-					editDomain.removeViewer(getTreeViewer());
-				}
-				if (null != domain) {
-					domain.addViewer(getTreeViewer());
-				}
-			}
-			editDomain = domain;
-		}
-	}
-
-	/**
-	 * the current viewer content listener
-	 */
-	private final ViewerContentListener viewerContentListener = new ViewerContentListener();
-
-	/**
-	 * This class listens for changes of the content of an EditPartViewer. If
-	 * the content changed, it will update the outline viewer.
-	 * <p>
-	 * Important: this class has to be disposed with
-	 * <code>setViewer(null)</code>.
-	 * 
-	 * @author Gunnar Wagenknecht
-	 */
-	private class ViewerContentListener implements EditPartListener {
-		/* the viewer */
-		private EditPartViewer _viewer;
-
-		/**
-		 * Sets a new viewer. <code>null</code> is allowed to dispose.
-		 * 
-		 * @param viewer
-		 */
-		public void setViewer(EditPartViewer viewer) {
-			if (null != this._viewer)
-				this._viewer.getRootEditPart().removeEditPartListener(this);
-
-			this._viewer = viewer;
-
-			if (null != this._viewer)
-				this._viewer.getRootEditPart().addEditPartListener(this);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#childAdded(org.eclipse.gef.EditPart,
-		 *      int)
-		 */
-		public void childAdded(EditPart child, int index) {
-			// this is out event, update the viewers
-			if (child.getModel() instanceof PageflowElement)
-				setOutlineContent((PageflowElement) child.getModel());
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#partActivated(org.eclipse.gef.EditPart)
-		 */
-		public void partActivated(EditPart editpart) {
-            // do nothing
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#partDeactivated(org.eclipse.gef.EditPart)
-		 */
-		public void partDeactivated(EditPart editpart) {
-            // do nothing
-        }
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#removingChild(org.eclipse.gef.EditPart,
-		 *      int)
-		 */
-		public void removingChild(EditPart child, int index) {
-            // do nothing
-        }
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.EditPartListener#selectedStateChanged(org.eclipse.gef.EditPart)
-		 */
-		public void selectedStateChanged(EditPart editpart) {
-            // do nothing
-		}
-	}
-
-	/**
-	 * Returns the viewer content listener.
-	 * 
-	 * @return the viewer content listener
-	 */
-	private ViewerContentListener getViewerContentListener() {
-		return viewerContentListener;
-	}
-
-	/**
-	 * Configures the specified <code>EditPartViewer</code>.
-	 * 
-	 * @param viewer
-	 */
-	protected void configureEditPartViewer(EditPartViewer viewer) {
-		// configure the shared key handler
-		if (viewer.getKeyHandler() != null) {
-			viewer.getKeyHandler().setParent(editor.getSharedKeyHandler());
-		}
-
-		// configure the context menu
-		ContextMenuProvider provider = new PageflowEditorContextMenuProvider(
-				viewer, editor.getActionRegistry());
-		viewer.setContextMenu(provider);
-		getSite().registerContextMenu(
-				EditorPlugin.getPluginId()
-						+ ".pageflow.editor.outlineview.contextmenu", provider, //$NON-NLS-1$
-				getSite().getSelectionProvider());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java
deleted file mode 100644
index a64b442..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Pageflow message bundle
- *
- */
-public final class PageflowMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages"; //$NON-NLS-1$
-
-	private PageflowMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PageflowMessages.class);
-	}
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Label_True;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Label_False;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Label_Saving;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Dialog_Label_CreateFileTitle;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Dialog_Label_FileNotExistedPart1;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Dialog_Label_FileNotExistedPart2;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_OpenEditor_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_OpenEditor_ToolTip;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_ShowPropertyView_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_ShowPropertyView_ToolTip;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_ShowPaletteView_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_ShowPaletteView_ToolTip;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_SyncWithFacesConfig_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_SyncWithFacesConfig_ToolTip;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_UpdateFacesConfig_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Action_UpdateFacesConfig_ToolTip;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Group_Controls;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Select_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Select_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Marquee_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Marquee_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Link_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Link_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Group_Nodes;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Begin_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Begin_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_End_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_End_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Action_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Action_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Page_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_PaletteTool_Page_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Contextmenu_Align_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Contextmenu_ShowView_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_AddNodeCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_CreateNodeCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_DeleteNodeCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_ConnectionCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_CreateBendpointCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_MoveBendpointCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_DeleteBendpointCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_OpenEditorCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_OrphanChildCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_UpdatePageflowCommand_Label;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Title;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Description;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_comment;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_name;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_largeicon;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_smallicon;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_action;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_path;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_begin;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_end;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_configfile;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_source;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_target;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_outcome;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_redirect;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_fromaction;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Attributes_referenceLink;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Items_Pageflow;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Items_PFPage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Model_Items_PFLink;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_Choice;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_Title;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_JSPName;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTableWithJSP_Title;
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Component;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowLinkPropertySource_Title;
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String ProjectWebPageSelectionDialog_Description;
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowLinkPropertySource_Text;
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Property_Action_OutcomeSelectionDialog_Outcome;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_UndefinedOutcome;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_NotExistedSourcePage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_MissingSourcePage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_InvalidWebPage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_NotExitedWebPage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_MissingWebPage;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_MissingManagedBean;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String Pageflow_Validation_MissingAction;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String ExistingPagePathDialogCellEdito_LabelText;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowLinkEditPart_FromAction;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowLinkEditPart_FromOutcome;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowContainerEditPolicy_OrphanLabel;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowNode_NoRecursiveContainment;
-
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String PageflowXYLayoutEditPolicy_Add;
-		
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String SetConstraintCommand_Resize;
-	
-	/**
-	 * see PageFlowMessages.properties
-	 */
-	public static String SetConstraintCommand_Location;
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties
deleted file mode 100644
index 67a09e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.properties
+++ /dev/null
@@ -1,158 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Generic Strings for UI
-####################################################
-Pageflow_Label_True=true
-Pageflow_Label_False=false
-
-Pageflow_Label_Saving=Saving  
-
-Pageflow_Dialog_Label_CreateFileTitle=Create File
-Pageflow_Dialog_Label_FileNotExistedPart1=The file 
-Pageflow_Dialog_Label_FileNotExistedPart2=doesn't exist. Click OK to create it.
-
-####################################################
-# Generic Strings for Action and PaletteTool
-####################################################
-Pageflow_Action_OpenEditor_Label=Open
-Pageflow_Action_OpenEditor_ToolTip=Open Page or Action component
-
-Pageflow_Action_ShowPropertyView_Label=Properties
-Pageflow_Action_ShowPropertyView_ToolTip=Show Properties View
-
-Pageflow_Action_ShowPaletteView_Label=Palette
-Pageflow_Action_ShowPaletteView_ToolTip=Show Palette View
-
-Pageflow_Action_SyncWithFacesConfig_Label=Synchronize with Faces-config
-Pageflow_Action_SyncWithFacesConfig_ToolTip=Synchronizing PageFlow Model with Faces-config
-
-Pageflow_Action_UpdateFacesConfig_Label=Update Faces-config
-Pageflow_Action_UpdateFacesConfig_ToolTip=Update Faces-config File from The Current PageFlow
-
-Pageflow_PaletteTool_Group_Controls=Controls
-
-Pageflow_PaletteTool_Select_Label=Select
-Pageflow_PaletteTool_Select_Description=Select One or More Items
-
-Pageflow_PaletteTool_Marquee_Label=Marquee
-Pageflow_PaletteTool_Marquee_Description=Marquee One or More Items
-
-Pageflow_PaletteTool_Link_Label=Link
-Pageflow_PaletteTool_Link_Description=Creates a Link
-
-Pageflow_PaletteTool_Group_Nodes=Nodes
-
-Pageflow_PaletteTool_Begin_Label=Begin
-Pageflow_PaletteTool_Begin_Description=Creates a PageFlow Begin
-
-Pageflow_PaletteTool_End_Label=End
-Pageflow_PaletteTool_End_Description=Creates a PageFlow End
-
-Pageflow_PaletteTool_Action_Label=Action
-Pageflow_PaletteTool_Action_Description=Creates a PageFlow Action
-
-Pageflow_PaletteTool_Page_Label=Page
-Pageflow_PaletteTool_Page_Description=Creates a PageFlow Page
-
-Pageflow_Contextmenu_Align_Label=Align
-
-Pageflow_Contextmenu_ShowView_Label=Show View
-
-
-
-####################################################
-# Generic Strings for Commands
-####################################################
-Pageflow_Commands_AddNodeCommand_Label=Add
-Pageflow_Commands_CreateNodeCommand_Label=Create
-Pageflow_Commands_DeleteNodeCommand_Label=Delete
-
-Pageflow_Commands_ConnectionCommand_Label=Connection
-Pageflow_Commands_CreateBendpointCommand_Label=Create Bendpoint
-Pageflow_Commands_MoveBendpointCommand_Label=Move Bendpoint
-Pageflow_Commands_DeleteBendpointCommand_Label=Delete Bendpoint
-
-Pageflow_Commands_OpenEditorCommand_Label=Open
-Pageflow_Commands_OrphanChildCommand_Label=Orphan Child
-Pageflow_Commands_UpdatePageflowCommand_Label=Update Pageflow
-
-Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Title=Select JSP File
-Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Description=Please select a jsp file.
-
-####################################################
-# Generic Strings for property attribute name 
-####################################################
-Pageflow_Model_Attributes_comment=description
-Pageflow_Model_Attributes_name=display-name
-Pageflow_Model_Attributes_largeicon=large-icon
-Pageflow_Model_Attributes_smallicon=small-icon
-
-Pageflow_Model_Attributes_action=from-action
-Pageflow_Model_Attributes_path=path
-Pageflow_Model_Attributes_begin=begin
-Pageflow_Model_Attributes_end=end
-Pageflow_Model_Attributes_configfile=config file
-
-Pageflow_Model_Attributes_source = from-view-id
-Pageflow_Model_Attributes_target = to-view-id
-
-Pageflow_Model_Attributes_outcome=from-outcome
-Pageflow_Model_Attributes_redirect=redirect
-
-Pageflow_Model_Attributes_fromaction=from-action
-Pageflow_Model_Attributes_referenceLink=reference
-
-Pageflow_Model_Items_Pageflow=File
-Pageflow_Model_Items_PFPage=Page
-Pageflow_Model_Items_PFLink=Link
-
-
-Pageflow_Property_Action_OutcomeSelectionDialog_Choice=Enter the outcome or select one from action list below:
-
-Pageflow_Property_Action_OutcomeSelectionDialog_Title=Outcome Selection
-Pageflow_Property_Action_OutcomeSelectionDialog_JSPName=JSP File Name:
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title=Actions
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTableWithJSP_Title=Actions in {0}
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Component=Component ID
-Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action=Action
-
-Pageflow_Property_Action_OutcomeSelectionDialog_Outcome=Outcome:
-
-####################################################
-#Pageflow validation
-####################################################
-Pageflow_Validation_UndefinedOutcome=The outcome \''{0}\'' is not defined in previous page \''{1}\''.
-Pageflow_Validation_NotExistedSourcePage=The source page \''{0}\'' is not existed.
-Pageflow_Validation_MissingSourcePage=The source page should be specified.
-
-Pageflow_Validation_InvalidWebPage=The file \''{0}\'' is not valid web file.
-Pageflow_Validation_NotExitedWebPage=The web page  \''{0}\''  is not existed.
-Pageflow_Validation_MissingWebPage=The web page's path should be specified.
-
-Pageflow_Validation_MissingManagedBean=The managed bean \''{0}\'' is not defined.
-Pageflow_Validation_MissingAction=The action should be specified.
-
-ExistingPagePathDialogCellEdito_LabelText = Please enter or select a web page path:
-
-PageflowLinkEditPart_FromAction=fromAction:
-PageflowLinkEditPart_FromOutcome=fromOutcome:
-
-PageflowLinkPropertySource_Title=Note
-PageflowLinkPropertySource_Text=Please select an existing page
-
-#######################################################
-PageflowContainerEditPolicy_OrphanLabel=label here
-PageflowNode_NoRecursiveContainment=Recursive containment not allowed for 
-PageflowXYLayoutEditPolicy_Add=Add
-SetConstraintCommand_Location=Change Page Location
-SetConstraintCommand_Resize=Resize Page
-ProjectWebPageSelectionDialog_Description=Please select a Web Page
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowPaletteRoot.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowPaletteRoot.java
deleted file mode 100644
index eefad92..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowPaletteRoot.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
-import org.eclipse.gef.palette.ConnectionCreationToolEntry;
-import org.eclipse.gef.palette.MarqueeToolEntry;
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.PaletteSeparator;
-import org.eclipse.gef.palette.SelectionToolEntry;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.ModelCreationFactory;
-
-/**
- * This is the root of the palette used by pageflow editors.
- */
-public class PageflowPaletteRoot extends PaletteRoot {
-
-	/**
-	 * Creates a new PageflowPaletteRoot instance.
-	 */
-	public PageflowPaletteRoot() {
-		// create root
-		super();
-
-		// a group of default control tools
-		// Pageflow.PaletteTool.Group.Controls = Controls
-		PaletteGroup controls = new PaletteGroup(
-				PageflowMessages.Pageflow_PaletteTool_Group_Controls);
-		add(controls);
-
-		// the selection tool
-		// Pageflow.PaletteTool.Select.Label = Select
-		// Pageflow.PaletteTool.Select.Description = Select one or more items
-		ToolEntry tool = new SelectionToolEntry(
-				PageflowMessages.Pageflow_PaletteTool_Select_Label,
-				PageflowMessages.Pageflow_PaletteTool_Select_Description);
-
-		controls.add(tool);
-
-		// use selection tool as default entry
-		setDefaultEntry(tool);
-
-		// the marquee selection tool
-		// Pageflow.PaletteTool.Marquee.Label = Marquee
-		// Pageflow.PaletteTool.Marquee.Description = Marquee one or more items
-		controls.add(new MarqueeToolEntry(
-				PageflowMessages.Pageflow_PaletteTool_Marquee_Label,
-				PageflowMessages.Pageflow_PaletteTool_Marquee_Description));
-
-		controls.add(new PaletteSeparator());
-
-		// conection creation
-		// Pageflow.PaletteTool.Link.Label = Link
-		// Pageflow.PaletteTool.Link.Description = Creates an link
-		ConnectionCreationToolEntry linkEntry = new ConnectionCreationToolEntry(
-				PageflowMessages.Pageflow_PaletteTool_Link_Label,
-				PageflowMessages.Pageflow_PaletteTool_Link_Description,
-				new ModelCreationFactory(PageflowLink.class), EditorPlugin
-						.getDefault().getImageDescriptor(
-								"facesconfig/Pageflow_Link.gif"), //$NON-NLS-1$
-				EditorPlugin.getDefault().getImageDescriptor(
-						"facesconfig/Pageflow_Link24.gif")); //$NON-NLS-1$
-		linkEntry.setUserModificationPermission(PERMISSION_FULL_MODIFICATION);
-		controls.add(linkEntry);
-
-		controls.add(new PaletteSeparator());
-
-		// Pageflow.PaletteTool.Group.Nodes = Nodes
-		PaletteDrawer nodes = new PaletteDrawer(
-				PageflowMessages.Pageflow_PaletteTool_Group_Nodes);
-		add(nodes);
-
-		// use CombinedTemplateCreationEntry which can be also dragged
-		CombinedTemplateCreationEntry entry;
-
-		// Pageflow.PaletteTool.Page.Label = Page
-		// Pageflow.PaletteTool.Page.Description = Creates a pageflow page
-		entry = new CombinedTemplateCreationEntry(
-				PageflowMessages.Pageflow_PaletteTool_Page_Label,
-				PageflowMessages.Pageflow_PaletteTool_Page_Description,
-				PageflowPage.class,
-				new ModelCreationFactory(PageflowPage.class), EditorPlugin
-						.getDefault().getImageDescriptor(
-								"facesconfig/Pageflow_Page16.gif"), //$NON-NLS-1$
-				EditorPlugin.getDefault().getImageDescriptor(
-						"facesconfig/Pageflow_Page24.gif")); //$NON-NLS-1$
-		nodes.add(entry);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowTemplateTransferDropTargetListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowTemplateTransferDropTargetListener.java
deleted file mode 100644
index 4c4a8a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowTemplateTransferDropTargetListener.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.ModelCreationFactory;
-
-/**
- * This is the drop listener for template transfers from the palette. Only need
- * to implement the <code>getFactory</code> method.
- */
-public class PageflowTemplateTransferDropTargetListener extends
-		TemplateTransferDropTargetListener {
-	/**
-	 * Creates a new PageflowTemplateTransferDropTargetListener instance.
-	 * 
-	 * @param viewer -
-	 *            target pageflow editor view.
-	 */
-	public PageflowTemplateTransferDropTargetListener(EditPartViewer viewer) {
-		super(viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see TemplateTransferDropTargetListener#getFactory(Object)
-	 */
-	protected CreationFactory getFactory(Object template) {
-		if (template instanceof Class) {
-			return new ModelCreationFactory((Class) template);
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/ResourceTransferDropTargetListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/ResourceTransferDropTargetListener.java
deleted file mode 100644
index 634d5bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/ResourceTransferDropTargetListener.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.ResourceTransfer;
-
-
-/**
- * This is the listener for resource drag and drop operations
- * 
- */
-public abstract class ResourceTransferDropTargetListener extends
-		AbstractTransferDropTargetListener {
-	/** the pageflow editor */
-	private IEditorPart editor = null;
-
-	/**
-	 * Creates a new ResourceTransferDropTargetListener instance.
-	 * 
-	 * @param viewer -
-	 *            target pageflow editor view.
-	 * @param editor 
-	 */
-	public ResourceTransferDropTargetListener(EditPartViewer viewer,
-			IEditorPart editor) {
-		super(viewer, ResourceTransfer.getInstance());
-
-		this.editor = editor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		CreateRequest request = new CreateRequest();
-		if (getCurrentEvent().data == null) {
-			request.setFactory(getFactory(null));
-		} else {
-			IResource[] resources = (IResource[]) getCurrentEvent().data;
-			request.setFactory(getFactory(resources[0]));
-		}
-		return request;
-	}
-
-	/**
-	 * get the request for creating a new resource object
-	 * 
-	 * @return - creation request
-	 */
-	protected final CreateRequest getCreateRequest() {
-		return (CreateRequest) getTargetRequest();
-	}
-
-	/**
-	 * get creation factory for resource object, which should be implemented.
-	 * 
-	 * @param obj -
-	 *            resource object
-	 * @return - creation factory for resource object
-	 */
-	abstract protected CreationFactory getFactory(Object obj);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDragOperationChanged()
-	 */
-	protected void handleDragOperationChanged() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		super.handleDragOperationChanged();
-	}
-
-	/**
-	 * get the current transfered local selection object.
-	 * 
-	 * @return
-	 */
-	private Object getCurrentLocalObject() {
-		ISelection sel = LocalSelectionTransfer.getTransfer().getSelection();
-		if (sel instanceof IStructuredSelection) {
-			return ((IStructuredSelection) sel).getFirstElement();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDragOver()
-	 */
-	protected void handleDragOver() {
-		if (!isValidJSFFile(getCurrentLocalObject())) {
-			getCurrentEvent().detail = DND.ERROR_INVALID_DATA;
-		} else {
-			getCurrentEvent().detail = DND.DROP_COPY;
-		}
-		getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
-		super.handleDragOver();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDrop()
-	 */
-	protected void handleDrop() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		super.handleDrop();
-		// because the handle drop can change this event to DND.DROP_NONE
-		if (getCurrentEvent().detail == DND.DROP_COPY) {
-			selectAddedObject();
-		}
-	}
-
-	/**
-	 * select the new drag and drop object in the pageflow view.
-	 */
-	private void selectAddedObject() {
-		Object model = getCreateRequest().getNewObject();
-		if (null == model) {
-			return;
-		}
-		EditPartViewer viewer = getViewer();
-		Object editpart = viewer.getEditPartRegistry().get(model);
-		if (editpart instanceof EditPart) {
-			viewer.flush();
-			viewer.select((EditPart) editpart);
-			// Activate the editor window
-			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getActivePage().activate(editor);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		CreateRequest request = getCreateRequest();
-		request.setLocation(getDropLocation());
-	}
-
-	/**
-	 * Allow drop if any of these types in the drop data, which can be jsp file
-	 * or a sub folder of the webroot folder.
-	 * 
-	 */
-	private boolean isValidJSFFile(Object resource) {
-		if (resource == null || !(resource instanceof IResource)) {
-			return false;
-		}
-
-		if (((IResource) resource).getProject() == ((FileEditorInput) editor
-				.getEditorInput()).getFile().getProject()) {
-			if (WebrootUtil.getWebPath(((IResource) resource).getFullPath())
-					.length() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTransferDropTargetListener#isEnabled()
-	 */
-	public boolean isEnabled(DropTargetEvent dropTargetEvent) {
-		if (super.isEnabled(dropTargetEvent)) {
-			if (dropTargetEvent.data != null) {
-				IResource[] resources = (IResource[]) dropTargetEvent.data;
-				// The resource should be under the same project of the current
-				// faces-config file
-				if (isValidJSFFile(resources[0])) {
-					return true;
-				}
-				return false;
-			}
-			// If no data, can't verify, so allow the drop
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/AlignmentAction.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/AlignmentAction.java
deleted file mode 100644
index e108d8e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/AlignmentAction.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.requests.AlignmentRequest;
-import org.eclipse.gef.tools.ToolUtilities;
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * An improved alignment action to align the selected parts in different action.
- * 
- * @author xgzhang
- * @version original version is from GEF
- */
-public final class AlignmentAction extends SelectionAction {
-
-	/**
-	 * Indicates that the bottom edges should be aligned.
-	 */
-	public static final String ID_ALIGN_BOTTOM = GEFActionConstants.ALIGN_BOTTOM;
-
-	/**
-	 * Indicates that the horizontal centers should be aligned.
-	 */
-	public static final String ID_ALIGN_CENTER = GEFActionConstants.ALIGN_CENTER;
-
-	/**
-	 * Indicates that the left edges should be aligned.
-	 */
-	public static final String ID_ALIGN_LEFT = GEFActionConstants.ALIGN_LEFT;
-
-	/**
-	 * Indicates that the vertical midpoints should be aligned.
-	 */
-	public static final String ID_ALIGN_MIDDLE = GEFActionConstants.ALIGN_MIDDLE;
-
-	/**
-	 * Indicates that the right edges should be aligned.
-	 */
-	public static final String ID_ALIGN_RIGHT = GEFActionConstants.ALIGN_RIGHT;
-
-	/**
-	 * Indicates that the top edges should be aligned.
-	 */
-	public static final String ID_ALIGN_TOP = GEFActionConstants.ALIGN_TOP;
-
-	private int alignment;
-
-	private List operationSet;
-
-	/**
-	 * @deprecated use AlignmentAction(IWorkbenchPart, int align)
-	 * @param editor
-	 *            the editor
-	 * @param align
-	 *            the alignment ID
-	 */
-	public AlignmentAction(IEditorPart editor, int align) {
-		this((IWorkbenchPart) editor, align);
-	}
-
-	/**
-	 * Constructs an AlignmentAction with the given part and alignment ID. The
-	 * alignment ID must by one of:
-	 * <UL>
-	 * <LI>GEFActionConstants.ALIGN_LEFT
-	 * <LI>GEFActionConstants.ALIGN_RIGHT
-	 * <LI>GEFActionConstants.ALIGN_CENTER
-	 * <LI>GEFActionConstants.ALIGN_TOP
-	 * <LI>GEFActionConstants.ALIGN_BOTTOM
-	 * <LI>GEFActionConstants.ALIGN_MIDDLE
-	 * </UL>
-	 * 
-	 * @param part
-	 *            the workbench part used to obtain context
-	 * @param align
-	 *            the aligment ID.
-	 */
-	public AlignmentAction(IWorkbenchPart part, int align) {
-		super(part);
-		alignment = align;
-		initUI();
-	}
-
-	/**
-	 * Returns the alignment rectangle to which all selected parts should be
-	 * aligned.
-	 * 
-	 * @param request
-	 *            the alignment Request
-	 * @return the alignment rectangle
-	 */
-	protected Rectangle calculateAlignmentRectangle(Request request) {
-		List editparts = getOperationSet(request);
-		if (editparts == null || editparts.isEmpty()) {
-			return null;
-		}
-		GraphicalEditPart part = null;
-		if (alignment == PositionConstants.MIDDLE
-				|| alignment == PositionConstants.CENTER) {
-			part = (GraphicalEditPart) editparts.get(editparts.size() - 1);
-		} else {
-			part = getFitnessPart(editparts);
-		}
-		Rectangle rect = new PrecisionRectangle(part.getFigure().getBounds());
-		part.getFigure().translateToAbsolute(rect);
-		return rect;
-	}
-
-	/**
-	 * get the Fitness part in the four kinds of alignment directions
-	 * 
-	 * @param editparts
-	 */
-	private GraphicalEditPart getFitnessPart(List editparts) {
-		if (alignment == PositionConstants.MIDDLE
-				|| alignment == PositionConstants.CENTER) {
-			return null;
-		}
-
-		int positionComparor = Integer.MAX_VALUE;
-
-		if (alignment == PositionConstants.LEFT
-				|| alignment == PositionConstants.TOP) {
-			positionComparor = Integer.MAX_VALUE;
-		} else if (alignment == PositionConstants.RIGHT
-				|| alignment == PositionConstants.BOTTOM) {
-			positionComparor = Integer.MIN_VALUE;
-		}
-
-		GraphicalEditPart fitnessPart = null;
-
-		for (Iterator iter = editparts.iterator(); iter.hasNext();) {
-			GraphicalEditPart part = (GraphicalEditPart) iter.next();
-			Rectangle rectPart = part.getFigure().getBounds();
-			switch (alignment) {
-			case PositionConstants.LEFT:
-				if (rectPart.getLeft().x < positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getLeft().x;
-				}
-				break;
-
-			case PositionConstants.RIGHT:
-				if (rectPart.getRight().x > positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getRight().x;
-				}
-				break;
-			case PositionConstants.TOP:
-				if (rectPart.getTop().y < positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getTop().y;
-				}
-				break;
-			case PositionConstants.BOTTOM:
-				if (rectPart.getBottom().y > positionComparor) {
-					fitnessPart = part;
-					positionComparor = rectPart.getBottom().y;
-				}
-				break;
-			}
-		}
-
-		return fitnessPart;
-	}
-
-	/**
-	 * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#calculateEnabled()
-	 */
-	protected boolean calculateEnabled() {
-		operationSet = null;
-		Command cmd = createAlignmentCommand();
-		if (cmd == null) {
-			return false;
-		}
-		return cmd.canExecute();
-	}
-
-	private Command createAlignmentCommand() {
-		AlignmentRequest request = new AlignmentRequest(
-				RequestConstants.REQ_ALIGN);
-		request.setAlignmentRectangle(calculateAlignmentRectangle(request));
-		request.setAlignment(alignment);
-		List editparts = getOperationSet(request);
-		if (editparts.size() < 2) {
-			return null;
-		}
-
-		CompoundCommand command = new CompoundCommand();
-		command.setDebugLabel(getText());
-		for (int i = 0; i < editparts.size(); i++) {
-			EditPart editpart = (EditPart) editparts.get(i);
-			command.add(editpart.getCommand(request));
-		}
-		return command;
-	}
-
-	/**
-	 * @see org.eclipse.gef.Disposable#dispose()
-	 */
-	public void dispose() {
-		operationSet = Collections.EMPTY_LIST;
-		super.dispose();
-	}
-
-	/**
-	 * Returns the list of editparts which will participate in alignment.
-	 * 
-	 * @param request
-	 *            the alignment request
-	 * @return the list of parts which will be aligned
-	 */
-	protected List getOperationSet(Request request) {
-		if (operationSet != null) {
-			return operationSet;
-		}
-		List editparts = new ArrayList(getSelectedObjects());
-		if (editparts.isEmpty()
-				|| !(editparts.get(0) instanceof GraphicalEditPart)) {
-			return Collections.EMPTY_LIST;
-		}
-		Object primary = editparts.get(editparts.size() - 1);
-		editparts = ToolUtilities.getSelectionWithoutDependants(editparts);
-		ToolUtilities.filterEditPartsUnderstanding(editparts, request);
-		if (editparts.size() < 2 || !editparts.contains(primary)) {
-			return Collections.EMPTY_LIST;
-		}
-		EditPart parent = ((EditPart) editparts.get(0)).getParent();
-		for (int i = 1; i < editparts.size(); i++) {
-			EditPart part = (EditPart) editparts.get(i);
-			if (part.getParent() != parent) {
-				return Collections.EMPTY_LIST;
-			}
-		}
-		return editparts;
-	}
-
-	/**
-	 * Initializes the actions UI presentation.
-	 */
-	protected void initUI() {
-		switch (alignment) {
-		case PositionConstants.LEFT:
-			setId(GEFActionConstants.ALIGN_LEFT);
-			setText(EditorMessages.AlignmentAction_AlignLeftAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignLeftAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_LEFT);
-			setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_LEFT_DIS);
-			break;
-
-		case PositionConstants.RIGHT:
-			setId(GEFActionConstants.ALIGN_RIGHT);
-			setText(EditorMessages.AlignmentAction_AlignRightAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignRightAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_RIGHT);
-			setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_RIGHT_DIS);
-			break;
-
-		case PositionConstants.TOP:
-			setId(GEFActionConstants.ALIGN_TOP);
-			setText(EditorMessages.AlignmentAction_AlignTopAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignTopAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_VERT_ALIGN_TOP);
-			setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_TOP_DIS);
-			break;
-
-		case PositionConstants.BOTTOM:
-			setId(GEFActionConstants.ALIGN_BOTTOM);
-			setText(EditorMessages.AlignmentAction_AlignBottomAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignBottomAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_VERT_ALIGN_BOTTOM);
-			setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_BOTTOM_DIS);
-			break;
-
-		case PositionConstants.CENTER:
-			setId(GEFActionConstants.ALIGN_CENTER);
-			setText(EditorMessages.AlignmentAction_AlignCenterAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignCenterAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_CENTER);
-			setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_CENTER_DIS);
-			break;
-
-		case PositionConstants.MIDDLE:
-			setId(GEFActionConstants.ALIGN_MIDDLE);
-			setText(EditorMessages.AlignmentAction_AlignMiddleAction_Label);
-			setToolTipText(EditorMessages.AlignmentAction_AlignMiddleAction_Tooltip);
-			setImageDescriptor(InternalImages.DESC_VERT_ALIGN_MIDDLE);
-			setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_MIDDLE_DIS);
-			break;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		operationSet = null;
-		execute(createAlignmentCommand());
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/InternalImages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/InternalImages.java
deleted file mode 100644
index 8daa9ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/InternalImages.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * Supplies image descriptors, intended for internal use only.
- * 
- * @author Ian Trimble - Oracle
- */
-public class InternalImages {
-
-	/**
-	 * ImageDescriptor instance for center alignment image.
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_CENTER;
-
-	/**
-	 * ImageDescriptor instance for left alignment image.
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_LEFT;
-
-	/**
-	 * ImageDescriptor instance for right alignment image.
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_RIGHT;
-
-	/**
-	 * ImageDescriptor instance for middle alignment image.
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_MIDDLE;
-
-	/**
-	 * ImageDescriptor instance for top alignment image.
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_TOP;
-
-	/**
-	 * ImageDescriptor instance for bottom alignment image.
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_BOTTOM;
-
-	/**
-	 * ImageDescriptor instance for center alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_CENTER_DIS;
-
-	/**
-	 * ImageDescriptor instance for left alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_LEFT_DIS;
-
-	/**
-	 * ImageDescriptor instance for right alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_HORZ_ALIGN_RIGHT_DIS;
-
-	/**
-	 * ImageDescriptor instance for middle alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_MIDDLE_DIS;
-
-	/**
-	 * ImageDescriptor instance for top alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_TOP_DIS;
-
-	/**
-	 * ImageDescriptor instance for bottom alignment image (disabled).
-	 */
-	public static final ImageDescriptor DESC_VERT_ALIGN_BOTTOM_DIS;
-
-	static {
-		DESC_VERT_ALIGN_BOTTOM = createDescriptor("icons/alignbottom.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_CENTER = createDescriptor("icons/aligncenter.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_LEFT = createDescriptor("icons/alignleft.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_MIDDLE = createDescriptor("icons/alignmid.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_RIGHT = createDescriptor("icons/alignright.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_TOP = createDescriptor("icons/aligntop.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_BOTTOM_DIS = createDescriptor("icons/alignbottom_d.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_CENTER_DIS = createDescriptor("icons/aligncenter_d.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_LEFT_DIS = createDescriptor("icons/alignleft_d.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_MIDDLE_DIS = createDescriptor("icons/alignmid_d.gif"); //$NON-NLS-1$
-		DESC_HORZ_ALIGN_RIGHT_DIS = createDescriptor("icons/alignright_d.gif"); //$NON-NLS-1$
-		DESC_VERT_ALIGN_TOP_DIS = createDescriptor("icons/aligntop_d.gif"); //$NON-NLS-1$
-	}
-
-	private static ImageDescriptor createDescriptor(String filename) {
-		return ImageDescriptor.createFromFile(InternalImages.class, filename);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/OpenEditorAction.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/OpenEditorAction.java
deleted file mode 100644
index 7c27eab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/OpenEditorAction.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * 
- * This is the Action for opening a JSP page in the default JSP Editor from a
- * Pageflow Diagram
- * 
- */
-public class OpenEditorAction extends SelectionAction {
-	/** The name of the request */
-	public static final String OPEN_EDITOR_REQUEST = PageflowMessages.Pageflow_Commands_OpenEditorCommand_Label;
-
-	/** The request */
-	Request request;
-
-	/**
-	 * The constructor
-	 * 
-	 * @param part -
-	 *            the IWorkbenchPart
-	 */
-	public OpenEditorAction(IWorkbenchPart part) {
-		super(part);
-		request = new Request(OPEN_EDITOR_REQUEST);
-		// Pageflow.Action.OpenEditor.Label = Edit Page
-		setText(PageflowMessages.Pageflow_Action_OpenEditor_Label);
-		setId(FacesConfigEditor.EDITOR_ID);
-		// Pageflow.Action.OpenEditor.ToolTip = Edit this page
-		setToolTipText(PageflowMessages.Pageflow_Action_OpenEditor_ToolTip);
-	}
-
-	/**
-	 * Determines if the action can be enabled
-	 * 
-	 * @return boolean - the enabled state
-	 */
-	protected boolean calculateEnabled() {
-		return canPerformAction();
-	}
-
-	/**
-	 * Determines if the action can be performed
-	 * 
-	 * @return boolean - the perform state
-	 */
-	private boolean canPerformAction() {
-		if (getSelectedObjects().isEmpty()) {
-			return false;
-		}
-		List parts = getSelectedObjects();
-		for (int i = 0; i < parts.size(); i++) {
-			Object o = parts.get(i);
-			if (!(o instanceof EditPart)) {
-				return false;
-			}
-			EditPart part = (EditPart) o;
-			if (!(part.getModel() instanceof PageflowPage)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns the command for the action
-	 * 
-	 * @return Command - the action command
-	 */
-	private Command getCommand() {
-		List editparts = getSelectedObjects();
-		CompoundCommand cc = new CompoundCommand();
-		cc.setDebugLabel(OPEN_EDITOR_REQUEST);
-		for (int i = 0; i < editparts.size(); i++) {
-			EditPart part = (EditPart) editparts.get(i);
-			cc.add(part.getCommand(request));
-		}
-		return cc;
-	}
-
-	/**
-	 * Runs the command
-	 */
-	public void run() {
-		execute(getCommand());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#execute(org.eclipse.gef.commands.Command)
-	 */
-	protected void execute(Command command) {
-		if (command == null || !command.canExecute()) {
-			return;
-		}
-		command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/ShowPropertyViewAction.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/ShowPropertyViewAction.java
deleted file mode 100644
index 24fe9da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/ShowPropertyViewAction.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.action;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.ui.actions.SelectionAction;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * 
- * This is the Action for opening a JSP page in the default JSP Editor from a
- * Pageflow Diagram
- * 
- * @author Xiao-guang Zhang
- */
-public class ShowPropertyViewAction extends SelectionAction {
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(ShowPropertyViewAction.class);
-
-	/** The ID of the action */
-	public static final String SHOW_PROPERTY_VIEW = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.ShowPropertyViewAction"; //$NON-NLS-1$ 
-
-	/**
-	 * The constructor
-	 * 
-	 * @param part -
-	 *            the IWorkbenchPart
-	 */
-	public ShowPropertyViewAction(IWorkbenchPart part) {
-		super(part);
-		// Pageflow.Action.ShowPropertyView.Label = Properties
-		setText(PageflowMessages.Pageflow_Action_ShowPropertyView_Label);
-		setId(SHOW_PROPERTY_VIEW);
-		// Pageflow.Action.ShowPropertyView.ToolTip = Show properties
-		setToolTipText(PageflowMessages.Pageflow_Action_ShowPropertyView_ToolTip);
-	}
-
-	/**
-	 * Determines if the action can be enabled
-	 * 
-	 * @return boolean - the enabled state
-	 */
-	protected boolean calculateEnabled() {
-		return canPerformAction();
-	}
-
-	/**
-	 * Determines if the action can be performed
-	 * 
-	 * @return boolean - the perform state
-	 */
-	private boolean canPerformAction() {
-		if (getSelectedObjects().isEmpty()) {
-			return false;
-		}
-		List parts = getSelectedObjects();
-		for (int i = 0; i < parts.size(); i++) {
-			Object o = parts.get(i);
-			if (!(o instanceof EditPart)) {
-				return false;
-			}
-			EditPart part = (EditPart) o;
-			if (!((part.getModel() instanceof PageflowElement))) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Runs the command
-	 */
-	public void run() {
-		List editparts = getSelectedObjects();
-		if (editparts.size() > 0) {
-			EditPart part = (EditPart) editparts.get(0);
-			// execute(getCommand());
-			if (part.getModel() instanceof PageflowElement) {
-				// ensure the visibility of the palette view and property veiw.
-				IWorkbenchWindow dw = PlatformUI.getWorkbench()
-						.getActiveWorkbenchWindow();
-				IWorkbenchPage page = dw.getActivePage();
-				if (page != null) {
-					try {
-						page.showView("org.eclipse.ui.views.PropertySheet"); //$NON-NLS-1$
-					} catch (PartInitException e) {
-						// Pageflow.PageflowEditor.Error.canNotShowPropertyView
-						// = Failed to show property sheet view.
-						log
-								.error(
-										"Pageflow.PageflowEditor.Error.canNotShowPropertyView", //$NON-NLS-1$
-										e);
-					}
-
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom.gif
deleted file mode 100644
index 9eea558..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom_d.gif
deleted file mode 100644
index 1c62797..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignbottom_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter.gif
deleted file mode 100644
index 4e8c94a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter_d.gif
deleted file mode 100644
index ceeafb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligncenter_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft.gif
deleted file mode 100644
index 55cecc2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft_d.gif
deleted file mode 100644
index 60fcc8f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignleft_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid.gif
deleted file mode 100644
index 5f13c93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid_d.gif
deleted file mode 100644
index 2f7534e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignmid_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright.gif
deleted file mode 100644
index f6ead15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright_d.gif
deleted file mode 100644
index 0495ed5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/alignright_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop.gif
deleted file mode 100644
index 2f9ceeb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop_d.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop_d.gif
deleted file mode 100644
index 9f1b49b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/action/icons/aligntop_d.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AbstractBatchEditCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AbstractBatchEditCommand.java
deleted file mode 100644
index eded9f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AbstractBatchEditCommand.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer;
-
-/**
- * A batched edit command will enable adapters to interven before and after a
- * set of operations was done by sending notification to the adapters.
- * 
- * @author hmeng
- */
-
-/*package*/ abstract class AbstractBatchEditCommand extends Command {
-	Pageflow pageflow;
-
-	/**
-	 * @param pageflow
-	 */
-	public AbstractBatchEditCommand(Pageflow pageflow) {
-		this(pageflow, null);
-	}
-
-	/**
-	 * @param pageflow
-	 * @param label
-	 */
-	public AbstractBatchEditCommand(Pageflow pageflow, String label) {
-		super(label);
-		this.pageflow = pageflow;
-	}
-
-	/**
-	 * @return the pageflow
-	 */
-	public Pageflow getPageflow() {
-		return pageflow;
-	}
-
-	/**
-	 * The subclass should extend methods doXXX only.
-	 */
-	final public void execute() {
-		preExecute();
-		doExecute();
-		postExecute();
-	}
-
-	final public void redo() {
-		doRedo();
-	}
-
-	final public void undo() {
-		preExecute();
-		doUndo();
-		postExecute();
-	}
-
-	/**
-	 * 
-	 */
-	abstract public void doExecute();
-
-	/**
-	 * Do the customized redo
-	 */
-	public void doRedo() {
-		execute();
-	}
-
-	abstract void doUndo();
-
-	final void preExecute() {
-		getPageflow().eNotify(
-				new ENotificationImpl((InternalEObject) getPageflow(),
-						FC2PFTransformer.MY_NOTIFICATION_TYPE,
-						PageflowPackage.PAGEFLOW, null, null));
-	}
-
-	/**
-	 * execute the post-execution handling
-	 */
-	final protected void postExecute() {
-		getPageflow().eNotify(
-				new ENotificationImpl((InternalEObject) getPageflow(),
-						FC2PFTransformer.MY_NOTIFICATION_TYPE1,
-						PageflowPackage.PAGEFLOW, null, null));
-		notifyPageflow(getPageflow());
-	}
-
-	/**
-	 * @param pageflow_
-	 */
-	protected void notifyPageflow(Pageflow pageflow_) {
-		pageflow_.notifyModelChanged(new ENotificationImpl(
-				(InternalEObject) pageflow_, Notification.ADD,
-				PageflowPackage.PAGEFLOW, null, null));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddConnectionCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddConnectionCommand.java
deleted file mode 100644
index 149da0b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddConnectionCommand.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.layout.PageflowLayoutManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-
-/**
- * Add a new connection
- * 
- * @author hmeng
- * 
- */
-public class AddConnectionCommand extends ConnectionCommand {
-
-	public boolean canExecute() {
-		// if user don't set PFLink object before, this command can't be
-		// executed.
-		if (link == null) {
-			return false;
-		}
-
-		// It is a connection create command
-		if (oldSource == null && oldTarget == null) {
-			// It is a connection create command
-			// Source and target must be pointing to some
-			// real connection point
-			if (source == null || target == null) {
-				return false;
-			}
-
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					source, target)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	public void doExecute() {
-		// It is a connection create command
-		if (canExecute() && oldSource == null && oldTarget == null) {
-			Pageflow pageflow = null;
-			// Get a reference to the pageflow
-			if (source != null) {
-				pageflow = source.getPageflow();
-			} else if (target != null) {
-				pageflow = target.getPageflow();
-			}
-			pageflow.connect(source, target, link);
-
-			// self loop link
-			if (source == target) {
-				PageflowLayoutManager.updateSelfLoopLink(link);
-			}
-		}
-	}
-
-	public void redo() {
-		// TODO Auto-generated method stub
-		super.redo();
-	}
-
-	public void undo() {
-		if (canExecute()) {
-			// It was a connection create command
-			if (oldSource == null && oldTarget == null) {
-
-				Pageflow pageflow = null;
-				// Get a reference to the pageflow
-				if (source != null) {
-					pageflow = source.getPageflow();
-				} else if (target != null) {
-					pageflow = target.getPageflow();
-				}
-
-				// Ensure that link knows nothing about nodes anymore.
-				link.setSource(null);
-				link.setTarget(null);
-				// Remove link from pageflow
-				pageflow.getLinks().remove(link);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddNodeCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddNodeCommand.java
deleted file mode 100644
index be41ab2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/AddNodeCommand.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * This is the add command for pageflow editpart
- * 
- */
-public class AddNodeCommand extends Command {
-	/** Pageflow node including Page, action, begin, end. */
-	private PageflowNode child;
-
-	/** parent Pageflow */
-	private Pageflow parent;
-
-	/** index of pageflow nodes */
-	private int index = -1;
-
-	/**
-	 * Default constructor
-	 */
-	public AddNodeCommand() {
-		// Pageflow.Commands.AddNodeCommand.Label = add
-		super(PageflowMessages.Pageflow_Commands_AddNodeCommand_Label);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		if (index < 0) {
-			parent.getNodes().add(child);
-		} else {
-			parent.getNodes().add(index, child);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		if (index < 0) {
-			parent.getNodes().add(child);
-		} else {
-			parent.getNodes().add(index, child);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		parent.getNodes().remove(child);
-	}
-
-	/**
-	 * get parent pageflow of the node.
-	 * @return the parent
-	 * 
-	 */
-	public Pageflow getParent() {
-		return parent;
-	}
-
-	/**
-	 * Set the child pageflow node
-	 * 
-	 * @param subpart -
-	 *            child pageflow node
-	 */
-	public void setChild(PageflowNode subpart) {
-		child = subpart;
-	}
-
-	/**
-	 * Creates a new AbstractEditorPage instance.
-	 * 
-	 * @param i -
-	 *            index of pageflow node
-	 */
-	public void setIndex(int i) {
-		index = i;
-	}
-
-	/**
-	 * Set the new parent pageflow
-	 * 
-	 * @param newParent -
-	 *            parent pageflow
-	 */
-	public void setParent(Pageflow newParent) {
-		parent = newParent;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/BendpointCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/BendpointCommand.java
deleted file mode 100644
index e4690d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/BendpointCommand.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-
-/**
- * base class for bend point commands.
- * 
- */
-/*package*/ abstract class BendpointCommand extends Command {
-	/** the index of the bend point */
-	protected int index;
-
-	/** the location of the bendpoint */
-	protected Point location;
-
-	/** the parent link */
-	protected PageflowLink link;
-
-	/** relative dimension between the bendpoint with start point of the pflink */
-	private Dimension dimStart;
-
-	/** relative dimension between the bendpoint with end point of the pflink */
-	private Dimension dimEnd;
-
-	/**
-	 * @param label
-	 */
-	public BendpointCommand(String label) {
-		super(label);
-	}
-
-	/**
-	 * get the dimension between the bendpoint and start point
-	 * 
-	 * @return - the start dimension
-	 */
-	protected Dimension getFirstRelativeDimension() {
-		return dimStart;
-	}
-
-	/**
-	 * get the dimension between the bendpoint and end point
-	 * 
-	 * @return - the end dimension
-	 */
-	protected Dimension getSecondRelativeDimension() {
-		return dimEnd;
-	}
-
-	/**
-	 * get the index of the bend point
-	 * 
-	 * @return - the index
-	 */
-	protected int getIndex() {
-		return index;
-	}
-
-	/**
-	 * get the location of the bend point
-	 * 
-	 * @return - the index
-	 */
-	protected Point getLocation() {
-		return location;
-	}
-
-	/**
-	 * get the parent link
-	 * 
-	 * @return - parent link
-	 */
-	protected PageflowLink getPFLink() {
-		return link;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		execute();
-	}
-
-	/**
-	 * set the relative dimensions of the bendpoint
-	 * 
-	 * @param dim1 -
-	 *            the dimension between the bendpoint and start point
-	 * @param dim2 -
-	 *            the dimension between the bendpoint and end point
-	 */
-	public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
-		dimStart = dim1;
-		dimEnd = dim2;
-	}
-
-	/**
-	 * set the index of the bendpoint in the bendpoint list
-	 * 
-	 * @param i -
-	 *            index
-	 */
-	public void setIndex(int i) {
-		index = i;
-	}
-
-	/**
-	 * set the location of the bendpoing
-	 * 
-	 * @param p -
-	 *            new location
-	 */
-	public void setLocation(Point p) {
-		location = p;
-	}
-
-	/**
-	 * set the parent link
-	 * 
-	 * @param newLink -
-	 *            new parent pflink
-	 */
-	public void setPFLink(PageflowLink newLink) {
-		link = newLink;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommand.java
deleted file mode 100644
index dafa9f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommand.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.TransformUtil;
-
-/**
- * This is the connection command for pageflow editpart
- * 
- * @author Xiao-guang Zhang, hmeng
- */
-public abstract class ConnectionCommand extends Command {
-	/** Old source pageflow node */
-	protected PageflowNode oldSource;
-
-	/** Old target pageflow node */
-	protected PageflowNode oldTarget;
-
-	/** New source pageflow node */
-	protected PageflowNode source;
-
-	/** New target pageflow node */
-	protected PageflowNode target;
-
-	/** pageflow link */
-	protected PageflowLink link;
-
-	/**
-	 * Default constructor
-	 */
-	public ConnectionCommand() {
-		super(PageflowMessages.Pageflow_Commands_ConnectionCommand_Label);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return TransformUtil.isValidPageflowElement(link);
-	}
-
-	/**
-	 * perform the main command execution.  Sub-classes should override.
-	 */
-	protected void doExecute() {
-	    // do nothing; sub-class can over-ride
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public final void execute() {
-		if (canExecute()) {
-			doExecute();
-		} else {
-			link = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		execute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ommand#undo()
-	 */
-	public void undo() {
-        // do nothing
-	}
-
-	/**
-	 * Get the source pageflow node
-	 * 
-	 * @return - the source pageflow node
-	 */
-	public PageflowNode getSource() {
-		return source;
-	}
-
-	/**
-	 * Get the target pageflow node
-	 * 
-	 * @return - the target pageflow node.
-	 */
-	public PageflowNode getTarget() {
-		return target;
-	}
-
-	/**
-	 * Get the pageflow link
-	 * 
-	 * @return - the pageflow link.
-	 */
-	public PageflowLink getPFLink() {
-		return link;
-	}
-
-	/**
-	 * Set the source pageflow node
-	 * 
-	 * @param newSource -
-	 *            new source pageflow node
-	 */
-	public void setSource(PageflowNode newSource) {
-		source = newSource;
-	}
-
-	/**
-	 * Set the target pageflow node
-	 * 
-	 * @param newTarget -
-	 *            new target pageflow node
-	 */
-	public void setTarget(PageflowNode newTarget) {
-		target = newTarget;
-	}
-
-	/**
-	 * Set the pageflow link
-	 * 
-	 * @param link -
-	 *            new pageflow link
-	 */
-	public void setPFLink(PageflowLink link) {
-		this.link = link;
-		oldSource = link.getSource();
-		oldTarget = link.getTarget();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommandFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommandFactory.java
deleted file mode 100644
index 8c7397c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ConnectionCommandFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-
-/**
- * The factory helps to create connection commands.
- * 
- * @author hmeng
- * 
- */
-public class ConnectionCommandFactory {
-	/**
-	 * @param request
-	 * @return the connection command for  the request
-	 */
-	public static ConnectionCommand createCommand(Request request) {
-		ConnectionCommand command = null;
-		if (request.getType() == RequestConstants.REQ_CONNECTION_START
-				|| request.getType() == RequestConstants.REQ_CONNECTION_END) {
-			command = new AddConnectionCommand();
-		} else if (request.getType() == RequestConstants.REQ_RECONNECT_SOURCE
-				|| request.getType() == RequestConstants.REQ_RECONNECT_TARGET) {
-			command = new ReconnectConnectionCommand();
-		} else if (request.getType() == RequestConstants.REQ_DELETE) {
-			command = new DeleteConnectionCommand();
-		}
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateBendpointCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateBendpointCommand.java
deleted file mode 100644
index 60df11d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateBendpointCommand.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * Create a new bend point command
- * 
- */
-public class CreateBendpointCommand extends BendpointCommand {
-	/**
-	 * Default constructor
-	 */
-	public CreateBendpointCommand() {
-		// Pageflow.Commands.CreateBendpointCommand.Label = Create Bendpoint
-		super(PageflowMessages.Pageflow_Commands_CreateBendpointCommand_Label);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		Map registry = EPackage.Registry.INSTANCE;
-		String pageflowURI = PageflowPackage.eNS_URI;
-		PageflowPackage pageflowPackage = (PageflowPackage) registry
-				.get(pageflowURI);
-		PageflowFactory factory = pageflowPackage.getPageflowFactory();
-		PageflowLinkBendpoint _newBendpoint = factory.createPFLinkBendpoint();
-
-		_newBendpoint.setRelativeDimensions(getFirstRelativeDimension(),
-				getSecondRelativeDimension());
-		getPFLink().insertBendpoint(getIndex(), _newBendpoint);
-		super.execute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		super.undo();
-		getPFLink().removeBendpoint(getIndex());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateNodeCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateNodeCommand.java
deleted file mode 100644
index 0cb7b28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/CreateNodeCommand.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * This is the creation command for pageflow editpart
- * 
- * @author Xiao-guang Zhang
- */
-public class CreateNodeCommand extends Command implements IPreExecuteCommand {
-	private static final String UNNAMED_NODE = "unnamed"; //$NON-NLS-1$
-
-	/** new pageflow node */
-	private PageflowNode child;
-
-	/** size of pageflow node figure */
-	private Rectangle rect;
-
-	/** parent pageflow */
-	private Pageflow parent;
-
-	/** index of pageflow nodes */
-	// private int _index = -1;
-	public CreateNodeCommand() {
-		// Pageflow.Commands.CreateNodeCommand.Label = Create new node
-		super(PageflowMessages.Pageflow_Commands_CreateNodeCommand_Label);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return child != null && parent != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		if (rect != null) {
-			child.setX(rect.x);
-			child.setY(rect.y);
-			if (!rect.isEmpty()) {
-				child.setHeight(rect.getSize().height);
-				child.setWidth(rect.getSize().width);
-			}
-		}
-
-		if (child.getName() == UNNAMED_NODE) {
-			child.setName(parent.getDefaultNodeName(child.getClass()));
-		}
-
-		parent.getNodes().add(child);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		if (rect != null) {
-			child.setX(rect.x);
-			child.setY(rect.y);
-			if (!rect.isEmpty()) {
-				child.setHeight(rect.getSize().height);
-				child.setWidth(rect.getSize().width);
-			}
-		}
-
-		parent.getNodes().add(child);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		parent.getNodes().remove(child);
-	}
-
-	/**
-	 * select a jsp page in current project.
-	 * 
-	 * @return
-	 */
-	private boolean selectJSPPage() {
-
-		Shell shell = null;
-		IWorkbenchWindow workbenchWindow = EditorPlugin
-				.getActiveWorkbenchWindow();
-		if (workbenchWindow.getShell() != null) {
-			shell = workbenchWindow.getShell();
-		} else {
-			shell = new Shell();
-		}
-		IProject project = WebrootUtil.getProject(getParent());
-
-		CommonResourceDialog dialog = new CommonResourceDialog(shell, project,
-				SWT.NONE);
-
-		dialog
-				.setTitle(PageflowMessages.Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Title);
-		// no suffix filter
-		dialog.setSuffixs(null);
-		dialog
-				.setResourceDescription(PageflowMessages.Pageflow_Commands_CreateNodeCommand_SelectJSPDialog_Description);
-
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			if (result != null) {
-				IFile jspFile = (IFile) result[0];
-				if (jspFile != null) {
-					// get the project path for the new created file, i.e.,
-					// /project/webroot/*.jsp
-					String jsfSelection = WebrootUtil.getWebPath(jspFile
-							.getFullPath());
-					if (jsfSelection != null && jsfSelection.length() > 0) {
-						if (PageflowValidation.getInstance().isExistedPage(
-								this.parent, jsfSelection)) {
-							// Pageflow.PageflowEditor.Alert.DNDResourceTitle =
-							// Pageflow Creation Error
-							// Pageflow.PageflowEditor.Alert.ExistingPage = The
-							// web page {0} is already existed in current
-							// PageFlow.
-							EditorPlugin
-									.getAlerts()
-									.error(
-											"Pageflow.PageflowEditor.Alert.DNDResourceTitle", //$NON-NLS-1$
-											"Pageflow.PageflowEditor.Alert.ExistingPage", //$NON-NLS-1$
-											jsfSelection);
-							return false;
-						}
-
-						((PageflowPage) (child)).setPath(jsfSelection);
-						((PageflowPage) (child)).setName(WebrootUtil
-								.getPageNameFromWebPath(jsfSelection));
-					}
-
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * call the JSF wizard to create a new jsf page.
-	 * @return the parent
-	 * 
-	 */
-	public Pageflow getParent() {
-		return parent;
-	}
-
-	/**
-	 * set the child node
-	 * 
-	 * @param subpart -
-	 *            new child pageflow node
-	 */
-	public void setChild(PageflowNode subpart) {
-		child = subpart;
-	}
-
-	/**
-	 * set the location of the new pageflow node
-	 * 
-	 * @param r -
-	 *            location of the new pageflow node
-	 */
-	public void setLocation(Rectangle r) {
-		rect = r;
-	}
-
-	/**
-	 * set the parent pageflow
-	 * 
-	 * @param newParent -
-	 *            the new parent pageflow
-	 */
-	public void setParent(Pageflow newParent) {
-		parent = newParent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.commands.IPreExecuteCommand#preExecute()
-	 */
-	public boolean preExecute() {
-		// note that the model adds the ports to the node in this call
-		// pop up the new the wizard to create the new jsf file
-		if (child instanceof PageflowPage) {
-			// if the new page's file path is not empty, i.e., drag a file from
-			// resource navigator view
-			if (null != ((PageflowPage) child).getPath()) {
-				if (PageflowValidation.getInstance().isExistedPage(parent,
-						(PageflowPage) child)) {
-					// Pageflow.PageflowEditor.Alert.DNDResourceTitle = Pageflow
-					// Creation Error
-					// Pageflow.PageflowEditor.Alert.ExistingPage = The web page
-					// {0} is already existed in current PageFlow.
-					EditorPlugin.getAlerts().error(
-							"Pageflow.PageflowEditor.Alert.DNDResourceTitle", //$NON-NLS-1$
-							"Pageflow.PageflowEditor.Alert.ExistingPage", //$NON-NLS-1$
-							((PageflowPage) child).getPath());
-					return false;
-				}
-			} else
-			// create a new jsf page from scratch
-			{
-				// return createNewJSFPage();
-				return selectJSPPage();
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DelegatingCommandStack.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DelegatingCommandStack.java
deleted file mode 100644
index 1586f6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DelegatingCommandStack.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.EventObject;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackListener;
-import org.eclipse.gef.commands.UnexecutableCommand;
-
-/**
- * This is a delegating command stack, which delegates everything to another
- * CommandStack except event listners.
- * <p>
- * Event listeners registered to a <code>DelegatingCommandStack</code> will be
- * informed whenever the underlying <code>CommandStack</code> changes. They
- * will not be registered to the underlying <code>CommandStack</code> directly
- * but they will be informed about change events of them.
- * 
- */
-public class DelegatingCommandStack extends CommandStack implements
-		CommandStackListener {
-	/** the empty object array */
-	private static final Object[] EMPTY_OBJECT_ARRAY = new Object[] {};
-
-	/** the current command stack */
-	private CommandStack currentCommandStack = null;
-
-	/**
-	 * Returns the current <code>CommandStack</code>.
-	 * 
-	 * @return - the current <code>CommandStack</code>
-	 */
-	public CommandStack getCurrentCommandStack() {
-		return currentCommandStack;
-	}
-
-	/**
-	 * Sets the current <code>CommandStack</code>.
-	 * 
-	 * @param stack -
-	 *            the <code>CommandStack</code> to set
-	 */
-	public void setCurrentCommandStack(CommandStack stack) {
-		if (currentCommandStack == stack) {
-			return;
-		}
-
-		// remove from old command stack
-		if (null != currentCommandStack) {
-			currentCommandStack.removeCommandStackListener(this);
-		}
-
-		// set new command stack
-		currentCommandStack = stack;
-
-		if (currentCommandStack != null) {
-			// watch new command stack
-			currentCommandStack.addCommandStackListener(this);
-
-			// the command stack changed
-			notifyListeners();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#canRedo()
-	 */
-	public boolean canRedo() {
-		if (null == currentCommandStack) {
-			return false;
-		}
-
-		return currentCommandStack.canRedo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#canUndo()
-	 */
-	public boolean canUndo() {
-		if (null == currentCommandStack) {
-			return false;
-		}
-
-		return currentCommandStack.canUndo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#dispose()
-	 */
-	public void dispose() {
-		if (null != currentCommandStack) {
-			currentCommandStack.dispose();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#execute(org.eclipse.gef.commands.Command)
-	 */
-	public void execute(Command command) {
-		if (null != currentCommandStack) {
-			currentCommandStack.execute(command);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#flush()
-	 */
-	public void flush() {
-		if (null != currentCommandStack) {
-			currentCommandStack.flush();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getCommands()
-	 */
-	public Object[] getCommands() {
-		if (null == currentCommandStack) {
-			return EMPTY_OBJECT_ARRAY;
-		}
-
-		return currentCommandStack.getCommands();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getRedoCommand()
-	 */
-	public Command getRedoCommand() {
-		if (null == currentCommandStack) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		return currentCommandStack.getRedoCommand();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getUndoCommand()
-	 */
-	public Command getUndoCommand() {
-		if (null == currentCommandStack) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		return currentCommandStack.getUndoCommand();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#getUndoLimit()
-	 */
-	public int getUndoLimit() {
-		if (null == currentCommandStack) {
-			return -1;
-		}
-
-		return currentCommandStack.getUndoLimit();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#isDirty()
-	 */
-	public boolean isDirty() {
-		if (null == currentCommandStack) {
-			return false;
-		}
-
-		return currentCommandStack.isDirty();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#markSaveLocation()
-	 */
-	public void markSaveLocation() {
-		if (null != currentCommandStack) {
-			currentCommandStack.markSaveLocation();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#redo()
-	 */
-	public void redo() {
-		if (null != currentCommandStack) {
-			currentCommandStack.redo();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#setUndoLimit(int)
-	 */
-	public void setUndoLimit(int undoLimit) {
-		if (null != currentCommandStack) {
-			currentCommandStack.setUndoLimit(undoLimit);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStack#undo()
-	 */
-	public void undo() {
-		if (null != currentCommandStack) {
-			currentCommandStack.undo();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Object#toString()
-	 */
-	public String toString() {
-		return "DelegatingCommandStack(" + currentCommandStack + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see CommandStackListener#commandStackChanged(java.util.EventObject)
-	 */
-	public void commandStackChanged(EventObject event) {
-		notifyListeners();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteBendpointCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteBendpointCommand.java
deleted file mode 100644
index 25e0049..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteBendpointCommand.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-
-/**
- * 
- */
-public class DeleteBendpointCommand extends BendpointCommand {
-
-	/** the deleting bendpoint */
-	private PageflowLinkBendpoint bendpoint;
-
-	/**
-	 * Default constructor
-	 */
-	public DeleteBendpointCommand() {
-
-		// Pageflow.Commands.DeleteBendpointCommand.Label = Delete Bendpoint
-		super(PageflowMessages.Pageflow_Commands_DeleteBendpointCommand_Label);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		super.execute();
-		bendpoint = (PageflowLinkBendpoint) getPFLink().getBendPoints().get(
-				getIndex());
-		getPFLink().removeBendpoint(getIndex());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		super.undo();
-		getPFLink().insertBendpoint(getIndex(), bendpoint);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteConnectionCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteConnectionCommand.java
deleted file mode 100644
index dd22437..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteConnectionCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-/**
- * Delete a connection.
- * 
- * @author hmeng
- * 
- */
-public class DeleteConnectionCommand extends ConnectionCommand {
-
-	public boolean canExecute() {
-		return link != null;
-	}
-
-	protected void doExecute() {
-		// It is a delete connection command
-		if (link != null) {
-			link.setSource(null);
-			link.setTarget(null);
-			oldSource.getPageflow().getLinks().remove(link);
-			link.eAdapters().clear();
-		}
-	}
-
-	public void undo() {
-		// It is a delete connection command
-		if (canExecute()) {
-			link.setSource(oldSource);
-			link.setTarget(oldTarget);
-			oldSource.getPageflow().getLinks().add(link);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteNodeCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteNodeCommand.java
deleted file mode 100644
index 4660942..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/DeleteNodeCommand.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * This is the delete command for pageflow editpart
- * 
- */
-public class DeleteNodeCommand extends AbstractBatchEditCommand {
-	/** the deleting pageflow node */
-	private PageflowNode child;
-
-	/** parent pageflow */
-	private Pageflow parent;
-
-	/** index of pageflow nodes */
-	private int index = -1;
-
-	/** source connections with the deleting node */
-	private List sourceConnections = new ArrayList();
-
-	private List sourceConnectionSources = new ArrayList();
-
-	private List sourceConnectionTargets = new ArrayList();
-
-	/** target connections with the deleting node */
-	private List targetConnections = new ArrayList();
-
-	private List targetConnectionSources = new ArrayList();
-
-	private List targetConnectionTargets = new ArrayList();
-
-	/**
-	 * @param pageflow
-	 */
-	public DeleteNodeCommand(Pageflow pageflow) {
-		// Pageflow.Commands.DeleteNodeCommand.Label = Delete
-		super(pageflow, PageflowMessages.Pageflow_Commands_DeleteNodeCommand_Label);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void doExecute() {
-		primExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void doRedo() {
-		primExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void doUndo() {
-		parent.getNodes().add(index, child);
-		restoreConnections(child);
-	}
-
-	/**
-	 * delete the connections related with the pageflow node.
-	 * 
-	 * @param node -
-	 *            the deleting pageflow node
-	 */
-	private void deleteConnections(PageflowNode node) {
-		while (node.getOutlinks().size() > 0) {
-			// Note:should save the source and target of the link, otherwise
-			// source and target will be lost,
-			// when the source and target node remove the link.
-			PageflowLink link = (PageflowLink) node.getOutlinks().get(0);
-			sourceConnections.add(link);
-			sourceConnectionSources.add(link.getSource());
-			sourceConnectionTargets.add(link.getTarget());
-
-			link.getTarget().getInlinks().remove(link);
-			node.getOutlinks().remove(link);
-			parent.getLinks().remove(link);
-		}
-
-		while (node.getInlinks().size() > 0) {
-			// Note: should save the source and target of the link, otherwise
-			// source and target will be lost,
-			// when the source and target node remove the link.
-			PageflowLink link = (PageflowLink) node.getInlinks().get(0);
-			targetConnections.add(link);
-			targetConnectionSources.add(link.getSource());
-			targetConnectionTargets.add(link.getTarget());
-
-			link.getSource().getOutlinks().remove(link);
-			node.getInlinks().remove(link);
-			parent.getLinks().remove(link);
-		}
-	}
-
-	/**
-	 * execute the delete command
-	 * 
-	 * 
-	 */
-	protected void primExecute() {
-		deleteConnections(child);
-		index = parent.getNodes().indexOf(child);
-		parent.getNodes().remove(child);
-	}
-
-	/**
-	 * restore the connections of the deleted pageflow node
-	 * 
-	 * @param node -
-	 *            the deleted pageflow node
-	 */
-	private void restoreConnections(PageflowNode node) {
-		for (int i = 0; i < sourceConnections.size(); i++) {
-			// restore the link with the source and target
-			PageflowLink link = (PageflowLink) sourceConnections.get(i);
-			PageflowNode source = (PageflowNode) sourceConnectionSources.get(i);
-			PageflowNode target = (PageflowNode) sourceConnectionTargets.get(i);
-			link.setSource(source);
-			link.setTarget(target);
-
-			parent.getLinks().add(link);
-			node.getOutlinks().add(link);
-			link.getTarget().getInlinks().add(link);
-		}
-		sourceConnections.clear();
-		for (int i = 0; i < targetConnections.size(); i++) {
-			// restore the link with the source and target
-			PageflowLink link = (PageflowLink) targetConnections.get(i);
-			PageflowNode source = (PageflowNode) targetConnectionSources.get(i);
-			PageflowNode target = (PageflowNode) targetConnectionTargets.get(i);
-			link.setSource(source);
-			link.setTarget(target);
-
-			parent.getLinks().add(link);
-			node.getInlinks().add(link);
-			link.getSource().getOutlinks().add(link);
-		}
-		targetConnections.clear();
-	}
-
-	/**
-	 * set the child pageflow node
-	 * 
-	 * @param c -
-	 *            the child pageflow node
-	 */
-	public void setChild(PageflowNode c) {
-		child = c;
-	}
-
-	/**
-	 * set the parent pageflow
-	 * 
-	 * @param p -
-	 *            the parent pageflow
-	 */
-	public void setParent(Pageflow p) {
-		parent = p;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandGEFAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandGEFAdapter.java
deleted file mode 100644
index 456c1b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandGEFAdapter.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-
-/**
- * This class is used to adapter EMF Command to GEF Command.
- * 
- * @author xgzhang
- * @version
- */
-/*package*/ class EMFCommandGEFAdapter extends Command {
-	private org.eclipse.emf.common.command.Command emfCommand;
-
-	/**
-	 * @param emfCommand 
-	 */
-	public EMFCommandGEFAdapter(
-			org.eclipse.emf.common.command.Command emfCommand) {
-		super();
-		this.emfCommand = emfCommand;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (emfCommand == null) {
-			return false;
-		}
-		return emfCommand.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canUndo()
-	 */
-	public boolean canUndo() {
-		if (emfCommand == null) {
-			return false;
-		}
-		return emfCommand.canUndo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#dispose()
-	 */
-	public void dispose() {
-		if (emfCommand == null) {
-			return;
-		}
-		emfCommand.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		if (emfCommand == null) {
-			return;
-		}
-		emfCommand.execute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#getLabel()
-	 */
-	public String getLabel() {
-		if (emfCommand == null) {
-			return null;
-		}
-		return emfCommand.getLabel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#redo()
-	 */
-	public void redo() {
-		if (emfCommand == null) {
-			return;
-		}
-		emfCommand.redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		if (emfCommand == null) {
-			return;
-		}
-		emfCommand.undo();
-	}
-
-	/**
-	 * 
-	 */
-	org.eclipse.emf.common.command.Command getEMFCommand() {
-		return emfCommand;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandStackGEFAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandStackGEFAdapter.java
deleted file mode 100644
index a253dff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/EMFCommandStackGEFAdapter.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.EventObject;
-
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-
-/**
- * This adapter is used to let editor be able to monitor EMF CommandStack, e.g.,
- * in StructuredTextEditor, using GEF CommandStack.
- * 
- * @author xgzhang
- * @version
- */
-public class EMFCommandStackGEFAdapter extends CommandStack implements
-		CommandStackListener {
-	private org.eclipse.emf.common.command.BasicCommandStack emfCommandStack;
-	private IStructuredModel model;
-
-	/**
-	 * @param doc
-	 */
-	public EMFCommandStackGEFAdapter (IDocument doc) {
-		
-		super();
-		
-		model = StructuredModelManager.getModelManager().getExistingModelForEdit(doc);
-		
-		if (model == null) {
-			model = StructuredModelManager.getModelManager().getModelForEdit((IStructuredDocument) doc);
-		}
-		
-		emfCommandStack = ((BasicCommandStack) this.model.getUndoManager().getCommandStack());
-		emfCommandStack.addCommandStackListener(this);
-	}
-
-	
-	@Override
-	public void dispose() {
-		model.releaseFromEdit();
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#canRedo()
-	 */
-	public boolean canRedo() {
-		if (emfCommandStack == null) {
-			return false;
-		}
-		return emfCommandStack.canRedo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#canUndo()
-	 */
-	public boolean canUndo() {
-		if (emfCommandStack == null) {
-			return false;
-		}
-		return emfCommandStack.canUndo();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#execute(org.eclipse.gef.commands.Command)
-	 */
-	public void execute(Command command) {
-		if (!(command instanceof EMFCommandGEFAdapter)) {
-			return;
-		}
-
-		org.eclipse.emf.common.command.Command emfCommand = ((EMFCommandGEFAdapter) command)
-				.getEMFCommand();
-		if (emfCommand != null) {
-			emfCommandStack.execute(emfCommand);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#flush()
-	 */
-	public void flush() {
-		if (emfCommandStack == null) {
-			return;
-		}
-		emfCommandStack.flush();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#getRedoCommand()
-	 */
-	public Command getRedoCommand() {
-		if (emfCommandStack == null || emfCommandStack.getRedoCommand() == null) {
-			return null;
-		}
-
-		return new EMFCommandGEFAdapter(emfCommandStack.getRedoCommand());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#getUndoCommand()
-	 */
-	public Command getUndoCommand() {
-		if (emfCommandStack == null || emfCommandStack.getUndoCommand() == null) {
-			return null;
-		}
-
-		return new EMFCommandGEFAdapter(emfCommandStack.getUndoCommand());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#isDirty()
-	 */
-	public boolean isDirty() {
-		if (emfCommandStack == null) {
-			return false;
-		}
-		return emfCommandStack.isSaveNeeded();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#markSaveLocation()
-	 */
-	public void markSaveLocation() {
-		if (emfCommandStack == null) {
-			return;
-		}
-		emfCommandStack.saveIsDone();
-		super.markSaveLocation();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#redo()
-	 */
-	public void redo() {
-		if (emfCommandStack == null) {
-			return;
-		}
-		emfCommandStack.redo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#undo()
-	 */
-	public void undo() {
-		if (emfCommandStack == null) {
-			return;
-		}
-		emfCommandStack.undo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.emf.common.command.CommandStackListener#commandStackChanged(java.util.EventObject)
-	 */
-	public void commandStackChanged(EventObject event) {
-		this.notifyListeners();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/IPreExecuteCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/IPreExecuteCommand.java
deleted file mode 100644
index 4bed8f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/IPreExecuteCommand.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-/**
- * Command with pre execute checking.
- * 
- * @author Xiao-guang Zhang
- * 
- * 
- */
-/*package*/ interface IPreExecuteCommand {
-	/**
-	 * Do something pre-execution of the actual command execution.
-	 * 
-	 * @return - successful to do the pre-execution
-	 */
-	boolean preExecute();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/MoveBendpointCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/MoveBendpointCommand.java
deleted file mode 100644
index dc1e0fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/MoveBendpointCommand.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * Move bend point command
- */
-public class MoveBendpointCommand extends BendpointCommand {
-	/**
-	 * old bend point of the link
-	 */
-	private PageflowLinkBendpoint oldBendpoint;
-
-	/**
-	 * Default constructor
-	 */
-	public MoveBendpointCommand() {
-		// Pageflow.Commands.MoveBendpointCommand.Label = Move Bendpoint
-		super(PageflowMessages.Pageflow_Commands_MoveBendpointCommand_Label);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		Map registry = EPackage.Registry.INSTANCE;
-		String pageflowURI = PageflowPackage.eNS_URI;
-		PageflowPackage pageflowPackage = (PageflowPackage) registry
-				.get(pageflowURI);
-		PageflowFactory factory = pageflowPackage.getPageflowFactory();
-		PageflowLinkBendpoint _newBendpoint = factory.createPFLinkBendpoint();
-
-		_newBendpoint.setRelativeDimensions(getFirstRelativeDimension(),
-				getSecondRelativeDimension());
-		setOldBendpoint((PageflowLinkBendpoint) getPFLink().getBendPoints().get(
-				getIndex()));
-
-		getPFLink().setBendpoint(getIndex(), _newBendpoint);
-		super.execute();
-	}
-
-	/**
-	 * get the old bend point
-	 * 
-	 * @return - old bend point
-	 */
-	protected PageflowLinkBendpoint getOldBendpoint() {
-		return oldBendpoint;
-	}
-
-	/**
-	 * set the old bend point
-	 * 
-	 * @param bp -
-	 *            old bend point
-	 */
-	public void setOldBendpoint(PageflowLinkBendpoint bp) {
-		oldBendpoint = bp;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		super.undo();
-		getPFLink().setBendpoint(getIndex(), getOldBendpoint());
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OpenEditorCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OpenEditorCommand.java
deleted file mode 100644
index e293eb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OpenEditorCommand.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * 
- * This is the Command for opening a file in its default editor
- * 
- * @author Xiao-guang Zhang
- */
-public class OpenEditorCommand extends Command {
-
-	/** The edit part */
-	private EditPart part;
-
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(FacesConfigEditor.class);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return true;
-	}
-
-	/**
-	 * The constructor
-	 * 
-	 * @param part -
-	 *            the EditPart
-	 */
-	public OpenEditorCommand(EditPart part) {
-		// Pageflow.Commands.OpenEditorCommand.Label = Open Editor
-		super(PageflowMessages.Pageflow_Commands_OpenEditorCommand_Label);
-		this.part = part;
-	}
-
-	/**
-	 * open existed JSF file or call the wizard to create a new one.
-	 * 
-	 */
-	private void executeOpenPFPage() {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		String pagePath = ((PageflowPage) (part.getModel())).getPath();
-
-		// Check the fileName is empty or not
-		if (pagePath != null && pagePath.length() > 0) {
-			String resourceName = WebrootUtil.getProjectPath((EObject) part
-					.getModel(), pagePath);
-			Path resourcePath = new Path(resourceName);
-			if (resourcePath.getFileExtension() != null) {
-				final IFile file = (IFile) workspaceRoot
-						.findMember(resourcePath);
-				openExistingJSFFile(file);
-			} else {
-				// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle =
-				// Open JSF File Error
-				// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFFolderInfo =
-				// Cannot open the page in the page editor.
-				EditorPlugin
-						.getAlerts()
-						.error(
-								"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle", //$NON-NLS-1$
-								"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFFolderInfo"); //$NON-NLS-1$
-			}
-		} else
-		// if the fileName is empty, a new jsf file should be created!
-		{
-			// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle = Open JSF
-			// File Error
-			// Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFile = No jsp
-			// file is related with this page.
-			EditorPlugin.getAlerts().error(
-					"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle", //$NON-NLS-1$
-					"Pageflow.PageflowEditor.Alert.confirmCreateNewJSFFile");// ) //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * open existing jsf file in a new editor.
-	 * 
-	 * @param file
-	 */
-	private void openExistingJSFFile(final IFile file) {
-		// if the file is existed, open it.
-		if (null != file && file.exists()) {
-			Display display = PlatformUI.getWorkbench()
-					.getActiveWorkbenchWindow().getShell().getDisplay();
-			display.asyncExec(new Runnable() {
-				public void run() {
-					IDE.setDefaultEditor(file, null);
-					try {
-						IWorkbenchPage page = PlatformUI.getWorkbench()
-								.getActiveWorkbenchWindow().getActivePage();
-						IEditorDescriptor desc = IDE.getEditorDescriptor(file);
-						page.openEditor(new FileEditorInput(file),
-								desc.getId(), true, IWorkbenchPage.MATCH_INPUT
-										| IWorkbenchPage.MATCH_ID);
-					} catch (PartInitException e) {
-						// Pageflow.PageflowEditor.Error.CanNotOpenEditor4JSF =
-						// The jsf file can not be opened in the editor.
-						log
-								.error(
-										"Pageflow.PageflowEditor.Error.canNotOpenEditor4JSF", //$NON-NLS-1$
-										e);
-						// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle
-						// = Open JSF File Error
-						EditorPlugin
-								.getAlerts()
-								.error(
-										"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle", //$NON-NLS-1$
-										"Pageflow.PageflowEditor.Error.CanNotOpenEditor4JSF"); //$NON-NLS-1$
-					}
-				}
-			});
-		} else
-		// otherwise, pop-up a error message box
-		{
-			String pagePath = ((PageflowPage) (part.getModel())).getPath();
-			// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle = Open JSF
-			// File Error
-			// Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFInfo = The JSF
-			// file is not existed.
-			EditorPlugin.getAlerts().error(
-					"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFTitle", //$NON-NLS-1$
-					"Pageflow.PageflowEditor.Alert.errorOpenEditor4JSFInfo", //$NON-NLS-1$
-					pagePath);
-		}
-	}
-
-	/**
-	 * Executes the OpenEditorCommand and opens the editor
-	 */
-	public void execute() {
-		if (part.getModel() instanceof PageflowPage) {
-			executeOpenPFPage();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OrphanChildCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OrphanChildCommand.java
deleted file mode 100644
index a695c32..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/OrphanChildCommand.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * This is the orphan child command for pageflow container
- * 
- */
-public class OrphanChildCommand extends Command {
-
-	/** old location of pageflow node */
-	private Point oldLocation;
-
-	/** the parent pageflow */
-	private Pageflow pageflow;
-
-	/** the child pageflow node */
-	private PageflowNode child;
-
-	/** the index of pageflow nodes */
-	private int index;
-
-	/**
-	 * Default constructor
-	 */
-	public OrphanChildCommand() {
-		// Pageflow.Commands.OrphanChildCommand.Label = Orphan Child
-		super(PageflowMessages.Pageflow_Commands_OrphanChildCommand_Label);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		List children = pageflow.getNodes();
-		index = children.indexOf(child);
-		oldLocation = new Point(child.getX(), child.getY());
-		pageflow.getNodes().remove(child);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		pageflow.getNodes().remove(child);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		child.setX(oldLocation.x);
-		child.setY(oldLocation.y);
-		pageflow.getNodes().add(index, child);
-	}
-
-	/**
-	 * set the child pageflow node
-	 * 
-	 * @param child -
-	 *            child pageflow node
-	 */
-	public void setChild(PageflowNode child) {
-		this.child = child;
-	}
-
-	/**
-	 * set the parent pageflow
-	 * 
-	 * @param parent -
-	 *            parent pageflow
-	 */
-	public void setParent(Pageflow parent) {
-		pageflow = parent;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/PreExecuteCommandStack.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/PreExecuteCommandStack.java
deleted file mode 100644
index 2741862..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/PreExecuteCommandStack.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CommandStack;
-
-/**
- * Before the command stack called execute to do the actual model modification,
- * it will call the command's IPreExecuteCommand inteface to check the command
- * can be execute or not.
- * 
- * 
- * @author Xiao-guang Zhang
- */
-public class PreExecuteCommandStack extends CommandStack {
-	/**
-	 * 
-	 */
-	public PreExecuteCommandStack() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.CommandStack#execute(org.eclipse.gef.commands.Command)
-	 */
-	public void execute(Command command) {
-		if (command == null || !command.canExecute()) {
-			return;
-		}
-		if (command instanceof IPreExecuteCommand) {
-			if (!((IPreExecuteCommand) command).preExecute()) {
-				return;
-			}
-		}
-		super.execute(command);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ReconnectConnectionCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ReconnectConnectionCommand.java
deleted file mode 100644
index 63519ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/ReconnectConnectionCommand.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-
-/**
- * Change the end of a link.
- * 
- * @author hmeng
- * 
- */
-public class ReconnectConnectionCommand extends ConnectionCommand {
-
-	/**
-	 * Default constructor
-	 */
-	public ReconnectConnectionCommand() {
-		super();
-	}
-
-	public boolean canExecute() {
-		// if user didn't set PFLink object beforehand, this command can't be
-		// executed.
-		if (link == null || link.eContainer() == null) {
-			return false;
-		}
-
-		// Reconnect both source and target
-		if (oldSource != null && source != null && oldTarget != null
-				&& target != null) {
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					source, target)) {
-				return false;
-			}
-		}
-
-		// Reconnect source
-		if (oldSource != null && source != null) {
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					source, oldTarget)) {
-				return false;
-			}
-		}
-		// Reconnect target
-		if (oldTarget != null && target != null) {
-			if (!PageflowValidation.getInstance().isValidLinkForCreation(
-					oldSource, target)) {
-				return false;
-			}
-		}
-
-		return true;
-
-	}
-
-	public void doExecute() {
-		String outcome = null, action = null, largeIcon = null, smallIcon = null;
-		boolean isRedirect = false;
-		outcome = link.getOutcome();
-		action = link.getFromaction();
-		isRedirect = link.isRedirect();
-		largeIcon = link.getLargeicon();
-		smallIcon = link.getSmallicon();
-		// It is a reconnect source command
-		if (oldSource != null && source != null) {
-			link.setSource(source);
-		}
-		// It is a reconnect target command
-		if (oldTarget != null && target != null) {
-			link.setTarget(target);
-		}
-		link.setOutcome(outcome);
-		link.setFromaction(action);
-		link.setLargeicon(largeIcon);
-		link.setSmallicon(smallIcon);
-		link.setRedirect(isRedirect);
-	}
-
-	public void undo() {
-		if (canExecute()) {
-			// It was a reconnect source command
-			if (oldSource != null && source != null) {
-				// The link source must be replaced by the oldSource
-				if (link.getSource() != null) {
-					link.getSource().getOutlinks().remove(link);
-				}
-				source.getOutlinks().remove(link);
-				link.setSource(oldSource);
-			}
-			// It was a reconnect target command
-			if (oldTarget != null && target != null) {
-				// The link target must be replaced by the oldTarget
-				if (link.getTarget() != null) {
-					link.getTarget().getInlinks().remove(link);
-				}
-				target.getInlinks().remove(link);
-				link.setTarget(oldTarget);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/RenameNodeCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/RenameNodeCommand.java
deleted file mode 100644
index e3e5269..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/RenameNodeCommand.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * Command to rename Node.
- * 
- * @author xgzhang
- */
-public class RenameNodeCommand extends Command {
-
-	/** new pageflow node */
-	private PageflowNode node;
-
-	/** new node name */
-	private String name;
-
-	/** old node name */
-	private String oldName;
-
-	/**
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		node.setName(name);
-	}
-
-	/**
-	 * Sets the new Activity name
-	 * 
-	 * @param string
-	 *            the new name
-	 */
-	public void setName(String string) {
-		name = string;
-	}
-
-	/**
-	 * Sets the old Activity name
-	 * 
-	 * @param string
-	 *            the old name
-	 */
-	public void setOldName(String string) {
-		oldName = string;
-	}
-
-	/**
-	 * Sets the source Activity
-	 * @param node 
-	 *            the source Activity
-	 */
-	public void setSource(PageflowNode node) {
-		this.node = node;
-	}
-
-	/**
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		node.setName(oldName);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/SetConstraintCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/SetConstraintCommand.java
deleted file mode 100644
index c36b929..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/command/SetConstraintCommand.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.command;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-
-/**
- * This is the SetConstraint command for XY layout edit policy
- * 
- */
-public class SetConstraintCommand extends Command {
-	/** location command label */
-	private static final String COMMAND_LABEL_LOCATION = PageflowMessages.SetConstraintCommand_Location;
-
-	/** resize command label */
-	private static final String COMMAND_LABEL_RESIZE = PageflowMessages.SetConstraintCommand_Resize;
-
-	/** new position */
-	private Point newPos;
-
-	/** new size */
-	private Dimension newSize;
-
-	/** olde position */
-	private Point oldPos;
-
-	/** old size */
-	private Dimension oldSize;
-
-	/** pageflow element */
-	private PageflowElement part;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#execute()
-	 */
-	public void execute() {
-		oldSize = new Dimension(part.getWidth(), part.getHeight());
-		oldPos = new Point(part.getX(), part.getY());
-		part.setX(newPos.x);
-		part.setY(newPos.y);
-		part.setHeight(newSize.height);
-		part.setWidth(newSize.width);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#redo()
-	 */
-	public void redo() {
-		part.setX(newPos.x);
-		part.setY(newPos.y);
-		part.setHeight(newSize.height);
-		part.setWidth(newSize.width);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Command#undo()
-	 */
-	public void undo() {
-		part.setX(oldPos.x);
-		part.setY(oldPos.y);
-		part.setHeight(oldSize.height);
-		part.setWidth(oldSize.width);
-	}
-
-	/**
-	 * return the label of the constraints
-	 */
-	public String getLabel() {
-		if (oldSize.equals(newSize)) {
-			return COMMAND_LABEL_LOCATION;
-		}
-		return COMMAND_LABEL_RESIZE;
-	}
-
-	/**
-	 * set the new location using rectangle
-	 * 
-	 * @param r -
-	 *            new location
-	 */
-	public void setLocation(Rectangle r) {
-		setLocation(r.getLocation());
-		setSize(r.getSize());
-	}
-
-	/**
-	 * set the new location using point
-	 * 
-	 * @param p -
-	 *            new location point
-	 */
-	public void setLocation(Point p) {
-		newPos = p;
-	}
-
-	/**
-	 * set the pageflow element
-	 * 
-	 * @param part -
-	 *            pageflow element
-	 */
-	public void setPart(PageflowElement part) {
-		this.part = part;
-	}
-
-	/**
-	 * set the new size
-	 * 
-	 * @param p -
-	 *            new size
-	 */
-	public void setSize(Dimension p) {
-		newSize = p;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ConfigurableRootEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ConfigurableRootEditPart.java
deleted file mode 100644
index 083c65e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ConfigurableRootEditPart.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.SimpleLoweredBorder;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * This RootEditPart can set its own's background, fourground color, and font.
- * All this properties can be changed.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class ConfigurableRootEditPart extends ScalableFreeformRootEditPart
-		implements IFigurePreference {
-	/**
-	 * 
-	 */
-	public ConfigurableRootEditPart() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		IFigure fig = super.createFigure();
-		fig.setOpaque(true);
-		fig.setBorder(new SimpleLoweredBorder());
-		return fig;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		getFigure().setForegroundColor(c);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		getFigure().setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		getFigure().setFont(f);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/DirectEditCellEditorLocator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/DirectEditCellEditorLocator.java
deleted file mode 100644
index 4c71c04..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/DirectEditCellEditorLocator.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * CellEditorLocator for Pageflow Node.
- * 
- * @author - Xiaoguang Zhang
- */
-/*package*/ class DirectEditCellEditorLocator implements CellEditorLocator {
-	/** the source label */
-	private Label label;
-
-	/**
-	 * Creates a new DirectEditCellEditorLocator for the given Label
-	 * 
-	 * @param label
-	 *            the Label
-	 */
-	public DirectEditCellEditorLocator(Label label) {
-		setLabel(label);
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see CellEditorLocator#relocate(CellEditor)
-	 */
-	public void relocate(CellEditor celleditor) {
-		Text text = (Text) celleditor.getControl();
-		Point pref = text.computeSize(-1, -1);
-		// get the label's boundary
-		Rectangle rect = label.getTextBounds().getCopy();
-		label.translateToAbsolute(rect);
-
-		// because the label can be empty and the size is too small
-		// here get the prefered text size according to label's size and default
-		// size.
-		int width, height;
-		if (pref.x > rect.width) {
-			width = pref.x;
-		} else {
-			width = rect.width;
-		}
-
-		if (pref.y > rect.height) {
-			height = pref.y;
-		} else {
-			height = rect.height;
-		}
-
-		// set the boundary of the text control
-		text.setBounds(rect.x - 1, rect.y - 1, width + 1, height + 1);
-	}
-
-	/**
-	 * Returns the Label figure.
-	 * 
-	 * @return the Label
-	 */
-	protected Label getLabel() {
-		return label;
-	}
-
-	/**
-	 * Sets the label.
-	 * 
-	 * @param label
-	 *            The label to set
-	 */
-	protected void setLabel(Label label) {
-		this.label = label;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IAnnotationEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IAnnotationEditPart.java
deleted file mode 100644
index 2c29393..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IAnnotationEditPart.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.text.source.Annotation;
-
-/**
- * Edit part's Annotation interface
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public interface IAnnotationEditPart {
-	/**
-	 * decorate current Edit Part.
-	 * @param annotation 
-	 */
-	void addAnnotation(Annotation annotation);
-
-	/**
-	 * un-decorate current EditPart
-	 * 
-	 */
-	void removeAnnotation();
-
-	/**
-	 * get the maker's resource instance.
-	 * 
-	 * @return marker resource
-	 */
-	IResource getMarkerResource();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IConnectionPreference.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IConnectionPreference.java
deleted file mode 100644
index 8ff1b9a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IConnectionPreference.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.swt.graphics.Color;
-
-/**
- * This interface can be used to set Connection's preference
- * 
- * @author Xiaoguang Zhang
- * 
- */
-public interface IConnectionPreference extends IFigurePreference {
-
-	/**
-	 * set the connection line width
-	 * 
-	 * @param w
-	 */
-	void setLineWidth(int w);
-
-	/**
-	 * set the label visible or not
-	 * 
-	 * @param b
-	 */
-	void setLabelVisible(boolean b);
-
-	/**
-	 * set the label's foreground color
-	 * 
-	 * @param c
-	 */
-	void setLabelForegroundColor(Color c);
-
-	/**
-	 * set the label's background color
-	 * 
-	 * @param c
-	 */
-	void setLabelBackgroundColor(Color c);
-
-	/**
-	 * set the connection router's style, it can be LINE_ROUTING_MANUAL,
-	 * LINE_ROUTING_MANHATTAN
-	 * 
-	 * @param style -
-	 *            The new connection router's style
-	 */
-	void setConnectionRouterStyle(int style);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IFigurePreference.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IFigurePreference.java
deleted file mode 100644
index 3dc924b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/IFigurePreference.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * This interface can be implemented to set the figure's preferences
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public interface IFigurePreference {
-	/**
-	 * Sets the foreground color.
-	 * 
-	 * @param c
-	 *            The new foreground color
-	 */
-	void setForegroundColor(Color c);
-
-	/**
-	 * Sets the background color.
-	 * 
-	 * @param c
-	 *            The new background color
-	 */
-	void setBackgroundColor(Color c);
-
-	/**
-	 * sets the new font
-	 * 
-	 * @param f
-	 */
-	void setFont(Font f);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ILayerPanePreference.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ILayerPanePreference.java
deleted file mode 100644
index 91d2af6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/ILayerPanePreference.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * LayerPane has muliple layers, this interface will be used to set different
- * layer's style.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public interface ILayerPanePreference extends IFigurePreference {
-	/**
-	 * Use manual line router 
-	 */
-	public static int LINE_ROUTING_MANUAL = 0;
-
-	/**
-	 * Use manhattan line router
-	 */
-	public static int LINE_ROUTING_MANHATTAN = 1;
-
-	/**
-	 * sets the grid to be shown or not
-	 * 
-	 * @param bVisible
-	 */
-	void setGridVisible(boolean bVisible);
-
-	/**
-	 * sets the grid's dimension
-	 * 
-	 * @param d
-	 *            The new grid spacing
-	 */
-	void setGridSpacing(Dimension d);
-
-	/**
-	 * set the grid's foregoundColor
-	 * 
-	 * @param c -
-	 *            The new foreground color
-	 */
-	void setGridForegroundColor(Color c);
-
-	/**
-	 * set the connection router's style, it can be LINE_ROUTING_MANUAL,
-	 * LINE_ROUTING_MANHATTAN
-	 * 
-	 * @param style -
-	 *            The new connection router's style
-	 */
-	void setConnectionRouterStyle(int style);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/INodePreference.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/INodePreference.java
deleted file mode 100644
index 3a2a3f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/INodePreference.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-
-/**
- * This interface can be used to set NodeEditPart's preference
- * 
- * @author Xiaoguang Zhang
- * 
- */
-
-public interface INodePreference extends IFigurePreference {
-
-	/**
-	 * Sets the text placement of the label relative to its icon. The default is
-	 * {@link org.eclipse.draw2d.PositionConstants#EAST}. Other possible values are
-	 * {@link org.eclipse.draw2d.PositionConstants#NORTH}, {@link org.eclipse.draw2d.PositionConstants#SOUTH} and
-	 * {@link org.eclipse.draw2d.PositionConstants#WEST}.
-	 * 
-	 * @param where
-	 *            the text placement
-	 */
-	void setTextPlacement(int where);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PFValidator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PFValidator.java
deleted file mode 100644
index 413a5a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PFValidator.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-/**
- * @author hmeng
- */
-
-public interface PFValidator {
-	/**
-	 * Validate the current page flow
-	 */
-	void validate();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowContainerEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowContainerEditPart.java
deleted file mode 100644
index 83590a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowContainerEditPart.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowContainerEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowXYLayoutEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * abstract class for pageflow container.
- */
-abstract class PageflowContainerEditPart extends PageflowElementEditPart {
-
-	/**
-	 * @param element -
-	 *            pageflow model.
-	 */
-	public PageflowContainerEditPart(PageflowElement element) {
-		super(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.CONTAINER_ROLE,
-				new PageflowContainerEditPolicy());
-		installEditPolicy(EditPolicy.LAYOUT_ROLE,
-				new PageflowXYLayoutEditPolicy());
-	}
-
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see PageflowElementEditPart#notifyChanged(Notification)
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-
-				switch (type) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					refreshChildrenOnUIThread();
-					break;
-				case Notification.SET:
-					refreshVisualsOnUIThread();
-					break;
-				}
-				super.notifyChanged(notification);
-			}
-		};
-	}
-
-	private void refreshChildrenOnUIThread() {
-		if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-			refreshChildren();
-		} else {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-				public void run() {
-					refreshChildren();
-				}			
-			});
-		}
-	}
-	
-	private void refreshVisualsOnUIThread() {
-		if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-			refreshVisuals();
-		} else {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-				public void run() {
-					refreshVisuals();
-				}			
-			});
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowDirectEditManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowDirectEditManager.java
deleted file mode 100644
index 5fa56d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowDirectEditManager.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.tools.CellEditorLocator;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * DirectEditManager for Pageflow node
- * 
- * @author - Xiaoguang Zhang
- */
-/*package*/ final class PageflowDirectEditManager extends DirectEditManager {
-	/** text font */
-	private Font scaledFont;
-
-	/** verify listener for the text control */
-	private VerifyListener verifyListener;
-
-	/** the direct editor's parent label. */
-	private final Label label;
-
-	/**
-	 * Creates a new PageflowDirectEditManager with the given attributes.
-	 * 
-	 * @param source
-	 *            the source EditPart
-	 * @param editorType
-	 *            type of editor
-	 * @param locator
-	 *            the CellEditorLocator
-	 * @param label
-	 */
-	public PageflowDirectEditManager(GraphicalEditPart source,
-			Class editorType, CellEditorLocator locator, Label label) {
-		super(source, editorType, locator);
-		this.label = label;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DirectEditManager#bringDown()
-	 */
-	protected void bringDown() {
-		// This method might be re-entered when super.bringDown() is called.
-		Font disposeFont = scaledFont;
-		scaledFont = null;
-		super.bringDown();
-		if (disposeFont != null && !disposeFont.isDisposed()) {
-			disposeFont.dispose();
-		}
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DirectEditManager#initCellEditor()
-	 */
-	protected void initCellEditor() {
-		Text text = (Text) getCellEditor().getControl();
-		verifyListener = new VerifyListener() {
-			public void verifyText(VerifyEvent event) {
-				Text text_ = (Text) getCellEditor().getControl();
-				String oldText = text_.getText();
-				// get the left string of the new input character
-				String leftText = oldText.substring(0, event.start);
-				// get the right string of the new input charactor
-				String rightText = oldText.substring(event.end, oldText
-						.length());
-
-				GC gc = new GC(text_);
-				Point size = gc.textExtent(leftText + event.text + rightText);
-				gc.dispose();
-				if (size.x != 0) {
-					size = text_.computeSize(size.x, SWT.DEFAULT);
-				}
-				getCellEditor().getControl().setSize(size.x, size.y);
-			}
-		};
-		text.addVerifyListener(verifyListener);
-
-		// set the initial text, font, to the direct editor
-		String initialLabelText = label.getText();
-		getCellEditor().setValue(initialLabelText);
-		IFigure figure = getEditPart().getFigure();
-		final Font figureFont = figure.getFont();
-        // take a copy of the font data for the label we are cell editing
-		FontData data = figureFont.getFontData()[0];
-		Dimension fontSize = new Dimension(0, data.getHeight());
-		label.translateToAbsolute(fontSize);
-		data.setHeight(fontSize.height);
-
-		if (scaledFont != null && !scaledFont.isDisposed())
-        {
-			scaledFont.dispose();
-        }
-		scaledFont = new Font(figureFont.getDevice(), data);
-
-		text.setFont(scaledFont);
-		text.selectAll();
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DirectEditManager#unhookListeners()
-	 */
-	protected void unhookListeners() {
-		super.unhookListeners();
-		Text text = (Text) getCellEditor().getControl();
-		text.removeVerifyListener(verifyListener);
-		verifyListener = null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPart.java
deleted file mode 100644
index 3f3a80f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPart.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.eclipse.draw2d.BendpointConnectionRouter;
-import org.eclipse.draw2d.ConnectionLayer;
-import org.eclipse.draw2d.FanRouter;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.ManhattanConnectionRouter;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.CompoundSnapToHelper;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.SnapToGeometry;
-import org.eclipse.gef.SnapToGrid;
-import org.eclipse.gef.SnapToGuides;
-import org.eclipse.gef.SnapToHelper;
-import org.eclipse.gef.editparts.AbstractEditPart;
-import org.eclipse.gef.editparts.GridLayer;
-import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
-import org.eclipse.gef.editpolicies.SnapFeedbackPolicy;
-import org.eclipse.gef.rulers.RulerProvider;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The container editr part for the whole pageflow, which uses the
- * WindowFigure(GEM) as the container figure.
- * 
- */
-public class PageflowEditPart extends PageflowContainerEditPart implements
-		LayerConstants, ILayerPanePreference {
-	/** The seperation for the two possible coincided connections */
-	private static final int CONNECTION_SEPERATION = 20;
-
-	private int connectionStyle = -1;
-
-	/**
-	 * Creates a new PageflowEditPart instance.
-	 * 
-	 * @param pageflow -
-	 *            pageflow model
-	 */
-	protected PageflowEditPart(Pageflow pageflow) {
-		super(pageflow);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		FreeformLayer layer = new FreeformLayer();
-		// layer.setOpaque(true);
-		layer.setLayoutManager(new FreeformLayout());
-		return layer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-
-		installEditPolicy(EditPolicy.NODE_ROLE, null);
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, null);
-		// installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
-		installEditPolicy(EditPolicy.COMPONENT_ROLE,
-				new RootComponentEditPolicy());
-		installEditPolicy("Snap Feedback", new SnapFeedbackPolicy()); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		if (key == SnapToHelper.class) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-
-			List snapStrategies = new ArrayList();
-			Boolean bRulerVisible = (Boolean) getViewer().getProperty(
-					RulerProvider.PROPERTY_RULER_VISIBILITY);
-			if (bRulerVisible != null && bRulerVisible.booleanValue()) {
-				snapStrategies.add(new SnapToGuides(this));
-			}
-
-			boolean bSnapToGeometry = store
-					.getBoolean(GEMPreferences.SNAP_TO_GEOMETRY);
-			if (bSnapToGeometry) {
-				snapStrategies.add(new SnapToGeometry(this));
-			}
-			boolean bSnapToGrid = store.getBoolean(GEMPreferences.SNAP_TO_GRID);
-			if (bSnapToGrid) {
-				snapStrategies.add(new SnapToGrid(this));
-			}
-
-			if (snapStrategies.size() == 0) {
-				return null;
-			}
-			if (snapStrategies.size() == 1) {
-				return snapStrategies.get(0);
-			}
-
-			SnapToHelper ss[] = new SnapToHelper[snapStrategies.size()];
-			for (int i = 0; i < snapStrategies.size(); i++) {
-				ss[i] = (SnapToHelper) snapStrategies.get(i);
-			}
-			return new CompoundSnapToHelper(ss);
-		}
-		return super.getAdapter(key);
-	}
-
-	/**
-	 * Returns the Pageflow.
-	 * 
-	 * @return the pageflow
-	 */
-	public Pageflow getPageflow() {
-		return (Pageflow) getPageflowElement();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List allChildren = new LinkedList();
-		Iterator it;
-
-		it = getPageflow().getNodes().iterator();
-		while (it.hasNext()) {
-			allChildren.add(it.next());
-		}
-
-		return allChildren;
-	}
-
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see Adapter#notifyChanged(Notification)
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-
-				// int featureId = notification.getFeatureID(
-				// PageflowPackage.class );
-				switch (type) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshChildren();
-					}
-					else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-	
-							public void run() {
-								refreshChildren();		
-							}
-							
-						});
-					}
-					break;
-
-				case Notification.SET:
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshChildren();
-						refreshVisuals();
-					}
-					else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				
-							public void run() {
-								refreshChildren();	
-								refreshVisuals();
-							}
-							
-						});
-					}
-					break;
-				case FC2PFTransformer.MY_NOTIFICATION_TYPE1:
-					restore((Pageflow) getModel());
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshChildren();
-						refreshVisuals();
-					}
-					else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				
-							public void run() {
-								refreshChildren();	
-								refreshVisuals();
-							}
-							
-						});
-					}
-					break;
-				// restore all children
-				case FC2PFTransformer.MY_NOTIFICATION_TYPE:
-					// stop all children
-					postPone((Pageflow) getModel());
-					break;
-				}
-			}
-
-			protected void restore(Pageflow pageflow) {
-				TreeIterator nodes;
-				// restore
-				nodes = pageflow.eAllContents();
-				while (nodes.hasNext()) {
-					setPostpone((EObject) nodes.next(), false);
-				}
-				setPostpone(pageflow, false);
-			}
-
-			void setPostpone(EObject node, boolean enable) {
-				List adapters = node.eAdapters();
-				for (int i = 0; i < adapters.size(); i++) {
-					if (adapters.get(i) instanceof PFBatchAdapter) {
-						((PFBatchAdapter) adapters.get(i))
-								.setNeedPostpone(enable);
-					}
-				}
-			}
-
-			protected void postPone(Pageflow pageflow) {
-				TreeIterator nodes;
-				// postpone
-				nodes = pageflow.eAllContents();
-				while (nodes.hasNext()) {
-					setPostpone((EObject) nodes.next(), true);
-				}
-				setPostpone(pageflow, true);
-			}
-
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		for (int i = 0; i < this.getChildren().size(); i++) {
-			((AbstractEditPart) getChildren().get(i)).refresh();
-		}
-		ConnectionLayer cLayer = (ConnectionLayer) getLayer(CONNECTION_LAYER);
-
-		if (cLayer.getConnectionRouter() == null) {
-			setConnectionRouterStyle(getConnectionRouterStyle());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#refreshChildren()
-	 */
-	protected void refreshChildren() {
-		super.refreshChildren();
-		PageflowAnnotationUtil.validatePageflow(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		getFigure().setFont(f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.ILayerPanePreference#setConnectionRouterStyle(int)
-	 */
-	public void setConnectionRouterStyle(int style) {
-		//TODO does this need to be execed on UI thread only???
-		connectionStyle = style;
-		ConnectionLayer cLayer = (ConnectionLayer) getLayer(CONNECTION_LAYER);
-		if (style == ILayerPanePreference.LINE_ROUTING_MANHATTAN) {
-			FanRouter router = new FanRouter();
-			router.setSeparation(CONNECTION_SEPERATION);
-			router.setNextRouter(new ManhattanConnectionRouter());
-			cLayer.setConnectionRouter(router);
-		} else if (style == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			FanRouter router = new FanRouter();
-			router.setSeparation(CONNECTION_SEPERATION);
-			router.setNextRouter(new BendpointConnectionRouter());
-			cLayer.setConnectionRouter(router);
-		}
-	}
-
-	/**
-	 * get the foreground color from preference
-	 * @return the router style value
-	 * 
-	 */
-	public int getConnectionRouterStyle() {
-		if (this.connectionStyle == -1) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			String connectionStyle_ = store
-					.getString(GEMPreferences.LINE_ROUTING);
-
-			if (GEMPreferences.LINE_ROUTING_MANHATTAN.equals(connectionStyle_)) {
-				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANHATTAN;
-			} else {
-				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANUAL;
-			}
-		}
-		return this.connectionStyle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		getFigure().setForegroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		// getLayer(PRIMARY_LAYER).setOpaque(true);
-		getLayer(PRIMARY_LAYER).setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setGridVisible(boolean)
-	 */
-	public void setGridVisible(boolean bVisible) {
-		GridLayer gl = (GridLayer) getLayer(GRID_LAYER);
-		gl.setVisible(bVisible);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setGridSpacing(org.eclipse.draw2d.geometry.Dimension)
-	 */
-	public void setGridSpacing(Dimension d) {
-		GridLayer gl = (GridLayer) getLayer(GRID_LAYER);
-		gl.setSpacing(d);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.ILayerPanePreference#setGridForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setGridForegroundColor(Color c) {
-		GridLayer gl = (GridLayer) getLayer(GRID_LAYER);
-		gl.setForegroundColor(c);
-	}
-
-    protected void performDirectEdit() {
-        // do nothing
-    }
-
-    protected void performOpen() {
-        // do nothing
-    }
-
-    public void addAnnotation(Annotation annotation) {
-        // do nothing
-        
-    }
-
-    public void removeAnnotation() {
-        // do nothing
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPartsFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPartsFactory.java
deleted file mode 100644
index fe57235..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPartsFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * 
- * Edit part factory to create different pageflow elements.
- * 
- * 
- */
-public class PageflowEditPartsFactory implements EditPartFactory {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPartFactory#createEditPart(EditPart, Object)
-	 */
-	public EditPart createEditPart(EditPart context, Object obj) {
-		if (obj instanceof Pageflow) {
-			return new PageflowEditPart((Pageflow) obj);
-		} else if (obj instanceof PageflowNode) {
-			return new PageflowNodeEditPart((PageflowNode) obj);
-		} else if (obj instanceof PageflowLink) {
-			return new PageflowLinkEditPart((PageflowLink) obj);
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementEditPart.java
deleted file mode 100644
index b897c5e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementEditPart.java
+++ /dev/null
@@ -1,362 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PageflowNodeFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowElementPropertySource;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * 
- * 
- * <code>PageflowElementEditPart</code> is the base class for all the
- * EditParts in the application, whose model is a subclass of PageflowElement.
- * This class maintains the figure's size and location inresponse to changes in
- * the model, and registers as a listener on its model using the
- * <code>org.eclipse.emf.common.notify.Adapter</code> interface
- */
-public abstract class PageflowElementEditPart extends AbstractGraphicalEditPart
-		implements IAnnotationEditPart {
-	/** image description for different edit part */
-	public static final ImageDescriptor IMG_ACTION = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/Pageflow_Action16.gif"); //$NON-NLS-1$
-
-	private Adapter adapter;
-
-	/**
-	 * @return the emf adapter
-	 */
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see AbstractGraphicalEditPart#notifyChanged()
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-				int featureId = notification
-						.getFeatureID(PageflowPackage.class);
-				if (type == Notification.SET) {
-					switch (featureId) {
-					case PageflowPackage.PAGEFLOW_ELEMENT__X:
-					case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-					case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-					case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-						refreshVisuals();
-						break;
-					}
-				}
-			}
-		};
-	}
-
-	private static final ImageDescriptor IMG_PAGE = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/Pageflow_Page.gif"); //$NON-NLS-1$
-
-	private static final ImageDescriptor IMG_NODE = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/FacesConfig_Pageflow16.gif"); //$NON-NLS-1$
-
-	/** property source of the pageflow element */
-	private IPropertySource propertySource = null;
-
-	private Image image = null;
-
-	/**
-	 * @param element
-	 */
-	protected PageflowElementEditPart(PageflowElement element) {
-		setModel(element);
-	}
-
-	/**
-	 * Returns the image for the pageflow element.
-	 * 
-	 * @param element -
-	 *            pageflow element
-	 * @return - the image for the pageflow element.
-	 */
-	public Image getImage(PageflowElement element) {
-		if (image == null) {
-			ImageDescriptor imageDescriptor = null;
-
-			if (element instanceof PageflowPage) {
-				imageDescriptor = IMG_PAGE;
-			} else {
-				imageDescriptor = IMG_NODE;
-			}
-
-			image = EditorPlugin.getDefault().getImageRegistry().get(
-					imageDescriptor.toString());
-			if (null == image) {
-				EditorPlugin.getDefault().getImageRegistry().put(
-						imageDescriptor.toString(), imageDescriptor);
-				image = EditorPlugin.getDefault().getImageRegistry().get(
-						imageDescriptor.toString());
-			}
-		}
-
-		return image;
-	}
-
-	/**
-	 * get the type name of the pageflow element
-	 * 
-	 * @param element -
-	 *            pageflow element
-	 * @return - the type name of the pageflow element
-	 */
-	public static String getTypeName(PageflowElement element) {
-		if (element instanceof Pageflow) {
-			return "Pageflow"; //$NON-NLS-1$
-		} else if (element instanceof PageflowPage) {
-			return "Page"; //$NON-NLS-1$
-		}
-
-		return "[unknown]"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#activate()
-	 */
-	public void activate() {
-		if (isActive()) {
-			return;
-		}
-
-		// start listening for changes in the model
-		hookIntoPageflowElement(getPageflowElement());
-
-		super.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#deactivate()
-	 */
-	public void deactivate() {
-		if (!isActive()) {
-			return;
-		}
-
-		// stop listening for changes in the model
-		unhookFromPageflowElement(getPageflowElement());
-
-		super.deactivate();
-	}
-
-	/**
-	 * Returns the model as pageflow element.
-	 * 
-	 * @return - pageflow element
-	 */
-	public PageflowElement getPageflowElement() {
-		return (PageflowElement) getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		if (getParent() != null) {
-			final AbstractGraphicalEditPart part = this;
-			//ensure that this is executed on the UI thread
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-				refreshVisuals(part);
-			} else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-	
-					public void run() {
-						refreshVisuals(part);
-					}			
-				});
-			}
-		}
-	}
-	
-	private void refreshVisuals(AbstractGraphicalEditPart part) {
-		Point loc = new Point(getPageflowElement().getX(),
-				getPageflowElement().getY());
-		Dimension size = new Dimension(getPageflowElement().getWidth(),
-				getPageflowElement().getHeight());
-		Rectangle r = new Rectangle(loc, size);
-
-		((GraphicalEditPart) getParent()).setLayoutConstraint(part,
-				getFigure(), r);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class key) {
-		/*
-		 * override the default behavior defined in AbstractEditPart which would
-		 * expect the model to be a property sourced. instead the editpart can
-		 * provide a property source
-		 */
-		if (key == IPropertySource.class) {
-			return getPropertySource();
-		}
-		if (key == Adapter.class) {
-			if (adapter == null) {
-				adapter = createEMFAdapter();
-			}
-			return adapter;
-		}
-		return super.getAdapter(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see PageflowElementEditPart#getPropertySource()
-	 */
-	private IPropertySource getPropertySource() {
-		if (propertySource == null) {
-			propertySource = new PageflowElementPropertySource(
-					getPageflowElement());
-		}
-		return propertySource;
-	}
-
-	/**
-	 * Registers this edit part as a listener for change notifications to the
-	 * specified pageflow element.
-	 * 
-	 * @param element
-	 *            the pagelfow element that should be observed for change
-	 *            notifications
-	 */
-	protected void hookIntoPageflowElement(PageflowElement element) {
-		if (null != element) {
-			if (!element.eAdapters().contains(getAdapter(Adapter.class))) {
-				element.eAdapters().add((Adapter) getAdapter(Adapter.class));
-			}
-		}
-	}
-
-	/**
-	 * Removes this edit part from the specified pageflow element. Thus, it will
-	 * no longe receive change notifications.
-	 * 
-	 * @param element
-	 *            the pagelfow element that should not be observed any more
-	 */
-	protected void unhookFromPageflowElement(PageflowElement element) {
-		if (null != element) {
-			element.eAdapters().remove(getAdapter(Adapter.class));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		IFigure figure_ = null;
-		figure_ = new PageflowNodeFigure();
-		PageflowElement elm = getPageflowElement();
-		if (elm.getName() != null) {
-			((PageflowNodeFigure) figure_).setImageText(getImage(elm), elm
-					.getName());
-		} else {
-			((PageflowNodeFigure) figure_).setImageText(getImage(elm),
-					getTypeName(elm));
-		}
-		((PageflowNodeFigure) figure_).update();
-		return figure_;
-	}
-
-	/**
-	 * perform corresponding request related with double click or direct edit
-	 * click.
-	 * 
-	 * @param request :
-	 *            request composed by mouse click.
-	 */
-	public void performRequest(Request request) {
-		// the request is triggered by double clicked on a edit part
-		if (request.getType() == RequestConstants.REQ_OPEN) {
-			performOpen();
-		} else if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) {
-			performDirectEdit();
-		}
-	}
-
-	/**
-	 * perfrom direct edit request
-	 * 
-	 */
-	protected abstract void performDirectEdit();
-
-	/**
-	 * perform double click request
-	 * 
-	 */
-	protected abstract void performOpen();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#decorateEditPart()
-	 */
-	public abstract void addAnnotation(Annotation annotation);
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#undecorateEditPart()
-	 */
-	public abstract void removeAnnotation();
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.marker.IEditPartMarker#getMarkerResource()
-	 */
-	public IResource getMarkerResource() {
-		IResource resource = WebrootUtil.getResource((EObject) getModel());
-		return resource;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementTreeEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementTreeEditPart.java
deleted file mode 100644
index 9336e11..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementTreeEditPart.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.gef.editparts.AbstractTreeEditPart;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowElementPropertySource;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * This is the abstract base <code>TreeEditPart</code> for pageflow elements.
- */
-public class PageflowElementTreeEditPart extends AbstractTreeEditPart implements
-		Adapter {
-	/** Image descriptor of tree item for the different edit parts */
-	private static final ImageDescriptor IMG_PAGE = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/Pageflow_Page16.gif"); //$NON-NLS-1$
-
-	private static final ImageDescriptor IMG_NODE = EditorPlugin.getDefault()
-			.getImageDescriptor("facesconfig/FacesConfig_Pageflow16.gif"); //$NON-NLS-1$
-
-	/** Property resource for shared property view */
-	private IPropertySource propertySource = null;
-
-	/** notifer to pageflow element */
-	private Notifier target = null;
-
-	/**
-	 * Returns the image for the pageflow element.
-	 * 
-	 * @param element -
-	 *            pageflow element, such as Begin, End, Page, and Action.
-	 * @return - the image for the pageflow element
-	 */
-	public static Image getImage(PageflowElement element) {
-		ImageDescriptor imageDescriptor = null;
-
-		if (element instanceof PageflowPage) {
-			imageDescriptor = IMG_PAGE;
-		} else {
-			imageDescriptor = IMG_NODE;
-		}
-
-		if (null == imageDescriptor) {
-			return null;
-		}
-
-		Image image = EditorPlugin.getDefault().getImageRegistry().get(
-				imageDescriptor.toString());
-		if (null == image) {
-			EditorPlugin.getDefault().getImageRegistry().put(
-					imageDescriptor.toString(), imageDescriptor);
-			image = EditorPlugin.getDefault().getImageRegistry().get(
-					imageDescriptor.toString());
-		}
-
-		return image;
-	}
-
-	/**
-	 * Creates a new PageflowElementTreeEditPart instance.
-	 * 
-	 * @param pageflowElement -
-	 *            create a new edit part according to the pageflow model
-	 */
-	public PageflowElementTreeEditPart(PageflowElement pageflowElement) {
-		super(pageflowElement);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class key) {
-		/*
-		 * override the default behavior defined in AbstractEditPart which would
-		 * expect the model to be a property sourced. instead the editpart can
-		 * provide a property source
-		 */
-		if (key == IPropertySource.class) {
-			return getPropertySource();
-		}
-		return super.getAdapter(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTreeEditPart#getImage()
-	 */
-	protected Image getImage() {
-		return getImage(getPageflowElement());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see PageflowElementEditPart#getPropertySource()
-	 */
-	private IPropertySource getPropertySource() {
-		if (propertySource == null) {
-			propertySource = new PageflowElementPropertySource(
-					getPageflowElement());
-		}
-		return propertySource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#getTarget()
-	 */
-	public Notifier getTarget() {
-		return target;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractTreeEditPart#getText()
-	 */
-	protected String getText() {
-		return (null != getPageflowElement().getName() ? getPageflowElement()
-				.getName() : "[unnamed]"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the model as <code>PageflowElement</code>.
-	 * 
-	 * @return - the model as <code>PageflowElement</code>
-	 */
-	public PageflowElement getPageflowElement() {
-		return (PageflowElement) getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#isAdapterForType(Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type.equals(getModel().getClass());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#notifyChanged(Notification)
-	 */
-	public void notifyChanged(Notification notification) {
-		int type = notification.getEventType();
-
-		switch (type) {
-		case Notification.ADD:
-		case Notification.ADD_MANY:
-		case Notification.REMOVE:
-		case Notification.REMOVE_MANY:
-		case Notification.SET:
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-				refreshVisuals();
-			} else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-					public void run() {
-						refreshVisuals();
-					}
-				});
-			}
-			break;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Adapter#setTarget(Notifier)
-	 */
-	public void setTarget(Notifier newTarget) {
-		target = newTarget;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#activate()
-	 */
-	public void activate() {
-		if (isActive())
-			return;
-
-		// start listening for changes in the model
-		hookIntoPageflowElement(getPageflowElement());
-
-		super.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#deactivate()
-	 */
-	public void deactivate() {
-		if (!isActive())
-			return;
-
-		// stop listening for changes in the model
-		unhookFromPageflowElement(getPageflowElement());
-
-		super.deactivate();
-	}
-
-	/**
-	 * Registers this edit part as a listener for change notifications to the
-	 * specified pageflow element.
-	 * 
-	 * @param element -
-	 *            the pagelfow element that should be observed for change
-	 *            notifications
-	 */
-	protected void hookIntoPageflowElement(PageflowElement element) {
-		if (null != element) {
-			element.eAdapters().add(this);
-		}
-	}
-
-	/**
-	 * Removes this edit part from the specified pageflow element. Thus, it will
-	 * no longe receive change notifications.
-	 * 
-	 * @param element
-	 *            -the pagelfow element that should not be observed
-	 */
-	protected void unhookFromPageflowElement(PageflowElement element) {
-		if (null != element) {
-			element.eAdapters().remove(this);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java
deleted file mode 100644
index f1bc513..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java
+++ /dev/null
@@ -1,491 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RelativeBendpoint;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.editparts.AbstractConnectionEditPart;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkBendpointEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PFLinkEndpointEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PFLinkFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PageflowLinkPropertySource;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * <code>PFLinkEditPart</code> is the EditPart for PFLink model elements. The
- * figure for this EditPart is simply a PolylineConnection. Because both
- * AbstractConnectionEditPart and the Adapter interface have a getTarget method,
- * we use an inner class to implement the Adapter interface in order to work
- * around the name collision.
- * 
- * 
- */
-public class PageflowLinkEditPart extends AbstractConnectionEditPart implements
-		IConnectionPreference, IAnnotationEditPart, PFValidator {
-	private static final String PAGEFLOW_ERROR_IMAGE_FILE = "facesconfig/Pageflow_Quickfix_Error.gif"; //$NON-NLS-1$
-
-	/** adapter for notification */
-	private PFLinkAdapter adapter = new PFLinkAdapter();
-
-	/** property source of the pflink */
-	private IPropertySource propertySource = null;
-
-	/** image description for different edit part */
-	public static final ImageDescriptor IMG_WARNING = EditorPlugin.getDefault()
-			.getImageDescriptor(PAGEFLOW_ERROR_IMAGE_FILE);
-
-	private int connectionStyle = -1;
-
-	private PFLinkBendpointEditPolicy bendpointEditPolicy;
-
-	/**
-	 * @param element
-	 */
-	public PageflowLinkEditPart(PageflowLink element) {
-		super();
-		// element.getPageflow()
-		setModel(element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		IFigure figure_ = new PFLinkFigure();
-		return figure_;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.CONNECTION_ENDPOINTS_ROLE,
-				new PFLinkEndpointEditPolicy());
-
-		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
-					getBendpointEditPolicy());
-		}
-		//PFLinkEditPolicy policy = new PFLinkEditPolicy();
-		// policy.setSseModel(model);
-		installEditPolicy(EditPolicy.CONNECTION_ROLE, new PFLinkEditPolicy());
-
-	}
-
-	private PFLinkBendpointEditPolicy getBendpointEditPolicy() {
-		if (bendpointEditPolicy == null) {
-			bendpointEditPolicy = new PFLinkBendpointEditPolicy();
-		}
-		return bendpointEditPolicy;
-	}
-
-	private PageflowLink getPFLink() {
-		return (PageflowLink) getModel();
-	}
-
-	private class PFLinkAdapter extends PFBatchAdapter {
-		private Notifier _newTarget = null;
-
-		// private IPropertySource _propertySource = null;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#getTarget()
-		 */
-		public Notifier getTarget() {
-			return _newTarget;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
-		 */
-		public boolean isAdapterForType(Object type) {
-			return getModel().getClass() == type;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void doNotifyChanged(Notification notification) {
-			int type = notification.getEventType();
-			int featureId = notification.getFeatureID(PageflowPackage.class);
-			// FC2PFTransformer.getInstance().NotifyChanged(notification,
-			// getPFLink());
-			switch (type) {
-			case Notification.ADD:
-			case Notification.ADD_MANY:
-			case Notification.REMOVE:
-			case Notification.SET:
-				if (featureId == PageflowPackage.PF_LINK__OUTCOME
-						|| featureId == PageflowPackage.PF_LINK__SOURCE
-						|| featureId == PageflowPackage.PF_LINK__TARGET) {
-					PageflowAnnotationUtil
-							.validateLink(PageflowLinkEditPart.this);
-				}
-				
-				refreshVisualsOnUIThread();
-				break;
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.Adapter#setTarget(org.eclipse.emf.common.notify.Notifier)
-		 */
-		public void setTarget(Notifier newTarget) {
-			this._newTarget = newTarget;
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPart#activate()
-	 */
-	public void activate() {
-		getPFLink().eAdapters().add(adapter);
-		//PageflowLink element = (PageflowLink) getModel();
-		super.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPart#deactivate()
-	 */
-	public void deactivate() {
-		// getPFLink().eAdapters().remove(adapter);
-		// PageflowLink element = (PageflowLink) getModel();
-		// NavigationCaseType navCase = ((NavigationCaseType) element
-		// .getFCElements().getData().get(0));
-		// navCase.eAdapters().remove(fcAdapter);
-		// TreeIterator iterator = navCase.eAllContents();
-		// while (iterator.hasNext()) {
-		// ((EObject) iterator.next()).eAdapters().remove(fcAdapter);
-		// }
-
-		super.deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		/*
-		 * override the default behavior defined in AbstractEditPart which would
-		 * expect the model to be a property sourced. instead the editpart can
-		 * provide a property source
-		 */
-		if (key == IPropertySource.class) {
-			return getPropertySource();
-		}
-		return super.getAdapter(key);
-	}
-
-	private IPropertySource getPropertySource() {
-		if (propertySource == null) {
-			propertySource = new PageflowLinkPropertySource(getPFLink());
-		}
-		return propertySource;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-		resetLabel();
-		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			refreshBendpoints();
-		}
-	}
-	
-	private void refreshVisualsOnUIThread() {
-		if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-			refreshVisuals();
-		} else {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-				public void run() {
-					refreshVisuals();
-				}			
-			});
-		}
-	}
-	
-	/**
-	 * set the bendpoint constraints of the pflink connection
-	 * 
-	 */
-	protected void refreshBendpoints() {
-		// bendpoints stored in pflink
-		List modelConstraint = getPFLink().getBendPoints();
-		// bendpoint constraint list
-		List figureConstraint = new ArrayList();
-		for (int i = 0; i < modelConstraint.size(); i++) {
-			PageflowLinkBendpoint wbp = (PageflowLinkBendpoint) modelConstraint
-					.get(i);
-			RelativeBendpoint rbp = new RelativeBendpoint(getConnectionFigure());
-			rbp.setRelativeDimensions(wbp.getFirstRelativeDimension(), wbp
-					.getSecondRelativeDimension());
-			rbp.setWeight((i + 1) / ((float) modelConstraint.size() + 1));
-			figureConstraint.add(rbp);
-		}
-		// set the router constaints.
-		getConnectionFigure().setRoutingConstraint(figureConstraint);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLineWidth(int)
-	 */
-	public void setLineWidth(int w) {
-		((PFLinkFigure) getFigure()).setLineWidth(w);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelVisible(boolean)
-	 */
-	public void setLabelVisible(boolean b) {
-		((PFLinkFigure) getFigure()).setLabelVisible(b);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setForegroundColor(c);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		((PFLinkFigure) getFigure()).setFont(f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelForeground(org.eclipse.swt.graphics.Color)
-	 */
-	public void setLabelForegroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setLabelForegroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setLabelBackground(org.eclipse.swt.graphics.Color)
-	 */
-	public void setLabelBackgroundColor(Color c) {
-		((PFLinkFigure) getFigure()).setLabelBackgroundColor(c);
-	}
-
-	private boolean needDrawingLabel() {
-		return (((PageflowLink) getModel()).getOutcome() != null && ((PageflowLink) getModel())
-				.getOutcome().trim().length() > 0);
-	}
-
-	private boolean needDrawingAction() {
-		return (((PageflowLink) getModel()).getFromaction() != null && ((PageflowLink) getModel())
-				.getFromaction().trim().length() > 0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#decorateEditPart()
-	 */
-	public void addAnnotation(final Annotation annotation) {
-		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				((PFLinkFigure) getFigure()).setImage(getImage(IMG_WARNING));
-				((PFLinkFigure) getFigure()).setToolTipText(annotation
-						.getText());
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#undecorateEditPart()
-	 */
-	public void removeAnnotation() {
-		if (Thread.currentThread() == getViewer().getControl().getDisplay().getThread()) {
-			((PFLinkFigure) getFigure()).clearIcon();
-			resetLabel();
-		} else {
-			getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					((PFLinkFigure) getFigure()).clearIcon();
-					resetLabel();
-				}
-			});
-		}
-	}
-
-	private void resetLabel() {
-		StringBuffer tip = new StringBuffer();
-		if (needDrawingAction()) {
-			((PFLinkFigure) getFigure()).setActionImage();
-			tip.append(PageflowMessages.PageflowLinkEditPart_FromAction).append(
-					((PageflowLink) getModel()).getFromaction());
-		} else if (((PFLinkFigure) getFigure()).getImage() != getImage(IMG_WARNING)) {
-			((PFLinkFigure) getFigure()).clearIcon();
-		}
-		if (needDrawingLabel()) {
-			((PFLinkFigure) getFigure()).setLabel(((PageflowLink) getModel())
-					.getOutcome());
-			if (tip.length() > 0)
-				tip.append("\n"); //$NON-NLS-1$
-			tip.append(PageflowMessages.PageflowLinkEditPart_FromOutcome).append(
-					((PageflowLink) getModel()).getOutcome());
-		} else {
-			((PFLinkFigure) getFigure()).clearOutcome();
-		}
-		((PFLinkFigure) getFigure()).setToolTipText(tip.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.marker.IEditPartMarker#getMarkerResource()
-	 * 
-	 */
-	public IResource getMarkerResource() {
-		// IResource resource = null;
-		// if (getModel() instanceof PFLink)
-		// {
-		// resource =
-		// FacesConfigUtil.getFacesConfigResource(((PFLink)getModel()).getPageflow());
-		// }
-		// FIXME: it should be changed to link to faces-config file.
-		IResource resource = WebrootUtil.getResource((EObject) getModel());
-		return resource;
-	}
-
-	private static Image getImage(ImageDescriptor imageDescriptor) {
-		Image image = EditorPlugin.getDefault().getImageRegistry().get(
-				imageDescriptor.toString());
-		if (null == image) {
-			EditorPlugin.getDefault().getImageRegistry().put(
-					imageDescriptor.toString(), imageDescriptor);
-			image = EditorPlugin.getDefault().getImageRegistry().get(
-					imageDescriptor.toString());
-		}
-
-		return image;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IConnectionPreference#setConnectionRouterStyle(int)
-	 */
-	public void setConnectionRouterStyle(int style) {
-		connectionStyle = style;
-		if (getConnectionRouterStyle() == ILayerPanePreference.LINE_ROUTING_MANUAL) {
-			installEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE,
-					getBendpointEditPolicy());
-			refreshVisuals();
-		} else {
-			removeEditPolicy(EditPolicy.CONNECTION_BENDPOINTS_ROLE);
-			refreshVisuals();
-		}
-
-	}
-
-	/**
-	 * get the foreground color from preference
-	 * 
-	 */
-	private int getConnectionRouterStyle() {
-		if (this.connectionStyle == -1) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			String connectionStyle_ = store
-					.getString(GEMPreferences.LINE_ROUTING);
-
-			if (GEMPreferences.LINE_ROUTING_MANHATTAN.equals(connectionStyle_)) {
-				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANHATTAN;
-			} else {
-				this.connectionStyle = ILayerPanePreference.LINE_ROUTING_MANUAL;
-			}
-		}
-		return this.connectionStyle;
-	}
-
-	public void validate() {
-		PageflowAnnotationUtil.validateLink(this);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowNodeEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowNodeEditPart.java
deleted file mode 100644
index 8eac668..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowNodeEditPart.java
+++ /dev/null
@@ -1,502 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.NodeEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.tools.DirectEditManager;
-import org.eclipse.jdt.ui.JavaElementImageDescriptor;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.OpenEditorCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowElementEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowNodeDirectEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy.PageflowNodeEditPolicy;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.ILabelDecorator;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PageflowNodeFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.PFBatchAdapter;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowAnnotationUtil;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * The base class for the applications EditParts that represent
- * PageflowNode-derived objects in the model. This class implements the
- * NodeEditPart interface which supports:
- * <ul>
- * <li>feedback for Connections when they are being
- * <li>
- * <li>initially connected and when they are disonnected/reconnected</li>
- * </ul>
- * 
- * 
- */
-public class PageflowNodeEditPart extends PageflowElementEditPart implements
-		NodeEditPart, INodePreference, PFValidator {
-
-	/** property source of pageflow node */
-	// private IPropertySource propertySource = null;
-	protected DirectEditManager editManager;
-
-	private class ImageDecorator implements ILabelDecorator {
-		private Image decrateImage = null;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.sybase.stf.jmt.editors.pageflow.figures.ILabelDecorator#decorateImage(org.eclipse.swt.graphics.Image,
-		 *      java.lang.Object)
-		 */
-		public Image decorateImage(Image image, Object element) {
-			dispose();
-			int adornmentFlags = computeAdornmentFlags(element);
-			if (adornmentFlags != 0) {
-				ImageDescriptor baseImage = ImageDescriptor.createFromImage(image);
-				org.eclipse.swt.graphics.Rectangle bounds = image.getBounds();
-				decrateImage = (new JavaElementImageDescriptor(baseImage,
-						adornmentFlags, new org.eclipse.swt.graphics.Point(
-								bounds.width, bounds.height))).createImage();
-				return decrateImage;
-			}
-			return image;
-		}
-
-		/**
-		 * Computes adornment flags for specified object.
-		 * 
-		 * Note: This method is for internal use only. Clients should not call
-		 * this method.
-		 * 
-		 * @param obj Object to complute flags for.
-		 * @return Adornment flags.
-		 */
-		protected int computeAdornmentFlags(Object obj) {
-			return JavaElementImageDescriptor.WARNING;
-		}
-
-		/**
-		 * Disposes this instance.
-		 */
-		public void dispose() {
-			if (decrateImage != null) {
-				decrateImage.dispose();
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see com.sybase.stf.jmt.editors.pageflow.figures.ILabelDecorator#decorateText(java.lang.String,
-		 *      java.lang.Object)
-		 */
-		public String decorateText(String text, Object element) {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-	}
-
-	/**
-	 * Disposes this instance.
-	 */
-	public void dispose() {
-		if (imageDecorator != null) {
-			imageDecorator.dispose();
-		}
-	}
-
-	private ImageDecorator imageDecorator = null;
-
-	/**
-	 * Creates a new PageflowNodeEditPart instance.
-	 * 
-	 * @param element -
-	 *            pageflow node
-	 */
-	public PageflowNodeEditPart(PageflowNode element) {
-		super(element);
-	}
-
-	/**
-	 * get the pageflow node
-	 * 
-	 * @return - pageflow node
-	 */
-	public PageflowNode getPageflowNode() {
-		return (PageflowNode) getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#getModelSourceConnections()
-	 */
-	protected List getModelSourceConnections() {
-		return getPageflowNode().getOutlinks();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractGraphicalEditPart#getModelTargetConnections()
-	 */
-	protected List getModelTargetConnections() {
-		return getPageflowNode().getInlinks();
-	}
-
-	/**
-	 * Returns the Figure of this, as a node type figure.
-	 * 
-	 * @return - Figure as a NodeFigure.
-	 */
-	protected PageflowNodeFigure getPageflowNodeFigure() {
-		return (PageflowNodeFigure) getFigure();
-	}
-
-	public Adapter createEMFAdapter() {
-		return new PFBatchAdapter() {
-			/**
-			 * when ports are added to a PageflowNode, add this EditPart as a
-			 * listener on the port so that it gets notified of PFLinks being
-			 * added or removed. When links are added or removed from a port
-			 * owned by the PageflowNode of this EditPart, refresh the
-			 * connections.
-			 */
-			public void doNotifyChanged(Notification notification) {
-				int type = notification.getEventType();
-				// FC2PFTransformer.getInstance().NotifyChanged(notification,
-				// (PageflowElement) getModel());
-				switch (type) {
-				case Notification.ADD:
-				case Notification.ADD_MANY:
-				case Notification.REMOVE:
-				case Notification.REMOVE_MANY:
-					if (notification.getNewValue() instanceof PageflowLink) {
-						if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-							refreshTargetConnections();
-							refreshSourceConnections();
-							validate();
-						} else {
-							PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-								public void run() {
-									refreshTargetConnections();
-									refreshSourceConnections();
-									validate();
-								}
-							});
-						}
-					}
-					break;
-
-				case Notification.SET:
-					int featureId = notification
-							.getFeatureID(PageflowPackage.class);
-					if (needValidation(featureId)) {
-						validate();
-					}
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshVisuals();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable(){
-							public void run() {
-								refreshVisuals();
-							}
-						});
-					}
-					break;
-				}
-			}
-		};
-	}
-
-	private boolean needValidation(int featureId) {
-		if (getModel() instanceof PageflowPage) {
-			if (featureId == PageflowPackage.PF_PAGE__PATH) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public void validate() {
-		if (getModel() instanceof PageflowPage) {
-			PageflowAnnotationUtil.validatePage(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		// install the edit policy to handle connection creation
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
-				new PageflowNodeEditPolicy());
-
-		installEditPolicy(EditPolicy.COMPONENT_ROLE,
-				new PageflowElementEditPolicy());
-
-		// install the direct policy
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE,
-				new PageflowNodeDirectEditPolicy());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getSourceConnectionAnchor(ConnectionEditPart)
-	 */
-	public ConnectionAnchor getSourceConnectionAnchor(
-			ConnectionEditPart connection) {
-		PageflowLink link = (PageflowLink) connection.getModel();
-		return getPageflowNodeFigure().getSourceConnectionAnchorAt(
-				new Point(link.getSource().getX(), link.getSource().getY()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getSourceConnectionAnchor(Request)
-	 */
-	public ConnectionAnchor getSourceConnectionAnchor(Request request) {
-		Point pt = new Point(((DropRequest) request).getLocation());
-		return getPageflowNodeFigure().getSourceConnectionAnchorAt(pt);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getTargetConnectionAnchor(ConnectionEditPart)
-	 */
-	public ConnectionAnchor getTargetConnectionAnchor(
-			ConnectionEditPart connection) {
-		PageflowLink link = (PageflowLink) connection.getModel();
-		return getPageflowNodeFigure().getTargetConnectionAnchorAt(
-				new Point(link.getTarget().getX(), link.getTarget().getY()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see NodeEditPart#getTargetConnectionAnchor(Request)
-	 */
-	public ConnectionAnchor getTargetConnectionAnchor(Request request) {
-		Point pt = new Point(((DropRequest) request).getLocation());
-		return getPageflowNodeFigure().getTargetConnectionAnchorAt(pt);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#refreshVisuals()
-	 */
-	protected void refreshVisuals() {
-		super.refreshVisuals();
-
-		getPageflowNodeFigure().setText(getPageflowNode().getName());
-	}
-
-	/**
-	 * make this a listener on its ports
-	 */
-	public void activate() {
-		super.activate();
-
-		Iterator it;
-
-		it = getPageflowNode().getInlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			hookIntoPageflowElement(link);
-		}
-
-		it = getPageflowNode().getOutlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			hookIntoPageflowElement(link);
-		}
-	}
-
-	/**
-	 * remove this as a listener on its ports
-	 */
-	public void deactivate() {
-		super.deactivate();
-		dispose();
-		Iterator it;
-
-		it = getPageflowNode().getInlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			unhookFromPageflowElement(link);
-		}
-
-		it = getPageflowNode().getOutlinks().iterator();
-		while (it.hasNext()) {
-			PageflowLink link = (PageflowLink) it.next();
-
-			unhookFromPageflowElement(link);
-		}
-	}
-
-	/**
-	 * perfrom direct edit request
-	 * 
-	 */
-	protected void performDirectEdit() {
-		if (editManager == null) {
-			Label l = ((PageflowNodeFigure) getFigure()).getLabel();
-			editManager = new PageflowDirectEditManager(this,
-					TextCellEditor.class, new DirectEditCellEditorLocator(l), l);
-		}
-		editManager.show();
-	}
-
-	/**
-	 * perform double click request
-	 * 
-	 */
-	protected void performOpen() {
-		// only Page and Action support the double-click commands
-		if (getModel() instanceof PageflowPage) {
-			// CommandStack stack =
-			// getViewer().getEditDomain().getCommandStack();
-			Command command = new OpenEditorCommand(this);
-			if (command != null && command.canExecute()) {
-				// stack.execute(command);
-				command.execute();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setForegroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setForegroundColor(Color c) {
-		getPageflowNodeFigure().setForegroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setBackgroundColor(org.eclipse.swt.graphics.Color)
-	 */
-	public void setBackgroundColor(Color c) {
-		getPageflowNodeFigure().setBackgroundColor(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IFigurePreference#setFont(org.eclipse.swt.graphics.Font)
-	 */
-	public void setFont(Font f) {
-		getPageflowNodeFigure().setFont(f);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.INodePreference#setTextPlacement(int)
-	 */
-	public void setTextPlacement(int where) {
-		getPageflowNodeFigure().setTextPlacement(where);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#decorateEditPart()
-	 */
-	public void addAnnotation(final Annotation annotation) {
-		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-			/* (non-Javadoc)
-			 * @see java.lang.Runnable#run()
-			 */
-			public void run() {
-				getPageflowNodeFigure().setImage(
-						getDecoratedImage((PageflowElement) getModel()));
-				getPageflowNodeFigure().setToolTipText(annotation.getText());
-			}
-
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.editparts.IEditPartDecorator#undecorateEditPart()
-	 */
-	public void removeAnnotation() {
-		getViewer().getControl().getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				getPageflowNodeFigure().setImage(
-						getImage((PageflowElement) getModel()));
-				getPageflowNodeFigure().setToolTipText(null);
-			}
-
-		});
-	}
-
-	/**
-	 * Returns the image for the pageflow element.
-	 * 
-	 * @param element -
-	 *            pageflow element
-	 * @return - the image for the pageflow element.
-	 */
-	private Image getDecoratedImage(PageflowElement element) {
-		Image decoratedImage = getImage(element);
-
-		decoratedImage = getImageDecorator().decorateImage(getImage(element),
-				null);
-
-		return decoratedImage;
-	}
-
-	private ImageDecorator getImageDecorator() {
-		if (imageDecorator == null) {
-			imageDecorator = new ImageDecorator();
-		}
-		return imageDecorator;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreeEditPart.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreeEditPart.java
deleted file mode 100644
index 34976d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreeEditPart.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-
-/**
- * The <code>TreeEditPart</code> implementation for a pageflow.
- * 
- * 
- */
-/*package*/ class PageflowTreeEditPart extends PageflowElementTreeEditPart {
-
-	/**
-	 * Creates a new PageflowTreeEditPart instance.
-	 * 
-	 * @param pageflow
-	 */
-	public PageflowTreeEditPart(Pageflow pageflow) {
-		super(pageflow);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List children_ = getPageflow().getNodes();
-
-		return new ArrayList(children_);
-	}
-
-	/**
-	 * Returns the model as <code>Pageflow</code>.
-	 * 
-	 * @return the model as <code>Pageflow</code>
-	 */
-	public Pageflow getPageflow() {
-		return (Pageflow) getModel();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreePartFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreePartFactory.java
deleted file mode 100644
index 940113a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowTreePartFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-
-/**
- * Edit Part Factory for creation pageflow tree parts
- *
- */
-public class PageflowTreePartFactory implements EditPartFactory {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see EditPartFactory#createEditPart()
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-
-		if (model instanceof Pageflow) {
-			return new PageflowTreeEditPart((Pageflow) model);
-
-		} else if (model instanceof PageflowElement) {
-			return new PageflowElementTreeEditPart((PageflowElement) model);
-		}
-
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkBendpointEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkBendpointEditPolicy.java
deleted file mode 100644
index 4dabafb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkBendpointEditPolicy.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.draw2d.Connection;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.BendpointEditPolicy;
-import org.eclipse.gef.requests.BendpointRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.CreateBendpointCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.DeleteBendpointCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.MoveBendpointCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-
-/**
- * Customize the bendpoint edit policy fro pageflow link connections
- *
- */
-public class PFLinkBendpointEditPolicy extends BendpointEditPolicy {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.BendpointEditPolicy#getCreateBendpointCommand(org.eclipse.gef.requests.BendpointRequest)
-	 */
-	protected Command getCreateBendpointCommand(BendpointRequest request) {
-		CreateBendpointCommand createCmd = new CreateBendpointCommand();
-		Point p = request.getLocation();
-		Connection conn = getConnection();
-
-		conn.translateToRelative(p);
-
-		createCmd.setLocation(p);
-		Point ref1 = getConnection().getSourceAnchor().getReferencePoint();
-		Point ref2 = getConnection().getTargetAnchor().getReferencePoint();
-
-		conn.translateToRelative(ref1);
-		conn.translateToRelative(ref2);
-
-		createCmd.setRelativeDimensions(p.getDifference(ref1), p
-				.getDifference(ref2));
-		createCmd.setPFLink((PageflowLink) request.getSource().getModel());
-		createCmd.setIndex(request.getIndex());
-		return createCmd;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.BendpointEditPolicy#getDeleteBendpointCommand(org.eclipse.gef.requests.BendpointRequest)
-	 */
-	protected Command getDeleteBendpointCommand(BendpointRequest request) {
-		DeleteBendpointCommand deleteCom = new DeleteBendpointCommand();
-		Point p = request.getLocation();
-		deleteCom.setLocation(p);
-		deleteCom.setPFLink((PageflowLink) request.getSource().getModel());
-		deleteCom.setIndex(request.getIndex());
-		return deleteCom;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.BendpointEditPolicy#getMoveBendpointCommand(org.eclipse.gef.requests.BendpointRequest)
-	 */
-	protected Command getMoveBendpointCommand(BendpointRequest request) {
-		MoveBendpointCommand moveCmd = new MoveBendpointCommand();
-		Point p = request.getLocation();
-		Connection conn = getConnection();
-
-		conn.translateToRelative(p);
-
-		moveCmd.setLocation(p);
-
-		Point ref1 = getConnection().getSourceAnchor().getReferencePoint();
-		Point ref2 = getConnection().getTargetAnchor().getReferencePoint();
-
-		conn.translateToRelative(ref1);
-		conn.translateToRelative(ref2);
-
-		moveCmd.setRelativeDimensions(p.getDifference(ref1), p
-				.getDifference(ref2));
-		moveCmd.setPFLink((PageflowLink) request.getSource().getModel());
-		moveCmd.setIndex(request.getIndex());
-		return moveCmd;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEditPolicy.java
deleted file mode 100644
index d25b227..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEditPolicy.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ConnectionEditPolicy;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.ConnectionCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.DeleteConnectionCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-
-/**
- * Customize the connection edit policy for pageflow links
- *
- */
-public class PFLinkEditPolicy extends ConnectionEditPolicy {
-
-	/**
-	 * Default constructor
-	 */
-	public PFLinkEditPolicy() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ConnectionEditPolicy#getDeleteCommand
-	 */
-	protected Command getDeleteCommand(GroupRequest request) {
-		ConnectionCommand c = new DeleteConnectionCommand();
-		c.setPFLink((PageflowLink) getHost().getModel());
-		return c;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEndpointEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEndpointEditPolicy.java
deleted file mode 100644
index 59875db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PFLinkEndpointEditPolicy.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-
-/**
- * Customize the endpoint edit policy for pageflow links
- *
- */
-public class PFLinkEndpointEditPolicy extends ConnectionEndpointEditPolicy {
-	/**
-	 * 
-	 */
-	public PFLinkEndpointEditPolicy() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ConnectionEndpointEditPolicy#addSelectionHandles
-	 */
-	protected void addSelectionHandles() {
-		super.addSelectionHandles();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		int connectionWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-		getConnectionFigure().setLineWidth(connectionWidth + 1);
-	}
-
-	private PolylineConnection getConnectionFigure() {
-		return (PolylineConnection) ((GraphicalEditPart) getHost()).getFigure();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ConnectionEndpointEditPolicy#removeSelectionHandles
-	 */
-	protected void removeSelectionHandles() {
-		super.removeSelectionHandles();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		int connectionWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-		getConnectionFigure().setLineWidth(connectionWidth);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowContainerEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowContainerEditPolicy.java
deleted file mode 100644
index f392f25..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowContainerEditPolicy.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.CompoundCommand;
-import org.eclipse.gef.editpolicies.ContainerEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.OrphanChildCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * Customize the container policy for page flow containers
- *
- */
-public class PageflowContainerEditPolicy extends ContainerEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ContainerEditPolicy#getCreateCommand()
-	 */
-	protected Command getCreateCommand(CreateRequest request) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ContainerEditPolicy#getOrphanChildrenCommand()
-	 */
-	public Command getOrphanChildrenCommand(GroupRequest request) {
-		List parts = request.getEditParts();
-		CompoundCommand result = new CompoundCommand("orphanchildcommand"); //$NON-NLS-1$
-		for (int i = 0; i < parts.size(); i++) {
-			OrphanChildCommand orphan = new OrphanChildCommand();
-			orphan
-					.setChild((PageflowNode) ((EditPart) parts.get(i))
-							.getModel());
-			orphan.setParent((Pageflow) getHost().getModel());
-			orphan.setLabel(PageflowMessages.PageflowContainerEditPolicy_OrphanLabel);
-			result.add(orphan);
-		}
-		return result.unwrap();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowElementEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowElementEditPolicy.java
deleted file mode 100644
index 04e86db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowElementEditPolicy.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.DeleteNodeCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * Customize component edit policies for page flows
- *
- */
-public class PageflowElementEditPolicy extends
-		org.eclipse.gef.editpolicies.ComponentEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ComponentEditPolicy#createDeleteCommand()
-	 */
-	protected Command createDeleteCommand(GroupRequest request) {
-		Object parent = getHost().getParent().getModel();
-		DeleteNodeCommand deleteCmd = new DeleteNodeCommand((Pageflow) parent);
-		deleteCmd.setParent((Pageflow) parent);
-		deleteCmd.setChild((PageflowNode) getHost().getModel());
-		return deleteCmd;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeDirectEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeDirectEditPolicy.java
deleted file mode 100644
index c89d648..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeDirectEditPolicy.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.DirectEditPolicy;
-import org.eclipse.gef.requests.DirectEditRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.RenameNodeCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * EditPolicy for the direct editing of pageflow node's name.
- * 
- * @author Xiaoguang Zhang
- */
-public class PageflowNodeDirectEditPolicy extends DirectEditPolicy {
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see DirectEditPolicy#getDirectEditCommand(DirectEditRequest)
-	 */
-	protected Command getDirectEditCommand(DirectEditRequest request) {
-		RenameNodeCommand cmd = new RenameNodeCommand();
-		cmd.setSource((PageflowNode) getHost().getModel());
-		cmd.setOldName(((PageflowNode) getHost().getModel()).getName());
-		cmd.setName((String) request.getCellEditor().getValue());
-		return cmd;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see DirectEditPolicy#showCurrentEditValue(DirectEditRequest)
-	 */
-	protected void showCurrentEditValue(DirectEditRequest request) {
-		// String value = (String)request.getCellEditor().getValue();
-		// ((PageflowNodeFigure)getHostFigure()).setText(value);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeEditPolicy.java
deleted file mode 100644
index 192d818..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeEditPolicy.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Connection;
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy;
-import org.eclipse.gef.requests.CreateConnectionRequest;
-import org.eclipse.gef.requests.ReconnectRequest;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.action.OpenEditorAction;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.ConnectionCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.ConnectionCommandFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.OpenEditorCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure.PageflowNodeFigure;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-
-/**
- * Customizes conntection policies
- *
- */
-public class PageflowNodeEditPolicy extends GraphicalNodeEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#createDummyConnection()
-	 */
-	protected Connection createDummyConnection(Request req) {
-		PolylineConnection conn = new PolylineConnection();
-		conn.setLineWidth(getLineWidth());
-		conn.setForegroundColor(ColorConstants.black);
-
-		return conn;
-	}
-
-	/**
-	 * get the connection line width from preference.
-	 */
-	private int getLineWidth() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		int lineWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-		return lineWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#getConnectionCompleteCommand()
-	 */
-	protected Command getConnectionCompleteCommand(
-			CreateConnectionRequest request) {
-		ConnectionCommand command = (ConnectionCommand) request
-				.getStartCommand();
-		// ConnectionAnchor anchor =
-		// getPageflowNodeEditPart().getTargetConnectionAnchor(request);
-
-		command.setTarget(getPageflowNode());
-
-		return command;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#getConnectionCreateCommand()
-	 */
-	protected Command getConnectionCreateCommand(CreateConnectionRequest request) {
-		ConnectionCommand command = ConnectionCommandFactory
-				.createCommand(request);
-		command.setPFLink((PageflowLink) request.getNewObject());
-		PageflowNode flowObject = getPageflowNode();
-		command.setSource(flowObject);
-		request.setStartCommand(command);
-		return command;
-	}
-
-	/**
-	 * get the edit part of pageflow node
-	 * 
-	 * @return - the edit part of pageflow node
-	 */
-	protected PageflowNodeEditPart getPageflowNodeEditPart() {
-		return (PageflowNodeEditPart) getHost();
-	}
-
-	/**
-	 * get the pageflow node
-	 * 
-	 * @return - the pageflow node
-	 */
-	protected PageflowNode getPageflowNode() {
-		return (PageflowNode) getHost().getModel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#getReconnectTargetCommand()
-	 */
-	protected Command getReconnectTargetCommand(ReconnectRequest request) {
-		ConnectionCommand cmd = ConnectionCommandFactory.createCommand(request);
-		cmd
-				.setPFLink((PageflowLink) request.getConnectionEditPart()
-						.getModel());
-		cmd.setTarget(getPageflowNode());
-		return cmd;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#getReconnectSourceCommand()
-	 */
-	protected Command getReconnectSourceCommand(ReconnectRequest request) {
-		ConnectionCommand cmd = ConnectionCommandFactory.createCommand(request);
-		cmd
-				.setPFLink((PageflowLink) request.getConnectionEditPart()
-						.getModel());
-		cmd.setSource(getPageflowNode());
-		return cmd;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see GraphicalNodeEditPolicy#getCommand()
-	 */
-	public Command getCommand(Request request) {
-		if (OpenEditorAction.OPEN_EDITOR_REQUEST.equals(request.getType())) {
-			return new OpenEditorCommand(getHost());
-		}
-
-		return super.getCommand(request);
-	}
-
-	/**
-	 * return the pageflow node figure
-	 * 
-	 * @return - the pageflow node's figure
-	 */
-	protected PageflowNodeFigure getPageflowNodeFigure() {
-		return (PageflowNodeFigure) ((GraphicalEditPart) getHost()).getFigure();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeSelectionEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeSelectionEditPolicy.java
deleted file mode 100644
index fb0465d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowNodeSelectionEditPolicy.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-
-/**
- * Handles selection of Node. Primary selection is denoted by highlight and a
- * focus rectangle. Normal selection is denoted by highlight only.
- * 
- * @author xgzhang
- */
-public class PageflowNodeSelectionEditPolicy extends NonResizableEditPolicy {
-
-//	private PageflowNodeFigure getFigure() {
-//		PageflowNodeEditPart part = (PageflowNodeEditPart) getHost();
-//		return ((PageflowNodeFigure) part.getFigure());
-//	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#hideSelection()
-	 */
-	protected void hideSelection() {
-		super.hideSelection();
-		// getFigure().setSelected(false);
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
-	 */
-	protected void showPrimarySelection() {
-		super.showPrimarySelection();
-		// getFigure().setSelected(true);
-	}
-
-	/**
-	 * @see org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy#showSelection()
-	 */
-	protected void showSelection() {
-		super.showSelection();
-		// getFigure().setSelected(true);
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowXYLayoutEditPolicy.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowXYLayoutEditPolicy.java
deleted file mode 100644
index dccbfa6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpolicy/PageflowXYLayoutEditPolicy.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpolicy;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ResizableEditPolicy;
-import org.eclipse.gef.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.AddNodeCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.CreateNodeCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.command.SetConstraintCommand;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-
-/**
- * Customize the layout policy for page flows
- *
- */
-public class PageflowXYLayoutEditPolicy extends XYLayoutEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#createAddCommand()
-	 */
-	protected Command createAddCommand(EditPart childEditPart, Object constraint) {
-		PageflowNode part = (PageflowNode) childEditPart.getModel();
-		Rectangle rect = (Rectangle) constraint;
-
-		AddNodeCommand add = new AddNodeCommand();
-		add.setParent((Pageflow) getHost().getModel());
-		add.setChild(part);
-		add.setLabel(PageflowMessages.PageflowXYLayoutEditPolicy_Add);
-		add.setDebugLabel("PageFlowXYEP add subpart"); //$NON-NLS-1$
-
-		SetConstraintCommand setConstraint = new SetConstraintCommand();
-
-		setConstraint.setLocation(rect);
-		setConstraint.setPart(part);
-		setConstraint.setLabel(PageflowMessages.PageflowXYLayoutEditPolicy_Add);
-		setConstraint.setDebugLabel("PageFlowXYEP setConstraint"); //$NON-NLS-1$
-		return add.chain(setConstraint);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#createChangeConstraintCommand()
-	 */
-	protected Command createChangeConstraintCommand(EditPart child,
-			Object constraint) {
-		SetConstraintCommand locationCommand = new SetConstraintCommand();
-		locationCommand.setPart((PageflowNode) child.getModel());
-		locationCommand.setLocation((Rectangle) constraint);
-		return locationCommand;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#createChildEditPolicy()
-	 */
-	protected EditPolicy createChildEditPolicy(EditPart child) {
-		if (child instanceof PageflowNodeEditPart) {
-			return new PageflowNodeSelectionEditPolicy();
-		}
-
-		return new ResizableEditPolicy();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#getCreateCommand()
-	 */
-	protected Command getCreateCommand(CreateRequest request) {
-		CreateNodeCommand create = new CreateNodeCommand();
-		create.setParent((Pageflow) getHost().getModel());
-		create.setChild((PageflowNode) request.getNewObject());
-		Rectangle constraint = (Rectangle) getConstraintFor(request);
-		create.setLocation(constraint);
-		create.setLabel(PageflowMessages.PageflowXYLayoutEditPolicy_Add);
-		return create;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#getDeleteDependantCommand()
-	 */
-	protected Command getDeleteDependantCommand(Request request) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see XYLayoutEditPolicy#getOrphanChildrenCommand()
-	 */
-	protected Command getOrphanChildrenCommand(Request request) {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ConnectionLabel.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ConnectionLabel.java
deleted file mode 100644
index 702e58e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ConnectionLabel.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This label is used in connection figure, which has a border.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class ConnectionLabel extends Label {
-	/**
-	 * 
-	 */
-	public ConnectionLabel() {
-		this(null, null);
-	}
-
-	/**
-	 * @param s
-	 */
-	public ConnectionLabel(String s) {
-		this(s, null);
-	}
-
-	/**
-	 * @param i
-	 */
-	public ConnectionLabel(Image i) {
-		this(null, i);
-	}
-
-	/**
-	 * @param s
-	 * @param i
-	 */
-	public ConnectionLabel(String s, Image i) {
-		super(s, i);
-
-		// setBorder(new LineBorder());
-		setOpaque(true);
-	}
-
-	/**
-	 * set the label's border's width
-	 * 
-	 * @param w
-	 */
-	public void setBorderWidth(int w) {
-		if (getBorder() != null) {
-			((LineBorder) getBorder()).setWidth(w);
-		}
-	}
-
-	/**
-	 * set the label's border's color
-	 * 
-	 * @param c
-	 */
-	public void setBorderColor(Color c) {
-		if (getBorder() != null) {
-			((LineBorder) getBorder()).setColor(c);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ILabelDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ILabelDecorator.java
deleted file mode 100644
index d1d0137..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/ILabelDecorator.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A label decorator decorates the label text and image for some element. The
- * original label text and image are obtained by some other means,
- * 
- * 
- * @author Xiao-guang Zhang
- */
-public interface ILabelDecorator {
-	/**
-	 * Returns an image that is based on the given image, but decorated with
-	 * additional information relating to the state of the provided element.
-	 * 
-	 * @param image
-	 *            the input image to decorate, or <code>null</code> if the
-	 *            element has no image
-	 * @param element
-	 *            the element whose image is being decorated
-	 * @return the decorated image, or <code>null</code> if no decoration is
-	 *         to be applied
-	 * 
-	 * @see org.eclipse.jface.resource.CompositeImageDescriptor
-	 */
-	public Image decorateImage(Image image, Object element);
-
-	/**
-	 * Returns a text label that is based on the given text label, but decorated
-	 * with additional information relating to the state of the provided
-	 * element.
-	 * 
-	 * 
-	 * @param text
-	 *            the input text label to decorate
-	 * @param element
-	 *            the element whose image is being decorated
-	 * @return the decorated text label, or <code>null</code> if no decoration
-	 *         is to be applied
-	 */
-	public String decorateText(String text, Object element);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/NodeLabel.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/NodeLabel.java
deleted file mode 100644
index fa5764d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/NodeLabel.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This derived label has simple tooltip support
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class NodeLabel extends Label {
-	/**
-	 * 
-	 */
-	public NodeLabel() {
-		super();
-	}
-
-	/**
-	 * @param s
-	 */
-	public NodeLabel(String s) {
-		super(s);
-	}
-
-	/**
-	 * @param i
-	 */
-	public NodeLabel(Image i) {
-		super(i);
-	}
-
-	/**
-	 * @param s
-	 * @param i
-	 */
-	public NodeLabel(String s, Image i) {
-		super(s, i);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Label#setTextPlacement(int)
-	 */
-	public void setTextPlacement(int where) {
-		super.setTextPlacement(where);
-		layout();
-		invalidate();
-	}
-
-	/**
-	 * set tooltip text
-	 * 
-	 * @param text
-	 */
-	public void setToolTipText(String text) {
-		Label toolTipLabel = null;
-
-		if (text != null && text.length() > 0) {
-			toolTipLabel = new Label(text);
-			toolTipLabel.setBorder(new MarginBorder(3));
-		}
-
-		super.setToolTip(toolTipLabel);
-	}
-
-	/**
-	 * get tooltip's text
-	 * 
-	 * @return the tool tip text string
-	 */
-	public String getToolTipText() {
-		if (getToolTip() != null)
-			return ((Label) getToolTip()).getText();
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PFLinkFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PFLinkFigure.java
deleted file mode 100644
index f9ecd41..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PFLinkFigure.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.MidpointLocator;
-import org.eclipse.draw2d.PolygonDecoration;
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * 
- * The figure for pflink, used by pflink edit part, which is a polyline with a
- * label control on it, and with tooltip support.
- * 
- * @author Xiao-guang Zhang
- */
-public class PFLinkFigure extends PolylineConnection {
-	/** the label attached to the connection */
-	private ConnectionLabel textLabel = null;
-
-	//private ConnectionLabel iconLabel = null;
-
-	/** The label's background color */
-	private Color labelBgColor;
-
-	/** The label's foreground color */
-	private Color labelFgColor;
-
-	/** The label's visiblity */
-	private boolean bLabelVisible = false;
-
-	/** The connection's line width */
-	private int lineWidth = 0;
-
-	/** the polygon decoration for connection line */
-	private PolygonDecoration arrow;
-
-	/**
-	 * 
-	 */
-	public PFLinkFigure() {
-		arrow = new PolygonDecoration();
-		arrow.setTemplate(PolygonDecoration.TRIANGLE_TIP);
-		arrow.setScale(10, getLineWidth() * 2);
-		setTargetDecoration(arrow);
-		setForegroundColor(getForegroundColor());
-	}
-
-	/**
-	 * set the connection's label string
-	 * 
-	 * @param strLabel
-	 */
-	public void setLabel(String strLabel) {
-		if (null != strLabel) {
-			if (textLabel == null) {
-				textLabel = new ConnectionLabel();
-				textLabel.setFont(getLabelFont());
-				textLabel.setBackgroundColor(getLabelBackgroundColor());
-				textLabel.setForegroundColor(getLabelForegroundColor());
-				setLineWidth(getLineWidth());
-				setLabelVisible(getLabelVisible());
-				setForegroundColor(getForegroundColor());
-				add(textLabel, new MidpointLocator(this, 1));
-			}
-			// textLabel.setVisible(true);
-			textLabel.setText(strLabel);
-		}
-	}
-
-	/**
-	 * Set the icon image to null
-	 */
-	public void clearIcon() {
-		setImage(null);
-	}
-
-	/**
-	 * Set the label to empty string
-	 */
-	public void clearOutcome() {
-		setLabel(""); //$NON-NLS-1$
-	}
-
-	/**
-	 * set the connection's label string
-	 * 
-	 * @param image
-	 */
-	public void setImage(Image image) {
-		if (textLabel == null) {
-			textLabel = new ConnectionLabel();
-			textLabel.setFont(getLabelFont());
-			textLabel.setBackgroundColor(getLabelBackgroundColor());
-			textLabel.setForegroundColor(getLabelForegroundColor());
-			setLineWidth(getLineWidth());
-			setLabelVisible(getLabelVisible());
-			setForegroundColor(getForegroundColor());
-			add(textLabel, new MidpointLocator(this, 0));
-		}
-		textLabel.setIcon(image);
-	}
-
-	/**
-	 * Set the action image
-	 */
-	public void setActionImage() {
-		ImageDescriptor imageDescriptor = PageflowElementEditPart.IMG_ACTION;
-		Image image = EditorPlugin.getDefault().getImageRegistry().get(
-				imageDescriptor.toString());
-		if (null == image) {
-			EditorPlugin.getDefault().getImageRegistry().put(
-					imageDescriptor.toString(), imageDescriptor);
-			image = EditorPlugin.getDefault().getImageRegistry().get(
-					imageDescriptor.toString());
-		}
-		setImage(image);
-	}
-
-	/**
-	 * @return the icon image
-	 */
-	public Image getImage() {
-		if (textLabel != null)
-        {
-			return textLabel.getIcon();
-        }
-        return null;
-	}
-
-
-	/**
-	 * @param text
-	 */
-	public void setToolTipText(String text) {
-		Label toolTipLabel = null;
-
-		if (text != null && text.length() > 0) {
-			toolTipLabel = new Label(text);
-			toolTipLabel.setBorder(new MarginBorder(3));
-		}
-
-		super.setToolTip(toolTipLabel);
-	}
-
-	/**
-	 * @return the tool tip text or null if none
-	 */
-	public String getToolTipText() {
-		if (getToolTip() != null)
-		{
-			return ((Label) getToolTip()).getText();
-		}
-		return null;
-	}
-
-	/**
-	 * set the font including label's
-	 * 
-	 */
-	public void setFont(Font f) {
-		if (textLabel != null)
-			textLabel.setFont(f);
-		super.setFont(f);
-	}
-
-	/**
-	 * get the label's font from preference
-	 * 
-	 */
-	private Font getLabelFont() {
-		FontRegistry registry = JFaceResources.getFontRegistry();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		FontData fontData = PreferenceConverter.getFontData(store,
-				GEMPreferences.LINE_LABEL_FONT);
-		if (!registry.get(fontData.toString()).equals(registry.defaultFont()))
-			return registry.get(fontData.toString());
-		
-		registry.put(fontData.toString(), new FontData[] {fontData});
-		return registry.get(fontData.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Shape#setLineWidth(int)
-	 */
-	public void setLineWidth(int w) {
-		if (textLabel != null)
-			textLabel.setBorderWidth(w);
-		arrow.setScale(10, getLineWidth() * 2);
-		super.setLineWidth(w);
-	}
-
-	/**
-	 * get the connection line width from preference.
-	 */
-	public int getLineWidth() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		lineWidth = store.getInt(GEMPreferences.LINE_WIDTH);
-		return lineWidth;
-	}
-
-	/**
-	 * set label's visibility
-	 * 
-	 * @param flag -
-	 *            visible or not.
-	 */
-	public void setLabelVisible(boolean flag) {
-		if (textLabel != null)
-			textLabel.setVisible(flag);
-	}
-
-	/**
-	 * get the label's visiblity from preference
-	 * 
-	 */
-	private boolean getLabelVisible() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		bLabelVisible = store.getBoolean(GEMPreferences.SHOW_LINE_LABELS);
-		return bLabelVisible;
-	}
-
-	/**
-	 * set the label's foreground color
-	 * 
-	 * @param c
-	 */
-	public void setLabelForegroundColor(Color c) {
-		labelFgColor = c;
-		if (textLabel != null)
-			textLabel.setForegroundColor(c);
-	}
-
-	/**
-	 * get the label's foreground color from preference
-	 * 
-	 */
-	private Color getLabelForegroundColor() {
-		if (labelFgColor == null) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			labelFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_LABEL_FONT_COLOR);
-		}
-		return labelFgColor;
-	}
-
-	/**
-	 * set the label's background color
-	 * 
-	 * @param c
-	 */
-	public void setLabelBackgroundColor(Color c) {
-		labelBgColor = c;
-		if (textLabel != null)
-			textLabel.setBackgroundColor(c);
-	}
-
-	/**
-	 * get the label's background color from preference
-	 * 
-	 */
-	private Color getLabelBackgroundColor() {
-		if (labelBgColor == null) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			labelBgColor = GEMPreferences.getColor(store,
-					GEMPreferences.LINE_LABEL_COLOR);
-		}
-		return labelBgColor;
-	}
-
-	/**
-	 * get the foreground color from preference
-	 * 
-	 */
-	public Color getForegroundColor() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		final Color newFgColor = GEMPreferences.getColor(store, GEMPreferences.LINE_COLOR);
-        setForegroundColor(newFgColor);
-		return newFgColor;
-	}
-
-	/**
-	 * set the figure's foreground, which will also update the label's border's
-	 * color.
-	 */
-	public void setForegroundColor(Color c) {
-		if (textLabel != null)
-			textLabel.setBorderColor(c);
-		super.setForegroundColor(c);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PageflowNodeFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PageflowNodeFigure.java
deleted file mode 100644
index 9a08273..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/figure/PageflowNodeFigure.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.figure;
-
-import java.util.Vector;
-
-import org.eclipse.draw2d.ChopboxAnchor;
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FlowLayout;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LabelAnchor;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.FontRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.preference.GEMPreferences;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The figure for pageflow node, used by pageflow node edit part.
- * 
- */
-public class PageflowNodeFigure extends Figure {
-	/** Same connection anchors for source and target */
-	protected Vector connectionAnchors = new Vector(1);
-
-	/** label of the pageflow node figure */
-	private NodeLabel label;
-
-	/** the foreground color of Label */
-	private Color labelFgColor;
-
-	/** the background color of Label */
-//	private Color labelBgColor;  // TODO: variable is never read because getter is private
-
-	/** the text placement for the label */
-	private int textPlacement = PositionConstants.SOUTH;
-
-	/**
-	 * Default constructor
-	 */
-	public PageflowNodeFigure() {
-		setLayoutManager(new FlowLayout());
-
-		// initializeConnectionAnchors();
-	}
-
-	/**
-	 * get the source(output) anchor according to the input point.
-	 * 
-	 * @param p -
-	 *            the input point
-	 * @return - Source ConnectionAnchor
-	 */
-	public ConnectionAnchor getSourceConnectionAnchorAt(Point p) {
-		if (getSourceConnectionAnchors().size() == 0)
-			return null;
-		return (ConnectionAnchor) getSourceConnectionAnchors().get(0);
-	}
-
-	/**
-	 * get the default source anchor
-	 * 
-	 * @return - Source ConnectionAnchor
-	 */
-	public ConnectionAnchor getSourceConnectionAnchor() {
-		if (getSourceConnectionAnchors().size() == 0)
-			return null;
-		return (ConnectionAnchor) getSourceConnectionAnchors().get(0);
-	}
-
-	/**
-	 * Get the source connection anchors vector
-	 * 
-	 * @return - the vector
-	 */
-	private Vector getSourceConnectionAnchors() {
-		return connectionAnchors;
-	}
-
-	/**
-	 * get the target (input) connection Anchor according the input point
-	 * 
-	 * @param p -
-	 *            the input Point
-	 * @return - ConnectionAnchor
-	 */
-	public ConnectionAnchor getTargetConnectionAnchorAt(Point p) {
-		if (getTargetConnectionAnchors().size() == 0)
-			return null;
-		return (ConnectionAnchor) getTargetConnectionAnchors().get(0);
-	}
-
-	/**
-	 * get the default target (input) connection Anchor
-	 * 
-	 * @return - ConnectionAnchor
-	 */
-	public ConnectionAnchor getTargetConnectionAnchor() {
-		if (getTargetConnectionAnchors().size() == 0)
-			return null;
-		return (ConnectionAnchor) getTargetConnectionAnchors().get(0);
-	}
-
-	/**
-	 * Get the target connection anchors vector
-	 * 
-	 * @return - the vector
-	 */
-	private Vector getTargetConnectionAnchors() {
-		return connectionAnchors;
-	}
-
-	/**
-	 * update the anchors
-	 * 
-	 */
-	public void update() {
-		initializeConnectionAnchors();
-	}
-
-	/**
-	 * Initialize the connection anchors
-	 * 
-	 */
-	private void initializeConnectionAnchors() {
-		connectionAnchors.removeAllElements();
-		ChopboxAnchor inputConnectionAnchor = new LabelAnchor(label);
-		connectionAnchors.addElement(inputConnectionAnchor);
-	}
-
-	/**
-	 * get the text placement from preference.
-	 * 
-	 */
-	private int getTextPlacement() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		String s = store.getString(GEMPreferences.LABEL_PLACEMENT);
-		if (GEMPreferences.LABEL_PLACEMENT_TOP.equals(s))
-			textPlacement = PositionConstants.NORTH;
-		else if (GEMPreferences.LABEL_PLACEMENT_BOTTOM.equals(s))
-			textPlacement = PositionConstants.SOUTH;
-		else if (GEMPreferences.LABEL_PLACEMENT_LEFT.equals(s))
-			textPlacement = PositionConstants.WEST;
-		else if (GEMPreferences.LABEL_PLACEMENT_RIGHT.equals(s))
-			textPlacement = PositionConstants.EAST;
-		return textPlacement;
-	}
-
-	/**
-	 * get the label's background color from preference.
-	 * 
-	 * @return
-	 */
-	 // TODO: dead code
-//	private Color getLabelBackgroundColor() {
-//		return labelBgColor;
-//	}
-
-	/**
-	 * get the label's foreground color from preference.
-	 * 
-	 * @return
-	 */
-	private Color getLabelForegroundColor() {
-		if (labelFgColor == null) {
-			IPreferenceStore store = EditorPlugin.getDefault()
-					.getPreferenceStore();
-			labelFgColor = GEMPreferences.getColor(store,
-					GEMPreferences.FIGURE_LABEL_FONT_COLOR);
-		}
-		return labelFgColor;
-	}
-
-	/**
-	 * get the labe's font from preference.
-	 * 
-	 * @return
-	 */
-	private Font getLabelFont() {
-		FontRegistry registry = JFaceResources.getFontRegistry();
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		FontData fontData = PreferenceConverter.getFontData(store,
-				GEMPreferences.FIGURE_LABEL_FONT);
-		if (!registry.get(fontData.toString()).equals(registry.defaultFont()))
-			return registry.get(fontData.toString());
-		
-		registry.put(fontData.toString(), new FontData[] {fontData});
-		return registry.get(fontData.toString());
-	}
-
-	/**
-	 * set the image and text of the figure
-	 * 
-	 * @param image -
-	 *            the image
-	 * @param str -
-	 *            the label
-	 */
-	public void setImageText(Image image, String str) {
-		if (image == null)
-			setText(str);
-		else if (str == null)
-			setImage(image);
-		else {
-			if (label == null) {
-				label = new NodeLabel(str, image);
-				label.setTextPlacement(getTextPlacement());
-				label.setForegroundColor(getLabelForegroundColor());
-				label.setFont(getLabelFont());
-				add(label);
-				initializeConnectionAnchors();
-			} else {
-				label.setIcon(image);
-				label.setText(str);
-			}
-		}
-	}
-
-	/**
-	 * set the image of the figure
-	 * 
-	 * @param image -
-	 *            the image
-	 */
-	public void setImage(Image image) {
-		if (image == null)
-			return;
-		if (label == null) {
-			label = new NodeLabel(image);
-			label.setTextPlacement(getTextPlacement());
-			label.setForegroundColor(getLabelForegroundColor());
-			label.setFont(getLabelFont());
-			add(label);
-			initializeConnectionAnchors();
-		} else
-			label.setIcon(image);
-	}
-
-	/**
-	 * set the text of the figure
-	 * 
-	 * @param str -
-	 *            the text
-	 */
-	public void setText(String str) {
-		if (str == null)
-			return;
-		if (label == null) {
-			label = new NodeLabel(str);
-			label.setTextPlacement(getTextPlacement());
-			label.setForegroundColor(getLabelForegroundColor());
-			label.setFont(getLabelFont());
-			add(label);
-			initializeConnectionAnchors();
-		} else
-			label.setText(str);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-
-	/**
-	 * Returns the imageBounds.
-	 * 
-	 * @return - Rectangle of image
-	 */
-	public Rectangle getImageBounds() {
-		return label.getIconBounds();
-	}
-
-	/**
-	 * Returns the textBounds.
-	 * 
-	 * @return - Rectangle of text field
-	 */
-	public Rectangle getTextBounds() {
-		return label.getTextBounds();
-	}
-
-	/**
-	 * Returns the label.
-	 * 
-	 * @return - Label
-	 */
-	public Label getLabel() {
-		return label;
-	}
-
-	/**
-	 * set the label's backaground
-	 */
-	public void setBackgroundColor(Color bg) {
-//		TODO: var is never read: labelBgColor = bg;
-		if (label != null)
-			label.setBackgroundColor(bg);
-	}
-
-	/**
-	 * set the label's foreground
-	 */
-	public void setForegroundColor(Color fg) {
-		labelFgColor = fg;
-
-		if (label != null)
-			label.setForegroundColor(fg);
-	}
-
-	/**
-	 * Set the label's font
-	 */
-	public void setFont(Font f) {
-		if (label != null)
-			label.setFont(f);
-		super.setFont(f);
-	}
-
-	/**
-	 * Set the text placement for the label
-	 * 
-	 * @param where
-	 */
-	public void setTextPlacement(int where) {
-		textPlacement = where;
-		if (label != null)
-			label.setTextPlacement(where);
-	}
-
-
-	/**
-	 * @param text
-	 */
-	public void setToolTipText(String text) {
-		Label toolTipLabel = null;
-
-		if (text != null && text.length() > 0) {
-			toolTipLabel = new Label(text);
-			toolTipLabel.setBorder(new MarginBorder(3));
-		}
-
-		super.setToolTip(toolTipLabel);
-	}
-	/**
-	 * @return the figure's tool tip text or null if none
-	 */
-	public String getToolTipText() {
-		if (getToolTip() != null)
-			return ((Label) getToolTip()).getText();
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/layout/PageflowLayoutManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/layout/PageflowLayoutManager.java
deleted file mode 100644
index 74c3470..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/layout/PageflowLayoutManager.java
+++ /dev/null
@@ -1,550 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.layout;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.draw2d.graph.DirectedGraph;
-import org.eclipse.draw2d.graph.DirectedGraphLayout;
-import org.eclipse.draw2d.graph.Edge;
-import org.eclipse.draw2d.graph.EdgeList;
-import org.eclipse.draw2d.graph.Node;
-import org.eclipse.draw2d.graph.NodeList;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowModelManager;
-
-/**
- * This class is a singleton adpater to create the directed graph for the
- * specified pageflow model or update the location information of pageflow model
- * according to directed graph layout algorithms.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowLayoutManager {
-	/** node's default size */
-	private static final int NODE_DEFAULT_WIDTH = 50;
-
-	private static final int NODE_DEFAULT_HEIGHT = 50;
-
-	/**
-	 * the margin of the top and left , and margin between each connnected
-	 * directed graph.
-	 */
-	private static final int X_SPACE = 50;
-
-	private static final int Y_SPACE = 50;
-
-	/** node's default padding */
-	private static final int DEFAULT_PADDING = 30;
-
-	private static PageflowLayoutManager manager;
-
-	private Map copiedLinks = null;
-
-	/**
-	 * constructor of PageflowDirectedGraphAdapter
-	 * 
-	 */
-	private PageflowLayoutManager() {
-	    // no external instantiation
-	}
-
-	/**
-	 * return the singleton instance of PageflowDirectedGraphAdapter
-	 * 
-	 * @return - the singleton instance of PageflowDirectedGraphAdapter
-	 */
-	static public PageflowLayoutManager getInstance() {
-		if (manager == null) {
-			manager = new PageflowLayoutManager();
-		}
-		return manager;
-	}
-
-	/**
-	 * layout pageflow using directed graph layout algorithms
-	 * 
-	 * @param pageflow -
-	 *            pageflow model
-	 */
-	public void layoutPageflow(Pageflow pageflow) {
-		List selfLoopLinks = removeSelfLoopLinks(pageflow);
-
-		List lstGraph = createGraphs(pageflow);
-		for (Iterator iter = lstGraph.iterator(); iter.hasNext();) {
-			DirectedGraph graph = (DirectedGraph) iter.next();
-			new DirectedGraphLayout().visit(graph);// .visit(graph);
-		}
-		updatePageflow(lstGraph);
-
-		if (selfLoopLinks != null) {
-			addSelfLoopLinks(pageflow, selfLoopLinks);
-		}
-	}
-
-	/**
-	 * remove the self loop links from pageflow, because the layout algorithm
-	 * does not allow it.
-	 * 
-	 * @param pageflow
-	 * @return
-	 */
-	private List removeSelfLoopLinks(Pageflow pageflow) {
-		List selfLoopLinks = new ArrayList();
-
-		if (pageflow.getLinks() != null) {
-			for (Iterator iter = pageflow.getLinks().iterator(); iter.hasNext();) {
-				PageflowLink link = (PageflowLink) iter.next();
-
-				if (link.getSource() == link.getTarget()) {
-					iter.remove();
-					link.getBendPoints().clear();
-					selfLoopLinks.add(link);
-				}
-			}
-		}
-		return selfLoopLinks;
-	}
-
-	/**
-	 * add back the self loop links with updated bendpoints.
-	 * 
-	 * @param pageflow
-	 * @param selfLoopLinks
-	 */
-	private void addSelfLoopLinks(Pageflow pageflow, List selfLoopLinks) {
-		if (pageflow.getLinks() != null && selfLoopLinks != null
-				&& selfLoopLinks.size() > 0) {
-			EList links = pageflow.getLinks();
-			for (Iterator iter = selfLoopLinks.iterator(); iter.hasNext();) {
-				PageflowLink link = (PageflowLink) iter.next();
-				updateSelfLoopLink(link);
-				links.add(link);
-			}
-		}
-	}
-
-	/**
-	 * Update the bendpoints of the self loop link Follow the following style:
-	 * 
-	 * LeftTop-Top | | Left----Node
-	 * 
-	 * @param selfLoopLink
-	 */
-	public static void updateSelfLoopLink(PageflowLink selfLoopLink) {
-		PageflowNode sourceNode = selfLoopLink.getSource();
-		Rectangle rectNode = getPageflowNodeBounds(sourceNode);
-
-		EList outLinks = sourceNode.getOutlinks();
-		if (outLinks != null && outLinks.size() > 0) {
-			for (Iterator iter = outLinks.iterator(); iter.hasNext();) {
-				PageflowLink anotherSelfLoopLink = (PageflowLink) iter.next();
-				if (anotherSelfLoopLink != selfLoopLink
-						&& anotherSelfLoopLink.getTarget() == sourceNode) {
-					rectNode = getFitnessRectangle(rectNode,
-							anotherSelfLoopLink);
-				}
-			}
-		}
-
-		PageflowFactory factory = PageflowModelManager.getFactory();
-		PageflowLinkBendpoint bpTop = factory.createPFLinkBendpoint();
-		PageflowLinkBendpoint bpLeftTop = factory.createPFLinkBendpoint();
-		PageflowLinkBendpoint bpLeft = factory.createPFLinkBendpoint();
-
-		bpTop.setD1Height(-rectNode.height);
-		bpTop.setD2Height(-rectNode.height);
-
-		bpLeftTop.setD1Width(-rectNode.width);
-		bpLeftTop.setD1Height(-rectNode.height);
-		bpLeftTop.setD2Width(-rectNode.width);
-		bpLeftTop.setD2Height(-rectNode.height);
-
-		bpLeft.setD1Width(-rectNode.width);
-		bpLeft.setD2Width(-rectNode.width);
-
-		selfLoopLink.getBendPoints().add(bpTop);
-		selfLoopLink.getBendPoints().add(bpLeftTop);
-		selfLoopLink.getBendPoints().add(bpLeft);
-	}
-
-	/**
-	 * Calculate the fitness rectangle without conflict with the existing self
-	 * loop's rectangle.
-	 * 
-	 * @param rectDefault
-	 * @param anotherSelfLoopLink
-	 */
-	private static Rectangle getFitnessRectangle(Rectangle rectDefault,
-			PageflowLink anotherSelfLoopLink) {
-		EList bendPoints = anotherSelfLoopLink.getBendPoints();
-		if (bendPoints != null && bendPoints.size() > 0) {
-			for (Iterator iterBendPoint = bendPoints.iterator(); iterBendPoint
-					.hasNext();) {
-				PageflowLinkBendpoint bendPoint = (PageflowLinkBendpoint) iterBendPoint
-						.next();
-				if (bendPoint.getD1Width() == -rectDefault.width
-						&& bendPoint.getD1Height() == -rectDefault.height) {
-					rectDefault = new Rectangle(0, 0, rectDefault.width
-							+ DEFAULT_PADDING, rectDefault.height
-							+ DEFAULT_PADDING);
-					break;
-				}
-			}
-		}
-		return rectDefault;
-	}
-
-	/**
-	 * get the pageflow node's bounds, the orginal point is (0,0)
-	 * 
-	 * @param pfNode
-	 * @return
-	 */
-	private static Rectangle getPageflowNodeBounds(PageflowNode pfNode) {
-		return new Rectangle(0, 0, 64, 36);
-	}
-
-	/**
-	 * get the pageflow node's border rectangle
-	 * 
-	 * @param pfNode
-	 * @return
-	 */
-	private static Rectangle getPageflowNodeRectangle(PageflowNode pfNode) {
-		Rectangle rectNode = null;
-
-		Rectangle bounds = getPageflowNodeBounds(pfNode);
-
-		rectNode = new Rectangle(pfNode.getX(), pfNode.getY(), bounds.width,
-				bounds.height);
-
-		return rectNode;
-	}
-
-	/**
-	 * create the connected subgraphs for the pageflow model, because there
-	 * maybe more than one connected graph in one pageflow definition.
-	 * 
-	 * @param pageflow -
-	 *            Pageflow model
-	 * @return - the connected subgraphs
-	 */
-	private List createGraphs(Pageflow pageflow) {
-		/** the connected subgraphs */
-		List lstGraph = null;
-
-		if (pageflow != null) {
-			// Graph is not connected totally.
-			DirectedGraph graph = null;
-			HashMap nodesMap = new HashMap();
-
-			NodeList nodes = new NodeList();
-			EdgeList edges = new EdgeList();
-
-			// get all nodes in the pageflow
-			List pfNodes = pageflow.getNodes();
-			if (pfNodes != null) {
-				for (Iterator iter = pfNodes.iterator(); iter.hasNext();) {
-					PageflowNode pfNode = (PageflowNode) iter.next();
-					Node node = new Node(pfNode);
-					Rectangle rectNode = null;
-					rectNode = getPageflowNodeBounds(pfNode);
-					if (rectNode != null) {
-						node.width = rectNode.width * 2;
-						node.height = rectNode.height * 2;
-						node.setPadding(new Insets(node.height, node.width,
-								node.height, node.width));
-					} else {
-						node.width = NODE_DEFAULT_WIDTH;
-						node.height = NODE_DEFAULT_HEIGHT;
-						node.setPadding(new Insets(DEFAULT_PADDING));
-					}
-					nodesMap.put(pfNode, node);
-					nodes.add(node);
-				}
-			}
-			// get all edges in the pageflow
-			List pfLinks = pageflow.getLinks();
-			for (Iterator iter = pfLinks.iterator(); iter.hasNext();) {
-				PageflowLink link = (PageflowLink) iter.next();
-				PageflowNode source = link.getSource();
-				PageflowNode target = link.getTarget();
-				Node sourceNode = (Node) nodesMap.get(source);
-				Node targetNode = (Node) nodesMap.get(target);
-
-				if (sourceNode != null && targetNode != null) {
-					Edge edge = new Edge(sourceNode, targetNode);
-					edges.add(edge);
-				}
-			}
-
-			graph = new DirectedGraph();
-
-			graph.nodes = nodes;
-			graph.edges = edges;
-
-			// get the connected subgraphs.
-			lstGraph = new ArrayList();
-			lstGraph.add(graph);// ..getConnectedSubGraphs();
-		}
-		return lstGraph;
-	}
-
-	/**
-	 * update the pageflow according to layout results which are stored in the
-	 * connected subgraphs
-	 * 
-	 * @param lstGraph -
-	 *            connected subgraphs
-	 * 
-	 */
-	private void updatePageflow(List lstGraph) {
-		// y coordiantion of the subgraph's start point
-		int topSubGraph = 0;
-
-		for (Iterator iter = lstGraph.iterator(); iter.hasNext();) {
-			// sub graph's bottom
-			int bottomSubGraph = 0;
-			DirectedGraph graph = (DirectedGraph) iter.next();
-			for (int i = 0; i < graph.nodes.size(); i++) {
-				Node node = graph.nodes.getNode(i);
-				if (!(node.data instanceof PageflowNode)) {
-					continue;
-				}
-				PageflowNode pfNode = (PageflowNode) node.data;
-				pfNode.setX(X_SPACE + node.y);
-
-				pfNode.setY(Y_SPACE + node.x + topSubGraph);
-
-				if ((Y_SPACE + node.x + topSubGraph) > bottomSubGraph) {
-					bottomSubGraph = Y_SPACE + node.x + topSubGraph;
-				}
-			}
-			topSubGraph = bottomSubGraph + Y_SPACE;
-		}
-	}
-
-	/**
-	 * update new pageflow's layout using the existing one.
-	 * @param newPageflow 
-	 * @param oldPageflow 
-	 */
-	public void updatePageflowLayout(Pageflow newPageflow, Pageflow oldPageflow) {
-		List notUpdatedNodes = new ArrayList();
-
-		copiedLinks = new HashMap();
-
-		if (oldPageflow.getNodes().size() > 0) {
-			for (Iterator iter = newPageflow.getNodes().iterator(); iter
-					.hasNext();) {
-				PageflowNode newNode = (PageflowNode) iter.next();
-
-				if (!updatePageflowNode(newNode, oldPageflow)) {
-					notUpdatedNodes.add(newNode);
-				}
-			}
-		} else {
-			notUpdatedNodes.addAll(newPageflow.getNodes());
-		}
-
-		if (oldPageflow.getLinks().size() > 0) {
-			for (Iterator iter = newPageflow.getLinks().iterator(); iter
-					.hasNext();) {
-				PageflowLink newLink = (PageflowLink) iter.next();
-
-				updatePFLink(newLink, oldPageflow);
-			}
-		}
-
-		// if there are still some nodes which are not updated,
-		// they should be check whether there are some layout conflict.
-		if (notUpdatedNodes.size() > 0) {
-			resolveConflict(newPageflow, notUpdatedNodes);
-		}
-
-	}
-
-	/**
-	 * Update pageflow node using the same node
-	 * 
-	 * @param object
-	 * @return - the old pageflow node.
-	 */
-	private boolean updatePageflowNode(PageflowNode newNode,
-			Pageflow oldPageflow) {
-		for (Iterator iter = oldPageflow.getNodes().iterator(); iter.hasNext();) {
-			PageflowNode oldNode = (PageflowNode) iter.next();
-
-			if (oldNode instanceof PageflowPage
-					&& newNode instanceof PageflowPage) {
-				if (((PageflowPage) oldNode).getPath().trim().equals(
-						((PageflowPage) newNode).getPath().trim())) {
-					updatePageflowNode(newNode, oldNode);
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Update pageflow node using the same node
-	 * 
-	 * @param object
-	 */
-	private void updatePageflowNode(PageflowNode newNode, PageflowNode node) {
-		newNode.setX(node.getX());
-		newNode.setY(node.getY());
-	}
-
-	/**
-	 * If there are conflict for the nodes, it will resolve it.
-	 * 
-	 * @param newPageflow
-	 * @param notUpdatedNodes
-	 */
-	private void resolveConflict(Pageflow newPageflow, List notUpdatedNodes) {
-		for (Iterator iter = notUpdatedNodes.iterator(); iter.hasNext();) {
-			resolveConflict(newPageflow, (PageflowNode) iter.next());
-		}
-	}
-
-	/**
-	 * Resolve the layout conflict
-	 * 
-	 * @param newPageflow
-	 * @param node
-	 */
-	private void resolveConflict(Pageflow newPageflow, PageflowNode node) {
-		Rectangle nodeRect = getPageflowNodeRectangle(node);
-		boolean bModified = false;
-		for (int i = 0, size = newPageflow.getNodes().size(); i < size; i++) {
-			PageflowNode fixedNode = (PageflowNode) newPageflow.getNodes().get(
-					i);
-			if (node == fixedNode) {
-				continue;
-			}
-			Rectangle fixedNodeRect = getPageflowNodeRectangle(fixedNode);
-			if (fixedNodeRect.intersects(nodeRect)) {
-				nodeRect.x += fixedNodeRect.width + X_SPACE;
-				nodeRect.y += fixedNodeRect.height + Y_SPACE;
-				bModified = true;
-			}
-		}
-		if (bModified) {
-			node.setX(nodeRect.x);
-			node.setY(nodeRect.y);
-		}
-	}
-
-	/**
-	 * Update the link using the same link in the old pageflow
-	 * 
-	 * @param newLink
-	 * @param oldPageflow
-	 */
-	private void updatePFLink(PageflowLink newLink, Pageflow oldPageflow) {
-		for (Iterator iter = oldPageflow.getLinks().iterator(); iter.hasNext();) {
-			PageflowLink oldLink = (PageflowLink) iter.next();
-
-			if (copiedLinks.get(oldLink) != null) {
-				continue;
-			}
-
-			if (isSameLink(newLink, oldLink)) {
-				updatePFLink(newLink, oldLink);
-				break;
-			}
-		}
-	}
-
-	/**
-	 * Check whether this two links in differnet pageflow are same or not.
-	 * 
-	 * @param newLink
-	 * @param oldLink
-	 * @return
-	 */
-	private boolean isSameLink(PageflowLink newLink, PageflowLink oldLink) {
-		PageflowNode newSource = newLink.getSource();
-		PageflowNode newTarget = newLink.getTarget();
-
-		PageflowNode oldSource = oldLink.getSource();
-		PageflowNode oldTarget = oldLink.getTarget();
-
-		// Page-Page
-		if (newSource instanceof PageflowPage
-				&& oldSource instanceof PageflowPage
-				&& newTarget instanceof PageflowPage
-				&& oldTarget instanceof PageflowPage) {
-			if (((PageflowPage) newSource).getPath().trim().equalsIgnoreCase(
-					((PageflowPage) oldSource).getPath().trim())
-					&& ((PageflowPage) newTarget)
-							.getPath()
-							.trim()
-							.equalsIgnoreCase(
-									((PageflowPage) oldTarget).getPath().trim())) {
-				if ((newLink.getOutcome() == null && oldLink.getOutcome() == null)
-						|| (newLink.getOutcome() != null
-								&& oldLink.getOutcome() != null && newLink
-								.getOutcome().trim().equals(
-										oldLink.getOutcome().trim()))) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Update the link using the same link
-	 * 
-	 * @param nodesMap
-	 * @param object
-	 * @return
-	 */
-	private PageflowLink updatePFLink(PageflowLink newLink, PageflowLink link) {
-		PageflowFactory factory = PageflowModelManager.getFactory();
-
-		newLink.getBendPoints().clear();
-
-		for (Iterator iter = link.getBendPoints().iterator(); iter.hasNext();) {
-			PageflowLinkBendpoint bendPoint = (PageflowLinkBendpoint) iter
-					.next();
-			PageflowLinkBendpoint newBendPoint = factory
-					.createPFLinkBendpoint();
-			newBendPoint.setD1Height(bendPoint.getD1Height());
-			newBendPoint.setD1Width(bendPoint.getD1Width());
-			newBendPoint.setD2Height(bendPoint.getD2Height());
-			newBendPoint.setD2Width(bendPoint.getD2Width());
-			newLink.getBendPoints().add(newBendPoint);
-		}
-
-		copiedLinks.put(link, link);
-		return newLink;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/Pageflow.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/Pageflow.java
deleted file mode 100644
index b76fdaf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/Pageflow.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>Pageflow</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes <em>Nodes</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks <em>Links</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getConfigfile <em>Configfile</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflow()
- * @model
- * @generated
- */
-public interface Pageflow extends PageflowElement {
-	/**
-	 * Returns the value of the '<em><b>Nodes</b></em>' containment
-	 * reference list. The list contents are of type
-	 * {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Nodes</em>' containment reference list
-	 * isn't clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Nodes</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflow_Nodes()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow
-	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode"
-	 *        opposite="pageflow" containment="true"
-	 * @generated
-	 */
-	EList getNodes();
-
-	/**
-	 * Returns the value of the '<em><b>Links</b></em>' containment
-	 * reference list. The list contents are of type
-	 * {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink}. It
-	 * is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Links</em>' containment reference list
-	 * isn't clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Links</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflow_Links()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow
-	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink"
-	 *        opposite="pageflow" containment="true"
-	 * @generated
-	 */
-	EList getLinks();
-
-	/**
-	 * Returns the value of the '<em><b>Configfile</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Configfile</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Configfile</em>' attribute.
-	 * @see #setConfigfile(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflow_Configfile()
-	 * @model
-	 * @generated
-	 */
-	String getConfigfile();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getConfigfile <em>Configfile</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Configfile</em>' attribute.
-	 * @see #getConfigfile()
-	 * @generated
-	 */
-	void setConfigfile(String value);
-
-	/**
-	 * 
-	 * @param source 
-	 * @param target 
-	 * @param link 
-	 * @generated NOT
-	 */
-	public void connect(PageflowNode source, PageflowNode target, PageflowLink link);
-
-	/**
-	 * 
-	 * @param nodeType 
-	 * @return the default node name
-	 * @generated NOT
-	 */
-	public String getDefaultNodeName(Class nodeType);
-}
-// Pageflow
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowElement.java
deleted file mode 100644
index ba2ee9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowElement.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.ReferenceElement;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>Element</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getName <em>Name</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getComment <em>Comment</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getX <em>X</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getY <em>Y</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getWidth <em>Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getHeight <em>Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement()
- * @model abstract="true"
- * @generated
- */
-public interface PageflowElement extends EObject {
-	/**
-	 * The pageflow model is based on faces-config model, its elements will
-	 * reference faces-config elements with ReferenceElement.
-	 * @return the ref element
-	 * 
-	 * @generated NOT
-	 */
-	public ReferenceElement getFCElements();
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute. The
-	 * default value is <code>"unnamed"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Name()
-	 * @model default="unnamed"
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getName <em>Name</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Comment</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Comment</em>' attribute.
-	 * @see #setComment(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Comment()
-	 * @model
-	 * @generated
-	 */
-	String getComment();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getComment <em>Comment</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Comment</em>' attribute.
-	 * @see #getComment()
-	 * @generated
-	 */
-	void setComment(String value);
-
-	/**
-	 * Returns the value of the '<em><b>X</b></em>' attribute. The default
-	 * value is <code>"0"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>X</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>X</em>' attribute.
-	 * @see #setX(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_X()
-	 * @model default="0"
-	 * @generated
-	 */
-	int getX();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getX <em>X</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>X</em>' attribute.
-	 * @see #getX()
-	 * @generated
-	 */
-	void setX(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Y</b></em>' attribute. The default
-	 * value is <code>"0"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Y</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Y</em>' attribute.
-	 * @see #setY(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Y()
-	 * @model default="0"
-	 * @generated
-	 */
-	int getY();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getY <em>Y</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Y</em>' attribute.
-	 * @see #getY()
-	 * @generated
-	 */
-	void setY(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Width</b></em>' attribute. The
-	 * default value is <code>"-1"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Width</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Width</em>' attribute.
-	 * @see #setWidth(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Width()
-	 * @model default="-1"
-	 * @generated
-	 */
-	int getWidth();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getWidth <em>Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Width</em>' attribute.
-	 * @see #getWidth()
-	 * @generated
-	 */
-	void setWidth(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Height</b></em>' attribute. The
-	 * default value is <code>"-1"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Height</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Height</em>' attribute.
-	 * @see #setHeight(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Height()
-	 * @model default="-1"
-	 * @generated
-	 */
-	int getHeight();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getHeight <em>Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Height</em>' attribute.
-	 * @see #getHeight()
-	 * @generated
-	 */
-	void setHeight(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowElement_Id()
-	 * @model id="true" required="true" volatile="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getId <em>Id</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Reference Link</b></em>' attribute.
-	 * The default value is <code>""</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Reference Link</em>' attribute isn't
-	 * clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Reference Link</em>' attribute.
-	 * @see #setReferenceLink(String)
-	 * @model default="" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='referenceLink'"
-	 * @generated
-	 */
-	String getReferenceLink();
-
-	/**
-	 * Sets the value of the '{@link PageflowElement#getReferenceLink() <em>Reference Link</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Reference Link</em>' attribute.
-	 * @see #getReferenceLink()
-	 * @generated
-	 */
-	void setReferenceLink(String value);
-
-	/**
-	 * @param nofitification 
-	 * @generated NOT
-	 */
-	void notifyModelChanged(Notification nofitification);
-
-	/**
-	 * When the model is modified, the adapters or reference elements should be
-	 * updated.
-	 * 
-	 * @generated NOT
-	 */
-	void update();
-
-	/**
-	 * @generated NOT
-	 */
-	void dispose();
-}
-// PageflowElement
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowFactory.java
deleted file mode 100644
index 3d52525..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowFactory.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc --> The <b>Factory</b> for the model. It provides a
- * create method for each non-abstract class of the model. <!-- end-user-doc -->
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage
- * @generated
- */
-public interface PageflowFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	PageflowFactory eINSTANCE = new org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowFactoryImpl();
-
-	/**
-	 * Returns a new object of class '<em>Pageflow</em>'. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Pageflow</em>'.
-	 * @generated
-	 */
-	Pageflow createPageflow();
-
-	/**
-	 * Returns a new object of class '<em>PF Link</em>'. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>PF Link</em>'.
-	 * @generated
-	 */
-	PageflowLink createPFLink();
-
-	/**
-	 * Returns a new object of class '<em>PF Page</em>'. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>PF Page</em>'.
-	 * @generated
-	 */
-	PageflowPage createPFPage();
-
-	/**
-	 * Returns a new object of class '<em>PF Link Bendpoint</em>'. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>PF Link Bendpoint</em>'.
-	 * @generated
-	 */
-	PageflowLinkBendpoint createPFLinkBendpoint();
-
-	/**
-	 * Returns the package supported by this factory. <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	PageflowPackage getPageflowPackage();
-
-}
-// PageflowFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLink.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLink.java
deleted file mode 100644
index ac22bcd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLink.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import java.util.Vector;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>PF Link</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow <em>Pageflow</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget <em>Target</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource <em>Source</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSmallicon <em>Smallicon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getLargeicon <em>Largeicon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getFromaction <em>Fromaction</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome <em>Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#isRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints <em>Bend Points</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink()
- * @model
- * @generated
- */
-public interface PageflowLink extends PageflowElement {
-	/**
-	 * Returns the value of the '<em><b>Pageflow</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks <em>Links</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Pageflow</em>' container reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Pageflow</em>' container reference.
-	 * @see #setPageflow(Pageflow)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Pageflow()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks
-	 * @model opposite="links" required="true"
-	 * @generated
-	 */
-	Pageflow getPageflow();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow <em>Pageflow</em>}' container reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Pageflow</em>' container reference.
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	void setPageflow(Pageflow value);
-
-	/**
-	 * Returns the value of the '<em><b>Target</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks <em>Inlinks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Target</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Target</em>' reference.
-	 * @see #setTarget(PageflowNode)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Target()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks
-	 * @model opposite="inlinks" required="true"
-	 * @generated
-	 */
-	PageflowNode getTarget();
-
-	/**
-	 * @param path
-	 */
-	void setTargetPath(String path);
-
-	/**
-	 * @param path
-	 */
-	void setSourcePath(String path);
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget <em>Target</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Target</em>' reference.
-	 * @see #getTarget()
-	 * @generated
-	 */
-	void setTarget(PageflowNode value);
-
-	/**
-	 * Returns the value of the '<em><b>Source</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks <em>Outlinks</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Source</em>' reference.
-	 * @see #setSource(PageflowNode)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Source()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks
-	 * @model opposite="outlinks" required="true"
-	 * @generated
-	 */
-	PageflowNode getSource();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource <em>Source</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source</em>' reference.
-	 * @see #getSource()
-	 * @generated
-	 */
-	void setSource(PageflowNode value);
-
-	/**
-	 * Returns the value of the '<em><b>Smallicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Smallicon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Smallicon</em>' attribute.
-	 * @see #setSmallicon(String)
-	 * @model
-	 * @generated
-	 */
-	String getSmallicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSmallicon <em>Smallicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Smallicon</em>' attribute.
-	 * @see #getSmallicon()
-	 * @generated
-	 */
-	void setSmallicon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Largeicon</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Largeicon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Largeicon</em>' attribute.
-	 * @see #setLargeicon(String)
-	 * @model
-	 * @generated
-	 */
-	String getLargeicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getLargeicon <em>Largeicon</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Largeicon</em>' attribute.
-	 * @see #getLargeicon()
-	 * @generated
-	 */
-	void setLargeicon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Fromaction</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Fromaction</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Fromaction</em>' attribute.
-	 * @see #setFromaction(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Fromaction()
-	 * @model
-	 * @generated
-	 */
-	String getFromaction();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getFromaction <em>Fromaction</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Fromaction</em>' attribute.
-	 * @see #getFromaction()
-	 * @generated
-	 */
-	void setFromaction(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Outcome</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Outcome</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Outcome</em>' attribute.
-	 * @see #setOutcome(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Outcome()
-	 * @model
-	 * @generated
-	 */
-	String getOutcome();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome <em>Outcome</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Outcome</em>' attribute.
-	 * @see #getOutcome()
-	 * @generated
-	 */
-	void setOutcome(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Redirect</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Redirect</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Redirect</em>' attribute.
-	 * @see #setRedirect(boolean)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_Redirect()
-	 * @model
-	 * @generated
-	 */
-	boolean isRedirect();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#isRedirect <em>Redirect</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Redirect</em>' attribute.
-	 * @see #isRedirect()
-	 * @generated
-	 */
-	void setRedirect(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Bend Points</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint}.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink <em>Link</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Bend Points</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Bend Points</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLink_BendPoints()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink
-	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLinkBendpoint" opposite="link" containment="true"
-	 * @generated
-	 */
-	EList getBendPoints();
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * insert a new bendpoint to the link 
-	 * @param index 
-	 * @param point 
-	 * <!--end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void insertBendpoint(int index, PageflowLinkBendpoint point);
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * remove the current bendpoint 
-	 * @param index 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void removeBendpoint(int index);
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * Set the current bendpoint 
-	 * 
-	 * @param index 
-	 * @param point 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoint(int index, PageflowLinkBendpoint point);
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * Set a group of bendpoints to reconstruct the link
-	 * @param points 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoints(Vector points);
-
-}
-// PFLink
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLinkBendpoint.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLinkBendpoint.java
deleted file mode 100644
index 4e40709..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowLinkBendpoint.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>PF Link Bendpoint</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Width <em>D1 Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Height <em>D1 Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Width <em>D2 Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Height <em>D2 Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getWeight <em>Weight</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink <em>Link</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint()
- * @model
- * @generated
- */
-public interface PageflowLinkBendpoint extends EObject {
-	/**
-	 * Returns the value of the '<em><b>D1 Width</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>D1 Width</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>D1 Width</em>' attribute.
-	 * @see #setD1Width(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D1Width()
-	 * @model
-	 * @generated
-	 */
-	int getD1Width();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Width <em>D1 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>D1 Width</em>' attribute.
-	 * @see #getD1Width()
-	 * @generated
-	 */
-	void setD1Width(int value);
-
-	/**
-	 * Returns the value of the '<em><b>D1 Height</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>D1 Height</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>D1 Height</em>' attribute.
-	 * @see #setD1Height(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D1Height()
-	 * @model
-	 * @generated
-	 */
-	int getD1Height();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Height <em>D1 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>D1 Height</em>' attribute.
-	 * @see #getD1Height()
-	 * @generated
-	 */
-	void setD1Height(int value);
-
-	/**
-	 * Returns the value of the '<em><b>D2 Width</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>D2 Width</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>D2 Width</em>' attribute.
-	 * @see #setD2Width(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D2Width()
-	 * @model
-	 * @generated
-	 */
-	int getD2Width();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Width <em>D2 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>D2 Width</em>' attribute.
-	 * @see #getD2Width()
-	 * @generated
-	 */
-	void setD2Width(int value);
-
-	/**
-	 * Returns the value of the '<em><b>D2 Height</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>D2 Height</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>D2 Height</em>' attribute.
-	 * @see #setD2Height(int)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_D2Height()
-	 * @model
-	 * @generated
-	 */
-	int getD2Height();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Height <em>D2 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>D2 Height</em>' attribute.
-	 * @see #getD2Height()
-	 * @generated
-	 */
-	void setD2Height(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Weight</b></em>' attribute. The
-	 * default value is <code>"0.5"</code>. <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Weight</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Weight</em>' attribute.
-	 * @see #setWeight(float)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_Weight()
-	 * @model default="0.5"
-	 * @generated
-	 */
-	float getWeight();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getWeight <em>Weight</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Weight</em>' attribute.
-	 * @see #getWeight()
-	 * @generated
-	 */
-	void setWeight(float value);
-
-	/**
-	 * Returns the value of the '<em><b>Link</b></em>' container reference.
-	 * It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints <em>Bend Points</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Link</em>' container reference isn't
-	 * clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Link</em>' container reference.
-	 * @see #setLink(PageflowLink)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFLinkBendpoint_Link()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints
-	 * @model opposite="bendPoints" required="true"
-	 * @generated
-	 */
-	PageflowLink getLink();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink <em>Link</em>}'
-	 * container reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Link</em>' container reference.
-	 * @see #getLink()
-	 * @generated
-	 */
-	void setLink(PageflowLink value);
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the first relative dim 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getFirstRelativeDimension();
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the second relative dim 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getSecondRelativeDimension();
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @param dim1 
-	 * @param dim2 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setRelativeDimensions(Dimension dim1, Dimension dim2);
-
-}
-// PFLinkBendpoint
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowNode.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowNode.java
deleted file mode 100644
index 0559bad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowNode.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.common.util.EList;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>Node</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow <em>Pageflow</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks <em>Outlinks</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks <em>Inlinks</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowNode()
- * @model abstract="true"
- * @generated
- */
-public interface PageflowNode extends PageflowElement {
-	/**
-	 * Returns the value of the '<em><b>Pageflow</b></em>' container
-	 * reference. It is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes <em>Nodes</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Pageflow</em>' container reference isn't
-	 * clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Pageflow</em>' container reference.
-	 * @see #setPageflow(Pageflow)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowNode_Pageflow()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes
-	 * @model opposite="nodes" required="true"
-	 * @generated
-	 */
-	Pageflow getPageflow();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow <em>Pageflow</em>}'
-	 * container reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Pageflow</em>' container
-	 *            reference.
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	void setPageflow(Pageflow value);
-
-	/**
-	 * Returns the value of the '<em><b>Outlinks</b></em>' reference list.
-	 * The list contents are of type
-	 * {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink}. It
-	 * is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource <em>Source</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Outlinks</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Outlinks</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowNode_Outlinks()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource
-	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink"
-	 *        opposite="source"
-	 * @generated
-	 */
-	EList getOutlinks();
-
-	/**
-	 * Returns the value of the '<em><b>Inlinks</b></em>' reference list.
-	 * The list contents are of type
-	 * {@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink}. It
-	 * is bidirectional and its opposite is '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget <em>Target</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Inlinks</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Inlinks</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPageflowNode_Inlinks()
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget
-	 * @model type="org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PFLink"
-	 *        opposite="target"
-	 * @generated
-	 */
-	EList getInlinks();
-
-	/**
-	 * @param target 
-	 * @return the page flow node
-	 * @generated NOT
-	 */
-	PageflowLink findLinkTo(PageflowNode target);
-
-}
-// PageflowNode
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPackage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPackage.java
deleted file mode 100644
index e507142..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPackage.java
+++ /dev/null
@@ -1,1161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc --> The <b>Package</b> for the model. It contains
- * accessors for the meta objects to represent
- * <ul>
- * <li>each class,</li>
- * <li>each feature of each class,</li>
- * <li>each enum,</li>
- * <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory
- * @generated
- */
-public interface PageflowPackage extends EPackage {
-	/**
-	 * The package name. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNAME = "pageflow"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_URI = "http://www.sybase.com/suade/pageflow"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_PREFIX = "pageflow"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	PageflowPackage eINSTANCE = org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl
-			.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl <em>Element</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPageflowElement()
-	 * @generated
-	 */
-	int PAGEFLOW_ELEMENT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__NAME = 0;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__COMMENT = 1;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__X = 2;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__Y = 3;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__WIDTH = 4;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__HEIGHT = 5;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__ID = 6;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT__REFERENCE_LINK = 7;
-
-	/**
-	 * The number of structural features of the the '<em>Element</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_ELEMENT_FEATURE_COUNT = 8;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl <em>Pageflow</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPageflow()
-	 * @generated
-	 */
-	int PAGEFLOW = 0;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__NAME = PAGEFLOW_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__COMMENT = PAGEFLOW_ELEMENT__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__X = PAGEFLOW_ELEMENT__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__Y = PAGEFLOW_ELEMENT__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__WIDTH = PAGEFLOW_ELEMENT__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__HEIGHT = PAGEFLOW_ELEMENT__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__ID = PAGEFLOW_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__REFERENCE_LINK = PAGEFLOW_ELEMENT__REFERENCE_LINK;
-
-	/**
-	 * The feature id for the '<em><b>Nodes</b></em>' containment reference
-	 * list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__NODES = PAGEFLOW_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Links</b></em>' containment reference
-	 * list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__LINKS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Configfile</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW__CONFIGFILE = PAGEFLOW_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the the '<em>Pageflow</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_FEATURE_COUNT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl <em>Node</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPageflowNode()
-	 * @generated
-	 */
-	int PAGEFLOW_NODE = 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__NAME = PAGEFLOW_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__COMMENT = PAGEFLOW_ELEMENT__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__X = PAGEFLOW_ELEMENT__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__Y = PAGEFLOW_ELEMENT__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__WIDTH = PAGEFLOW_ELEMENT__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__HEIGHT = PAGEFLOW_ELEMENT__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__ID = PAGEFLOW_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__REFERENCE_LINK = PAGEFLOW_ELEMENT__REFERENCE_LINK;
-
-	/**
-	 * The feature id for the '<em><b>Pageflow</b></em>' container
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__PAGEFLOW = PAGEFLOW_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Outlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__OUTLINKS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Inlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE__INLINKS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the the '<em>Node</em>' class.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PAGEFLOW_NODE_FEATURE_COUNT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl <em>PF Link</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPFLink()
-	 * @generated
-	 */
-	int PF_LINK = 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__NAME = PAGEFLOW_ELEMENT__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__COMMENT = PAGEFLOW_ELEMENT__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__X = PAGEFLOW_ELEMENT__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__Y = PAGEFLOW_ELEMENT__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__WIDTH = PAGEFLOW_ELEMENT__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__HEIGHT = PAGEFLOW_ELEMENT__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__ID = PAGEFLOW_ELEMENT__ID;
-
-	/**
-	 * The feature id for the '<em><b>Reference Link</b></em>' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__REFERENCE_LINK = PAGEFLOW_ELEMENT__REFERENCE_LINK;
-
-	/**
-	 * The feature id for the '<em><b>Pageflow</b></em>' container
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__PAGEFLOW = PAGEFLOW_ELEMENT_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Target</b></em>' reference. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__TARGET = PAGEFLOW_ELEMENT_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Source</b></em>' reference. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__SOURCE = PAGEFLOW_ELEMENT_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Outcome</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__OUTCOME = PAGEFLOW_ELEMENT_FEATURE_COUNT + 3;
-
-	/**
-	 * The feature id for the '<em><b>Redirect</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__REDIRECT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 4;
-
-	/**
-	 * The feature id for the '<em><b>Bend Points</b></em>' containment
-	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__BEND_POINTS = PAGEFLOW_ELEMENT_FEATURE_COUNT + 5;
-
-	/**
-	 * The feature id for the '<em><b>Smallicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__SMALLICON = PAGEFLOW_ELEMENT_FEATURE_COUNT + 6;
-
-	/**
-	 * The feature id for the '<em><b>Largeicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__LARGEICON = PAGEFLOW_ELEMENT_FEATURE_COUNT + 7;
-
-	/**
-	 * The feature id for the '<em><b>Fromaction</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK__FROMACTION = PAGEFLOW_ELEMENT_FEATURE_COUNT + 8;
-
-	/**
-	 * The number of structural features of the the '<em>PF Link</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_FEATURE_COUNT = PAGEFLOW_ELEMENT_FEATURE_COUNT + 9;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl <em>PF Page</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPFPage()
-	 * @generated
-	 */
-	int PF_PAGE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__NAME = PAGEFLOW_NODE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Comment</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__COMMENT = PAGEFLOW_NODE__COMMENT;
-
-	/**
-	 * The feature id for the '<em><b>X</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__X = PAGEFLOW_NODE__X;
-
-	/**
-	 * The feature id for the '<em><b>Y</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__Y = PAGEFLOW_NODE__Y;
-
-	/**
-	 * The feature id for the '<em><b>Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__WIDTH = PAGEFLOW_NODE__WIDTH;
-
-	/**
-	 * The feature id for the '<em><b>Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__HEIGHT = PAGEFLOW_NODE__HEIGHT;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__ID = PAGEFLOW_NODE__ID;
-
-	/**
-	 * The feature id for the '<em><b>Pageflow</b></em>' container
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__PAGEFLOW = PAGEFLOW_NODE__PAGEFLOW;
-
-	/**
-	 * The feature id for the '<em><b>Outlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__OUTLINKS = PAGEFLOW_NODE__OUTLINKS;
-
-	/**
-	 * The feature id for the '<em><b>Inlinks</b></em>' reference list.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__INLINKS = PAGEFLOW_NODE__INLINKS;
-
-	/**
-	 * The feature id for the '<em><b>Path</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__PATH = PAGEFLOW_NODE_FEATURE_COUNT + 0;
-
-	/**
-	 * The feature id for the '<em><b>Smallicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__SMALLICON = PAGEFLOW_NODE_FEATURE_COUNT + 1;
-
-	/**
-	 * The feature id for the '<em><b>Largeicon</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE__LARGEICON = PAGEFLOW_NODE_FEATURE_COUNT + 2;
-
-	/**
-	 * The number of structural features of the the '<em>PF Page</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_PAGE_FEATURE_COUNT = PAGEFLOW_NODE_FEATURE_COUNT + 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl <em>PF Link Bendpoint</em>}'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl#getPFLinkBendpoint()
-	 * @generated
-	 */
-	int PF_LINK_BENDPOINT = 8;
-
-	/**
-	 * The feature id for the '<em><b>D1 Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D1_WIDTH = 0;
-
-	/**
-	 * The feature id for the '<em><b>D1 Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D1_HEIGHT = 1;
-
-	/**
-	 * The feature id for the '<em><b>D2 Width</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D2_WIDTH = 2;
-
-	/**
-	 * The feature id for the '<em><b>D2 Height</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__D2_HEIGHT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Weight</b></em>' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__WEIGHT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Link</b></em>' container reference.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT__LINK = 5;
-
-	/**
-	 * The number of structural features of the the '<em>PF Link Bendpoint</em>'
-	 * class. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int PF_LINK_BENDPOINT_FEATURE_COUNT = 6;
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Pageflow</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow
-	 * @generated
-	 */
-	EClass getPageflow();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes <em>Nodes</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Nodes</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getNodes()
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	EReference getPageflow_Nodes();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks <em>Links</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Links</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getLinks()
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	EReference getPageflow_Links();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getConfigfile <em>Configfile</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Configfile</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow#getConfigfile()
-	 * @see #getPageflow()
-	 * @generated
-	 */
-	EAttribute getPageflow_Configfile();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode <em>Node</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Node</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode
-	 * @generated
-	 */
-	EClass getPageflowNode();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the container reference '<em>Pageflow</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getPageflow()
-	 * @see #getPageflowNode()
-	 * @generated
-	 */
-	EReference getPageflowNode_Pageflow();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks <em>Outlinks</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference list '<em>Outlinks</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getOutlinks()
-	 * @see #getPageflowNode()
-	 * @generated
-	 */
-	EReference getPageflowNode_Outlinks();
-
-	/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks <em>Inlinks</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference list '<em>Inlinks</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode#getInlinks()
-	 * @see #getPageflowNode()
-	 * @generated
-	 */
-	EReference getPageflowNode_Inlinks();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink <em>PF Link</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>PF Link</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink
-	 * @generated
-	 */
-	EClass getPFLink();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the container reference '<em>Pageflow</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getPageflow()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_Pageflow();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget <em>Target</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference '<em>Target</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getTarget()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_Target();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource <em>Source</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference '<em>Source</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getSource()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_Source();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome <em>Outcome</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Outcome</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EAttribute getPFLink_Outcome();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome <em>Outcome</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Outcome</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getOutcome()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EAttribute getPFLink_Fromaction();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#isRedirect <em>Redirect</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Redirect</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#isRedirect()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EAttribute getPFLink_Redirect();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints <em>Bend Points</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Bend Points</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink#getBendPoints()
-	 * @see #getPFLink()
-	 * @generated
-	 */
-	EReference getPFLink_BendPoints();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement <em>Element</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Element</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement
-	 * @generated
-	 */
-	EClass getPageflowElement();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getName()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Name();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getComment <em>Comment</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Comment</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getComment()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Comment();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getX <em>X</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>X</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getX()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_X();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getY <em>Y</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Y</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getY()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Y();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getWidth <em>Width</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Width</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getWidth()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getHeight <em>Height</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Height</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getHeight()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Height();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement#getId()
-	 * @see #getPageflowElement()
-	 * @generated
-	 */
-	EAttribute getPageflowElement_Id();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage <em>PF Page</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>PF Page</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage
-	 * @generated
-	 */
-	EClass getPFPage();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath <em>Path</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Path</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath()
-	 * @see #getPFPage()
-	 * @generated
-	 */
-	EAttribute getPFPage_Path();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon <em>Smallicon</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Smallicon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon()
-	 * @see #getPFPage()
-	 * @generated
-	 */
-	EAttribute getPFPage_Smallicon();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon <em>Largeicon</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Largeicon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon()
-	 * @see #getPFPage()
-	 * @generated
-	 */
-	EAttribute getPFPage_Largeicon();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint <em>PF Link Bendpoint</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>PF Link Bendpoint</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint
-	 * @generated
-	 */
-	EClass getPFLinkBendpoint();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Width <em>D1 Width</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D1 Width</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Width()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D1Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Height <em>D1 Height</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D1 Height</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD1Height()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D1Height();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Width <em>D2 Width</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D2 Width</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Width()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D2Width();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Height <em>D2 Height</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>D2 Height</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getD2Height()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_D2Height();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getWeight <em>Weight</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Weight</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getWeight()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EAttribute getPFLinkBendpoint_Weight();
-
-	/**
-	 * Returns the meta object for the container reference '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink <em>Link</em>}'.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the container reference '<em>Link</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint#getLink()
-	 * @see #getPFLinkBendpoint()
-	 * @generated
-	 */
-	EReference getPFLinkBendpoint_Link();
-
-	/**
-	 * Returns the factory that creates the instances of the model. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	PageflowFactory getPageflowFactory();
-
-}
-// PageflowPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPage.java
deleted file mode 100644
index b6cecb5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/PageflowPage.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model;
-
-/**
- * <!-- begin-user-doc --> A representation of the model object '<em><b>PF Page</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath <em>Path</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon <em>Smallicon</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon <em>Largeicon</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage()
- * @model
- * @generated
- */
-public interface PageflowPage extends PageflowNode {
-	/**
-	 * Returns the value of the '<em><b>Path</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Path</em>' attribute isn't clear, there
-	 * really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Path</em>' attribute.
-	 * @see #setPath(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Path()
-	 * @model
-	 * @generated
-	 */
-	String getPath();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getPath <em>Path</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Path</em>' attribute.
-	 * @see #getPath()
-	 * @generated
-	 */
-	void setPath(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Smallicon</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Smallicon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Smallicon</em>' attribute.
-	 * @see #setSmallicon(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Smallicon()
-	 * @model
-	 * @generated
-	 */
-	String getSmallicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getSmallicon <em>Smallicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Smallicon</em>' attribute.
-	 * @see #getSmallicon()
-	 * @generated
-	 */
-	void setSmallicon(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Largeicon</b></em>' attribute. <!--
-	 * begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Largeicon</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Largeicon</em>' attribute.
-	 * @see #setLargeicon(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#getPFPage_Largeicon()
-	 * @model
-	 * @generated
-	 */
-	String getLargeicon();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage#getLargeicon <em>Largeicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @param value
-	 *            the new value of the '<em>Largeicon</em>' attribute.
-	 * @see #getLargeicon()
-	 * @generated
-	 */
-	void setLargeicon(String value);
-
-}
-// PFPage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/LinkReferenceElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/LinkReferenceElement.java
deleted file mode 100644
index 0ed483c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/LinkReferenceElement.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.TransformUtil;
-
-/**
- * The reference element represents a mapping from pageflow link to a navigation
- * case.
- * 
- * @author hmeng
- */
-
-public class LinkReferenceElement extends ReferenceElement {
-
-	public void add(EObject object) {
-		Assert.isTrue(object instanceof NavigationCaseType);
-		clear();
-		super.add(object);
-	}
-
-	/**
-	 * @param pageflowElement
-	 */
-	public LinkReferenceElement(PageflowElement pageflowElement) {
-		super(pageflowElement);
-	}
-
-	/**
-	 * @param pageflowElement
-	 * @param facesConfigObject
-	 */
-	public LinkReferenceElement(PageflowElement pageflowElement,
-			EObject facesConfigObject) {
-		super(pageflowElement, facesConfigObject);
-	}
-
-	public void update() {
-		for (Iterator nodes = getData().iterator(); nodes.hasNext();) {
-			Object next = nodes.next();
-			if (!TransformUtil.isValidFacesConfigElement((EObject) next)) {
-				nodes.remove();
-			}
-		}
-	}
-
-	public Object get(int eFeature) {
-		Object result = null;
-		switch (eFeature) {
-		case PageflowPackage.PF_LINK__COMMENT:
-			break;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			if (!isEmpty()) {
-				FromOutcomeType outcome = ((NavigationCaseType) getData()
-						.get(0)).getFromOutcome();
-				if (outcome != null) {
-					result = outcome.getTextContent();
-				}
-			}
-			break;
-		case PageflowPackage.PF_LINK__NAME:
-			break;
-		case PageflowPackage.PF_LINK__REDIRECT:
-			result = new Boolean(false);
-			if (!isEmpty()) {
-				RedirectType outcome = ((NavigationCaseType) getData().get(0))
-						.getRedirect();
-				if (outcome != null) {
-					result = new Boolean(true);
-				}
-			}
-			break;
-
-		case PageflowPackage.PF_LINK__FROMACTION:
-			if (!isEmpty()) {
-				FromActionType fromActionType = ((NavigationCaseType) getData()
-						.get(0)).getFromAction();
-				if (fromActionType != null) {
-					result = fromActionType.getTextContent();
-				}
-			}
-			break;
-		case PageflowPackage.PF_LINK__SMALLICON:
-			if (!isEmpty()) {
-				List icons = ((NavigationCaseType) getData().get(0)).getIcon();
-				if (icons.size() > 0) {
-					result = ((IconType) icons.get(0)).getSmallIcon() != null ? ((IconType) icons
-							.get(0)).getSmallIcon().getTextContent()
-							: null;
-				}
-			}
-			break;
-		case PageflowPackage.PF_LINK__LARGEICON:
-			if (!isEmpty()) {
-				List icons = ((NavigationCaseType) getData().get(0)).getIcon();
-				if (icons.size() > 0) {
-					result = ((IconType) icons.get(0)).getLargeIcon() != null ? ((IconType) icons
-							.get(0)).getLargeIcon().getTextContent()
-							: null;
-				}
-			}
-			break;
-		}
-		return result;
-	}
-
-	public void set(EStructuralFeature eFeature, Object newVal) {
-		switch (eFeature.getFeatureID()) {
-		case PageflowPackage.PF_LINK__COMMENT:
-			break;
-		case PageflowPackage.PF_LINK__OUTCOME: {
-			FromOutcomeType oldOutcome = null;
-			FromOutcomeType newOutcome = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				oldOutcome = ((NavigationCaseType) getData().get(0))
-						.getFromOutcome();
-				if (newValue == null || newValue.length() == 0) {
-					((NavigationCaseType) getData().get(0))
-							.setFromOutcome(null);
-				} else {
-					if (oldOutcome == null) {
-						newOutcome = FacesConfigFactory.eINSTANCE
-								.createFromOutcomeType();
-						newOutcome.setTextContent(newValue);
-						((NavigationCaseType) getData().get(0))
-								.setFromOutcome(newOutcome);
-					} else {
-						oldOutcome.setTextContent(newValue);
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_LINK__NAME:
-			break;
-		case PageflowPackage.PF_LINK__REDIRECT:
-			RedirectType redirect = null;
-			RedirectType oldRedirect = null;
-			boolean newRedirect = ((Boolean) newVal).booleanValue();
-			if (!isEmpty()) {
-				oldRedirect = ((NavigationCaseType) getData().get(0))
-						.getRedirect();
-				if (!newRedirect) {
-					redirect = null;
-				} else {
-					if (oldRedirect == null) {
-						redirect = FacesConfigFactory.eINSTANCE
-								.createRedirectType();
-					}
-				}
-				((NavigationCaseType) getData().get(0)).setRedirect(redirect);
-			}
-			break;
-		case PageflowPackage.PF_LINK__FROMACTION:
-			FromActionType oldFromActionType,
-			newFromActionType;
-			String newFromaction = (String) newVal;
-			if (!isEmpty()) {
-				oldFromActionType = ((NavigationCaseType) getData().get(0))
-						.getFromAction();
-				if (newFromaction == null || newFromaction.length() == 0) {
-					((NavigationCaseType) getData().get(0)).setFromAction(null);
-				} else {
-					if (oldFromActionType == null) {
-						newFromActionType = FacesConfigFactory.eINSTANCE
-								.createFromActionType();
-						newFromActionType.setTextContent(newFromaction);
-						((NavigationCaseType) getData().get(0))
-								.setFromAction(newFromActionType);
-					} else {
-						oldFromActionType.setTextContent(newFromaction);
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_LINK__SMALLICON: {
-			SmallIconType oldSmallicon = null;
-			SmallIconType newSmallIconType = null;
-			IconType icon = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				List icons = ((NavigationCaseType) getData().get(0)).getIcon();
-				if (newValue == null || newValue.length() == 0) {
-					if (icons.size() > 0) {
-						if (((IconType) icons.get(0)).getSmallIcon() != null) {
-							((IconType) icons.get(0)).setSmallIcon(null);
-						}
-					}
-				} else {
-					if (icons.size() == 0) {
-						icon = FacesConfigFactory.eINSTANCE.createIconType();
-						newSmallIconType = FacesConfigFactory.eINSTANCE
-								.createSmallIconType();
-						newSmallIconType.setTextContent(newValue);
-						icon.setSmallIcon(newSmallIconType);
-						icons.add(icon);
-					} else if (((IconType) icons.get(0)).getSmallIcon() == null) {
-						newSmallIconType = FacesConfigFactory.eINSTANCE
-								.createSmallIconType();
-						newSmallIconType.setTextContent(newValue);
-						icon = ((IconType) icons.get(0));
-						icon.setSmallIcon(newSmallIconType);
-					} else {
-						oldSmallicon = ((IconType) icons.get(0)).getSmallIcon();
-						oldSmallicon.setTextContent(newValue);
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_LINK__LARGEICON: {
-			String newValue = (String) newVal;
-			LargeIconType oldLargeIcon = null;
-			LargeIconType newLargeIconType = null;
-			IconType icon = null;
-			if (!isEmpty()) {
-				List icons = ((NavigationCaseType) getData().get(0)).getIcon();
-				if (newValue == null || newValue.length() == 0) {
-					if (icons.size() > 0) {
-						if (((IconType) icons.get(0)).getLargeIcon() != null) {
-							((IconType) icons.get(0)).setLargeIcon(null);
-						}
-					}
-				} else {
-					if (icons.size() == 0) {
-						icon = FacesConfigFactory.eINSTANCE.createIconType();
-						newLargeIconType = FacesConfigFactory.eINSTANCE
-								.createLargeIconType();
-						newLargeIconType.setTextContent(newValue);
-						icon.setLargeIcon(newLargeIconType);
-						icons.add(icon);
-					} else if (((IconType) icons.get(0)).getLargeIcon() == null) {
-						newLargeIconType = FacesConfigFactory.eINSTANCE
-								.createLargeIconType();
-						newLargeIconType.setTextContent(newValue);
-						icon = ((IconType) icons.get(0));
-						icon.setLargeIcon(newLargeIconType);
-					} else {
-						oldLargeIcon = ((IconType) icons.get(0)).getLargeIcon();
-						oldLargeIcon.setTextContent(newValue);
-					}
-				}
-			}
-			break;
-		}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageReferenceElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageReferenceElement.java
deleted file mode 100644
index 0a81af6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageReferenceElement.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.FC2PFTransformer;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.TransformUtil;
-
-/**
- * The reference element represents a mapping from pageflow page to one or more
- * navigation rules/cases's view IDs (fromViewID or toViewID).
- * 
- * @author hmeng
- */
-
-public class PageReferenceElement extends ReferenceElement {
-
-	/**
-	 * @param pageflowElement
-	 */
-	public PageReferenceElement(PageflowElement pageflowElement) {
-		super(pageflowElement);
-	}
-
-	/**
-	 * @param pageflowElement
-	 * @param facesConfigObject
-	 */
-	public PageReferenceElement(PageflowElement pageflowElement,
-			EObject facesConfigObject) {
-		super(pageflowElement, facesConfigObject);
-	}
-
-	public void add(EObject object) {
-		Assert.isTrue(object instanceof FromViewIdType
-				|| object instanceof ToViewIdType);
-		super.add(object);
-	}
-
-	public void update() {
-		outer: for (Iterator nodes = getData().iterator(); nodes.hasNext();) {
-			Object next = nodes.next();
-			if (next instanceof FromViewIdType) {
-				if (!TransformUtil.isValidFacesConfigElement((EObject) next)) {
-					nodes.remove();
-					continue;
-				}
-				List links = ((PageflowPage) pageflowElement).getOutlinks();
-				for (int i = 0; i < links.size(); i++) {
-					PageflowLink link = (PageflowLink) links.get(i);
-					if (!link.getFCElements().isEmpty()
-							&& TransformUtil
-									.isValidFacesConfigElement((NavigationCaseType) ((PageflowLink) links
-											.get(i)).getFCElements().getData()
-											.get(0))) {
-						NavigationRuleType rule = (NavigationRuleType) ((NavigationCaseType) ((PageflowLink) links
-								.get(i)).getFCElements().getData().get(0))
-								.eContainer();
-						if (rule == null || rule.getFromViewId() == next) {
-							// There navigation case
-							// matching this end.
-							continue outer;
-						}
-					}
-				}
-				// No case contains this end.
-				nodes.remove();
-			} else if (next instanceof ToViewIdType) {
-				if (!TransformUtil.isValidFacesConfigElement((EObject) next)) {
-					nodes.remove();
-					continue;
-				}
-				// Verify this is case end.
-				List links = ((PageflowPage) pageflowElement).getInlinks();
-				for (int i = 0; i < links.size(); i++) {
-					PageflowLink link = (PageflowLink) links.get(i);
-					if (!link.getFCElements().isEmpty()
-							&& TransformUtil
-									.isValidFacesConfigElement((NavigationCaseType) link
-											.getFCElements().getData().get(0))) {
-						if (((NavigationCaseType) ((PageflowLink) links.get(i))
-								.getFCElements().getData().get(0))
-								.getToViewId() == next) {
-							// There navigation case
-							// matching this end.
-							continue outer;
-						}
-					}
-				}
-				// No case contains this end.
-				nodes.remove();
-			}
-		}
-	}
-
-	public Object get(int eFeature) {
-		Object result = null;
-		switch (eFeature) {
-		case PageflowPackage.PF_PAGE__COMMENT:
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List descriptions = rule.getDescription();
-						if (descriptions.size() > 0) {
-							result = ((DescriptionType) descriptions.get(0))
-									.getTextContent();
-							break;
-						}
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List icons = rule.getIcon();
-						if (icons.size() > 0) {
-							result = ((IconType) icons.get(0)).getLargeIcon() != null ? ((IconType) icons
-									.get(0)).getLargeIcon().getTextContent()
-									: null;
-							break;
-						}
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__NAME:
-			// To see if it is in navigation rule.
-			if (!isEmpty() && !isEndOnly()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List displaynames = rule.getDisplayName();
-						if (displaynames.size() > 0) {
-							result = ((DisplayNameType) displaynames.get(0))
-									.getTextContent();
-							break;
-						}
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__PATH:
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					if (getData().get(i) instanceof FromViewIdType) {
-						result = ((FromViewIdType) getData().get(i))
-								.getTextContent();
-						break;
-					}
-				}
-				if (result == null && getData().get(0) instanceof ToViewIdType) {
-					result = ((ToViewIdType) getData().get(0)).getTextContent();
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List icons = rule.getIcon();
-						if (icons.size() > 0) {
-							result = ((IconType) icons.get(0)).getSmallIcon() != null ? ((IconType) icons
-									.get(0)).getSmallIcon().getTextContent()
-									: null;
-							break;
-						}
-					}
-				}
-			}
-			break;
-		}
-		return result;
-	}
-
-	private NavigationRuleType resolveRuleFromFCElement(Object object) {
-		if (object instanceof FromViewIdType) {
-			return (NavigationRuleType) ((FromViewIdType) object).eContainer();
-		}
-		return null;
-	}
-
-	private NavigationRuleType resolveRuleFromPFElement(Object object) {
-		if (object instanceof PageflowLink) {
-			NavigationCaseType caseType = (NavigationCaseType) ((PageflowLink) object)
-					.getFCElements().getData().get(0);
-			return (NavigationRuleType) caseType.eContainer();
-		}
-		return null;
-	}
-
-	public void set(EStructuralFeature eFeature, Object newVal) {
-		switch (eFeature.getFeatureID()) {
-		case PageflowPackage.PF_PAGE__COMMENT: {
-			DescriptionType description = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						rule.getDescription().clear();
-						description = FacesConfigFactory.eINSTANCE
-								.createDescriptionType();
-						description.setTextContent(newValue);
-						rule.getDescription().add(description);
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_PAGE__LARGEICON: {
-			LargeIconType oldLargeIcon = null;
-			LargeIconType newLargeIconType = null;
-			IconType icon = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List icons = rule.getIcon();
-						if (newValue == null || newValue.length() == 0) {
-							if (icons.size() > 0) {
-								if (((IconType) icons.get(0)).getLargeIcon() != null) {
-									((IconType) icons.get(0))
-											.setLargeIcon(null);
-								}
-							}
-						} else {
-							if (icons.size() == 0) {
-								icon = FacesConfigFactory.eINSTANCE
-										.createIconType();
-								newLargeIconType = FacesConfigFactory.eINSTANCE
-										.createLargeIconType();
-								newLargeIconType.setTextContent(newValue);
-								icon.setLargeIcon(newLargeIconType);
-								icons.add(icon);
-							} else if (((IconType) icons.get(0)).getLargeIcon() == null) {
-								newLargeIconType = FacesConfigFactory.eINSTANCE
-										.createLargeIconType();
-								newLargeIconType.setTextContent(newValue);
-								icon = ((IconType) icons.get(0));
-								icon.setLargeIcon(newLargeIconType);
-							} else {
-								oldLargeIcon = ((IconType) icons.get(0))
-										.getLargeIcon();
-								oldLargeIcon.setTextContent(newValue);
-							}
-						}
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_PAGE__NAME:
-			DisplayNameType newDisplayNameType = null;
-			String newName = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						rule.getDisplayName().clear();
-						if (newName != null && newName.length() > 0) {
-							newDisplayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							newDisplayNameType.setTextContent(newName);
-							rule.getDisplayName().add(newDisplayNameType);
-						}
-					}
-				}
-			}
-			break;
-		case PageflowPackage.PF_PAGE__PATH: {
-			Object oldPath = null;
-			Object newPath = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					if (getData().get(i) instanceof FromViewIdType) {
-						oldPath = getData().get(i);
-						((FromViewIdType) oldPath).setTextContent(newValue);
-					} else if (getData().get(i) instanceof ToViewIdType) {
-						oldPath = getData().get(i);
-						((ToViewIdType) oldPath).setTextContent(newValue);
-					}
-				}
-			}
-			// Create new fromViewID or toViewID node as needed.
-			else if (newValue != null && !"*".equals(newValue)) { //$NON-NLS-1$
-				if (((PageflowPage) pageflowElement).getOutlinks().size() > 0) {
-					List links = ((PageflowPage) pageflowElement).getOutlinks();
-					for (int i = 0, n = links.size(); i < n; i++) {
-						PageflowLink link = (PageflowLink) links.get(i);
-						NavigationRuleType rule = resolveRuleFromPFElement(link);
-						newPath = FC2PFTransformer.createRLFromViewID(newValue);
-						rule.setFromViewId((FromViewIdType) newPath);
-						add((EObject) newPath);
-					}
-					links = ((PageflowPage) pageflowElement).getInlinks();
-					for (int i = 0, n = links.size(); i < n; i++) {
-						PageflowLink link = (PageflowLink) links.get(i);
-						NavigationCaseType caseType = (NavigationCaseType) link
-								.getFCElements().getData().get(0);
-						newPath = FC2PFTransformer.createFCToViewID(newValue);
-						caseType.setToViewId((ToViewIdType) newPath);
-						add((EObject) newPath);
-					}
-				}
-			}
-			break;
-		}
-		case PageflowPackage.PF_PAGE__SMALLICON: {
-			SmallIconType oldSmallicon = null;
-			SmallIconType newSmallIconType = null;
-			IconType icon = null;
-			String newValue = (String) newVal;
-			if (!isEmpty()) {
-				for (int i = 0, n = getData().size(); i < n; i++) {
-					NavigationRuleType rule = null;
-					if ((rule = resolveRuleFromFCElement(getData().get(i))) != null) {
-						List icons = rule.getIcon();
-						if (newValue == null || newValue.length() == 0) {
-							if (icons.size() > 0) {
-								if (((IconType) icons.get(0)).getSmallIcon() != null) {
-									((IconType) icons.get(0))
-											.setSmallIcon(null);
-								}
-							}
-						} else {
-							if (icons.size() == 0) {
-								icon = FacesConfigFactory.eINSTANCE
-										.createIconType();
-								newSmallIconType = FacesConfigFactory.eINSTANCE
-										.createSmallIconType();
-								newSmallIconType.setTextContent(newValue);
-								icon.setSmallIcon(newSmallIconType);
-								icons.add(icon);
-							} else if (((IconType) icons.get(0)).getSmallIcon() == null) {
-								newSmallIconType = FacesConfigFactory.eINSTANCE
-										.createSmallIconType();
-								newSmallIconType.setTextContent(newValue);
-								icon = ((IconType) icons.get(0));
-								icon.setSmallIcon(newSmallIconType);
-							} else {
-								oldSmallicon = ((IconType) icons.get(0))
-										.getSmallIcon();
-								oldSmallicon.setTextContent(newValue);
-							}
-						}
-					}
-				}
-			}
-			break;
-		}
-		}
-	}
-
-	/**
-	 * @return true if none of the data are from view id's
-	 */
-	public boolean isEndOnly() {
-		for (int i = 0, n = getData().size(); i < n; i++) {
-			if (getData().get(i) instanceof FromViewIdType) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowElementImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowElementImpl.java
deleted file mode 100644
index 6948fd7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowElementImpl.java
+++ /dev/null
@@ -1,616 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization.TransformUtil;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getName <em>Name</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getComment <em>Comment</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getX <em>X</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getY <em>Y</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getWidth <em>Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getHeight <em>Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowElementImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public abstract class PageflowElementImpl extends EObjectImpl implements
-		PageflowElement {
-	private static final String idPrefix = "pf"; //$NON-NLS-1$
-
-	/**
-	 * @generated NOT
-	 */
-	private String id;
-
-	/**
-	 * @generated NOT
-	 */
-	private static int counter = 0;
-
-	/**
-	 * the reference element
-	 */
-	protected ReferenceElement refElement;
-
-	/**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NAME_EDEFAULT = "unnamed"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String name = NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getComment() <em>Comment</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getComment()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String COMMENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getComment() <em>Comment</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getComment()
-	 * @generated
-	 * @ordered
-	 */
-	protected String comment = COMMENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getX() <em>X</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getX()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int X_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getX() <em>X</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getX()
-	 * @generated
-	 * @ordered
-	 */
-	protected int x = X_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getY() <em>Y</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getY()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int Y_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getY() <em>Y</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getY()
-	 * @generated
-	 * @ordered
-	 */
-	protected int y = Y_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWidth() <em>Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int WIDTH_EDEFAULT = -1;
-
-	/**
-	 * The cached value of the '{@link #getWidth() <em>Width</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected int width = WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getHeight() <em>Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int HEIGHT_EDEFAULT = -1;
-
-	/**
-	 * The default value of the '{@link #getReferenceLink() <em>Reference Link</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getReferenceLink()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String REFERENCE_LINK_EDEFAULT = ""; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getReferenceLink() <em>Reference Link</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getReferenceLink()
-	 * @generated
-	 * @ordered
-	 */
-	protected String referenceLink = REFERENCE_LINK_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getHeight() <em>Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected int height = HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowElementImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPageflowElement();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getName() {
-		return name == null || name.length() == 0 ? NAME_EDEFAULT : name;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__NAME, oldName, name));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getComment() {
-		return comment;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setComment(String newComment) {
-		String oldComment = comment;
-		comment = newComment;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__COMMENT, oldComment,
-					comment));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getX() {
-		return x;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setX(int newX) {
-		int oldX = x;
-		x = newX;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__X, oldX, x));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getY() {
-		return y;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setY(int newY) {
-		int oldY = y;
-		y = newY;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__Y, oldY, y));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getWidth() {
-		return width;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setWidth(int newWidth) {
-		int oldWidth = width;
-		width = newWidth;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__WIDTH, oldWidth, width));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getHeight() {
-		return height;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setHeight(int newHeight) {
-		int oldHeight = height;
-		height = newHeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT, oldHeight, height));
-	}
-
-	/**
-	 * Generate (and cache) an id as needed
-	 * 
-	 * @generated NOT
-	 */
-	public String getId() {
-		if (id == null) {
-			id = generateId();
-		}
-		return id;
-	}
-
-	/**
-	 * Generate a random id based on the current time
-	 * 
-	 * @return the generated id
-	 * 
-	 * @generated NOT
-	 */
-	public synchronized String generateId() {
-		long current = System.currentTimeMillis();
-		return idPrefix + current + counter++;
-	}
-
-	/**
-	 * Set or generate an Id This method should not be called except when
-	 * populating from the serialization
-	 * 
-	 * @generated NOT
-	 */
-	public void setId(String newId) {
-		if (newId == null && id == null) {
-			id = generateId();
-		} else {
-			id = newId;
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getReferenceLink() {
-		return referenceLink;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setReferenceLink(String newReferenceLink) {
-		String oldReferenceLink = referenceLink;
-		referenceLink = newReferenceLink;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK,
-					oldReferenceLink, referenceLink));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			return getName();
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			return getComment();
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			return new Integer(getX());
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			return new Integer(getY());
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			return getId();
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			return getReferenceLink();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			setReferenceLink((String) newValue);
-			return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			setReferenceLink(REFERENCE_LINK_EDEFAULT);
-			return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_ELEMENT__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PAGEFLOW_ELEMENT__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PAGEFLOW_ELEMENT__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_ELEMENT__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PAGEFLOW_ELEMENT__REFERENCE_LINK:
-			return REFERENCE_LINK_EDEFAULT == null ? referenceLink != null
-					: !REFERENCE_LINK_EDEFAULT.equals(referenceLink);
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: "); //$NON-NLS-1$
-		result.append(name);
-		result.append(", comment: "); //$NON-NLS-1$
-		result.append(comment);
-		result.append(", x: "); //$NON-NLS-1$
-		result.append(x);
-		result.append(", y: "); //$NON-NLS-1$
-		result.append(y);
-		result.append(", width: "); //$NON-NLS-1$
-		result.append(width);
-		result.append(", height: "); //$NON-NLS-1$
-		result.append(height);
-		result.append(", referenceLink: "); //$NON-NLS-1$
-		result.append(referenceLink);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * The synchronizer will use this to notify adapters for the faces-config's
-	 * modification.
-	 * 
-	 * @generated NOT
-	 */
-	public void notifyModelChanged(Notification notification) {
-		if (eNotificationRequired())
-			eNotify(notification);
-	}
-
-	/**
-	 * @generated NOT
-	 */
-
-	public ReferenceElement getFCElements() {
-		return null;
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public void update() {
-		getFCElements().update();
-		if (!TransformUtil.isValidPageflowElement(this)) {
-			eAdapters().clear();
-		}
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public void dispose() {
-		getFCElements().dispose();
-		eAdapters.clear();
-	}
-
-}
-// PageflowElementImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowFactoryImpl.java
deleted file mode 100644
index aabbe3e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowFactoryImpl.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model <b>Factory</b>. <!--
- * end-user-doc -->
- * 
- * @generated
- */
-public class PageflowFactoryImpl extends EFactoryImpl implements
-		PageflowFactory {
-	/**
-	 * Creates and instance of the factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-		case PageflowPackage.PAGEFLOW:
-			return createPageflow();
-		case PageflowPackage.PF_LINK:
-			return createPFLink();
-		case PageflowPackage.PF_PAGE:
-			return createPFPage();
-		case PageflowPackage.PF_LINK_BENDPOINT:
-			return createPFLinkBendpoint();
-		default:
-			throw new IllegalArgumentException("The class '" + eClass.getName() //$NON-NLS-1$
-					+ "' is not a valid classifier"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Pageflow createPageflow() {
-		PageflowImpl pageflow = new PageflowImpl();
-		return pageflow;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowLink createPFLink() {
-		PageflowLinkImpl pfLink = new PageflowLinkImpl();
-		return pfLink;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowPage createPFPage() {
-		PageflowPageImpl pfPage = new PageflowPageImpl();
-		return pfPage;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowLinkBendpoint createPFLinkBendpoint() {
-		PageflowLinkBendpointImpl pfLinkBendpoint = new PageflowLinkBendpointImpl();
-		return pfLinkBendpoint;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowPackage getPageflowPackage() {
-		return (PageflowPackage) getEPackage();
-	}
-}
-// PageflowFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowImpl.java
deleted file mode 100644
index f637ac2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowImpl.java
+++ /dev/null
@@ -1,472 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Pageflow</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl#getNodes <em>Nodes</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl#getLinks <em>Links</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowImpl#getConfigfile <em>Configfile</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class PageflowImpl extends PageflowElementImpl implements Pageflow {
-
-	/**
-	 * The cached value of the '{@link #getNodes() <em>Nodes</em>}'
-	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getNodes()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList nodes = null;
-
-	/**
-	 * The cached value of the '{@link #getLinks() <em>Links</em>}'
-	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getLinks()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList links = null;
-
-	/**
-	 * The default value of the '{@link #getConfigfile() <em>Configfile</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getConfigfile()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String CONFIGFILE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getConfigfile() <em>Configfile</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getConfigfile()
-	 * @generated
-	 * @ordered
-	 */
-	protected String configfile = CONFIGFILE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPageflow();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getNodes() {
-		if (nodes == null) {
-			nodes = new EObjectContainmentWithInverseEList(PageflowNode.class,
-					this, PageflowPackage.PAGEFLOW__NODES,
-					PageflowPackage.PAGEFLOW_NODE__PAGEFLOW);
-		}
-		return nodes;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getLinks() {
-		if (links == null) {
-			links = new EObjectContainmentWithInverseEList(PageflowLink.class,
-					this, PageflowPackage.PAGEFLOW__LINKS,
-					PageflowPackage.PF_LINK__PAGEFLOW);
-		}
-		return links;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getConfigfile() {
-		return configfile;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setConfigfile(String newConfigfile) {
-		String oldConfigfile = configfile;
-		configfile = newConfigfile;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW__CONFIGFILE, oldConfigfile,
-					configfile));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW__NODES:
-				return ((InternalEList) getNodes()).basicAdd(otherEnd, msgs);
-			case PageflowPackage.PAGEFLOW__LINKS:
-				return ((InternalEList) getLinks()).basicAdd(otherEnd, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW__NODES:
-				return ((InternalEList) getNodes()).basicRemove(otherEnd, msgs);
-			case PageflowPackage.PAGEFLOW__LINKS:
-				return ((InternalEList) getLinks()).basicRemove(otherEnd, msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			return getName();
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			return getComment();
-		case PageflowPackage.PAGEFLOW__X:
-			return new Integer(getX());
-		case PageflowPackage.PAGEFLOW__Y:
-			return new Integer(getY());
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PAGEFLOW__ID:
-			return getId();
-		case PageflowPackage.PAGEFLOW__NODES:
-			return getNodes();
-		case PageflowPackage.PAGEFLOW__LINKS:
-			return getLinks();
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			return getConfigfile();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__NODES:
-			getNodes().clear();
-			getNodes().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__LINKS:
-			getLinks().clear();
-			getLinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			setConfigfile((String) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW__NODES:
-			getNodes().clear();
-			return;
-		case PageflowPackage.PAGEFLOW__LINKS:
-			getLinks().clear();
-			return;
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			setConfigfile(CONFIGFILE_EDEFAULT);
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PAGEFLOW__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PAGEFLOW__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PAGEFLOW__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PAGEFLOW__NODES:
-			return nodes != null && !nodes.isEmpty();
-		case PageflowPackage.PAGEFLOW__LINKS:
-			return links != null && !links.isEmpty();
-		case PageflowPackage.PAGEFLOW__CONFIGFILE:
-			return CONFIGFILE_EDEFAULT == null ? configfile != null
-					: !CONFIGFILE_EDEFAULT.equals(configfile);
-		}
-		return super.eIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (configfile: "); //$NON-NLS-1$
-		result.append(configfile);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * set the valid link's source and target node.
-	 * 
-	 * @generated NOT
-	 */
-	public void connect(PageflowNode source, PageflowNode target,
-			PageflowLink link) {
-		if (link != null) {
-			if (PageflowValidation.getInstance().isValidLinkForCreation(source,
-					target)) {
-				this.getLinks().add(link);
-				link.setSource(source);
-				link.setTarget(target);
-			}
-		}
-	}
-
-	/** node prefixs map */
-	private HashMap mapNodePrefix = null;
-
-	/**
-	 * get the prefix's map, and if the map is not existed, create it.
-	 * 
-	 * @return - map for prefix
-	 * 
-	 * @generated NOT
-	 */
-	private HashMap getNodePrefixMap() {
-		if (mapNodePrefix == null) {
-			mapNodePrefix = new HashMap();
-			mapNodePrefix.put(PageflowPageImpl.class, new String("Page")); //$NON-NLS-1$
-		}
-		return mapNodePrefix;
-	}
-
-	/**
-	 * get the default node name according current nodetype
-	 * 
-	 * @param nodeType -
-	 *            node type, such as PFBeginImpl, PFPageImpl, etc.
-	 * @return - the default node name.
-	 * 
-	 * @generated NOT
-	 */
-	public String getDefaultNodeName(Class nodeType) {
-		HashMap mapNodePrefix_ = getNodePrefixMap();
-
-		String strNodePrefix = (String) mapNodePrefix_.get(nodeType);
-
-		String strNodeName = null;
-		boolean bFound = true;
-		int numNode = 1;
-		while (bFound) {
-			strNodeName = strNodePrefix + numNode;
-			boolean bExisted = false;
-			for (Iterator iter = getNodes().iterator(); iter.hasNext();) {
-				PageflowNode node = (PageflowNode) iter.next();
-				if (strNodeName.equalsIgnoreCase(node.getName())) {
-					bExisted = true;
-					break;
-				}
-			}
-			if (!bExisted) {
-				bFound = false;
-			}
-			numNode++;
-		}
-
-		return strNodeName;
-
-	}
-
-	/**
-	 * When faces-config has been changed, the pageflow model will be notified
-	 * to enable refresher do some update in pageflow.
-	 * 
-	 * @generated NOT
-	 */
-	public void notifyModelChanged(Notification notification) {
-		TreeIterator children = eAllContents();
-		while (children.hasNext()) {
-			Object next = children.next();
-			if (next instanceof PageflowElement) {
-				((PageflowElement) next).update();
-			}
-		}
-		super.notifyModelChanged(notification);
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public void dispose() {
-		TreeIterator children = eAllContents();
-		while (children.hasNext()) {
-			Object next = children.next();
-			if (next instanceof PageflowElement) {
-				((PageflowElement) next).dispose();
-			}
-		}
-		eAdapters.clear();
-	}
-}
-// PageflowImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkBendpointImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkBendpointImpl.java
deleted file mode 100644
index bdb66fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkBendpointImpl.java
+++ /dev/null
@@ -1,552 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Link Bendpoint</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD1Width <em>D1 Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD1Height <em>D1 Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD2Width <em>D2 Width</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getD2Height <em>D2 Height</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getWeight <em>Weight</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkBendpointImpl#getLink <em>Link</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class PageflowLinkBendpointImpl extends EObjectImpl implements PageflowLinkBendpoint {
-	/**
-	 * The default value of the '{@link #getD1Width() <em>D1 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D1_WIDTH_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD1Width() <em>D1 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d1Width = D1_WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getD1Height() <em>D1 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D1_HEIGHT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD1Height() <em>D1 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD1Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d1Height = D1_HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getD2Width() <em>D2 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D2_WIDTH_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD2Width() <em>D2 Width</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Width()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d2Width = D2_WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getD2Height() <em>D2 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int D2_HEIGHT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getD2Height() <em>D2 Height</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getD2Height()
-	 * @generated
-	 * @ordered
-	 */
-	protected int d2Height = D2_HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getWeight() <em>Weight</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final float WEIGHT_EDEFAULT = 0.5F;
-
-	/**
-	 * The cached value of the '{@link #getWeight() <em>Weight</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getWeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected float weight = WEIGHT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	private Dimension dimStart, dimEnd;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowLinkBendpointImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPFLinkBendpoint();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD1Width() {
-		return d1Width;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD1Width(int newD1Width) {
-		int oldD1Width = d1Width;
-		d1Width = newD1Width;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH, oldD1Width,
-					d1Width));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD1Height() {
-		return d1Height;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD1Height(int newD1Height) {
-		int oldD1Height = d1Height;
-		d1Height = newD1Height;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT, oldD1Height,
-					d1Height));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD2Width() {
-		return d2Width;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD2Width(int newD2Width) {
-		int oldD2Width = d2Width;
-		d2Width = newD2Width;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH, oldD2Width,
-					d2Width));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getD2Height() {
-		return d2Height;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setD2Height(int newD2Height) {
-		int oldD2Height = d2Height;
-		d2Height = newD2Height;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT, oldD2Height,
-					d2Height));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public float getWeight() {
-		return weight;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setWeight(float newWeight) {
-		float oldWeight = weight;
-		weight = newWeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__WEIGHT, oldWeight,
-					weight));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowLink getLink() {
-		if (eContainerFeatureID != PageflowPackage.PF_LINK_BENDPOINT__LINK)
-			return null;
-		return (PageflowLink) eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setLink(PageflowLink newLink) {
-		if (newLink != eContainer
-				|| (eContainerFeatureID != PageflowPackage.PF_LINK_BENDPOINT__LINK && newLink != null)) {
-			if (EcoreUtil.isAncestor(this, newLink))
-				throw new IllegalArgumentException(
-						NLS.bind(PageflowMessages.PageflowNode_NoRecursiveContainment,toString()));
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newLink != null)
-				msgs = ((InternalEObject) newLink).eInverseAdd(this,
-						PageflowPackage.PF_LINK__BEND_POINTS, PageflowLink.class,
-						msgs);
-			msgs = eBasicSetContainer((InternalEObject) newLink,
-					PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK_BENDPOINT__LINK, newLink, newLink));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-				return eBasicSetContainer(null,
-						PageflowPackage.PF_LINK_BENDPOINT__LINK, msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PF_LINK__BEND_POINTS, PageflowLink.class,
-						msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			return new Integer(getD1Width());
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			return new Integer(getD1Height());
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			return new Integer(getD2Width());
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			return new Integer(getD2Height());
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			return new Float(getWeight());
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			return getLink();
-		}
-		return eDynamicGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			setD1Width(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			setD1Height(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			setD2Width(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			setD2Height(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			setWeight(((Float) newValue).floatValue());
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			setLink((PageflowLink) newValue);
-			return;
-		}
-		eDynamicSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			setD1Width(D1_WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			setD1Height(D1_HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			setD2Width(D2_WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			setD2Height(D2_HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			setWeight(WEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			setLink((PageflowLink) null);
-			return;
-		}
-		eDynamicUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_WIDTH:
-			return d1Width != D1_WIDTH_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__D1_HEIGHT:
-			return d1Height != D1_HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_WIDTH:
-			return d2Width != D2_WIDTH_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__D2_HEIGHT:
-			return d2Height != D2_HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__WEIGHT:
-			return weight != WEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK_BENDPOINT__LINK:
-			return getLink() != null;
-		}
-		return eDynamicIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (d1Width: "); //$NON-NLS-1$
-		result.append(d1Width);
-		result.append(", d1Height: "); //$NON-NLS-1$
-		result.append(d1Height);
-		result.append(", d2Width: "); //$NON-NLS-1$
-		result.append(d2Width);
-		result.append(", d2Height: "); //$NON-NLS-1$
-		result.append(d2Height);
-		result.append(", weight: "); //$NON-NLS-1$
-		result.append(weight);
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getFirstRelativeDimension() {
-		dimStart = new Dimension(getD1Width(), getD1Height());
-		return dimStart;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public Dimension getSecondRelativeDimension() {
-		dimEnd = new Dimension(getD2Width(), getD2Height());
-		return dimEnd;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
-		dimStart = dim1;
-		dimEnd = dim2;
-		setD1Width(dimStart.width);
-		setD1Height(dimStart.height);
-
-		setD2Width(dimEnd.width);
-		setD2Height(dimEnd.height);
-	}
-
-}
-// PFLinkBendpointImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkImpl.java
deleted file mode 100644
index 61d45f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowLinkImpl.java
+++ /dev/null
@@ -1,893 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-import java.util.Vector;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Link</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getPageflow <em>Pageflow</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getTarget <em>Target</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getSource <em>Source</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getOutcome <em>Outcome</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#isRedirect <em>Redirect</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getBendPoints <em>Bend Points</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getSmallicon <em>Smallicon</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowLinkImpl#getLargeicon <em>Largeicon</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- * 
- */
-public class PageflowLinkImpl extends PageflowElementImpl implements
-		PageflowLink {
-	/**
-	 * The cached value of the '{@link #getTarget() <em>Target</em>}'
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getTarget()
-	 * @generated
-	 * @ordered
-	 */
-	protected PageflowNode target = null;
-
-	/**
-	 * The cached value of the '{@link #getSource() <em>Source</em>}'
-	 * reference. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getSource()
-	 * @generated
-	 * @ordered
-	 */
-	protected PageflowNode source = null;
-
-	/**
-	 * The default value of the '{@link #getOutcome() <em>Outcome</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getOutcome()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String OUTCOME_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #isRedirect() <em>Redirect</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #isRedirect()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean REDIRECT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #getBendPoints() <em>Bend Points</em>}'
-	 * containment reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getBendPoints()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList bendPoints = null;
-
-	/**
-	 * The default value of the '{@link #getSmallicon() <em>Smallicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getSmallicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SMALLICON_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getLargeicon() <em>Largeicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getLargeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LARGEICON_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getFromaction() <em>Fromaction</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getFromaction()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FROMACTION_EDEFAULT = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowLinkImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPFLink();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Pageflow getPageflow() {
-		if (eContainerFeatureID != PageflowPackage.PF_LINK__PAGEFLOW)
-			return null;
-		return (Pageflow) eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setPageflow(Pageflow newPageflow) {
-		if (newPageflow != eContainer
-				|| (eContainerFeatureID != PageflowPackage.PF_LINK__PAGEFLOW && newPageflow != null)) {
-			if (EcoreUtil.isAncestor(this, newPageflow))
-				throw new IllegalArgumentException(
-												NLS.bind(PageflowMessages.PageflowNode_NoRecursiveContainment,toString()));
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newPageflow != null)
-				msgs = ((InternalEObject) newPageflow).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW__LINKS, Pageflow.class, msgs);
-			msgs = eBasicSetContainer((InternalEObject) newPageflow,
-					PageflowPackage.PF_LINK__PAGEFLOW, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__PAGEFLOW, newPageflow, newPageflow));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowNode getTarget() {
-		if (target != null && target.eIsProxy()) {
-			PageflowNode oldTarget = target;
-			target = (PageflowNode) eResolveProxy((InternalEObject) target);
-			if (target != oldTarget) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							PageflowPackage.PF_LINK__TARGET, oldTarget, target));
-			}
-		}
-		return target;
-	}
-
-	public void setSourcePath(String path) {
-		if (getSource() != null
-				&& path.equals(((PageflowPage) getSource()).getPath())) {
-			return;
-		}
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__SOURCE, getSource(), path));
-	}
-
-	public void setTargetPath(String path) {
-		if (getTarget() != null
-				&& path.equals(((PageflowPage) getTarget()).getPath())) {
-			return;
-		}
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__TARGET, getTarget(), path));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the target
-	 * <!-- end-user-doc -->
-	 *  
-	 * 
-	 * @generated
-	 */
-	public PageflowNode basicGetTarget() {
-		return target;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
- 	 * @param newTarget 
-	 * @param msgs 
-	 * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain basicSetTarget(PageflowNode newTarget,
-			NotificationChain msgs) {
-		PageflowNode oldTarget = target;
-		target = newTarget;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, PageflowPackage.PF_LINK__TARGET,
-					oldTarget, newTarget);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setTarget(PageflowNode newTarget) {
-		if (newTarget != target) {
-			NotificationChain msgs = null;
-			if (target != null)
-				msgs = ((InternalEObject) target).eInverseRemove(this,
-						PageflowPackage.PAGEFLOW_NODE__INLINKS,
-						PageflowNode.class, msgs);
-			if (newTarget != null)
-				msgs = ((InternalEObject) newTarget).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW_NODE__INLINKS,
-						PageflowNode.class, msgs);
-			msgs = basicSetTarget(newTarget, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__TARGET, newTarget, newTarget));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowNode getSource() {
-		if (source != null && source.eIsProxy()) {
-			PageflowNode oldSource = source;
-			source = (PageflowNode) eResolveProxy((InternalEObject) source);
-			if (source != oldSource) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-							PageflowPackage.PF_LINK__SOURCE, oldSource, source));
-			}
-		}
-		return source;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the pageflow node 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowNode basicGetSource() {
-		return source;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @param newSource 
-	 * @param msgs 
-	 * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain basicSetSource(PageflowNode newSource,
-			NotificationChain msgs) {
-		// Assert.isTrue(newSource != null);
-		PageflowNode oldSource = source;
-		source = newSource;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this,
-					Notification.SET, PageflowPackage.PF_LINK__SOURCE,
-					oldSource, newSource);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setSource(PageflowNode newSource) {
-		// Assert.isTrue(newSource != null);
-		if (newSource != source) {
-			NotificationChain msgs = null;
-			if (source != null)
-				msgs = ((InternalEObject) source).eInverseRemove(this,
-						PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-						PageflowNode.class, msgs);
-			if (newSource != null)
-				msgs = ((InternalEObject) newSource).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-						PageflowNode.class, msgs);
-			msgs = basicSetSource(newSource, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__SOURCE, newSource, newSource));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getBendPoints() {
-		if (bendPoints == null) {
-			bendPoints = new EObjectContainmentWithInverseEList(
-					PageflowLinkBendpoint.class, this,
-					PageflowPackage.PF_LINK__BEND_POINTS,
-					PageflowPackage.PF_LINK_BENDPOINT__LINK);
-		}
-		return bendPoints;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK__PAGEFLOW:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PF_LINK__PAGEFLOW, msgs);
-			case PageflowPackage.PF_LINK__TARGET:
-				if (target != null)
-					msgs = ((InternalEObject) target).eInverseRemove(this,
-							PageflowPackage.PAGEFLOW_NODE__INLINKS,
-							PageflowNode.class, msgs);
-				return basicSetTarget((PageflowNode) otherEnd, msgs);
-			case PageflowPackage.PF_LINK__SOURCE:
-				if (source != null)
-					msgs = ((InternalEObject) source).eInverseRemove(this,
-							PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-							PageflowNode.class, msgs);
-				return basicSetSource((PageflowNode) otherEnd, msgs);
-			case PageflowPackage.PF_LINK__BEND_POINTS:
-				return ((InternalEList) getBendPoints()).basicAdd(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_LINK__PAGEFLOW:
-				return eBasicSetContainer(null,
-						PageflowPackage.PF_LINK__PAGEFLOW, msgs);
-			case PageflowPackage.PF_LINK__TARGET:
-				return basicSetTarget(null, msgs);
-			case PageflowPackage.PF_LINK__SOURCE:
-				return basicSetSource(null, msgs);
-			case PageflowPackage.PF_LINK__BEND_POINTS:
-				return ((InternalEList) getBendPoints()).basicRemove(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PF_LINK__PAGEFLOW:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PAGEFLOW__LINKS, Pageflow.class, msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			return getName();
-		case PageflowPackage.PF_LINK__COMMENT:
-			return getComment();
-		case PageflowPackage.PF_LINK__X:
-			return new Integer(getX());
-		case PageflowPackage.PF_LINK__Y:
-			return new Integer(getY());
-		case PageflowPackage.PF_LINK__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PF_LINK__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PF_LINK__ID:
-			return getId();
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			return getPageflow();
-		case PageflowPackage.PF_LINK__TARGET:
-			if (resolve)
-				return getTarget();
-			return basicGetTarget();
-		case PageflowPackage.PF_LINK__SOURCE:
-			if (resolve)
-				return getSource();
-			return basicGetSource();
-		case PageflowPackage.PF_LINK__OUTCOME:
-			return getOutcome();
-		case PageflowPackage.PF_LINK__REDIRECT:
-			return isRedirect() ? Boolean.TRUE : Boolean.FALSE;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			return getBendPoints();
-		case PageflowPackage.PF_LINK__SMALLICON:
-			return getSmallicon();
-		case PageflowPackage.PF_LINK__LARGEICON:
-			return getLargeicon();
-		case PageflowPackage.PF_LINK__FROMACTION:
-			return getFromaction();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_LINK__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			setPageflow((Pageflow) newValue);
-			return;
-		case PageflowPackage.PF_LINK__TARGET:
-			setTarget((PageflowNode) newValue);
-			return;
-		case PageflowPackage.PF_LINK__SOURCE:
-			setSource((PageflowNode) newValue);
-			return;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			setOutcome((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__REDIRECT:
-			setRedirect(((Boolean) newValue).booleanValue());
-			return;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			getBendPoints().clear();
-			getBendPoints().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PF_LINK__SMALLICON:
-			setSmallicon((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__LARGEICON:
-			setLargeicon((String) newValue);
-			return;
-		case PageflowPackage.PF_LINK__FROMACTION:
-			setFromaction((String) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			setPageflow((Pageflow) null);
-			return;
-		case PageflowPackage.PF_LINK__TARGET:
-			setTarget((PageflowNode) null);
-			return;
-		case PageflowPackage.PF_LINK__SOURCE:
-			setSource((PageflowNode) null);
-			return;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			setOutcome(OUTCOME_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__REDIRECT:
-			setRedirect(REDIRECT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			getBendPoints().clear();
-			return;
-		case PageflowPackage.PF_LINK__SMALLICON:
-			setSmallicon(SMALLICON_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__LARGEICON:
-			setLargeicon(LARGEICON_EDEFAULT);
-			return;
-		case PageflowPackage.PF_LINK__FROMACTION:
-			setFromaction(FROMACTION_EDEFAULT);
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_LINK__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PF_LINK__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PF_LINK__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PF_LINK__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PF_LINK__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PF_LINK__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_LINK__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PF_LINK__PAGEFLOW:
-			return getPageflow() != null;
-		case PageflowPackage.PF_LINK__TARGET:
-			return target != null;
-		case PageflowPackage.PF_LINK__SOURCE:
-			return source != null;
-		case PageflowPackage.PF_LINK__OUTCOME:
-			return OUTCOME_EDEFAULT == null ? getOutcome() != null
-					: !OUTCOME_EDEFAULT.equals(getOutcome());
-		case PageflowPackage.PF_LINK__REDIRECT:
-			return isRedirect() != REDIRECT_EDEFAULT;
-		case PageflowPackage.PF_LINK__BEND_POINTS:
-			return bendPoints != null && !bendPoints.isEmpty();
-		case PageflowPackage.PF_LINK__SMALLICON:
-			return SMALLICON_EDEFAULT == null ? getSmallicon() != null
-					: !SMALLICON_EDEFAULT.equals(getSmallicon());
-		case PageflowPackage.PF_LINK__LARGEICON:
-			return LARGEICON_EDEFAULT == null ? getLargeicon() != null
-					: !LARGEICON_EDEFAULT.equals(getLargeicon());
-		case PageflowPackage.PF_LINK__FROMACTION:
-			return FROMACTION_EDEFAULT == null ? getFromaction() != null
-					: !FROMACTION_EDEFAULT.equals(getFromaction());
-		}
-		return super.eIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (smallicon: "); //$NON-NLS-1$
-		result.append(getSmallicon());
-		result.append(", largeicon: "); //$NON-NLS-1$
-		result.append(getLargeicon());
-		result.append(", fromaction: "); //$NON-NLS-1$
-		result.append(getFromaction());
-		result.append(", outcome: "); //$NON-NLS-1$
-		result.append(getOutcome());
-		result.append(", redirect: "); //$NON-NLS-1$
-		result.append(isRedirect());
-		result.append(')');
-		return result.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> insert a new bendpoint to the link <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void insertBendpoint(int index, PageflowLinkBendpoint point) {
-		getBendPoints().add(index, point);
-
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.ADD,
-					PageflowPackage.PF_LINK__BEND_POINTS, null, point));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> remove the current bendpoint <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated NOT
-	 */
-	public void removeBendpoint(int index) {
-		getBendPoints().remove(index);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> Set the current bendpoint <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoint(int index, PageflowLinkBendpoint point) {
-		getBendPoints().set(index, point);
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__BEND_POINTS, null, point));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> Set a group of bendpoints to reconstruct the link
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setBendpoints(Vector points) {
-		bendPoints = (EList) points;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.ADD_MANY,
-					PageflowPackage.PF_LINK__BEND_POINTS, null, points));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public boolean isRedirect() {
-		Boolean result = (Boolean) getFCElements().get(
-				PageflowPackage.PF_LINK__REDIRECT);
-		return result.booleanValue();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setRedirect(boolean newRedirect) {
-		Boolean oldRedirect = new Boolean(isRedirect());
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__REDIRECT, oldRedirect,
-					new Boolean(newRedirect)));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getOutcome() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__OUTCOME);
-
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setOutcome(String newValue) {
-		String oldOutcome = getOutcome();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__OUTCOME, oldOutcome, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getSmallicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__SMALLICON);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setSmallicon(String newValue) {
-		String oldSmallicon = getSmallicon();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__SMALLICON, oldSmallicon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getLargeicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__LARGEICON);
-
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setLargeicon(String newValue) {
-		String oldLargeIcon = getLargeicon();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__LARGEICON, oldLargeIcon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getFromaction() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_LINK__FROMACTION);
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setFromaction(String newFromaction) {
-		String oldFromActionType = getFromaction();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_LINK__FROMACTION, oldFromActionType,
-					newFromaction));
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public ReferenceElement getFCElements() {
-
-		if (refElement == null) {
-			refElement = new LinkReferenceElement(this);
-		}
-		return refElement;
-	}
-
-}
-// PFLinkImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowNodeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowNodeImpl.java
deleted file mode 100644
index 6e64d61..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowNodeImpl.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>Node</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl#getPageflow <em>Pageflow</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl#getOutlinks <em>Outlinks</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowNodeImpl#getInlinks <em>Inlinks</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public abstract class PageflowNodeImpl extends PageflowElementImpl implements
-		PageflowNode {
-	/**
-	 * The cached value of the '{@link #getOutlinks() <em>Outlinks</em>}'
-	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getOutlinks()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList outlinks = null;
-
-	/**
-	 * The cached value of the '{@link #getInlinks() <em>Inlinks</em>}'
-	 * reference list. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getInlinks()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList inlinks = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowNodeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPageflowNode();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Pageflow getPageflow() {
-		if (eContainerFeatureID != PageflowPackage.PAGEFLOW_NODE__PAGEFLOW)
-			return null;
-		return (Pageflow) eContainer;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setPageflow(Pageflow newPageflow) {
-		if (newPageflow != eContainer
-				|| (eContainerFeatureID != PageflowPackage.PAGEFLOW_NODE__PAGEFLOW && newPageflow != null)) {
-			if (EcoreUtil.isAncestor(this, newPageflow))
-				throw new IllegalArgumentException(
-												NLS.bind(PageflowMessages.PageflowNode_NoRecursiveContainment,toString()));
-			NotificationChain msgs = null;
-			if (eContainer != null)
-				msgs = eBasicRemoveFromContainer(msgs);
-			if (newPageflow != null)
-				msgs = ((InternalEObject) newPageflow).eInverseAdd(this,
-						PageflowPackage.PAGEFLOW__NODES, Pageflow.class, msgs);
-			msgs = eBasicSetContainer((InternalEObject) newPageflow,
-					PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, newPageflow,
-					newPageflow));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getOutlinks() {
-		if (outlinks == null) {
-			outlinks = new EObjectWithInverseResolvingEList(PageflowLink.class, this,
-					PageflowPackage.PAGEFLOW_NODE__OUTLINKS,
-					PageflowPackage.PF_LINK__SOURCE);
-		}
-		return outlinks;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList getInlinks() {
-		if (inlinks == null) {
-			inlinks = new EObjectWithInverseResolvingEList(PageflowLink.class, this,
-					PageflowPackage.PAGEFLOW_NODE__INLINKS,
-					PageflowPackage.PF_LINK__TARGET);
-		}
-		return inlinks;
-	}
-
-	/**
-	 * @generated NOT
-	 */
-	public PageflowLink findLinkTo(PageflowNode target) {
-		//
-		java.util.Iterator i = this.getOutlinks().iterator();
-		while (i.hasNext()) {
-			PageflowLink link = (PageflowLink) i.next();
-			if (link.getTarget() == target)
-				return link;
-		}
-		return null;
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, msgs);
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicAdd(otherEnd, msgs);
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				return ((InternalEList) getInlinks()).basicAdd(otherEnd, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-				return eBasicSetContainer(null,
-						PageflowPackage.PAGEFLOW_NODE__PAGEFLOW, msgs);
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicRemove(otherEnd,
-						msgs);
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				return ((InternalEList) getInlinks()).basicRemove(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PAGEFLOW__NODES, Pageflow.class, msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			return getName();
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			return getComment();
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			return new Integer(getX());
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			return new Integer(getY());
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			return getId();
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			return getPageflow();
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			return getOutlinks();
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			return getInlinks();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			setPageflow((Pageflow) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			getOutlinks().clear();
-			getOutlinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			getInlinks().clear();
-			getInlinks().addAll((Collection) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			setPageflow((Pageflow) null);
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			getOutlinks().clear();
-			return;
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			getInlinks().clear();
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PAGEFLOW_NODE__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PAGEFLOW_NODE__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PAGEFLOW_NODE__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PAGEFLOW_NODE__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PAGEFLOW_NODE__PAGEFLOW:
-			return getPageflow() != null;
-		case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			return outlinks != null && !outlinks.isEmpty();
-		case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-			return inlinks != null && !inlinks.isEmpty();
-		}
-		return super.eIsSet(eFeature);
-	}
-
-}
-// PageflowNodeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPackageImpl.java
deleted file mode 100644
index f24f95b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPackageImpl.java
+++ /dev/null
@@ -1,782 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model <b>Package</b>. <!--
- * end-user-doc -->
- * 
- * @generated
- */
-public class PageflowPackageImpl extends EPackageImpl implements
-		PageflowPackage {
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pageflowEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pageflowNodeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pfLinkEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pageflowElementEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pfPageEClass = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass pfLinkBendpointEClass = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the
-	 * package package URI value.
-	 * <p>
-	 * Note: the correct way to create the package is via the static factory
-	 * method {@link #init init()}, which also performs initialization of the
-	 * package, or returns the registered package, if one already exists. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private PageflowPackageImpl() {
-		super(eNS_URI, PageflowFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this model,
-	 * and for any others upon which it depends. Simple dependencies are
-	 * satisfied by calling this method on all dependent packages before doing
-	 * anything else. This method drives initialization for interdependent
-	 * packages directly, in parallel with this package, itself.
-	 * <p>
-	 * Of this package and its interdependencies, all packages which have not
-	 * yet been registered by their URI values are first created and registered.
-	 * The packages are then initialized in two steps: meta-model objects for
-	 * all of the packages are created before any are initialized, since one
-	 * package's meta-model objects may refer to those of another.
-	 * <p>
-	 * Invocation of this method will not affect any packages that have already
-	 * been initialized. 
-	 * 
-	 * <!-- begin-user-doc --> 
- 	 * @return the package 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static PageflowPackage init() {
-		if (isInited)
-			return (PageflowPackage) EPackage.Registry.INSTANCE
-					.get(PageflowPackage.eNS_URI);
-
-		// Obtain or create and register package
-		PageflowPackageImpl thePageflowPackage = (PageflowPackageImpl) (EPackage.Registry.INSTANCE
-				.get(eNS_URI) instanceof PageflowPackageImpl ? EPackage.Registry.INSTANCE
-				.get(eNS_URI)
-				: new PageflowPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		thePageflowPackage.createPackageContents();
-
-		// Initialize created meta-data
-		thePageflowPackage.initializePackageContents();
-
-		return thePageflowPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPageflow() {
-		return pageflowEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPageflow_Nodes() {
-		return (EReference) pageflowEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPageflow_Links() {
-		return (EReference) pageflowEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflow_Configfile() {
-		return (EAttribute) pageflowEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPageflowNode() {
-		return pageflowNodeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPageflowNode_Pageflow() {
-		return (EReference) pageflowNodeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPageflowNode_Outlinks() {
-		return (EReference) pageflowNodeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPageflowNode_Inlinks() {
-		return (EReference) pageflowNodeEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPFLink() {
-		return pfLinkEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLink_Pageflow() {
-		return (EReference) pfLinkEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLink_Target() {
-		return (EReference) pfLinkEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLink_Source() {
-		return (EReference) pfLinkEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLink_Outcome() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(3);
-	}
-
-		/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLink_Redirect() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLink_BendPoints() {
-		return (EReference) pfLinkEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the small icon eattribute 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLink_Smallicon() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the large icon attribute 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPFLink_Largeicon() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLink_Fromaction() {
-		return (EAttribute) pfLinkEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> 
-	 * @return the reference link eattribute 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_ReferenceLink() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				7);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPageflowElement() {
-		return pageflowElementEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Name() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Comment() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_X() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Y() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				3);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Width() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				4);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Height() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				5);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPageflowElement_Id() {
-		return (EAttribute) pageflowElementEClass.getEStructuralFeatures().get(
-				6);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPFPage() {
-		return pfPageEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFPage_Path() {
-		return (EAttribute) pfPageEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFPage_Smallicon() {
-		return (EAttribute) pfPageEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFPage_Largeicon() {
-		return (EAttribute) pfPageEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getPFLinkBendpoint() {
-		return pfLinkBendpointEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D1Width() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				0);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D1Height() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				1);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D2Width() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				2);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_D2Height() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				3);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getPFLinkBendpoint_Weight() {
-		return (EAttribute) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				4);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getPFLinkBendpoint_Link() {
-		return (EReference) pfLinkBendpointEClass.getEStructuralFeatures().get(
-				5);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowFactory getPageflowFactory() {
-		return (PageflowFactory) getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package. This method is guarded to
-	 * have no affect on any invocation but its first. <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated)
-			return;
-		isCreated = true;
-
-		// Create classes and their features
-		pageflowEClass = createEClass(PAGEFLOW);
-		createEReference(pageflowEClass, PAGEFLOW__NODES);
-		createEReference(pageflowEClass, PAGEFLOW__LINKS);
-		createEAttribute(pageflowEClass, PAGEFLOW__CONFIGFILE);
-
-		pageflowNodeEClass = createEClass(PAGEFLOW_NODE);
-		createEReference(pageflowNodeEClass, PAGEFLOW_NODE__PAGEFLOW);
-		createEReference(pageflowNodeEClass, PAGEFLOW_NODE__OUTLINKS);
-		createEReference(pageflowNodeEClass, PAGEFLOW_NODE__INLINKS);
-
-		pfLinkEClass = createEClass(PF_LINK);
-		createEReference(pfLinkEClass, PF_LINK__PAGEFLOW);
-		createEReference(pfLinkEClass, PF_LINK__TARGET);
-		createEReference(pfLinkEClass, PF_LINK__SOURCE);
-		createEAttribute(pfLinkEClass, PF_LINK__OUTCOME);
-		createEAttribute(pfLinkEClass, PF_LINK__REDIRECT);
-		createEReference(pfLinkEClass, PF_LINK__BEND_POINTS);
-		createEAttribute(pfLinkEClass, PF_LINK__SMALLICON);
-		createEAttribute(pfLinkEClass, PF_LINK__LARGEICON);
-		createEAttribute(pfLinkEClass, PF_LINK__FROMACTION);
-
-		pageflowElementEClass = createEClass(PAGEFLOW_ELEMENT);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__NAME);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__COMMENT);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__X);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__Y);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__WIDTH);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__HEIGHT);
-		createEAttribute(pageflowElementEClass, PAGEFLOW_ELEMENT__ID);
-		createEAttribute(pageflowElementEClass,
-				PAGEFLOW_ELEMENT__REFERENCE_LINK);
-
-		pfPageEClass = createEClass(PF_PAGE);
-		createEAttribute(pfPageEClass, PF_PAGE__PATH);
-		createEAttribute(pfPageEClass, PF_PAGE__SMALLICON);
-		createEAttribute(pfPageEClass, PF_PAGE__LARGEICON);
-
-		pfLinkBendpointEClass = createEClass(PF_LINK_BENDPOINT);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D1_WIDTH);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D1_HEIGHT);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D2_WIDTH);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__D2_HEIGHT);
-		createEAttribute(pfLinkBendpointEClass, PF_LINK_BENDPOINT__WEIGHT);
-		createEReference(pfLinkBendpointEClass, PF_LINK_BENDPOINT__LINK);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model. This
-	 * method is guarded to have no affect on any invocation but its first. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized)
-			return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-		pageflowEClass.getESuperTypes().add(this.getPageflowElement());
-		pageflowNodeEClass.getESuperTypes().add(this.getPageflowElement());
-		pfLinkEClass.getESuperTypes().add(this.getPageflowElement());
-		pfPageEClass.getESuperTypes().add(this.getPageflowNode());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(pageflowEClass, Pageflow.class, "Pageflow", !IS_ABSTRACT, //$NON-NLS-1$
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPageflow_Nodes(), this.getPageflowNode(), this
-				.getPageflowNode_Pageflow(), "nodes", null, 0, -1, //$NON-NLS-1$
-				Pageflow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPageflow_Links(), this.getPFLink(), this
-				.getPFLink_Pageflow(), "links", null, 0, -1, Pageflow.class, //$NON-NLS-1$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE,
-				!IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPageflow_Configfile(), ecorePackage.getEString(),
-				"configfile", null, 0, 1, Pageflow.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pageflowNodeEClass, PageflowNode.class, "PageflowNode", //$NON-NLS-1$
-				IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPageflowNode_Pageflow(), this.getPageflow(), this
-				.getPageflow_Nodes(), "pageflow", null, 1, 1, //$NON-NLS-1$
-				PageflowNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPageflowNode_Outlinks(), this.getPFLink(), this
-				.getPFLink_Source(), "outlinks", null, 0, -1, //$NON-NLS-1$
-				PageflowNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPageflowNode_Inlinks(), this.getPFLink(), this
-				.getPFLink_Target(), "inlinks", null, 0, -1, //$NON-NLS-1$
-				PageflowNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pfLinkEClass, PageflowLink.class, "PFLink", !IS_ABSTRACT, //$NON-NLS-1$
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPFLink_Pageflow(), this.getPageflow(), this
-				.getPageflow_Links(), "pageflow", null, 1, 1, //$NON-NLS-1$
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLink_Target(), this.getPageflowNode(), this
-				.getPageflowNode_Inlinks(), "target", null, 1, 1, //$NON-NLS-1$
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLink_Source(), this.getPageflowNode(), this
-				.getPageflowNode_Outlinks(), "source", null, 1, 1, //$NON-NLS-1$
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				!IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Outcome(), ecorePackage.getEString(),
-				"outcome", null, 0, 1, PageflowLink.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Redirect(), ecorePackage.getEBoolean(),
-				"redirect", null, 0, 1, PageflowLink.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLink_BendPoints(), this.getPFLinkBendpoint(), this
-				.getPFLinkBendpoint_Link(), "bendPoints", null, 0, -1, //$NON-NLS-1$
-				PageflowLink.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE,
-				IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Smallicon(), ecorePackage.getEString(),
-				"smallicon", null, 0, 1, PageflowLink.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Largeicon(), ecorePackage.getEString(),
-				"largeicon", null, 0, 1, PageflowLink.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLink_Fromaction(), ecorePackage.getEString(),
-				"fromaction", null, 0, 1, PageflowLink.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pageflowElementEClass, PageflowElement.class,
-				"PageflowElement", IS_ABSTRACT, !IS_INTERFACE, //$NON-NLS-1$
-				IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPageflowElement_Name(), ecorePackage.getEString(),
-				"name", "unnamed", 0, 1, PageflowElement.class, !IS_TRANSIENT, //$NON-NLS-1$ //$NON-NLS-2$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_Comment(), ecorePackage.getEString(),
-				"comment", null, 0, 1, PageflowElement.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_X(), ecorePackage.getEInt(), "x", //$NON-NLS-1$
-				"0", 0, 1, PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE, //$NON-NLS-1$
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPageflowElement_Y(), ecorePackage.getEInt(), "y", //$NON-NLS-1$
-				"0", 0, 1, PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE, //$NON-NLS-1$
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPageflowElement_Width(), ecorePackage.getEInt(),
-				"width", "-1", 0, 1, PageflowElement.class, !IS_TRANSIENT, //$NON-NLS-1$ //$NON-NLS-2$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_Height(), ecorePackage.getEInt(),
-				"height", "-1", 0, 1, PageflowElement.class, !IS_TRANSIENT, //$NON-NLS-1$ //$NON-NLS-2$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_Id(), ecorePackage.getEString(),
-				"id", null, 1, 1, PageflowElement.class, !IS_TRANSIENT, //$NON-NLS-1$
-				IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPageflowElement_ReferenceLink(), ecorePackage
-				.getEString(), "referenceLink", "", 0, 1, //$NON-NLS-1$ //$NON-NLS-2$
-				PageflowElement.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-
-		initEClass(pfPageEClass, PageflowPage.class, "PFPage", !IS_ABSTRACT, //$NON-NLS-1$
-				!IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPFPage_Path(), ecorePackage.getEString(), "path", //$NON-NLS-1$
-				null, 0, 1, PageflowPage.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED,
-				IS_ORDERED);
-		initEAttribute(getPFPage_Smallicon(), ecorePackage.getEString(),
-				"smallicon", null, 0, 1, PageflowPage.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFPage_Largeicon(), ecorePackage.getEString(),
-				"largeicon", null, 0, 1, PageflowPage.class, !IS_TRANSIENT, //$NON-NLS-1$
-				!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-				!IS_DERIVED, IS_ORDERED);
-
-		initEClass(pfLinkBendpointEClass, PageflowLinkBendpoint.class,
-				"PFLinkBendpoint", !IS_ABSTRACT, !IS_INTERFACE, //$NON-NLS-1$
-				IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPFLinkBendpoint_D1Width(), ecorePackage.getEInt(),
-				"d1Width", null, 0, 1, PageflowLinkBendpoint.class, //$NON-NLS-1$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_D1Height(), ecorePackage.getEInt(),
-				"d1Height", null, 0, 1, PageflowLinkBendpoint.class, //$NON-NLS-1$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_D2Width(), ecorePackage.getEInt(),
-				"d2Width", null, 0, 1, PageflowLinkBendpoint.class, //$NON-NLS-1$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_D2Height(), ecorePackage.getEInt(),
-				"d2Height", null, 0, 1, PageflowLinkBendpoint.class, //$NON-NLS-1$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPFLinkBendpoint_Weight(), ecorePackage.getEFloat(),
-				"weight", "0.5", 0, 1, PageflowLinkBendpoint.class, //$NON-NLS-1$ //$NON-NLS-2$
-				!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE,
-				!IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPFLinkBendpoint_Link(), this.getPFLink(), this
-				.getPFLink_BendPoints(), "link", null, 1, 1, //$NON-NLS-1$
-				PageflowLinkBendpoint.class, !IS_TRANSIENT, !IS_VOLATILE,
-				IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES,
-				!IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-}
-// PageflowPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPageImpl.java
deleted file mode 100644
index eca7a66..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/PageflowPageImpl.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * <!-- begin-user-doc --> An implementation of the model object '<em><b>PF Page</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl#getPath <em>Path</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl#getSmallicon <em>Smallicon</em>}</li>
- * <li>{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl#getLargeicon <em>Largeicon</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class PageflowPageImpl extends PageflowNodeImpl implements PageflowPage {
-	private String path;
-
-	private String smallIcon;
-
-	private String largeIcon;
-
-	/**
-	 * The default value of the '{@link #getPath() <em>Path</em>}' attribute.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getPath()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String PATH_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getSmallicon() <em>Smallicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getSmallicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String SMALLICON_EDEFAULT = null;
-
-	/**
-	 * The default value of the '{@link #getLargeicon() <em>Largeicon</em>}'
-	 * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see #getLargeicon()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LARGEICON_EDEFAULT = null;
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowPageImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return PageflowPackage.eINSTANCE.getPFPage();
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getPath() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__PATH);
-		// Try to return reasonable result.
-		return result == null && getFCElements().isEmpty() ? path
-				: (result != null ? result : PATH_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setPath(String newValue) {
-		String oldPath = getPath();
-		path = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__PATH, oldPath, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public void setComment(String newValue) {
-		super.setComment(newValue);
-		String oldComment = getComment();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PAGEFLOW_ELEMENT__COMMENT, oldComment,
-					newValue));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public String getComment() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__COMMENT);
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? super.getComment()
-				: (result != null ? result
-						: PageflowElementImpl.COMMENT_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public String getName() {
-		String result;
-		// To see if it is in navigation rule.
-		result = (String) getFCElements().get(PageflowPackage.PF_PAGE__NAME);
-		if (result == null) {
-			if (super.getName() == null || super.getName().trim().length() == 0) {
-				result = getPath();
-			} else {
-				result = super.getName();
-			}
-		}
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? PageflowElementImpl.NAME_EDEFAULT
-				: (result == null ? null : result);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-
-	public void setName(String newName) {
-		super.setName(newName);
-		String oldName = getName();
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__NAME, oldName, newName));
-
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getSmallicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__SMALLICON);
-
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? smallIcon : (result != null ? result
-				: SMALLICON_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setSmallicon(String newValue) {
-		String oldSmallicon = getSmallicon();
-		smallIcon = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__SMALLICON, oldSmallicon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getLargeicon() {
-		String result = (String) getFCElements().get(
-				PageflowPackage.PF_PAGE__LARGEICON);
-
-		return result == null
-				&& (getFCElements().isEmpty() || ((PageReferenceElement) getFCElements())
-						.isEndOnly()) ? largeIcon : (result != null ? result
-				: LARGEICON_EDEFAULT);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public void setLargeicon(String newValue) {
-		String oldLargeIcon = getLargeicon();
-		largeIcon = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET,
-					PageflowPackage.PF_PAGE__LARGEICON, oldLargeIcon, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseAdd(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_PAGE__PAGEFLOW:
-				if (eContainer != null)
-					msgs = eBasicRemoveFromContainer(msgs);
-				return eBasicSetContainer(otherEnd,
-						PageflowPackage.PF_PAGE__PAGEFLOW, msgs);
-			case PageflowPackage.PF_PAGE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicAdd(otherEnd, msgs);
-			case PageflowPackage.PF_PAGE__INLINKS:
-				return ((InternalEList) getInlinks()).basicAdd(otherEnd, msgs);
-			default:
-				return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
-			}
-		}
-		if (eContainer != null)
-			msgs = eBasicRemoveFromContainer(msgs);
-		return eBasicSetContainer(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd,
-			int featureID, Class baseClass, NotificationChain msgs) {
-		if (featureID >= 0) {
-			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
-			case PageflowPackage.PF_PAGE__PAGEFLOW:
-				return eBasicSetContainer(null,
-						PageflowPackage.PF_PAGE__PAGEFLOW, msgs);
-			case PageflowPackage.PF_PAGE__OUTLINKS:
-				return ((InternalEList) getOutlinks()).basicRemove(otherEnd,
-						msgs);
-			case PageflowPackage.PF_PAGE__INLINKS:
-				return ((InternalEList) getInlinks()).basicRemove(otherEnd,
-						msgs);
-			default:
-				return eDynamicInverseRemove(otherEnd, featureID, baseClass,
-						msgs);
-			}
-		}
-		return eBasicSetContainer(null, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
-		if (eContainerFeatureID >= 0) {
-			switch (eContainerFeatureID) {
-			case PageflowPackage.PF_PAGE__PAGEFLOW:
-				return eContainer.eInverseRemove(this,
-						PageflowPackage.PAGEFLOW__NODES, Pageflow.class, msgs);
-			default:
-				return eDynamicBasicRemoveFromContainer(msgs);
-			}
-		}
-		return eContainer.eInverseRemove(this,
-				EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			return getName();
-		case PageflowPackage.PF_PAGE__COMMENT:
-			return getComment();
-		case PageflowPackage.PF_PAGE__X:
-			return new Integer(getX());
-		case PageflowPackage.PF_PAGE__Y:
-			return new Integer(getY());
-		case PageflowPackage.PF_PAGE__WIDTH:
-			return new Integer(getWidth());
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			return new Integer(getHeight());
-		case PageflowPackage.PF_PAGE__ID:
-			return getId();
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			return getPageflow();
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			return getOutlinks();
-		case PageflowPackage.PF_PAGE__INLINKS:
-			return getInlinks();
-		case PageflowPackage.PF_PAGE__PATH:
-			return getPath();
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			return getSmallicon();
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			return getLargeicon();
-		}
-		return super.eGet(eFeature, resolve);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eSet(EStructuralFeature eFeature, Object newValue) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			setName((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__COMMENT:
-			setComment((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__X:
-			setX(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__Y:
-			setY(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__WIDTH:
-			setWidth(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			setHeight(((Integer) newValue).intValue());
-			return;
-		case PageflowPackage.PF_PAGE__ID:
-			setId((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			setPageflow((Pageflow) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			getOutlinks().clear();
-			getOutlinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__INLINKS:
-			getInlinks().clear();
-			getInlinks().addAll((Collection) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__PATH:
-			setPath((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			setSmallicon((String) newValue);
-			return;
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			setLargeicon((String) newValue);
-			return;
-		}
-		super.eSet(eFeature, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void eUnset(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			setName(NAME_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__COMMENT:
-			setComment(COMMENT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__X:
-			setX(X_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__Y:
-			setY(Y_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__WIDTH:
-			setWidth(WIDTH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			setHeight(HEIGHT_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			setPageflow((Pageflow) null);
-			return;
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			getOutlinks().clear();
-			return;
-		case PageflowPackage.PF_PAGE__INLINKS:
-			getInlinks().clear();
-			return;
-		case PageflowPackage.PF_PAGE__PATH:
-			setPath(PATH_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			setSmallicon(SMALLICON_EDEFAULT);
-			return;
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			setLargeicon(LARGEICON_EDEFAULT);
-			return;
-		}
-		super.eUnset(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean eIsSet(EStructuralFeature eFeature) {
-		switch (eDerivedStructuralFeatureID(eFeature)) {
-		case PageflowPackage.PF_PAGE__NAME:
-			return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT
-					.equals(name);
-		case PageflowPackage.PF_PAGE__COMMENT:
-			return COMMENT_EDEFAULT == null ? comment != null
-					: !COMMENT_EDEFAULT.equals(comment);
-		case PageflowPackage.PF_PAGE__X:
-			return x != X_EDEFAULT;
-		case PageflowPackage.PF_PAGE__Y:
-			return y != Y_EDEFAULT;
-		case PageflowPackage.PF_PAGE__WIDTH:
-			return width != WIDTH_EDEFAULT;
-		case PageflowPackage.PF_PAGE__HEIGHT:
-			return height != HEIGHT_EDEFAULT;
-		case PageflowPackage.PF_PAGE__ID:
-			return ID_EDEFAULT == null ? getId() != null : !ID_EDEFAULT
-					.equals(getId());
-		case PageflowPackage.PF_PAGE__PAGEFLOW:
-			return getPageflow() != null;
-		case PageflowPackage.PF_PAGE__OUTLINKS:
-			return outlinks != null && !outlinks.isEmpty();
-		case PageflowPackage.PF_PAGE__INLINKS:
-			return inlinks != null && !inlinks.isEmpty();
-		case PageflowPackage.PF_PAGE__PATH:
-			return PATH_EDEFAULT == null ? getPath() != null : !PATH_EDEFAULT
-					.equals(getPath());
-		case PageflowPackage.PF_PAGE__SMALLICON:
-			return SMALLICON_EDEFAULT == null ? getSmallicon() != null
-					: !SMALLICON_EDEFAULT.equals(getSmallicon());
-		case PageflowPackage.PF_PAGE__LARGEICON:
-			return LARGEICON_EDEFAULT == null ? getLargeicon() != null
-					: !LARGEICON_EDEFAULT.equals(getLargeicon());
-		}
-		return super.eIsSet(eFeature);
-	}
-
-	/**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (path: "); //$NON-NLS-1$
-		result.append(getPath());
-		result.append(", smallicon: "); //$NON-NLS-1$
-		result.append(getSmallicon());
-		result.append(", largeicon: "); //$NON-NLS-1$
-		result.append(getLargeicon());
-		result.append(')');
-		return result.toString();
-	}
-
-	public ReferenceElement getFCElements() {
-
-		if (refElement == null) {
-			refElement = new PageReferenceElement(this);
-		}
-		return refElement;
-	}
-
-}
-// PFPageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/ReferenceElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/ReferenceElement.java
deleted file mode 100644
index d013ee6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/model/impl/ReferenceElement.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.wst.common.internal.emf.resource.CompatibilityXMIResource;
-
-/**
- * The base class for mapping facesconfig node from pageflow node. The
- * ReferenceElement could be extended later to enable other model to be
- * referenced by pageflow.
- * 
- * @author hmeng
- * 
- */
-public abstract class ReferenceElement {
-
-	private List data = new ArrayList();
-
-	/**
-	 * the pageflow element
-	 */
-	protected PageflowElement pageflowElement;
-
-	/**
-	 * @param pageflowElement
-	 */
-	public ReferenceElement(PageflowElement pageflowElement) {
-		this.pageflowElement = pageflowElement;
-	}
-
-	/**
-	 * @param pageflowElement
-	 * @param facesConfigObject
-	 */
-	public ReferenceElement(PageflowElement pageflowElement,
-			EObject facesConfigObject) {
-		this(pageflowElement);
-		this.add(facesConfigObject);
-	}
-
-	/**
-	 * Add object to the list.
-	 * 
-	 * @param object
-	 */
-	public void add(EObject object) {
-		if (!data.contains(object)) {
-			data.add(object);
-		}
-	}
-
-
-	/**
-	 * The fragment path of a node.
-	 * 
-	 * @param object
-	 * @return the path
-	 */
-	public static String resolvePath(EObject object) {
-		if (object != null) {
-			((CompatibilityXMIResource) object.eResource())
-					.setFormat(CompatibilityXMIResource.FORMAT_EMF1);
-			String uriTarget = object.eResource().getURIFragment(object);
-			return uriTarget;
-		}
-        return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Resolve each referenced data's path and combine the result into one
-	 * string, the path will be seperated with '|'.
-	 * 
-	 * @return the resolved string 
-	 */
-	public String resolveReferenceString() {
-		String result = ""; //$NON-NLS-1$
-		for (int i = 0, n = data.size(); i < n; i++) {
-			result += resolvePath((EObject) data.get(i)) + "|"; //$NON-NLS-1$
-		}
-		if (result.length() > 0) {
-			result = result.substring(0, result.length());
-		}
-		return result;
-	}
-
-	/**
-	 * The EMF paths of all referenced elements.
-	 * 
-	 * @return the list of resolved paths for the data elements
-	 */
-	public List getPaths() {
-		List paths = new ArrayList();
-		for (int i = 0, n = data.size(); i < n; i++) {
-			paths.add(resolvePath((EObject) data.get(i)));
-		}
-		return paths;
-	}
-
-	/**
-	 * The facesconfig elements that are referenced.
-	 * 
-	 * @return the list of elements
-	 */
-	public List getData() {
-		return data;
-	}
-
-	/**
-	 * Clear the data
-	 */
-	public void clear() {
-		if (!data.isEmpty()) {
-			data.clear();
-		}
-	}
-
-	/**
-	 * @return true if the data is empty
-	 */
-	public boolean isEmpty() {
-		return data.isEmpty();
-	}
-
-	/**
-	 * Dispose the element
-	 */
-	public void dispose() {
-		clear();
-	}
-
-	/**
-	 * Update the referenced faces-config elements.
-	 * 
-	 */
-	abstract public void update();
-
-	/**
-	 * Return a pageflow property's value with referenced faces-config element.
-	 * 
-	 * @param eFeature
-	 * @return the value for eFeature
-	 */
-	abstract public Object get(int eFeature);
-
-	/**
-	 * To set a pageflow property's value will result in seting a faces-config
-	 * element.
-	 * 
-	 * @param eFeature
-	 * @param newValue
-	 */
-	abstract public void set(EStructuralFeature eFeature, Object newValue);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionDialogCellEditor.java
deleted file mode 100644
index a68e86c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionDialogCellEditor.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * 
- * Dialog Cell Editor for Action browser.
- * 
- * @author Xiao-guang Zhang
- */
-public class ActionDialogCellEditor extends EditableDialogCellEditor {
-
-
-	/**
-	 * Default constructor
-	 */
-	public ActionDialogCellEditor() {
-		super();
-	}
-
-
-	/**
-	 * @param parent
-	 */
-	public ActionDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public ActionDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		String actionExpression = getDefaultText().getText();
-		// IStructuredSelection selectionToPass = StructuredSelection.EMPTY;
-		// Create a new jsf Wizard
-
-		// FIXME sfshi 2005-11-16
-		// ActionSelectionWizard actionSelectionWizard =
-		// new ActionSelectionWizard(ActionSelectionWizard.CONSIDER_METHODS);
-		// actionSelectionWizard.init(EditorPlugin.getDefault().getWorkbench(),
-		// selectionToPass);
-		// actionSelectionWizard.setActionExpression(actionExpression);
-		// //using a wizard dialog to display the new jsf wizard
-		// WizardDialog actionSelectionWizardDialog =
-		// new WizardDialog(cellEditorWindow.getShell(),actionSelectionWizard);
-		// if (actionSelectionWizardDialog.open() == WizardDialog.OK )
-		// {
-		// actionExpression = actionSelectionWizard.getActionExpression();
-		// }
-		return actionExpression;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeDialogCellEditor.java
deleted file mode 100644
index 3c68341..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeDialogCellEditor.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * 
- * Dialog Cell Editor for Action's outcome browser.
- * 
- * @author Xiao-guang Zhang
- */
-public class ActionOutcomeDialogCellEditor extends EditableDialogCellEditor {
-	/** the source PFLink element */
-	PageflowElement element;
-
-	/**
-	 * @param element
-	 */
-	public ActionOutcomeDialogCellEditor(PageflowElement element) {
-		super();
-		this.element = element;
-	}
-
-	/**
-	 * @param parent
-	 * @param element
-	 */
-	public ActionOutcomeDialogCellEditor(Composite parent,
-			PageflowElement element) {
-		super(parent);
-		this.element = element;
-	}
-
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param element
-	 */
-	public ActionOutcomeDialogCellEditor(Composite parent, int style,
-			PageflowElement element) {
-		super(parent, style);
-		this.element = element;
-	}
-
-	/**
-	 * get the previous JSP page, it can be null if the previous node is not
-	 * PFPage, but PFAction.
-	 * 
-	 * @param element_
-	 * @return
-	 */
-	private String getPreviousJSPPath(PageflowElement element_) {
-		String jspPath = null;
-		if (element_ instanceof PageflowLink) {
-			PageflowNode source = ((PageflowLink) element_).getSource();
-
-			if (source instanceof PageflowPage) {
-				jspPath = ((PageflowPage) source).getPath();
-			}
-		}
-		return jspPath;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		String outcome = getDefaultText().getText();
-
-		String jspPathName = WebrootUtil.getProjectPath(element,
-				getPreviousJSPPath(element));
-
-		ActionOutcomeSelectionDialog selectionDialog = new ActionOutcomeSelectionDialog(
-				getControl().getShell(), outcome, jspPathName);
-
-		if (selectionDialog.open() == Window.OK) {
-			outcome = selectionDialog.getSelectedAction();
-		}
-
-		return outcome;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeSelectionDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeSelectionDialog.java
deleted file mode 100644
index b788e53..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionOutcomeSelectionDialog.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.Separator;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.JSPUtil;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * This dialog is used to edit outcome property of link component of Pageflow
- * Designer.
- * 
- * @author Xiao-guang Zhang
- */
-public class ActionOutcomeSelectionDialog extends Dialog {
-
-	/** property's name text control */
-	private Text actionText;
-
-	/** linked source jsp file name */
-	private String jspName;
-
-	/** the current outcome */
-	private String outcome;
-
-	/** action table control */
-	private Table actionTable;
-
-	/** Column width of component name and action */
-	private static final int COMPONENT_COL_WIDTH = 160;
-
-	private static final int ACTION_COL_WIDTH = 160;
-
-	/** Dialog default height and width */
-	private static final int DIALOG_DEFAULT_WIDTH = 400;
-
-	private static final int DIALOG_DEFAULT_HEIGHT = 300;
-
-	private static String JSF_EL_LEFT_BRACE = "#{"; //$NON-NLS-1$
-
-	private static String JSF_EL_RIGHT_BRACE = "}"; //$NON-NLS-1$
-
-	/** the listener for the text modification */
-	private ModifyListener modifyListener;
-
-	/**
-	 * @param parentShell
-	 * @param outcome
-	 * @param jspName
-	 */
-	public ActionOutcomeSelectionDialog(Shell parentShell, String outcome,
-			String jspName) {
-		super(parentShell);
-		this.outcome = outcome;
-		this.jspName = jspName;
-
-		modifyListener = new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				verifyComplete();
-			}
-		};
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createDialogArea(Composite)
-	 */
-	protected Control createDialogArea(Composite parent) {
-		GridLayout gridLayout;
-
-		Composite container = (Composite) super.createDialogArea(parent);
-		gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginWidth = 10;
-		gridLayout.marginHeight = 10;
-		container.setLayout(gridLayout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		// gd.widthHint = 300;
-		gd.heightHint = DIALOG_DEFAULT_HEIGHT;
-		gd.widthHint = DIALOG_DEFAULT_WIDTH;
-		container.setLayoutData(gd);
-
-		Label choiceLabel = new Label(container, SWT.LEFT);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		// gd.widthHint = 100;
-		choiceLabel.setLayoutData(gd);
-		// Pageflow.Property.Action.OutcomeSelectionDialog.Choice = Enter the
-		// outcome or select one from action list below:
-		choiceLabel
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_Choice);
-
-		createOutcomeSection(container);
-
-		createActionListSection(container);
-
-		return container;
-	}
-
-	/**
-	 * create a Outcome input section
-	 * 
-	 * @param container
-	 */
-	protected void createOutcomeSection(Composite container) {
-		Composite outcomeSection = new Composite(container, SWT.NONE);
-		GridLayout gl = new GridLayout();
-		gl.numColumns = 1;
-		gl.marginWidth = 0;
-		outcomeSection.setLayout(gl);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		outcomeSection.setLayoutData(gd);
-
-		actionText = new Text(outcomeSection, SWT.BORDER);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.FILL_HORIZONTAL);
-		actionText.setLayoutData(gd);
-
-		actionText.addModifyListener(modifyListener);
-
-		if (outcome != null && outcome.length() > 0) {
-			actionText.setText(outcome);
-		}
-	}
-
-	/**
-	 * create action list table section
-	 * 
-	 * @param container
-	 */
-	protected void createActionListSection(Composite container) {
-		final Group actionSection = new Group(container, SWT.NONE);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		actionSection.setLayout(gridLayout);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		actionSection.setLayoutData(gd);
-
-		String actionListTitle = null;
-		if (jspName != null && jspName.length() > 0) {
-			actionListTitle = NLS.bind(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTableWithJSP_Title, jspName);			
-		} else {
-			actionListTitle = PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Title;
-		}
-
-		// Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Title
-		// = Actions
-		actionSection.setText(actionListTitle);
-
-		actionTable = new Table(actionSection, SWT.BORDER | SWT.FULL_SELECTION);
-		actionTable.setLayoutData(new GridData(GridData.FILL_BOTH));
-		actionTable.setHeaderVisible(true);
-		actionTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		actionTable.setLayout(layout);
-
-		layout.addColumnData(new ColumnPixelData(COMPONENT_COL_WIDTH));
-		layout.addColumnData(new ColumnPixelData(ACTION_COL_WIDTH));
-		TableColumn componentCol = new TableColumn(actionTable, SWT.NONE);
-		// Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Component
-		// = Component ID
-		componentCol
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Component);
-		TableColumn actionCol = new TableColumn(actionTable, SWT.NONE);
-
-		// Pageflow.Property.Action.OutcomeSelectionDialog.ActionListTable.Action
-		// = Action
-		actionCol
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_ActionListTable_Action);
-
-		actionTable.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				TableItem selItem = (TableItem) e.item;
-				String action = selItem.getText(1);
-				if (action != null && action.length() > 0)
-					actionText.setText(action);
-			}
-		});
-
-		addActionsInJSP();
-
-	}
-
-	/**
-	 * Creates a separator line. Expects a <code>GridLayout</code> with at
-	 * least 1 column.
-	 * 
-	 * @param composite
-	 *            the parent composite
-	 * @param nColumns
-	 *            number of columns to span
-	 */
-	protected void createSeparator(Composite composite, int nColumns) {
-		(new Separator(SWT.SEPARATOR | SWT.HORIZONTAL)).doFillIntoGrid(null,
-				composite, nColumns, convertHeightInCharsToPixels(1));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#createButtonsForButtonBar(Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
-				true);
-		createButton(parent, IDialogConstants.CANCEL_ID,
-				IDialogConstants.CANCEL_LABEL, false);
-
-		verifyComplete();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#configureShell(Shell)
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-
-		// Pageflow.Property.Action.OutcomeSelectionDialog.Title = Outcome
-		// Selection
-		newShell
-				.setText(PageflowMessages.Pageflow_Property_Action_OutcomeSelectionDialog_Title);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see Dialog#buttonPressed(int)
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (buttonId == IDialogConstants.CANCEL_ID) {
-			setReturnCode(CANCEL);
-			close();
-			return;
-		} else if (buttonId == IDialogConstants.OK_ID) {
-			setReturnCode(OK);
-
-			outcome = actionText.getText();
-
-			close();
-			return;
-		}
-		super.buttonPressed(buttonId);
-	}
-
-	/**
-	 * 
-	 * check the dialog inputs are complete or not, and set the OK button enable
-	 * or not.
-	 */
-	private void verifyComplete() {
-		if (getButton(IDialogConstants.OK_ID) != null) {
-			getButton(IDialogConstants.OK_ID).setEnabled(isDialogComplete());
-		}
-	}
-
-	/**
-	 * check the dialog inputs are complete or not.
-	 * 
-	 * @return
-	 */
-	private boolean isDialogComplete() {
-		return isValidName();
-	}
-
-	/**
-	 * the input name is valid or not
-	 * 
-	 * @return
-	 */
-	private boolean isValidName() {
-		return actionText.getText().length() > 0;
-	}
-
-	/**
-	 * get the selected action in the action table
-	 * 
-	 * @return - selected action
-	 */
-	public String getSelectedAction() {
-		return outcome;
-	}
-
-	/**
-	 * add actions in the source jsp file to the action list table control
-	 * 
-	 */
-	private void addActionsInJSP() {
-		List actionNodes = JSPUtil.getActionListInJSPFile(jspName);
-
-		if (actionNodes != null) {
-			for (int i = 0, n = actionNodes.size(); i < n; i++) {
-				Element node = (Element) actionNodes.get(i);
-				StringBuffer componentName = new StringBuffer();
-
-				Attr idAttr = node.getAttributeNode("id"); //$NON-NLS-1$
-				if (idAttr != null)
-					componentName.append(idAttr.getNodeValue());
-
-				componentName.append("(").append(node.getTagName()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
-
-				Attr actionAttr = node.getAttributeNode("action"); //$NON-NLS-1$
-				if (actionAttr != null) {
-					String action = actionAttr.getValue();
-					if (isValidEL(action))
-						addActionTableItem(componentName.toString(), action);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param expressionString
-	 * @return true if expressionString is valid EL
-	 */
-	public static boolean isValidEL(String expressionString) {
-		if (expressionString == null || expressionString.length() == 0)
-			return true;
-
-		return (expressionString.startsWith(JSF_EL_LEFT_BRACE) && expressionString
-				.endsWith(JSF_EL_RIGHT_BRACE))
-				|| (!expressionString.startsWith(JSF_EL_LEFT_BRACE) && !expressionString
-						.endsWith(JSF_EL_RIGHT_BRACE));
-	}
-
-	/**
-	 * add a new action item in the previous jsp page.
-	 * 
-	 * @param componentName -
-	 *            JSF component element
-	 * @param action -
-	 *            value of action's attribute
-	 */
-	private void addActionTableItem(String componentName, String action) {
-		if (componentName != null && componentName.length() > 0
-				&& action != null && action.length() > 0) {
-			TableItem item = new TableItem(actionTable, SWT.NONE);
-			item.setText(0, componentName);
-			item.setText(1, action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionSectionDescriptor.java
deleted file mode 100644
index 85ff2e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ActionSectionDescriptor.java
+++ /dev/null
@@ -1,11 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditableDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditableDialogCellEditor.java
deleted file mode 100644
index ee2cd23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditableDialogCellEditor.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jface.viewers.DialogCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Hong-tao Meng
- */
-public abstract class EditableDialogCellEditor extends DialogCellEditor {
-	private Text text;
-
-	/**
-	 * 
-	 */
-	public EditableDialogCellEditor() {
-		super();
-	}
-
-	/**
-	 * @param parent
-	 */
-	public EditableDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public EditableDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite cell) {
-		text = new Text(cell, SWT.LEFT);
-		text.setFont(cell.getFont());
-		text.setBackground(cell.getBackground());
-		text.addKeyListener(new KeyAdapter() {
-			// hook key pressed - see PR 14201
-			public void keyPressed(KeyEvent e) {
-				keyReleaseOccured(e);
-				// disposed this cell editor
-				if ((getControl() == null) || getControl().isDisposed()) {
-					return;
-				}
-			}
-		});
-		// when the text control has focus, the cellEditor will deactive even
-		// when you press the button.
-		// Add the follow codes enable switch to the button control.
-		text.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				boolean newValidState = isCorrect(text.getText());
-				if (newValidState) {
-					markDirty();
-					doSetValue(text.getText());
-				} else {
-					// try to insert the current value into the error message.
-					setErrorMessage(MessageFormat.format(getErrorMessage(),
-							new Object[] { text.getText().toString() }));
-				}
-			}
-		});
-
-		return text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#doSetFocus()
-	 */
-	protected void doSetFocus() {
-		text.setFocus();
-		text.selectAll();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#updateContents(java.lang.Object)
-	 */
-	protected void updateContents(Object value) {
-		if (text == null) {
-			return;
-		}
-
-		String text_ = "";//$NON-NLS-1$
-		if (value != null) {
-			text_ = value.toString();
-		}
-		this.text.setText(text_);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\r') {
-			boolean newValidState = isCorrect(text.getText());
-			if (newValidState) {
-				markDirty();
-				doSetValue(text.getText());
-			} else {
-				// try to insert the current value into the error message.
-				setErrorMessage(MessageFormat.format(getErrorMessage(),
-						new Object[] { text.getText().toString() }));
-			}
-			fireApplyEditorValue();
-		}
-		super.keyReleaseOccured(keyEvent);
-	}
-
-	/**
-	 * @return the default text
-	 */
-	public Text getDefaultText() {
-		return text;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditorSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditorSectionDescriptor.java
deleted file mode 100644
index 6628690..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/EditorSectionDescriptor.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section.EditorSection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-
-
-/**
- * @author jchoi
- */
-public class EditorSectionDescriptor implements ISectionDescriptor {
-	/**
-	 * constructor
-	 */
-	public EditorSectionDescriptor() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getId()
-	 */
-	public String getId() {
-		return ITabbedPropertiesConstants.EDITOR_SECTION;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		return new EditorSection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return ITabbedPropertiesConstants.ATTRIBUTE_TAB_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Object object = null;
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			object = structuredSelection.getFirstElement();
-			// The editor section in the attribute tab will be shown for only
-			// pageflow element
-			if (object instanceof PageflowEditPart) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return ITabbedPropertiesConstants.TOP_SECTION;
-	}
-
-	public int getEnablesFor() {
-		return ENABLES_FOR_ANY;
-	}
-
-	public IFilter getFilter() {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ExistingPagePathDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ExistingPagePathDialogCellEditor.java
deleted file mode 100644
index 121a2da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ExistingPagePathDialogCellEditor.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.ListChoiceDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * The cell editor used to locate an existing pageflow page node in current
- * pageflow.
- * 
- * @author hmeng
- * 
- */
-public class ExistingPagePathDialogCellEditor extends EditableDialogCellEditor {
-	Pageflow pageflow;
-
-	/**
-	 * 
-	 */
-	public ExistingPagePathDialogCellEditor() {
-		super();
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public ExistingPagePathDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/**
-	 * @param parent
-	 * @param pageflow
-	 */
-	public ExistingPagePathDialogCellEditor(Composite parent, Pageflow pageflow) {
-		super(parent);
-		this.pageflow = pageflow;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#openDialogBox(Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		String jsfSelection = ""; //$NON-NLS-1$
-		if (getDefaultText() != null && getDefaultText().getText().length() > 0) {
-			jsfSelection = getDefaultText().getText();
-		}
-		ListChoiceDialog dialog = new ListChoiceDialog(cellEditorWindow
-				.getShell(), getPagePaths(),
-				PageflowMessages.ExistingPagePathDialogCellEdito_LabelText);
-
-		if (dialog.open() == Window.OK) {
-			jsfSelection = dialog.getResult();
-		}
-		return jsfSelection;
-	}
-
-	/**
-	 * Collect page paths in current pageflow.
-	 * 
-	 * @return
-	 */
-	private String[] getPagePaths() {
-		List result = new ArrayList();
-		List list = pageflow.getNodes();
-		for (int i = 0; i < list.size(); i++) {
-			String path = ((PageflowPage) list.get(i)).getPath();
-			if (path != null && path.trim().length() > 0) {
-				result.add(path);
-			}
-		}
-		String[] r = (String[]) result.toArray(new String[result.size()]);
-		Arrays.sort(r);
-		return r;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSection.java
deleted file mode 100644
index 85884e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSection.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.PageBook;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * This class defines the general tab for pageflow attributes. This class
- * defines the controls shown in this sectin and their event handler. For
- * MultiPageEditorPart, if it support getAdapter(IEditorPart.class) to get the
- * current active editor, then, this section can get the different
- * PropertySheetPage for different sub EditorPart.
- * 
- * @author Xiao-guang Zhang
- */
-public class GeneralViewSection implements ISection, 
-		ISelectionChangedListener {
-	/** the pagebook */
-	private PageBook pageBook = null;
-
-	/**
-	 * A data structure used to store the information about a single page within
-	 * a MultiPageEditorPart
-	 */
-	protected static class PageRec {
-
-		/**
-		 * The part including editorpart, or Control
-		 */
-		public IWorkbenchPart part;
-
-		/**
-		 * The page.
-		 */
-		public IPropertySheetPage page;
-
-		/**
-		 * Creates a new page record initialized to the given part and page.
-		 * 
-		 * @param part
-		 * @param page
-		 */
-		public PageRec(IWorkbenchPart part, IPropertySheetPage page) {
-			this.part = part;
-			this.page = page;
-		}
-
-		/**
-		 * Disposes of this page record by <code>null</code>ing its fields.
-		 */
-		public void dispose() {
-			part = null;
-			page = null;
-		}
-	}
-
-	/**
-	 * Map from parts to part records (key type: <code>IWorkbenchPart</code>;
-	 * value type: <code>PartRec</code>).
-	 */
-	private Map mapPartToRec = new HashMap();
-
-	/**
-	 * The page record for the default page.
-	 */
-	private PageRec defaultPageRec;
-
-	/**
-	 * The page rec which provided the current page or <code>null</code>
-	 */
-	private PageRec activeRec;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.createControls(Composite, TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		FillLayout layout = new FillLayout();
-		layout.marginWidth = ITabbedPropertyConstants.HSPACE;
-		layout.marginHeight = ITabbedPropertyConstants.VSPACE;
-
-		// composite.setLayout(layout);
-		parent.setLayout(layout);
-		// pagebook
-		pageBook = new PageBook(parent, SWT.BORDER);
-
-		// create a default property page.
-		createDefaultPage();
-
-		// Show the default page
-		if (defaultPageRec != null) {
-			showPageRec(defaultPageRec);
-		}
-	}
-
-	/**
-	 * Shows page contained in the given page record in this view. The page
-	 * record must be one from this pagebook view.
-	 * <p>
-	 * The <code>PageBookView</code> implementation of this method asks the
-	 * pagebook control to show the given page's control, and records that the
-	 * given page is now current. Subclasses may extend.
-	 * </p>
-	 * 
-	 * @param pageRec
-	 *            the page record containing the page to show
-	 */
-	protected void showPageRec(PageRec pageRec) {
-		// If already showing do nothing
-		if (activeRec == pageRec) {
-			return;
-		}
-		// If the page is the same, just set activeRec to pageRec
-		if (activeRec != null && pageRec != null
-				&& activeRec.page == pageRec.page) {
-			activeRec = pageRec;
-			return;
-		}
-
-		// Show new page.
-		activeRec = pageRec;
-		Control pageControl = activeRec.page.getControl();
-		if (pageControl != null && !pageControl.isDisposed()) {
-			// Verify that the page control is not disposed
-			// If we are closing, it may have already been disposed
-			pageBook.showPage(pageControl);
-		}
-	}
-
-	/**
-	 * Creates a page for a given part. Adds it to the pagebook but does not
-	 * show it.
-	 * 
-	 * @param part
-	 *            The part we are making a page for.
-	 * @return IWorkbenchPart
-	 */
-	private PageRec createPage(IWorkbenchPart part) {
-		PageRec rec = doCreatePage(part);
-		if (rec != null) {
-			mapPartToRec.put(part, rec);
-		}
-		return rec;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on PageBookView.
-	 */
-	/**
-	 * @param part
-	 * @return PageRec for part
-	 */
-	protected PageRec doCreatePage(IWorkbenchPart part) {
-		// FIXME: Because the PropertySheetPage of StructuredTextEditor has a
-		// bug:
-		// the editor can't be opened twice if the property view is shown.
-		// This bug only exists in WTP 1.0.0 version.
-		if (part instanceof StructuredTextEditor) {
-			return null;
-		}
-		// Try to get an property page.
-		Object obj = part.getAdapter(IPropertySheetPage.class);
-		if (obj instanceof IPropertySheetPage) {
-			IPropertySheetPage page = (IPropertySheetPage) obj;
-
-			page.createControl(getPageBook());
-
-			return new PageRec(part, page);
-		}
-		// There is no content property page
-		return null;
-	}
-
-	private void createDefaultPage() {
-		// Create the default PropertySheetPage rec.
-		IPropertySheetPage defaultPage = new PropertySheetPage();
-		defaultPage.createControl(getPageBook());
-
-		defaultPageRec = new PageRec(null, defaultPage);
-	}
-
-	/**
-	 * Returns the pagebook control for this view.
-	 * 
-	 * @return the pagebook control, or <code>null</code> if not initialized
-	 */
-	protected PageBook getPageBook() {
-		return pageBook;
-	}
-
-	/**
-	 * Returns the page record for the given part.
-	 * 
-	 * @param part
-	 *            the part
-	 * @return the corresponding page record, or <code>null</code> if not
-	 *         found
-	 */
-	protected PageRec getPageRec(Object part) {
-		return (PageRec) mapPartToRec.get(part);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISection#setInput(IWorkbenchPart, ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		if (part instanceof MultiPageEditorPart) {
-			IEditorPart subPage = (IEditorPart) part
-					.getAdapter(IEditorPart.class);
-			if (subPage != null) {
-				// get or Create a PropertySheetPage for the part.
-				PageRec rec = getPageRec(subPage);
-				if (rec == null) {
-					rec = createPage(subPage);
-				}
-
-				// Show the page.
-				if (rec != null) {
-					showPageRec(rec);
-				} else {
-					showPageRec(defaultPageRec);
-				}
-			}
-		}
-		activeRec.page.selectionChanged(part, selection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISection#aboutToBeShown()
-	 */
-	public void aboutToBeShown() {
-		refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISection#aboutToBeHidden()
-	 */
-	public void aboutToBeHidden() {
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISection#dispose()
-	 */
-	public void dispose() {
-		// Deref all of the pages.
-		activeRec = null;
-		if (defaultPageRec != null) {
-			// check for null since the default page may not have
-			// been created (ex. perspective never visible)
-			defaultPageRec.page.dispose();
-			defaultPageRec = null;
-		}
-		Map clone = (Map) ((HashMap) mapPartToRec).clone();
-		Iterator iter = clone.values().iterator();
-		while (iter.hasNext()) {
-			PageRec rec = (PageRec) iter.next();
-			removePage(rec);
-		}
-	}
-
-	/**
-	 * Removes a page record. If it is the last reference to the page dispose of
-	 * it - otherwise just decrement the reference count.
-	 * 
-	 * @param rec
-	 */
-	private void removePage(PageRec rec) {
-		mapPartToRec.remove(rec.part);
-
-		Control control = rec.page.getControl();
-		if (control != null && !control.isDisposed()) {
-			// Dispose the page's control so pages don't have to do this in
-			// their
-			// dispose method.
-			// The page's control is a child of this view's control so if this
-			// view
-			// is closed, the page's control will already be disposed.
-			control.dispose();
-		}
-
-		// free the page
-		doDestroyPage(rec.part, rec);
-	}
-
-	/**
-	 * Destroys a page in the pagebook for a particular part.
-	 * 
-	 * @param part
-	 *            the input part
-	 * @param rec
-	 *            a page record for the part
-	 */
-	protected void doDestroyPage(IWorkbenchPart part, PageRec rec) {
-		IPropertySheetPage page = rec.page;
-		page.dispose();
-		rec.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISection#getMinimumHeight()
-	 */
-	public int getMinimumHeight() {
-		return SWT.DEFAULT;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ISection#shouldUseExtraSpace()
-	 */
-	public boolean shouldUseExtraSpace() {
-		/**
-		 * here should return true, otherwise, the component controls will not
-		 * fill the whole panel of the tab.
-		 */
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ISection#refresh()
-	 */
-	public void refresh() {
-		return;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		setInput((IWorkbenchPart) event.getSource(), event.getSelection());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSectionDescriptor.java
deleted file mode 100644
index 4a75028..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/GeneralViewSectionDescriptor.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementTreeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowLinkEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-/**
- * This class defines the section descriptor for pageflow attributes. Following
- * is the typical function of SectionDescriptor for tabbed property views. 1. In
- * tabbed property view, there are multiple sections, one or more than one
- * sections can be composed of one tab. 2. Each of section has an ID, and their
- * relationship is defined by the function "getAfterSection". 3. Not all
- * sections are enabled always. They are enabled according to current
- * WorkbenchPart and selection, which is defined in function "appliesTo".
- * 
- * @author Xiao-guang Zhang
- */
-public class GeneralViewSectionDescriptor implements ISectionDescriptor {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getId()
-	 */
-	public String getId() {
-		return ITabbedPropertiesConstants.GENERAL_TAB_ID;
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		return new GeneralViewSection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return ITabbedPropertiesConstants.GENERAL_TAB_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#appliesTo(IWorkbenchPart, ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Object object = null;
-		// FIXME: Should move the appliesTo to differnt page of
-		// MultiPageEditorPart.
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			object = structuredSelection.getFirstElement();
-			// The general tab will be shown for only pageflow element and
-			// pageflow link editparts
-			if (object instanceof PageflowElementEditPart
-					|| object instanceof PageflowElementTreeEditPart) {
-				return true;
-			} else if (object instanceof PageflowLinkEditPart) {
-				PageflowLink pfLink = (PageflowLink) ((PageflowLinkEditPart) object)
-						.getModel();
-				if (PageflowValidation.getInstance().isValidLinkForProperty(
-						pfLink)) {
-					return true;
-				}
-			} else {
-				return true;
-			}
-		} else if (selection instanceof ITextSelection) {
-			return true;
-		}
-
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return ""; //$NON-NLS-1$
-	}
-
-	public int getEnablesFor() {
-		return ENABLES_FOR_ANY;
-	}
-
-
-	public IFilter getFilter() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ITabbedPropertiesConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ITabbedPropertiesConstants.java
deleted file mode 100644
index 54e6e75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ITabbedPropertiesConstants.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-/**
- * @author jchoi
- * @version
- */
-public interface ITabbedPropertiesConstants {
-	/**
-	 * used to set grid data height hints on dialog fields
-	 */
-	public static int BROWSE_HEIGHT = 18;
-
-	/**
-	 * used to set grid data width hints on dialog fields
-	 */
-	public static int BROWSE_WIDTH = 20;
-
-	/**
-	 * the general tag id
-	 */
-	public static final String GENERAL_TAB_ID = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.general"; //$NON-NLS-1$
-
-	/**
-	 * the attribute tag id
-	 */
-	public static final String ATTRIBUTE_TAB_ID = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.attribute"; //$NON-NLS-1$
-
-	/**
-	 * the link section id
-	 */
-	public static final String LINK_SECTION = "attribute.link"; // 4 //$NON-NLS-1$
-
-	/**
-	 * the page section id
-	 */
-	public static final String PAGE_SECTION = "attribute.page"; // 3 //$NON-NLS-1$
-
-	/**
-	 * the editor section id
-	 */
-	public static final String EDITOR_SECTION = "attribute.editor"; // 1 //$NON-NLS-1$
-
-	/**
-	 * the top section id
-	 */
-	public static final String TOP_SECTION = "top"; // 0 //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/LinkSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/LinkSectionDescriptor.java
deleted file mode 100644
index d0cc430..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/LinkSectionDescriptor.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowLinkEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section.LinkSection;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-/**
- * @author jchoi
- * @version
- */
-public class LinkSectionDescriptor implements ISectionDescriptor {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getId()
-	 */
-	public String getId() {
-		return ITabbedPropertiesConstants.LINK_SECTION;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		return new LinkSection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return ITabbedPropertiesConstants.ATTRIBUTE_TAB_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Object object = null;
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			object = structuredSelection.getFirstElement();
-			if (object instanceof PageflowLinkEditPart) {
-				PageflowLink pfLink = (PageflowLink) ((PageflowLinkEditPart) object).getModel();
-				if (PageflowValidation.getInstance().isValidLinkForProperty(
-						pfLink)) {
-
-					return true;
-				}
-
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return ITabbedPropertiesConstants.TOP_SECTION;
-	}
-
-	public int getEnablesFor() {
-		return ENABLES_FOR_ANY;
-	}
-
-	public IFilter getFilter() {
-		return null;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PagePathDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PagePathDialogCellEditor.java
deleted file mode 100644
index fbe5502..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PagePathDialogCellEditor.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Dialog Cell Editor for Page path browser.
- * 
- * @author Xiao-guang Zhang
- */
-public class PagePathDialogCellEditor extends EditableDialogCellEditor {
-	PageflowPage element;
-
-	/**
-	 * Default constructor
-	 */
-	public PagePathDialogCellEditor() {
-		super();
-	}
-
-	/**
-	 * @param parent
-	 * @param element
-	 */
-	public PagePathDialogCellEditor(Composite parent, PageflowPage element) {
-		super(parent);
-		this.element = element;
-	}
-
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public PagePathDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see DialogCellEditor#openDialogBox(Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		String jsfSelection = ""; //$NON-NLS-1$
-		if (getDefaultText() != null && getDefaultText().getText().length() > 0) {
-			jsfSelection = getDefaultText().getText();
-			IProject project = WebrootUtil.getProject(element);
-			ProjectWebPageSelectionDialog dlg = new ProjectWebPageSelectionDialog(
-					cellEditorWindow.getShell(), project);
-			if (dlg.open() == Window.OK) {
-				jsfSelection = dlg.getResultFilePath();
-			}
-		}
-		return jsfSelection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageSectionDescriptor.java
deleted file mode 100644
index 4e7fc80..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageSectionDescriptor.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IFilter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPageImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section.PageSection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-/**
- * @author jchoi
- * @version
- */
-public class PageSectionDescriptor implements ISectionDescriptor {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getId()
-	 */
-	public String getId() {
-		return ITabbedPropertiesConstants.PAGE_SECTION;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getInputTypes()
-	 */
-	public List getInputTypes() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getSectionClass()
-	 */
-	public ISection getSectionClass() {
-		return new PageSection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getTargetTab()
-	 */
-	public String getTargetTab() {
-		return ITabbedPropertiesConstants.ATTRIBUTE_TAB_ID;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Object object = null;
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			object = structuredSelection.getFirstElement();
-			if (object instanceof PageflowNodeEditPart) {
-				Object model = ((PageflowNodeEditPart) object).getModel();
-				if (model instanceof PageflowPageImpl) {
-					return true;
-				}
-			}
-		}
-		return false;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISectionDescriptor#getAfterSection()
-	 */
-	public String getAfterSection() {
-		return ITabbedPropertiesConstants.TOP_SECTION;
-	}
-
-	public int getEnablesFor() {
-		return ENABLES_FOR_ANY;
-	}
-
-
-	public IFilter getFilter() {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowElementPropertySource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowElementPropertySource.java
deleted file mode 100644
index 8eebce5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowElementPropertySource.java
+++ /dev/null
@@ -1,478 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * This class is intended to be a generic property source for all the objects in
- * the application's model. It currently only supports String and boolean types,
- * and doesn't support reset or nested properties. It uses information in the
- * EMF EAttribute and EDataType classes to get the id, display name, and type
- * information.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowElementPropertySource implements IPropertySource {
-	/** attribute name of "path" and "action", which have special property editor */
-	private static final String PAGEFLOW_PATH = "path"; //$NON-NLS-1$    
-
-	static final String PAGEFLOW_NAME = "name"; //$NON-NLS-1$
-
-	static final String PAGEFLOW_COMMENT = "comment"; //$NON-NLS-1$
-
-	private static final String PAGEFLOW_CONFIG_FILE = "configfile"; //$NON-NLS-1$
-
-	/** pageflow elememt */
-	PageflowElement element;
-
-	/** boolean value's label */
-	private static final String P_VALUE_TRUE_LABEL = PageflowMessages.Pageflow_Label_True;
-
-	private static final String P_VALUE_FALSE_LABEL = PageflowMessages.Pageflow_Label_False;
-
-	/** Integer value for boolean type */
-	private static final int P_VALUE_TRUE = 0;
-
-	private static final int P_VALUE_FALSE = 1;
-
-	static class BooleanLabelProvider extends LabelProvider {
-		public String getText(Object element) {
-			String[] values = new String[] { P_VALUE_TRUE_LABEL,
-					P_VALUE_FALSE_LABEL };
-			return values[((Integer) element).intValue()];
-		}
-
-		public Image getImage(Object element) {
-			return EditorPlugin.getDefault().getImage(
-					"facesconfig/Pageflow_BooleanValue.gif"); //$NON-NLS-1$
-		}
-	}
-
-	static class PageflowLabelProvider extends LabelProvider {
-
-		public Image getImage(Object element) {
-			if (element instanceof String) {
-				return EditorPlugin.getDefault().getImage(
-						"facesconfig/Pageflow_TextValue.gif");//$NON-NLS-1$
-			} else if (element instanceof Integer) {
-				return EditorPlugin.getDefault().getImage(
-						"facesconfig/Pageflow_IntegralValue.gif");//$NON-NLS-1$
-			} else {
-				return EditorPlugin.getDefault().getImage(
-						"facesconfig/Pageflow_GenericValue.gif");//$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * constructor
-	 * 
-	 * @param element -
-	 *            pageflow element model.
-	 */
-	public PageflowElementPropertySource(PageflowElement element) {
-		this.element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#getEditableValue()
-	 */
-	public Object getEditableValue() {
-		return element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#getPropertyDescriptors()
-	 */
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		// property descriptors
-		List propertyDescriptors = new Vector();
-
-		// if (element instanceof PageflowLink) {
-		// return getLinkPropertyDescriptors();
-		// }
-
-		Iterator it;
-		EClass cls = element.eClass();
-
-		it = cls.getEAllAttributes().iterator();
-		while (it.hasNext()) {
-			EAttribute attr = (EAttribute) it.next();
-			if (attr.isID()
-					|| attr.getFeatureID() == PageflowPackage.PAGEFLOW__REFERENCE_LINK) {
-				continue;
-			}
-			EDataType type = attr.getEAttributeType();
-			if (type.getInstanceClass() == String.class) {
-				PropertyDescriptor propertyDescriptor;
-				if (attr.getName().equalsIgnoreCase(PAGEFLOW_PATH)) {
-					propertyDescriptor = getPagePathPropertyDescriptor(attr);
-				} else if (attr.getName()
-						.equalsIgnoreCase(PAGEFLOW_CONFIG_FILE)) {
-					propertyDescriptor = null;
-				} else {
-					propertyDescriptor = new TextPropertyDescriptor(Integer
-							.toString(attr.getFeatureID()), getString(attr
-							.getName()));
-				}
-				if (propertyDescriptor != null) {
-					propertyDescriptor
-							.setLabelProvider(new PageflowLabelProvider());
-					propertyDescriptors.add(propertyDescriptor);
-				}
-
-			} else if (type.getInstanceClass() == boolean.class) {
-				PropertyDescriptor propertyDescriptor;
-				propertyDescriptor = getBooleanTypePropertyDescriptor(attr);
-				propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
-				propertyDescriptors.add(propertyDescriptor);
-			}
-		}
-
-		return (IPropertyDescriptor[]) propertyDescriptors
-				.toArray(new IPropertyDescriptor[] {});
-	}
-
-	/**
-	 * @return
-	 */
-    // TODO: method not used; dead?
-//	private IPropertyDescriptor[] getLinkPropertyDescriptors() {
-//		// property descriptors
-//		List propertyDescriptors = new Vector();
-//
-//		Iterator it;
-//		EClass cls = element.eClass();
-//
-//		it = cls.getEAllAttributes().iterator();
-//		while (it.hasNext()) {
-//			EAttribute attr = (EAttribute) it.next();
-//			if (attr.isID()
-//					|| attr.getName().equalsIgnoreCase(PAGEFLOW_NAME)
-//					|| attr.getName().equalsIgnoreCase(PAGEFLOW_COMMENT)
-//					|| attr.getFeatureID() == PageflowPackage.PAGEFLOW__REFERENCE_LINK) {
-//				continue;
-//			}
-//
-//			EDataType type = attr.getEAttributeType();
-//			if (type.getInstanceClass() == String.class) {
-//				PropertyDescriptor propertyDescriptor;
-//
-//				propertyDescriptor = new TextPropertyDescriptor(Integer
-//						.toString(attr.getFeatureID()), getString(attr
-//						.getName()));
-//
-//				if (propertyDescriptor != null) {
-//					propertyDescriptor
-//							.setLabelProvider(new PageflowLabelProvider());
-//					propertyDescriptors.add(propertyDescriptor);
-//				}
-//
-//			} else if (type.getInstanceClass() == boolean.class) {
-//				PropertyDescriptor propertyDescriptor;
-//				propertyDescriptor = getBooleanTypePropertyDescriptor(attr);
-//				propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
-//				propertyDescriptors.add(propertyDescriptor);
-//			}
-//		}
-//
-//		return (IPropertyDescriptor[]) propertyDescriptors
-//				.toArray(new IPropertyDescriptor[] {});
-//	}
-
-	/**
-	 * get the property descriptor for the attribute "path" of page component
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-	private PropertyDescriptor getPagePathPropertyDescriptor(EAttribute attr) {
-		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-				.toString(attr.getFeatureID()), getString(attr.getName())) {
-			public CellEditor createPropertyEditor(Composite parent) {
-				CellEditor editor = new PagePathDialogCellEditor(parent,
-						(PageflowPage) element);
-				if (getValidator() != null) {
-					editor.setValidator(getValidator());
-				}
-				return editor;
-			}
-
-			/**
-			 * Returns the input validator for editing the property.
-			 * 
-			 * @return the validator used to verify correct values for this
-			 *         property, or <code>null</code>
-			 */
-			protected ICellEditorValidator getValidator() {
-				return new ICellEditorValidator() {
-					public String isValid(Object value) {
-						if (((PageflowPage) element).getPath() != null
-								&& value != null
-								&& !((PageflowPage) element).getPath()
-										.equalsIgnoreCase((String) value)) {
-							if (PageflowValidation.getInstance().isExistedPage(
-									((PageflowPage) element).getPageflow(),
-									(String) value)) {
-								// Pageflow.PageflowEditor.Alert.DNDResourceTitle
-								// = Pageflow Creation Error
-								// Pageflow.PageflowEditor.Alert.ExistingPage =
-								// The web page {0} is already existed in
-								// current PageFlow.
-								EditorPlugin
-										.getAlerts()
-										.error(
-												"Pageflow.PageflowEditor.Alert.DNDResourceTitle", //$NON-NLS-1$
-												"Pageflow.PageflowEditor.Alert.ExistingPage", //$NON-NLS-1$
-												value);
-
-								return EditorPlugin
-										.getResourceString("Pageflow.PageflowEditor.Alert.ExistingPage"); //$NON-NLS-1$
-							}
-						}
-						return null;
-					}
-
-				};
-			}
-
-		};
-		return propertyDescriptor;
-	}
-
-	/**
-	 * get the property descriptor for the attribute "action" of Action
-	 * component
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-    // TODO: method not used; dead?
-//	private PropertyDescriptor getActionPropertyDescriptor(EAttribute attr) {
-//		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-//				.toString(attr.getFeatureID()), getString(attr.getName())) {
-//			public CellEditor createPropertyEditor(Composite parent) {
-//				CellEditor editor = new ActionDialogCellEditor(parent);
-//				if (getValidator() != null) {
-//					editor.setValidator(getValidator());
-//				}
-//				return editor;
-//			}
-//
-//			/**
-//			 * Returns the input validator for editing the property.
-//			 * 
-//			 * @return the validator used to verify correct values for this
-//			 *         property, or <code>null</code>
-//			 */
-//			protected ICellEditorValidator getValidator() {
-//				return new ICellEditorValidator() {
-//					public String isValid(Object value) {
-//
-//						return null;
-//					}
-//
-//				};
-//			}
-//		};
-//		return propertyDescriptor;
-//	}
-
-	/**
-	 * get the property descriptor for the attribute "outcome" of Link component
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-    // TODO: method not used; dead?
-//	private PropertyDescriptor getActionOutcomePropertyDescriptor(
-//			EAttribute attr) {
-//		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-//				.toString(attr.getFeatureID()), getString(attr.getName())) {
-//			public CellEditor createPropertyEditor(Composite parent) {
-//				CellEditor editor = new ActionOutcomeDialogCellEditor(parent,
-//						element);
-//				if (getValidator() != null) {
-//					editor.setValidator(getValidator());
-//				}
-//				return editor;
-//			}
-//		};
-//		return propertyDescriptor;
-//	}
-
-	/**
-	 * get property descriptor for the attribute with the boolean type
-	 * 
-	 * @param attr -
-	 *            EAttribute
-	 * @return
-	 */
-	PropertyDescriptor getBooleanTypePropertyDescriptor(EAttribute attr) {
-		PropertyDescriptor propertyDescriptor;
-		propertyDescriptor = new ComboBoxPropertyDescriptor(Integer
-				.toString(attr.getFeatureID()), getString(attr.getName()),
-				new String[] { P_VALUE_TRUE_LABEL, P_VALUE_FALSE_LABEL });
-		return propertyDescriptor;
-	}
-
-	/**
-	 * Get a translated string from the resource locator.
-	 * @param key 
-	 * @return the string for the key
-	 */
-	protected final String getString(String key) {
-		if ("comment".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_comment;
-		}
-
-		if ("name".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_name;
-		}
-
-		if ("largeicon".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_largeicon;
-		}
-
-		if ("smallicon".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_smallicon;
-		}
-		
-		if ("source".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_source;
-		}
-		
-		if ("target".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_target;
-		}
-
-		if ("fromaction".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_fromaction;
-		}
-
-		if ("path".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_path;
-		}
-		if ("begin".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_begin;
-		}
-		if ("end".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_end;
-		}
-		if ("configfile".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_configfile;
-		}
-		if ("outcome".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_outcome;
-		}
-		if ("redirect".equals(key)) { //$NON-NLS-1$
-			return PageflowMessages.Pageflow_Model_Attributes_redirect;
-		}
-
-		return ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#getPropertyValue(Object)
-	 */
-	public Object getPropertyValue(Object id) {
-		EStructuralFeature feature = element.eClass().getEStructuralFeature(
-				Integer.parseInt((String) id));
-
-		Object result = element.eGet(feature);
-
-		if (result instanceof Boolean) {
-			if (result == Boolean.TRUE) {
-				result = new Integer(P_VALUE_TRUE);
-			} else {
-				result = new Integer(P_VALUE_FALSE);
-			}
-		}
-
-		return result != null ? result : ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#isPropertySet(Object)
-	 */
-	public boolean isPropertySet(Object id) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySouce#resetPropertyValue(Object)
-	 */
-	public void resetPropertyValue(Object id) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see IPropertySource#setPropertyValue(Object, Object)
-	 */
-	public void setPropertyValue(Object id, Object value) {
-		EStructuralFeature feature = element.eClass().getEStructuralFeature(
-				Integer.parseInt((String) id));
-
-		Object result = element.eGet(feature);
-		// if the attribute is boolean type, the value should be changed from
-		// string "true" or "false"
-		// to Boolean.TRUE or Boolean.FALSE
-		if (result instanceof Boolean) {
-			if (value.equals(new Integer(P_VALUE_TRUE))) {
-				value = Boolean.TRUE;
-			} else {
-				value = Boolean.FALSE;
-			}
-		}
-		element.eSet(feature, value);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowLinkPropertySource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowLinkPropertySource.java
deleted file mode 100644
index e3c1f30..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowLinkPropertySource.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * The property source for Pageflow Link.
- * 
- * @author hmeng
- */
-
-public class PageflowLinkPropertySource extends PageflowElementPropertySource {
-
-	/**
-	 * @param element
-	 */
-	public PageflowLinkPropertySource(PageflowElement element) {
-		super(element);
-	}
-
-	public Object getPropertyValue(Object id) {
-		Object result = super.getPropertyValue(id);
-		if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__SOURCE
-				|| Integer.parseInt((String) id) == PageflowPackage.PF_LINK__TARGET) {
-			result = ((PageflowPage) result).getPath();
-		}
-		return result;
-	}
-
-	public void setPropertyValue(Object id, Object value) {
-		if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__SOURCE) {
-			((PageflowLink) element).setSourcePath((String) value);
-
-		} else if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__TARGET) {
-			((PageflowLink) element).setTargetPath((String) value);
-		} else {
-			super.setPropertyValue(id, value);
-		}
-	}
-
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		// property descriptors
-		List propertyDescriptors = new Vector();
-
-		Iterator it;
-		EClass cls = element.eClass();
-
-		it = cls.getEAllAttributes().iterator();
-		while (it.hasNext()) {
-			EAttribute attr = (EAttribute) it.next();
-			if (attr.isID()
-					|| attr.getName().equalsIgnoreCase(PAGEFLOW_NAME)
-					|| attr.getName().equalsIgnoreCase(PAGEFLOW_COMMENT)
-					|| attr.getFeatureID() == PageflowPackage.PAGEFLOW__REFERENCE_LINK) {
-				continue;
-			}
-
-			EDataType type = attr.getEAttributeType();
-			if (type.getInstanceClass() == String.class) {
-				PropertyDescriptor propertyDescriptor;
-
-				propertyDescriptor = new TextPropertyDescriptor(Integer
-						.toString(attr.getFeatureID()),
-						getString(attr.getName()));
-
-				if (propertyDescriptor != null) {
-					propertyDescriptor
-							.setLabelProvider(new PageflowLabelProvider());
-					propertyDescriptors.add(propertyDescriptor);
-				}
-
-			} else if (type.getInstanceClass() == boolean.class) {
-				PropertyDescriptor propertyDescriptor;
-				propertyDescriptor = getBooleanTypePropertyDescriptor(attr);
-				propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
-				propertyDescriptors.add(propertyDescriptor);
-			}
-		}
-		it = cls.getEReferences().iterator();
-		while (it.hasNext()) {
-			EReference attr = (EReference) it.next();
-			if (attr.getFeatureID() == PageflowPackage.PF_LINK__SOURCE
-					|| attr.getFeatureID() == PageflowPackage.PF_LINK__TARGET) {
-
-				PropertyDescriptor propertyDescriptor;
-
-				propertyDescriptor = getExistingPagePathPropertyDescriptor(attr);
-
-				if (propertyDescriptor != null) {
-					propertyDescriptor
-							.setLabelProvider(new PageflowLabelProvider());
-					propertyDescriptors.add(propertyDescriptor);
-				}
-			}
-		}
-
-		return (IPropertyDescriptor[]) propertyDescriptors
-				.toArray(new IPropertyDescriptor[] {});
-	}
-
-	/**
-	 * The link's ends can be modified to another page existing in current pageflow.
-	 * @param attr
-	 * @return
-	 */
-	private PropertyDescriptor getExistingPagePathPropertyDescriptor(
-			EReference attr) {
-		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
-				.toString(attr.getFeatureID()), getString(attr.getName())) {
-			public CellEditor createPropertyEditor(Composite parent) {
-				CellEditor editor = new ExistingPagePathDialogCellEditor(
-						parent, (Pageflow) element.eContainer());
-				if (getValidator() != null) {
-					editor.setValidator(getValidator());
-				}
-				return editor;
-			}
-
-			/**
-			 * Returns the input validator for editing the property.
-			 * 
-			 * @return the validator used to verify correct values for this
-			 *         property, or <code>null</code>
-			 */
-			protected ICellEditorValidator getValidator() {
-				return new ICellEditorValidator() {
-					public String isValid(Object value) {
-						if (value != null) {
-							if (!PageflowValidation.getInstance()
-									.isExistedPage(
-											((Pageflow) element.eContainer()),
-											(String) value)) {
-								// Pageflow.PageflowEditor.Alert.DNDResourceTitle
-								// = Pageflow Creation Error
-								// Pageflow.PageflowEditor.Alert.ExistingPage =
-								// The web page {0} is already existed in
-								// current PageFlow.
-								EditorPlugin.getAlerts().info(PageflowMessages.PageflowLinkPropertySource_Title,
-										PageflowMessages.PageflowLinkPropertySource_Text);
-								// "Pageflow.PageflowEditor.Alert.DNDResourceTitle",
-								// "Pageflow.PageflowEditor.Alert.ExistingPage",
-								// (String) value);
-
-								return EditorPlugin
-										.getResourceString("Pageflow.PageflowEditor.Alert.ExistingPage"); //$NON-NLS-1$
-							}
-						}
-						return null;
-					}
-
-				};
-			}
-
-		};
-		return propertyDescriptor;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionDescriptorProvider.java
deleted file mode 100644
index e36d282..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionDescriptorProvider.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider;
-
-/**
- * this class defines all section descriptors for pageflow. Similar with
- * PropertyDescriptors, this class defines all sections used by pageflow through
- * SectionDescriptor.
- * 
- */
-public class PageflowSectionDescriptorProvider implements
-		ISectionDescriptorProvider {
-	/**
-	 * Default constructor
-	 */
-	public PageflowSectionDescriptorProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see ISectionDescriptorProvider#getSectionDescriptors()
-	 */
-	public ISectionDescriptor[] getSectionDescriptors() {
-		ISectionDescriptor[] descriptors = new ISectionDescriptor[] {
-				new LinkSectionDescriptor(), new PageSectionDescriptor(),
-				new EditorSectionDescriptor(),
-				new GeneralViewSectionDescriptor() };
-		return descriptors;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionLabelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionLabelProvider.java
deleted file mode 100644
index 1c72dae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PageflowSectionLabelProvider.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.gef.editparts.AbstractEditPart;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementTreeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowLinkEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * This class defines label provider for the property view's title. Tabbed
- * property view has a common area as a Title. Different decription and image
- * can be shown according to Different selection.
- * 
- */
-public class PageflowSectionLabelProvider extends LabelProvider {
-
-	private static final String PAGEFLOW_IMAGE_FILE = "facesconfig/FacesConfig_Pageflow16.gif"; //$NON-NLS-1$
-
-	/**
-	 * Default constructor
-	 */
-	public PageflowSectionLabelProvider() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see getImage(java.lang.Object)
-	 */
-	public Image getImage(Object object) {
-		Image result = EditorPlugin.getDefault().getImage(
-				PAGEFLOW_IMAGE_FILE);
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see getText(java.lang.Object)
-	 */
-	public String getText(Object object) {
-		String result = null;
-		if (object instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) object;
-			Object pageflow = structuredSelection.getFirstElement();
-			if (pageflow instanceof PageflowElementEditPart
-					|| pageflow instanceof PageflowLinkEditPart
-					|| pageflow instanceof PageflowElementTreeEditPart) {
-
-				if (((PageflowElement) ((AbstractEditPart) pageflow).getModel())
-						.eClass() == PageflowPackage.eINSTANCE.getPageflow()) {
-					result = PageflowMessages.Pageflow_Model_Items_Pageflow;
-				} else if (((PageflowElement) ((AbstractEditPart) pageflow)
-						.getModel()).eClass() == PageflowPackage.eINSTANCE
-						.getPFPage()) {
-					result = PageflowMessages.Pageflow_Model_Items_PFPage;
-				} else if (((PageflowElement) ((AbstractEditPart) pageflow)
-						.getModel()).eClass() == PageflowPackage.eINSTANCE
-						.getPFLink()) {
-					result = PageflowMessages.Pageflow_Model_Items_PFLink;
-				}
-			}
-		}
-		return result;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ProjectWebPageSelectionDialog.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ProjectWebPageSelectionDialog.java
deleted file mode 100644
index 7d668d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/ProjectWebPageSelectionDialog.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author hmeng
- */
-
-public class ProjectWebPageSelectionDialog extends CommonResourceDialog {
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 * @param style
-	 */
-	public ProjectWebPageSelectionDialog(Shell parentShell, IProject project,
-			int style) {
-		super(parentShell, project, style);
-		init();
-	}
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 */
-	public ProjectWebPageSelectionDialog(Shell parentShell, IProject project) {
-		super(parentShell, project);
-		init();
-	}
-
-	private void init() {
-		setResourceDescription(PageflowMessages.ProjectWebPageSelectionDialog_Description);
-		setSuffixs(new String[] { "jsp", "jspx", "jsf", "html", "htm" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-	}
-
-	/**
-	 * @return the rseult file path
-	 */
-	public String getResultFilePath() {
-		String result = ""; //$NON-NLS-1$
-		IFile selectedFile = (IFile) getResult()[0];
-		IPath path = selectedFile.getProjectRelativePath();
-		path = path.removeFirstSegments(1);
-		result = "/" + path.toString(); //$NON-NLS-1$
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.java
deleted file mode 100644
index d8fb04d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS Message bundle for properties
- *
- */
-public final class PropertyMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages"; //$NON-NLS-1$
-
-	private PropertyMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PropertyMessages.class);
-	}
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_displayName;
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_description;
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_configFile;
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_largeIcon;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_smallIcon;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_fromAction;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_fromView;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_fromOutcome;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_redirect;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_browseButton;
-
-	/**
-	 * see PropertyMessages.properties
-	 */
-	public static String property_Command_SetValue;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.properties
deleted file mode 100644
index 3de4f3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/PropertyMessages.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-property_displayName=Display Name:
-property_description=Description:
-property_configFile=Faces-config file:
-property_largeIcon=Large Icon:
-property_smallIcon=Small Icon:
-property_fromAction=From Action:
-property_fromView=Page Path:
-property_fromOutcome=From Outcome:
-property_redirect=Redirect:
-property_browseButton=...
-
-property_Command_SetValue=Set {0} Property
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartGroup.java
deleted file mode 100644
index 6ccbc2c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartGroup.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author jchoi
- * @version
- */
-/*package*/ abstract class AbstractEditPartGroup extends DialogFieldGroup {
-
-	private StringDialogField descField;
-
-	private StringDialogField displayNameField;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		displayNameField = new StringDialogField();
-		displayNameField.setLabelText(PropertyMessages.property_displayName);
-		displayNameField
-				.setDialogFieldChangeListener(getDefaultChangeListener());
-		descField = new StringDialogField();
-
-		descField.setLabelText(PropertyMessages.property_description);
-		descField.setDialogFieldChangeListener(getDefaultChangeListener());
-
-	}
-
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 * @param col
-	 */
-	protected void layoutDialogFields(FormToolkit toolkit, Composite parent,
-			int col) {
-		displayNameField.doFillIntoGrid(toolkit, parent, col);
-		descField.doFillIntoGrid(toolkit, parent, col);
-
-	}
-
-	/**
-	 * @param elem
-	 */
-	protected void refreshData(PageflowElement elem) {
-		descField.setTextWithoutUpdate(elem.getComment());
-		displayNameField.setTextWithoutUpdate(elem.getName());
-	}
-
-	/**
-	 * @return the description field
-	 */
-	protected StringDialogField getDescField() {
-		return descField;
-	}
-
-	/**
-	 * @return the display name field
-	 */
-	protected StringDialogField getDisplayNameField() {
-		return displayNameField;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartSection.java
deleted file mode 100644
index 00dcfca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/AbstractEditPartSection.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.CommandStack;
-import org.eclipse.gef.commands.CommandStackListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-
-/**
- * This is base section, which support GEF command stack to redo/undo setting
- * properties.
- * 
- * @author jchoi, Xiao-guang Zhang
- */
-/*package*/ abstract class AbstractEditPartSection extends AbstractPropertySection {
-
-	IDialogFieldChangeListener changeListener = new IDialogFieldChangeListener() {
-		public void dialogFieldChanged(DialogField field) {
-			validate();
-		}
-	};
-
-	/** property source of edit part */
-	private IPropertySource propertySource;
-
-	/** EditPart instance */
-	private EditPart editPart;
-
-	/** map for property registry to store a map between the property id and name */
-	private Map propertyRegistry;
-
-	/** GEF command stack */
-	private CommandStack commandStack;
-
-	/** command stack listener to refresh the section */
-	private CommandStackListener commandStackListener;
-
-	/**
-	 * 
-	 */
-	public AbstractEditPartSection() {
-		super();
-	}
-
-	/**
-	 * refresh the whole section
-	 * 
-	 */
-	public void refreshData() {
-		super.refresh();
-	}
-
-	/**
-	 * TODO: this method seems unused
-	 */
-	public abstract void validate();
-
-	/**
-	 * dispose the command stack listener
-	 */
-	public void dispose() {
-		super.dispose();
-		if (getCommandStack() != null) {
-			getCommandStack().removeCommandStackListener(
-					getCommandStackListener());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		if (part != null) {
-			if (part.getAdapter(CommandStack.class) != null) {
-				setCommandStack((CommandStack) part
-						.getAdapter(CommandStack.class));
-			}
-
-			if (selection instanceof StructuredSelection) {
-				StructuredSelection structuredSelection = (StructuredSelection) selection;
-				if (structuredSelection.getFirstElement() instanceof EditPart) {
-					editPart = (EditPart) structuredSelection.getFirstElement();
-				}
-
-				if (editPart != null
-						&& ((IAdaptable) editPart)
-								.getAdapter(IPropertySource.class) != null) {
-					propertySource = (IPropertySource) ((IAdaptable) editPart)
-							.getAdapter(IPropertySource.class);
-				}
-
-			}
-		}
-
-		super.setInput(part, selection);
-	}
-
-	/**
-	 * get the commandstacklistener, if not existed, create a new one.
-	 * 
-	 * @return
-	 */
-	private CommandStackListener getCommandStackListener() {
-		if (commandStackListener == null) {
-			commandStackListener = new CommandStackListener() {
-				public void commandStackChanged(EventObject e) {
-					refreshData();
-				}
-			};
-		}
-		return commandStackListener;
-	}
-
-	/**
-	 * set a <code>CommandStack</code> forthis section, and add a
-	 * <code>CommandStackListener</code> for this commandstack
-	 * 
-	 * @param stack
-	 */
-	public void setCommandStack(CommandStack stack) {
-		commandStack = stack;
-		stack.addCommandStackListener(getCommandStackListener());
-	}
-
-	/**
-	 * get the <code>CommandStack</code>
-	 * 
-	 * @return the command stack
-	 */
-	public CommandStack getCommandStack() {
-		return commandStack;
-	}
-
-	/**
-	 * get the property source registered for current editpart
-	 * 
-	 * @return the property source
-	 */
-	public IPropertySource getPropertySource() {
-		return propertySource;
-	}
-
-	/**
-	 * get the property's EMF featureID based on property name.
-	 * 
-	 * @param propertyName
-	 * @return the feature id for propertyName
-	 */
-	protected Object getFeatureID(String propertyName) {
-		if (editPart != null && !(editPart.getModel() instanceof EObject)) {
-			return null;
-		}
-
-		Object propertyID = getPropertyRegistry().get(propertyName);
-		if (propertyID == null) {
-
-			EClass cls = ((EObject) editPart.getModel()).eClass();
-			for (Iterator it = cls.getEAllAttributes().iterator(); it.hasNext();) {
-				EAttribute attr = (EAttribute) it.next();
-				if (attr.getName().equalsIgnoreCase(propertyName)) {
-					propertyID = Integer.toString(attr.getFeatureID());
-					getPropertyRegistry().put(propertyName, propertyID);
-					break;
-				}
-			}
-		}
-		return propertyID;
-	}
-
-	/**
-	 * @return the property registry
-	 */
-	protected Map getPropertyRegistry() {
-		if (propertyRegistry == null) {
-			propertyRegistry = new HashMap();
-		}
-		return propertyRegistry;
-	}
-
-	/**
-	 * get the input edit part
-	 * 
-	 * @return the input
-	 */
-	public Object getInput() {
-		return editPart;
-	}
-
-	/**
-	 * set the value of property
-	 * 
-	 * @param propertyName
-	 * @param propertyValue
-	 */
-	public void setValue(String propertyName, Object propertyValue) {
-		if (propertyName != null && propertyValue != null
-				&& getPropertySource() != null) {
-			SetPropertyValueCommand setCommand = new SetPropertyValueCommand(
-					propertyName);
-			setCommand.setTarget(getPropertySource());
-			setCommand.setPropertyId(getFeatureID(propertyName));
-			setCommand.setPropertyValue(propertyValue);
-			if (getCommandStack() != null) {
-				getCommandStack().execute(setCommand);
-			} else {
-				setCommand.execute();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorGroup.java
deleted file mode 100644
index dd6bea9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorGroup.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author jchoi
- * @version
- */
-/*package*/ class EditorGroup extends AbstractEditPartGroup {
-	private Pageflow pageflow = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		super.initialize();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (pageflow != null) {
-			super.refreshData(pageflow);
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {
-			top = new Composite(parent, SWT.NONE);
-		} else {
-			top = toolkit.createComposite(parent);
-		}
-		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-		parent.setLayout(fillLayout);
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		top.setLayout(layout);
-
-		Label separator = toolkit.createSeparator(top, SWT.HORIZONTAL);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		separator.setLayoutData(data);
-		super.layoutDialogFields(toolkit, top, 3);
-
-	}
-
-	/**
-	 * @param elem 
-	 */
-	public void setPropertyProvider(Pageflow elem) {
-		pageflow = elem;
-		this.refreshData();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorSection.java
deleted file mode 100644
index 1b9d62c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/EditorSection.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-/**
- * Edit section for Pagflow (EditPart)
- * 
- * @author jchoi, Xiao-guang Zhang
- */
-public class EditorSection extends AbstractEditPartSection {
-	/** edit group */
-	private EditorGroup group;
-
-	/** the emf model for Pageflow */
-	private Pageflow pageflow;
-
-	/**
-	 * 
-	 */
-	public EditorSection() {
-		super();
-		group = new EditorGroup();
-		group.setDefaultChangeListener(changeListener);
-		group.initialize();
-
-		group.getDisplayNameField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						EditorSection.this.setValue(
-								PageflowPackageImpl.eINSTANCE
-										.getPageflowElement_Name().getName(),
-								group.getDisplayNameField().getText());
-					}
-				});
-
-		group.getDescField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						EditorSection.this
-								.setValue(
-										PageflowPackageImpl.eINSTANCE
-												.getPageflowElement_Comment()
-												.getName(), group
-												.getDescField().getText());
-					}
-				});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		Composite top = factory.createFlatFormComposite(parent);
-
-		group.layoutDialogFields(factory, top);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-
-		if (getInput() != null && getInput() instanceof PageflowEditPart) {
-			Object model = ((PageflowEditPart) getInput()).getModel();
-			if (model instanceof Pageflow) {
-				pageflow = (Pageflow) model;
-				refreshData();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.properties.sections.AbstractEditPartSection#refreshData()
-	 */
-	public void refreshData() {
-		super.refreshData();
-		group.setPropertyProvider(pageflow);
-	}
-
-    public void validate() {
-        // do nothing.
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkGroup.java
deleted file mode 100644
index bfe0d87..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkGroup.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.ActionOutcomeSelectionDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.ITabbedPropertiesConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author jchoi
- * @version
- */
-/*package*/ class LinkGroup extends AbstractEditPartGroup {
-	private StringButtonDialogField fromOutcomeField;
-
-	private StringDialogField fromActionField;
-
-	private ComboDialogField redirectField;
-
-	private PageflowLink pfLink;
-
-	/** Integer value for boolean type */
-	private static final Integer P_VALUE_TRUE = new Integer(0);
-
-	private static final Integer P_VALUE_FALSE = new Integer(1);
-
-	private class StringButtonAdapter implements IStringButtonAdapter {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogField)
-		 */
-		public void changeControlPressed(DialogField field) {
-			String outcome = ""; //$NON-NLS-1$
-			String jspPage = ""; //$NON-NLS-1$
-			Shell shell = field.getLabelControl(null, null).getShell();
-			if (pfLink != null) {
-				outcome = pfLink.getOutcome();
-				jspPage = WebrootUtil.getProjectPath(pfLink,
-						getPreviousJSPPath(pfLink));
-				ActionOutcomeSelectionDialog actionDialog = new ActionOutcomeSelectionDialog(
-						shell, outcome, jspPage);
-				if (actionDialog.open() == Window.OK) {
-					outcome = actionDialog.getSelectedAction();
-					fromOutcomeField.setText(outcome);
-					pfLink.setOutcome(outcome);
-					refreshData();
-				}
-			}
-		}
-
-		/**
-		 * @param _element
-		 * @return
-		 */
-		private String getPreviousJSPPath(PageflowElement element) {
-			String jspPath = null;
-			if (element instanceof PageflowLink) {
-				PageflowNode source = ((PageflowLink) element).getSource();
-				if (source instanceof PageflowPage) {
-					jspPath = ((PageflowPage) source).getPath();
-				}
-			}
-			return jspPath;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		fromOutcomeField = new StringButtonDialogField(
-				new StringButtonAdapter());
-		fromOutcomeField.setLabelText(PropertyMessages.property_fromOutcome);
-		fromOutcomeField.setButtonLabel(PropertyMessages.property_browseButton);
-		fromOutcomeField
-				.setDialogFieldChangeListener(getDefaultChangeListener());
-		fromActionField = new StringDialogField();
-		fromActionField.setLabelText(PropertyMessages.property_fromAction);
-		fromActionField
-				.setDialogFieldChangeListener(getDefaultChangeListener());
-		redirectField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY);
-		redirectField.setLabelText(PropertyMessages.property_redirect);
-		redirectField
-				.setDialogFieldChangeListener((getDefaultChangeListener()));
-		List redirectList;
-		redirectList = new ArrayList();
-		redirectList.add(Boolean.TRUE.toString());
-		redirectList.add(Boolean.FALSE.toString());
-		redirectField.setItems((String[]) redirectList.toArray(new String[0]));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (pfLink != null) {
-			fromOutcomeField.setTextWithoutUpdate(pfLink.getOutcome());
-			fromActionField.setTextWithoutUpdate(pfLink.getFromaction());
-			if (pfLink.isRedirect()) {
-				redirectField.setTextWithoutUpdate(Boolean.TRUE.toString());
-			} else {
-				redirectField.setTextWithoutUpdate(Boolean.FALSE.toString());
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {
-			top = new Composite(parent, SWT.NONE);
-		} else {
-			top = toolkit.createComposite(parent);
-		}
-		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-		parent.setLayout(fillLayout);
-
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		top.setLayout(layout);
-
-		fromActionField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		fromOutcomeField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		redirectField.doFillIntoGrid(toolkit, top, numberOfColumns);
-
-		LayoutUtil.setHorizontalGrabbing(fromOutcomeField.getTextControl(
-				toolkit, top));
-		GridData data = new GridData();
-		data.widthHint = ITabbedPropertiesConstants.BROWSE_WIDTH;
-		data.heightHint = ITabbedPropertiesConstants.BROWSE_HEIGHT;
-
-		fromOutcomeField.getChangeControl(toolkit, top).setLayoutData(data);
-
-	}
-
-	/**
-	 * @param elem
-	 */
-	public void setPropertyProvider(PageflowLink elem) {
-		pfLink = elem;
-		this.refreshData();
-	}
-
-	/**
-	 * @return the outcome field
-	 */
-	public StringButtonDialogField getFromOutcomeField() {
-		return fromOutcomeField;
-	}
-
-	/**
-	 * @return the fromAction field
-	 */
-	public StringDialogField getFromActionField() {
-		return fromActionField;
-	}
-
-	/**
-	 * @return the redirect field
-	 */
-	public ComboDialogField getRedirectField() {
-		return redirectField;
-	}
-
-	/**
-	 * @return the redirect value
-	 */
-	public Integer getRedirectValue() {
-		if (redirectField.getText().equalsIgnoreCase(Boolean.TRUE.toString())) {
-			return LinkGroup.P_VALUE_TRUE;
-		}
-        return LinkGroup.P_VALUE_FALSE;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkSection.java
deleted file mode 100644
index c6b0dce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/LinkSection.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowLinkEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-/**
- * Edit section for Pagflow Link element (EditPart)
- * 
- * @author jchoi
- */
-public class LinkSection extends AbstractEditPartSection {
-	/** edit group */
-	private LinkGroup group;
-
-	/** the emf model for Pageflow link */
-	private PageflowLink pfLink;
-
-	/**
-	 * 
-	 */
-	public LinkSection() {
-		super();
-		group = new LinkGroup();
-		group.setDefaultChangeListener(changeListener);
-		group.initialize();
-
-		group.getFromOutcomeField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						LinkSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFLink_Outcome().getName(), group
-								.getFromOutcomeField().getText());
-					}
-				});
-
-		group.getRedirectField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						LinkSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFLink_Redirect().getName(), group
-								.getRedirectValue());
-					}
-				});
-		group.getFromActionField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						LinkSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFLink_Fromaction().getName(), group
-								.getFromActionField().getText());
-					}
-				});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		Composite top = factory.createFlatFormComposite(parent);
-
-		group.layoutDialogFields(factory, top);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-
-		if (getInput() != null && getInput() instanceof PageflowLinkEditPart) {
-			Object model = ((PageflowLinkEditPart) getInput()).getModel();
-			if (model instanceof PageflowLink) {
-				pfLink = (PageflowLink) model;
-				if (PageflowValidation.getInstance().isValidLinkForProperty(
-						pfLink)) {
-					refreshData();
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.properties.sections.AbstractEditPartSection#refreshData()
-	 */
-	public void refreshData() {
-		super.refresh();
-		group.setPropertyProvider(pfLink);
-	}
-
-    public void validate() {
-        // do nothing
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageGroup.java
deleted file mode 100644
index 6d3252b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageGroup.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.ITabbedPropertiesConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.ProjectWebPageSelectionDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author jchoi
- * @version
- */
-/*package*/ class PageGroup extends AbstractEditPartGroup {
-
-	private StringButtonDialogField fromViewField;
-
-	private PageflowPage pfPage = null;
-
-	private StringDialogField largeIconField;
-
-	private StringDialogField smallIconField;
-
-	class StringButtonAdapter implements IStringButtonAdapter {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogField)
-		 */
-		public void changeControlPressed(DialogField field) {
-			IProject project = WebrootUtil.getProject(pfPage);
-			ProjectWebPageSelectionDialog dlg = new ProjectWebPageSelectionDialog(
-					field.getLabelControl(null, null).getShell(), project);
-			if (dlg.open() == Window.OK) {
-				fromViewField.setText(dlg.getResultFilePath());
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		fromViewField = new StringButtonDialogField(new StringButtonAdapter());
-		fromViewField.setLabelText(PropertyMessages.property_fromView);
-		fromViewField.setButtonLabel(PropertyMessages.property_browseButton);
-		fromViewField.setDialogFieldChangeListener(getDefaultChangeListener());
-
-		largeIconField = new StringDialogField();
-		largeIconField.setLabelText(PropertyMessages.property_largeIcon);
-		largeIconField
-				.setDialogFieldChangeListener((getDefaultChangeListener()));
-		smallIconField = new StringDialogField();
-		smallIconField.setLabelText(PropertyMessages.property_smallIcon);
-		smallIconField
-				.setDialogFieldChangeListener((getDefaultChangeListener()));
-		super.initialize();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (pfPage != null) {
-			fromViewField.setTextWithoutUpdate(assertString(pfPage.getPath()));
-			largeIconField.setTextWithoutUpdate(assertString(pfPage
-					.getLargeicon()));
-			smallIconField.setTextWithoutUpdate(assertString(pfPage
-					.getSmallicon()));
-			super.refreshData(pfPage);
-
-		}
-
-	}
-	/**
-	 * @param value
-	 * @return the assertion string
-	 */
-	private static String assertString(String value) {
-		return value == null ? "" : value; //$NON-NLS-1$
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {
-			top = new Composite(parent, SWT.NONE);
-		} else {
-			top = toolkit.createComposite(parent);
-		}
-		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-		parent.setLayout(fillLayout);
-
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		top.setLayout(layout);
-
-		fromViewField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(fromViewField.getTextControl(toolkit,
-				top));
-		largeIconField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		smallIconField.doFillIntoGrid(toolkit, top, numberOfColumns);
-		super.layoutDialogFields(toolkit, top, 4);
-
-		GridData data = new GridData();
-		data.widthHint = ITabbedPropertiesConstants.BROWSE_WIDTH;
-		data.heightHint = ITabbedPropertiesConstants.BROWSE_HEIGHT;
-
-		fromViewField.getChangeControl(toolkit, top).setLayoutData(data);
-	}
-
-	/**
-	 * @param elem
-	 */
-	public void setPropertyProvider(PageflowPage elem) {
-		pfPage = elem;
-		this.refreshData();
-	}
-
-	/**
-	 * @return the fromView field
-	 */
-	public StringButtonDialogField getFromViewField() {
-		return fromViewField;
-	}
-
-	/**
-	 * @return the large icon field
-	 */
-	public StringDialogField getLargeIconField() {
-		return largeIconField;
-	}
-
-	/**
-	 * @return the small icon field
-	 */
-	public StringDialogField getSmallIconField() {
-		return smallIconField;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageSection.java
deleted file mode 100644
index 5a09203..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/PageSection.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-/**
- * Edit section for Pagflow Page Element (EditPart)
- * 
- * @author jchoi, Xiao-guang Zhang
- */
-public class PageSection extends AbstractEditPartSection {
-	/** edit group */
-	private PageGroup group;
-
-	/** the emf model for Pageflow page */
-	private PageflowPage pfPage = null;
-
-	/**
-	 * 
-	 */
-	public PageSection() {
-		super();
-		group = new PageGroup();
-		group.setDefaultChangeListener(changeListener);
-		group.initialize();
-
-		group.getFromViewField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						if (pfPage != null) {
-							String jsfNew = group.getFromViewField().getText();
-							if (jsfNew != null && jsfNew.length() > 0) {
-								if (PageflowValidation.getInstance()
-										.isExistedPage(pfPage.getPageflow(),
-												jsfNew)) {
-									// Pageflow.PageflowEditor.Alert.DNDResourceTitle
-									// = Pageflow Creation Error
-									// Pageflow.PageflowEditor.Alert.ExistingPage
-									// = The web page {0} is already existed in
-									// current PageFlow.
-									EditorPlugin
-											.getAlerts()
-											.error(
-													"Pageflow.PageflowEditor.Alert.DNDResourceTitle", //$NON-NLS-1$
-													"Pageflow.PageflowEditor.Alert.ExistingPage", //$NON-NLS-1$
-													jsfNew);
-								} else {
-									PageSection.this
-											.setValue(
-													PageflowPackageImpl.eINSTANCE
-															.getPFPage_Path()
-															.getName(), jsfNew);
-								}
-							}
-						}
-					}
-				});
-
-		group.getLargeIconField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFPage_Largeicon().getName(), group
-								.getLargeIconField().getText());
-					}
-				});
-		group.getSmallIconField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPFPage_Smallicon().getName(), group
-								.getSmallIconField().getText());
-					}
-				});
-
-		group.getDescField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPageflowElement_Comment().getName(), group
-								.getDescField().getText());
-					}
-				});
-
-		group.getDisplayNameField().setDialogFieldApplyListener(
-				new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						PageSection.this.setValue(PageflowPackageImpl.eINSTANCE
-								.getPageflowElement_Name().getName(), group
-								.getDisplayNameField().getText());
-					}
-				});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#createControls(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.wst.common.ui.properties.internal.provisional.TabbedPropertySheetPage)
-	 */
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		Composite top = factory.createFlatFormComposite(parent);
-
-		group.layoutDialogFields(factory, top);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.ISection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-
-		if (getInput() != null && getInput() instanceof PageflowNodeEditPart) {
-			Object model = ((PageflowNodeEditPart) getInput()).getModel();
-			if (model instanceof PageflowPage) {
-				pfPage = (PageflowPage) model;
-				refreshData();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.properties.sections.AbstractEditPartSection#refreshData()
-	 */
-	public void refreshData() {
-		super.refreshData();
-		group.setPropertyProvider(pfPage);
-	}
-
-    public void validate() {
-        // do nothing
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/SetPropertyValueCommand.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/SetPropertyValueCommand.java
deleted file mode 100644
index 96d2276..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/properties/section/SetPropertyValueCommand.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.section;
-
-import java.text.MessageFormat;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties.PropertyMessages;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/*package*/ class SetPropertyValueCommand extends Command {
-
-	private Object propertyValue;
-
-	private Object propertyID;
-
-	private Object undoValue;
-
-	private boolean resetOnUndo;
-
-	private IPropertySource target;
-
-	/**
-	 * @param propLabel
-	 */
-	public SetPropertyValueCommand(String propLabel) {
-		super(MessageFormat.format(
-				PropertyMessages.property_Command_SetValue,
-				new Object[] { propLabel }).trim());
-	}
-
-	public boolean canExecute() {
-		return true;
-	}
-
-	public void execute() {
-		boolean wasPropertySet = getTarget().isPropertySet(propertyID);
-		undoValue = getTarget().getPropertyValue(propertyID);
-		if (undoValue instanceof IPropertySource) {
-			undoValue = ((IPropertySource) undoValue).getEditableValue();
-		}
-		if (propertyValue instanceof IPropertySource) {
-			propertyValue = ((IPropertySource) propertyValue)
-					.getEditableValue();
-		}
-		getTarget().setPropertyValue(propertyID, propertyValue);
-		resetOnUndo = wasPropertySet != getTarget().isPropertySet(propertyID);
-		if (resetOnUndo) {
-			undoValue = null;
-		}
-	}
-
-	/**
-	 * @return the target
-	 */
-	private IPropertySource getTarget() {
-		return target;
-	}
-
-	void setTarget(IPropertySource aTarget) {
-		target = aTarget;
-	}
-
-	public void redo() {
-		execute();
-	}
-
-	void setPropertyId(Object pName) {
-		propertyID = pName;
-	}
-
-	void setPropertyValue(Object val) {
-		propertyValue = val;
-	}
-
-	public void undo() {
-		if (resetOnUndo) {
-			getTarget().resetPropertyValue(propertyID);
-		} else {
-			getTarget().setPropertyValue(propertyID, undoValue);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFSynchronizer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFSynchronizer.java
deleted file mode 100644
index 2cc7a13..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFSynchronizer.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * The adapter that listens to modification of faces-config and updates pageflow
- * as needed.
- * 
- * @author hmeng
- * 
- */
-
-public class FC2PFSynchronizer extends AdapterImpl {
-	private final boolean DEBUG = false;
-
-	FC2PFTransformer transformer;
-
-	private static final Logger logger = EditorPlugin
-			.getLogger(FC2PFSynchronizer.class);
-
-	/**
-	 * @param transformer
-	 */
-	public FC2PFSynchronizer(FC2PFTransformer transformer) {
-		this.transformer = transformer;
-	}
-
-	public Notifier getTarget() {
-		// can't set target so return null
-		return null;
-	}
-
-	public void setTarget(Notifier newTarget) {
-        // do nothing
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return type == FC2PFSynchronizer.class;
-	}
-
-	public void notifyChanged(Notification notification) {
-		if (!isProcessorFor(notification)) {
-			return;
-		}
-		transformer.setInEvent(true);
-		try {
-			int type = notification.getEventType();
-			switch (type) {
-			case Notification.ADD: {
-				processAdd(notification);
-				notifyPageflow(notification);
-				break;
-			}
-			case Notification.SET: {
-				processSet(notification);
-				notifyPageflow(notification);
-				break;
-			}
-			case Notification.REMOVE:
-				processRemove(notification);
-				notifyPageflow(notification);
-				break;
-			}
-		} catch (Exception e) {
-			logger.error(e);
-		} finally {
-			if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-				transformer.refreshFCAdapter((EObject) notification
-						.getNotifier());
-				transformer.refreshPFAdapter(transformer.getPageflow());
-			}
-			transformer.setInEvent(false);
-		}
-	}
-
-	private boolean isProcessorFor(Notification notification) {
-		boolean result = false;
-		if (transformer.isListenToNotify()
-				&& (notification.getNotifier() instanceof EObject)) {
-			if (notification.getNotifier() == transformer.getFacesConfig()) {
-				// For faces-config, only navigation rule's change is awared.
-				if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_NavigationRule()) {
-					result = true;
-				}
-			} else {
-				result = true;
-			}
-		}
-		return result;
-	}
-
-	private void processAdd(Notification notification) {
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getNavigationRuleType_NavigationCase()) {
-			if (DEBUG)
-				System.out.println("New navigation case"); //$NON-NLS-1$
-			NavigationCaseType newCase = (NavigationCaseType) notification
-					.getNewValue();
-			transformer.updatePageflowElements(transformer.getPageflow(),
-					newCase);
-		} else if (feature == FacesConfigPackage.eINSTANCE
-				.getFacesConfigType_NavigationRule()) {
-			NavigationRuleType newRule = (NavigationRuleType) notification
-					.getNewValue();
-			if (newRule.getNavigationCase().size() > 0) {
-				for (int i = 0; i < newRule.getNavigationCase().size(); i++) {
-					transformer.updatePageflowElements(transformer
-							.getPageflow(), (NavigationCaseType) newRule
-							.getNavigationCase().get(i));
-				}
-			}
-			if (DEBUG)
-				System.out.println("New navigation rule"); //$NON-NLS-1$
-		} else if (DEBUG)
-			System.out.println("Something is added"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Notify pageflow the changes.
-	 * 
-	 * @param notification
-	 */
-	private void notifyPageflow(Notification notification) {
-		Assert.isTrue(notification.getNotifier() instanceof InternalEObject);
-		transformer.getPageflow().notifyModelChanged(
-				new ENotificationImpl((InternalEObject) notification
-						.getNotifier(), Notification.SET,
-						PageflowPackage.PAGEFLOW, null, null));
-	}
-
-	/**
-	 * Deal with the case when some element is removed.
-	 * 
-	 * @param notification
-	 */
-	private void processRemove(Notification notification) {
-		if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-				.getNavigationRuleType_NavigationCase()) {
-			if (notification.getOldValue() instanceof NavigationCaseType) {
-				NavigationCaseType caseType = (NavigationCaseType) notification
-						.getOldValue();
-				transformer.removeLink(caseType);
-			}
-			if (DEBUG)
-				System.out.println("Navigation case"); //$NON-NLS-1$
-		} else if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-				.getNavigationCaseType()) {
-			if (notification.getOldValue() instanceof NavigationRuleType) {
-				NavigationRuleType rule = (NavigationRuleType) notification
-						.getOldValue();
-				for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-					NavigationCaseType caseType = (NavigationCaseType) rule
-							.getNavigationCase().get(i);
-					transformer.refreshLink(caseType);
-				}
-			}
-			if (DEBUG)
-				System.out.println("navigation rule"); //$NON-NLS-1$
-		} else if (notification.getFeature() == FacesConfigPackage.eINSTANCE
-				.getFacesConfigType_NavigationRule()) {
-			if (notification.getOldValue() instanceof NavigationRuleType) {
-				NavigationRuleType rule = (NavigationRuleType) notification
-						.getOldValue();
-				for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-					NavigationCaseType caseType = (NavigationCaseType) rule
-							.getNavigationCase().get(i);
-					transformer.refreshLink(caseType);
-				}
-			}
-		}
-		if (DEBUG)
-			System.out.println("Something is removed"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Deal with property change.
-	 * 
-	 * @param notification
-	 */
-	private void processSet(Notification notification) {
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getFromViewIdType_TextContent()
-				|| feature == FacesConfigPackage.eINSTANCE
-						.getNavigationRuleType_FromViewId()) {
-			fromViewIdChanged(notification);
-		} else if (feature == FacesConfigPackage.eINSTANCE
-				.getToViewIdType_TextContent()
-				|| feature == FacesConfigPackage.eINSTANCE
-						.getNavigationCaseType_ToViewId()) {
-			toViewIdChanged(notification);
-		}
-		if (DEBUG)
-			System.out.println("Something is set"); //$NON-NLS-1$
-	}
-
-	private void fromViewIdChanged(Notification notification) {
-		// remove
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getNavigationRuleType_FromViewId()
-				&& notification.getNewValue() == null
-				&& notification.getOldValue() instanceof FromViewIdType) {
-			NavigationRuleType rule = (NavigationRuleType) notification
-					.getNotifier();
-			for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-				NavigationCaseType caseType = (NavigationCaseType) rule
-						.getNavigationCase().get(i);
-				transformer.refreshLink(caseType);
-			}
-		}
-		// add or change
-		else if (feature == FacesConfigPackage.eINSTANCE
-				.getFromViewIdType_TextContent()) {
-			NavigationRuleType rule = (NavigationRuleType) ((EObject) notification
-					.getNotifier()).eContainer();
-			for (int i = 0; i < rule.getNavigationCase().size(); i++) {
-				NavigationCaseType caseType = (NavigationCaseType) rule
-						.getNavigationCase().get(i);
-				transformer.refreshLink(caseType);
-			}
-		}
-	}
-
-	private void toViewIdChanged(Notification notification) {
-		// remove
-		Object feature = notification.getFeature();
-		if (feature == FacesConfigPackage.eINSTANCE
-				.getNavigationCaseType_ToViewId()
-				&& notification.getNewValue() == null
-				&& notification.getOldValue() instanceof ToViewIdType) {
-			NavigationCaseType caseType = (NavigationCaseType) notification
-					.getNotifier();
-			transformer.refreshLink(caseType);
-		}
-		// add or change
-		else if (feature == FacesConfigPackage.eINSTANCE
-				.getToViewIdType_TextContent()) {
-			NavigationCaseType caseType = (NavigationCaseType) ((EObject) notification
-					.getNotifier()).eContainer();
-			transformer.refreshLink(caseType);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java
deleted file mode 100644
index e2a9fb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/FC2PFTransformer.java
+++ /dev/null
@@ -1,983 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageReferenceElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.ReferenceElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowModelManager;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowTransform;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-
-/**
- * Update and synchronize pageflow from faces-config or vice-versa.
- * 
- * @author hmeng
- * 
- */
-
-public class FC2PFTransformer extends AdapterImpl {
-
-	// For code debug.
-	private static final boolean DEBUG = false;
-
-	/**
-	 * the first notification event type after the defaults
-	 */
-	public static final int MY_NOTIFICATION_TYPE = Notification.EVENT_TYPE_COUNT + 1;
-
-	/**
-	 * the first notification event type after MY_NOTIFICATION_TYPE
-	 */
-	public static final int MY_NOTIFICATION_TYPE1 = MY_NOTIFICATION_TYPE + 1;
-
-	/**
-	 * The listener is active.
-	 */
-	private boolean listenToNotify;
-
-	/**
-	 * Avoid redundent event.
-	 */
-	private boolean isInEvent;
-
-	boolean pageflowChanged = false;
-
-	/**
-	 * Perform operations batched.
-	 */
-	boolean needBatchOperations = false;
-
-	/**
-	 * Catches
-	 */
-	private Map mapPaths2PF = new HashMap();
-
-	private Map mapCases2Links = new HashMap();
-
-	/**
-	 * The pageflow model.
-	 */
-	private Pageflow pageflow;
-
-	/**
-	 * The faces-config model.
-	 */
-	FacesConfigType facesConfig;
-
-	/**
-	 * Default constructor
-	 */
-	public FC2PFTransformer() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	/**
-	 * @param listenToNotify
-	 */
-	public void setListenToNotify(boolean listenToNotify) {
-		this.listenToNotify = listenToNotify;
-	}
-
-	private void postEMFChanged() {
-		startFCNotify();
-		// Refresh all facesConfig?
-		facesConfig.eNotify(new ENotificationImpl(
-				(InternalEObject) facesConfig, Notification.REMOVE,
-				FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE, null,
-				null));
-		List rules;
-		rules = facesConfig.getNavigationRule();
-		for (int i = 0; i < rules.size(); i++) {
-			((NavigationRuleType) rules.get(i)).eNotify(new ENotificationImpl(
-					(InternalEObject) rules.get(i), Notification.REMOVE,
-					FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE,
-					null, null));
-		}
-	}
-
-	/**
-	 * Set notify adapters.
-	 * 
-	 */
-	private void startFCNotify() {
-		TreeIterator iterator = facesConfig.eAllContents();
-		while (iterator.hasNext()) {
-			EObject object = (EObject) iterator.next();
-			object.eSetDeliver(true);
-		}
-		facesConfig.eSetDeliver(true);
-	}
-
-	/**
-	 * Set not notify adapters
-	 * 
-	 * @return
-	 */
-	private TreeIterator stopFCNotify() {
-		TreeIterator iterator = facesConfig.eAllContents();
-		// Stop the listener
-		while (iterator.hasNext()) {
-			EObject object = (EObject) iterator.next();
-			object.eSetDeliver(false);
-		}
-		facesConfig.eSetDeliver(false);
-		return iterator;
-	}
-
-	/**
-	 * For performance issue, we are going to update DOM only after the EMF
-	 * modifications are done.
-	 */
-	boolean isNeedBatchOperations() {
-		return needBatchOperations;
-	}
-
-	/**
-	 * @param enable
-	 */
-	public void setNeedBatchOperations(boolean enable) {
-		this.needBatchOperations = enable;
-		if (!enable) {
-			isInEvent = true;
-			postEMFChanged();
-			isInEvent = false;
-		} else {
-			stopFCNotify();
-		}
-	}
-
-	private void updateFacesRule(NavigationRuleType navigationRule,
-			PageflowPage pageSource) {
-		FacesConfigFactory factory = FacesConfigFactory.eINSTANCE;
-		if (pageSource.getComment() != null) {
-			DescriptionType description = factory.createDescriptionType();
-			description.setTextContent(pageSource.getComment());
-			navigationRule.getDescription().clear();
-			navigationRule.getDescription().add(description);
-		}
-		// set the navigation rule's icon
-		if (pageSource.getLargeicon() != null
-				|| pageSource.getSmallicon() != null) {
-			IconType icon = factory.createIconType();
-			if (pageSource.getLargeicon() != null) {
-				LargeIconType largeicon = factory.createLargeIconType();
-				largeicon.setTextContent(pageSource.getLargeicon());
-				icon.setLargeIcon(largeicon);
-			}
-
-			if (pageSource.getSmallicon() != null) {
-				SmallIconType smallicon = factory.createSmallIconType();
-				smallicon.setTextContent(pageSource.getSmallicon());
-				icon.setSmallIcon(smallicon);
-			}
-			navigationRule.getIcon().clear();
-			navigationRule.getIcon().add(icon);
-		}
-		if (pageSource.getName() != null) {
-			DisplayNameType displayName = factory.createDisplayNameType();
-			displayName.setTextContent(pageSource.getName());
-			navigationRule.getDisplayName().clear();
-			navigationRule.getDisplayName().add(displayName);
-		}
-	}
-
-	/**
-	 * TODO: If we cache the case's properties in a link, then we can restore
-	 * them.
-	 * 
-	 * @param navigationCase
-	 * @param link
-	 */
-    // TODO: not used, dead?
-//	private void updateFacesCase(NavigationCaseType navigationCase,
-//			PageflowLink link) {
-//		FacesConfigFactory factory = FacesConfigFactory.eINSTANCE;
-//		if (link.getComment() != null) {
-//			DescriptionType description = factory.createDescriptionType();
-//			description.setTextContent(link.getComment());
-//			navigationCase.getDescription().clear();
-//			navigationCase.getDescription().add(description);
-//		}
-//		// set the navigation rule's icon
-//		if (link.getLargeicon() != null || link.getSmallicon() != null) {
-//			IconType icon = factory.createIconType();
-//			if (link.getLargeicon() != null) {
-//				LargeIconType largeicon = factory.createLargeIconType();
-//				largeicon.setTextContent(link.getLargeicon());
-//				icon.setLargeIcon(largeicon);
-//			}
-//
-//			if (link.getSmallicon() != null) {
-//				SmallIconType smallicon = factory.createSmallIconType();
-//				smallicon.setTextContent(link.getSmallicon());
-//				icon.setSmallIcon(smallicon);
-//			}
-//			navigationCase.getIcon().clear();
-//			navigationCase.getIcon().add(icon);
-//		}
-//		if (link.getFromaction() != null) {
-//			FromActionType fromAction = factory.createFromActionType();
-//			fromAction.setTextContent(link.getFromaction());
-//			navigationCase.setFromAction(fromAction);
-//		}
-//		if (link.getOutcome() != null) {
-//			FromOutcomeType fromOutcome = factory.createFromOutcomeType();
-//			fromOutcome.setTextContent(link.getOutcome());
-//			navigationCase.setFromOutcome(fromOutcome);
-//		}
-//	}
-
-	private void createFacesCase(PageflowLink link, PageflowPage source,
-			PageflowPage target_) {
-		NavigationRuleType rule = FacesConfigFactory.eINSTANCE
-				.createNavigationRuleType();
-		FromViewIdType from = FacesConfigFactory.eINSTANCE
-				.createFromViewIdType();
-		from.setTextContent((source).getPath());
-		rule.setFromViewId(from);
-		NavigationCaseType navCase = FacesConfigFactory.eINSTANCE
-				.createNavigationCaseType();
-		ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
-		toView.setTextContent((target_).getPath());
-		navCase.setToViewId(toView);
-		rule.getNavigationCase().add(navCase);
-		facesConfig.getNavigationRule().add(rule);
-		updateFacesRule(rule, source);
-		source.getFCElements().add(from);
-		target_.getFCElements().add(toView);
-		link.getFCElements().add(navCase);
-		mapCases2Links.put(navCase, link);
-	}
-
-	private void removePageflowPage(PageflowPage source) {
-		Assert.isTrue(source.getOutlinks().size() == 0
-				&& source.getInlinks().size() == 0);
-		pageflow.getNodes().remove(source);
-	}
-
-	void removeCase(NavigationCaseType navCase) {
-		NavigationRuleType rule = (NavigationRuleType) navCase.eContainer();
-		(rule).getNavigationCase().remove(navCase);
-		if (rule.getNavigationCase().size() == 0) {
-			facesConfig.getNavigationRule().remove(rule);
-		}
-	}
-
-	/**
-	 * Remove a link in pageflow model.
-	 * 
-	 * @param pLink
-	 */
-	private void removeLink(PageflowLink pLink) {
-		// Link
-		PageflowPage source = (PageflowPage) pLink.getSource();
-		PageflowPage target_ = (PageflowPage) pLink.getTarget();
-		pLink.getPageflow().getLinks().remove(pLink);
-		source.getOutlinks().remove(pLink);
-		target_.getInlinks().remove(pLink);
-		// Navigation case
-		pLink.getFCElements().clear();
-		cleanPage(source);
-		cleanPage(target_);
-	}
-
-	/**
-	 * Remove a link in pageflow model.
-	 * 
-	 * @param pLink
-	 */
-	void changePFLinkStart(PageflowLink pLink, String newValue) {
-		PageflowPage newPage = null;
-		if ((newPage = getValidPFPageInCache(newValue)) != null) {
-			if (newValue.equals(((PageflowPage) pLink.getSource()).getPath())) {
-				return;
-			}
-		} else if ((newPage = TransformUtil.findPage(newValue, pageflow)) == null) {
-			return;
-		}
-
-		// remove old case
-		NavigationCaseType caseType = (NavigationCaseType) pLink
-				.getFCElements().getData().get(0);
-		//NavigationRuleType rule = (NavigationRuleType) caseType.eContainer();
-		removeCase(caseType);
-
-		// create new rule / case
-		NavigationCaseType newCase = FacesConfigFactory.eINSTANCE
-				.createNavigationCaseType();
-		ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
-		toView.setTextContent(caseType.getToViewId().getTextContent());
-		newCase.setToViewId(toView);
-
-		NavigationRuleType newRule = FacesConfigFactory.eINSTANCE
-				.createNavigationRuleType();
-		FromViewIdType fromView = FacesConfigFactory.eINSTANCE
-				.createFromViewIdType();
-		fromView.setTextContent(newValue);
-		newRule.setFromViewId(fromView);
-		newRule.getNavigationCase().add(newCase);
-		facesConfig.getNavigationRule().add(newRule);
-
-		// update
-		// updateNode(rule, newRule);
-		updateNode(caseType, newCase);
-
-		pLink.getFCElements().clear();
-		pLink.getFCElements().add(newCase);
-		pLink.setSource(newPage);
-
-		updatePageflowElements(pageflow, newCase);
-	}
-
-	private void updateNode(EObject old, EObject newOne) {
-		if (old instanceof NavigationRuleType) {
-			((NavigationRuleType) newOne).getDescription().clear();
-			((NavigationRuleType) newOne).getDescription().addAll(
-					((NavigationRuleType) old).getDescription());
-			((NavigationRuleType) newOne).getDisplayName().clear();
-			((NavigationRuleType) newOne).getDisplayName().addAll(
-					((NavigationRuleType) old).getDisplayName());
-			((NavigationRuleType) newOne).getDescription().clear();
-			((NavigationRuleType) newOne).getIcon().clear();
-			((NavigationRuleType) newOne).getIcon().addAll(
-					((NavigationRuleType) old).getIcon());
-		} else if (old instanceof NavigationCaseType) {
-			((NavigationCaseType) newOne).getDescription().clear();
-			((NavigationCaseType) newOne).getDescription().addAll(
-					((NavigationCaseType) old).getDescription());
-			((NavigationCaseType) newOne).getDisplayName().clear();
-			((NavigationCaseType) newOne).getDisplayName().addAll(
-					((NavigationCaseType) old).getDisplayName());
-			((NavigationCaseType) newOne).getDescription().clear();
-			((NavigationCaseType) newOne).getIcon().clear();
-			((NavigationCaseType) newOne).getIcon().addAll(
-					((NavigationCaseType) old).getIcon());
-			((NavigationCaseType) newOne)
-					.setFromAction(((NavigationCaseType) old).getFromAction());
-			((NavigationCaseType) newOne)
-					.setFromOutcome(((NavigationCaseType) old).getFromOutcome());
-		}
-	}
-
-	void changePFLinkEnd(PageflowLink pLink, String newValue) {
-		PageflowPage newPage = null;
-		if ((newPage = getValidPFPageInCache(newValue)) != null) {
-			if (newValue.equals(((PageflowPage) pLink.getSource()).getPath())) {
-				return;
-			}
-		} else if ((newPage = TransformUtil.findPage(newValue, pageflow)) == null) {
-			return;
-		}
-
-		// remove old case
-		NavigationCaseType caseType = (NavigationCaseType) pLink
-				.getFCElements().getData().get(0);
-		ToViewIdType toView = caseType.getToViewId(); // FacesConfigFactory.eINSTANCE.createToViewIdType();
-		if (toView == null) {
-			toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
-		}
-		toView.setTextContent(newValue);
-		caseType.setToViewId(toView);
-
-		pLink.setTarget(newPage);
-
-		updatePageflowElements(pageflow, caseType);
-	}
-
-	void removeLink(NavigationCaseType caseType) {
-		PageflowLink link = (PageflowLink) mapCases2Links.get(caseType);
-		if (link != null) {
-			removeLink(link);
-		}
-	}
-
-	void addLink(PageflowPage source, PageflowPage target_, PageflowLink value) {
-		if (source != null && target_ != null && value != null) {
-			createFacesCase(value, source, target_);
-		}
-	}
-
-	private void cleanPage(PageflowPage source) {
-		if (source.getInlinks().size() == 0 && source.getOutlinks().size() == 0) {
-			removePageflowPage(source);
-		}
-		source.update();
-	}
-
-	void refreshPFAdapter(EObject object) {
-		TreeIterator content = object.eAllContents();
-		while (content.hasNext()) {
-			Object next = content.next();
-			adapt((EObject) next);
-		}
-		adapt(object);
-	}
-
-	void refreshFCAdapter(EObject object) {
-		List rules = facesConfig.getNavigationRule();
-		if (rules != null) {
-			for (int i = 0; i < rules.size(); i++) {
-				NavigationRuleType rule = (NavigationRuleType) rules.get(i);
-				adapt(rule);
-				TreeIterator children = rule.eAllContents();
-				while (children.hasNext()) {
-					adapt((EObject) children.next());
-				}
-			}
-		}
-		adapt(facesConfig);
-	}
-
-	/**
-	 * @param facesConfig
-	 */
-	public void setFacesConfig(FacesConfigType facesConfig) {
-		this.facesConfig = facesConfig;
-		refreshFCAdapter(facesConfig);
-	}
-
-	/**
-	 * @param pageflow
-	 */
-	public void setPageflow(Pageflow pageflow) {
-		this.pageflow = pageflow;
-		pageflow.eAdapters().add(this);
-		refreshPFAdapter(pageflow);
-	}
-
-	/**
-	 * Install compatible synchronization adapter for particular object.
-	 * 
-	 * @param object
-	 */
-	public void adapt(EObject object) {
-		if (object != null && !isAdapted(object)) {
-			if (object instanceof PageflowElement) {
-				object.eAdapters().add(new PF2FCSynchronizer(this));
-			} else {
-				object.eAdapters().add(new FC2PFSynchronizer(this));
-			}
-		}
-	}
-
-	/**
-	 * Remove the synchronization adapter.
-	 * 
-	 * @param object
-	 */
-	public void unAdapt(EObject object) {
-		Iterator adapters = object.eAdapters().iterator();
-		while (adapters.hasNext()) {
-			Object adapter = adapters.next();
-			if (adapter instanceof FC2PFSynchronizer
-					|| adapter instanceof PF2FCSynchronizer) {
-				adapters.remove();
-			}
-		}
-	}
-
-	/**
-	 * @param object
-	 * @return true if this transformer adapts object
-	 */
-	public boolean isAdapted(EObject object) {
-		if (object != null) {
-			Iterator adapters = object.eAdapters().iterator();
-			while (adapters.hasNext()) {
-				Object adapter = adapters.next();
-				if (adapter instanceof FC2PFSynchronizer
-						|| adapter instanceof PF2FCSynchronizer) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * clear the internal maps
-	 */
-	public void clearCaches() {
-		mapPaths2PF.clear();
-		mapCases2Links.clear();
-	}
-
-	/**
-	 * dispose of this object.
-	 */
-	public void dispose() {
-		clearCaches();
-		Pageflow pageFlow = getPageflow();
-		
-		if (pageFlow != null)
-		{
-		    pageFlow.dispose();
-		}
-	}
-
-	public Notifier getTarget() {
-		return null;
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return false;
-	}
-
-	public void setTarget(Notifier newTarget) {
-	    // do nothing
-	}
-
-	/**
-	 * @param caseType
-	 * @return the from view id in caseType
-	 */
-	public static FromViewIdType getSource(NavigationCaseType caseType) {
-		if (caseType.eContainer() instanceof NavigationRuleType) {
-			NavigationRuleType rule = (NavigationRuleType) caseType
-					.eContainer();
-			return rule.getFromViewId();
-		}
-		return null;
-	}
-
-	private PageflowPage getOrCreateStartPage(NavigationCaseType navCase) {// FromViewIdType
-		PageflowPage startPageflowNode = null;
-		String path = "*"; //$NON-NLS-1$
-		NavigationRuleType rule = (NavigationRuleType) navCase.eContainer();
-		FromViewIdType source = getSource(navCase);
-		if (source != null) {
-			path = source.getTextContent();
-		}
-		if (getValidPFPageInCache(path) == null) {
-			startPageflowNode = TransformUtil.findPage(path, pageflow);
-
-			if (startPageflowNode == null) {
-				// not exist or is "*"
-				if (DEBUG)
-					System.out.println("Create new start page"); //$NON-NLS-1$
-				startPageflowNode = createPFPage(path);
-				pageflowChanged = true;
-			}
-			mapPaths2PF.put(path, startPageflowNode);
-			PageflowTransform.getInstance().updatePageflowSourcePage(
-					startPageflowNode, rule);
-		} else {
-			startPageflowNode = (PageflowPage) mapPaths2PF.get(path);
-		}
-		if (source != null) {
-			ReferenceElement element = new PageReferenceElement(
-					startPageflowNode);
-			element.add(source);
-			startPageflowNode
-					.setReferenceLink(element.resolveReferenceString());
-			startPageflowNode.getFCElements().add(source);
-		}
-		return startPageflowNode;
-	}
-
-	/**
-	 * Search for an existing pageflow page matching to navigation case's
-	 * target, if there is no such page existing, create one.
-	 * 
-	 * @param navCase
-	 * @return
-	 */
-	private PageflowPage getOrCreateEndPage(NavigationCaseType navCase) {
-		PageflowPage endPageflowNode = null;
-		ToViewIdType target_ = navCase.getToViewId();
-		if (target_ != null) {
-			String path = target_.getTextContent();
-			if (getValidPFPageInCache(path) == null) {
-				endPageflowNode = TransformUtil.findPage(path, pageflow);
-				if (endPageflowNode == null) {
-					endPageflowNode = createPFPage(path);
-					if (DEBUG)
-						System.out.println("Create new end page"); //$NON-NLS-1$
-					pageflowChanged = true;
-				}
-				mapPaths2PF.put(path, endPageflowNode);
-				PageflowTransform.getInstance().updatePageflowTargetPage(
-						endPageflowNode, navCase);
-			} else {
-				endPageflowNode = (PageflowPage) mapPaths2PF.get(path);
-			}
-			if (target_ != null) {
-				ReferenceElement element = new PageReferenceElement(
-						endPageflowNode);
-				element.add(target_);
-				endPageflowNode.setReferenceLink(element
-						.resolveReferenceString());
-				endPageflowNode.getFCElements().add(target_);
-			}
-		}
-		return endPageflowNode;
-	}
-
-	/**
-	 * Return a valid cached pageflow node.
-	 * 
-	 * @param key
-	 * @return
-	 */
-	private PageflowPage getValidPFPageInCache(Object key) {
-		EObject element = (EObject) mapPaths2PF.get(key);
-		if (!TransformUtil.isValidPageflowElement(element)
-				|| !(element instanceof PageflowPage)
-				|| !((PageflowPage) element).getPath().equals(key)) {
-			mapPaths2PF.remove(key);
-			element = null;
-		}
-		return (PageflowPage) element;
-	}
-
-	/**
-	 * Return a valid cached pageflow link.
-	 * 
-	 * @param caseType
-	 * @return
-	 */
-	private PageflowLink getValidPFLinkInCache(EObject caseType) {
-		PageflowLink link = (PageflowLink) mapCases2Links.get(caseType);
-		if (!TransformUtil.isValidLink(link)) {
-			mapCases2Links.remove(caseType);
-			link = null;
-		}
-		return link;
-
-	}
-
-	/**
-	 * Update pageflow model elements against faces-config navigation case.
-	 * @param pageflow_ 
-	 * @param caseFC 
-	 * @return true if the pageflow was changed
-	 */
-	public boolean updatePageflowElements(Pageflow pageflow_,
-			NavigationCaseType caseFC) {
-		this.pageflowChanged = false;
-		this.pageflow = pageflow_;
-		ToViewIdType target_ = caseFC.getToViewId();
-		if (target_ == null) {
-			return false;
-		}
-
-		PageflowPage start = null, end = null;
-		// start page
-		start = getOrCreateStartPage(caseFC);
-		String action = null;
-		// action
-		if (caseFC.getFromAction() != null) {
-			action = caseFC.getFromAction().getTextContent();
-		}
-		// from outcome
-		String fromOutCome = null;
-		if (caseFC.getFromOutcome() != null) {
-			fromOutCome = caseFC.getFromOutcome().getTextContent();
-		}
-		// end page
-		end = getOrCreateEndPage(caseFC);
-		// link
-		// Is there a link in pageflow model?
-		PageflowLink link = null;
-		if ((link = findUnmappedLink(start, end, caseFC)) == null) {
-			if (end != null) {
-				if (DEBUG)
-					System.out.println("Create new link"); //$NON-NLS-1$
-				link = createPFLink(start, end, action, fromOutCome);
-				pageflowChanged = true;
-			}
-		}
-		if (link != null) {
-			link.getFCElements().clear();
-			link.getFCElements().add(caseFC);
-			mapCases2Links.put(caseFC, link);
-		}
-		adapt(start);
-		adapt(end);
-		adapt(caseFC);
-		adapt(link);
-		return pageflowChanged;
-	}
-
-	private boolean cleanPageflowNavigationRule(Pageflow pageflow_) {
-		boolean dirty = false;
-		List links = pageflow_.getLinks();
-		Iterator linksIterator = links.iterator();
-		while (linksIterator.hasNext()) {
-			PageflowLink link = (PageflowLink) linksIterator.next();
-			if (link.getFCElements().isEmpty()) {
-				linksIterator.remove();
-				if (link.getSource() != null) {
-					link.getSource().getOutlinks().remove(link);
-				}
-				if (link.getTarget() != null) {
-					link.getTarget().getInlinks().remove(link);
-				}
-				dirty = true;
-			}
-		}
-		return dirty;
-	}
-
-	/**
-	 * merge the two navigation rules list between pageflow and face-config
-	 * file. merge rule: 1. if the from-view-id, from-action, and from-outcome
-	 * are same, they are the same navigation case, then the navigation case in
-	 * face-config file should be updated by one in the pageflow. 2. otherwise
-	 * the new navigation case should be created.
-	 * 
-	 * FIXME: Not merge, only update page flow from faces-config.
-	 * 
-	 * @param rulesFC -
-	 *            navigation rules in faces-config.
-	 * @param navigationRulesInPageflow -
-	 *            navigation rules in pageflow model.
-	 * 
-	 * @return boolean - whether add a new rule or not.
-	 */
-	private boolean updateNavigationRulesInPageflowFromFacesConfig(List rulesFC) {
-		boolean isNew = false;
-		// if the faces-config file is empty, the links should be removed.
-		if (rulesFC == null || rulesFC.isEmpty()) {
-			for (Iterator iterLink = pageflow.getLinks().iterator(); iterLink
-					.hasNext();) {
-				PageflowLink link = (PageflowLink) iterLink.next();
-				link.getSource().getOutlinks().remove(link);
-				link.getTarget().getInlinks().remove(link);
-			}
-			pageflow.getLinks().clear();
-		} else {
-			// Rule - Cases
-			for (Iterator iterRulesFC = rulesFC.iterator(); iterRulesFC
-					.hasNext();) {
-				NavigationRuleType ruleFC = (NavigationRuleType) iterRulesFC
-						.next();
-
-				List casesFC = ruleFC.getNavigationCase();
-				for (Iterator iterCasesFC = casesFC.iterator(); iterCasesFC
-						.hasNext();) {
-					NavigationCaseType navigationCaseFC = (NavigationCaseType) iterCasesFC
-							.next();
-					isNew |= updatePageflowElements(pageflow, navigationCaseFC);
-				}
-			}
-		}
-		isNew |= cleanPageflowNavigationRule(pageflow);
-		return isNew;
-	}
-
-	/**
-	 * Find a pageflow link that is not linked to a faces-config element. Since
-	 * user might edit faces-config file with other editor, so the path is not
-	 * always valid, here we still try to match link and navigation case. TODO:
-	 * should we always resolve mapping from referenceLink on PageflowElement?
-	 */
-	private PageflowLink findUnmappedLink(PageflowPage start, PageflowPage end,
-			NavigationCaseType caseFC) {
-		List links = start.getOutlinks();
-		for (int i = 0, n = links.size(); i < n; i++) {
-			PageflowLink link = (PageflowLink) links.get(i);
-			if (link.getSource() == start && link.getTarget() == end) {
-				link.update();
-				if (link.getFCElements().isEmpty()
-						|| link.getFCElements().getData().get(0) == caseFC) {
-					return link;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * create a new PFLink object according to fromOutcome attribute
-	 * 
-	 * @param fromOutcome -
-	 *            PFLink's fromOutcome attribute
-	 * @return - new PFLink object
-	 */
-	public PageflowLink createPFLink(String fromOutcome) {
-		PageflowLink link = null;
-		link = PageflowModelManager.getFactory().createPFLink();
-		if (fromOutcome != null && fromOutcome.length() > 0) {
-			link.setOutcome(fromOutcome.trim());
-		}
-		pageflow.getLinks().add(link);
-		return link;
-	}
-
-	/**
-	 * create a new PFLink object according to fromOutcome attribute
-	 * @param start 
-	 * @param target_ 
-	 * @param action 
-	 * 
-	 * @param fromOutcome -
-	 *            PFLink's fromOutcome attribute
-	 * @return - new PFLink object
-	 */
-	public PageflowLink createPFLink(PageflowNode start, PageflowNode target_,
-			String action, String fromOutcome) {
-		Assert.isTrue(start != null && target_ != null);
-		PageflowLink link = null;
-		link = createPFLink(fromOutcome);
-		link.setFromaction(action);
-		link.setSource(start);
-		link.setTarget(target_);
-		start.getOutlinks().add(link);
-		target_.getInlinks().add(link);
-		return link;
-	}
-
-	/**
-	 * Create a new PFPage according to from-view-id
-	 * 
-	 * @param fromViewID -
-	 *            page's from-view-id
-	 * @return the page flow page
-	 */
-	public PageflowPage createPFPage(String fromViewID) {
-		PageflowPage page = PageflowFactory.eINSTANCE.createPFPage();
-		if (fromViewID != null && fromViewID.length() > 0) {
-			page.setPath(fromViewID.trim());
-			page.setName(WebrootUtil.getPageNameFromWebPath(fromViewID.trim()));
-		}
-		this.pageflow.getNodes().add(page);
-		return page;
-	}
-
-	/**
-	 * update pageflow model according to the face-config model
-	 * 
-	 * @author sfshi
-	 * @return true if new rules were added
-	 */
-	public boolean updatePageflowModelFromEMF() {
-		if (pageflow != null && facesConfig != null) {
-			List navigationRulesInFacesconfig = facesConfig.getNavigationRule();
-			clearCaches();
-			// if add new one, we can relayout the current pageflow.
-			return updateNavigationRulesInPageflowFromFacesConfig(navigationRulesInFacesconfig);
-		}
-		return false;
-	}
-
-	void refreshLink(NavigationCaseType caseType) {
-		PageflowLink link = getValidPFLinkInCache(caseType);
-		if (link != null) {
-			removeLink(link);
-		}
-		// update pageflow
-		if (TransformUtil.isValidFacesConfigElement(caseType)) {
-			updatePageflowElements(pageflow, caseType);
-		}
-	}
-
-	public void notifyChanged(Notification msg) {
-		int type = msg.getEventType();
-		switch (type) {
-		case MY_NOTIFICATION_TYPE:
-			setNeedBatchOperations(true);
-			break;
-		case MY_NOTIFICATION_TYPE1:
-			setNeedBatchOperations(false);
-		}
-	}
-
-	/**
-	 * @return true if is listening to notifications and not
-	 * currently in an event
-	 */
-	public boolean isListenToNotify() {
-		return listenToNotify && !isInEvent;
-	}
-
-	/**
-	 * @return true if in event
-	 */
-//	public boolean isInEvent() {
-//		return isInEvent;
-//	}
-
-	/**
-	 * @param isInEvent
-	 */
-	public void setInEvent(boolean isInEvent) {
-		this.isInEvent = isInEvent;
-	}
-
-	/**
-	 * @return the faces config model
-	 */
-	public FacesConfigType getFacesConfig() {
-		return facesConfig;
-	}
-
-	/**
-	 * @return the root page flow
-	 */
-	public Pageflow getPageflow() {
-		return pageflow;
-	}
-
-	/**
-	 * @param value
-	 * @return a new fromViewId with the text content set to value
-	 */
-	public static FromViewIdType createRLFromViewID(String value) {
-		FromViewIdType fromView = FacesConfigFactory.eINSTANCE
-				.createFromViewIdType();
-		fromView.setTextContent(value);
-		return fromView;
-	}
-
-	/**
-	 * @param value
-	 * @return a new to view with the text content set to value
-	 */
-	public static ToViewIdType createFCToViewID(String value) {
-		ToViewIdType toView = FacesConfigFactory.eINSTANCE.createToViewIdType();
-		toView.setTextContent(value);
-		return toView;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PF2FCSynchronizer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PF2FCSynchronizer.java
deleted file mode 100644
index 88b4953..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PF2FCSynchronizer.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * The adapter that listens to modification of pageflow and updates faces-config
- * as needed.
- * 
- * @author hmeng
- * 
- */
-public class PF2FCSynchronizer extends AdapterImpl {
-	FC2PFTransformer tranformer;
-
-	private final boolean DEBUG = false;
-
-	private static final Logger logger = EditorPlugin
-			.getLogger(PF2FCSynchronizer.class);
-
-	/**
-	 * @param tranformer
-	 */
-	public PF2FCSynchronizer(FC2PFTransformer tranformer) {
-		this.tranformer = tranformer;
-	}
-
-	public Notifier getTarget() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public void setTarget(Notifier newTarget) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return type == PF2FCSynchronizer.class;
-	}
-
-	public void notifyChanged(Notification notification) {
-		if (!isProcessorFor(notification)) {
-			return;
-		}
-		tranformer.setInEvent(true);
-		try {
-			if (!(notification.getNotifier() instanceof PageflowElement)) {
-				return;
-			}
-			processChange(notification);
-		} catch (Exception e) {
-			logger.error(e);
-		} finally {
-			if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
-				tranformer.refreshPFAdapter(tranformer.getPageflow());
-				tranformer.refreshFCAdapter(tranformer.getFacesConfig());
-			}
-			tranformer.setInEvent(false);
-		}
-	}
-
-	private boolean isProcessorFor(Notification notification) {
-		return tranformer.isListenToNotify();
-	}
-
-	private void processChange(Notification notification) {
-		PageflowElement element;
-		element = (PageflowElement) notification.getNotifier();
-		int type = notification.getEventType();
-		switch (type) {
-		case Notification.ADD: {
-			int featureId = notification.getFeatureID(PageflowPackage.class);
-			switch (featureId) {
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-				addOutLink(notification, element);
-				break;
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				addInLink(notification, element);
-				break;
-			case PageflowPackage.PAGEFLOW:
-				break;
-			}
-			if (!tranformer.isNeedBatchOperations()) {
-				updateAndNotify(notification);
-			}
-			break;
-		}
-		case Notification.SET:
-			if (notification.getNewValue() != null) {
-				processSet(notification, element);
-				updateAndNotify(notification);
-			}
-			break;
-		case Notification.REMOVE:
-		case Notification.REMOVE_MANY: {
-			int featureId = notification.getFeatureID(PageflowPackage.class);
-			switch (featureId) {
-			case PageflowPackage.PF_PAGE:
-				// removePage(notification, (PageflowPage) element);
-				break;
-			case PageflowPackage.PAGEFLOW_NODE__OUTLINKS:
-			case PageflowPackage.PAGEFLOW_NODE__INLINKS:
-				removeLink(notification, element);
-				break;
-			}
-			if (!tranformer.isNeedBatchOperations()) {
-				updateAndNotify(notification);
-			}
-			break;
-		}
-		}
-	}
-
-	private void processSet(Notification notification, PageflowElement element) {
-		if (notification.getNewValue() != null) {
-			int value = notification.getFeatureID(PageflowPackage.class);
-			if (element instanceof PageflowPage) {
-				setProperties(notification, element, value);
-			} else if (element instanceof PageflowLink) {
-				if (DEBUG)
-					System.out.println("The link property is changed"); //$NON-NLS-1$
-				setProperties(notification, element, value);
-			}
-		}
-	}
-
-	private void setProperties(Notification notification,
-			PageflowElement element, int value) {
-		if (notification.getFeature() == PageflowPackage.eINSTANCE
-				.getPFLink_Source()) {
-			if (notification.getNewValue() instanceof String) {
-				tranformer.changePFLinkStart((PageflowLink) element,
-						(String) notification.getNewValue());
-			}
-		} else if (notification.getFeature() == PageflowPackage.eINSTANCE
-				.getPFLink_Target()) {
-			if (notification.getNewValue() instanceof String) {
-				tranformer.changePFLinkEnd((PageflowLink) element,
-						(String) notification.getNewValue());
-			}
-		} else {
-			element.getFCElements().set(
-					(EStructuralFeature) notification.getFeature(),
-					notification.getNewValue());
-		}
-	}
-
-	private void addInLink(Notification notification, PageflowElement element) {
-		Object value = notification.getNewValue();
-		PageflowLink link = (PageflowLink) value;
-		if (element instanceof PageflowPage) {
-			PageflowNode source = link.getSource();
-			if (source instanceof PageflowPage) {
-				tranformer.addLink((PageflowPage) source,
-						(PageflowPage) element, link);
-			}
-		}
-
-	}
-
-	private void addOutLink(Notification notification, PageflowElement element) {
-		Object value = notification.getNewValue();
-		// for outLink remove, only target is referenced.
-		PageflowLink link = (PageflowLink) value;
-		if (element instanceof PageflowPage) {
-			PageflowNode target_ = link.getTarget();
-			// page->page
-			if (target_ instanceof PageflowPage) {
-				tranformer.addLink((PageflowPage) element,
-						(PageflowPage) target_, link);
-			}
-		}
-	}
-
-	private void removeLink(Notification notification, PageflowElement element) {
-		Object value = notification.getOldValue();
-		PageflowLink link = (PageflowLink) value;
-
-		if (!link.getFCElements().isEmpty()) {
-			NavigationCaseType caseFC = (NavigationCaseType) link
-					.getFCElements().getData().get(0);
-			if (caseFC != null)
-				tranformer.removeCase(caseFC);
-		}
-		link.update();
-	}
-
-	private void updateAndNotify(Notification notification) {
-		tranformer.getPageflow().notifyModelChanged(
-				new ENotificationImpl((InternalEObject) notification
-						.getNotifier(), Notification.SET,
-						PageflowPackage.PAGEFLOW, null, null));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PFBatchAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PFBatchAdapter.java
deleted file mode 100644
index d30e7d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PFBatchAdapter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author hmeng
- */
-
-public abstract class PFBatchAdapter extends AdapterImpl {
-	private boolean needPostpone;
-
-	AbstractGraphicalEditPart editPart;
-
-	/**
-	 * @param msg
-	 * @return true postponement needed
-	 */
-	public boolean isNeedPostpone(Notification msg) {
-		return needPostpone
-				&& !(msg.getEventType() == FC2PFTransformer.MY_NOTIFICATION_TYPE || msg
-						.getEventType() == FC2PFTransformer.MY_NOTIFICATION_TYPE1);
-	}
-
-	/**
-	 * @param needPostpone
-	 */
-	public void setNeedPostpone(boolean needPostpone) {
-		this.needPostpone = needPostpone;
-	}
-
-	final public void notifyChanged(final Notification msg) {
-		if (!isNeedPostpone(msg)) {
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread())
-				doNotifyChanged(msg);
-			else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						doNotifyChanged(msg);
-					}
-				});
-			}
-		}
-	}
-
-	/**
-	 * @param notification
-	 */
-	abstract public void doNotifyChanged(Notification notification);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/TransformUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/TransformUtil.java
deleted file mode 100644
index d2b40b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/TransformUtil.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.synchronization;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * The util for pageflow and faces-config transforming
- * 
- * @author hmeng
- */
-
-public class TransformUtil {
-
-	/**
-	 * To see if the faces-config element is on a valid hirachy.
-	 * @param object 
-	 * @return true if object's root ancestor is a facesConfig model
-	 */
-	public static boolean isValidFacesConfigElement(EObject object) {
-		EObject parent = EcoreUtil.getRootContainer(object);
-		boolean result = parent instanceof FacesConfigType;
-		return result;
-	}
-
-	/**
-	 * To see if the pageflow element is on a valid hirachy.
-	 * @param element 
-	 * @return true if element's root ancestor is a page flow element
-	 */
-	public static boolean isValidPageflowElement(EObject element) {
-		EObject root = EcoreUtil.getRootContainer(element);
-		boolean result = root instanceof Pageflow;
-		return result;
-	}
-
-	/**
-	 * @param link
-	 * @return true the link is valid
-	 */
-	public static boolean isValidLink(PageflowLink link) {
-		return isValidPageflowElement(link) && link.getSource() != null
-				&& link.getTarget() != null;
-	}
-
-	/**
-	 * @param rule
-	 * @return gets the from-view-id from rule
-	 */
-	public static String getFromViewID(NavigationRuleType rule) {
-		String result = "*"; //$NON-NLS-1$
-		if (rule.getFromViewId() != null) {
-			result = rule.getFromViewId().getTextContent();
-		}
-		return result;
-	}
-
-	/**
-	 * @param navCase
-	 * @return gets the to-view-id from navCase
-	 */
-	public static String getToViewID(NavigationCaseType navCase) {
-		String result = "*"; //$NON-NLS-1$
-		if (navCase.getToViewId() != null) {
-			result = navCase.getToViewId().getTextContent();
-		}
-		return result;
-	}
-
-	/**
-	 * @param path
-	 * @param pageflow
-	 * @return get pageflowpage in pageflow corresponding to path
-	 */
-	public static PageflowPage findPage(String path, Pageflow pageflow) {
-		List nodes = pageflow.getNodes();
-		for (int i = 0; i < nodes.size(); i++) {
-			if (nodes.get(i) instanceof PageflowPage) {
-				if (path != null) {
-					if (path.equals(((PageflowPage) nodes.get(i)).getPath())) {
-						return (PageflowPage) nodes.get(i);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param action
-	 * @param outcome
-	 * @param pageflow
-	 * @return find the end case
-	 */
-	public static PageflowNode findCaseEnd(PageflowPage action,
-			FromOutcomeType outcome, Pageflow pageflow) {
-		// TODO: find a case end in pageflow model
-		List links = action.getOutlinks();
-		for (int i = 0; i < links.size(); i++) {
-			PageflowLink link = (PageflowLink) links.get(i);
-			String outcomeStr = ""; //$NON-NLS-1$
-			if (outcome != null) {
-				outcomeStr = outcome.getTextContent();
-			}
-			if (link.getOutcome().equals(outcomeStr)) {
-				return link.getTarget();
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/EditPartMarkerUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/EditPartMarkerUtil.java
deleted file mode 100644
index a1e3c64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/EditPartMarkerUtil.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-
-/**
- * 
- * Utility class to add and remove edit part markers.
- * 
- * FIXME: add the identification mechanism of the model and remove the
- * dependency on the PageflowElement
- * 
- * @author Xiao-guang Zhang
- * 
- * 
- */
-public class EditPartMarkerUtil {
-
-	/**
-	 * Removes all markers that were created using createMarker()
-	 * 
-	 * @param model -
-	 *            the emf model related with edit part
-	 * @throws CoreException 
-	 */
-	public static void removeAllMarkers(EObject model) throws CoreException {
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			String markerTypes[] = { IMarker.PROBLEM, IMarker.TASK };
-
-			for (int iMT = 0; iMT < markerTypes.length; iMT++) {
-				IMarker[] markers = resource.findMarkers(markerTypes[iMT],
-						false, IResource.DEPTH_ONE);
-
-				for (int iMark = 0; iMark < markers.length; iMark++) {
-					markers[iMark].delete();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes a specific problem marker type with the given severity.
-	 * 
-	 * @param model -
-	 *            the model related with this edit part.
-	 * @param sMarkerType -
-	 *            the marker type, either IMarker.PROBLEM or IMarker.TASK
-	 * @param iSeverity -
-	 *            severity/priority: if sMarkerType is IMarker.PROBLEM, then
-	 *            this value is one of the PROBLEM severities; if sMarkerType is
-	 *            IMarker.TASK, this is a task priority.
-	 * @throws CoreException
-	 *             passed on from IResource.findMarkers()
-	 */
-	public static void removeAllMarkers(EObject model, String sMarkerType,
-			int iSeverity) throws CoreException {
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			IMarker[] markers = resource.findMarkers(sMarkerType, false,
-					IResource.DEPTH_ONE);
-
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				int iMarkerSeverity = marker.getAttribute(IMarker.SEVERITY,
-						IMarker.SEVERITY_ERROR);
-
-				if (iMarkerSeverity == iSeverity || iSeverity == -1) {
-					markers[i].delete();
-				}
-			}
-		}
-	}
-
-	/**
-	 * get the resouce according to part or model.
-	 * 
-	 * @param part
-	 * @param model
-	 * @return
-	 */
-	private static IResource getResource(EObject model) {
-		IResource resource = null;
-		resource = WebrootUtil.getResource(model);
-		return resource;
-	}
-
-	/**
-	 * Create a problem marker.
-	 * 
-	 * @param model -
-	 *            the model related with this edit part.
-	 * @param sMarkerType 
-	 * @param severity -
-	 *            the problem severity, one of IMarker.SEVERITY_ERROR,
-	 *            IMarker.SEVERITY_WARNING or IMarker.SEVERITY_INFO
-	 * @param message -
-	 *            the text associated with this marker
-	 * @param location -
-	 *            a unique ID that the application can use to locate the
-	 *            editpart
-	 * 
-	 * that corresponds to this marker; this is typically the DiagramElement's
-	 * ID string
-	 * @throws CoreException
-	 */
-	public static void createMarker(EObject model, String sMarkerType,
-			int severity, String message, String location) throws CoreException {
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			IMarker marker = resource.createMarker(sMarkerType);
-			marker.setAttribute(IMarker.MESSAGE, message);
-			marker.setAttribute(IMarker.SEVERITY, severity);
-			// The problem view doesn't show the location - only the line number
-			// is shown in the "location" column. Doh!
-			if (location != null && location.length() > 0) {
-				marker.setAttribute(IMarker.LOCATION, location);
-			}
-		}
-	}
-
-	/**
-	 * Removes a specific problem marker type with the given severity.
-	 * 
-	 * @param model -
-	 *            the model related with this edit part.
-	 * @param sMarkerType -
-	 *            the marker type, either IMarker.PROBLEM or IMarker.TASK
-	 * @throws CoreException
-	 *             passed on from IResource.findMarkers()
-	 */
-	public static void removeMarker(EObject model, String sMarkerType)
-			throws CoreException {
-		IResource resource = getResource(model);
-		if (resource != null) {
-			IMarker[] markers = resource.findMarkers(sMarkerType, false,
-					IResource.DEPTH_ONE);
-
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				// get the marker's location
-				Object id = marker.getAttribute(IMarker.LOCATION);
-
-				if (model instanceof PageflowElement) {
-					if (((PageflowElement) model).getId().equals(id)) {
-						markers[i].delete();
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Searches the hierarchy starting at the given EditPart for a given model
-	 * object ID string (the DiagramElement.ID value) and returns that EditPart
-	 * 
-	 * @param containerPart
-	 * @param id
-	 * @return the EditPart that corresponds to the given ID string, or null if
-	 *         not found
-	 */
-	public static GraphicalEditPart findEditPart(
-			GraphicalEditPart containerPart, String id) {
-		Object model = containerPart.getModel();
-		if (model instanceof PageflowElement) {
-			String modelId = ((PageflowElement) model).getId();
-			if (modelId != null && modelId.equals(id)) {
-				return containerPart;
-			}
-		}
-
-		Iterator iterNode = containerPart.getChildren().iterator();
-		while (iterNode.hasNext()) {
-			GraphicalEditPart child = (GraphicalEditPart) iterNode.next();
-			GraphicalEditPart foundPart = findEditPart(child, id);
-			if (foundPart != null) {
-				return foundPart;
-			}
-		}
-
-		Iterator iterConnection = containerPart.getSourceConnections()
-				.iterator();
-		while (iterConnection.hasNext()) {
-			GraphicalEditPart child = (GraphicalEditPart) iterConnection.next();
-			GraphicalEditPart foundPart = findEditPart(child, id);
-			if (foundPart != null) {
-				return foundPart;
-			}
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPDomAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPDomAdapter.java
deleted file mode 100644
index 36845dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPDomAdapter.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Document;
-import org.w3c.dom.NodeList;
-
-/**
- * This class is defined as a simple adapter to JSP DOM model. User can get the
- * taglib prefix, and get the needed element by element tage name, and
- * namespace(prefix) Usage: User should initialize this class instance before
- * using it. Following is a typical example: JSPDomAdapter jspAdapter = new
- * JSPDomAdapter(); IFile jspFile =
- * ResourcesPlugin.getWorkspace().getRoot().getFile(jspPath); if
- * (_jspAdapter.initialize(jspFile)) { //the prefix of JSF HTML TagLib String
- * prefix = _jspAdapter.getTagLibPrefix(JSPDomAdapter.JSF_HTML_TAGLIB); }
- * 
- * @author Xiao-guang Zhang
- */
-public class JSPDomAdapter {
-    /** log instance */
-    private static final Logger log = EditorPlugin
-    .getLogger(JSPDomAdapter.class);
-
-    /** JSP Taglib's tag name */
-    public static String JSP_TAGLIB_TAG = "jsp:directive.taglib"; //$NON-NLS-1$
-
-    /** JSF HTML TagLib name */
-    public static String JSF_HTML_TAGLIB = "http://java.sun.com/jsf/html"; //$NON-NLS-1$
-
-    /** singleton model manager */
-    private static IModelManager modelManager;
-
-    /** source jsp file */
-    private IFile jspFile;
-
-    /** Structured Model of JSP File */
-    private IStructuredModel model;
-
-    /** Root Document (Node) of JSP file */
-    private Document document;
-
-    /**
-     * 
-     */
-    public JSPDomAdapter() {
-        super();
-
-    }
-
-    /**
-     * initialize this adapter to get the StructuredModel for the input file.
-     * At last user should call releaseModel() method to release the Structured Model.
-     * 
-     * @param file -
-     *            JSP file
-     * @return - True means sucessfully load jsp file.
-     */
-    public boolean initialize(final IFile file) {
-        jspFile = file;
-
-        if (jspFile != null && jspFile.exists()) {
-            try {
-                model = getModel(jspFile);
-            } catch (final IOException e) {
-                // PageFlow.JSPDomAdapter.FailToGetStructuredModel = Failed to
-                // get the structured model
-                log.error("PageFlow.JSPDomAdapter.FailToGetStructuredModel", e); //$NON-NLS-1$
-            } catch (final CoreException e) {
-                // PageFlow.JSPDomAdapter.FailToGetStructuredModel = Failed to
-                // get the structured model
-                log.error("PageFlow.JSPDomAdapter.FailToGetStructuredModel", e);//$NON-NLS-1$
-            }
-
-            if (model != null && model instanceof IDOMModel) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * get the prefix for the input taglib URI, e.g.,
-     * http://java.sun.com/jsf/html -> "h"
-     * 
-     * @param taglibURI
-     * @return the prefix
-     */
-    public String getTagLibPrefix(final String taglibURI) {
-        String prefix = null;
-
-        final IStructuredDocument sdocument = model.getStructuredDocument();
-
-        if (sdocument != null)
-        {
-            IStructuredDocumentContext context =
-                IStructuredDocumentContextFactory.INSTANCE.getContext(sdocument, -1);
-            ITaglibContextResolver resolver =
-            IStructuredDocumentContextResolverFactory2.INSTANCE.getTaglibContextResolverFromDelegates(context);
-            prefix = resolver.getTagPrefixForURI(taglibURI);
-        }
-
-        return prefix;
-    }
-
-    /**
-     * get the elements by the namespace and its tag name, e.g., h and
-     * commandButton.
-     * 
-     * @param namespace -
-     *            namespace for the taglib, e.g., h for
-     *            http://java.sun.com/jsf/html
-     * @param elementName -
-     *            element Tag Name, e.g., h
-     * @return - Element Node list.
-     */
-    public List getElementsByTagNameNS(final String namespace, final String elementName) {
-        List nodes = null;
-
-        if (getDocument() != null) {
-            NodeList listNodes = null;
-            if (namespace != null) {
-                listNodes = getDocument().getElementsByTagName(
-                        namespace + ":" + elementName); //$NON-NLS-1$
-            } else {
-                listNodes = getDocument().getElementsByTagName(elementName);
-            }
-
-            if (listNodes != null && listNodes.getLength() > 0) {
-                nodes = new ArrayList();
-                for (int i = 0; i < listNodes.getLength(); i++) {
-                    nodes.add(listNodes.item(i));
-                }
-            }
-        }
-        return nodes;
-    }
-
-    /**
-     * get the singleton model manager.
-     * 
-     * @return
-     */
-    private IModelManager getModelManager() {
-        if (modelManager == null) {
-            modelManager = StructuredModelManager.getModelManager();
-        }
-        return modelManager;
-    }
-
-    /**
-     * get the structured model for the JSP file
-     * 
-     * @param file -
-     *            JSP File
-     * @return - IStructuredModel
-     * @throws IOException
-     * @throws CoreException
-     */
-    private IStructuredModel getModel(final IFile file) throws IOException,
-    CoreException {
-        return getModelManager().getModelForRead(file);
-    }
-
-    /**
-     * get the root docuement for the StructuredModel
-     * 
-     * @return
-     */
-    private Document getDocument() {
-        if (document == null) {
-            if (model != null && model instanceof IDOMModel) {
-                document = ((IDOMModel) model).getDocument();
-            }
-        }
-        return document;
-    }
-
-
-    /**
-     * signal we are done with the model
-     */
-    public void releaseModel() {
-        if (model != null) {
-            model.releaseFromRead();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPUtil.java
deleted file mode 100644
index 7b1414b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/JSPUtil.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-/**
- * utility class for JSP related information.
- * 
- * @author Yang Liu
- */
-public class JSPUtil {
-
-	/**
-	 * get the action list in the jsp file
-	 * @param jspFileName 
-	 * 
-	 * @return - action list
-	 */
-	public static List getActionListInJSPFile(String jspFileName) {
-		/** jsp dom adapter */
-
-        List actions = new ArrayList();
-
-        // convert the relative directory to project directory, e.g., /a.jsp to
-        // /testproject/webroot/a.sjp
-        String physicalJspPath = jspFileName;
-        if (physicalJspPath != null && physicalJspPath.length() > 0)
-        {
-            IPath jspPath = new Path(physicalJspPath);
-            IFile jspFile = ResourcesPlugin.getWorkspace().getRoot().getFile(
-                    jspPath);
-
-            if (jspFile != null && jspFile.exists())
-            {
-                JSPDomAdapter jspAdapter = null;
-                try
-                {
-                    jspAdapter = new JSPDomAdapter();
-                    // initialize the adapter to initialize the model of jsp
-                    if (jspAdapter.initialize(jspFile))
-                    {
-                        // the prefix of JSF HTML TagLib
-                        String prefix = jspAdapter
-                                .getTagLibPrefix(JSPDomAdapter.JSF_HTML_TAGLIB);
-
-                        // get the command butonns
-                        List buttonActions = jspAdapter.getElementsByTagNameNS(
-                                prefix, "commandButton");//$NON-NLS-1$
-                        if (buttonActions != null)
-                            actions.addAll(buttonActions);
-
-                        // get the command links
-                        List linkActions = jspAdapter.getElementsByTagNameNS(
-                                prefix, "commandLink");//$NON-NLS-1$
-                        if (linkActions != null)
-                            actions.addAll(linkActions);
-                    }
-                }
-                finally
-                {
-                    if (jspAdapter != null)
-                    {
-                        jspAdapter.releaseModel();
-                    }
-                }
-            }
-        }
-        return actions;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ModelCreationFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ModelCreationFactory.java
deleted file mode 100644
index b869353..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/ModelCreationFactory.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-
-/**
- * This class implements the CreationFactory used by the CreationTool. It in
- * turn uses the EMF-generated factories to create the model instances
- * 
- * @author Xiao-guang Zhang
- */
-public class ModelCreationFactory implements CreationFactory {
-	private Class targetClass;
-
-	/**
-	 * @param targetClass
-	 */
-	public ModelCreationFactory(Class targetClass) {
-		this.targetClass = targetClass;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.CreationFactory#getNewObject()
-	 */
-	public Object getNewObject() {
-		PageflowFactory factory = PageflowModelManager.getFactory();
-
-		Object result = null;
-
-		if (targetClass.equals(PageflowLink.class)) {
-			result = factory.createPFLink();
-
-		} else if (targetClass.equals(PageflowPage.class)) {
-			result = factory.createPFPage();
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.CreationFactory#getObjectType()
-	 */
-	public Object getObjectType() {
-		return targetClass;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAdapterFactory.java
deleted file mode 100644
index 8da99bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAdapterFactory.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * <!-- begin-user-doc --> The <b>Adapter Factory</b> for the model. It
- * provides an adapter <code>createXXX</code> method for each class of the
- * model. <!-- end-user-doc -->
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage
- * @generated
- */
-// FIXME: this appears to be a dead class.
-public class PageflowAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * The cached model package. <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected static PageflowPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = PageflowPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc --> This implementation returns <code>true</code>
-	 * if the object is either the model's package or is an instance object of
-	 * the model. <!-- end-user-doc -->
-	 * 
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject) object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PageflowSwitch modelSwitch = new PageflowSwitch() {
-		public Object casePageflow(Pageflow object) {
-			return createPageflowAdapter();
-		}
-
-		public Object casePageflowNode(PageflowNode object) {
-			return createPageflowNodeAdapter();
-		}
-
-		public Object casePFLink(PageflowLink object) {
-			return createPFLinkAdapter();
-		}
-
-		public Object casePageflowElement(PageflowElement object) {
-			return createPageflowElementAdapter();
-		}
-
-		public Object casePFPage(PageflowPage object) {
-			return createPFPageAdapter();
-		}
-
-		public Object casePFLinkBendpoint(PageflowLinkBendpoint object) {
-			return createPFLinkBendpointAdapter();
-		}
-
-		public Object defaultCase(EObject object) {
-			return createEObjectAdapter();
-		}
-	};
-
-	/**
-	 * Creates an adapter for the <code>target</code>. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @param target
-	 *            the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter) modelSwitch.doSwitch((EObject) target);
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow <em>Pageflow</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow
-	 * @generated
-	 */
-	public Adapter createPageflowAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode <em>Node</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode
-	 * @generated
-	 */
-	public Adapter createPageflowNodeAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink <em>PF Link</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink
-	 * @generated
-	 */
-	public Adapter createPFLinkAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement <em>Element</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement
-	 * @generated
-	 */
-	public Adapter createPageflowElementAdapter() {
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createPFActionAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage <em>PF Page</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage
-	 * @generated
-	 */
-	public Adapter createPFPageAdapter() {
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createPFBeginAdapter() {
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createPFEndAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint <em>PF Link Bendpoint</em>}'.
-	 * <!-- begin-user-doc --> This default implementation returns null so that
-	 * we can easily ignore cases; it's useful to ignore a case when inheritance
-	 * will catch all the cases anyway. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint
-	 * @generated
-	 */
-	public Adapter createPFLinkBendpointAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case. <!-- begin-user-doc --> This
-	 * default implementation returns null. <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-}
-// PageflowAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAnnotationUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAnnotationUtil.java
deleted file mode 100644
index b6a2362..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowAnnotationUtil.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.IAnnotationEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PFValidator;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowElementEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowLinkEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.editpart.PageflowNodeEditPart;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * This class can be used to add annotation for the current pageflow model and
- * decoration for view.
- * 
- * @author Xiao-guang Zhang
- * 
- * 
- */
-public class PageflowAnnotationUtil {
-
-    /**
-     * 
-     * validate the pageflow and its edit part
-     * 
-     * @param containerPart -
-     *            it can be null, then the edit part will not be updated
-     */
-    public static void validatePageflow(final GraphicalEditPart containerPart) {
-        if (containerPart == null) {
-            return;
-        }
-
-        // removeAllAnnotations(containerPart);
-
-        // validate the nodes including page and actions.
-        final Iterator iterChild = containerPart.getChildren().iterator();
-        while (iterChild.hasNext()) {
-
-            final PageflowElementEditPart element = (PageflowElementEditPart) iterChild
-            .next();
-            // String errorMessage = null;
-            if (element instanceof PFValidator) {
-                ((PFValidator) element).validate();
-            }
-            // if (element.getModel() instanceof PageflowPage) {
-            // errorMessage = PageflowValidation.getInstance().getNotifyMessage(
-            // (PageflowPage) element.getModel());
-            // }
-
-            // if (errorMessage != null) {
-            // addAnnotation(element, errorMessage);
-            // } else {
-            // removeAnnotation(element);
-            // }
-
-            // validate the connections.
-            final Iterator iterLinks = element.getSourceConnections().iterator();
-            while (iterLinks.hasNext()) {
-                final PageflowLinkEditPart link = (PageflowLinkEditPart) iterLinks
-                .next();
-                link.validate();
-                // validateLink(link);
-            }
-        }
-
-    }
-
-    /**
-     * validate the page based on model and its's edit part.
-     * 
-     * @param pagePart -
-     *            it can be null, then the edit part will not be updated
-     */
-    public static void validatePage(final PageflowNodeEditPart pagePart) {
-        if (pagePart != null && pagePart.getParent() != null) {
-            return;
-        }
-
-        String errorMessage = null;
-
-        removeAnnotation(pagePart);
-
-        errorMessage = PageflowValidation.getInstance().getNotifyMessage(
-                (PageflowPage) pagePart.getModel());
-
-        if (errorMessage != null) {
-            addAnnotation(pagePart, errorMessage);
-        } else {
-            removeAnnotation(pagePart);
-        }
-
-        // validate the connections.
-        // Iterator iterLinks = pagePart.getSourceConnections().iterator();
-        // while (iterLinks.hasNext()) {
-        // PageflowLinkEditPart link = (PageflowLinkEditPart) iterLinks.next();
-        //
-        // validateLink(link);
-        // }
-    }
-
-    /**
-     * validate the link based on model and its's edit part.
-     * 
-     * @param linkPart -
-     *            it can be null, then the edit part will not be updated
-     */
-    public static void validateLink(final PageflowLinkEditPart linkPart) {
-        if (linkPart != null && linkPart.getParent() != null) {
-            String errorMessage = null;
-
-            removeAnnotation(linkPart);
-
-            errorMessage = PageflowValidation.getInstance().isValidLink(
-                    (PageflowLink) linkPart.getModel());
-
-            if (errorMessage != null) {
-                addAnnotation(linkPart, errorMessage);
-            } else {
-                removeAnnotation(linkPart);
-            }
-        }
-    }
-
-    /**
-     * add a marker with IMarker.PROBLEM type, IMarker.SEVERITY_ERROR severity,
-     * and message.
-     * 
-     * @param editPart
-     * @param model
-     * @param message
-     */
-    private static void addAnnotation(final GraphicalEditPart editPart, final String message) {
-        if (editPart != null && editPart instanceof IAnnotationEditPart) {
-            final Annotation annotation = new Annotation(IMarker.PROBLEM, false,
-                    message);
-            ((IAnnotationEditPart) editPart).addAnnotation(annotation);
-        }
-    }
-
-    /**
-     * remove a marker
-     * 
-     * @param editPart
-     * @param model
-     */
-    private static void removeAnnotation(final GraphicalEditPart editPart) {
-        if (editPart != null && editPart instanceof IAnnotationEditPart) {
-            ((IAnnotationEditPart) editPart).removeAnnotation();
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowModelManager.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowModelManager.java
deleted file mode 100644
index 5e2689a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowModelManager.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.impl.PageflowPackageImpl;
-
-/**
- * Drives the model. Acts as the model entry point, including create, load, save
- * operations.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowModelManager {
-	/**
-	 * In EMF, a resource provides the way to have access to the model content.
-	 */
-	private Resource resourcePageflow = null;
-
-	/**
-	 * the path of current pageflow model resource provides the way to have
-	 * access to the model content.
-	 */
-	private IPath pathPageflow = null;
-
-	/**
-	 * Contains the factory associated with the model.
-	 */
-	private static PageflowFactory pageflowFactory = null;
-
-	/**
-	 * Gives access to the top level pageflow contained in the resource.
-	 */
-	private Pageflow pageflow = null;
-
-	/**
-	 * resource set
-	 */
-	private ResourceSet resourceSet = null;
-
-	/** unicode encoding UTF-8 support */
-	private static HashMap defaultSaveOptions = new HashMap();
-
-	static {
-		defaultSaveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Uses lazy initialization.
-	 * 
-	 * @param path -
-	 *            pageflow file name
-	 * @return the resource containing the pageflow
-	 */
-	public Resource getResource(IPath path) {
-		if (resourcePageflow == null) {
-			pathPageflow = path;
-			ResourceSet resSet = getResourceSet();
-			resourcePageflow = resSet.getResource(URI.createPlatformResourceURI(path
-					.toString(), false), true);
-		}
-
-		return resourcePageflow;
-	}
-
-	/**
-	 * 
-	 * @return the top level pageflow model
-	 */
-	public Pageflow getModel() {
-		if (null == pageflow) {
-			EList l = resourcePageflow.getContents();
-			Iterator i = l.iterator();
-			while (i.hasNext()) {
-				Object o = i.next();
-				if (o instanceof Pageflow) {
-					pageflow = (Pageflow) o;
-				}
-			}
-		}
-		return pageflow;
-	}
-
-	/**
-	 * Creates a resource to contain the network. The resource file does not
-	 * exist yet.
-	 * 
-	 * @param path
-	 * @return
-	 */
-	private Resource createResource(IPath path) {
-		if (resourcePageflow == null) {
-			pathPageflow = path;
-			ResourceSet resSet = getResourceSet();
-			resourcePageflow = resSet.createResource(URI.createPlatformResourceURI(path
-					.toString(), false));
-		}
-		return resourcePageflow;
-	}
-
-	/**
-	 * Returns the resource set.
-	 * 
-	 * @param
-	 * @return
-	 */
-	private ResourceSet getResourceSet() {
-		if (null == resourceSet) {
-			// Initialize the pageflow package, this line can not be removed.
-			PageflowPackageImpl.init();
-			// Register the XML resource factory for the .pageflow extension
-			Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
-			Map regMap = reg.getExtensionToFactoryMap();
-			// m.put("pageflow", new XMIResourceFactoryImpl());
-			regMap.put("pageflow", new PageflowResourceFactoryImpl()); //$NON-NLS-1$
-
-			resourceSet = new ResourceSetImpl();
-		}
-
-		return resourceSet;
-	}
-
-	/**
-	 * Returns the factory associated with the model. Object creation are made
-	 * through that factory.
-	 * 
-	 * @return - pageflow factory
-	 */
-	static public PageflowFactory getFactory() {
-		if (pageflowFactory == null) {
-			// Access the factory (needed to create instances)
-			Map registry = EPackage.Registry.INSTANCE;
-			String pageflowURI = PageflowPackage.eNS_URI;
-			PageflowPackage pageflowPackage = (PageflowPackage) registry
-					.get(pageflowURI);
-			pageflowFactory = pageflowPackage.getPageflowFactory();
-		}
-		return pageflowFactory;
-	}
-
-	/**
-	 * Creates a new pageflow model with begin and end nodes.
-	 * 
-	 * @param path -
-	 *            the new pageflow file name
-	 * @return - new pageflow model
-	 */
-	public Pageflow createPageflow(IPath path) {
-		createResource(path);
-		// Create a new pageflow model
-		Map registry = EPackage.Registry.INSTANCE;
-		String pageflowURI = PageflowPackage.eNS_URI;
-		PageflowPackage nPackage = (PageflowPackage) registry.get(pageflowURI);
-		PageflowFactory nFactory = nPackage.getPageflowFactory();
-		pageflow = nFactory.createPageflow();
-
-		resourcePageflow.getContents().add(pageflow);
-		return pageflow;
-	}
-
-	/**
-	 * Loads the content of the model from the file.
-	 * 
-	 * @param path
-	 */
-	public void load(IPath path) {
-		getResource(path);
-	}
-
-	/**
-	 * reloads the content of the model from the file.
-	 * 
-	 * @param path
-	 */
-	public void reload(IPath path) {
-		getResource(path).unload();
-		load(path);
-	}
-
-	/**
-	 * Saves the content of the model to the file.
-	 * 
-	 * @param path
-	 * @throws IOException 
-	 */
-	public void save(final IPath path) throws IOException {
-		if (!pathPageflow.toString().equalsIgnoreCase(path.toString())) {
-			pathPageflow = path;
-			URI fileURI = URI.createPlatformResourceURI(path.toString(), false);
-			resourcePageflow.setURI(fileURI);
-		}
-		resourcePageflow.save(defaultSaveOptions);
-	}
-
-	/**
-	 * get the file path of current pageflow resource
-	 * 
-	 * @return - the file path
-	 */
-	public IPath getPath() {
-		return pathPageflow;
-	}
-
-	/**
-	 * @param webPath
-	 * @return found page node according the web path.
-	 */
-	public PageflowPage foundPage(String webPath) {
-		PageflowPage page = null;
-
-		if (getModel() != null) {
-			Iterator iterNodes = getModel().getNodes().iterator();
-			while (iterNodes.hasNext()) {
-				PageflowNode node = (PageflowNode) iterNodes.next();
-				if (node instanceof PageflowPage) {
-					if (((PageflowPage) node).getPath().equalsIgnoreCase(webPath)) {
-						page = (PageflowPage) node;
-						break;
-					}
-				}
-			}
-		}
-
-		return page;
-	}
-
-	/**
-	 * 
-	 * Build a path for the resource in the .metadata directory given the path
-	 * of the model resource. For example, given a model resource path of
-	 * \test\folder\filename.ext the resulting Pageflow path name will be
-	 * \test\.metadata\folder\filename.pageflow
-	 * 
-	 * @param pathFacesConfig -
-	 *            faces-config file path.
-	 * 
-	 * @return the ipath
-	 */
-	public static IPath makePageflowPath(IPath pathFacesConfig) {
-		IPath pageflowPath;
-		String[] segs = pathFacesConfig.removeFileExtension().segments();
-		pageflowPath = new Path(segs[0]).makeAbsolute();
-		pageflowPath = pageflowPath.append(".metadata"); //$NON-NLS-1$
-		for (int i = 1; i < segs.length; i++) {
-			pageflowPath = pageflowPath.append(segs[i]);
-		}
-		// pageflowPath.removeFileExtension();
-		pageflowPath = pageflowPath.addFileExtension("pageflow"); //$NON-NLS-1$
-		return pageflowPath;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactory.java
deleted file mode 100644
index 24f995c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactory.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-
-/**
- * 
- * This is the Page Flow Resource Factory for resource drag and drop
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowResourceFactory implements CreationFactory {
-	/** resource */
-	private IResource resource;
-
-	/**
-	 * @param resource
-	 */
-	public PageflowResourceFactory(IResource resource) {
-		this.resource = resource;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see Factory#getNewObject()
-	 */
-	public Object getNewObject() {
-		if (null == resource) {
-			return null;
-		}
-
-		String strWebPath = WebrootUtil.getWebPath(resource.getFullPath());
-		if (strWebPath.length() > 0) {
-			PageflowFactory factory = PageflowModelManager.getFactory();
-			Object result = factory.createPFPage();
-			PageflowPage page = (PageflowPage) result;
-			page.setPath(strWebPath);
-			page.setName(WebrootUtil.getPageNameFromWebPath(strWebPath));
-			return page;
-		}
-        
-        EditorPlugin
-        		.getAlerts()
-        		.error(
-        				"Pageflow.Error.DNDResourceTitle", //$NON-NLS-1$
-        				EditorPlugin
-        						.getResourceString("Pageflow.Error.InvalidResource") //$NON-NLS-1$
-        						+ resource.getName());
-
-		return null;
-	}
-
-	/*
-	 * (non-javadoc)
-	 * 
-	 * @see Factory#getObjectType()
-	 */
-	public Object getObjectType() {
-		return resource;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactoryImpl.java
deleted file mode 100644
index 1181474..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceFactoryImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
-
-/**
- * The <b>Resource Factory</b> associated with the package.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowResourceFactoryImpl extends XMLResourceFactoryImpl {
-	/**
-	 * Creates an instance of the resource factory.
-	 */
-	public PageflowResourceFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * Creates an instance of the resource.
-	 */
-	public Resource createResource(URI uri) {
-		Resource result = new PageflowResourceImpl(uri);
-		return result;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceImpl.java
deleted file mode 100644
index 07e13ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowResourceImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-
-/**
- * 
- * The <b>Resource </b> associated with the package.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowResourceImpl extends XMLResourceImpl {
-	/**
-	 * Creates an instance of the resource. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @param uri
-	 *            the URI of the new resource.
-	 * @generated
-	 */
-	public PageflowResourceImpl(URI uri) {
-		super(uri);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowSwitch.java
deleted file mode 100644
index 3487f12..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowSwitch.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
-
-/**
- * <!-- begin-user-doc --> The <b>Switch</b> for the model's inheritance
- * hierarchy. It supports the call {@link #doSwitch(EObject)} to invoke
- * the <code>caseXXX</code> method for each class of the model, starting with
- * the actual class of the object and proceeding up the inheritance hierarchy
- * until a non-null result is returned, which is the result of the switch. <!--
- * end-user-doc -->
- * 
- * @see org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage
- * @generated
- */
-public class PageflowSwitch {
-	/**
-	 * The cached model package <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected static PageflowPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch. <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public PageflowSwitch() {
-		if (modelPackage == null) {
-			modelPackage = PageflowPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one
-	 * returns a non null result; it yields that result. 
-	 * 
-	 * <!-- begin-user-doc -->
-	 * @param theEObject 
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code>
-	 *         call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one
-	 * returns a non null result; it yields that result. 
-	 * 
-	 * <!-- begin-user-doc -->
-	 * @param theEClass 
-	 * @param theEObject 
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code>
-	 *         call.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List eSuperTypes = theEClass.getESuperTypes();
-        return eSuperTypes.isEmpty() ? defaultCase(theEObject) : doSwitch(
-        		(EClass) eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one
-	 * returns a non null result; it yields that result. 
-	 * 
-	 * <!-- begin-user-doc -->
-	 * @param classifierID 
-	 * @param theEObject 
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code>
-	 *         call.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-		case PageflowPackage.PAGEFLOW: {
-			Pageflow pageflow = (Pageflow) theEObject;
-			Object result = casePageflow(pageflow);
-			if (result == null)
-				result = casePageflowElement(pageflow);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case PageflowPackage.PF_LINK: {
-			PageflowLink pfLink = (PageflowLink) theEObject;
-			Object result = casePFLink(pfLink);
-			if (result == null)
-				result = casePageflowElement(pfLink);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-
-		case PageflowPackage.PF_PAGE: {
-			PageflowPage pfPage = (PageflowPage) theEObject;
-			Object result = casePFPage(pfPage);
-			if (result == null)
-				result = casePageflowNode(pfPage);
-			if (result == null)
-				result = casePageflowElement(pfPage);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-
-		case PageflowPackage.PF_LINK_BENDPOINT: {
-			PageflowLinkBendpoint pfLinkBendpoint = (PageflowLinkBendpoint) theEObject;
-			Object result = casePFLinkBendpoint(pfLinkBendpoint);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		default:
-			return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Pageflow</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Pageflow</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePageflow(Pageflow object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Node</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Node</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePageflowNode(PageflowNode object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>PF Link</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>PF Link</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePFLink(PageflowLink object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Element</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePageflowElement(PageflowElement object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>PF Page</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>PF Page</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePFPage(PageflowPage object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>PF Link Bendpoint</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>PF Link Bendpoint</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePFLinkBendpoint(PageflowLinkBendpoint object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc --> This implementation returns null; returning a
-	 * non-null result will terminate the switch, but this is the last case
-	 * anyway. <!-- end-user-doc -->
-	 * 
-	 * @param object
-	 *            the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-}
-// PageflowSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowTransform.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowTransform.java
deleted file mode 100644
index 327af05..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowTransform.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-
-/**
- * The tranform between pageflow and navigation rules in faces-config file.
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowTransform {
-
-	/** The shared singleton instance. */
-	private static PageflowTransform transform;
-
-	private PageflowTransform() {
-		// private contructor
-	}
-
-	/**
-	 * Returns the shared singleton instance.
-	 * @return  the singleton transform instance
-	 */
-	public static PageflowTransform getInstance() {
-		if (transform == null) {
-			transform = new PageflowTransform();
-		}
-		return transform;
-	}
-
-	/**
-	 * Update source PFPage with Faces-config model.
-	 * 
-	 * @param sourcePage
-	 * @param navigationRuleFC
-	 * @author sfshi
-	 */
-	public void updatePageflowSourcePage(PageflowPage sourcePage,
-			NavigationRuleType navigationRuleFC) {
-		// set the descriiption of link
-		if (navigationRuleFC.getDescription() != null
-				&& navigationRuleFC.getDescription().size() > 0) {
-			String description = ((DescriptionType) navigationRuleFC
-					.getDescription().get(0)).getTextContent();
-			sourcePage.setComment(description);
-		}
-		// set the display-name of link
-		if (navigationRuleFC.getDisplayName() != null
-				&& navigationRuleFC.getDisplayName().size() > 0) {
-			String displayName = ((DisplayNameType) navigationRuleFC
-					.getDisplayName().get(0)).getTextContent();
-			sourcePage.setName(displayName);
-		}
-
-		// Set the icon of link
-		if (navigationRuleFC.getIcon() != null
-				&& navigationRuleFC.getIcon().size() > 0) {
-			boolean largeUpdated = false;
-			boolean smallUpdated = false;
-			for (int i = 0; i < navigationRuleFC.getIcon().size(); i++) {
-				IconType icon = (IconType) navigationRuleFC.getIcon().get(i);
-				if (!largeUpdated && icon.getLargeIcon() != null) {
-					sourcePage.setLargeicon(icon.getLargeIcon()
-							.getTextContent());
-					largeUpdated = true;
-				}
-
-				if (!smallUpdated && icon.getSmallIcon() != null) {
-					sourcePage.setSmallicon(icon.getSmallIcon()
-							.getTextContent());
-					smallUpdated = true;
-				}
-				if (largeUpdated && smallUpdated) {
-					return;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Update target PFPage with Faces-config model.
-	 * 
-	 * @param targetPage
-	 * @param navigationCaseFC
-	 * @author sfshi
-	 */
-	public void updatePageflowTargetPage(PageflowPage targetPage,
-			NavigationCaseType navigationCaseFC) {
-		// set the descriiption of link
-		if (navigationCaseFC.getDescription() != null
-				&& navigationCaseFC.getDescription().size() > 0) {
-			String description = ((DescriptionType) navigationCaseFC
-					.getDescription().get(0)).getTextContent();
-			targetPage.setComment(description);
-		}
-		// set the display-name of link
-		if (navigationCaseFC.getDisplayName() != null
-				&& navigationCaseFC.getDisplayName().size() > 0) {
-			String displayName = ((DisplayNameType) navigationCaseFC
-					.getDisplayName().get(0)).getTextContent();
-			targetPage.setName(displayName);
-		}
-
-		// Set the icon of link
-		if (navigationCaseFC.getIcon() != null
-				&& navigationCaseFC.getIcon().size() > 0) {
-			boolean largeUpdated = false;
-			boolean smallUpdated = false;
-			for (int i = 0; i < navigationCaseFC.getIcon().size(); i++) {
-				IconType icon = (IconType) navigationCaseFC.getIcon().get(0);
-				if (!largeUpdated && icon.getLargeIcon() != null) {
-					targetPage.setLargeicon(icon.getLargeIcon()
-							.getTextContent());
-					largeUpdated = true;
-				}
-
-				if (!smallUpdated && icon.getSmallIcon() != null) {
-					targetPage.setSmallicon(icon.getSmallIcon()
-							.getTextContent());
-					smallUpdated = true;
-				}
-				if (largeUpdated && smallUpdated) {
-					return;
-				}
-			}
-		}
-	}
-
-	/**
-	 * update the pageflow model 's information, including pageflow's name,
-	 * description and related config file
-	 * 
-	 * @param newPageflow
-	 * @param oldPageflow
-	 */
-	public static void updatePageflowModelInfo(Pageflow newPageflow,
-			Pageflow oldPageflow) {
-		if (newPageflow == null || oldPageflow == null) {
-			return;
-		}
-		newPageflow.setName(oldPageflow.getName());
-		newPageflow.setComment(oldPageflow.getComment());
-		newPageflow.setConfigfile(oldPageflow.getConfigfile());
-
-	}
-}
-// PageflowTransform
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowValidation.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowValidation.java
deleted file mode 100644
index 7f69a64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/util/PageflowValidation.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.pageflow.util;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowNode;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Pageflow's validation functions
- * 
- * @author Xiao-guang Zhang
- */
-public class PageflowValidation {
-	/** PageflowValidation singleton instance */
-	private static PageflowValidation instance;
-
-	/** constructor */
-	private PageflowValidation() {
-	    // no external instantiation
-	}
-
-	/**
-	 * get the singleton instance of pageflow validation
-	 * 
-	 * @return the singleton instance of pageflow validation
-	 */
-	public static PageflowValidation getInstance() {
-		if (instance == null) {
-			instance = new PageflowValidation();
-		}
-		return instance;
-	}
-
-	/**
-	 * check whether the source and target pageflow node are allowed to create a
-	 * new link NOT allowed source and target: 1. target node is Begin or source
-	 * node is End 2. both of source and target node are Action. 3. double
-	 * connection from the same source to target
-	 * 
-	 * @param source -
-	 *            source pageflow node
-	 * @param target -
-	 *            target pageflow node
-	 * @return - is valid link or not.
-	 * 
-	 */
-	public boolean isValidLinkForCreation(PageflowNode source,
-			PageflowNode target) {
-		// Source and target must be pointing to some real pageflow node
-		if (source == null || target == null) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * determine the pflink is valid or not for property souce. in our model,
-	 * there are five types of invalid pflinke for property source. 1. link
-	 * between page and action 2. the source of link is Begin or End node 3. the
-	 * target of link is Begin or End node.
-	 * @param link 
-	 * 
-	 * @return - valid link or not.
-	 * 
-	 */
-	public boolean isValidLinkForProperty(PageflowLink link) {
-		return true;
-	}
-
-	/**
-	 * determine the pflink is valid or not for face-config rule in our model,
-	 * there are four types of invalid pflinke. 1. the source of link is Begin
-	 * or End node 2. the target of link is Begin or End node.
-	 * @param link 
-	 * 
-	 * @return - valid link or not.
-	 * 
-	 */
-	public boolean isValidLinkForNavigationRule(PageflowLink link) {
-		return true;
-	}
-
-	/**
-	 * determine the pflink is valid or not for face-config rule in our model,
-	 * there are four types of invalid pflinke.
-	 * @param link 
-	 * 
-	 * @return - valid link or not.
-	 * 
-	 */
-	public String isValidLink(PageflowLink link) {
-		String errorMessage = null;
-		// action-page style
-		// TODO: it should guarantee that outcome should be defined in the
-		// managed bean's method.
-
-		if (link.getSource() instanceof PageflowPage
-				&& link.getTarget() instanceof PageflowPage) {
-			String outcome = link.getOutcome();
-			if (outcome != null && outcome.length() >= 0) {
-				// if (isValidServiceOutcome(outcome))
-				// {
-				// return errorMessage;
-				// }
-				String webPath = ((PageflowPage) link.getSource()).getPath();
-				if (webPath != null) {
-					String projectPath = WebrootUtil.getProjectPath(link,
-							webPath);
-
-					Path resourcePath = new Path(projectPath);
-					IWorkspaceRoot workspaceRoot = ResourcesPlugin
-							.getWorkspace().getRoot();
-					final IResource resource = workspaceRoot
-							.findMember(resourcePath);
-
-					if (resource == null || !resource.exists()) {
-						// Pageflow.Validation.NotExistedSourcePage = The source
-						// page {0} is not existed.
-						errorMessage = NLS
-								.bind(
-										PageflowMessages.Pageflow_Validation_UndefinedOutcome,
-										outcome, webPath);
-					}
-				} else {
-					// Pageflow.Validation.MissingSourcePage = The source page
-					// should be specified.
-					errorMessage = PageflowMessages.Pageflow_Validation_MissingSourcePage;
-				}
-			}
-		}
-		return errorMessage;
-	}
-
-	/**
-	 * Check whether the page is already existed in the pageflow.
-	 * 
-	 * @param pageflow
-	 * @param page
-	 * @return true if page exists (?)
-	 */
-	public boolean isExistedPage(Pageflow pageflow, PageflowPage page) {
-		if (pageflow == null || page == null || page.getPath() == null) {
-			return false;
-		}
-
-		return isExistedPage(pageflow, page.getPath());
-	}
-
-	/**
-	 * Check whether the page is already existed in the pageflow.
-	 * 
-	 * @param pageflow
-	 * @param pagePath
-	 * @return true if pageflow's path is equal to pagePath
-	 */
-	public boolean isExistedPage(Pageflow pageflow, String pagePath) {
-		if (pageflow == null || pagePath == null) {
-			return false;
-		}
-
-		Iterator iter = pageflow.getNodes().iterator();
-
-		while (iter.hasNext()) {
-			PageflowNode existedNode = (PageflowNode) iter.next();
-
-			if (existedNode instanceof PageflowPage) {
-				if (((PageflowPage) existedNode).getPath() != null
-						&& ((PageflowPage) existedNode).getPath()
-								.equalsIgnoreCase(pagePath)) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Check whether the page is valid or not validate page is : 1. if the page
-	 * is general jsp page, it should physically existed. 2. if the page is in
-	 * the form of /foldername/* (it contains the folder), the folder should be
-	 * existed.
-	 * 
-	 * @param page
-	 * @return the notify message for page
-	 */
-	public String getNotifyMessage(PageflowPage page) {
-		String errorMessage = null;
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		String pagePath = page.getPath();
-
-		// Check the path is empty or not
-		if (pagePath != null && pagePath.length() > 0) {
-			String resourceName = WebrootUtil.getProjectPath(page, pagePath);
-			Path resourcePath = new Path(resourceName);
-
-			final IResource resource = workspaceRoot.findMember(resourcePath);
-
-			if (resource != null && resource.exists()) {
-				// This page is related with jsp file
-				if (resourcePath.getFileExtension() != null) {
-					if (!WebrootUtil.isValidWebFile(resourcePath)) {
-						// Pageflow.Validation.InvalidWebPage = the file {0} is
-						// not valid web file.
-						errorMessage = NLS
-								.bind(
-										PageflowMessages.Pageflow_Validation_InvalidWebPage,
-										pagePath);
-					}
-				}
-			} else {
-				// Pageflow.Validation.NotExitedWebPage = the web page {0} is
-				// not existed.
-				errorMessage = NLS.bind(
-						PageflowMessages.Pageflow_Validation_NotExitedWebPage,
-						pagePath);
-			}
-		} else {
-			// Pageflow.Validation.MissingWebPage = the web page's path should
-			// be specified.
-			errorMessage = PageflowMessages.Pageflow_Validation_MissingWebPage;
-		}
-		return errorMessage;
-	}
-
-	/**
-	 * check that the action is valid EL or not,
-	 * 
-	 * @param actionEL -
-	 *            action string, it should be in the form of #{...}
-	 * @return - True or False
-	 */
-	public static boolean isValidActionEL(String actionEL) {
-		if (actionEL != null && actionEL.length() > 3) {
-			// action is defined in JSF expression language, e.g,
-			// #{beanname.methodname}
-			if (actionEL.substring(0, 2).equalsIgnoreCase("#{")//$NON-NLS-1$
-					&& actionEL.substring(actionEL.length() - 1,
-							actionEL.length()).equalsIgnoreCase("}"))//$NON-NLS-1$
-			{
-				// Check the bean is existed or not.
-				return true;
-			}
-
-		}
-		return false;
-	}
-
-	/**
-	 * get the managed bean from action's expression, e.g., beanName.methodName.
-	 * The return will be beanName.
-	 * 
-	 * @param actionEL
-	 * @return the managed bean name
-	 */
-	public static String getManagedBeanforAction(String actionEL) {
-		String managedBeanName = null;
-		if (isValidActionEL(actionEL)) {
-			actionEL = actionEL.substring(2, actionEL.length() - 1);
-			String[] actionParts = actionEL.split("[.]"); //$NON-NLS-1$
-			managedBeanName = actionParts[0];
-		}
-
-		return managedBeanName;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseFigureDecorator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseFigureDecorator.java
deleted file mode 100644
index ffe8a64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseFigureDecorator.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseNodeFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseNodeFigure.java
deleted file mode 100644
index 096bef9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/BaseNodeFigure.java
+++ /dev/null
@@ -1,946 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.draw2d.ConnectionAnchor;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Layer;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The <code>BaseNodeFigure</code> class is the base class for all the figures
- * representing DiagramNodes, ie those that can have ports with maxConnections
- * to other nodes.
- * 
- * Assumes that all NodeFigures have some number of input and output ports
- * 
- * @author ddean
- * 
- */
-/*package*/ class BaseNodeFigure extends Figure implements IBaseFigure {
-	private IBaseFigure baseFigure;
-
-	private boolean anchorsVisible = true;
-
-	private Hashtable connectionAnchors = new Hashtable(7);
-
-	private Vector inputConnectionAnchors = new Vector(2, 2);
-
-	private Vector outputConnectionAnchors = new Vector(2, 2);
-
-	private Vector topConnectionAnchors = new Vector();
-
-	private Vector bottomConnectionAnchors = new Vector();
-
-	private Vector leftConnectionAnchors = new Vector();
-
-	private Vector rightConnectionAnchors = new Vector();
-
-	/**
-	 * @param figure
-	 */
-	public BaseNodeFigure(IBaseFigure figure) {
-		setBaseFigure(figure);
-		ObserveVisibleXYLayout layout = new ObserveVisibleXYLayout();
-		layout.setObserveVisibility(true);
-		setLayoutManager(layout);
-	}
-
-	/**
-	 * @param figure
-	 */
-	public void setBaseFigure(IBaseFigure figure) {
-		setBaseFigure(figure, new Rectangle(0, 0, -1, -1));
-	}
-
-	public void setHighlight(boolean flag) {
-		if (baseFigure != null) {
-			moveToTop(this, baseFigure);
-			baseFigure.setHighlight(flag);
-		}
-	}
-
-	/**
-	 * @param figure
-	 * @param constraint
-	 */
-	public void setBaseFigure(IBaseFigure figure, Rectangle constraint) {
-		if (!getChildren().contains(figure)) {
-			if (getChildren().contains(baseFigure))
-				remove(baseFigure);
-
-			baseFigure = figure;
-			if (!getChildren().contains(baseFigure)) {
-				// CR389070: Figures are abbreviating rule figures names and
-				// making them unreadable
-				if (getParent() != null
-						&& getParent().getLayoutManager() != null) {
-					Rectangle r = getBounds().getCopy();
-					r.width = -1;
-					r.height = -1;
-					getParent().getLayoutManager().setConstraint(this, r);
-				}
-				// CR389495: Working with nested complex activities causes in
-				// the BP editor causes lockup
-				// ensure that constraints are set on figure before add() - this
-				// will cause a layout()
-				this.add(baseFigure, constraint, 0);
-			}
-		}
-	}
-
-	/**
-	 * @return the base figure
-	 */
-	public IBaseFigure getBaseFigure() {
-		return baseFigure;
-	}
-
-	/***************************************************************************
-	 * Input/Output Ports
-	 **************************************************************************/
-
-	/**
-	 * Add an input port and its anchor
-	 * 
-	 * @param portName
-	 *            unique name to refer to the port
-	 */
-	public void addInput(String portName) {
-		InputPortFigure inputPort = new InputPortFigure();
-		add(inputPort);
-		inputPort.setToolTipText(portName);
-
-		PortConnectionAnchor anchor = new PortConnectionAnchor(inputPort);
-		getTargetConnectionAnchors().add(anchor);
-		connectionAnchors.put(portName, anchor);
-	}
-
-	/**
-	 * Add an output port and its anchor
-	 * 
-	 * @param portName
-	 *            unique name to refer to the port
-	 * @return the connection anchor
-	 */
-	public PortConnectionAnchor addOutput(String portName) {
-		OutputPortFigure outputPort = new OutputPortFigure();
-		add(outputPort);
-		outputPort.setToolTipText(portName);
-
-		PortConnectionAnchor anchor = new PortConnectionAnchor(outputPort);
-		getSourceConnectionAnchors().add(anchor);
-		connectionAnchors.put(portName, anchor);
-		return anchor;
-	}
-
-	/**
-	 * Searches for and returns the anchor on this figure that is closest to the
-	 * reference point <code>p</code>
-	 * 
-	 * @param p
-	 *            the reference point
-	 * @return the anchor on this figure that is closest to <code>p</code>
-	 */
-	public ConnectionAnchor connectionAnchorAt(Point p) {
-		ConnectionAnchor closest = null;
-		long min = Long.MAX_VALUE;
-
-		Enumeration e = getSourceConnectionAnchors().elements();
-		while (e.hasMoreElements()) {
-			ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
-			Point p2 = c.getLocation(null);
-			long d = p.getDistance2(p2);
-			if (d < min) {
-				min = d;
-				closest = c;
-			}
-		}
-		e = getTargetConnectionAnchors().elements();
-		while (e.hasMoreElements()) {
-			ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
-			Point p2 = c.getLocation(null);
-			long d = p.getDistance2(p2);
-			if (d < min) {
-				min = d;
-				closest = c;
-			}
-		}
-		return closest;
-	}
-
-	/**
-	 * returns an anchor given its name
-	 * 
-	 * @param portName
-	 *            name of the anchor
-	 * @return the anchor with the name <code>portName</code>
-	 */
-	public ConnectionAnchor getConnectionAnchor(String portName) {
-		return (ConnectionAnchor) connectionAnchors.get(portName);
-	}
-
-	/**
-	 * returns the name of the specified anchor
-	 * 
-	 * @param c
-	 *            the anchor whose name is requested
-	 * @return the name of the specifed anchor
-	 */
-	public String getConnectionAnchorName(ConnectionAnchor c) {
-		Enumeration enumer = connectionAnchors.keys();
-		String key;
-		while (enumer.hasMoreElements()) {
-			key = (String) enumer.nextElement();
-			if (connectionAnchors.get(key).equals(c))
-				return key;
-		}
-		return null;
-	}
-
-	/**
-	 * returns the source connection anchor that is closest to the reference
-	 * point
-	 * 
-	 * @param p
-	 *            the reference point
-	 * @return the closest connection anchor to <code>p</code>
-	 */
-	public ConnectionAnchor getSourceConnectionAnchorAt(Point p) {
-		ConnectionAnchor closest = null;
-		long min = Long.MAX_VALUE;
-
-		Enumeration e = getSourceConnectionAnchors().elements();
-		while (e.hasMoreElements()) {
-			ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
-			Point p2 = c.getLocation(null);
-			long d = p.getDistance2(p2);
-			if (d < min) {
-				min = d;
-				closest = c;
-			}
-		}
-		return closest;
-	}
-
-	/**
-	 * returns all the source connection anchors on this node figure
-	 * 
-	 * @return a vector of all the source connection anchors for this figure
-	 */
-	public Vector getSourceConnectionAnchors() {
-		return outputConnectionAnchors;
-	}
-
-	/**
-	 * returns the target connection anchor that is closest to the reference
-	 * point
-	 * 
-	 * @param p
-	 *            the reference point
-	 * @return the closest target connection anchor to <code>p</code>
-	 */
-	public ConnectionAnchor getTargetConnectionAnchorAt(Point p) {
-		ConnectionAnchor closest = null;
-		long min = Long.MAX_VALUE;
-
-		Enumeration e = getTargetConnectionAnchors().elements();
-		while (e.hasMoreElements()) {
-			ConnectionAnchor c = (ConnectionAnchor) e.nextElement();
-			Point p2 = c.getLocation(null);
-			long d = p.getDistance2(p2);
-			if (d < min) {
-				min = d;
-				closest = c;
-			}
-		}
-		return closest;
-	}
-
-	/**
-	 * returns all the target connection anchors on this node figure
-	 * 
-	 * @return a vector of all the target connection anchors for this figure
-	 */
-	public Vector getTargetConnectionAnchors() {
-		return inputConnectionAnchors;
-	}
-
-	/**
-	 * Returns the name of the specified anchor
-	 * 
-	 * @param anchor
-	 *            the connectio anchor whose name is requested
-	 * @return the anchor's name
-	 */
-	public String getNameForAnchor(ConnectionAnchor anchor) {
-		if (anchor != null) {
-			Iterator it = connectionAnchors.keySet().iterator();
-			String name;
-
-			while (it.hasNext()) {
-				name = (String) it.next();
-
-				if (anchor.equals(connectionAnchors.get(name))) {
-					return name;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param visible
-	 */
-	public void setAnchorsVisible(boolean visible) {
-		if (anchorsVisible != visible) {
-			anchorsVisible = visible;
-			//ConnectionAnchor port;
-			List all = new ArrayList();
-			all.addAll(getTargetConnectionAnchors());
-			all.addAll(getSourceConnectionAnchors());
-			Iterator it = all.iterator();
-			while (it.hasNext()) {
-				IFigure fig = ((ConnectionAnchor) it.next()).getOwner();
-				fig.setVisible(visible);
-			}
-			validate();
-		}
-	}
-
-	/**
-	 * Determine which side of the figure to place each anchor based on the
-	 * relative position (north, south, east or west) of the connection line's
-	 * opposite anchor. If the anchor is not connected to anything else, the
-	 * default is to place target (input) anchors on the left and source
-	 * (output) anchors on the right.
-	 */
-	private void determineAnchorPositions() {
-		Iterator it;
-		topConnectionAnchors.clear();
-		bottomConnectionAnchors.clear();
-		leftConnectionAnchors.clear();
-		rightConnectionAnchors.clear();
-
-		if (anchorsVisible) {
-			//final Dimension size = baseFigure.getPreferredSize();
-			PortConnectionAnchor port;
-
-			// start with outputs
-			it = getSourceConnectionAnchors().iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-				// CR386077: SplitActivity True and False outputs switch
-				// positions based on their targets
-				int direction = port.getOrientation();
-				if (direction == PositionConstants.NONE) {
-					Point loc = port.getOwner().getParent().getBounds()
-							.getLocation();
-					// loc.x += size.width/2;
-					// loc.y += size.height/2;
-					Iterator itc = port.getConnections().iterator();
-					if (itc.hasNext()) {
-						while (itc.hasNext()) {
-							PolylineConnection conn = (PolylineConnection) itc
-									.next();
-							ConnectionAnchor otherPort;
-							if (port == conn.getSourceAnchor())
-								otherPort = conn.getTargetAnchor();
-							else
-								otherPort = conn.getSourceAnchor();
-							if (otherPort.getOwner() == null)
-								continue;
-							Point otherLoc = otherPort.getOwner().getParent()
-									.getBounds().getLocation();
-							// Dimension otherSize =
-							// ((BaseNodeFigure)otherPort.getOwner().getParent()).getBaseFigure().getPreferredSize();
-							// otherLoc.x += otherSize.width/2;
-							// otherLoc.y += otherSize.height/2;
-							direction = loc.getPosition(otherLoc);
-							if (direction == PositionConstants.NORTH)
-								topConnectionAnchors.add(port);
-							else if (direction == PositionConstants.SOUTH)
-								bottomConnectionAnchors.add(port);
-							else if (direction == PositionConstants.WEST)
-								leftConnectionAnchors.add(port);
-							else
-								rightConnectionAnchors.add(port);
-							((PortFigure) port.getOwner())
-									.setOrientation(direction);
-							break; // currently, only the first connection is
-									// considered
-						}
-					} else {
-						rightConnectionAnchors.add(port);
-						((PortFigure) port.getOwner())
-								.setOrientation(PositionConstants.EAST);
-					}
-				} else {
-					// CR386077: SplitActivity True and False outputs switch
-					// positions based on their targets
-					if (direction == PositionConstants.NORTH)
-						topConnectionAnchors.add(port);
-					else if (direction == PositionConstants.SOUTH)
-						bottomConnectionAnchors.add(port);
-					else if (direction == PositionConstants.WEST)
-						leftConnectionAnchors.add(port);
-					else
-						rightConnectionAnchors.add(port);
-				}
-			}
-			it = getTargetConnectionAnchors().iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-				// CR386077: SplitActivity True and False outputs switch
-				// positions based on their targets
-				int direction = port.getOrientation();
-				if (direction == PositionConstants.NONE) {
-					Point loc = port.getOwner().getParent().getBounds()
-							.getLocation();
-					// loc.x += size.width/2;
-					// loc.y += size.height/2;
-					Iterator itc = port.getConnections().iterator();
-					if (itc.hasNext()) {
-						while (itc.hasNext()) {
-							PolylineConnection conn = (PolylineConnection) itc
-									.next();
-							ConnectionAnchor otherPort;
-							if (port == conn.getSourceAnchor())
-								otherPort = conn.getTargetAnchor();
-							else
-								otherPort = conn.getSourceAnchor();
-							if (otherPort.getOwner() == null)
-								continue;
-							Point otherLoc = otherPort.getOwner().getParent()
-									.getBounds().getLocation();
-							// Dimension otherSize =
-							// ((BaseNodeFigure)otherPort.getOwner().getParent()).getBaseFigure().getPreferredSize();
-							// otherLoc.x += otherSize.width/2;
-							// otherLoc.y += otherSize.height/2;
-							direction = loc.getPosition(otherLoc);
-							if (direction == PositionConstants.NORTH)
-								topConnectionAnchors.add(port);
-							else if (direction == PositionConstants.SOUTH)
-								bottomConnectionAnchors.add(port);
-							else if (direction == PositionConstants.EAST)
-								rightConnectionAnchors.add(port);
-							else
-								leftConnectionAnchors.add(port);
-							((PortFigure) port.getOwner())
-									.setOrientation(direction);
-							break; // currently, only the first connection is
-									// considered
-						}
-					} else {
-						leftConnectionAnchors.add(port);
-						((PortFigure) port.getOwner())
-								.setOrientation(PositionConstants.WEST);
-					}
-				} else {
-					// CR386077: SplitActivity True and False outputs switch
-					// positions based on their targets
-					if (direction == PositionConstants.NORTH)
-						topConnectionAnchors.add(port);
-					else if (direction == PositionConstants.SOUTH)
-						bottomConnectionAnchors.add(port);
-					else if (direction == PositionConstants.EAST)
-						rightConnectionAnchors.add(port);
-					else
-						leftConnectionAnchors.add(port);
-				}
-			}
-
-			Comparator comparePorts = new Comparator() {
-				public int compare(Object arg0, Object arg1) {
-					PortConnectionAnchor port0 = (PortConnectionAnchor) arg0;
-					if (port0.getConnections().size() < 1)
-						return 0;
-					PortConnectionAnchor port1 = (PortConnectionAnchor) arg1;
-					if (port1.getConnections().size() < 1)
-						return 0;
-					// CR386077: SplitActivity True and False outputs switch
-					// positions based on their targets
-					if (port0.getOrientation() != PositionConstants.NONE)
-						return 0;
-					if (port1.getOrientation() != PositionConstants.NONE)
-						return 0;
-
-					PolylineConnection conn0 = (PolylineConnection) port0
-							.getConnections().get(0);
-					ConnectionAnchor otherPort0;
-					if (port0 == conn0.getSourceAnchor())
-						otherPort0 = conn0.getTargetAnchor();
-					else
-						otherPort0 = conn0.getSourceAnchor();
-					Point otherLoc0 = otherPort0.getOwner().getParent()
-							.getBounds().getLocation();
-					// Dimension otherSize0 =
-					// ((BaseNodeFigure)otherPort0.getOwner().getParent()).getBaseFigure().getPreferredSize();
-					// otherLoc0.x += otherSize0.width/2;
-					// otherLoc0.y += otherSize0.height/2;
-
-					PolylineConnection conn1 = (PolylineConnection) port1
-							.getConnections().get(0);
-					ConnectionAnchor otherPort1;
-					if (port1 == conn1.getSourceAnchor())
-						otherPort1 = conn1.getTargetAnchor();
-					else
-						otherPort1 = conn1.getSourceAnchor();
-					Point otherLoc1 = otherPort1.getOwner().getParent()
-							.getBounds().getLocation();
-//					Dimension otherSize1 = ((BaseNodeFigure) otherPort1
-//							.getOwner().getParent()).getBaseFigure()
-//							.getPreferredSize();
-					// otherLoc1.x += otherSize1.width/2;
-					// otherLoc1.y += otherSize1.height/2;
-
-					switch (((PortFigure) port0.getOwner()).getOrientation()) {
-					case PositionConstants.NORTH:
-					case PositionConstants.SOUTH:
-						return otherLoc0.x - otherLoc1.x;
-					case PositionConstants.EAST:
-					case PositionConstants.WEST:
-						return otherLoc0.y - otherLoc1.y;
-					}
-					return 0;
-				}
-			};
-
-			// order the anchors on each side so connection lines don't cross
-			Collections.sort(topConnectionAnchors, comparePorts);
-			Collections.sort(leftConnectionAnchors, comparePorts);
-			Collections.sort(bottomConnectionAnchors, comparePorts);
-			Collections.sort(rightConnectionAnchors, comparePorts);
-		}
-	}
-
-	private void placeAnchors() {
-		determineAnchorPositions();
-		if (anchorsVisible) {
-			Iterator it;
-			PortConnectionAnchor port;
-			int y, x;
-
-			Dimension sz = baseFigure.getPreferredSize();
-			LayoutManager layout = getLayoutManager();
-			// CR389070: Figures are abbreviating rule figures names and making
-			// them unreadable
-			Dimension d = getAnchorSize();
-
-			// left ports
-			x = 0;
-			y = FigureConstants.PORT_SPACING / 2;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// keep a constant inset on all 4 sides of the icon
-			// if ( topConnectionAnchors.size()>0 )
-			y += d.height;
-			y += (sz.height - (leftConnectionAnchors.size() * (d.height + FigureConstants.PORT_SPACING))) / 2;
-			it = leftConnectionAnchors.iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-
-				Rectangle r = new Rectangle(x, y, -1, -1);
-				Rectangle oldrect = (Rectangle) layout.getConstraint(port
-						.getOwner());
-				if (!r.equals(oldrect))
-					layout.setConstraint(port.getOwner(), new Rectangle(x, y,
-							-1, -1));
-
-				y += d.height + FigureConstants.PORT_SPACING;
-			}
-
-			// right ports
-			x = sz.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			x += d.width;
-			y = FigureConstants.PORT_SPACING / 2;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			y += d.height;
-			y += (sz.height - (rightConnectionAnchors.size() * (d.height + FigureConstants.PORT_SPACING))) / 2;
-			it = rightConnectionAnchors.iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-
-				Rectangle r = new Rectangle(x, y, -1, -1);
-				Rectangle oldrect = (Rectangle) layout.getConstraint(port
-						.getOwner());
-				if (!r.equals(oldrect))
-					layout.setConstraint(port.getOwner(), new Rectangle(x, y,
-							-1, -1));
-
-				y += d.height + FigureConstants.PORT_SPACING;
-			}
-
-			// top ports
-			y = 0;
-			x = FigureConstants.PORT_SPACING / 2;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			x += d.width;
-			x += (sz.width - (topConnectionAnchors.size() * (d.width + FigureConstants.PORT_SPACING))) / 2;
-			it = topConnectionAnchors.iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-
-				Rectangle r = new Rectangle(x, y, -1, -1);
-				Rectangle oldrect = (Rectangle) layout.getConstraint(port
-						.getOwner());
-				if (!r.equals(oldrect))
-					layout.setConstraint(port.getOwner(), new Rectangle(x, y,
-							-1, -1));
-
-				x += d.width + FigureConstants.PORT_SPACING;
-			}
-
-			// bottom ports
-			y = sz.height;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			y += d.height;
-			x = FigureConstants.PORT_SPACING / 2;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			x += d.width;
-			x += (sz.width - (bottomConnectionAnchors.size() * (d.width + FigureConstants.PORT_SPACING))) / 2;
-			it = bottomConnectionAnchors.iterator();
-			while (it.hasNext()) {
-				port = (PortConnectionAnchor) it.next();
-
-				Rectangle r = new Rectangle(x, y, -1, -1);
-				Rectangle oldrect = (Rectangle) layout.getConstraint(port
-						.getOwner());
-				if (!r.equals(oldrect))
-					layout.setConstraint(port.getOwner(), new Rectangle(x, y,
-							-1, -1));
-
-				x += d.width + FigureConstants.PORT_SPACING;
-			}
-		}
-	}
-
-	/**
-	 * CR389070: Figures are abbreviating rule figures names and making them
-	 * unreadable Anchor size is now dependent on icon size, not constant. Asks
-	 * the connection anchor for its size.
-	 */
-	private Dimension getAnchorSize() {
-		Dimension d = new Dimension(FigureConstants.PORT_SIDE,
-				FigureConstants.PORT_SIDE);
-		if (!connectionAnchors.isEmpty()) {
-			Iterator iter = connectionAnchors.values().iterator();
-			PortConnectionAnchor a = (PortConnectionAnchor) iter.next();
-			d = a.getOwner().getPreferredSize();
-		}
-		return d;
-	}
-
-	/**
-	 * @return the anchor insets
-	 */
-	protected final Insets getAnchorInsets() {
-		Insets in = new Insets(0, 0, 0, 0);
-		// CR389070: Figures are abbreviating rule figures names and making them
-		// unreadable
-		Dimension d = getAnchorSize();
-		// CR374981: Long activity labels do not get wrapped or truncated
-		// if ( leftConnectionAnchors.size()>0 )
-		in.left = d.width;
-		// CR374981: Long activity labels do not get wrapped or truncated
-		// if ( rightConnectionAnchors.size()>0 )
-		in.right = d.width;
-		// CR374981: Long activity labels do not get wrapped or truncated
-		// if ( topConnectionAnchors.size()>0 )
-		in.top = d.height;
-		// CR374981: Long activity labels do not get wrapped or truncated
-		// if ( bottomConnectionAnchors.size()>0 )
-		in.bottom = d.height;
-		return in;
-	}
-
-	public void invalidate() {
-		super.invalidate();
-	}
-
-	/**
-	 * validate method override to arrange the input and output ports around the
-	 * links of the node figures
-	 */
-	public void validate() {
-		placeAnchors();
-		// CR389070: Figures are abbreviating rule figures names and making them
-		// unreadable
-		int x = 0;
-		int y = 0;
-		// if anchors are not visible (CompoundNodeFigure is maximized) always
-		// set position at 0,0
-		if (anchorsVisible) {
-			Dimension d = getAnchorSize();
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			x = d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			y = d.height;
-		}
-		getLayoutManager().setConstraint(baseFigure,
-				new Rectangle(x, y, -1, -1));
-		layout();
-		super.validate();
-	}
-
-	/***************************************************************************
-	 * Miscellaneous
-	 **************************************************************************/
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#setBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setBounds(Rectangle rect) {
-		Rectangle r = rect.getCopy();
-		r.x = 0;
-		r.y = 0;
-		if (anchorsVisible) {
-			// CR389070: Figures are abbreviating rule figures names and making
-			// them unreadable
-			Dimension d = getAnchorSize();
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			{
-				r.x += d.width;
-				r.width -= d.width;
-			}
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( rightConnectionAnchors.size()>0 )
-			r.width -= d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			{
-				r.y += d.height;
-				r.height -= d.height;
-			}
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( bottomConnectionAnchors.size()>0 )
-			r.height -= d.height;
-		}
-		baseFigure.setBounds(r);
-		r.setLocation(rect.getLocation());
-		super.setBounds(r);
-	}
-
-	public Rectangle getBounds() {
-		Dimension size = baseFigure.getBounds().getSize();
-		if (anchorsVisible) {
-			// CR389070: Figures are abbreviating rule figures names and making
-			// them unreadable
-			Dimension d = getAnchorSize();
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			size.width += d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( rightConnectionAnchors.size()>0 )
-			size.width += d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			size.height += d.height;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( bottomConnectionAnchors.size()>0 )
-			size.height += d.height;
-		}
-		Rectangle r = super.getBounds();
-		r.setSize(size);
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(int wHint, int hHint) {
-		Dimension size = baseFigure.getPreferredSize(wHint, hHint).getCopy();
-		if (anchorsVisible) {
-			// CR389070: Figures are abbreviating rule figures names and making
-			// them unreadable
-			Dimension d = getAnchorSize();
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( leftConnectionAnchors.size()>0 )
-			size.width += d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( rightConnectionAnchors.size()>0 )
-			size.width += d.width;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( topConnectionAnchors.size()>0 )
-			size.height += d.height;
-			// CR374981: Long activity labels do not get wrapped or truncated
-			// if ( bottomConnectionAnchors.size()>0 )
-			size.height += d.height;
-		}
-		return size;
-	}
-
-	private static void moveToTop(IFigure parent, IFigure child) {
-		parent.getChildren().remove(child);
-		parent.getChildren().add(child);
-	}
-
-	/**
-	 * move to top layer
-	 */
-	protected final void moveToTop() {
-		IFigure parent = getParent();
-		IFigure child = this;
-		while (parent != null && !(parent instanceof Layer)) {
-			child = parent;
-			parent = parent.getParent();
-		}
-		if (parent instanceof Layer) {
-			parent.getChildren().remove(child);
-			parent.getChildren().add(child);
-		}
-	}
-
-	/***************************************************************************
-	 * IBaseFigure methods delegate to the baseFigure
-	 **************************************************************************/
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setText(java.lang.String)
-	 */
-	public void setText(String text) {
-		baseFigure.setText(text);
-	}
-
-	public void setIcon(Image image) {
-		baseFigure.setIcon(image);
-	}
-
-	/**
-	 * The description property of a DiagramNode is displayed as a tool tip.
-	 * This method is used to set it. Passing a null or zero-length string will
-	 * remove the tool tip
-	 * 
-	 * @param text
-	 *            the description to use for this node's tool tip
-	 * 
-	 * @see IBaseFigure#setToolTipText(java.lang.String)
-	 */
-	public void setToolTipText(String text) {
-		baseFigure.setToolTipText(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#addDecorator(com.sybase.stf.gem.diagram.editor.figures.BaseFigureDecorator)
-	 */
-	public void addDecorator(BaseFigureDecorator decorator) {
-		baseFigure.addDecorator(decorator);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator()
-	 */
-	public void removeDecorator() {
-		baseFigure.removeDecorator();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator(int)
-	 */
-	public void removeDecorator(int position) {
-		baseFigure.removeDecorator(position);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getDecorators()
-	 */
-	public List getDecorators() {
-		return baseFigure.getDecorators();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getText()
-	 */
-	public String getText() {
-		return baseFigure.getText();
-	}
-
-	/*
-	 * CR374981: Long activity labels do not get wrapped or truncated This
-	 * method was added to the IBaseFigure interface to support direct edit of
-	 * figure labels on the canvas.
-	 */
-	public Rectangle getTextBounds() {
-		Rectangle r = baseFigure.getTextBounds().getCopy();
-		r.x += getBounds().x;
-		r.y += getBounds().y;
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getIcon()
-	 */
-	public Image getIcon() {
-		return baseFigure.getIcon();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getToolTipText()
-	 */
-	public String getToolTipText() {
-		return baseFigure.getToolTipText();
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ColorFontFieldEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ColorFontFieldEditor.java
deleted file mode 100644
index f67bbaa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ColorFontFieldEditor.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ComboFieldEditor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ComboFieldEditor.java
deleted file mode 100644
index 53ce7b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ComboFieldEditor.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundFigureListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundFigureListener.java
deleted file mode 100644
index c264648..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundFigureListener.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-/**
- * @author bbrodt
- * 
- * Interface definition for listeners of CompoundFigure events. Events are
- * generated when a user presses a different tab (tabChanged event) or presses
- * one of the minimize/maximize/restore buttons (stateChanged event)
- */
-/*package*/ interface CompoundFigureListener extends WindowFigureListener {
-	/**
-	 * @param oldState
-	 * @param newState
-	 */
-	void stateChanged(int oldState, int newState);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundNodeFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundNodeFigure.java
deleted file mode 100644
index 8de3c5e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/CompoundNodeFigure.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.ActionEvent;
-import org.eclipse.draw2d.ActionListener;
-import org.eclipse.draw2d.FreeformFigure;
-import org.eclipse.draw2d.FreeformListener;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.Layer;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The figure for Compound nodes
- */
-/*package*/ class CompoundNodeFigure extends BaseNodeFigure implements
-		FreeformFigure, IContainerFigure {
-	
-	private static final String RESTORE_HILITE_IMAGE_FILE = "restore_hilite.gif"; //$NON-NLS-1$
-
-	private static final String RESTORE_IMAGE_FILE = "restore.gif"; //$NON-NLS-1$
-
-	private static final String MAXIMIZE_HILITE_IMAGE_FILE = "maximize_hilite.gif"; //$NON-NLS-1$
-
-	private static final String MAXIMIZE_IMAGE_FILE = "maximize.gif"; //$NON-NLS-1$
-
-	private static final String MINIMIZE_HILITE_IMAGE_FILE = "minimize_hilite.gif"; //$NON-NLS-1$
-
-	private static final String MINIMIZE_IMAGE_FILE = "minimize.gif"; //$NON-NLS-1$
-
-	private final static int MINIMIZED = 1;
-
-	final static int RESTORED = 2;
-
-	private final static int MAXIMIZED = 3;
-
-	private int state = RESTORED;
-
-	private TitleBarButton minButton;
-
-	private TitleBarButton maxButton;
-
-	private IconFigure iconFigure;
-
-	private WindowFigure windowFigure;
-
-	private static String DEFAULT_NAME = "CompoundNode"; //$NON-NLS-1$
-
-	private static String DEFAULT_ICON = "editor/CompoundNode.gif"; //$NON-NLS-1$
-
-	private static Image minimizeImage = EditorPlugin.getDefault().getImage(
-			MINIMIZE_IMAGE_FILE);
-
-	private static Image minimizeHiliteImage = EditorPlugin.getDefault()
-			.getImage(MINIMIZE_HILITE_IMAGE_FILE);
-
-	private static Image maximizeImage = EditorPlugin.getDefault().getImage(
-			MAXIMIZE_IMAGE_FILE);
-
-	private static Image maximizeHiliteImage = EditorPlugin.getDefault()
-			.getImage(MAXIMIZE_HILITE_IMAGE_FILE);
-
-	private static Image restoreImage = EditorPlugin.getDefault().getImage(
-			RESTORE_IMAGE_FILE);
-
-	private static Image restoreHiliteImage = EditorPlugin.getDefault()
-			.getImage(RESTORE_HILITE_IMAGE_FILE);
-
-	/**
-	 * Default constructor
-	 */
-	public CompoundNodeFigure() {
-		// create all of the figures and adornments:
-		// the icon figure
-		super(new IconFigure(DEFAULT_NAME, EditorPlugin.getDefault().getImage(
-				DEFAULT_ICON)));
-		iconFigure = (IconFigure) getBaseFigure();
-		// and the window figure
-		windowFigure = new WindowFigure();
-		windowFigure.setForegroundColor(IconFigure.defaultForegroundColor);
-		windowFigure.setFont(IconFigure.defaultFont);
-
-		// then the minimize/maximize buttons.
-		// Note that the maxButton is also used for the "Restore" action
-		// TODO:
-		// The reason for putting these buttons in CompoundNodeFigure instead of
-		// WindowFigure where they really belong, is that the TitleBarButton is
-		// a
-		// draw2d Button (which subclasses Figure) and these must be placed in
-		// the
-		// titlebar (i.e. a SchemeBorder) because that's where they belong. The
-		// problem
-		// with this is that the Figure.paint() method first draws all of its
-		// children
-		// figures, then the border which means that the buttons would be
-		// obscured.
-		// This should be fixed as time allows and the WindowFigureListener
-		// interface
-		// should then also be modified to include a buttonPressed()
-		// notification
-		// for which CompoundNodeFigure can be a listener.
-		minButton = new TitleBarButton(minimizeImage, minimizeHiliteImage,
-				null, null);
-		maxButton = new TitleBarButton(maximizeImage, maximizeHiliteImage,
-				restoreImage, restoreHiliteImage);
-
-		add(minButton);
-		add(maxButton);
-
-		minButton.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent event) {
-				setState(CompoundNodeFigure.MINIMIZED);
-			}
-		});
-		maxButton.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent event) {
-				setState(maxButton.getState() ? CompoundNodeFigure.MAXIMIZED
-						: CompoundNodeFigure.RESTORED);
-			}
-		});
-
-		// show as a normal window initially
-		showIcon();
-
-		// testing BaseFigureDecorators:
-		// BaseFigureDecorator decorator;
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "top right",
-		// PositionConstants.NORTH_EAST);
-		// addDecorator(decorator);
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "top left",
-		// PositionConstants.NORTH_WEST);
-		// addDecorator(decorator);
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "bottom right",
-		// PositionConstants.SOUTH_EAST);
-		// addDecorator(decorator);
-		// decorator = new
-		// BaseFigureDecorator(EditorPlugin.getDefault().getGEMImage("delete.gif"),
-		// "bottom left",
-		// PositionConstants.SOUTH_WEST);
-		// addDecorator(decorator);
-	}
-
-	public void setOpaque(boolean flag) {
-		windowFigure.setOpaque(flag);
-	}
-
-	/*
-	 * Remove the window figure and its buttons and replace them with the icon
-	 * figure.
-	 */
-	private void showIcon() {
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(false);
-		minButton.setVisible(false);
-		maxButton.setVisible(false);
-		super.setBaseFigure(iconFigure);
-
-		setAnchorsVisible(true);
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(true);
-	}
-
-	/*
-	 * Remove the icon figure and replace with the window figure. Make sure the
-	 * buttons are reset to their correct states.
-	 */
-	private void showWindow() {
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(false);
-		if (state == RESTORED) {
-			super.setBaseFigure(windowFigure);
-
-			minButton.setVisible(true);
-			minButton.setState(false);
-			minButton.setToolTip(new Label(PreferenceMessages.CompoundNodeFigure_MinimizeLabel));
-
-			maxButton.setVisible(true);
-			maxButton.setState(false);
-			maxButton.setToolTip(new Label(PreferenceMessages.CompoundNodeFigure_MaximizeLabel));
-
-			setAnchorsVisible(true);
-		} else if (state == MAXIMIZED) {
-			setAnchorsVisible(false);
-
-			Rectangle constraint = new Rectangle(0, 0, -1, -1);
-			IFigure parent = getParent();
-			if (parent != null) {
-				constraint = parent.getBounds().getCopy();
-				constraint.width += constraint.x;
-				constraint.height += constraint.y;
-				constraint.x = 0;
-				constraint.y = 0;
-			}
-
-			super.setBaseFigure(windowFigure, constraint);
-			if (parent != null && parent.getLayoutManager() != null) {
-				// System.out.println("CompoundNode.showWindow: maximize
-				// "+constraint);
-				parent.getLayoutManager().setConstraint(this, constraint);
-			}
-
-			// the maximize button is used for both Maximize and Restore actions
-			minButton.setVisible(false);
-
-			maxButton.setVisible(true);
-			maxButton.setState(true);
-			maxButton.setToolTip(new Label(PreferenceMessages.CompoundNodeFigure_RestoreLabel));
-		}
-		// CR400779: GEM minimizing a complex activity sometimes leaves junk on
-		// the screen
-		setVisible(true);
-	}
-
-	public void addDecorator(BaseFigureDecorator decorator) {
-		iconFigure.addDecorator(decorator);
-	}
-
-	public void removeDecorator() {
-		iconFigure.removeDecorator();
-	}
-
-	public void removeDecorator(int position) {
-		iconFigure.removeDecorator(position);
-	}
-
-	/**
-	 * @param flag
-	 */
-	public void setHilight(boolean flag) {
-		windowFigure.setHighlight(flag);
-		if (flag)
-			moveToTop();
-	}
-
-	public void setText(String name) {
-		iconFigure.setText(name);
-		windowFigure.setText(name);
-	}
-
-	public void setIcon(Image image) {
-		iconFigure.setIcon(image);
-	}
-
-	public void setToolTipText(String text) {
-		iconFigure.setToolTipText(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#layout()
-	 */
-	public void validate() {
-		LayoutManager layout = getLayoutManager();
-		if (state == MINIMIZED) {
-			// iconFigure.validate();
-		} else if (state == RESTORED) {
-			Rectangle r = windowFigure.getBounds().getCopy();
-			Insets i = windowFigure.getInsets();
-			Dimension dm = maxButton.getSize();
-			Insets p = windowFigure.getTabbedTitleBarBorder().getPadding();
-			layout.setConstraint(maxButton, new Rectangle(r.x + r.width
-					- dm.width - p.right - i.right, r.y + p.top + i.top
-					- dm.height - i.bottom, -1, -1));
-			layout.setConstraint(minButton, new Rectangle(r.x + r.width - 2
-					* dm.width - 2 * p.right - i.right, r.y + p.top + i.top
-					- dm.height - i.bottom, -1, -1));
-		} else if (state == MAXIMIZED) {
-			// CR387660: restore icon on complex activity bounces around
-			// we need to use the parent's bounds when maximized instead of
-			// current window bounds
-			if (getParent() == null)
-				return;
-			Rectangle r = getParent().getBounds().getCopy();
-			Insets i = windowFigure.getInsets();
-			Dimension dm = maxButton.getSize();
-			Insets p = windowFigure.getTabbedTitleBarBorder().getPadding();
-			layout.setConstraint(maxButton, new Rectangle(r.x + r.width
-					- dm.width - p.right - i.right, r.y + p.top, -1, -1));
-		}
-		super.validate();
-	}
-	/**
-	 * @return the window figure
-	 */
-	public WindowFigure getWindowFigure() {
-		return windowFigure;
-	}
-
-	public void setFont(Font f) {
-		iconFigure.setFont(f);
-		windowFigure.setFont(f);
-	}
-
-	public void setForegroundColor(Color c) {
-		iconFigure.setForegroundColor(c);
-		windowFigure.setForegroundColor(c);
-	}
-
-	public void setBackgroundColor(Color c) {
-		iconFigure.setBackgroundColor(c);
-		windowFigure.setBackgroundColor(c);
-	}
-
-	/**
-	 * @return the state
-	 */
-	public int getState() {
-		return state;
-	}
-
-	/**
-	 * @param newState
-	 */
-	public void setState(int newState) {
-		int oldState = state;
-		state = newState;
-
-		if (state == CompoundNodeFigure.MINIMIZED) {
-			if (getParent() != null && getParent().getLayoutManager() != null) {
-				Rectangle constraint = (Rectangle) getParent()
-						.getLayoutManager().getConstraint(this);
-				constraint.width = -1;
-				constraint.height = -1;
-			}
-			showIcon();
-		} else if (state == CompoundNodeFigure.MAXIMIZED) {
-			if (getParent() != null && getParent().getLayoutManager() != null) {
-				Rectangle constraint = (Rectangle) getParent()
-						.getLayoutManager().getConstraint(this);
-				constraint.x = 0;
-				constraint.y = 0;
-				constraint.width = -1;
-				constraint.height = -1;
-			}
-			showWindow();
-		} else if (state == CompoundNodeFigure.RESTORED) {
-			if (getParent() != null && getParent().getLayoutManager() != null) {
-				Rectangle constraint = (Rectangle) getParent()
-						.getLayoutManager().getConstraint(this);
-				constraint.setSize(windowFigure.getBounds().getSize());
-			}
-			showWindow();
-		}
-		fireStateChanged(oldState, newState);
-	}
-
-	private void fireStateChanged(int oldState, int newState) {
-		Object l[] = windowFigure.getTabbedTitleBarBorder().getListeners();
-		for (int i = 0; i < l.length; ++i) {
-			if (l[i] instanceof CompoundFigureListener)
-				((CompoundFigureListener) l[i])
-						.stateChanged(oldState, newState);
-		}
-	}
-
-	public Dimension getMinimumSize(int wHint, int hHint) {
-		if (getState() == CompoundNodeFigure.RESTORED) {
-			Dimension d = windowFigure.getMinimumSize(wHint, hHint);
-			d.width += minButton.getSize().width
-					+ maxButton.getSize().width
-					+ 2
-					* windowFigure.getTabbedTitleBarBorder().getPadding()
-							.getWidth();
-			return d;
-		}
-		if (getState() == CompoundNodeFigure.MINIMIZED)
-			return iconFigure.getMinimumSize(wHint, hHint);
-		return super.getMinimumSize(wHint, hHint);
-	}
-
-	// //////////////////////////////////////////////////////////////////////
-	// FreeformFigure methods
-	// //////////////////////////////////////////////////////////////////////
-
-	private WindowFreeformHelper helper = new WindowFreeformHelper(this);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#addFreeformListener(org.eclipse.draw2d.FreeformListener)
-	 */
-	public void addFreeformListener(FreeformListener listener) {
-		addListener(FreeformListener.class, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#fireExtentChanged()
-	 */
-	public void fireExtentChanged() {
-		// CR389495: Working with nested complex activities causes in the BP
-		// editor causes lockup
-		// not specifically related to this CR, but caused a problem when
-		// compound node
-		// was moved beyond viewport's client area and de-selected - this would
-		// resize
-		// the viewport so that compound node no longer participated in bounds
-		// calculation.
-		if (state == MAXIMIZED) {
-			Iterator iter = getListeners(FreeformListener.class);
-			while (iter.hasNext())
-				((FreeformListener) iter.next()).notifyFreeformExtentChanged();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#getFreeformExtent()
-	 */
-	public Rectangle getFreeformExtent() {
-		// CR389495: Working with nested complex activities causes in the BP
-		// editor causes lockup
-		// same as above
-		if (state == MAXIMIZED)
-			return helper.getFreeformExtent();
-		return getBounds();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#removeFreeformListener(org.eclipse.draw2d.FreeformListener)
-	 */
-	public void removeFreeformListener(FreeformListener listener) {
-		removeListener(FreeformListener.class, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#setFreeformBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setFreeformBounds(Rectangle bounds) {
-		if (getState() == MAXIMIZED)
-			helper.setFreeformBounds(bounds);
-	}
-
-	/*
-	 * CR389070: Figures are abbreviating rule figures names and making them
-	 * unreadable New Method on IContainerFigure
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IContainerFigure#getLayer(java.lang.Object)
-	 */
-	public Layer getLayer(Object key) {
-		if (windowFigure != null && windowFigure.isVisible())
-			return windowFigure.getLayer(key);
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/FigureConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/FigureConstants.java
deleted file mode 100644
index bb57abe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/FigureConstants.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/GEMPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/GEMPreferences.java
deleted file mode 100644
index 790f2c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/GEMPreferences.java
+++ /dev/null
@@ -1,834 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.ColorFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.ColorRegistry;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * This class represents a preference page that is contributed to the
- * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage </samp>,
- * we can use the field support built into JFace that allows us to create a page
- * that is small and knows how to save, restore and apply itself.
- * <p>
- * This page is used to modify preferences only. They are stored in the
- * preference store that belongs to the main plug-in class. That way,
- * preferences can be accessed directly via the preference store.
- */
-
-public final class GEMPreferences extends FieldEditorPreferencePage implements
-		IWorkbenchPreferencePage {
-	// appearance
-    /**
-     * Key for preference for whether or not the intro editor should be shown
-     */
-    public final static String SHOW_INTRO_EDITOR = "ShowIntroEditor"; //$NON-NLS-1$
-    
-	/**
-	 * use system colors preference
-	 */
-	public final static String USE_SYSTEM_COLORS = "UseSystemColors"; //$NON-NLS-1$
-
-	/**
-	 * canvas color preference
-	 */
-	public final static String CANVAS_COLOR = "CanvasColor"; //$NON-NLS-1$
-
-	/**
-	 * figure label font
-	 */
-	public final static String FIGURE_LABEL_FONT = "FigureLabelFont"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String FIGURE_LABEL_FONT_COLOR = "FigureLabelFontColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LABEL_PLACEMENT = "LabelPlacement"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String INPUT_PORT_COLOR = "InputPortColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String OUTPUT_PORT_COLOR = "OutputPortColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String SHOW_LINE_LABELS = "ShowLineLabels"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_LABEL_FONT = "LineLabelFont"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_LABEL_FONT_COLOR = "LineLabelFontColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_LABEL_COLOR = "LineLabelColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_WIDTH = "LineWidth"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_COLOR = "LineColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LINE_ROUTING = "LineRouting"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String SNAP_TO_GRID = "SnapToGrid"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String SNAP_TO_GEOMETRY = "SnapToGeometry"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String GRID_WIDTH = "GridWidth"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String GRID_HEIGHT = "GridHeight"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String GRID_COLOR = "GridColor"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LABEL_PLACEMENT_TOP = "Top"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LABEL_PLACEMENT_BOTTOM = "Bottom"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LABEL_PLACEMENT_LEFT = "Left"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public final static String LABEL_PLACEMENT_RIGHT = "Right"; //$NON-NLS-1$
-
-	// 
-	/**
-	 * "Direct" routing was intended for connections lines without bendpoints;
-	 * this has been removed because it is unnecessary.
-	 * public final static String LINE_ROUTING_DIRECT = "Direct";
-	 * "Manhattan" line routing creates orthogonal lines
-	 */
-	public final static String LINE_ROUTING_MANHATTAN = "Manhattan"; //$NON-NLS-1$
-
-	/**
-	 * "Manual" routing allows user to create bendpoints
-	 */
-	public final static String LINE_ROUTING_MANUAL = "Manaul"; //$NON-NLS-1$
-
-	private final static String[][] m_lineRoutingLabels = {
-			// display, key
-			// { GEMPlugin.getResourceString("CanvasPreferences.LABEL.Direct"),
-			// LINE_ROUTING_DIRECT }, //$NON-NLS-1$ //$NON-NLS-2$
-			{
-				PreferenceMessages.CanvasPreferences_LABEL_Manual, LINE_ROUTING_MANUAL },
-			{
-					PreferenceMessages.CanvasPreferences_LABEL_Manhattan, LINE_ROUTING_MANHATTAN }
-	};
-
-	private final static String[][] m_labelPlacementLabels = {
-			{
-				PreferenceMessages.CanvasPreferences_LABEL_Top, LABEL_PLACEMENT_TOP },
-			{
-					PreferenceMessages.CanvasPreferences_LABEL_Bottom, LABEL_PLACEMENT_BOTTOM },
-			{
-						PreferenceMessages.CanvasPreferences_LABEL_Left, LABEL_PLACEMENT_LEFT },
-			{
-							PreferenceMessages.CanvasPreferences_LABEL_Right, LABEL_PLACEMENT_RIGHT }
-	};
-
-	private Group canvasGroup;
-
-	private Group iconGroup;
-
-	private Group lineGroup;
-
-	private BooleanField useSystemColors;
-
-	private ColorFieldEditor canvasColor;
-
-	private BooleanField snapToGrid;
-
-	private IntegerFieldEditor gridWidth;
-
-	private IntegerFieldEditor gridHeight;
-
-	private ColorFieldEditor gridColor;
-
-	private BooleanField showLineLabels;
-
-	private ColorFieldEditor lineLabelColor;
-
-	private ColorFieldEditor lineColor;
-
-	private ColorFontFieldEditor iconFont;
-
-	private ColorFontFieldEditor lineFont;
-
-	// private ColorFieldEditor inputPortColor;
-	//
-	// private ColorFieldEditor outputPortColor;
-
-	// CR392586: resource leaks
-	// at least keep leaks bounded...
-//	private static Hashtable resourceRegistry = new Hashtable();
-
-	private class BooleanField extends BooleanFieldEditor {
-		private Composite parent;
-
-		/**
-		 * @param name
-		 * @param label
-		 * @param parent
-		 */
-		public BooleanField(String name, String label, Composite parent) {
-			super(name, label, parent);
-			this.parent = parent;
-		}
-
-		/**
-		 * @return the change control button
-		 */
-		public Button getButton() {
-			return getChangeControl(parent);
-		}
-	}
-
-	/**
-	 * Constructor
-	 */
-	public GEMPreferences() {
-		super(GRID);
-		// FIXME: we should be encapsulating what pref store is used for all callers of this class
-		setPreferenceStore(EditorPlugin.getDefault().getPreferenceStore());
-		setDescription(PreferenceMessages.GEMPreferences_description);
-	}
-
-	/**
-	 * Sets the default values of the preferences.
-	 */
-	public static void initializeDefaults() {
-		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-		Font f = JFaceResources.getFontRegistry().get(
-				JFaceResources.DEFAULT_FONT);
-
-		store.setDefault(SHOW_INTRO_EDITOR, true);
-		store.setDefault(USE_SYSTEM_COLORS, true);
-		PreferenceConverter.setDefault(store, CANVAS_COLOR, new RGB(255, 255,
-				255));
-		PreferenceConverter.setDefault(store, FIGURE_LABEL_FONT, f
-				.getFontData());
-		store.setDefault(LINE_WIDTH, 1);
-		store.setDefault(LINE_ROUTING, getLineRoutingLabels()[0][1]);
-		store.setDefault(SHOW_LINE_LABELS, true);
-		PreferenceConverter.setDefault(store, LINE_COLOR, new RGB(0, 0, 0));
-		PreferenceConverter.setDefault(store, LINE_LABEL_COLOR, new RGB(255,
-				255, 255));
-		PreferenceConverter.setDefault(store, LINE_LABEL_FONT, f.getFontData());
-		store.setDefault(SNAP_TO_GEOMETRY, true);
-		store.setDefault(SNAP_TO_GRID, true);
-		store.setDefault(GRID_WIDTH, 12);
-		store.setDefault(GRID_HEIGHT, 12);
-		PreferenceConverter.setDefault(store, GRID_COLOR,
-				new RGB(230, 230, 230));
-		store.setDefault(LABEL_PLACEMENT, LABEL_PLACEMENT_BOTTOM);
-	}
-
-	/**
-	 * Creates the field editors. Field editors are abstractions of the common
-	 * GUI blocks needed to manipulate various types of preferences. Each field
-	 * editor knows how to save and restore itself.
-	 */
-
-	public void createFieldEditors() {
-	    
-	    // note, we aren't saving the reference.  It's assumed that parent
-	    // worries about destruction, persistence etc.
-	    addBooleanField(
-	            SHOW_INTRO_EDITOR,
-	            PreferenceMessages.EditorPreferences_LABEL_ShowIntroEditor,
-	            getFieldEditorParent());
-	            
-		useSystemColors = addBooleanField(
-				USE_SYSTEM_COLORS,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_UseSystemColors,
-				getFieldEditorParent());
-
-		canvasGroup = new Group(getFieldEditorParent(), SWT.NULL);
-		lineGroup = new Group(getFieldEditorParent(), SWT.NULL);
-		iconGroup = new Group(getFieldEditorParent(), SWT.NULL);
-
-		canvasGroup.setText(PreferenceMessages.CanvasPreferenceTab_LABEL_Canvas);
-		canvasColor = addColorField(
-				CANVAS_COLOR,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_BackgroundColor, canvasGroup);
-        // Fix for Bug 268443: [hotbug] FacesConfig Editor preferences page needs more info for screen readers
-        // https://bugs.eclipse.org/bugs/show_bug.cgi?id=268443
-        canvasColor.getColorSelector().getButton().getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_BackgroundColor;
-                    }
-                });
-
-		addBooleanField(
-				SNAP_TO_GEOMETRY,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_SnapToGeometry, canvasGroup);
-		snapToGrid = addBooleanField(
-				SNAP_TO_GRID,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_SnapToGrid, canvasGroup);
-		gridColor = addColorField(
-				GRID_COLOR,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridLineColor, canvasGroup);
-        gridColor.getColorSelector().getButton().getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_GridLineColor;
-                    }
-                });
-        gridWidth = addIntegerField(
-				GRID_WIDTH,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridWidth, canvasGroup);
-		gridHeight = addIntegerField(
-				GRID_HEIGHT,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_GridHeight, canvasGroup);
-
-		iconGroup.setText(PreferenceMessages.CanvasPreferenceTab_LABEL_IconGroup);
-		iconFont = addFontField(
-				FIGURE_LABEL_FONT,
-				PreferenceMessages.CanvasPreferenceTab_LABEL_IconLabelFont, iconGroup);
-        iconFont.getChangeControl(iconGroup).getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_IconLabelFont;
-                    }
-                });
-		addComboField(LABEL_PLACEMENT, PreferenceMessages.CanvasPreferenceTab_LABEL_LabelPlacement,
-				getLabelPlacementLabels(), iconGroup);
-		// inputPortColor = addColorField(
-		// INPUT_PORT_COLOR,
-		// EditorPlugin
-		// .getResourceString("CanvasPreferenceTab.LABEL.InputPortColor"),
-		// iconGroup); //$NON-NLS-1$
-		// outputPortColor = addColorField(
-		// OUTPUT_PORT_COLOR,
-		// EditorPlugin
-		// .getResourceString("CanvasPreferenceTab.LABEL.OutputPortColor"),
-		// iconGroup); //$NON-NLS-1$
-
-		lineGroup.setText(PreferenceMessages.CanvasPreferenceTab_LABEL_LineGroup);
-		showLineLabels = addBooleanField(SHOW_LINE_LABELS, PreferenceMessages.CanvasPreferenceTab_LABEL_ShowLineLabels,
-				lineGroup);
-		lineFont = addFontField(
-				LINE_LABEL_FONT,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelFont, lineGroup);
-        lineFont.getChangeControl(lineGroup).getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelFont;
-                    }
-                });
-		lineLabelColor = addColorField(
-				LINE_LABEL_COLOR,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelColor, lineGroup);
-        lineLabelColor.getColorSelector().getButton().getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_LineLabelColor;
-                    }
-                });
-		
-		lineColor = addColorField(
-				LINE_COLOR,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineColor, lineGroup);
-        lineColor.getColorSelector().getButton().getAccessible().addAccessibleListener(
-                new AccessibleAdapter () {         
-                    public void getName (final AccessibleEvent e) {
-                        e.result = PreferenceMessages.CanvasPreferenceTab_LABEL_LineColor;
-                    }
-                });
-		addIntegerField(
-				LINE_WIDTH,
-				 PreferenceMessages.CanvasPreferenceTab_LABEL_LineWidth, lineGroup);
-		addComboField(LINE_ROUTING,  PreferenceMessages.CanvasPreferenceTab_LABEL_LineRouting,
-				getLineRoutingLabels(), lineGroup);
-	}
-
-	protected void initialize() {
-		// Color use: Default canvas colors should pick up system defaults
-		// enable or disable all of the color and font selection controls in the
-		// preference dialog
-		// depending on whether the "Use System Colors" checkbox is selected.
-		super.initialize();
-
-		((GridLayout) getFieldEditorParent().getLayout()).numColumns = 2;
-
-		canvasGroup.setLayout(new GridLayout(3, false));
-		canvasGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		canvasColor.fillIntoGrid(canvasGroup, 3);
-		gridColor.fillIntoGrid(canvasGroup, 3);
-
-		iconGroup.setLayout(new GridLayout(3, false));
-		iconGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		iconFont.fillIntoGrid(iconGroup, 3);
-
-		lineGroup.setLayout(new GridLayout(3, false));
-		lineGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		lineColor.fillIntoGrid(lineGroup, 3);
-		lineLabelColor.fillIntoGrid(lineGroup, 3);
-		lineFont.fillIntoGrid(lineGroup, 3);
-
-		boolean userColorsValue = !useSystemColors.getBooleanValue();
-		boolean showLineLabelsValue = showLineLabels.getBooleanValue();
-		boolean snapToGridValue = snapToGrid.getBooleanValue();
-		canvasColor.setEnabled(userColorsValue, canvasGroup);
-		gridColor.setEnabled(snapToGridValue && userColorsValue, canvasGroup);
-		iconFont.setEnabled(userColorsValue, iconGroup);
-		// inputPortColor.setEnabled(userColorsValue, iconGroup);
-		// outputPortColor.setEnabled(userColorsValue, iconGroup);
-		lineColor.setEnabled(userColorsValue, lineGroup);
-		lineLabelColor.setEnabled(showLineLabelsValue && userColorsValue,
-				lineGroup);
-		lineFont.setEnabled(showLineLabelsValue && userColorsValue, lineGroup);
-		gridWidth.setEnabled(snapToGridValue, canvasGroup);
-		gridHeight.setEnabled(snapToGridValue, canvasGroup);
-
-		useSystemColors.getButton().addSelectionListener(
-				new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						boolean userColorsValue_ = !useSystemColors
-								.getBooleanValue();
-						boolean showLineLabelsValue_ = showLineLabels
-								.getBooleanValue();
-						boolean snapToGridValue_ = snapToGrid.getBooleanValue();
-
-						canvasColor.setEnabled(userColorsValue_, canvasGroup);
-						gridColor
-								.setEnabled(snapToGridValue_ && userColorsValue_,
-										canvasGroup);
-						iconFont.setEnabled(userColorsValue_, iconGroup);
-						// inputPortColor.setEnabled(userColorsValue,
-						// iconGroup);
-						// outputPortColor.setEnabled(userColorsValue,
-						// iconGroup);
-						lineColor.setEnabled(userColorsValue_, lineGroup);
-						lineLabelColor.setEnabled(showLineLabelsValue_
-								&& userColorsValue_, lineGroup);
-						lineFont.setEnabled(showLineLabelsValue_
-								&& userColorsValue_, lineGroup);
-					}
-				});
-
-		showLineLabels.getButton().addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean userColorsValue_ = !useSystemColors.getBooleanValue();
-				boolean showLineLabelsValue_ = showLineLabels.getBooleanValue();
-				lineLabelColor.setEnabled(showLineLabelsValue_
-						&& userColorsValue_, lineGroup);
-				lineFont.setEnabled(showLineLabelsValue_ && userColorsValue_,
-						lineGroup);
-			}
-		});
-
-		snapToGrid.getButton().addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean userColorsValue_ = !useSystemColors.getBooleanValue();
-				boolean snapToGridValue_ = snapToGrid.getBooleanValue();
-
-				gridColor.setEnabled(snapToGridValue_ && userColorsValue_,
-						canvasGroup);
-				gridWidth.setEnabled(snapToGridValue_, canvasGroup);
-				gridHeight.setEnabled(snapToGridValue_, canvasGroup);
-			}
-		});
-
-	}
-
-	public void init(IWorkbench workbench) {
-        // no initialization
-	}
-
-	private ColorFieldEditor addColorField(String name, String labelText,
-			Composite parent) {
-		ColorFieldEditor f = new ColorFieldEditor(name, labelText, parent);
-		addField(f);
-		return f;
-	}
-
-	private ComboFieldEditor addComboField(String name, String labelText,
-			String[][] entryNamesAndValues, Composite parent) {
-		ComboFieldEditor f = new ComboFieldEditor(name, labelText,
-				entryNamesAndValues, parent);
-		addField(f);
-		return f;
-	}
-
-	private IntegerFieldEditor addIntegerField(String name, String labelText,
-			Composite parent) {
-		IntegerFieldEditor f = new IntegerFieldEditor(name, labelText, parent);
-		addField(f);
-		return f;
-	}
-
-	private BooleanField addBooleanField(String name, String labelText,
-			Composite parent) {
-		BooleanField f = new BooleanField(name, labelText, parent);
-		addField(f);
-		return f;
-	}
-
-//	private StringFieldEditor addStringField(String name, String labelText,
-//			Composite parent) {
-//		StringFieldEditor f = new StringFieldEditor(name, labelText, parent);
-//		addField(f);
-//		return f;
-//	}
-
-	// protected NumberField addNumberField(String name, String labelText,
-	// Composite parent)
-	// {
-	// NumberField f = new NumberField(name,labelText,parent);
-	// addField(f);
-	// return f;
-	// }
-
-	private ColorFontFieldEditor addFontField(String name, String labelText,
-			Composite parent) {
-		ColorFontFieldEditor f = new ColorFontFieldEditor(name, labelText,
-				parent);
-		addField(f);
-		return f;
-	}
-
-	private static String[][] getLineRoutingLabels() {
-		return m_lineRoutingLabels;
-	}
-
-	private static String[][] getLabelPlacementLabels() {
-		return m_labelPlacementLabels;
-	}
-
-//	private static void propagateProperty(String property, EditPart part) {
-//		Iterator iter = part.getChildren().iterator();
-//		while (iter.hasNext()) {
-//			EditPart child = (EditPart) iter.next();
-//			Figure fig = (Figure) ((GraphicalEditPart) child).getFigure();
-//			GEMPreferences.propagateProperty(property, fig);
-//			propagateProperty(property, child);
-//		}
-//	}
-
-	/**
-	 * @return true if the preference is set to show the introduction
-	 * editor.  false otherwise.
-	 */
-	public static boolean getShowIntroEditor()
-	{
-	    IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-	    return store.getBoolean(SHOW_INTRO_EDITOR);
-	}
-	
-	/**
-	 * @param store
-	 * @param property
-	 * @return the color property for the key 'property'
-	 */
-	public static Color getColor(IPreferenceStore store, String property) {
-		boolean useSystemColors = store.getBoolean(USE_SYSTEM_COLORS);
-
-		Color c = ColorConstants.black;
-		if (useSystemColors) {
-			if (GRID_COLOR.equals(property))
-				// c = ColorConstants.buttonDarkest;
-				c = ColorConstants.button;
-			if (LINE_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (LINE_LABEL_FONT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (LINE_LABEL_COLOR.equals(property))
-				c = ColorConstants.listBackground;
-			if (CANVAS_COLOR.equals(property))
-				c = ColorConstants.listBackground;
-			if (INPUT_PORT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (OUTPUT_PORT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-			if (FIGURE_LABEL_FONT_COLOR.equals(property))
-				c = ColorConstants.listForeground;
-		} else {
-			// CR392586: resource leaks
-			RGB rgb = PreferenceConverter.getColor(store, property);
-			ColorRegistry registry = JFaceResources.getColorRegistry();
-			if (registry.get(rgb.toString()) != null)
-				return registry.get(rgb.toString());
-			registry.put(rgb.toString(), rgb);
-			c = registry.get(rgb.toString());
-		}
-		return c;
-	}
-
-//	// CR392586: resource leaks
-//	private static Font getFont(IPreferenceStore store, String property) {
-//		FontData fd = PreferenceConverter.getFontData(store, property);
-//		FontRegistry registry = JFaceResources.getFontRegistry();
-//		if (!registry.get(fd.toString()).equals(registry.defaultFont()))
-//			return registry.get(fd.toString());
-//
-//		registry.put(fd.toString(), new FontData[] {fd});
-//		return registry.get(fd.toString());
-//	}
-
-//	private static void propagateProperty(String property, Figure fig) {
-//		IPreferenceStore store = EditorPlugin.getDefault().getPreferenceStore();
-//		WindowFigure window = null;
-//		IconFigure icon = null;
-//		LinkFigure link = null;
-//		if (fig instanceof CompoundNodeFigure) {
-//			window = ((CompoundNodeFigure) fig).getWindowFigure();
-//			icon = ((CompoundNodeFigure) fig).getIconFigure();
-//		} else if (fig instanceof WindowFigure)
-//			window = (WindowFigure) fig;
-//		else if (fig instanceof LinkFigure)
-//			link = (LinkFigure) fig;
-//
-//		if (property != null && property.equals(USE_SYSTEM_COLORS))
-//			// reload all properties - it's easiest
-//			property = null;
-//
-//		if (property == null || SNAP_TO_GRID.equals(property)) {
-//			boolean b = store.getBoolean(SNAP_TO_GRID);
-//			WindowFigure.defaultGridEnabled = b;
-//
-//			if (window != null)
-//				window.getGridLayer().setVisible(b);
-//		}
-//
-//		if (property == null || GRID_WIDTH.equals(property)
-//				|| GRID_HEIGHT.equals(property)) {
-//			Dimension d = new Dimension(store.getInt(GRID_WIDTH), store
-//					.getInt(GRID_HEIGHT));
-//			WindowFigure.defaultGridSpacing = d;
-//
-//			if (window != null)
-//				window.getGridLayer().setSpacing(d);
-//		}
-//
-//		if (property == null || GRID_COLOR.equals(property)) {
-//			Color c = getColor(store, GRID_COLOR);
-//			WindowFigure.defaultGridColor = c;
-//
-//			if (window != null)
-//				window.getGridLayer().setForegroundColor(c);
-//		}
-//
-//		// TODO: since the line router is managed by the EditPart for the
-//		// container figure, setting the line routing style in the WindowFigure
-//		// does not change the line routing immediately. The editor must be
-//		// restarted for line routing to take effect.
-//		if (property == null || LINE_ROUTING.equals(property)) {
-//			String s = store.getString(LINE_ROUTING);
-//			int style;
-//			if (LINE_ROUTING_MANHATTAN.equals(s))
-//				style = WindowFigure.LINE_ROUTING_MANHATTAN;
-//			else
-//				style = WindowFigure.LINE_ROUTING_MANUAL;
-//
-//			WindowFigure.defaultLineRoutingStyle = style;
-//			if (window != null)
-//				window.setLineRoutingStyle(style);
-//		}
-//
-//		if (property == null || LINE_WIDTH.equals(property)) {
-//			int w = store.getInt(LINE_WIDTH);
-//			LinkFigure.defaultLineWidth = w;
-//
-//			if (link != null)
-//				link.setLineWidth(w);
-//		}
-//
-//		if (property == null || LINE_COLOR.equals(property)) {
-//			Color c = getColor(store, LINE_COLOR);
-//			LinkFigure.defaultLineColor = c;
-//
-//			if (link != null)
-//				link.setForegroundColor(c);
-//		}
-//
-//		if (property == null || SHOW_LINE_LABELS.equals(property)) {
-//			boolean b = store.getBoolean(SHOW_LINE_LABELS);
-//			LinkFigure.defaultLabelVisible = b;
-//
-//			if (link != null)
-//				link.setLabelVisible(b);
-//		}
-//
-//		if (property == null || LINE_LABEL_FONT.equals(property)
-//				|| LINE_LABEL_FONT_COLOR.equals(property)) {
-//			// CR392586: resource leaks
-//			Font f = getFont(store, LINE_LABEL_FONT);
-//			Color c = getColor(store, LINE_LABEL_FONT_COLOR);
-//			LinkFigure.defaultFont = f;
-//			LinkFigure.defaultLabelForeground = c;
-//
-//			if (link != null) {
-//				link.setFont(f);
-//				link.setLabelForeground(c);
-//			}
-//		}
-//
-//		if (property == null || LINE_LABEL_COLOR.equals(property)) {
-//			Color c = getColor(store, LINE_LABEL_COLOR);
-//			LinkFigure.defaultLabelBackground = c;
-//
-//			if (link != null)
-//				link.setLabelBackground(c);
-//		}
-//
-//		if (property == null || CANVAS_COLOR.equals(property)) {
-//			Color c = getColor(store, CANVAS_COLOR);
-//			WindowFigure.defaultBackgroundColor = c;
-//
-//			if (window != null)
-//				window.setBackgroundColor(c);
-//			if (icon != null)
-//				icon.setBackgroundColor(c);
-//		}
-//
-//		if (property == null || INPUT_PORT_COLOR.equals(property)) {
-//			Color c = getColor(store, INPUT_PORT_COLOR);
-//			InputPortFigure.defaultForegroundColor = c;
-//
-//			if (fig instanceof InputPortFigure)
-//				fig.setForegroundColor(c);
-//		}
-//
-//		if (property == null || OUTPUT_PORT_COLOR.equals(property)) {
-//			Color c = getColor(store, OUTPUT_PORT_COLOR);
-//			OutputPortFigure.defaultForegroundColor = c;
-//
-//			if (fig instanceof OutputPortFigure)
-//				fig.setForegroundColor(c);
-//		}
-//
-//		if (property == null || FIGURE_LABEL_FONT.equals(property)
-//				|| FIGURE_LABEL_FONT_COLOR.equals(property)) {
-//			// CR392586: resource leaks
-//			Font f = getFont(store, FIGURE_LABEL_FONT);
-//			Color c = getColor(store, FIGURE_LABEL_FONT_COLOR);
-//			IconFigure.defaultFont = f;
-//			IconFigure.defaultForegroundColor = c;
-//			WindowFigure.defaultFont = f;
-//			WindowFigure.defaultForegroundColor = c;
-//
-//			if (window != null) {
-//				window.setFont(f);
-//				window.setForegroundColor(c);
-//			}
-//			if (icon != null) {
-//				icon.setFont(f);
-//				icon.setForegroundColor(c);
-//			}
-//			if (fig instanceof IconFigure) {
-//				fig.setFont(f);
-//				fig.setForegroundColor(c);
-//			}
-//		}
-//
-//		if (property == null || LABEL_PLACEMENT.equals(property)) {
-//			int placement = PositionConstants.SOUTH;
-//			String s = store.getString(LABEL_PLACEMENT);
-//			if (LABEL_PLACEMENT_TOP.equals(s))
-//				placement = PositionConstants.NORTH;
-//			if (LABEL_PLACEMENT_BOTTOM.equals(s))
-//				placement = PositionConstants.SOUTH;
-//			if (LABEL_PLACEMENT_LEFT.equals(s))
-//				placement = PositionConstants.WEST;
-//			if (LABEL_PLACEMENT_RIGHT.equals(s))
-//				placement = PositionConstants.EAST;
-//			IconFigure.defaultTextPlacement = placement;
-//
-//			if (icon != null)
-//				icon.setTextPlacement(placement);
-//			if (fig instanceof IconFigure)
-//				((IconFigure) fig).setTextPlacement(placement);
-//		}
-//
-//		Iterator iter = fig.getChildren().iterator();
-//		while (iter.hasNext()) {
-//			Figure child = (Figure) iter.next();
-//			propagateProperty(property, child);
-//		}
-//	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IBaseFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IBaseFigure.java
deleted file mode 100644
index 4119636..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IBaseFigure.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Bob
- */
-/*package*/ interface IBaseFigure extends IFigure 
-{
-	/**
-	 * @param text
-	 */
-	public abstract void setText(String text);
-
-	/**
-	 * @return the text
-	 */
-	public abstract String getText();
-
-	/**
-	 * CR374981: Long activity labels do not get wrapped or truncated This
-	 * method was added to the IBaseFigure interface to support direct edit of
-	 * figure labels on the canvas.
-	 * @return the text bounds rectangle
-	 */
-	public abstract Rectangle getTextBounds();
-
-	/**
-	 * @param image
-	 */
-	public abstract void setIcon(Image image);
-
-	/**
-	 * @return the icon
-	 */
-	public abstract Image getIcon();
-
-	/**
-	 * @param text
-	 */
-	public abstract void setToolTipText(String text);
-
-	/**
-	 * @return the tool tip text
-	 */
-	public abstract String getToolTipText();
-
-	/**
-	 * @param flag
-	 */
-	public abstract void setHighlight(boolean flag);
-
-	/**
-	 * Add decorator.  May
-	 * cause the figure to become invalidated
-	 * @param decorator
-	 */
-	public abstract void addDecorator(BaseFigureDecorator decorator);
-
-	/**
-	 * Remove the decorator
-	 */
-	public abstract void removeDecorator();
-
-	/**
-	 * @param position
-	 */
-	public abstract void removeDecorator(int position);
-
-	/**
-	 * @return the list of decoractors
-	 */
-	public abstract List getDecorators();
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IContainerFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IContainerFigure.java
deleted file mode 100644
index 4de2acb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IContainerFigure.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IconFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IconFigure.java
deleted file mode 100644
index 1336edc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/IconFigure.java
+++ /dev/null
@@ -1,415 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.AncestorListener;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.Layer;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.XYLayout;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * And IconFigure consists of a bitmap image with a text label below it.
- * 
- * @author bbrodt
- */
-/*package*/ class IconFigure extends Label implements IBaseFigure {
-	private static int defaultTextPlacement = PositionConstants.SOUTH;
-
-	static Font defaultFont = JFaceResources.getFontRegistry().get(
-			JFaceResources.DEFAULT_FONT);
-
-	static Color defaultForegroundColor = ColorConstants.black;
-
-	private ArrayList decorators;
-
-	private IconLabel iconLabel = null;
-
-	// CR389070: Figures are abbreviating rule figures names and making them
-	// unreadable
-	// New class that implements a separate "floating" label which is NOT
-	// included in bounds calculations for this IconFigure
-	private class IconLabel extends Label {
-		private LabelLocator locator;
-
-		private IconFigure host;
-
-		/**
-		 * @param host
-		 * @param text
-		 */
-		public IconLabel(IconFigure host, String text) {
-			super(text);
-			this.host = host;
-			locator = new LabelLocator(this);
-		}
-
-		/**
-		 * @return the icon figure
-		 */
-		public IconFigure getHost() {
-			return host;
-		}
-
-		public Dimension getPreferredSize(int wHint, int hHing) {
-			return host.getTextBounds().getSize();
-		}
-
-		public void setText(String text) {
-			super.setText(text);
-			if (locator != null)
-				locator.setConstraints();
-		}
-
-		public void invalidate() {
-			if (locator != null)
-				locator.setConstraints();
-			super.invalidate();
-		}
-	}
-
-	// CR389070: Figures are abbreviating rule figures names and making them
-	// unreadable
-	// helper class that relocates the IconLabel whenever ancestor is moved or
-	// added/removed
-	private class LabelLocator implements AncestorListener {
-		IconLabel label;
-
-		/**
-		 * @param label
-		 */
-		public LabelLocator(IconLabel label) {
-			this.label = label;
-			label.getHost().addAncestorListener(this);
-		}
-
-		// CR408950: BP Save problems
-		// fixed icon label refresh problems
-		private Layer getParentLayer() {
-			IFigure fig = label.getHost();
-			while (fig != null) {
-				if (fig instanceof Layer)
-					return (Layer) fig;
-				fig = fig.getParent();
-			}
-			return null;
-		}
-
-		public void ancestorAdded(IFigure ancestor) {
-			Layer layer = getParentLayer();
-			if (layer != null && !layer.getChildren().contains(label)) {
-				layer.add(label);
-				setConstraints();
-			}
-		}
-
-		public void ancestorMoved(IFigure ancestor) {
-			setConstraints();
-		}
-
-		public void ancestorRemoved(IFigure ancestor) {
-			// CR400779: GEM minimizing a complex activity sometimes leaves junk
-			// on the screen
-			if (label.getParent() != null
-					&& label.getParent().getChildren().contains(label))
-				label.getParent().remove(label);
-		}
-
-		/**
-		 * 
-		 */
-		public void setConstraints() {
-			Layer layer = getParentLayer();
-			if (layer != null && layer.getLayoutManager() != null
-					&& layer.getChildren().contains(label)) {
-				Rectangle r = IconFigure.this.getParent().getBounds().getCopy();
-				r.translate(IconFigure.this.getBounds().getLocation());
-				r.translate(IconFigure.this.getTextLocation());
-				r.width = -1;
-				r.height = -1;
-				Rectangle oldr = (Rectangle) layer.getLayoutManager()
-						.getConstraint(label);
-				if (oldr == null || oldr.x != r.x || oldr.y != r.y)
-					layer.setConstraint(label, r);
-			}
-		}
-	}
-
-	/**
-	 * @param name 
-	 * @param icon 
-	 */
-	public IconFigure(String name, Image icon) {
-		super(name, icon);
-		setTextPlacement(defaultTextPlacement);
-		setOpaque(false);
-		setIcon(icon);
-		setIconTextGap(0);
-		setForegroundColor(defaultForegroundColor);
-		// CR396303: DND in RulePanel does not get correct location if viewer is
-		// scrolled
-		setBackgroundColor(ColorConstants.titleGradient);
-		XYLayout layout = new XYLayout();
-		setLayoutManager(layout);
-
-		// CR389070: Figures are abbreviating rule figures names and making them
-		// unreadable
-		iconLabel = new IconLabel(this, name);
-		iconLabel.setFont(getFont());
-	}
-
-	// CR389070: Figures are abbreviating rule figures names and making them
-	// unreadable
-	/**
-	 * @return the label
-	 */
-	public Label getLabel() {
-		return iconLabel;
-	}
-
-	public List getDecorators() {
-		if (decorators == null)
-			decorators = new ArrayList();
-		return decorators;
-	}
-
-	public Font getFont() {
-		if (defaultFont == null)
-        {
-			defaultFont = JFaceResources.getFontRegistry().get(
-					JFaceResources.DEFAULT_FONT);
-        }
-        
-		if (getLocalFont() == null)
-        {
-            // TODO: replaced a deprecated assignment to font
-            // with this, but the behaviour is a little different
-			setFont(defaultFont);
-        }
-        
-		return getLocalFont();
-	}
-
-	public void setFont(Font f) {
-        Font localFont = getLocalFont();
-		if (localFont != f) {
-			iconLabel.setFont(f);
-		}
-        super.setFont(f);
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		iconLabel.setVisible(visible);
-	}
-
-	public void setText(String text) {
-		super.setText(text);
-		// CR389070: Figures are abbreviating rule figures names and making them
-		// unreadable
-		if (iconLabel != null && iconLabel.isVisible()) {
-			iconLabel.setText(text);
-			iconLabel.setFont(getFont());
-			// labelLocator.setConstraints();
-		}
-	}
-
-	public void setToolTipText(String text) {
-		Label toolTipLabel = null;
-
-		if (text != null && text.length() > 0) {
-			toolTipLabel = new Label(text);
-			toolTipLabel.setBorder(new MarginBorder(3));
-		}
-
-		super.setToolTip(toolTipLabel);
-	}
-
-	public String getToolTipText() {
-		if (getToolTip() != null)
-			return ((Label) getToolTip()).getText();
-		return null;
-	}
-
-	public void setHighlight(boolean flag) {
-		if (flag)
-			setOpaque(true);
-		else
-			setOpaque(false);
-	}
-
-	// CR389070: Figures are abbreviating rule figures names and making them
-	// unreadable
-	protected Dimension getSubStringTextSize() {
-		return getTextSize();
-	}
-
-	/*
-	 * CR374981: Long activity labels do not get wrapped or truncated We must
-	 * override this so that the label gets truncated
-	 */
-	public Dimension getPreferredSize(int wHint, int hHint) {
-		if (prefSize == null) {
-			super.getPreferredSize(-1, -1);
-			prefSize.width = getIconBounds().getSize().width;
-			Dimension minSize_ = getMinimumSize(wHint, hHint);
-			if (prefSize.width < minSize_.width)
-				prefSize.width = minSize_.width;
-			if (prefSize.height < minSize_.height)
-				prefSize.height = minSize_.height;
-		}
-		return prefSize;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#getMinimumSize(int, int)
-	 */
-	public Dimension getMinimumSize(int w, int h) {
-		return new Dimension(8, 8);
-	}
-
-	public void addDecorator(BaseFigureDecorator decorator) {
-		removeDecorator(decorator.getPosition());
-		getDecorators().add(decorator);
-		add(decorator);
-		invalidate();
-	}
-
-	public void removeDecorator() {
-		removeDecorator(BaseFigureDecorator.DEFAULT_DECORATOR_POSITION);
-	}
-
-	public void removeDecorator(int position) {
-		Iterator it = getDecorators().iterator();
-		while (it.hasNext()) {
-			BaseFigureDecorator d = (BaseFigureDecorator) it.next();
-			if (d.getPosition() == position) {
-				it.remove();
-				remove(d);
-				invalidate();
-				break;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Label#setTextPlacement(int)
-	 */
-	public void setTextPlacement(int where) {
-		super.setTextPlacement(where);
-		layout();
-		invalidate();
-	}
-
-	public void invalidate() {
-		// CR405873: F111-Error decorator missing
-		// this was moved to paintFigure()
-		// placeDecorators();
-		super.invalidate();
-	}
-
-	private void placeDecorators() {
-		Point o = getLocation();
-		Point p = getIconBounds().getLocation();
-		Dimension size = this.getIconBounds().getSize();
-		Iterator it = getDecorators().iterator();
-		while (it.hasNext()) {
-			int x = p.x - o.x, y = p.y - o.y;
-			BaseFigureDecorator decorator = (BaseFigureDecorator) it.next();
-			Dimension decoratorSize = decorator.getPreferredSize();
-			switch (decorator.getPosition()) {
-			case (PositionConstants.CENTER | PositionConstants.MIDDLE):
-				// CR378889: Case of decoration that should be right in the
-				// middle.
-				// Had to add a fudge factor because it's not exactly where I
-				// want it.
-				int fudge = 4;
-				y += size.height / 2 - decoratorSize.height / 2 + fudge;
-				x += size.width / 2 - decoratorSize.width / 2;
-				break;
-			case PositionConstants.NORTH:
-				x += size.width / 2 - decoratorSize.width / 2;
-				break;
-			case PositionConstants.NORTH_EAST:
-				x += size.width - decoratorSize.width;
-				break;
-			case PositionConstants.EAST:
-				x += size.width - decoratorSize.width;
-				y += size.height / 2 - decoratorSize.height / 2;
-				break;
-			case PositionConstants.SOUTH_EAST:
-				x += size.width - decoratorSize.width;
-				y += size.height - decoratorSize.height;
-				break;
-			case PositionConstants.SOUTH:
-				x += size.width / 2 - decoratorSize.width / 2;
-				y += size.height - decoratorSize.height;
-				break;
-			case PositionConstants.SOUTH_WEST:
-				y += size.height - decoratorSize.height;
-				break;
-			case PositionConstants.WEST:
-				y += size.height / 2 - decoratorSize.height / 2;
-				break;
-			case PositionConstants.NORTH_WEST:
-				break;
-			}
-			getLayoutManager().setConstraint(decorator,
-					new Rectangle(x, y, -1, -1));
-		}
-		layout();
-	}
-
-	// CR389070: Figures are abbreviating rule figures names and making them
-	// unreadable
-	protected void paintFigure(Graphics graphics) {
-		if (isOpaque())
-			super.paintFigure(graphics);
-		// CR405873: F111-Error decorator missing
-		placeDecorators();
-		Rectangle bounds_ = getBounds();
-		graphics.translate(bounds_.x, bounds_.y);
-		if (getIcon() != null)
-			graphics.drawImage(getIcon(), getIconLocation());
-		if (iconLabel == null || !iconLabel.isVisible()) {
-			if (!isEnabled()) {
-				graphics.translate(1, 1);
-				graphics.setForegroundColor(ColorConstants.buttonLightest);
-				graphics.drawText(getSubStringText(), getTextLocation());
-				graphics.translate(-1, -1);
-				graphics.setForegroundColor(ColorConstants.buttonDarker);
-			}
-			graphics.drawText(getSubStringText(), getTextLocation());
-		}
-		graphics.translate(-bounds_.x, -bounds_.y);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/InputPortFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/InputPortFigure.java
deleted file mode 100644
index 66ca25b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/InputPortFigure.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/LinkFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/LinkFigure.java
deleted file mode 100644
index 11e0a80..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/LinkFigure.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.MarginBorder;
-import org.eclipse.draw2d.MidpointLocator;
-import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.PointList;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Bob
- */
-/*package*/ class LinkFigure extends PolylineConnection implements IBaseFigure {
-    private final static Color defaultLineColor = ColorConstants.black;
-
-    private final static int defaultLineWidth = 1;
-
-    private final static boolean defaultLabelVisible = false;
-
-    private final static Color defaultLabelForeground = ColorConstants.black;
-
-    private final static Color defaultLabelBackground = ColorConstants.white;
-
-    private final static Font defaultFont = JFaceResources.getFontRegistry().get(
-            JFaceResources.DEFAULT_FONT);
-
-    private LinkLabel label;
-
-    /**
-     * Default constructor
-     */
-    public LinkFigure() {
-        super();
-        setLineWidth(defaultLineWidth);
-        setForegroundColor(defaultLineColor);
-
-        // BaseFigureDecorator decorator;
-        // decorator = new
-        // BaseFigureDecorator(GEMPlugin.getDefault().getGEMImage("delete.gif"),"target",PositionConstants.WEST);
-        // addDecorator(decorator);
-        // decorator = new
-        // BaseFigureDecorator(GEMPlugin.getDefault().getGEMImage("delete.gif"),"target",PositionConstants.EAST);
-        // addDecorator(decorator);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setToolTipText()
-     */
-    public void setToolTipText(final String text) {
-        Label toolTip_ = null;
-
-        if (text != null && text.length() > 0) {
-            toolTip_ = new Label(text);
-            toolTip_.setBorder(new MarginBorder(3));
-        }
-
-        super.setToolTip(toolTip_);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getToolTipText()
-     */
-    public String getToolTipText() {
-        if (getToolTip() != null)
-        {
-            return ((Label) getToolTip()).getText();
-        }
-        return null;
-    }
-
-    public void setHighlight(final boolean flag) {
-        if (flag) {
-            setForegroundColor(ColorConstants.titleBackground);
-            // setLineWidth(defaultLineWidth * 2);
-        } else {
-            setForegroundColor(defaultLineColor);
-            // setLineWidth(defaultLineWidth);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setText()
-     */
-    public void setText(final String text) {
-        if (text != null && text.length() == 0) {
-            if (label != null) {
-                remove(label);
-                label = null;
-            }
-        } else {
-            getLabel().setText(text);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getText()
-     */
-    public String getText() {
-        if (label == null)
-        {
-            return null;
-        }
-        return label.getText();
-    }
-
-    /*
-     * CR374981: Long activity labels do not get wrapped or truncated This
-     * method was added to the IBaseFigure interface to support direct edit of
-     * figure labels on the canvas.
-     */
-    public Rectangle getTextBounds() {
-        return label.getTextBounds();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setIcon(org.eclipse.swt.graphics.Image)
-     */
-    public void setIcon(final Image image) {
-        getLabel().setIcon(image);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getIcon()
-     */
-    public Image getIcon() {
-        return getLabel().getIcon();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#addDecorator(com.sybase.stf.gem.diagram.editor.figures.BaseFigureDecorator)
-     */
-    public void addDecorator(final BaseFigureDecorator decorator) {
-        final int pos = decorator.getPosition();
-        if (pos == BaseFigureDecorator.DEFAULT_DECORATOR_POSITION
-                || pos == PositionConstants.WEST
-                || pos == PositionConstants.LEFT) {
-            setTargetDecoration(decorator);
-        } else if (pos == PositionConstants.EAST
-                || pos == PositionConstants.RIGHT) {
-            setSourceDecoration(decorator);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator()
-     */
-    public void removeDecorator() {
-        removeDecorator(BaseFigureDecorator.DEFAULT_DECORATOR_POSITION);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator(int)
-     */
-    public void removeDecorator(final int position) {
-        if (position == BaseFigureDecorator.DEFAULT_DECORATOR_POSITION)
-        {
-            setTargetDecoration(null);
-        }
-        else
-        {
-            setSourceDecoration(null);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getDecorators()
-     */
-    public List getDecorators() {
-        final List list = new ArrayList(2);
-        Object d;
-        d = getSourceDecoration();
-        if (d != null)
-        {
-            list.add(d);
-        }
-        d = getTargetDecoration();
-        if (d != null)
-        {
-            list.add(d);
-        }
-        return list;
-    }
-
-    private LinkLabel getLabel() {
-        if (label == null) {
-            label = new LinkLabel();
-            add(label, new MidpointLocator(this, 0));
-        }
-        return label;
-    }
-
-    @Override
-    public void setFont(final Font f) {
-        getLabel().setFont(f);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.draw2d.Shape#setLineWidth(int)
-     */
-    @Override
-    public void setLineWidth(final int w) {
-        getLabel().setBorderWidth(w);
-        super.setLineWidth(w);
-    }
-
-    @Override
-    public void setForegroundColor(final Color c) {
-        getLabel().setBorderColor(c);
-        super.setForegroundColor(c);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.draw2d.Polyline#setPoints(org.eclipse.draw2d.geometry.PointList)
-     */
-    @Override
-    public void setPoints(final PointList points) {
-        super.setPoints(points);
-        if (label != null) {
-            int i = getPoints().size() / 2 - 1;
-            if (i < 0)
-            {
-                i = 0;
-            }
-            if (getLayoutManager() != null)
-            {
-                getLayoutManager().setConstraint(label,
-                        new MidpointLocator(this, i));
-            }
-        }
-    }
-
-    @Override
-    public Rectangle getBounds() {
-        if (bounds == null) {
-            if (bounds == null) {
-                bounds = getPoints().getBounds().getExpanded(lineWidth / 2,
-                        lineWidth / 2);
-            }
-            // CR382243: Clicking on the node icon selects the connection line
-            // rather than the node
-            // NOTE: expanding the bounds to include children (in this case,
-            // the Link labels) causes problems when the connection line becomes
-            // short (i.e., when the 2 anchor figures at each end of the
-            // connection are
-            // close together) because the bounds of this link figure will be
-            // greater
-            // than the actual length of the line. This causes the link figure
-            // to
-            // be hit-tested beyond its visual size.
-            if (getLabel().isVisible()) {
-                for (int i = 0; i < getChildren().size(); i++) {
-                    final IFigure child = (IFigure) getChildren().get(i);
-                    bounds.union(child.getBounds());
-                }
-            }
-        }
-        return bounds;
-    }
-
-    /*
-     * Helper class for line labels.
-     */
-    private static class LinkLabel extends Label {
-        LinkLabel() {
-            setBorder(new LineBorder());
-            setOpaque(true);
-            setForegroundColor(defaultLabelForeground);
-            setBackgroundColor(defaultLabelBackground);
-            setFont(defaultFont);
-            final LineBorder border_ = new LineBorder(defaultLineWidth);
-            setBorder(border_);
-            border_.setColor(defaultLineColor);
-            setVisible(defaultLabelVisible);
-        }
-
-        void setBorderWidth(final int w) {
-            ((LineBorder) getBorder()).setWidth(w);
-        }
-
-        void setBorderColor(final Color c) {
-            ((LineBorder) getBorder()).setColor(c);
-        }
-
-        @Override
-        protected boolean useLocalCoordinates() {
-            return false;
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ObserveVisibleXYLayout.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ObserveVisibleXYLayout.java
deleted file mode 100644
index bee006f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/ObserveVisibleXYLayout.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.Iterator;
-import java.util.ListIterator;
-
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * @author Bob Brodt
- * 
- * This is an XY layout that actually observes visiblity of children figures
- * when doint its layout.
- * 
- * Apparently there is a bug in the GEF XYLayout class because it does not
- * observe visibility.
- * 
- * @see org.eclipse.draw2d.AbstractLayout#isObservingVisibility()
- */
-/*package*/ class ObserveVisibleXYLayout extends FreeformLayout {
-	protected Dimension calculatePreferredSize(IFigure f, int wHint, int hHint) {
-		Rectangle rect = new Rectangle();
-		ListIterator children = f.getChildren().listIterator();
-		while (children.hasNext()) {
-			IFigure child = (IFigure) children.next();
-			// bug fix
-			if (isObservingVisibility() && !child.isVisible())
-				continue;
-			Rectangle r = (Rectangle) constraints.get(child);
-			if (r == null)
-				continue;
-
-			if (r.width == -1 || r.height == -1) {
-				Dimension preferredSize_ = child.getPreferredSize(r.width,
-						r.height);
-				r = r.getCopy();
-				if (r.width == -1)
-					r.width = preferredSize_.width;
-				if (r.height == -1)
-					r.height = preferredSize_.height;
-			}
-			rect.union(r);
-		}
-		Dimension d = rect.getSize();
-		Insets insets = f.getInsets();
-		return new Dimension(d.width + insets.getWidth(), d.height
-				+ insets.getHeight()).union(getBorderPreferredSize(f));
-	}
-
-	public void layout(IFigure parent) {
-		Iterator children = parent.getChildren().iterator();
-		Point offset = getOrigin(parent);
-		IFigure f;
-		while (children.hasNext()) {
-			f = (IFigure) children.next();
-			// bug fix
-			if (isObservingVisibility() && !f.isVisible())
-				continue;
-			Rectangle bounds = (Rectangle) getConstraint(f);
-			if (bounds == null)
-				continue;
-
-			if (bounds.width == -1 || bounds.height == -1) {
-				Dimension preferredSize_ = f.getPreferredSize(bounds.width,
-						bounds.height);
-				bounds = bounds.getCopy();
-				if (bounds.width == -1)
-					bounds.width = preferredSize_.width;
-				if (bounds.height == -1)
-					bounds.height = preferredSize_.height;
-			}
-			bounds = bounds.getTranslated(offset);
-			f.setBounds(bounds);
-		}
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/OutputPortFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/OutputPortFigure.java
deleted file mode 100644
index 49d9201..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/OutputPortFigure.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortConnectionAnchor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortConnectionAnchor.java
deleted file mode 100644
index f81c507..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortConnectionAnchor.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortFigure.java
deleted file mode 100644
index f992902..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PortFigure.java
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.java
deleted file mode 100644
index e9220c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * The NLS message manager for PreferenceMessages
- * 
- */
-/*package*/ final class PreferenceMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.preference.PreferenceMessages"; //$NON-NLS-1$
-
-	private PreferenceMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, PreferenceMessages.class);
-	}
-
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String CanvasPreferenceTab_LABEL_UseSystemColors;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_BackgroundColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_Canvas;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_GridHeight;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_GridLineColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_GridWidth;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_IconLabelFont;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_IconGroup;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_InputPortColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_OutputPortColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineGroup;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_ShowLineLabels;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineLabelColor;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineLabelFont;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineRouting;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LineWidth;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_SnapToGeometry;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_SnapToGrid;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_UndoStackSize;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Direct;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Manhattan;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Manual;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_LabelPlacement;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Top;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Bottom;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Left;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Right;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferenceTab_LABEL_IconSize;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Small;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Medium;
-
-    /**
-     * see PreferenceMessages.properties
-     */
-	public static String CanvasPreferences_LABEL_Large;
-
-    /**
-     * label property for check box that selects whether or not
-     * the introduction section editor should be loaded.
-     */
-    public static String EditorPreferences_LABEL_ShowIntroEditor;
-
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String GEMPreferences_description;
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String CompoundNodeFigure_MaximizeLabel;
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String CompoundNodeFigure_MinimizeLabel;
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String CompoundNodeFigure_RestoreLabel;
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String WindowFigure_NoTitleText;
-	/**
-	 * see PreferenceMessages.properties
-	 */
-	public static String WindowFigure_Title;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.properties
deleted file mode 100644
index 5a91a37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PreferenceMessages.properties
+++ /dev/null
@@ -1,54 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-#
-# Appearance preference labels
-#
-CanvasPreferenceTab_LABEL_UseSystemColors=Use System colors
-EditorPreferences_LABEL_ShowIntroEditor=Show Introduction Tab (open editors must be reloaded to take effect)
-CanvasPreferenceTab_LABEL_BackgroundColor=Background color:
-CanvasPreferenceTab_LABEL_Canvas=Canvas
-CanvasPreferenceTab_LABEL_GridHeight=Grid height:
-CanvasPreferenceTab_LABEL_GridLineColor=Grid color:
-CanvasPreferenceTab_LABEL_GridWidth=Grid width:
-CanvasPreferenceTab_LABEL_IconLabelFont=Label font:
-CanvasPreferenceTab_LABEL_IconGroup=Icons
-CanvasPreferenceTab_LABEL_InputPortColor=Input Port color:
-CanvasPreferenceTab_LABEL_OutputPortColor=Output Port color:
-CanvasPreferenceTab_LABEL_LineGroup=Connection Lines
-CanvasPreferenceTab_LABEL_LineColor=Line color:
-CanvasPreferenceTab_LABEL_ShowLineLabels=Show labels
-CanvasPreferenceTab_LABEL_LineLabelColor=Label color:
-CanvasPreferenceTab_LABEL_LineLabelFont=Label font:
-CanvasPreferenceTab_LABEL_LineRouting=Line Routing:
-CanvasPreferenceTab_LABEL_LineWidth=Line width:
-CanvasPreferenceTab_LABEL_SnapToGeometry=Snap to geometry
-CanvasPreferenceTab_LABEL_SnapToGrid=Snap to grid
-CanvasPreferenceTab_LABEL_UndoStackSize="Undo\" stack size:
-CanvasPreferences_LABEL_Direct=Direct
-CanvasPreferences_LABEL_Manhattan=Manhattan
-CanvasPreferences_LABEL_Manual=Manual
-CanvasPreferenceTab_LABEL_LabelPlacement=Label Placement:
-CanvasPreferences_LABEL_Top=Top
-CanvasPreferences_LABEL_Bottom=Bottom
-CanvasPreferences_LABEL_Left=Left
-CanvasPreferences_LABEL_Right=Right
-CanvasPreferenceTab_LABEL_IconSize=Icon Size:
-CanvasPreferences_LABEL_Small=Small
-CanvasPreferences_LABEL_Medium=Medium
-CanvasPreferences_LABEL_Large=Large
-GEMPreferences_description=Preferences for the graphical page of FacesConfig editor.
-
-#################################################
-CompoundNodeFigure_MaximizeLabel=Maximize
-CompoundNodeFigure_MinimizeLabel=Minimize
-CompoundNodeFigure_RestoreLabel=Restore
-WindowFigure_NoTitleText=??
-WindowFigure_Title=Window
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PrintedPageLayer.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PrintedPageLayer.java
deleted file mode 100644
index 566958f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/PrintedPageLayer.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayeredPane;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.LayerConstants;
-
-/**
- * This is a printable layer that draws page outline tiles enclosing all of the
- * printable child figures. The page outlines represent complete pages as they
- * would appear if they were printed on dead trees, thus the pageSize set on
- * this layer should be the currently selected printer's page resolution.
- * 
- * The reason this needs to be added to the printable layers is so that it will
- * show up in the content outline viewer.
- */
-/*package*/ class PrintedPageLayer extends FreeformLayer {
-	// our layer name
-	static final String PRINTED_PAGE_LAYER = "Printed Page"; //$NON-NLS-1$
-
-	// the size of the page tiles (this should be the printer's resolution)
-	private Dimension pageSize = new Dimension(850, 1100);
-
-	// the WindowFigure that owns this layer
-	private final WindowFigure host;
-
-	// flag to lock out multiple calls to setFreeformBounds() when adding
-	// and removing PrintedPageFigures.
-	private boolean busy;
-
-	// A simple page outline figure. We can get fancy later with turned-up
-	// dogears, page numbers, titles and whatnot...
-	static class PrintedPageFigure extends RectangleFigure {
-		PrintedPageFigure() {
-			super();
-			setFill(false);
-			setOutline(true);
-			setLineWidth(1);
-		}
-	}
-
-	/**
-	 * @param figure
-	 */
-	public PrintedPageLayer(WindowFigure figure) {
-		super();
-		this.host = figure;
-	}
-
-	/**
-	 * @param x
-	 * @param y
-	 * @return the print page figure
-	 */
-	protected PrintedPageFigure createPage(int x, int y) {
-		PrintedPageFigure page = new PrintedPageFigure();
-		page.setBounds(new Rectangle(x, y, pageSize.width, pageSize.height));
-		return page;
-	}
-
-	/**
-	 * Sets the page width and height. This should be the currently selected
-	 * printer's page size.
-	 * 
-	 * @param d
-	 */
-	public void setPageSize(Dimension d) {
-		pageSize = d.getCopy();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.FreeformFigure#setFreeformBounds(Rectangle)
-	 */
-	public void setFreeformBounds(Rectangle bounds) {
-		if (!busy && getParent() instanceof FreeformLayeredPane
-				&& pageSize.width > 0 && pageSize.height > 0) {
-			busy = true;
-
-			// build the new printing layer extent by looking at only the
-			// contents of the Primary, Connection and Feedback layers
-			Rectangle b;
-			FreeformLayer layer;
-			layer = (FreeformLayer) host.getLayer(LayerConstants.PRIMARY_LAYER);
-			b = layer.getFreeformExtent().getCopy();
-			layer = (FreeformLayer) host
-					.getLayer(LayerConstants.CONNECTION_LAYER);
-			b = b.union(layer.getFreeformExtent());
-			layer = (FreeformLayer) host
-					.getLayer(LayerConstants.FEEDBACK_LAYER);
-			b = b.union(layer.getFreeformExtent());
-
-			// calculate x and y for the page tiles
-			int x = 0, y = 0;
-			if (b.x < 0) {
-				while (x > b.x)
-					x -= pageSize.width;
-			} else {
-				while (x + pageSize.width < b.x)
-					x += pageSize.width;
-			}
-			if (b.y < 0) {
-				while (y > b.y)
-					y -= pageSize.height;
-			} else {
-				while (y + pageSize.height < b.y)
-					y += pageSize.height;
-			}
-
-			// get list of pagefigures that intersect the new extent
-			// and a list of those that don't
-			List keepers = new ArrayList();
-			List trash = new ArrayList();
-			Iterator iter = getChildren().iterator();
-			while (iter.hasNext()) {
-				Figure child = (Figure) iter.next();
-				if (child.getBounds().intersects(b))
-					keepers.add(child);
-				else
-					trash.add(child);
-			}
-
-			// calculate width and height
-			int w = 0, h = 0;
-			while (x + w < b.x + b.width)
-				w += pageSize.width;
-			while (y + h < b.y + b.height)
-				h += pageSize.height;
-
-			// determine the required pagefigures
-			for (int xi = x; xi < x + w; xi += pageSize.width) {
-				for (int yi = y; yi < y + h; yi += pageSize.height) {
-					boolean found = false;
-					iter = keepers.iterator();
-					while (iter.hasNext()) {
-						Figure child = (Figure) iter.next();
-						Point p = child.getBounds().getLocation();
-						if (p.x == xi && p.y == yi) {
-							found = true;
-							break;
-						}
-					}
-					if (!found) {
-						// add the new page
-						add(createPage(xi, yi));
-					}
-				}
-			}
-
-			// remove all the old pages
-			iter = trash.iterator();
-			while (iter.hasNext())
-				remove((Figure) iter.next());
-
-			busy = false;
-		}
-		super.setFreeformBounds(bounds);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/RectangleList.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/RectangleList.java
deleted file mode 100644
index 03aadbb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/RectangleList.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * A List<Rectangle> implementation with a coordinate-based
- * convenience method for adding rectangles.
- *
- */
-class RectangleList extends ArrayList<Rectangle>
-{
-	private static final long serialVersionUID = -4088355285820327890L;
-
-	/**
-	 * Default constructor
-	 */
-	public RectangleList() {
-		super();
-	}
-
-	/**
-	 * @param x1
-	 * @param y1
-	 * @param x2
-	 * @param y2
-	 */
-	public void addRectangle(int x1, int y1, int x2, int y2) {
-		add(new Rectangle(x1, y1, x2 - x1, y2 - y1));
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedTitleBarBorder.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedTitleBarBorder.java
deleted file mode 100644
index 60cd979..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedTitleBarBorder.java
+++ /dev/null
@@ -1,591 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.MouseEvent;
-import org.eclipse.draw2d.MouseListener;
-import org.eclipse.draw2d.SchemeBorder;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A border for the tabbed title bar
- *
- */
-/*package*/ class TabbedTitleBarBorder extends SchemeBorder {
-	// private int state = CompoundFigureListener.RESTORED;
-
-	private IFigure parent;
-
-	private ListenerList listenerList;
-
-	private List tabList;
-
-	private int currentTab;
-
-	private Font font;
-
-	private boolean visible = true;
-
-	// from TitleBarBorder:
-	private Color textColor = ColorConstants.black;
-
-	private Color bgColor = ColorConstants.menuBackground;
-
-	private Insets insets;
-
-	private Insets padding = new Insets(2, 2, 2, 2);
-
-	/**
-	 * Constructs a TitleBarBorder with its label set to the name of this class.
-	 * @param parent 
-	 * 
-	 * @since 2.0
-	 */
-	public TabbedTitleBarBorder(final IFigure parent) {
-		super(SCHEMES.LOWERED);
-
-		this.parent = parent;
-
-		parent.addMouseListener(new MouseListener() {
-			public void mousePressed(MouseEvent me) {
-				Insets padding_ = getPadding();
-				Point mp = me.getLocation();
-				mp.x -= padding_.left;
-				mp.y -= padding_.top + 3; // 3==width of the outer border
-				Point pp = parent.getBounds().getLocation();
-				Rectangle tr = new Rectangle(pp.x, pp.y, 0, 0);
-				//int activeIndex = -1;
-
-				for (int i = 0; i < getTabList().size(); ++i) {
-					Tab t = (Tab) tabList.get(i);
-					Dimension d = t.getTextExtents();
-					d.height += padding_.top + padding_.bottom;
-					d.width += padding_.left;
-					tr.setSize(d);
-					if (tr.contains(mp)) {
-						setCurrentTab(i);
-						return;
-					}
-					tr.x += d.width;
-				}
-			}
-
-			public void mouseReleased(MouseEvent me) {
-                // do nothing: not handling release
-			}
-
-			public void mouseDoubleClicked(MouseEvent me) {
-                // do nothing: not handling release
-			}
-		});
-	}
-
-	/**
-	 * @return the tab list
-	 */
-	protected List getTabList() {
-		if (tabList == null)
-			tabList = new ArrayList();
-		return tabList;
-	}
-
-	/**
-	 * Add a new tab with the text
-	 * @param text
-	 * @return the previous number of tabs
-	 */
-	public int addTab(String text) {
-		getTabList().add(new Tab(text));
-		return getTabList().size() - 1;
-	}
-
-	/**
-	 * @param index
-	 */
-	public void removeTab(int index) {
-		if (index >= 0 && index < getTabList().size()) {
-			tabList.remove(index);
-			if (index >= tabList.size())
-				index = tabList.size() - 1;
-			setCurrentTab(index);
-		}
-	}
-
-	/**
-	 * @param newIndex
-	 */
-	public void setCurrentTab(int newIndex) {
-		if (newIndex >= 0 && newIndex < getTabList().size()) {
-			Tab newTab = (Tab) tabList.get(newIndex);
-			int oldIndex = -1;
-			for (int i = 0; i < tabList.size(); ++i) {
-				Tab t = (Tab) tabList.get(i);
-				if (t.isActive()) {
-					oldIndex = i;
-					t.setActive(false);
-					break;
-				}
-			}
-			newTab.setActive(true);
-			if (parent != null) {
-				parent.invalidate();
-				parent.repaint();
-			}
-			currentTab = newIndex;
-			fireTabChanged(oldIndex, newIndex);
-		}
-	}
-
-	/**
-	 * @return the index of the current tab
-	 */
-	public int getCurrentTab() {
-		return currentTab;
-	}
-
-	/**
-	 * @param index
-	 * @return the contents object of the tab at index
-	 * or null if  index is out of range
-	 */
-	public Object getContents(int index) {
-		if (index >= 0 && index < getTabList().size())
-			return ((Tab) tabList.get(index)).getContents();
-		return null;
-	}
-
-	/**
-	 * @param index
-	 * @param contents
-	 */
-	public void setContents(int index, Object contents) {
-		if (index >= 0 && index < getTabList().size())
-			((Tab) tabList.get(index)).setContents(contents);
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void addTabbedWindowListener(WindowFigureListener listener) {
-		if (listenerList == null)
-			listenerList = new ListenerList(ListenerList.IDENTITY);
-		listenerList.add(listener);
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void removeTabbedWindowListener(WindowFigureListener listener) {
-		if (listenerList != null)
-			listenerList.remove(listener);
-	}
-
-	/**
-	 * @return the listeners
-	 */
-	public Object[] getListeners() {
-		return listenerList.getListeners();
-	}
-
-	/**
-	 * @param oldIndex
-	 * @param newIndex
-	 */
-	protected void fireTabChanged(int oldIndex, int newIndex) {
-		Object l[] = listenerList.getListeners();
-		for (int i = 0; i < l.length; ++i) {
-			if (l[i] instanceof WindowFigureListener)
-				((WindowFigureListener) l[i]).tabChanged(oldIndex, newIndex);
-		}
-	}
-
-	/**
-	 * @return Returns the font.
-	 */
-	public Font getFont() {
-		if (font == null) {
-			font = parent.getFont();
-			if (font == null)
-				font = JFaceResources.getFontRegistry().get(
-						JFaceResources.DEFAULT_FONT);
-		}
-		return font;
-	}
-
-	/**
-	 * @param font
-	 *            The font to set.
-	 */
-	public void setFont(Font font) {
-		this.font = font;
-		invalidate();
-	}
-
-	/**
-	 * @return Returns the insets.
-	 */
-	public Insets getInsets() {
-		return insets;
-	}
-
-	/**
-	 * @param c
-	 */
-	public void setTextColor(Color c) {
-		textColor = c;
-	}
-
-	/**
-	 * @return the text color
-	 */
-	public Color getTextColor() {
-		return textColor;
-	}
-
-	/**
-	 * @param c
-	 */
-	public void setBackgroundColor(Color c) {
-		bgColor = c;
-	}
-
-	/**
-	 * @return the background color
-	 */
-	public Color getBackgroundColor() {
-		return bgColor;
-	}
-
-	/**
-	 * @param p
-	 */
-	public void setPadding(Insets p) {
-		padding = p;
-		invalidate();
-	}
-
-	/**
-	 * @return the padding insets
-	 */
-	public Insets getPadding() {
-		return padding;
-	}
-
-	/**
-	 * @param text
-	 */
-	public void setLabel(String text) {
-		setLabel(currentTab, text);
-	}
-
-	/**
-	 * @param index
-	 * @param text
-	 */
-	public void setLabel(int index, String text) {
-		if (index >= 0 && index < getTabList().size())
-			((Tab) tabList.get(index)).setLabel(text);
-	}
-
-	/**
-	 * @return the label
-	 */
-	public String getLabel() {
-		return getLabel(currentTab);
-	}
-
-	/**
-	 * @param index
-	 * @return the label
-	 */
-	public String getLabel(int index) {
-		if (index >= 0 && index < getTabList().size())
-			return ((Tab) tabList.get(index)).getLabel();
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * @return the parent figureb
-	 */
-	public IFigure getParent() {
-		return parent;
-	}
-
-	/**
-	 * validate each of the tabs
-	 */
-	public void invalidate() {
-		insets = null;
-		for (int i = 0; i < getTabList().size(); ++i) {
-			Tab t = (Tab) tabList.get(i);
-			t.invalidate();
-		}
-	}
-
-	/**
-	 * @param f
-	 * @return the text extends
-	 */
-	public Dimension getTextExtents(IFigure f) {
-		Dimension d = new Dimension(0, 0);
-		for (int i = 0; i < getTabList().size(); ++i) {
-			Tab t = (Tab) tabList.get(i);
-			if (d.height == 0)
-				d = t.getTextExtents();
-			else
-				d.width += t.getTextExtents().width;
-		}
-		return d;
-	}
-
-	/**
-	 * Sets the min/max buttons visible
-	 * 
-	 * @param flag -
-	 *            if true, buttons are made visible.
-	 */
-	public void setVisible(boolean flag) {
-		visible = flag;
-	}
-
-	/**
-	 * Calculates and returns the Insets for this border.
-	 * 
-	 * @param figure
-	 *            the figure on which Insets calculations are based
-	 * @return the calculated Insets
-	 * @since 2.0
-	 */
-	protected Insets calculateInsets(IFigure figure) {
-		insets = new Insets(super.getInsets(figure));
-		insets.top = getTextExtents(figure).height;
-		return insets;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Border#getInsets(org.eclipse.draw2d.IFigure)
-	 */
-	public Insets getInsets(IFigure figure) {
-		if (insets == null)
-			calculateInsets(figure);
-		return insets;
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets)
-	 */
-	public void paint(IFigure figure, Graphics g, Insets in) {
-		if (!visible)
-			return;
-
-		Insets is = new Insets(in);
-		getInsets(figure);
-		is.top += insets.top;
-		super.paint(figure, g, is);
-		// Insets insets = getInsets(pane);
-		// Insets padding = getPadding();
-		// Insets in = new Insets(figureInsets);
-		// in.top += insets.top;
-		// super.paint(pane, g, in);
-
-		tempRect.setBounds(getPaintRectangle(figure, in));
-		Rectangle r = tempRect;
-		r.height = Math.min(r.height, getTextExtents(figure).height);
-
-		g.clipRect(r);
-		g.setBackgroundColor(getBackgroundColor());
-		g.fillRectangle(r);
-		int x = r.x;
-		int y = r.y;
-
-		Iterator iter = getTabList().iterator();
-		while (iter.hasNext()) {
-			Tab t = (Tab) iter.next();
-			t.paint(g, figure, x, y);
-			x += t.getTextExtents().width;
-		}
-
-		g.setBackgroundColor(getBackgroundColor());
-	}
-
-	/**
-	 * @param wHint
-	 * @param hHint
-	 * @return the minimum size
-	 */
-	public Dimension getMinimumSize(int wHint, int hHint) {
-		Dimension d = getTextExtents(parent);
-		getInsets(parent);
-		d.expand(insets.left + insets.right, insets.top + insets.bottom);
-		// add enough width for the min/max buttons
-		// d.width += minButton.getSize().width + maxButton.getSize().width;
-		return d;
-	}
-
-	private class Tab {
-		private String label = ""; //$NON-NLS-1$
-
-		private Object contents = null;
-
-		private Dimension textExtents;
-
-		private boolean active;
-
-		/**
-		 * @param text
-		 */
-		public Tab(String text) {
-			this.label = text;
-		}
-
-		/**
-		 * @param contents
-		 */
-		public void setContents(Object contents) {
-			this.contents = contents;
-		}
-
-		/**
-		 * @return the contents
-		 */
-		public Object getContents() {
-			return contents;
-		}
-
-		/**
-		 * @param active
-		 */
-		public void setActive(boolean active) {
-			this.active = active;
-		}
-
-		/**
-		 * @return the active state
-		 */
-		public boolean isActive() {
-			return active;
-		}
-
-		/**
-		 * @return the label
-		 */
-		public String getLabel() {
-			return label;
-		}
-
-		/**
-		 * @param text
-		 */
-		public void setLabel(String text) {
-			if (text == null)
-				this.label = ""; //$NON-NLS-1$
-			else
-				this.label = text;
-			textExtents = null;
-		}
-
-		/**
-		 * @return the text extents
-		 */
-		public Dimension calculateTextExtents() {
-			textExtents = FigureUtilities.getTextExtents(label == null ? "W" //$NON-NLS-1$
-					: label, getFont());
-			textExtents.width += getPadding().getWidth();
-			textExtents.height += getPadding().getHeight();
-			return textExtents;
-		}
-
-		/**
-		 * @return the text extents.  A copy is returned based on what
-		 * is cached internall by calculateTextExtents
-		 */
-		public Dimension getTextExtents() {
-			if (textExtents == null)
-				calculateTextExtents();
-			return textExtents.getCopy();
-		}
-
-		/**
-		 * 
-		 */
-		public void invalidate() {
-			textExtents = null;
-		}
-
-		/**
-		 * @param g
-		 * @param f
-		 * @param x
-		 * @param y
-		 */
-		public void paint(Graphics g, IFigure f, int x, int y) {
-			if (contents instanceof Composite) {
-				return;
-			}
-			IFigure pane = (IFigure) contents;
-			getTextExtents();
-
-			Insets p = getPadding();
-			int w = textExtents.width;
-			int h = textExtents.height;
-			int radius = Math.max(p.getWidth(), p.getHeight()) + 2;
-
-			// CR408950: BP Save problems
-			// fixed icon label refresh problems
-			if (getTabList().size() > 1) {
-				// only draw tabList if there are more than 1
-				if (active)
-					g.setBackgroundColor(pane == null ? ColorConstants.white
-							: pane.getBackgroundColor());
-				else
-					g.setBackgroundColor(getBackgroundColor());
-
-				--w;
-				g.setForegroundColor(active ? ColorConstants.buttonDarkest
-						: ColorConstants.buttonDarker);
-				// g.setForegroundColor(ColorConstants.red);
-				g.drawRectangle(x, y + h / 2, w, h);
-				// g.setBackgroundColor(ColorConstants.green);
-				g.fillRoundRectangle(new Rectangle(x, y, w, h), radius, radius);
-				// g.setForegroundColor(ColorConstants.blue);
-				g.drawRoundRectangle(new Rectangle(x, y, w, h), radius, radius);
-				// g.setBackgroundColor(ColorConstants.yellow);
-				g.fillRectangle(x + 1, y + h / 2, w - 1, h);
-			} else
-				g.setBackgroundColor(getBackgroundColor());
-
-			g.setFont(getFont());
-			g.setForegroundColor(getTextColor());
-			if (label != null)
-				g.drawString(label, x + padding.left + 1, y + padding.top);
-		}
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedWindowBorder.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedWindowBorder.java
deleted file mode 100644
index 6d41870..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TabbedWindowBorder.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.FrameBorder;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.SchemeBorder;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A frame border for a tabbed window
- * 
- */
-/* package */final class TabbedWindowBorder extends FrameBorder
-{
-    private boolean isVisible = true;
-
-    // CR392586: resource leaks
-    private static MySchemeBorder normalBorder = new MySchemeBorder(
-            new MySchemeBorder.MyScheme(new Color[]
-                                                  { ColorConstants.button, ColorConstants.buttonLightest,
-                    ColorConstants.button }, new Color[]
-                                                       { ColorConstants.buttonDarkest, ColorConstants.buttonDarker,
-                    ColorConstants.button }));
-
-    // CR392586: resource leaks
-    private static MySchemeBorder highlightBorder = new MySchemeBorder(
-            new MySchemeBorder.MyScheme(new Color[]
-                                                  { FigureUtilities.lighter(ColorConstants.titleBackground),
-                    ColorConstants.titleBackground,
-                    FigureUtilities.darker(ColorConstants.titleBackground) },
-                    new Color[]
-                              {
-                    FigureUtilities
-                    .darker(ColorConstants.titleGradient),
-                    ColorConstants.titleGradient,
-                    FigureUtilities
-                    .lighter(ColorConstants.titleGradient) }));
-
-    /**
-     * A border scheme
-     * 
-     */
-    private static class MySchemeBorder extends SchemeBorder
-    {
-        private static class MyScheme extends SchemeBorder.Scheme
-        {
-            /**
-             * @param highlight
-             * @param shadow
-             */
-            public MyScheme(final Color[] highlight, final Color[] shadow)
-            {
-                super(highlight, shadow);
-            }
-
-            @Override
-            public Color[] getHighlight()
-            {
-                return super.getHighlight();
-            }
-
-            @Override
-            public Color[] getShadow()
-            {
-                return super.getHighlight();
-            }
-        }
-
-        MySchemeBorder(final MyScheme scheme)
-        {
-            super(scheme);
-        }
-
-        /**
-         * @return the scheme
-         */
-        public MyScheme getMyScheme()
-        {
-            return (MyScheme) super.getScheme();
-        }
-
-        /**
-         * @see org.eclipse.draw2d.Border#paint(IFigure, Graphics, Insets)
-         * @param comp
-         * @param gc
-         * @param insets
-         */
-        public void paint(final Composite comp, final GC gc, final Insets insets)
-        {
-            final Color[] tl = getMyScheme().getHighlight();
-            final Color[] br = getMyScheme().getShadow();
-            paint(comp, gc, insets, tl, br);
-        }
-
-        /**
-         * Paints the border using the information in the set Scheme and the
-         * inputs given. Side widths are determined by the number of colors in
-         * the Scheme for each side.
-         * 
-         * @param comp
-         *            the composit whose rect should be used for the inset
-         *            bounds
-         * @param gc
-         *            the graphics object
-         * @param insets
-         *            the insets
-         * @param tl
-         *            the highlight (top/left) colors
-         * @param br
-         *            the shadow (bottom/right) colors
-         */
-        protected void paint(final Composite comp, final GC gc, final Insets insets, final Color[] tl,
-                final Color[] br)
-        {
-            final org.eclipse.swt.graphics.Rectangle rect = comp.getBounds();
-
-            gc.setLineWidth(1);
-            gc.setLineStyle(SWT.LINE_SOLID);
-
-            final int top = rect.y - insets.top;
-            final int left = rect.x - insets.left;
-            int bottom = rect.y + rect.height + insets.bottom;
-            int right = rect.x + rect.width + insets.right;
-            gc.setClipping(new org.eclipse.swt.graphics.Rectangle(left, top,
-                    right - left, bottom - top));
-
-            final Color color = ColorConstants.red;
-            gc.setForeground(color);
-            gc.drawLine(left, top, right, bottom);
-
-            for (int i = 0; i < br.length; i++)
-            {
-                // color = br[i];
-                gc.setForeground(color);
-                gc.drawLine(right - i, bottom - i, right - i, top + i);
-                gc.drawLine(right - i, bottom - i, left + i, bottom - i);
-            }
-
-            right--;
-            bottom--;
-
-            for (int i = 0; i < tl.length; i++)
-            {
-                // color = tl[i];
-                gc.setForeground(color);
-                gc.drawLine(left + i, top + i, right - i, top + i);
-                gc.drawLine(left + i, top + i, left + i, bottom - i);
-            }
-            color.dispose();
-        }
-    }
-
-    /**
-     * @param parent
-     */
-    public TabbedWindowBorder(final IFigure parent)
-    {
-        // apparently paint() gets called before createBorders() has had
-        // a chance to create the borders, so we just create them here
-        inner = new TabbedTitleBarBorder(parent);
-        outer = normalBorder;
-    }
-
-    /**
-     * @param flag
-     */
-    public void setVisible(final boolean flag)
-    {
-        if (isVisible != flag)
-        {
-            isVisible = flag;
-            ((TabbedTitleBarBorder) inner).setVisible(flag);
-            if (flag)
-            {
-                ((TabbedTitleBarBorder) inner).getParent().repaint();
-            }
-        }
-    }
-
-    /**
-     * @param flag
-     */
-    public void setHighlight(final boolean flag)
-    {
-        if (flag)
-        {
-            outer = highlightBorder;
-        }
-        else
-        {
-            outer = normalBorder;
-        }
-        ((TabbedTitleBarBorder) inner).getParent().repaint();
-    }
-
-    @Override
-    protected void createBorders()
-    {
-        // TODO: NOTE: this is overriding default border creation
-    }
-
-    @Override
-    public void paint(final IFigure figure, final Graphics g, final Insets insets)
-    {
-        if (isVisible)
-        {
-            if (comp != null)
-            {
-                final GC gc = new GC(comp);
-                paint(comp, gc, insets);
-                gc.dispose();
-            }
-            else
-            {
-                super.paint(figure, g, insets);
-            }
-        }
-    }
-
-    private Composite comp;
-
-    /**
-     * @param comp_
-     * @param gc
-     * @param insets
-     */
-    public void paint(final Composite comp_, final GC gc, final Insets insets)
-    {
-        this.comp = comp_;
-        if (isVisible)
-        {
-            ((MySchemeBorder) outer).paint(comp_, gc, insets);
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TitleBarButton.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TitleBarButton.java
deleted file mode 100644
index 1496ca4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/TitleBarButton.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.ActionEvent;
-import org.eclipse.draw2d.ActionListener;
-import org.eclipse.draw2d.Button;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.MouseEvent;
-import org.eclipse.draw2d.MouseMotionListener;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A title bar button
- *
- */
-/*package*/ final class TitleBarButton extends Button {
-	private boolean state = false;
-
-	private Image uncheckedImage;
-
-	private Image checkedImage;
-
-	private Image uncheckedHiliteImage;
-
-	private Image checkedHiliteImage;
-
-	private RectangleList uncheckedRects;
-
-	private RectangleList checkedRects;
-
-	private boolean hilite = false;
-
-
-
-	/**
-	 * @param unchecked
-	 * @param uncheckedHilite
-	 * @param checked
-	 * @param checkedHilite
-	 */
-	public TitleBarButton(Image unchecked, Image uncheckedHilite,
-			Image checked, Image checkedHilite) {
-		super();
-		uncheckedImage = unchecked;
-		if (uncheckedHilite == null)
-			uncheckedHiliteImage = unchecked;
-		else
-			uncheckedHiliteImage = uncheckedHilite;
-		if (checked == null)
-			checkedImage = unchecked;
-		else
-			checkedImage = checked;
-		if (checkedHilite == null)
-			checkedHiliteImage = unchecked;
-		else
-			checkedHiliteImage = checkedHilite;
-		initialize();
-	}
-
-	/**
-	 * @param rects
-	 */
-	public TitleBarButton(RectangleList rects) {
-		super();
-		uncheckedRects = rects;
-		initialize();
-	}
-
-	/**
-	 * @param unchecked
-	 * @param checked
-	 */
-	public TitleBarButton(RectangleList unchecked, RectangleList checked) {
-		super();
-		uncheckedRects = unchecked;
-		checkedRects = checked;
-		initialize();
-	}
-
-	/**
-	 * @return the state
-	 */
-	public boolean getState() {
-		return state;
-	}
-
-	/**
-	 * @param newState
-	 */
-	public void setState(boolean newState) {
-		state = newState;
-		hilite = false;
-	}
-
-	private void initialize() {
-		setRequestFocusEnabled(true);
-		setFocusTraversable(true);
-
-		if (uncheckedImage != null) {
-			org.eclipse.swt.graphics.Rectangle r = uncheckedImage.getBounds();
-			setBounds(new Rectangle(0, 0, r.width, r.height));
-			prefSize = new Dimension(r.width, r.height);
-		} else {
-			setForegroundColor(ColorConstants.black);
-			setBackgroundColor(ColorConstants.white);
-			calculatePreferredSize();
-			setBounds(new Rectangle(0, 0, prefSize.width, prefSize.height));
-		}
-		setCursor(Cursors.ARROW);
-		setBorder(null);
-		setFont(JFaceResources.getFontRegistry().get(
-				JFaceResources.DEFAULT_FONT));
-
-		addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent event) {
-				setState(!state);
-			}
-		});
-		this.addMouseMotionListener(new MouseMotionListener() {
-
-			public void mouseDragged(MouseEvent me) {
-				// TODO Auto-generated method stub
-
-			}
-
-			public void mouseEntered(MouseEvent me) {
-				hilite = true;
-				repaint();
-			}
-
-			public void mouseExited(MouseEvent me) {
-				hilite = false;
-				repaint();
-			}
-
-			public void mouseHover(MouseEvent me) {
-				// TODO Auto-generated method stub
-
-			}
-
-			public void mouseMoved(MouseEvent me) {
-				// TODO Auto-generated method stub
-
-			}
-		});
-	}
-
-	/**
-	 * @return the preferred size dimensions
-	 */
-	public Dimension calculatePreferredSize() {
-		if (prefSize == null) {
-			Rectangle rect = new Rectangle(0, 0, 0, 0);
-			if (uncheckedRects != null) {
-				Iterator<Rectangle> iter = uncheckedRects.iterator();
-				while (iter.hasNext()) {
-					/*Point p =*/ getLocation();
-					Rectangle r = iter.next().getCopy();
-					rect = rect.getUnion(r);
-				}
-			}
-			if (checkedRects != null) {
-				Iterator<Rectangle> iter = checkedRects.iterator();
-				while (iter.hasNext()) {
-					/*Point p =*/ getLocation();
-					Rectangle r = iter.next().getCopy();
-					rect = rect.getUnion(r);
-				}
-			}
-			prefSize = rect.getSize();
-			if (prefSize.width > prefSize.height)
-				prefSize.height = prefSize.width;
-			else if (prefSize.height > prefSize.width)
-				prefSize.width = prefSize.height;
-			prefSize.width += 4;
-			prefSize.height += 4;
-		}
-		return prefSize;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#paint(org.eclipse.draw2d.Graphics)
-	 */
-	public void paint(Graphics graphics) {
-		if (!isVisible())
-			return;
-		if (uncheckedImage != null) {
-			if (hilite) {
-				if (state == false)
-					graphics.drawImage(uncheckedHiliteImage, getLocation());
-				else
-					graphics.drawImage(checkedHiliteImage, getLocation());
-			} else {
-				if (state == false)
-					graphics.drawImage(uncheckedImage, getLocation());
-				else
-					graphics.drawImage(checkedImage, getLocation());
-			}
-		} else {
-			Iterator<Rectangle> iter = null;
-			if (state == false)
-				iter = uncheckedRects.iterator();
-			else
-				iter = checkedRects.iterator();
-			while (iter.hasNext()) {
-				Point p = getLocation();
-				Rectangle r = iter.next().getCopy();
-				r = r.translate(p.x, p.y);
-				graphics.setForegroundColor(getForegroundColor());
-				if (hilite)
-					graphics.setBackgroundColor(ColorConstants.lightBlue);
-				else
-					graphics.setBackgroundColor(ColorConstants.white);
-				graphics.fillRectangle(r);
-				graphics.drawRectangle(r);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigure.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigure.java
deleted file mode 100644
index 0734023..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigure.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.AncestorListener;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.ConnectionLayer;
-import org.eclipse.draw2d.FreeformFigure;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayeredPane;
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.FreeformListener;
-import org.eclipse.draw2d.FreeformViewport;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Layer;
-import org.eclipse.draw2d.LayeredPane;
-import org.eclipse.draw2d.ScalableFreeformLayeredPane;
-import org.eclipse.draw2d.ScrollPane;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.editparts.GridLayer;
-import org.eclipse.gef.editparts.GuideLayer;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A ScollPane used as figure container
- *
- */
-/*package*/ class WindowFigure extends ScrollPane implements IContainerFigure,
-		LayerConstants, FreeformFigure {
-	private TabbedWindowBorder windowBorder;
-
-	private TabbedTitleBarBorder titleBarBorder;
-
-	private FreeformViewport myViewport;
-
-	// private FreeformLayeredPane layeredPane;
-
-	private ScalableFreeformLayeredPane scaledLayers;
-
-	private LayeredPane innerLayers;
-
-	private LayeredPane printableLayers;
-
-	private FreeformLayer primaryLayer;
-
-	private final static Font defaultFont = JFaceResources.getFontRegistry().get(
-			JFaceResources.DEFAULT_FONT);
-
-	private final static Color defaultForegroundColor = ColorConstants.black;
-
-	private final static Color defaultBackgroundColor = ColorConstants.white;
-
-	private final static Color defaultGridColor = ColorConstants.lightGray;
-
-	private final static Dimension defaultGridSpacing = null;
-
-	private final static boolean defaultGridEnabled = false;
-
-	// Line Routing is not used within the WindowFigure class; it just serves as
-	// a storage
-	// location for communicating between the GEMPreferences and EditParts that
-	// actually
-	// create the line routers.
-	private final static int LINE_ROUTING_MANUAL = 0;
-
-	// TODO: should this really be static?
-	private static int defaultLineRoutingStyle = LINE_ROUTING_MANUAL;
-
-	private class MyGridLayer extends GridLayer {
-	    
-//		public Point getOrigin() {
-//			return origin.getCopy();
-//		}
-	}
-
-	private class MyFeedbackLayer extends FreeformLayer {
-		MyFeedbackLayer() {
-			setEnabled(false);
-		}
-	}
-
-	/**
-	 * Default constructor
-	 */
-	public WindowFigure() {
-		super();
-
-		windowBorder = new TabbedWindowBorder(this);
-		titleBarBorder = (TabbedTitleBarBorder) windowBorder.getInnerBorder();
-		setBorder(windowBorder);
-		setFont(defaultFont);
-		setForegroundColor(defaultForegroundColor);
-		setBackgroundColor(defaultBackgroundColor);
-
-		innerLayers = new FreeformLayeredPane();
-		createLayers(innerLayers);
-
-		myViewport = new FreeformViewport();
-		myViewport.setContents(innerLayers);
-
-		setViewport(myViewport);
-
-		// CR389495: Working with nested complex activities causes in the BP
-		// editor causes lockup
-		// not related to this CR but discovered while working on it:
-		// make sure we observe grid visibility from preferences
-		getGridLayer().setVisible(defaultGridEnabled);
-		getGridLayer().setSpacing(defaultGridSpacing);
-		getGridLayer().setForegroundColor(defaultGridColor);
-
-		setText(PreferenceMessages.WindowFigure_Title);
-
-		addTabbedWindowListener(new WindowFigureListener() {
-			public void tabChanged(int oldIndex, int newIndex) {
-				internalSetCurrentTab(newIndex);
-				validate();
-			}
-		});
-		addAncestorListener(new AncestorListener() {
-
-			public void ancestorAdded(IFigure ancestor) {
-				setVisible(true);
-			}
-
-			public void ancestorMoved(IFigure ancestor) {
-				// validateComposite();
-			}
-
-			public void ancestorRemoved(IFigure ancestor) {
-				setVisible(false);
-			}
-		});
-	}
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Layer management
-	// //////////////////////////////////////////////////////////////////////////
-
-	/**
-	 * @param layeredPane
-	 */
-	protected void createLayers(LayeredPane layeredPane) {
-		layeredPane.add(getScaledLayers(), SCALABLE_LAYERS);
-		layeredPane.add(new FreeformLayer(), HANDLE_LAYER);
-		// CR377650: Horizontal scrolling needs to be improved
-		// moved the feedback layer into printable layers so it shows up in
-		// content outline
-		// layeredPane.add(new MyFeedbackLayer(), FEEDBACK_LAYER);
-		layeredPane.add(new GuideLayer(), GUIDE_LAYER);
-	}
-
-	/**
-	 * @return the pane
-	 */
-	protected ScalableFreeformLayeredPane createScaledLayers() {
-		ScalableFreeformLayeredPane layers = new ScalableFreeformLayeredPane();
-		layers.add(createGridLayer(), GRID_LAYER);
-		layers.add(getPrintableLayers(), PRINTABLE_LAYERS);
-		// CR389070: Figures are abbreviating rule figures names and making them
-		// unreadable
-		// not needed (?)
-		// layers.add(new MyFeedbackLayer(), SCALED_FEEDBACK_LAYER);
-		return layers;
-	}
-
-	/**
-	 * @return layered pane
-	 */
-	protected LayeredPane getScaledLayers() {
-		if (scaledLayers == null)
-			scaledLayers = createScaledLayers();
-		return scaledLayers;
-	}
-
-	/**
-	 * @return layered pane
-	 */
-	protected LayeredPane createPrintableLayers() {
-		FreeformLayeredPane layeredPane = new FreeformLayeredPane();
-
-		PrintedPageLayer pageTileLayer = new PrintedPageLayer(this);
-		// TODO: get the printer page size from printer preferences
-		// and set into the PageTileLayer.
-		pageTileLayer.setPageSize(new Dimension(0, 0));
-		layeredPane.add(pageTileLayer, PrintedPageLayer.PRINTED_PAGE_LAYER, -1);
-
-		// CR400208: Lines bleed from the bp canvas through the Fault handler
-		// window
-		// changed z-order of connection layer so that it is below figures
-		layeredPane.add(new ConnectionLayer(), CONNECTION_LAYER, -1);
-		primaryLayer = new FreeformLayer();
-		layeredPane.add(primaryLayer, PRIMARY_LAYER, -1);
-		primaryLayer.setLayoutManager(new FreeformLayout());
-
-		// CR377650: Horizontal scrolling needs to be improved
-		// let's put the feedback layer in with the printable layers so
-		// we can see the feedback figures in the content outline viewer
-		layeredPane.add(new MyFeedbackLayer(), FEEDBACK_LAYER);
-		return layeredPane;
-	}
-
-	/**
-	 * @return the layered pane
-	 */
-	protected LayeredPane getPrintableLayers() {
-		if (printableLayers == null)
-			printableLayers = createPrintableLayers();
-		return printableLayers;
-	}
-
-	/**
-	 * @return the grid layer
-	 */
-	protected GridLayer createGridLayer() {
-		return new MyGridLayer();
-	}
-
-	/**
-	 * @return the grid layer
-	 */
-	public GridLayer getGridLayer() {
-		return (GridLayer) getLayer(GRID_LAYER);
-	}
-
-	public Layer getLayer(Object key) {
-		// ScalableFreeformRootEditPart:
-		Layer layer = null;
-		if (scaledLayers != null)
-			layer = scaledLayers.getLayer(key);
-		if (layer != null)
-			return layer;
-		// FreeformGraphicalRootEditPart:
-		if (innerLayers == null)
-			return null;
-		layer = innerLayers.getLayer(key);
-		if (layer != null)
-			return layer;
-		if (printableLayers == null)
-			return null;
-		return printableLayers.getLayer(key);
-	}
-
-	// //////////////////////////////////////////////////////////////////////////
-	// Properties
-	// //////////////////////////////////////////////////////////////////////////
-
-	/**
-	 * @return the scroll position
-	 */
-	public Point getScrollPosition() {
-		int x = getHorizontalScrollBar().getRangeModel().getValue();
-		int y = getVerticalScrollBar().getRangeModel().getValue();
-		return new Point(x, y);
-	}
-
-	/**
-	 * @return the border
-	 */
-	public TabbedTitleBarBorder getTabbedTitleBarBorder() {
-		return titleBarBorder;
-	}
-
-	/**
-	 * @return the border
-	 */
-	public TabbedWindowBorder getTabbedWindowBorder() {
-		return windowBorder;
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void addTabbedWindowListener(WindowFigureListener listener) {
-		titleBarBorder.addTabbedWindowListener(listener);
-	}
-
-	/**
-	 * @param listener
-	 */
-	public void removeTabbedWindowListener(WindowFigureListener listener) {
-		titleBarBorder.removeTabbedWindowListener(listener);
-	}
-
-	public Dimension getMinimumSize(int wHint, int hHint) {
-		Dimension d = titleBarBorder.getMinimumSize(wHint, hHint);
-		d.expand(getInsets().getWidth(), getInsets().getHeight());
-		return d;
-	}
-
-	/**
-	 * @param s
-	 * @return the previous number of tabs
-	 */
-	public int addTab(String s) {
-		return titleBarBorder.addTab(s);
-	}
-
-	/**
-	 * @param index
-	 */
-	public void removeTab(int index) {
-		titleBarBorder.removeTab(index);
-		internalSetCurrentTab(titleBarBorder.getCurrentTab());
-	}
-
-	private void internalSetCurrentTab(int index) {
-		// Object contents = titleBarBorder.getContents(index);
-		// if (contents instanceof IFigure)
-		// setContents((IFigure) contents);
-	}
-
-	/**
-	 * @param index
-	 */
-	public void setCurrentTab(int index) {
-		internalSetCurrentTab(index);
-		titleBarBorder.setCurrentTab(index);
-	}
-
-	/**
-	 * @return the current tab index
-	 */
-	public int getCurrentTab() {
-		return titleBarBorder.getCurrentTab();
-	}
-
-	public void setContents(IFigure figure) {
-		titleBarBorder.setContents(0, figure);
-		super.setContents(figure);
-	}
-
-	/**
-	 * @param index
-	 * @param contents
-	 */
-	public void setContents(int index, Object contents) {
-		if (contents instanceof IFigure)
-			setContents((IFigure) contents);
-		titleBarBorder.setContents(index, contents);
-	}
-
-	/**
-	 * @param index
-	 * @return the content object of the index
-	 */
-	public Object getContents(int index) {
-		return titleBarBorder.getContents(index);
-	}
-
-	public void setVisible(boolean flag) {
-		super.setVisible(flag);
-		windowBorder.setVisible(flag);
-		// hide/show the window contents if it's a SWT composite
-		Object contents = getContents();
-		if (contents instanceof Composite)
-			((Composite) contents).setVisible(flag);
-	}
-
-	public void setHighlight(boolean flag) {
-		windowBorder.setHighlight(flag);
-	}
-
-	public void setFont(Font f) {
-		titleBarBorder.setFont(f);
-	}
-
-	public void setForegroundColor(Color c) {
-		titleBarBorder.setTextColor(c);
-	}
-
-	/**
-	 * @param style
-	 */
-	public void setLineRoutingStyle(int style) {
-		defaultLineRoutingStyle = style;
-		revalidate();
-	}
-
-	/**
-	 * @return the line routing style
-	 */
-	public int getLineRoutingStyle() {
-		return defaultLineRoutingStyle;
-	}
-
-	public Dimension getPreferredSize(int wHint, int hHint) {
-		if (prefSize == null) {
-			IFigure parent = getParent();
-			prefSize = parent.getSize();
-			this.getLayoutManager().invalidate();
-			Dimension m = super.getPreferredSize(wHint, hHint);
-			if (getParent() instanceof CompoundNodeFigure) {
-				if (((CompoundNodeFigure) parent).getState() == CompoundNodeFigure.RESTORED) {
-					Insets in = ((CompoundNodeFigure) getParent())
-							.getAnchorInsets();
-					prefSize.width -= in.getWidth();
-					prefSize.height -= in.getHeight();
-				}
-			} else {
-				if (m.width > prefSize.width)
-					prefSize.width = m.width;
-				if (m.height > prefSize.height)
-					prefSize.height = m.height;
-			}
-		}
-		return prefSize;
-	}
-
-	protected boolean isValidationRoot() {
-		return true;
-	}
-
-	// private void validateComposite() {
-	// Object contents = getContents();
-	// // System.out.println("validate: "+titleBarBorder.getLabel(0)+"
-	// // "+contents);
-	// if (contents instanceof Composite) {
-	// if (getParent() == null) {
-	// System.err.println("TabbedWindowFigure.validate() - ERROR");
-	// return;
-	// }
-	// Rectangle r = getBounds().getCopy();
-	// r.crop(getInsets());
-	// Dimension ps = getParent().getParent().getPreferredSize();
-	// Rectangle pr = getParent().getParent().getBounds();
-	// titleBarBorder.invalidate();
-	// titleBarBorder.getInsets(this);
-	// Insets in = getParent().getParent().getInsets();
-	// Composite comp = (Composite) getContents();
-	// comp.setBounds(pr.x + r.x + in.left, pr.y + r.y, r.width, r.height);
-	// comp.moveAbove(null);
-	// }
-	// }
-
-	public void invalidate() {
-		prefSize = null;
-		super.invalidate();
-	}
-
-	// //////////////////////////////////////////////////////////////////////
-	// IBaseFigure methods
-	// //////////////////////////////////////////////////////////////////////
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setText(String
-	 *      text)
-	 */
-	public void setText(String name) {
-		titleBarBorder.setLabel(name);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getText()
-	 */
-	public String getText() {
-		if (titleBarBorder == null)
-			return PreferenceMessages.WindowFigure_NoTitleText;
-		return titleBarBorder.getLabel();
-	}
-
-	/*
-	 * CR374981: Long activity labels do not get wrapped or truncated This
-	 * method was added to the IBaseFigure interface to support direct edit of
-	 * figure labels on the canvas.
-	 */
-	public Rectangle getTextBounds() {
-		Rectangle r = getClientArea().getCopy();
-		r.height = titleBarBorder.getTextExtents(this).height;
-		r.x += getInsets().left;
-		r.y -= getInsets().top;
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getIcon()
-	 */
-	public Image getIcon() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setIcon(org.eclipse.swt.graphics.Image)
-	 */
-	public void setIcon(Image image) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#setToolTipText(java.lang.String)
-	 */
-	public void setToolTipText(String text) {
-        // do nothing
-	}
-
-	public String getToolTipText() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#addDecorator(com.sybase.stf.gem.diagram.editor.figures.BaseFigureDecorator)
-	 */
-	public void addDecorator(BaseFigureDecorator decorator) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator()
-	 */
-	public void removeDecorator() {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#removeDecorator(int)
-	 */
-	public void removeDecorator(int position) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.gem.diagram.editor.figures.IBaseFigure#getDecorators()
-	 */
-	public List getDecorators() {
-		return null;
-	}
-
-	// //////////////////////////////////////////////////////////////////////
-	// FreeformFigure methods
-	// //////////////////////////////////////////////////////////////////////
-
-	private WindowFreeformHelper helper = new WindowFreeformHelper(this);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#addFreeformListener(org.eclipse.draw2d.FreeformListener)
-	 */
-	public void addFreeformListener(FreeformListener listener) {
-		addListener(FreeformListener.class, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#fireExtentChanged()
-	 */
-	public void fireExtentChanged() {
-		Iterator iter = getListeners(FreeformListener.class);
-		while (iter.hasNext())
-			((FreeformListener) iter.next()).notifyFreeformExtentChanged();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#getFreeformExtent()
-	 */
-	public Rectangle getFreeformExtent() {
-		Rectangle r = helper.getFreeformExtent();
-		r.x = 0;
-		r.y = 0;
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#removeFreeformListener(org.eclipse.draw2d.FreeformListener)
-	 */
-	public void removeFreeformListener(FreeformListener listener) {
-		removeListener(FreeformListener.class, listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FreeformFigure#setFreeformBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setFreeformBounds(Rectangle bounds) {
-		helper.setFreeformBounds(bounds);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigureListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigureListener.java
deleted file mode 100644
index e263904..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFigureListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-/**
- * @author Bob Brodt
- * 
- * Defines an interface for notifying listeners of page switches on a tabbed
- * window figure.
- */
-/*package*/ interface WindowFigureListener {
-	/**
-	 * @param oldIndex
-	 * @param newIndex
-	 */
-	void tabChanged(int oldIndex, int newIndex);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFreeformHelper.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFreeformHelper.java
deleted file mode 100644
index 55be3a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/preference/WindowFreeformHelper.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.preference;
-
-import java.util.List;
-
-import org.eclipse.draw2d.FigureListener;
-import org.eclipse.draw2d.FreeformFigure;
-import org.eclipse.draw2d.FreeformLayeredPane;
-import org.eclipse.draw2d.FreeformListener;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * Stolen from org.eclipse.draw2d.FreeformHelper. See also FreeformLayeredPane.
- * 
- * @author bbrodt
- */
-/*package*/ class WindowFreeformHelper implements FreeformListener {
-	FreeformLayeredPane x;
-
-	class ChildTracker implements FigureListener {
-		public void figureMoved(IFigure source) {
-			invalidate();
-		}
-	}
-
-	private FreeformFigure host;
-
-	private Rectangle freeformExtent;
-
-	private FigureListener figureListener = new ChildTracker();
-
-	/**
-	 * @param host
-	 */
-	public WindowFreeformHelper(FreeformFigure host) {
-		this.host = host;
-	}
-
-	/**
-	 * @return the freeform extent
-	 */
-	public Rectangle getFreeformExtent() {
-		if (freeformExtent != null)
-			return freeformExtent;
-		Rectangle r;
-		List children = host.getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			IFigure child = (IFigure) children.get(i);
-			if (child instanceof FreeformFigure)
-				r = ((FreeformFigure) child).getFreeformExtent();
-			else
-				r = child.getBounds();
-			if (freeformExtent == null)
-				freeformExtent = r.getCopy();
-			else
-				freeformExtent.union(r);
-		}
-		Insets insets = host.getInsets();
-		if (freeformExtent == null)
-			freeformExtent = new Rectangle(0, 0, insets.getWidth(), insets
-					.getHeight());
-		else {
-			host.translateToParent(freeformExtent);
-			freeformExtent.expand(insets);
-		}
-		// System.out.println("New extent calculated for " + host + " = " +
-		// freeformExtent);
-		return freeformExtent;
-	}
-
-	/**
-	 * @param child
-	 */
-	public void hookChild(IFigure child) {
-		invalidate();
-		if (child instanceof FreeformFigure)
-			((FreeformFigure) child).addFreeformListener(this);
-		else
-			child.addFigureListener(figureListener);
-	}
-
-	void invalidate() {
-		freeformExtent = null;
-		host.fireExtentChanged();
-		if (host.getParent() != null)
-			host.getParent().revalidate();
-		else
-			host.revalidate();
-	}
-
-	public void notifyFreeformExtentChanged() {
-		// A childs freeform extent has changed, therefore this extent must be
-		// recalculated
-		invalidate();
-	}
-
-	/**
-	 * @param bounds
-	 */
-	public void setFreeformBounds(Rectangle bounds) {
-		host.setBounds(bounds);
-		bounds = bounds.getCopy();
-		host.translateFromParent(bounds);
-		List children = host.getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			IFigure child = (IFigure) children.get(i);
-			if (child instanceof FreeformFigure)
-				((FreeformFigure) child).setFreeformBounds(bounds);
-		}
-		// CR420954: Compensation Handler canvas goes blank after Variables
-		// Sections is expanded
-		host.getLayoutManager().layout(host);
-	}
-
-	/**
-	 * @param child
-	 */
-	public void unhookChild(IFigure child) {
-		invalidate();
-		if (child instanceof FreeformFigure)
-			((FreeformFigure) child).removeFreeformListener(this);
-		else
-			child.removeFigureListener(figureListener);
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanContentProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanContentProvider.java
deleted file mode 100644
index 45d15b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanContentProvider.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.provider;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanScopeTreeItem;
-
-/**
- * Managed bean Content Provider.
- * <p>
- * <b>Provides grouping by Scope.</b>
- * </p>
- * 
- * @author Xiao-guang Zhang, sfshi
- * @version 1.5
- */
-public class ManagedBeanContentProvider implements ITreeContentProvider {
-
-	private List scopeItemList = null;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object
-	 *      parent)
-	 */
-	public Object[] getChildren(Object parent) {
-
-		if (parent instanceof FacesConfigType) {
-			if (scopeItemList == null) {
-				scopeItemList = new ArrayList();
-				for (int i = 0; i < ManagedBeanScopeTreeItem.scopeItems.length; i++) {
-					ManagedBeanScopeTreeItem scopeTreeItem = new ManagedBeanScopeTreeItem(
-							ManagedBeanScopeTreeItem.scopeItems[i],
-							(FacesConfigType) parent);
-					scopeItemList.add(scopeTreeItem);
-				}
-			}
-			return scopeItemList.toArray();
-		} else if (parent instanceof ManagedBeanScopeTreeItem) {
-			return ((ManagedBeanScopeTreeItem) parent).getChildren().toArray();
-		}
-
-		return new Object[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(Object
-	 *      parent)
-	 */
-	public Object[] getElements(Object inputElement) {
-		return getChildren(inputElement);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object element) {
-		if (element instanceof ManagedBeanScopeTreeItem) {
-			return ((ManagedBeanScopeTreeItem) element).getParent();
-		} else if (element instanceof ManagedBeanType) {
-			String scope = null;
-			if (((ManagedBeanType) element).getManagedBeanScope() != null) {
-				scope = ((ManagedBeanType) element).getManagedBeanScope()
-						.getTextContent();
-			}
-
-			if (scope != null) {
-				for (int i = 0; i < scopeItemList.size(); i++) {
-					if (((ManagedBeanScopeTreeItem) scopeItemList.get(i))
-							.getScope().equals(scope)) {
-						return scopeItemList.get(i);
-					}
-
-				}
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-	 */
-	public boolean hasChildren(Object element) {
-		if (element instanceof FacesConfigType) {
-			return true;
-		} else if (element instanceof ManagedBeanScopeTreeItem) {
-			return ((ManagedBeanScopeTreeItem) element).hasChildren();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-	 */
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
-	 *      java.lang.Object, java.lang.Object)
-	 */
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		if (newInput != null) {
-//			initialize(newInput);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanLabelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanLabelProvider.java
deleted file mode 100644
index 8a51f08..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/provider/ManagedBeanLabelProvider.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.provider;
-
-import java.util.Hashtable;
-import java.util.Map;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.section.ManagedBeanScopeTreeItem;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The Managed Bean Page's TreeViewer Label Provider
- * 
- * @author Xiao-guang Zhang, sfshi
- * @version 1.5
- */
-public class ManagedBeanLabelProvider extends LabelProvider {
-	
-	private static final String SCOPE_IMAGE_FILE = "Scope.gif"; //$NON-NLS-1$
-	private static final String SCOPE_NONE_IMAGE_FILE = "Scope_None.gif"; //$NON-NLS-1$
-	private static final String SCOPE_APPLICATION_IMAGE_FILE = "Scope_Application.gif"; //$NON-NLS-1$
-	private static final String SCOPE_REQUEST_IMAGE_FILE = "Scope_Request.gif"; //$NON-NLS-1$
-	private static final String SCOPE_SESSION_IMAGE_FILE = "Scope_Session.gif"; //$NON-NLS-1$
-	private static final String MANAGED_BEAN_IMAGE_FILE = "facesconfig/FacesConfig_ManagedBean.gif"; //$NON-NLS-1$
-	
-	/** Cache of images that have been dispensed by this provider */
-	private Map imageTable;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.LabelProvider#getText(Object obj)
-	 */
-	public String getText(Object obj) {
-		String text = ""; //$NON-NLS-1$
-
-		if (obj instanceof ManagedBeanType) {
-			ManagedBeanType bean = (ManagedBeanType) obj;
-			if (bean.getManagedBeanName() != null) {
-				text = bean.getManagedBeanName().getTextContent();
-
-			}
-			if (text == null || text.length() < 1) {
-				if (bean.getManagedBeanClass() != null)
-					text = bean.getManagedBeanClass().getTextContent();
-			}
-		} else if (obj instanceof ManagedBeanScopeTreeItem) {
-			text = ((ManagedBeanScopeTreeItem) obj).getScope();
-		}
-
-		return text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(Object obj)
-	 */
-	public Image getImage(Object obj) {
-		ImageDescriptor imageDesc = null;
-		if (obj instanceof ManagedBeanType) {
-
-			imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-					MANAGED_BEAN_IMAGE_FILE);
-
-		} else if (obj instanceof ManagedBeanScopeTreeItem) {
-			ManagedBeanScopeTreeItem scopeTreeItem = (ManagedBeanScopeTreeItem) obj;
-			if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						SCOPE_SESSION_IMAGE_FILE);
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_REQUEST
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						SCOPE_REQUEST_IMAGE_FILE);
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_APPLICATION
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						SCOPE_APPLICATION_IMAGE_FILE);
-			} else if (IFacesConfigConstants.MANAGED_BEAN_SCOPE_NONE
-					.equals(scopeTreeItem.getScope())) {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						SCOPE_NONE_IMAGE_FILE);
-			} else {
-				imageDesc = EditorPlugin.getDefault().getImageDescriptor(
-						SCOPE_IMAGE_FILE);
-			}
-		}
-
-		if (imageDesc != null) {
-			// Obtain the cached image corresponding to the descriptor
-			if (imageTable == null) {
-				imageTable = new Hashtable(40);
-			}
-			Image image = (Image) imageTable.get(imageDesc);
-			if (image == null) {
-				image = imageDesc.createImage();
-				imageTable.put(imageDesc, image);
-			}
-			return image;
-		}
-		return PlatformUI.getWorkbench().getSharedImages().getImage(
-				ISharedImages.IMG_OBJ_ELEMENT);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractFacesConfigSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractFacesConfigSection.java
deleted file mode 100644
index 88dc8d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractFacesConfigSection.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.help.HelpSystem;
-import org.eclipse.help.IContext;
-import org.eclipse.help.IHelpResource;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.SectionPart;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.Section;
-
-
-/**
- * The abstract implementation of IFacesConfigSection.
- * 
- * 
- * @author jchoi, xgzhang, sfshi
- * 
- * @version 1.0
- */
-public abstract class AbstractFacesConfigSection extends SectionPart implements
-		IFacesConfigSection, ISelectionProvider, ISelectionChangedListener {
-	/** tool kit */
-	private FormToolkit toolkit;
-
-	/** help context id */
-	private String helpContextId = null;
-
-	/** help tool tip string */
-	private String helpTooltip = null;
-
-	/** model object */
-	private Object input = null;
-
-	private IFacesConfigPage page;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/** help image */
-	private final static Image HELP_IMAGE = EditorPlugin.getDefault().getImage(
-			"help.gif"); //$NON-NLS-1$
-
-	/**
-	 * Constructor with help option.
-
-	 * @param parent 
-	 * @param managedForm
-	 * @param page 
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public AbstractFacesConfigSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, toolkit, ExpandableComposite.TITLE_BAR
-				| ExpandableComposite.TWISTIE | Section.DESCRIPTION
-				| ExpandableComposite.EXPANDED);
-		super.initialize(managedForm);
-		this.page = page;
-		this.toolkit = toolkit;
-		this.helpContextId = helpContextId;
-		this.helpTooltip = helpTooltip;
-	}
-
-	public void dispose() {
-		selectionChangedListeners.clear();
-		if (input != null) 
-			removeAdaptersFromInput(input);		
-		super.dispose();
-	}
-	/**
-	 * 
-	 */
-	public void initialize() {
-		if (helpContextId != null) {
-			createTextClientWithHelp();
-		}
-
-		getSection().setLayout(new GridLayout());
-
-		Composite clientContainer = toolkit.createComposite(getSection());
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		clientContainer.setLayoutData(gd);
-
-		createContents(clientContainer, toolkit);
-		getSection().setClient(clientContainer);
-
-	}
-
-	/**
-	 * 
-	 * 
-	 */
-	private void createTextClientWithHelp() {
-		ImageHyperlink helpImage = new ImageHyperlink(getSection(), SWT.NULL);
-
-		toolkit.adapt(helpImage, true, true);
-
-		helpImage.setImage(HELP_IMAGE);
-
-		helpImage.setBackground(getSection().getTitleBarGradientBackground());
-		if (helpTooltip != null) {
-			helpImage.setToolTipText(helpTooltip);
-		}
-
-		helpImage.addHyperlinkListener(new HyperlinkAdapter() {
-			public void linkActivated(HyperlinkEvent e) {
-				IContext context = HelpSystem.getContext(helpContextId);
-				if (context != null) {
-					IHelpResource[] topics = context.getRelatedTopics();
-					if (topics != null && topics.length == 1) {
-						EditorPlugin.getDefault().getWorkbench()
-								.getHelpSystem().displayHelpResource(
-										topics[0].getHref());
-					} else {
-						EditorPlugin.getDefault().getWorkbench()
-								.getHelpSystem().displayHelp(helpContextId);
-					}
-				}
-			}
-		});
-
-		getSection().setTextClient(helpImage);
-	}
-
-	/**
-	 * The sub calss should implement this method to create and fill the
-	 * contents in the section
-	 * 
-	 * @param container
-	 * @param toolkit_
-	 */
-	protected abstract void createContents(Composite container,
-			FormToolkit toolkit_);
-
-	/**
-	 * get the input object of this section.
-	 */
-	public Object getInput() {
-		return input;
-	}
-
-	/**
-	 * set input object for this section.
-	 */
-	public void setInput(Object newInput) {
-		if (input != null)
-			removeAdaptersFromInput(input);
-
-		input = newInput;
-
-		if (newInput != null)
-			addAdaptersOntoInput(newInput);
-		// if (this.getSection().isExpanded())
-		refreshAll();
-	}
-
-	/**
-	 * Remove adapters from the input object when the section changes it's
-	 * input. Sub classes should overwrite this method to remove the adapters
-	 * that they added on.
-	 * 
-	 * @param oldInput
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-	    // do nothing; subs should override
-	}
-
-	/**
-	 * Add adapters onto the input object when the section has new input. Sub
-	 * classes should their own adapters.
-	 * 
-	 * @param newInput
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-        // do nothing; subs should override
-	}
-
-	/**
-	 * @return the page that this section lies in.
-	 */
-	public IFacesConfigPage getPage() {
-		return page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return StructuredSelection.EMPTY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // do nothing: no selection change
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * transfer the selection changed event to detail part.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this,
-					event != null ? event.getSelection()
-							: StructuredSelection.EMPTY));
-		}
-	}
-
-	/**
-	 * the convenient method to get the AdapterFactory instance of the editor;
-	 * 
-	 * @return the AdapterFactory instance.
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return (AdapterFactory) getPage().getEditor().getAdapter(
-				AdapterFactory.class);
-	}
-
-	/**
-	 * the convenient method to get the EditingDomain instance of the editor;
-	 * 
-	 * @return the EditingDomain instance.
-	 */
-	public EditingDomain getEditingDomain() {
-		return (EditingDomain) getPage().getEditor().getAdapter(
-				EditingDomain.class);
-	}
-    
-    public void clearAll()
-    {
-        // do nothing, sub-classes may choose to override to clear their contents
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractOverviewSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractOverviewSection.java
deleted file mode 100644
index b8e13ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractOverviewSection.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.common.ui.internal.actions.OpenPageAction;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * 
- */
-public abstract class AbstractOverviewSection extends
-		AbstractFacesConfigSection {
-
-	/**
-	 * the common table viewer used for  the contents
-	 */
-	protected TableViewer tableViewer;
-
-	private String targetPageID;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param targetPageID
-	 * @param title
-	 * @param description
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public AbstractOverviewSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit, String targetPageID,
-			String title, String description, String helpContextId,
-			String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.targetPageID = targetPageID;
-		getSection().setText(title);
-		getSection().setDescription(description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#createContents(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		layout.marginHeight = 2;
-		layout.marginWidth = 2;
-		layout.verticalSpacing = 5;
-		layout.horizontalSpacing = 6;
-		container.setLayout(layout);
-		toolkit.paintBordersFor(container);
-		Table table = createTable(container);
-		if (targetPageID != null) {
-			table.addMouseListener(new MouseAdapter() {
-				public void mouseDoubleClick(MouseEvent e) {
-					if (((IStructuredSelection) tableViewer.getSelection())
-							.size() == 1) {
-						OpenPageAction action = new OpenPageAction();
-						action.setPageName(targetPageID);
-						action.setSelection(tableViewer.getSelection());
-						action.run();
-					}
-				}
-			});
-		}
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		ComposedAdapterFactory factory = (ComposedAdapterFactory)getAdapterFactory();
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(factory));
-		configTableViewer(tableViewer);
-	}
-
-	/**
-	 * 
-	 * @param container 
-	 * @return the table
-	 */
-	abstract protected Table createTable(Composite container);
-
-	/**
-	 * 
-	 * @param tableViewer1
-	 */
-	abstract protected void configTableViewer(TableViewer tableViewer1);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#clearAll()
-	 */
-	public void clearAll() {
-		tableViewer.setInput(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#refreshAll()
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ApplicationSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ApplicationSection.java
deleted file mode 100644
index b121d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ApplicationSection.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * A common <code>IFacesConfigSection</code> implementation for the sections that editing
- * the child elements of <application>, including: <action-listener>,
- * <default-render-kit-id>, <message-bundle>, <navigation-handler>,
- * <view-handler>,<state-manager>, <property-resolver>, <variable-resolver> and
- * <locale-config>. This sections will use the EClass object of these elements
- * as the key.
- * 
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-public class ApplicationSection extends OthersPageBaseSection {
-
-	/** The Eclass object this Section operated */
-	private EClass applicationChildClass;
-
-	/**
-	 * 
-	 * @param applicationChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public ApplicationSection(EClass applicationChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.applicationChildClass = applicationChildClass;
-	}
-
-	/**
-	 * 
-	 * @param componentClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ApplicationSection(EClass componentClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(componentClass, parent, managedForm, page, toolkit, null, null);
-	}
-
-	/**
-	 * Create an object which is instance of <code>applicationChildClass</code>.
-	 * 
-	 * @return the child class object
-	 */
-	public EObject createApplicationChildObject() {
-		String textValue = null;
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-		FacesConfigType facesConfig = (FacesConfigType) this.getPage()
-				.getInput();
-		if (applicationChildClass == FacesConfigPackage.eINSTANCE
-				.getDefaultRenderKitIdType()) {
-
-			/** Open a dialog to select a render-kit of this faces config. */
-			textValue = DialogUtil.openRenderKitDialog(getSection().getShell(),
-					facesConfig);
-		} else if (applicationChildClass == FacesConfigPackage.eINSTANCE
-				.getMessageBundleType()) {
-			/**
-			 * Open a dialog the select the message bundles that in current
-			 * project. If user select a bundle that already declared in this
-			 * faces config, then shows a warning message.
-			 */
-			List bundles = new ArrayList();
-			if (facesConfig.getApplication().size() > 0) {
-				ApplicationType applicationType = (ApplicationType) facesConfig
-						.getApplication().get(0);
-				bundles = applicationType.getMessageBundle();
-			}
-
-			textValue = DialogUtil.openMessageBundleDialog(getSection()
-					.getShell(), project, bundles);
-
-		} else {
-			/**
-			 * For other types children, open a ClassDialog to select a class in
-			 * current project.
-			 */
-			String superType = ModelUtil.getSuperType(applicationChildClass);
-			textValue = DialogUtil.openClassDialog(getSection().getShell(),
-					project, superType,
-					IJavaElementSearchConstants.CONSIDER_ALL_TYPES);
-		}
-		if (textValue != null && textValue.length() > 0) {
-			EObject component = FacesConfigFactory.eINSTANCE
-					.create(applicationChildClass);
-			// set text content.
-			EStructuralFeature feature = applicationChildClass
-					.getEStructuralFeatures().get(0);
-			component.eSet(feature, textValue);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * Set the <application> element as the structuredViewer's input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof ApplicationType) {
-			tableViewer.setInput(input);
-		} else
-			tableViewer.setInput(null);
-	}
-
-	/**
-	 * Add a filter on the table viewer. Only the elements that is a instance of
-	 * <code>applicationChildClass</code> could be selected.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return applicationChildClass.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Perform some actions to create new child object and append it to the
-	 * <application> element.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		/** Create such a new object. */
-		EObject obj = createApplicationChildObject();
-		if (obj != null) {
-
-			boolean needRefreshAll = false;
-			Command command = null;
-			if (getInput() instanceof ApplicationType) {
-				/**
-				 * The input is a <application> element and not null, append the
-				 * new object to it.
-				 */
-				ApplicationType application = (ApplicationType) getInput();
-				command = AddCommand.create(getEditingDomain(), application,
-						null, obj);
-			} else {
-				/**
-				 * The input is null, create a <application> element and append
-				 * it to <faces-config>.
-				 */
-				needRefreshAll = true;
-
-				List list = new ArrayList(2);
-				ApplicationType application = FacesConfigFactory.eINSTANCE
-						.createApplicationType();
-				Command cmd1 = AddCommand.create(getEditingDomain(),
-						application, null, obj);
-				list.add(cmd1);
-				Command cmd2 = AddCommand.create(getEditingDomain(), this
-						.getPage().getInput(), null, application);
-				list.add(cmd2);
-				command = new CompoundCommand(list);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll) {
-					/** reset the application input. */
-					((OthersPage) this.getPage()).resetApplicationInput();
-				}
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AttributeSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AttributeSection.java
deleted file mode 100644
index 687ffcf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AttributeSection.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditAttributeDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Attribute section
- *
- */
-public class AttributeSection extends AbstractFacesConfigSection  {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;	
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public AttributeSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.AttributeSection_Name);
-		this.getSection().setDescription(
-				EditorMessages.AttributeSection_Description);
-
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite attributeSection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.verticalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.marginHeight = 0;
-		gl2.numColumns = 2;
-		attributeSection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		attributeSection.setLayoutData(gd);
-
-		createTableSection(attributeSection, toolkit);
-		createButtonsSection(attributeSection, toolkit);
-		
-	}
-
-	/**
-	 * create table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn nameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		nameCol
-				.setText(EditorMessages.AttributeSection_Table_NameColumn);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol
-				.setText(EditorMessages.AttributeSection_Table_ClassColumn);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.AttributeSection_Table_DefaultValueColumn);
-
-		TableColumn suggestedValueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		suggestedValueCol
-				.setText(EditorMessages.AttributeSection_Table_SuggestedValueColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getAttributeType()
-						.isInstance(element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * add an attribute.
-	 * 
-	 */
-	private void addButtonSelected() {
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditAttributeDialog dialog = new AddEditAttributeDialog(shell, true);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (dialog.open() == Dialog.OK) {
-
-			// AttributeType newAttribute = dialog.getResult();
-			AttributeType newAttribute = FacesConfigFactory.eINSTANCE
-					.createAttributeType();
-
-			if (dialog.getAttributeName().length() > 0) {
-				AttributeNameType attributeNameType = FacesConfigFactory.eINSTANCE
-						.createAttributeNameType();
-				attributeNameType.setTextContent(dialog.getAttributeName());
-				newAttribute.setAttributeName(attributeNameType);
-			}
-
-			if (dialog.getAttributeClass().length() > 0) {
-				AttributeClassType attributeClassType = FacesConfigFactory.eINSTANCE
-						.createAttributeClassType();
-				attributeClassType.setTextContent(dialog.getAttributeClass());
-				newAttribute.setAttributeClass(attributeClassType);
-			}
-
-			if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				newAttribute.setDefaultValue(defaultValueType);
-			}
-
-			if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				newAttribute.setSuggestedValue(suggestedValueType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), null, newAttribute); // getEReference(),
-														// newAttribute);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit an attribute.
-	 * 
-	 */
-	private void editButtonSelected() {
-
-		AttributeType attribute = (AttributeType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(attribute);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditAttributeDialog dialog = new AddEditAttributeDialog(shell, false);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (attribute.getAttributeName() != null) {
-			dialog.setAttributeName(attribute.getAttributeName()
-					.getTextContent());
-		}
-
-		if (attribute.getAttributeClass() != null) {
-			dialog.setAttributeClass(attribute.getAttributeClass()
-					.getTextContent());
-		}
-
-		if (attribute.getDefaultValue() != null) {
-			dialog
-					.setDefaultValue(attribute.getDefaultValue()
-							.getTextContent());
-		}
-
-		if (attribute.getSuggestedValue() != null) {
-			dialog.setSuggestedValue(attribute.getSuggestedValue()
-					.getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(4);
-
-			if (attribute.getAttributeName() != null) {
-				Command cmd1 = SetCommand.create(this.getEditingDomain(),
-						attribute.getAttributeName(),
-						FacesConfigPackage.eINSTANCE
-								.getAttributeNameType_TextContent(), dialog
-								.getAttributeName());
-				commands.add(cmd1);
-			} else if (dialog.getAttributeName().length() > 0) {
-				AttributeNameType attributeNameType = FacesConfigFactory.eINSTANCE
-						.createAttributeNameType();
-				attributeNameType.setTextContent(dialog.getAttributeName());
-
-				Command cmd2 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_AttributeName(),
-						attributeNameType);
-				commands.add(cmd2);
-			}
-
-			if (attribute.getAttributeClass() != null) {
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						attribute.getAttributeClass(),
-						FacesConfigPackage.eINSTANCE
-								.getAttributeClassType_TextContent(), dialog
-								.getAttributeClass());
-				commands.add(cmd3);
-			} else if (dialog.getAttributeClass().length() > 0) {
-				AttributeClassType attributeClassType = FacesConfigFactory.eINSTANCE
-						.createAttributeClassType();
-				attributeClassType.setTextContent(dialog.getAttributeClass());
-
-				Command cmd4 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_AttributeClass(),
-						attributeClassType);
-				commands.add(cmd4);
-			}
-
-			if (attribute.getDefaultValue() != null) {
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						attribute.getDefaultValue(),
-						FacesConfigPackage.eINSTANCE
-								.getDefaultValueType_TextContent(), dialog
-								.getDefaultValue());
-				commands.add(cmd5);
-
-			} else if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				Command cmd6 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_DefaultValue(),
-						defaultValueType);
-				commands.add(cmd6);
-			}
-
-			if (attribute.getSuggestedValue() != null) {
-				Command cmd7 = SetCommand.create(this.getEditingDomain(),
-						attribute.getSuggestedValue(),
-						FacesConfigPackage.eINSTANCE
-								.getSuggestedValueType_TextContent(), dialog
-								.getSuggestedValue());
-				commands.add(cmd7);
-			} else if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				Command cmd8 = AddCommand.create(this.getEditingDomain(),
-						attribute, FacesConfigPackage.eINSTANCE
-								.getAttributeType_SuggestedValue(),
-						suggestedValueType);
-				commands.add(cmd8);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(attribute);
-
-			}
-		}
-
-	}
-
-	/**
-	 * remove an attribute.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		AttributeType attribute = (AttributeType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(attribute);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), null, attribute);// getEReference(), attribute);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java
deleted file mode 100644
index d3c84e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java
+++ /dev/null
@@ -1,406 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * The sections that used for displaying and editing the general information of
- * a component, the information includs display name, description, component
- * type and component class.
- * 
- * @author sfshi
- * 
- */
-public class ComponentGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField componentTypeField;
-
-	private ClassButtonDialogField componentClassField;
-
-	private ComponentGeneralAdapter componentGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ComponentGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.ComponentGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ComponentGeneralSection_Description);
-	}
-
-	/**
-	 * Create the UI fields.
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						ComponentType component = (ComponentType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (component.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) component
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-
-							/** For the new displayname object, add the adapter. */
-							displayNameType.eAdapters().add(
-									getComponentGeneralAdapter());
-							cmd = AddCommand.create(editingDomain, component,
-									FacesConfigPackage.eINSTANCE
-											.getComponentType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						ComponentType component = (ComponentType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (component.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) component
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-							/** For the new description object, add the adapter. */
-							description.eAdapters().add(
-									getComponentGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, component,
-									FacesConfigPackage.eINSTANCE
-											.getComponentType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		componentTypeField = new StringDialogField();
-		componentTypeField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_ComponentType);
-		componentTypeField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		componentTypeField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						ComponentTypeType componentType = FacesConfigFactory.eINSTANCE
-								.createComponentTypeType();
-						componentType
-								.setTextContent(((StringDialogField) field)
-										.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getComponentType_ComponentType(),
-									componentType);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-					}
-				});
-
-		componentClassField = new ClassButtonDialogField(null);
-		componentClassField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_ComponentClass);
-		componentClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(componentClassField.getTextControl(
-				toolkit, container));
-		componentClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		componentClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ComponentClassType componentClass = FacesConfigFactory.eINSTANCE
-								.createComponentClassType();
-						componentClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getComponentType_ComponentClass(),
-									componentClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		componentClassField
-				.setSuperClassName(IFacesConfigConstants.COMPONENT_SUPER_CLASS);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * Refresh the content on this section.
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ComponentType) {			
-			final ComponentType component = (ComponentType) input;
-			refreshControls(component);
-		}
-	}
-
-	private void refreshControls(ComponentType component) {
-		if (component.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) component
-					.getDisplayName().get(0);
-			displayNameField.setTextWithoutUpdate(displayName
-					.getTextContent());
-		} else {
-			displayNameField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (component.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) component
-					.getDescription().get(0);
-			String descriptionString = description.getTextContent();
-			descriptionString = ModelUtil.unEscapeEntities(descriptionString);
-			descriptionField.setTextWithoutUpdate(descriptionString);
-		} else {
-			descriptionField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (component.getComponentType() != null) {
-			componentTypeField.setTextWithoutUpdate(component
-					.getComponentType().getTextContent());
-		} else {
-			componentTypeField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (component.getComponentClass() != null) {
-			componentClassField.setTextWithoutUpdate(component
-					.getComponentClass().getTextContent());
-		} else {
-			componentClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Add ComponentGeneralAdapter onto <component> and the first <display-name>
-	 * and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		ComponentType component = (ComponentType) newInput;
-		if (EcoreUtil.getExistingAdapter(component,
-				ComponentGeneralSection.class) == null) {
-
-			component.eAdapters().add(getComponentGeneralAdapter());
-		}
-
-		if (component.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) component
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ComponentGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getComponentGeneralAdapter());
-			}
-		}
-
-		if (component.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) component
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ComponentGeneralSection.class) == null) {
-
-				description.eAdapters().add(getComponentGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove ComponentGeneralAdapter from <component> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		ComponentType component = (ComponentType) oldInput;
-		if (EcoreUtil.getExistingAdapter(component,
-				ComponentGeneralSection.class) != null) {
-			component.eAdapters().remove(getComponentGeneralAdapter());
-		}
-		if (component.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) component
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ComponentGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getComponentGeneralAdapter());
-			}
-		}
-
-		if (component.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) component
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ComponentGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getComponentGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getComponentGeneralAdapter() {
-
-		if (componentGeneralAdapter == null) {
-			componentGeneralAdapter = new ComponentGeneralAdapter();
-		}
-		return componentGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <component> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class ComponentGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ComponentGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getComponentType_ComponentClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_ComponentType()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_DisplayName()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_Description()) {
-					refresh();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refresh();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java
deleted file mode 100644
index ca2c0ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ComponentMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ComponentMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ComponentMasterSection_Name);
-		getSection().setDescription(
-				EditorMessages.ComponentMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * ComponentType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getComponentType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new component.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		ComponentType component = FacesConfigFactory.eINSTANCE
-				.createComponentType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Component(), component);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(component);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterGeneralSection.java
deleted file mode 100644
index 0e74050..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterGeneralSection.java
+++ /dev/null
@@ -1,490 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ConverterGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField converterIdField;
-
-	private ClassButtonDialogField converterForClassField;
-
-	private ClassButtonDialogField converterClassField;
-
-	private ConverterGeneralAdapter converterGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ConverterGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.ConverterGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ConverterGeneralSection_Description);
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						ConverterType Converter = (ConverterType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Converter.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) Converter
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-
-							displayNameType.eAdapters().add(
-									getConverterGeneralAdapter());
-							cmd = AddCommand.create(editingDomain, Converter,
-									FacesConfigPackage.eINSTANCE
-											.getConverterType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						ConverterType Converter = (ConverterType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Converter.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) Converter
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-
-							description.eAdapters().add(
-									getConverterGeneralAdapter());
-							cmd = AddCommand.create(editingDomain, Converter,
-									FacesConfigPackage.eINSTANCE
-											.getConverterType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		converterIdField = new StringDialogField();
-		// converterIdField.setRequired(true);
-		converterIdField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_ConverterID);
-		converterIdField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		converterIdField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						ConverterIdType converterIdType = FacesConfigFactory.eINSTANCE
-								.createConverterIdType();
-
-						converterIdType
-								.setTextContent(((StringDialogField) field)
-										.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						List commands = new ArrayList(2);
-						Command cmd1 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterForClass(),
-								SetCommand.UNSET_VALUE);
-						commands.add(cmd1);
-						Command cmd2 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterId(),
-								converterIdType);
-						commands.add(cmd2);
-						Command command = new CompoundCommand(commands);
-						if (editingDomain != null) {
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-								refresh();
-							}
-						}
-					}
-				});
-
-		converterForClassField = new ClassButtonDialogField(null);
-		// converterForClassField.setRequired(true);
-		converterForClassField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_ConverterForClass);
-		converterForClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		converterForClassField.doFillIntoGrid(toolkit, container,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(converterForClassField.getTextControl(
-				toolkit, container));
-
-		converterForClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ConverterForClassType converterForClass = FacesConfigFactory.eINSTANCE
-								.createConverterForClassType();
-						converterForClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						List commands = new ArrayList(2);
-						Command cmd1 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterId(),
-								SetCommand.UNSET_VALUE);
-						commands.add(cmd1);
-						Command cmd2 = SetCommand.create(editingDomain,
-								getInput(), FacesConfigPackage.eINSTANCE
-										.getConverterType_ConverterForClass(),
-								converterForClass);
-						commands.add(cmd2);
-						Command command = new CompoundCommand(commands);
-						if (editingDomain != null) {
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-								refresh();
-							}
-						}
-
-					}
-				});
-
-		converterClassField = new ClassButtonDialogField(null);
-		// converterClassField.setRequired(true);
-		converterClassField
-				.setLabelText(EditorMessages.ConverterGeneralSection_Label_ConverterClass);
-		converterClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		converterClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(converterClassField.getTextControl(
-				toolkit, container));
-
-		converterClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ConverterClassType ConverterClass = FacesConfigFactory.eINSTANCE
-								.createConverterClassType();
-						ConverterClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getConverterType_ConverterClass(),
-									ConverterClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		converterClassField
-				.setInterface(IFacesConfigConstants.CONVERTER_INTERFACE);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ConverterType) {
-			final ConverterType converter = (ConverterType) input;
-			refreshControls(converter);
-		}
-	}
-
-	private void refreshControls(ConverterType converter) {
-		if (converter.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) converter
-					.getDisplayName().get(0);
-			displayNameField.setTextWithoutUpdate(displayName
-					.getTextContent());
-		} else {
-			displayNameField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (converter.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) converter
-					.getDescription().get(0);
-			String descriptionString = description.getTextContent();
-			descriptionString = ModelUtil
-					.unEscapeEntities(descriptionString);
-			descriptionField.setTextWithoutUpdate(descriptionString);
-		} else {
-			descriptionField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (converter.getConverterId() != null) {
-			converterIdField.setTextWithoutUpdate(converter
-					.getConverterId().getTextContent());
-		} else {
-			converterIdField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (converter.getConverterForClass() != null) {
-			converterForClassField.setTextWithoutUpdate(converter
-					.getConverterForClass().getTextContent());
-		} else {
-			converterForClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (converter.getConverterClass() != null) {
-			converterClassField.setTextWithoutUpdate(converter
-					.getConverterClass().getTextContent());
-		} else {
-			converterClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-	}
-	/**
-	 * Add ConverterGeneralAdapter onto <converter> and the first <display-name>
-	 * and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		ConverterType converter = (ConverterType) newInput;
-		if (EcoreUtil.getExistingAdapter(converter,
-				ConverterGeneralSection.class) == null) {
-
-			converter.eAdapters().add(getConverterGeneralAdapter());
-		}
-
-		if (converter.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) converter
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ConverterGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getConverterGeneralAdapter());
-			}
-		}
-
-		if (converter.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) converter
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ConverterGeneralSection.class) == null) {
-
-				description.eAdapters().add(getConverterGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove ConverterGeneralAdapter from <converter> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		ConverterType converter = (ConverterType) oldInput;
-		if (EcoreUtil.getExistingAdapter(converter,
-				ConverterGeneralSection.class) != null) {
-			converter.eAdapters().remove(getConverterGeneralAdapter());
-		}
-		if (converter.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) converter
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ConverterGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getConverterGeneralAdapter());
-			}
-		}
-
-		if (converter.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) converter
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ConverterGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getConverterGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getConverterGeneralAdapter() {
-
-		if (converterGeneralAdapter == null) {
-			converterGeneralAdapter = new ConverterGeneralAdapter();
-		}
-		return converterGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <converter> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class ConverterGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ConverterGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getConverterType_ConverterId()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_ConverterClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_ConverterForClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_Description()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getConverterType_DisplayName()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refresh();
-					} else {						
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								refresh();
-							}
-						});
-					}
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refresh();
-					} else {						
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								refresh();
-							}
-						});
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterMasterSection.java
deleted file mode 100644
index 4a84924..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterMasterSection.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ConverterMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ConverterMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ConverterMasterSection_Name);
-		getSection().setDescription(
-				EditorMessages.ConverterMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * ConverterType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getConverterType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new Converter.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		ConverterType Converter = FacesConfigFactory.eINSTANCE
-				.createConverterType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Converter(), Converter);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(Converter);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacesConfigMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacesConfigMasterSection.java
deleted file mode 100644
index 91b11c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacesConfigMasterSection.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * An default implementation of AbstractFacesConfigSection for Master Section.
- * 
- * @author sfshi
- * 
- */
-public abstract class FacesConfigMasterSection extends AbstractFacesConfigSection {
-
-	private StructuredViewer structuredViewer;
-
-	private Button removeButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public FacesConfigMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page,
-			String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-	}
-
-	public void dispose() {
-		structuredViewer.removeSelectionChangedListener(this);
-		super.dispose();
-	}
-	
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		structuredViewer = createViewer(container, toolkit);
-		structuredViewer.addSelectionChangedListener(this);
-		createOperationSection(container, toolkit);
-	}
-
-	/**
-	 * Create the structured viewer, set up content & label provider for it.
-	 * Defaultly create a tableviewer.
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 * @return the structured viewer
-	 */
-	protected StructuredViewer createViewer(Composite parent,
-			FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 200;
-		tableContainer.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-		tableContainer.setLayout(layout);
-
-		TableViewer tableViewer = new TableViewer(tableContainer, SWT.SINGLE
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		tableViewer.getControl().setLayoutData(gd);
-
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		configViewer(tableViewer);
-
-		return tableViewer;
-	}
-
-	/**
-	 * Config the viewer, such as set a filter and so on. Sub classes should
-	 * override this method to add filter.
-	 * 
-	 * @param viewer
-	 */
-	protected void configViewer(StructuredViewer viewer) {
-        // do nothing; subs may override
-	}
-
-	/**
-	 * Defaultly we create a "New" button and a "Remove" button. Sub classes can
-	 * overwrite this method if need other functions.
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 */
-	protected void createOperationSection(Composite parent, FormToolkit toolkit) {
-		Composite operationContainer = toolkit.createComposite(parent);
-		GridData gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-
-		operationContainer.setLayout(layout);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add, SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		setRemoveButton(toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, SWT.PUSH));
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		getRemoveButton().setLayoutData(gd);
-		getRemoveButton().addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected(e);
-			}
-		});
-	}
-    
-    /**
-	 * 
-	 * @param e
-	 */
-    protected abstract void addButtonSelected(SelectionEvent e);
-
-	/**
-	 * 
-	 * @param e
-	 */
-	protected void removeButtonSelected(SelectionEvent e) {
-
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			List commands = new ArrayList(ssel.size());
-			for (Iterator iter = ssel.iterator(); iter.hasNext();) {
-				EObject element = (EObject) iter.next();
-				Command command = RemoveCommand.create(getEditingDomain(),
-						element);
-				commands.add(command);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-			}
-		}
-
-	}
-
-	/**
-	 * 
-	 * update the buttons' enable state.
-	 */
-	protected void updateButtons() {
-		IStructuredSelection ssel = (IStructuredSelection) structuredViewer
-				.getSelection();
-
-		getRemoveButton().setEnabled(!ssel.isEmpty());
-	}
-
-	/**
-	 * 
-	 */
-	public ISelection getSelection() {
-		return structuredViewer.getSelection();
-	}
-
-	/**
-	 * 
-	 */
-	public void setSelection(ISelection selection) {
-		structuredViewer.setSelection(selection);
-	}
-
-	/**
-	 * refresh the display of this section.
-	 */
-	public void refresh() {
-		super.refresh();
-		structuredViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		// master section refresh all:
-		setViewerInput(getInput());
-		updateButtons();
-
-		// detial sections refresh:
-		// fire an event to the detail sections, let them
-		// refresh.
-		selectionChanged(null);
-	}
-
-	/**
-	 * set the structuredViewer's input
-	 * 
-	 * @param input
-	 */
-	private void setViewerInput(Object input) {
-		structuredViewer.setInput(input);
-	}
-
-	/**
-	 * 
-	 */
-	protected void expansionStateChanged(boolean expanded) {
-		if (expanded) {
-			if (structuredViewer.getInput() == null) {
-				refreshAll();
-			}
-			structuredViewer.refresh(true);
-			structuredViewer.setSelection(structuredViewer.getSelection());
-		} else {
-			structuredViewer.setSelection(null);
-		}
-		super.expansionStateChanged(expanded);
-	}
-
-	/**
-	 * 
-	 */
-	protected void expansionStateChanging(boolean expanding) {
-		if (!expanding) {
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			this.getSection().setLayoutData(gd);
-		} else {
-			((FacesConfigMasterDetailPage) getPage()).closeOtherSections(this);
-
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			this.getSection().setLayoutData(gd);
-		}
-
-		super.expansionStateChanging(expanding);
-	}
-
-	/**
-	 * get the viewer.
-	 * 
-	 * @return the viewer
-	 */
-	public StructuredViewer getStructuredViewer() {
-		return structuredViewer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		super.selectionChanged(event);
-		updateButtons();
-	}
-
-    private void setRemoveButton(Button removeButton) {
-        this.removeButton = removeButton;
-    }
-
-    /**
-     * @return the remove button
-     */
-    protected Button getRemoveButton() {
-        return removeButton;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacetSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacetSection.java
deleted file mode 100644
index 8ec7fb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacetSection.java
+++ /dev/null
@@ -1,455 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditFacetDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Section for facets
- *
- */
-public class FacetSection extends AbstractFacesConfigSection {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public FacetSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.FacetSection_Name);
-		this.getSection().setDescription(
-				EditorMessages.FacetSection_Description);
-
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite facetSection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.numColumns = 2;
-		facetSection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		facetSection.setLayoutData(gd);
-
-		createTableSection(facetSection, toolkit);
-		createButtonsSection(facetSection, toolkit);
-
-	}
-
-	/**
-	 * create facet table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn facetNameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		facetNameCol
-				.setText(EditorMessages.FacetSection_Table_FacetNameColumn);
-		TableColumn displayNameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		displayNameCol
-				.setText(EditorMessages.FacetSection_Table_DisplayNameColumn);
-
-		TableColumn descriptionCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		descriptionCol
-				.setText(EditorMessages.FacetSection_Table_DescriptionColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getFacetType().isInstance(
-						element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * create buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-	}
-
-	/**
-	 * refresh the table viewer and update buttons.
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-	}
-
-	/**
-	 * Update the buttons' enable status.
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * add a facet.
-	 * 
-	 */
-	private void addButtonSelected() {
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditFacetDialog dialog = new AddEditFacetDialog(shell, true);
-		if (dialog.open() == Dialog.OK) {
-
-			String newFacetName = dialog.getFacetName();
-			String newDisplayName = dialog.getDisplayName();
-			String newDescription = dialog.getDescription();
-
-			FacetType newFacet = FacesConfigFactory.eINSTANCE.createFacetType();
-			if (newFacetName.length() > 0) {
-				FacetNameType facetNameType = FacesConfigFactory.eINSTANCE
-						.createFacetNameType();
-				facetNameType.setTextContent(newFacetName);
-				newFacet.setFacetName(facetNameType);
-			}
-
-			if (newDisplayName.length() > 0) {
-				DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				displayNameType.setTextContent(newDisplayName);
-				newFacet.getDisplayName().add(displayNameType);
-			}
-
-			if (newDescription.length() > 0) {
-				DescriptionType descriptionType = FacesConfigFactory.eINSTANCE
-						.createDescriptionType();
-				descriptionType.setTextContent(newDescription);
-				newFacet.getDescription().add(descriptionType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), FacesConfigPackage.eINSTANCE
-							.getComponentType_Facet(), newFacet);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit a facet.
-	 * 
-	 */
-	private void editButtonSelected() {
-		FacetType facet = (FacetType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(facet);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditFacetDialog dialog = new AddEditFacetDialog(shell, false);
-		if (facet.getFacetName() != null)
-			dialog.setFacetName(facet.getFacetName().getTextContent());
-
-		if (facet.getDisplayName().size() > 0) {
-			dialog.setDisplayName(((DisplayNameType) facet.getDisplayName()
-					.get(0)).getTextContent());
-		}
-
-		if (facet.getDescription().size() > 0) {
-			dialog.setDescription(((DescriptionType) facet.getDescription()
-					.get(0)).getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(3);
-
-			String newFacetName = dialog.getFacetName();
-			String newDisplayName = dialog.getDisplayName();
-			String newDescription = dialog.getDescription();
-			if (facet.getFacetName() != null) {
-				Command cmd1 = SetCommand.create(getEditingDomain(), facet
-						.getFacetName(), FacesConfigPackage.eINSTANCE
-						.getFacetNameType_TextContent(), newFacetName);
-				commands.add(cmd1);
-			} else if (newFacetName.length() > 0) {
-				FacetNameType newFacetNameType = FacesConfigFactory.eINSTANCE
-						.createFacetNameType();
-				newFacetNameType.setTextContent(newFacetName);
-				Command cmd2 = AddCommand.create(getEditingDomain(), facet,
-						FacesConfigPackage.eINSTANCE.getFacetType_FacetName(),
-						newFacetNameType);
-				commands.add(cmd2);
-			}
-
-			if (facet.getDisplayName().size() > 0) {
-				DisplayNameType displayNameType = (DisplayNameType) facet
-						.getDisplayName().get(0);
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						displayNameType, FacesConfigPackage.eINSTANCE
-								.getDisplayNameType_TextContent(),
-						newDisplayName);
-				commands.add(cmd3);
-			} else if (newDisplayName.length() > 0) {
-				DisplayNameType newDisplayNameType = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				newDisplayNameType.setTextContent(newDisplayName);
-				Command cmd4 = AddCommand
-						.create(this.getEditingDomain(), facet,
-								FacesConfigPackage.eINSTANCE
-										.getFacetType_DisplayName(),
-								newDisplayNameType);
-				commands.add(cmd4);
-			}
-
-			if (facet.getDescription().size() > 0) {
-				DescriptionType descriptionType = (DescriptionType) facet
-						.getDescription().get(0);
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						descriptionType, FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent(),
-						newDescription);
-				commands.add(cmd5);
-			} else if (newDescription.length() > 0) {
-				DescriptionType newDescriptionType = FacesConfigFactory.eINSTANCE
-						.createDescriptionType();
-				newDescriptionType.setTextContent(newDescription);
-				Command cmd6 = AddCommand
-						.create(this.getEditingDomain(), facet,
-								FacesConfigPackage.eINSTANCE
-										.getFacetType_Description(),
-								newDescriptionType);
-				commands.add(cmd6);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(facet);
-			}
-		}
-
-	}
-
-	/**
-	 * remove a facet.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		FacetType facet = (FacetType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(facet);
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), FacesConfigPackage.eINSTANCE
-						.getComponentType_Facet(), facet);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FactorySection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FactorySection.java
deleted file mode 100644
index 2ffe62a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FactorySection.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-public class FactorySection extends OthersPageBaseSection {
-	/** The Eclass object this Section operated */
-	private EClass factoryChildClass;
-
-	/**
-	 * 
-	 * @param factoryChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public FactorySection(EClass factoryChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.factoryChildClass = factoryChildClass;
-	}
-
-	/**
-	 * 
-	 * @param factoryChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public FactorySection(EClass factoryChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(factoryChildClass, parent, managedForm, page, toolkit, null, null);
-	}
-
-	/**
-	 * @return an new object which is instance of <code>factoryChildClass</code>.
-	 */
-	public EObject createFactoryChildObject() {
-		String superType = ModelUtil.getSuperType(factoryChildClass);
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-		String result = DialogUtil.openClassDialog(getSection().getShell(),
-				project, superType,
-				IJavaElementSearchConstants.CONSIDER_ALL_TYPES);
-
-		if (result != null) {
-			EObject component = FacesConfigFactory.eINSTANCE
-					.create(factoryChildClass);
-			// set the text content value.
-			EStructuralFeature feature = factoryChildClass
-					.getEStructuralFeatures().get(0);
-			component.eSet(feature, result);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * Set the <factory> element as the structuredViewer's input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof FactoryType) {
-			tableViewer.setInput(input);
-		} else
-			tableViewer.setInput(null);
-	}
-
-	/**
-	 * Add a filter on the table viewer. Only the elements that is a instance of
-	 * <code>factoryChildClass</code> could be selected.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return factoryChildClass.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Perform some actions to create new child object and append it to the
-	 * <factory> element.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		/** Create a new object which is instance of factoryChildClass. */
-		EObject obj = createFactoryChildObject();
-		if (obj != null) {
-			boolean needRefreshAll = false;
-			Command command = null;
-			if (getInput() instanceof FactoryType) {
-				/**
-				 * The input is a <factory> element and not null, append the new
-				 * object to it.
-				 */
-				FactoryType factory = (FactoryType) getInput();
-				command = AddCommand.create(getEditingDomain(), factory, null,
-						obj);
-			} else {
-				/**
-				 * The input is null, create a <factory> element and append it
-				 * to <faces-config>.
-				 */
-				needRefreshAll = true;
-				List list = new ArrayList(2);
-				FactoryType factory = FacesConfigFactory.eINSTANCE
-						.createFactoryType();
-				Command cmd1 = AddCommand.create(getEditingDomain(), factory,
-						null, obj);
-				list.add(cmd1);
-				Command cmd2 = AddCommand.create(getEditingDomain(), this
-						.getPage().getInput(), null, factory);
-				list.add(cmd2);
-				command = new CompoundCommand(list);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll)
-					((OthersPage) this.getPage()).resetFactoryInput();
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IDialogFieldGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IDialogFieldGroup.java
deleted file mode 100644
index 5c5b7c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IDialogFieldGroup.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-/**
- * This interface is used to build relation between model SSEModel and
- * controller DialogFieldGroup
- * 
- * @author Xiao-guang Zhang
- * @version
- */
-public interface IDialogFieldGroup {
-	/**
-	 * set the input of this section
-	 * 
-	 * @param newInput
-	 */
-	void setInput(Object newInput);
-
-	/**
-	 * @return the input of this section 
-	 */
-	Object getInput();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IFacesConfigSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IFacesConfigSection.java
deleted file mode 100644
index 4fb65dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/IFacesConfigSection.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-
-/**
- * Section interface to build relation between model and adapter
- * 
- * @author sfshi
- * 
- */
-public interface IFacesConfigSection {
-	/**
-	 * set the input of this section
-	 * 
-	 * @param newInput
-	 */
-	void setInput(Object newInput);
-
-	/**
-	 * @return the input of this section
-	 */
-	Object getInput();
-	
-	/**
-	 * initialize current section based on the input
-	 * 
-	 */
-	void initialize();
-
-	/**
-	 * clear all section's contents.
-	 * 
-	 */
-	void clearAll();
-
-	/**
-	 * refresh the needed parts of the section
-	 * 
-	 */
-	void refresh();
-
-	/**
-	 * refresh all parts of the section
-	 * 
-	 */
-	void refreshAll();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/InitializationSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/InitializationSection.java
deleted file mode 100644
index 2029efa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/InitializationSection.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.part.PageBook;
-
-/**
- * This section handles managed bean's initialization, including general class
- * type, map and list type managed bean.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class InitializationSection extends AbstractFacesConfigSection {
-	private static final String MANAGEDBEAN_GENERAL_CLASS = EditorMessages.InitializationSection_ClassType_General;
-
-	private static final String MANAGEDBEAN_MAP = EditorMessages.InitializationSection_ClassType_Map;
-
-	private static final String MANAGEDBEAN_LIST = EditorMessages.InitializationSection_ClassType_List;
-
-	/** property initiliazation container composite */
-	private Composite propertySection;
-
-	/** property initiliazation DialogFieldGroup */
-	private ManagedPropertyEditGroup managedPropertyGroup;
-
-	/** map entries initiliazation container composite */
-	private Composite mapSection;
-
-	/** map entries initiliazation DialogFieldGroup */
-	private MapEntriesEditGroup mapEntryGroup;
-
-	/** list entries initiliazation container composite */
-	private Composite listSection;
-
-	/** list entries initiliazation DialogFieldGroup */
-	private ListEntriesEditGroup listEntryGroup;
-
-	/** the PageBook control for three kinds of managed bean */
-	private PageBook pageBook;
-
-	/** RadiosDialogField for three kinds of managed bean */
-	private RadiosDialogField beanTypeField;
-
-	/** current pages selection */
-	private int currentPageIndex = 0;
-
-	/**
-	 * @param parent 
-	 * @param managedForm
-	 * @param page 
-	 * @param toolkit
-	 */
-	public InitializationSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection().setText(EditorMessages.InitializationSection_Name);
-		getSection().setDescription(
-				EditorMessages.InitializationSection_Description);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.managedbean.sections.BaseSectionPart#createClient(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		container.setLayout(gl);
-		toolkit.paintBordersFor(container);
-
-		createBeanTypeEntry(container, toolkit, numberOfColumns);
-		createInitializationEntry(container, toolkit, numberOfColumns);
-	}
-
-	/**
-	 * create the bean type selection section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createBeanTypeEntry(Composite container, FormToolkit toolkit,
-			int numberOfColumns) {
-		beanTypeField = new RadiosDialogField();
-		String[] items = { MANAGEDBEAN_GENERAL_CLASS, MANAGEDBEAN_MAP,
-				MANAGEDBEAN_LIST };
-		beanTypeField
-				.setLabelText(EditorMessages.InitializationSection_ClassType);
-		beanTypeField.setItems(items);
-		beanTypeField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		beanTypeField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						RadiosDialogField beanTypeField1 = (RadiosDialogField) field;
-
-						boolean bChangedSuccess = false;
-						if (beanTypeField1.getSelectedIndex() == 0) {
-							bChangedSuccess = switchPage(
-									IFacesConfigConstants.MANAGED_PROPERTY,
-									false);
-						} else if (beanTypeField1.getSelectedIndex() == 1) {
-							bChangedSuccess = switchPage(
-									IFacesConfigConstants.MAP_ENTRIES, false);
-						} else if (beanTypeField1.getSelectedIndex() == 2) {
-							bChangedSuccess = switchPage(
-									IFacesConfigConstants.LIST_ENTRIES, false);
-						}
-
-						if (bChangedSuccess) {
-							currentPageIndex = beanTypeField1.getSelectedIndex();
-						} else {
-							beanTypeField1.setSelectedIndexWithoutUpdate(-1);
-							beanTypeField1
-									.setSelectedIndexWithoutUpdate(currentPageIndex);
-						}
-					}
-				});
-	}
-
-	/**
-	 * switch to general property, map-entries, or list-entries group If
-	 * bForceClear equals to true, the others page will be cleared without user
-	 * confirmation. if bForceClear equals to false, the confirmation dialog
-	 * will pop up and let user determine whether this page is cleared or not.
-	 * 
-	 * @param pageID -
-	 *            IFacesConfigConstants.MANAGED_PROPERTY,
-	 *            MAP_ENTRIES,LIST_ENTRIES
-	 * @param bForceClearOthers -
-	 *            Force to clear other pages.
-	 */
-	private boolean switchPage(String pageID, boolean bForceClearOthers) {
-		if (pageID == IFacesConfigConstants.MANAGED_PROPERTY) {
-			if (clearPage(IFacesConfigConstants.MAP_ENTRIES, bForceClearOthers)
-					&& clearPage(IFacesConfigConstants.LIST_ENTRIES,
-							bForceClearOthers)) {
-				managedPropertyGroup.refreshAll();
-				pageBook.showPage(propertySection);
-				// FIXME: there should be some other methods to resize the whole
-				// section.
-				InitializationSection.this.getSection().setExpanded(false);
-				InitializationSection.this.getSection().setExpanded(true);
-				return true;
-			}
-		} else if (pageID == IFacesConfigConstants.MAP_ENTRIES) {
-			if (clearPage(IFacesConfigConstants.MANAGED_PROPERTY,
-					bForceClearOthers)
-					&& clearPage(IFacesConfigConstants.LIST_ENTRIES,
-							bForceClearOthers)) {
-				mapEntryGroup.refreshAll();
-				pageBook.showPage(mapSection);
-				// FIXME: there should be some other methods to resize the whole
-				// section.
-				InitializationSection.this.getSection().setExpanded(false);
-				InitializationSection.this.getSection().setExpanded(true);
-				return true;
-			}
-		} else if (pageID == IFacesConfigConstants.LIST_ENTRIES) {
-			if (clearPage(IFacesConfigConstants.MANAGED_PROPERTY,
-					bForceClearOthers)
-					&& clearPage(IFacesConfigConstants.MAP_ENTRIES,
-							bForceClearOthers)) {
-				listEntryGroup.refreshAll();
-				pageBook.showPage(listSection);
-				// FIXME: there should be some other methods to resize the whole
-				// section.
-				InitializationSection.this.getSection().setExpanded(false);
-				InitializationSection.this.getSection().setExpanded(true);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * clear one specified page according to pageID if bForceClear equals to
-	 * false, the confirmation dialog will pop up and let user determine whether
-	 * this page is cleared or not.
-	 * 
-	 * @param pageID -
-	 *            IFacesConfigConstants.MANAGED_PROPERTY,
-	 *            MAP_ENTRIES,LIST_ENTRIES
-	 * @param bForceClear -
-	 *            force to clear current page.
-	 * @return
-	 */
-	private boolean clearPage(String pageID, boolean bForceClear) {
-		ManagedBeanType managedBean = (ManagedBeanType) getInput();
-
-		if (pageID == IFacesConfigConstants.MANAGED_PROPERTY) {
-			if (managedBean.getManagedProperty().size() == 0) {
-				return true;
-			}
-
-			if (bForceClear
-					|| EditorPlugin
-							.getAlerts()
-							.confirm(
-									"ManagedBeanInitializationSection.Remove.Title", //$NON-NLS-1$
-									"ManagedBeanInitializationSection.RemoveManagedProperty")) { //$NON-NLS-1$
-				Command cmd = SetCommand.create(this.getEditingDomain(),
-						managedBean, FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ManagedProperty(),
-						SetCommand.UNSET_VALUE);
-				if (cmd.canExecute()) {
-					getEditingDomain().getCommandStack().execute(cmd);
-					return true;
-				}
-
-				return false;
-			}
-		} else if (pageID == IFacesConfigConstants.MAP_ENTRIES) {
-			if (managedBean.getMapEntries() == null) {
-				return true;
-			}
-
-			if (bForceClear
-					|| EditorPlugin
-							.getAlerts()
-							.confirm(
-									"ManagedBeanInitializationSection.Remove.Title", //$NON-NLS-1$
-									"ManagedBeanInitializationSection.RemoveMapEntries")) { //$NON-NLS-1$
-				Command cmd = SetCommand.create(this.getEditingDomain(),
-						managedBean, FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_MapEntries(),
-						SetCommand.UNSET_VALUE);
-				if (cmd.canExecute()) {
-					getEditingDomain().getCommandStack().execute(cmd);
-					return true;
-				}
-			}
-		} else if (pageID == IFacesConfigConstants.LIST_ENTRIES) {
-			if (managedBean.getListEntries() == null) {
-				return true;
-			}
-
-			if (bForceClear
-					|| EditorPlugin
-							.getAlerts()
-							.confirm(
-									"ManagedBeanInitializationSection.Remove.Title", //$NON-NLS-1$
-									"ManagedBeanInitializationSection.RemoveListEntries")) { //$NON-NLS-1$
-				Command cmd = SetCommand.create(this.getEditingDomain(),
-						managedBean, FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ListEntries(),
-						SetCommand.UNSET_VALUE);
-				if (cmd.canExecute()) {
-					getEditingDomain().getCommandStack().execute(cmd);
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * create property initialization section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createInitializationEntry(Composite container,
-			FormToolkit toolkit, int numberOfColumns) {
-		pageBook = new PageBook(container, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = numberOfColumns;
-		pageBook.setLayoutData(gd);
-		toolkit.paintBordersFor(pageBook);
-
-		managedPropertyGroup = new ManagedPropertyEditGroup(this);
-		managedPropertyGroup.initialize();
-		managedPropertyGroup.addSelectionChangedListener(this);
-		
-		mapEntryGroup = new MapEntriesEditGroup(this);
-		mapEntryGroup.initialize();
-		mapEntryGroup.addSelectionChangedListener(this);
-		
-		listEntryGroup = new ListEntriesEditGroup(this);
-		listEntryGroup.initialize();
-		listEntryGroup.addSelectionChangedListener(this);
-		
-		propertySection = toolkit.createComposite(pageBook);
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		propertySection.setLayout(gl);
-		gd = new GridData(GridData.FILL_BOTH);
-		propertySection.setLayoutData(gd);
-		managedPropertyGroup.layoutDialogFields(toolkit, propertySection);
-		
-		mapSection = toolkit.createComposite(pageBook);
-		mapEntryGroup.layoutDialogFields(toolkit, mapSection);
-		
-		listSection = toolkit.createComposite(pageBook);
-		listEntryGroup.layoutDialogFields(toolkit, listSection);
-		
-		pageBook.showPage(propertySection);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.managedbean.sections.ISSESection#setInput(java.lang.Object)
-	 */
-	public void setInput(Object newInput) {
-		super.setInput(newInput);
-		refreshAll();
-	}
-
-	public void refreshAll() {
-		if (getInput() instanceof ManagedBeanType) {
-			ManagedBeanType managedBean = (ManagedBeanType) getInput();
-			managedPropertyGroup.setInput(managedBean);
-			mapEntryGroup.setInput(managedBean);
-			listEntryGroup.setInput(managedBean);
-			if (managedBean.getManagedProperty().size() > 0) {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(0);
-			} else if (managedBean.getMapEntries() != null) {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(1);
-			} else if (managedBean.getListEntries() != null) {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(2);
-			} else {
-				beanTypeField.setSelectedIndexWithoutUpdate(-1);
-				beanTypeField.setSelectedIndex(0);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LifecycleSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LifecycleSection.java
deleted file mode 100644
index 50e529c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LifecycleSection.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public class LifecycleSection extends OthersPageBaseSection {
-
-	/**
-	 * The Eclass object this Section operated. Since lifecycle only has one
-	 * type child: phase-listener, so this object should always equals
-	 * <code>FacesConfigPackage.eINSTANCE
-	 .getPhaseListenerType()</code>.
-	 */
-	private EClass lifecycleChildClass;
-
-	/**
-	 * 
-	 * @param lifecycleChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public LifecycleSection(EClass lifecycleChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-		this.lifecycleChildClass = lifecycleChildClass;
-	}
-
-	/**
-	 * 
-	 * @param lifecycleChildClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public LifecycleSection(EClass lifecycleChildClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(lifecycleChildClass, parent, managedForm, page, toolkit, null,
-				null);
-	}
-
-	/**
-	 * @return the lifecycle child
-	 */
-	public EObject createLifecycleChildObject() {
-		String superType = ModelUtil.getSuperType(lifecycleChildClass);
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-		String result = DialogUtil.openClassDialog(getSection().getShell(),
-				project, superType,
-				IJavaElementSearchConstants.CONSIDER_ALL_TYPES);
-
-		if (result != null) {
-			EObject component = FacesConfigFactory.eINSTANCE
-					.create(lifecycleChildClass);
-			EStructuralFeature feature = lifecycleChildClass
-					.getEStructuralFeatures().get(0);
-			component.eSet(feature, result);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * Set the <lifecycle> element as the structuredViewer's input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof LifecycleType) {
-			tableViewer.setInput(input);
-		} else
-			tableViewer.setInput(null);
-	}
-
-	/**
-	 * Add a filter on the table viewer. Only the elements that is a instance of
-	 * <code>lifecycleChildClass</code> could be selected.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return lifecycleChildClass.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Perform some actions to create new child object and append it to the
-	 * <lifecycle> element.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		EObject obj = createLifecycleChildObject();
-		if (obj != null) {
-
-			boolean needRefreshAll = false;
-			Command command = null;
-			if (getInput() instanceof LifecycleType) {
-				LifecycleType lifeCycle = (LifecycleType) getInput();
-				command = AddCommand.create(getEditingDomain(), lifeCycle,
-						null, obj);
-			} else {
-				needRefreshAll = true;
-				LifecycleType lifeCycle = FacesConfigFactory.eINSTANCE
-						.createLifecycleType();
-				lifeCycle.getPhaseListener().add(obj);
-				command = AddCommand.create(getEditingDomain(), this.getPage()
-						.getInput(), null, lifeCycle);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll)
-					((OthersPage) this.getPage()).resetLifecycleInput();
-			}
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ListEntriesEditGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ListEntriesEditGroup.java
deleted file mode 100644
index 3a1d0ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ListEntriesEditGroup.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.EditValueDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * ListEntries editing DialogFieldGroup
- * 
- * @author Xiao-guang Zhang, sfshi
- * @version
- */
-public class ListEntriesEditGroup extends DialogFieldGroup implements
-		IDialogFieldGroup, ISelectionProvider, ISelectionChangedListener {
-
-	private ClassButtonDialogField valueClassField;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private IProject currentProject;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private ManagedBeanType managedBean;
-
-	private AbstractFacesConfigSection section;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/**
-	 * @param section 
-	 */
-	public ListEntriesEditGroup(AbstractFacesConfigSection section) {
-		super();
-		this.section = section;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-	    // TODO: initialize?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-        // TODO: initialize?
-    }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		GridData data = new GridData(GridData.FILL_BOTH);
-		parent.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.marginHeight = 0;
-		parent.setLayout(gl);
-
-		layoutListTypeSelectionSection(toolkit, parent);
-
-		createAndLayoutListValueSection(toolkit, parent);
-	}
-
-	/**
-	 * 
-	 */
-	private void layoutListTypeSelectionSection(FormToolkit toolkit,
-			Composite container) {
-		Composite typeSelectionSection = null;
-		if (toolkit != null) {
-			typeSelectionSection = toolkit.createComposite(container);
-			toolkit.paintBordersFor(typeSelectionSection);
-		} else {
-			typeSelectionSection = SWTUtils
-					.createComposite(container, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);
-		valueClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						ManagedBeanType managedBean_ = (ManagedBeanType) getInput();
-						String className = ((ClassButtonDialogField) field)
-								.getText();
-						ValueClassType valueClass = FacesConfigFactory.eINSTANCE
-								.createValueClassType();
-						valueClass.setTextContent(className);
-						EditingDomain editingDomain = section
-								.getEditingDomain();
-						Command cmd;
-						boolean isNew;
-						if (managedBean_.getListEntries() == null) {
-							isNew = true;
-							ListEntriesType listEntries = FacesConfigFactory.eINSTANCE
-									.createListEntriesType();
-							listEntries.setValueClass(valueClass);
-							cmd = SetCommand.create(editingDomain, managedBean_,
-									FacesConfigPackage.eINSTANCE
-											.getManagedBeanType_ListEntries(),
-									listEntries);
-						} else {
-							isNew = false;
-							ListEntriesType listEntries = managedBean_
-									.getListEntries();
-							cmd = SetCommand.create(editingDomain, listEntries,
-									FacesConfigPackage.eINSTANCE
-											.getListEntriesType_ValueClass(),
-									valueClass);
-						}
-
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-							if (isNew)
-								refreshAll();
-						}
-
-					}
-				});
-		valueClassField.doFillIntoGrid(toolkit, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(valueClassField.getTextControl(
-				toolkit, container));
-	}
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 */
-	private void createAndLayoutListValueSection(FormToolkit toolkit,
-			Composite parent) {
-		Composite listValueSection = null;
-		if (toolkit != null) {
-			listValueSection = toolkit.createComposite(parent);
-			toolkit.paintBordersFor(listValueSection);
-		} else {
-			listValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		listValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		listValueSection.setLayout(gl);
-		DialogFieldBase valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);    
-		valuesTitle.doFillIntoGrid(toolkit, listValueSection, numberOfColumns);
-
-		// list's value table
-		Table listTable;
-		if (toolkit == null) {
-			listTable = new Table(listValueSection, SWT.H_SCROLL | SWT.V_SCROLL
-					| SWT.FULL_SELECTION | SWT.BORDER);
-		} else {
-			listTable = new Table(listValueSection, SWT.H_SCROLL | SWT.V_SCROLL
-					| SWT.FULL_SELECTION | SWT.BORDER);
-		}
-
-		listTable.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				updateButtons();
-			}
-
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		listTable.setLayoutData(gd);
-		listTable.setHeaderVisible(true);
-		listTable.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		layout.addColumnData(new ColumnWeightData(1, true));
-		listTable.setLayout(layout);
-		TableColumn valueCol = new TableColumn(listTable, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.InitializationSection_MapTable_Value);
-		valueCol.setResizable(true);
-
-		listTable.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-		tableViewer = new TableViewer(listTable);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				section.getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(section
-				.getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getValueType().isInstance(
-						element)
-						|| FacesConfigPackage.eINSTANCE.getNullValueType()
-								.isInstance(element);
-			}
-		});
-		tableViewer.addSelectionChangedListener(this);
-
-		Composite operationContainer = null;
-		if (toolkit != null) {
-			operationContainer = toolkit.createComposite(listValueSection);
-		} else {
-			operationContainer = SWTUtils.createComposite(listValueSection,
-					SWT.NONE);
-		}
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = null;
-		if (toolkit != null) {
-			addButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Add_more,
-					SWT.PUSH);
-		} else {
-			addButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Add_more);
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = null;
-		if (toolkit != null) {
-			editButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more, SWT.PUSH);
-		} else {
-			editButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more);
-		}
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = null;
-		if (toolkit != null) {
-			removeButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Remove,
-					SWT.PUSH);
-		} else {
-			removeButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Remove);
-		}
-
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-	}
-
-	private void addButtonSelected() {
-		EditValueDialog dialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), true, false, null);
-		if (dialog.open() == Dialog.OK) {
-
-			EditingDomain editingDomain = section.getEditingDomain();
-			if (this.managedBean.getListEntries() == null) {
-				ListEntriesType listEntries = FacesConfigFactory.eINSTANCE
-						.createListEntriesType();
-				if (dialog.isNullValue()) {
-					NullValueType nullValue = FacesConfigFactory.eINSTANCE
-							.createNullValueType();
-					listEntries.getNullValue().add(nullValue);
-				} else {
-					ValueType value = FacesConfigFactory.eINSTANCE
-							.createValueType();
-					value.setTextContent((String) dialog.getResultData());
-					listEntries.getValue().add(value);
-				}
-
-				Command cmd1 = SetCommand.create(editingDomain, managedBean,
-						FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ListEntries(), listEntries);
-				if (cmd1.canExecute()) {
-					editingDomain.getCommandStack().execute(cmd1);
-					refreshAll();
-				}
-			} else {
-				ListEntriesType listEntries = managedBean.getListEntries();
-				Command cmd;
-				if (dialog.isNullValue()) {
-					NullValueType nullValue = FacesConfigFactory.eINSTANCE
-							.createNullValueType();
-					cmd = AddCommand.create(editingDomain, listEntries,
-							FacesConfigPackage.eINSTANCE
-									.getListEntriesType_NullValue(), nullValue);
-				} else {
-					ValueType value = FacesConfigFactory.eINSTANCE
-							.createValueType();
-					value.setTextContent((String) dialog.getResultData());
-					cmd = AddCommand.create(editingDomain, listEntries,
-							FacesConfigPackage.eINSTANCE
-									.getListEntriesType_Value(), value);
-				}
-				if (cmd.canExecute()) {
-					editingDomain.getCommandStack().execute(cmd);
-				}
-			}
-
-		}
-	}
-
-	private void editButtonSelected() {
-		Object select = ((IStructuredSelection) tableViewer.getSelection())
-				.getFirstElement();
-		boolean isNullValue;
-		String valueText = null;
-		if (select instanceof NullValueType)
-			isNullValue = true;
-		else {
-			isNullValue = false;
-			valueText = ((ValueType) select).getTextContent();
-		}
-		ListEntriesType listEntries = managedBean.getListEntries();
-		EditValueDialog dialog = new EditValueDialog(EditorPlugin
-				.getActiveShell(), true, isNullValue, valueText);
-		if (dialog.open() == Dialog.OK) {
-			EditingDomain editingDomain = section.getEditingDomain();
-			Command cmd = null;
-			if (isNullValue && !dialog.isNullValue()) {
-				List commands = new ArrayList();
-				Command cmd1 = RemoveCommand.create(editingDomain, listEntries,
-						FacesConfigPackage.eINSTANCE
-								.getListEntriesType_NullValue(), select);
-				commands.add(cmd1);
-
-				// listEntries.getNullValue().remove(select);
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent((String) dialog.getResultData());
-				Command cmd2 = AddCommand
-						.create(editingDomain, listEntries,
-								FacesConfigPackage.eINSTANCE
-										.getListEntriesType_Value(), value);
-				commands.add(cmd2);
-				cmd = new CompoundCommand(commands);
-			} else if (!isNullValue && dialog.isNullValue()) {
-				List commands = new ArrayList();
-				Command cmd1 = RemoveCommand
-						.create(editingDomain, listEntries,
-								FacesConfigPackage.eINSTANCE
-										.getListEntriesType_Value(), select);
-				commands.add(cmd1);
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				Command cmd2 = AddCommand.create(editingDomain, listEntries,
-						FacesConfigPackage.eINSTANCE
-								.getListEntriesType_NullValue(), nullValue);
-				commands.add(cmd2);
-				cmd = new CompoundCommand(commands);
-			} else if (!isNullValue && !dialog.isNullValue()) {
-				cmd = SetCommand
-						.create(editingDomain, select,
-								FacesConfigPackage.eINSTANCE
-										.getValueType_TextContent(), dialog
-										.getResultData());
-			}
-
-			if (cmd != null && cmd.canExecute()) {
-				editingDomain.getCommandStack().execute(cmd);
-			}
-		}
-	}
-
-	private void removeButtonSelected() {
-		Object select = ((IStructuredSelection) tableViewer.getSelection())
-				.getFirstElement();
-		ListEntriesType listEntries = managedBean.getListEntries();
-		EditingDomain editingDomain = section.getEditingDomain();
-		Command cmd;
-		if (select instanceof NullValueType) {
-			cmd = RemoveCommand
-					.create(editingDomain, listEntries,
-							FacesConfigPackage.eINSTANCE
-									.getListEntriesType_NullValue(), select);
-		} else {
-			cmd = RemoveCommand.create(editingDomain, listEntries,
-					FacesConfigPackage.eINSTANCE.getListEntriesType_Value(),
-					select);
-		}
-		if (cmd.canExecute()) {
-			editingDomain.getCommandStack().execute(cmd);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.managedbean.sections.wizards.IDialogFieldGroup#setInput(java.lang.Object)
-	 */
-	public void setInput(Object newInput) {
-		if (newInput != null && newInput instanceof ManagedBeanType) {
-			managedBean = (ManagedBeanType) newInput;
-			if (managedBean.getListEntries() != null)
-				refreshAll();
-		}
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		if (managedBean.getListEntries() != null
-				&& managedBean.getListEntries().getValueClass() != null) {
-			this.valueClassField.setTextWithoutUpdate(managedBean
-					.getListEntries().getValueClass().getTextContent());
-		} else {
-			valueClassField.setTextWithoutUpdate(null);
-		}
-		tableViewer.setInput(((ManagedBeanType) getInput()).getListEntries());
-		updateButtons();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.editors.pageflow.managedbean.sections.wizards.IDialogFieldGroup#getInput()
-	 */
-	public Object getInput() {
-		return managedBean;
-	}
-
-	private IProject getProject() {
-		if (currentProject == null) {
-			currentProject = (IProject) section.getPage().getEditor()
-					.getAdapter(IProject.class);
-		}
-		return currentProject;
-	}
-
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LocaleConfigSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LocaleConfigSection.java
deleted file mode 100644
index 3ac917a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LocaleConfigSection.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.DialogUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-public class LocaleConfigSection extends ApplicationSection implements
-		ICheckStateListener {
-	private LocaleConfigAdapter _localeConfigAdapter;
-
-	/**
-	 * 
-	 * @param componentClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public LocaleConfigSection(EClass componentClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page,
-			FormToolkit toolkit, String helpContextId, String helpTooltip) {
-		super(componentClass, parent, managedForm, page, toolkit,
-				helpContextId, helpTooltip);
-	}
-
-	/**
-	 * 
-	 * @param componentClass
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public LocaleConfigSection(EClass componentClass, Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		this(componentClass, parent, managedForm, page, toolkit, null, null);
-	}
-
-	public void dispose() {
-		((CheckboxTableViewer)tableViewer).removeCheckStateListener(this);
-		super.dispose();		
-	}
-	/**
-	 * create a CheckboxTableViewer for this section.
-	 */
-	protected TableViewer createTableViewer(Composite parent) {
-		CheckboxTableViewer tableViewer1 = CheckboxTableViewer.newCheckList(
-				parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		tableViewer1.addCheckStateListener(this);
-		tableViewer1.setSorter(new ViewerSorter());
-		return tableViewer1;
-	}
-
-	/**
-	 * Add a filter for this table viewer, only <supported-locale> and
-	 * <default-locale> elements would be listed.
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getSupportedLocaleType()
-						.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getDefaultLocaleType()
-								.isInstance(element);
-			}
-		});
-	}
-
-	/**
-	 * Pop up a dialog for user to select a locale string, then create a
-	 * <supported-locale> element with the string as value.
-	 * 
-	 * @return the supported locale object
-	 */
-	public SupportedLocaleType createSupportedLocaleObject() {
-		ArrayList locales = new ArrayList();
-
-		/**
-		 * Compute the locales that already declared in this <locale-config>
-		 * element. If user select a locale that already declared, then a
-		 * warning message will be shown in the dialog.
-		 */
-
-		if (getInput() instanceof ApplicationType
-				&& ((ApplicationType) getInput()).getLocaleConfig().size() > 0) {
-			LocaleConfigType localeConfigType = (LocaleConfigType) ((ApplicationType) getInput())
-					.getLocaleConfig().get(0);
-			if (localeConfigType.getDefaultLocale() != null) {
-				String locale = localeConfigType.getDefaultLocale()
-						.getTextContent();
-				if (locale != null) {
-					locales.add(locale);
-				}
-			}
-			List list = localeConfigType.getSupportedLocale();
-			for (int i = 0, n = list.size(); i < n; i++) {
-				String locale = ((SupportedLocaleType) list.get(i))
-						.getTextContent();
-				if (locale != null) {
-					locales.add(locale);
-				}
-			}
-		}
-		String result = DialogUtil.openLocaleDialog(getSection().getShell(),
-				locales);
-		if (result != null) {
-			SupportedLocaleType component = FacesConfigFactory.eINSTANCE
-					.createSupportedLocaleType();
-			component.setTextContent(result);
-			return component;
-		}
-		return null;
-	}
-
-	/**
-	 * When user click "Add" button on this section, pop up a dialog to create a
-	 * <supported-locale> element, then add it onto <locale-config> element, if
-	 * the <locale-config> or <application> doesn't exist, create them together.
-	 */
-	void addButtonSelected(SelectionEvent e) {
-		SupportedLocaleType obj = createSupportedLocaleObject();
-		if (obj != null) {
-
-			boolean needRefreshAll = false;
-			Command command = null;
-
-			if (getInput() instanceof ApplicationType) {
-				/** the <application> element exists. */
-				ApplicationType application = (ApplicationType) getInput();
-				if (application.getLocaleConfig().size() > 0) {
-					/** the <locale-config> element exists. */
-					LocaleConfigType localeConfig = (LocaleConfigType) application
-							.getLocaleConfig().get(0);
-					command = AddCommand.create(this.getEditingDomain(),
-							localeConfig, null, obj);
-				} else {
-					/** the <locale-config> element doesn't exist, create it. */
-					LocaleConfigType localeConfig = FacesConfigFactory.eINSTANCE
-							.createLocaleConfigType();
-					localeConfig.getSupportedLocale().add(obj);
-					command = AddCommand.create(getEditingDomain(),
-							application, null, localeConfig);
-				}
-			} else {
-				/**
-				 * the <application> element doesn't exist, then create it,
-				 * after execute, reset the input for all the application
-				 * sections.
-				 */
-				needRefreshAll = true;
-				ApplicationType application = FacesConfigFactory.eINSTANCE
-						.createApplicationType();
-				LocaleConfigType localeConfig = FacesConfigFactory.eINSTANCE
-						.createLocaleConfigType();
-				localeConfig.getSupportedLocale().add(obj);
-				application.getLocaleConfig().add(localeConfig);
-				command = AddCommand.create(getEditingDomain(), this.getPage()
-						.getInput(), null, application);
-			}
-
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-				if (needRefreshAll)
-					/** reset input for all the application sections. */
-					((OthersPage) this.getPage()).resetApplicationInput();
-			}
-		}
-
-	}
-
-	/**
-	 * when user click on the CheckboxTableViewer, perform some actions to
-	 * set/unset <default-locale> and <supported-locale> elements.
-	 * 
-	 * If an item is selected, that means it's a <default-locale>, otherwise
-	 * it's a <supported-locale>.
-	 * 
-	 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
-	 */
-	public void checkStateChanged(CheckStateChangedEvent event) {
-		boolean checked = event.getChecked();
-
-		if (event.getElement() == null) {
-			return;
-		}
-
-		EObject node = (EObject) event.getElement();
-		LocaleConfigType localeConfigType = (LocaleConfigType) ((ApplicationType) getInput())
-				.getLocaleConfig().get(0);
-		CompoundCommand compoundCommand = new CompoundCommand();
-
-		if (checked) {
-			/** user checked one item, going to set it as <default-locale>. */
-			if (localeConfigType.getDefaultLocale() != null) {
-				/**
-				 * Change the <default-locale> value to <supported-locale>.
-				 */
-				Command command = RemoveCommand.create(getEditingDomain(),
-						localeConfigType, null, localeConfigType
-								.getDefaultLocale());
-
-				compoundCommand.append(command);
-
-				SupportedLocaleType supportedLocale = FacesConfigFactory.eINSTANCE
-						.createSupportedLocaleType();
-				supportedLocale.setTextContent(localeConfigType
-						.getDefaultLocale().getTextContent());
-				command = AddCommand.create(getEditingDomain(),
-						localeConfigType, FacesConfigPackage.eINSTANCE
-								.getLocaleConfigType_SupportedLocale(),
-						supportedLocale);
-				compoundCommand.append(command);
-			}
-
-			/**
-			 * Change the selected item from <supported-locale> to
-			 * <default-locale>
-			 */
-			SupportedLocaleType supportedLocale = (SupportedLocaleType) node;
-			Command command = RemoveCommand.create(getEditingDomain(),
-					localeConfigType, FacesConfigPackage.eINSTANCE
-							.getLocaleConfigType_SupportedLocale(),
-					supportedLocale);
-			compoundCommand.append(command);
-
-			DefaultLocaleType defaultLocale = FacesConfigFactory.eINSTANCE
-					.createDefaultLocaleType();
-			defaultLocale.setTextContent(supportedLocale.getTextContent());
-			command = SetCommand
-					.create(getEditingDomain(), localeConfigType,
-							FacesConfigPackage.eINSTANCE
-									.getLocaleConfigType_DefaultLocale(),
-							defaultLocale);
-			compoundCommand.append(command);
-
-		} else {
-			/**
-			 * User unchecked one item, going to change it from <default-locale>
-			 * to <supported-locale>.
-			 */
-			DefaultLocaleType defaultLocale = (DefaultLocaleType) node;
-			Command command = RemoveCommand.create(getEditingDomain(),
-					localeConfigType, null, defaultLocale);
-			compoundCommand.append(command);
-
-			SupportedLocaleType supportedLocale = FacesConfigFactory.eINSTANCE
-					.createSupportedLocaleType();
-			supportedLocale.setTextContent(defaultLocale.getTextContent());
-			command = AddCommand.create(getEditingDomain(), localeConfigType,
-					null, supportedLocale);
-			compoundCommand.append(command);
-		}
-
-		if (compoundCommand.canExecute()) {
-			getEditingDomain().getCommandStack().execute(compoundCommand);
-			this.refresh();
-			setTableViewerCheckedState();
-		}
-	}
-
-	/**
-	 * Set the checked state for items in the checkbox table viewer. This method
-	 * could be used for refresh the checked state of the table viewer.
-	 */
-	private void setTableViewerCheckedState() {
-		if (getInput() instanceof ApplicationType) {
-			ApplicationType application = (ApplicationType) getInput();
-			if (application.getLocaleConfig().size() > 0) {
-
-				LocaleConfigType localeConfigType = (LocaleConfigType) application
-						.getLocaleConfig().get(0);
-				if (localeConfigType.getDefaultLocale() != null) {
-					((CheckboxTableViewer) getTableViewer()).setChecked(
-							localeConfigType.getDefaultLocale(), true);
-				}
-			}
-		}
-	}
-
-	@Override
-	protected void addAdaptersOntoInput(Object input) {
-		super.addAdaptersOntoInput(input);
-		if (input != null && input instanceof ApplicationType) {
-			ApplicationType application = (ApplicationType) input;
-			if (EcoreUtil.getExistingAdapter(application,
-					LocaleConfigSection.class) == null) {
-				application.eAdapters().add(getLocaleConfigAdapter());
-			}
-		}
-	}
-
-	private Adapter getLocaleConfigAdapter() {
-		if (_localeConfigAdapter == null) {
-			_localeConfigAdapter = new LocaleConfigAdapter();
-		}
-		return _localeConfigAdapter;
-	}
-
-	@Override
-	protected void removeAdaptersFromInput(Object input) {
-		if (input != null && input instanceof ApplicationType && _localeConfigAdapter != null) {
-			ApplicationType application = (ApplicationType) input;			
-			application.eAdapters().remove(_localeConfigAdapter);			
-		}
-		super.removeAdaptersFromInput(input);
-	}
-
-	/**
-	 * set the structuredViewer's input. Set the first LocaleConfig as input.
-	 * 
-	 * @param input
-	 */
-	protected void setViewerInput(Object input) {
-		if (input instanceof ApplicationType) {
-			ApplicationType application = (ApplicationType) input;
-			if (application.getLocaleConfig().size() > 0) {
-				tableViewer.setInput(application.getLocaleConfig().get(0));
-			} else
-				tableViewer.setInput(null);
-		} else
-			tableViewer.setInput(null);
-
-	}
-
-	public void refreshAll() {
-		super.refreshAll();
-		setTableViewerCheckedState();
-	}
-
-	/**
-	 * A listener that is be adapted on the input <application> element, to
-	 * listen the event that the first <locale-config> being created and
-	 * removed, then reset the input of the tabel viewer.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class LocaleConfigAdapter extends AdapterImpl {
-		public boolean isAdapterForType(Object type) {
-			if (type == LocaleConfigSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getApplicationType_LocaleConfig()) {
-					/**
-					 * a <locale-config> was created or removed, notify this
-					 * section to reset it's input.
-					 */
-					
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						setInput(getInput());
-					} else {							
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								setInput(getInput());
-							}
-						});
-					}
-
-				}
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanGeneralSection.java
deleted file mode 100644
index 6df0d53..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanGeneralSection.java
+++ /dev/null
@@ -1,330 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField mbNameField;
-
-	private ClassButtonDialogField mbClassField;
-
-	private ComboDialogField mbScopeField;
-
-	private ManagedBeanGeneralSectionAdapter managedBeanGeneralSectionAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ManagedBeanGeneralSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection().setText(
-				EditorMessages.ManagedBeanGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ManagedBeanGeneralSection_Desc);
-	}
-
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-
-		toolkit.paintBordersFor(container);
-
-		createMBNameEntry(container, toolkit, numberOfColumns);
-
-		createMBClassEntry(container, toolkit, numberOfColumns);
-
-		createMBScopeEntry(container, toolkit, numberOfColumns);
-
-	}
-
-	/**
-	 * create managed bean's name editing field
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createMBNameEntry(Composite container, FormToolkit toolkit,
-			int numberOfColumns) {
-		mbNameField = new StringDialogField();
-		mbNameField
-				.setLabelText(EditorMessages.ManagedBeanGeneralSection_ManagedBeanName);
-		mbNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(mbNameField.getTextControl(toolkit,
-				container));
-		mbNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String mbNameValue = ((StringDialogField) field)
-								.getText();
-						Command cmd = null;
-						ManagedBeanType managedBean = (ManagedBeanType) getInput();
-						// if (managedBean.getManagedBeanName() != null) {
-						// cmd = SetCommand
-						// .create(
-						// getEditingDomain(),
-						// managedBean.getManagedBeanName(),
-						// FacesConfigPackage.eINSTANCE
-						// .getManagedBeanNameType_TextContent(),
-						// mbNameValue);
-						// } else {
-						ManagedBeanNameType newManagedBeanName = FacesConfigFactory.eINSTANCE
-								.createManagedBeanNameType();
-						newManagedBeanName.setTextContent(mbNameValue);
-						cmd = SetCommand.create(getEditingDomain(),
-								managedBean, FacesConfigPackage.eINSTANCE
-										.getManagedBeanType_ManagedBeanName(),
-								newManagedBeanName);
-						// }
-						if (cmd.canExecute()) {
-							getEditingDomain().getCommandStack().execute(cmd);
-						}
-					}
-				});
-	}
-
-	/**
-	 * create managed bean's class field.
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createMBClassEntry(final Composite container,
-			final FormToolkit toolkit, int numberOfColumns) {
-		mbClassField = new ClassButtonDialogField(null);
-		mbClassField
-				.setLabelText(EditorMessages.ManagedBeanGeneralSection_ManagedBeanClass);
-		mbClassField.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		mbClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(mbClassField.getTextControl(toolkit,
-				container));
-
-		mbClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newValue = ((StringDialogField) field).getText();
-						Command cmd = null;
-						ManagedBeanType managedBean = (ManagedBeanType) getInput();
-						// if (managedBean.getManagedBeanClass() != null) {
-						// cmd = SetCommand
-						// .create(
-						// getEditingDomain(),
-						// managedBean.getManagedBeanClass(),
-						// FacesConfigPackage.eINSTANCE
-						// .getManagedBeanClassType_TextContent(),
-						// newValue);
-						// } else {
-						ManagedBeanClassType newManagedBeanClass = FacesConfigFactory.eINSTANCE
-								.createManagedBeanClassType();
-						newManagedBeanClass.setTextContent(newValue);
-						cmd = SetCommand.create(getEditingDomain(),
-								managedBean, FacesConfigPackage.eINSTANCE
-										.getManagedBeanType_ManagedBeanClass(),
-								newManagedBeanClass);
-						// }
-						if (cmd.canExecute()) {
-							getEditingDomain().getCommandStack().execute(cmd);
-						}
-					}
-				});
-	}
-
-	/**
-	 * create managed bean's scope field
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createMBScopeEntry(Composite container, FormToolkit toolkit,
-			int numberOfColumns) {
-		mbScopeField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
-		mbScopeField
-				.setLabelText(EditorMessages.ManagedBeanGeneralSection_ManagedBeanScope);
-		mbScopeField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(mbScopeField.getComboControl(toolkit,
-				container));
-
-		mbScopeField.setItems(ManagedBeanScopeTreeItem.scopeItems);
-
-		mbScopeField
-				.setDialogFieldChangeListener(new IDialogFieldChangeListener() {
-					public void dialogFieldChanged(DialogField field) {
-						String newValue = ((ComboDialogField) field).getText();
-						Command cmd = null;
-						ManagedBeanType managedBean = (ManagedBeanType) getInput();
-						// if (managedBean.getManagedBeanScope() != null) {
-						// cmd = SetCommand
-						// .create(
-						// getEditingDomain(),
-						// managedBean.getManagedBeanScope(),
-						// FacesConfigPackage.eINSTANCE
-						// .getManagedBeanScopeType_TextContent(),
-						// newValue);
-						// } else {
-						ManagedBeanScopeType newManagedBeanScope = FacesConfigFactory.eINSTANCE
-								.createManagedBeanScopeType();
-						newManagedBeanScope.setTextContent(newValue);
-						cmd = SetCommand.create(getEditingDomain(),
-								managedBean, FacesConfigPackage.eINSTANCE
-										.getManagedBeanType_ManagedBeanScope(),
-								newManagedBeanScope);
-						// }
-						if (cmd.canExecute()) {
-							getEditingDomain().getCommandStack().execute(cmd);
-						}
-					}
-				});
-	}
-
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ManagedBeanType) {
-			final ManagedBeanType component = (ManagedBeanType) input;
-			refreshControls(component);
-		}
-	}
-
-	private void refreshControls(ManagedBeanType component) {
-		if (component.getManagedBeanName() != null) {
-			mbNameField.setTextWithoutUpdate(component.getManagedBeanName()
-					.getTextContent());
-		} else {
-			mbNameField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (component.getManagedBeanClass() != null) {
-			mbClassField.setTextWithoutUpdate(component
-					.getManagedBeanClass().getTextContent());
-		} else {
-			mbClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (component.getManagedBeanScope() != null) {
-			mbScopeField.setTextWithoutUpdate(component
-					.getManagedBeanScope().getTextContent());
-		} else {
-			// defaultly set it's scope to "session";
-			mbScopeField
-					.setTextWithoutUpdate(IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION);
-		}
-	
-	}
-	protected void addAdaptersOntoInput(Object newInput) {
-		super.addAdaptersOntoInput(newInput);
-		ManagedBeanType managedBean = (ManagedBeanType) newInput;
-		if (EcoreUtil.getExistingAdapter(managedBean,
-				ManagedBeanGeneralSection.class) == null) {
-			managedBean.eAdapters().add(getManagedBeanGeneralSectionAdatper());
-		}
-
-	}
-
-	protected void removeAdaptersFromInput(Object oldInput) {
-		super.removeAdaptersFromInput(oldInput);
-		ManagedBeanType managedBean = (ManagedBeanType) oldInput;
-		if (EcoreUtil.getExistingAdapter(managedBean,
-				ManagedBeanGeneralSection.class) != null) {
-			managedBean.eAdapters().remove(
-					getManagedBeanGeneralSectionAdatper());
-		}
-	}
-
-	private ManagedBeanGeneralSectionAdapter getManagedBeanGeneralSectionAdatper() {
-		if (managedBeanGeneralSectionAdapter == null) {
-			managedBeanGeneralSectionAdapter = new ManagedBeanGeneralSectionAdapter();
-		}
-		return managedBeanGeneralSectionAdapter;
-	}
-
-	class ManagedBeanGeneralSectionAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-
-			if (type == ManagedBeanGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getManagedBeanType_ManagedBeanName()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ManagedBeanClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_ManagedBeanScope()) {
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refresh();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								refresh();
-							}
-						});
-					}
-				}
-			}
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanMasterSection.java
deleted file mode 100644
index 5d67eb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanMasterSection.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.jst.jsf.facesconfig.ui.provider.ManagedBeanContentProvider;
-import org.eclipse.jst.jsf.facesconfig.ui.provider.ManagedBeanLabelProvider;
-import org.eclipse.jst.jsf.facesconfig.ui.wizard.NewManagedBeanWizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- */
-public class ManagedBeanMasterSection extends FacesConfigMasterSection {
-
-	private ManagedBeanMasterSectionAdapter managedBeanMasterSectionAdapter;
-
-	/**
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ManagedBeanMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ManagedBeanMasterSection_Name);
-		getSection().setDescription(
-				EditorMessages.ManagedBeanMasterSection_Description);
-	}
-
-	protected StructuredViewer createViewer(Composite parent,
-			FormToolkit toolkit) {
-		Composite treeContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(treeContainer);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		treeContainer.setLayoutData(gd);
-		GridLayout layout = new GridLayout();
-		treeContainer.setLayout(layout);
-
-		// Create tree viewer
-		TreeViewer treeViewer = new TreeViewer(treeContainer, SWT.SINGLE
-				| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		treeViewer.getControl().setLayoutData(gd);
-
-		treeViewer.setContentProvider(new ManagedBeanContentProvider());
-		treeViewer.setLabelProvider(new ManagedBeanLabelProvider());
-		treeViewer.addSelectionChangedListener(this);
-
-		treeViewer.setAutoExpandLevel(3);
-		return treeViewer;
-	}
-
-	protected void addButtonSelected(SelectionEvent e) {
-		IProject project = (IProject) this.getPage().getEditor().getAdapter(
-				IProject.class);
-
-		NewManagedBeanWizard wizard = new NewManagedBeanWizard(project);
-		IStructuredSelection selection = (IStructuredSelection) this
-				.getSelection();
-		if (selection.getFirstElement() instanceof ManagedBeanScopeTreeItem) {
-			// if user is selecting a scope tree item, then use this scope as
-			// the default scope for the new managed bean.
-			ManagedBeanScopeTreeItem scopeTreeItem = (ManagedBeanScopeTreeItem) selection
-					.getFirstElement();
-			wizard.setDefaultScope(scopeTreeItem.getScope());
-		}
-
-		wizard.setForcePreviousAndNextButtons(true);
-
-		Shell shell = EditorPlugin.getActiveShell();
-		WizardDialog wizardDialog = new WizardDialog(shell, wizard);
-		wizardDialog.create();
-		wizardDialog.setBlockOnOpen(true);
-		if (wizardDialog.open() == Window.OK) {
-			ManagedBeanType managedBean = FacesConfigFactory.eINSTANCE
-					.createManagedBeanType();
-
-			ManagedBeanNameType name = FacesConfigFactory.eINSTANCE
-					.createManagedBeanNameType();
-			name.setTextContent(wizard.getManagedBeanName());
-			managedBean.setManagedBeanName(name);
-
-			ManagedBeanClassType clazz = FacesConfigFactory.eINSTANCE
-					.createManagedBeanClassType();
-			clazz.setTextContent(wizard.getManagedBeanClass());
-			managedBean.setManagedBeanClass(clazz);
-
-			ManagedBeanScopeType scope = FacesConfigFactory.eINSTANCE
-					.createManagedBeanScopeType();
-			scope.setTextContent(wizard.getManagedBeanScope());
-			managedBean.setManagedBeanScope(scope);
-
-			String desc = wizard.getManagedBeanDescription();
-			if (desc != null && desc.trim().length() > 0) {
-				DescriptionType description = FacesConfigFactory.eINSTANCE
-						.createDescriptionType();
-				description.setTextContent(wizard.getManagedBeanDescription());
-				managedBean.getDescription().add(description);
-			}
-
-			Command cmd = AddCommand.create(getEditingDomain(), getInput(),
-					null, managedBean);
-			if (cmd.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(cmd);
-			}
-		}
-
-	}
-
-	protected void removeButtonSelected(SelectionEvent e) {
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			if (ssel.getFirstElement() instanceof ManagedBeanType) {
-				ManagedBeanType element = (ManagedBeanType) ssel
-						.getFirstElement();
-				Command command = RemoveCommand.create(getEditingDomain(), this
-						.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_ManagedBean(), element);
-				if (command.canExecute()) {
-					getEditingDomain().getCommandStack().execute(command);
-				}
-			}
-		}
-	}
-
-	protected void updateButtons() {
-		IStructuredSelection ssel = (IStructuredSelection) getStructuredViewer()
-				.getSelection();
-		boolean isRemoveEnable = false;
-		if (!ssel.isEmpty()) {
-			Object s1 = ssel.getFirstElement();
-			if (s1 instanceof ManagedBeanType) {
-				isRemoveEnable = true;
-			}
-		}
-		getRemoveButton().setEnabled(isRemoveEnable);
-	}
-
-	/**
-	 * Override the super method to ignore the selection on ScopeTreeItem.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-
-		if (event != null
-				&& event.getSelection() != null
-				&& ((IStructuredSelection) event.getSelection())
-						.getFirstElement() instanceof ManagedBeanScopeTreeItem) {
-
-			event = new SelectionChangedEvent(this, StructuredSelection.EMPTY);
-		}
-		super.selectionChanged(event);
-		updateButtons();
-
-	}
-
-	protected void addAdaptersOntoInput(Object newInput) {
-		super.addAdaptersOntoInput(newInput);
-
-		FacesConfigType facesConfig = (FacesConfigType) newInput;
-		if (EcoreUtil.getExistingAdapter(facesConfig,
-				ManagedBeanMasterSection.class) == null) {
-
-			facesConfig.eAdapters().add(getManagedBeanMasterSectionAdapter());
-		}
-
-		List managedbeans = facesConfig.getManagedBean();
-		for (Iterator it = managedbeans.iterator(); it.hasNext();) {
-			ManagedBeanType managedbean = (ManagedBeanType) it.next();
-			if (EcoreUtil.getExistingAdapter(managedbean,
-					ManagedBeanMasterSection.class) == null) {
-
-				managedbean.eAdapters().add(
-						getManagedBeanMasterSectionAdapter());
-			}
-		}
-	}
-
-	protected void removeAdaptersFromInput(Object oldInput) {		
-		FacesConfigType facesConfig = (FacesConfigType) oldInput;
-		if (EcoreUtil.getExistingAdapter(facesConfig,
-				ManagedBeanMasterSection.class) != null) {
-
-			facesConfig.eAdapters()
-					.remove(getManagedBeanMasterSectionAdapter());
-		}
-
-		List managedbeans = facesConfig.getManagedBean();
-		for (Iterator it = managedbeans.iterator(); it.hasNext();) {
-			ManagedBeanType managedbean = (ManagedBeanType) it.next();
-			if (EcoreUtil.getExistingAdapter(managedbean,
-					ManagedBeanMasterSection.class) != null) {
-
-				managedbean.eAdapters().remove(
-						getManagedBeanMasterSectionAdapter());
-			}
-		}
-		super.removeAdaptersFromInput(oldInput);
-	}
-
-	private ManagedBeanMasterSectionAdapter getManagedBeanMasterSectionAdapter() {
-		if (managedBeanMasterSectionAdapter == null) {
-			managedBeanMasterSectionAdapter = new ManagedBeanMasterSectionAdapter();
-		}
-		return managedBeanMasterSectionAdapter;
-	}
-
-	class ManagedBeanMasterSectionAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ManagedBeanMasterSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-			super.notifyChanged(msg);
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFacesConfigType_ManagedBean()) {
-				if (msg.getEventType() == Notification.ADD) {
-					final EObject mbean = (EObject) msg.getNewValue();
-					if (EcoreUtil.getExistingAdapter(mbean,
-							ManagedBeanMasterSection.class) == null) {
-
-						mbean.eAdapters().add(
-								getManagedBeanMasterSectionAdapter());
-					}
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						getStructuredViewer().refresh(true);
-						IStructuredSelection selection = new StructuredSelection(
-								mbean);
-						getStructuredViewer().setSelection(selection);
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								getStructuredViewer().refresh(true);
-								IStructuredSelection selection = new StructuredSelection(
-										mbean);
-								getStructuredViewer().setSelection(selection);
-							}
-						});
-					}
-				} else if (msg.getEventType() == Notification.REMOVE) {
-					final EObject mbean = (EObject) msg.getOldValue();
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						getStructuredViewer().refresh(true);
-						if (EcoreUtil.getExistingAdapter(mbean,
-								ManagedBeanMasterSection.class) == null) {
-				
-								mbean.eAdapters().remove(
-										getManagedBeanMasterSectionAdapter());
-							}
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								getStructuredViewer().refresh(true);
-								if (EcoreUtil.getExistingAdapter(mbean,
-										ManagedBeanMasterSection.class) == null) {
-						
-										mbean.eAdapters().remove(
-												getManagedBeanMasterSectionAdapter());
-									}
-							}
-						});
-					}
-
-				} else if (msg.getEventType() == Notification.SET) {
-					final Object mbean = msg.getNewValue();
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						getStructuredViewer().refresh(mbean, true);
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							getStructuredViewer().refresh(mbean, true);
-						}
-					});
-				}
-			}
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getManagedBeanType_ManagedBeanClass()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getManagedBeanType_ManagedBeanName()) {
-
-				final Object bean = msg.getNotifier();
-				if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-					getStructuredViewer().refresh(bean, true);
-				} else {
-					PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							getStructuredViewer().refresh(bean, true);
-						}	
-					});
-				}
-				
-
-			} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getManagedBeanType_ManagedBeanScope()) {
-
-				final Object mbean = msg.getNotifier();
-				if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-					getStructuredViewer().refresh();
-					IStructuredSelection selection = new StructuredSelection(
-							mbean);
-					getStructuredViewer().setSelection(selection);
-				} else {	
-					PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							getStructuredViewer().refresh();
-							IStructuredSelection selection = new StructuredSelection(
-									mbean);
-							getStructuredViewer().setSelection(selection);
-						}
-					});
-				}				
-			}
-		}
-	}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java
deleted file mode 100644
index 4101d9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanScopeTreeItem.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-
-/**
- * @author Xiao-guang Zhang, sfshi
- * @version
- */
-public class ManagedBeanScopeTreeItem {
-
-	/**
-	 * Possible values for bean scope
-	 */
-	public static final String[] scopeItems = {
-			IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION,
-			IFacesConfigConstants.MANAGED_BEAN_SCOPE_REQUEST,
-			IFacesConfigConstants.MANAGED_BEAN_SCOPE_APPLICATION,
-			IFacesConfigConstants.MANAGED_BEAN_SCOPE_NONE };
-
-	private String scope;
-
-	private FacesConfigType facesConfig;
-
-	/**
-	 * 
-	 * @param managedBeanScope
-	 * @param facesConfig
-	 */
-	public ManagedBeanScopeTreeItem(String managedBeanScope,
-			FacesConfigType facesConfig) {
-		super();
-		this.scope = managedBeanScope;
-
-		this.facesConfig = facesConfig;
-	}
-
-	/**
-	 * @return the parent object
-	 */
-	public Object getParent() {
-		return facesConfig;
-	}
-
-	/**
-	 * @return true if this node has children
-	 */
-	public boolean hasChildren() {
-		return !getChildren().isEmpty();
-	}
-
-	/**
-	 * @return the scope
-	 */
-	public String getScope() {
-		return scope;
-	}
-
-	/**
-	 * @return the list of children.  List may be empty.
-	 */
-	public List getChildren() {
-		List result = new ArrayList();
-		List managedBeans = facesConfig.getManagedBean();
-		for (Iterator it = managedBeans.iterator(); it.hasNext();) {
-			ManagedBeanType managedBean = (ManagedBeanType) it.next();
-
-			if (managedBean.getManagedBeanScope() != null) {
-				if (scope.equals(managedBean.getManagedBeanScope()
-						.getTextContent())) {
-					result.add(managedBean);
-				}
-			}
-		}
-
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedPropertyEditGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedPropertyEditGroup.java
deleted file mode 100644
index c0112a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedPropertyEditGroup.java
+++ /dev/null
@@ -1,575 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditManagedPropertyDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * @version
- */
-public class ManagedPropertyEditGroup extends DialogFieldGroup implements
-		IDialogFieldGroup, ISelectionProvider, ISelectionChangedListener {
-
-	private TableViewer tableViewer;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private ManagedBeanType managedBean;
-
-	private AbstractFacesConfigSection section;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/**
-	 * @param section 
-	 * 
-	 */
-	public ManagedPropertyEditGroup(AbstractFacesConfigSection section) {
-		super();
-		this.section = section;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		// do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		createGeneralClassPage(parent, toolkit);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/**
-	 * create general class initialization section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createGeneralClassPage(Composite container, FormToolkit toolkit) {
-		Composite generalSection = toolkit.createComposite(container);
-		generalSection.setLayoutData(new GridData(GridData.FILL_BOTH));
-		toolkit.paintBordersFor(generalSection);
-
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		generalSection.setLayout(gl);
-
-		createTableSection(generalSection, toolkit);
-
-		createButtonsSection(generalSection, toolkit);
-	}
-
-	/**
-	 * create proeprty table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		// create property container
-		Composite propertyContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		propertyContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(propertyContainer);
-
-		GridLayout gl = new GridLayout();
-		propertyContainer.setLayout(gl);
-
-		// Create property table
-		Table table = new Table(propertyContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableColumn propertyCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		propertyCol
-				.setText(EditorMessages.InitializationSection_PropertyTable_Name);
-		propertyCol.setResizable(true);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol
-				.setText(EditorMessages.InitializationSection_PropertyTable_Class);
-		classCol.setResizable(true);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.InitializationSection_PropertyTable_Value);
-		valueCol.setResizable(true);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				section.getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(section
-				.getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getManagedPropertyType()
-						.isInstance(element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create property's editing buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		// create list operation buttons
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more, SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-
-	}
-
-	private void addButtonSelected() {
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditManagedPropertyDialog dialog = new AddEditManagedPropertyDialog(
-				shell, managedBean, section);
-		if (dialog.open() == Dialog.OK) {
-
-			ManagedPropertyType managedProperty = createManagedPropertyFromDialog(dialog);
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), FacesConfigPackage.eINSTANCE
-							.getManagedBeanType_ManagedProperty(),
-					managedProperty);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	private void editButtonSelected() {
-		ManagedPropertyType managedProperty = (ManagedPropertyType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		Shell shell = EditorPlugin.getActiveShell();
-		AddEditManagedPropertyDialog dialog = new AddEditManagedPropertyDialog(
-				shell, managedProperty, section);
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList();
-			String propertyName = dialog.getPropertyName();
-			String propertyClass = dialog.getPropertyClass();
-			PropertyNameType propertyNameType = FacesConfigFactory.eINSTANCE
-					.createPropertyNameType();
-			propertyNameType.setTextContent(propertyName);
-			Command cmd1 = SetCommand.create(this.getEditingDomain(),
-					managedProperty, FacesConfigPackage.eINSTANCE
-							.getManagedPropertyType_PropertyName(),
-					propertyNameType);
-			commands.add(cmd1);
-
-			PropertyClassType propertyClassType = FacesConfigFactory.eINSTANCE
-					.createPropertyClassType();
-			propertyClassType.setTextContent(propertyClass);
-			Command cmd2 = SetCommand.create(this.getEditingDomain(),
-					managedProperty, FacesConfigPackage.eINSTANCE
-							.getManagedPropertyType_PropertyClass(),
-					propertyClassType);
-			commands.add(cmd2);
-
-			// remove value, null-value, map-entries and list-entries element:
-			if (managedProperty.getNullValue() != null) {
-				Command rmCmd = SetCommand.create(this.getEditingDomain(),
-						managedProperty, FacesConfigPackage.eINSTANCE
-								.getManagedPropertyType_NullValue(),
-						SetCommand.UNSET_VALUE);
-				commands.add(rmCmd);
-			}
-			if (managedProperty.getListEntries() != null) {
-				Command rmCmd = SetCommand.create(this.getEditingDomain(),
-						managedProperty, FacesConfigPackage.eINSTANCE
-								.getManagedPropertyType_ListEntries(),
-						SetCommand.UNSET_VALUE);
-				commands.add(rmCmd);
-			}
-			if (managedProperty.getValue() != null) {
-				Command rmCmd = SetCommand.create(this.getEditingDomain(),
-						managedProperty, FacesConfigPackage.eINSTANCE
-								.getManagedPropertyType_Value(),
-						SetCommand.UNSET_VALUE);
-				commands.add(rmCmd);
-			}
-			if (managedProperty.getMapEntries() != null) {
-				Command rmCmd = SetCommand.create(this.getEditingDomain(),
-						managedProperty, FacesConfigPackage.eINSTANCE
-								.getManagedPropertyType_MapEntries(),
-						SetCommand.UNSET_VALUE);
-				commands.add(rmCmd);
-			}
-
-			Object valueObject = dialog.getValueObject();
-			if (valueObject != null) {
-				String valueType = dialog.getValueType();
-				if (valueType.equals(IFacesConfigConstants.VALUE)) {
-
-					ValueType value = FacesConfigFactory.eINSTANCE
-							.createValueType();
-					value.setTextContent((String) valueObject);
-					managedProperty.setValue(value);
-					Command cmd3 = SetCommand.create(this.getEditingDomain(),
-							managedProperty, FacesConfigPackage.eINSTANCE
-									.getManagedPropertyType_Value(), value);
-					commands.add(cmd3);
-
-				} else if (valueType.equals(IFacesConfigConstants.MAP_ENTRIES)) {
-
-					MapEntriesType mapEntriesType = (MapEntriesType) valueObject;
-					Command cmd3 = SetCommand.create(this.getEditingDomain(),
-							managedProperty, FacesConfigPackage.eINSTANCE
-									.getManagedPropertyType_MapEntries(),
-							mapEntriesType);
-					commands.add(cmd3);
-				} else if (valueType.equals(IFacesConfigConstants.LIST_ENTRIES)) {
-
-					ListEntriesType listEntriesType = (ListEntriesType) valueObject;
-					Command cmd3 = SetCommand.create(this.getEditingDomain(),
-							managedProperty, FacesConfigPackage.eINSTANCE
-									.getManagedPropertyType_ListEntries(),
-							listEntriesType);
-					commands.add(cmd3);
-				} else if (valueType.equals(IFacesConfigConstants.NULL_VALUE)) {
-
-					NullValueType nullValue = (NullValueType) valueObject;
-					Command cmd3 = SetCommand.create(this.getEditingDomain(),
-							managedProperty, FacesConfigPackage.eINSTANCE
-									.getManagedPropertyType_NullValue(),
-							nullValue);
-					commands.add(cmd3);
-				}
-			}
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-			}
-		}
-	}
-
-	private ManagedPropertyType createManagedPropertyFromDialog(
-			AddEditManagedPropertyDialog dialog) {
-
-		String propertyName = dialog.getPropertyName();
-		String propertyClass = dialog.getPropertyClass();
-
-		ManagedPropertyType managedProperty = FacesConfigFactory.eINSTANCE
-				.createManagedPropertyType();
-		PropertyNameType propertyNameType = FacesConfigFactory.eINSTANCE
-				.createPropertyNameType();
-		propertyNameType.setTextContent(propertyName);
-		PropertyClassType propertyClassType = FacesConfigFactory.eINSTANCE
-				.createPropertyClassType();
-		propertyClassType.setTextContent(propertyClass);
-		managedProperty.setPropertyName(propertyNameType);
-		managedProperty.setPropertyClass(propertyClassType);
-
-		Object valueObject = dialog.getValueObject();
-		if (valueObject != null) {
-			String valueType = dialog.getValueType();
-			if (valueType.equals(IFacesConfigConstants.VALUE)) {
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent((String) valueObject);
-				managedProperty.setValue(value);
-			} else if (valueType.equals(IFacesConfigConstants.MAP_ENTRIES)) {
-				MapEntriesType mapEntriesType = (MapEntriesType) dialog
-						.getValueObject();
-				managedProperty.setMapEntries(mapEntriesType);
-			} else if (valueType.equals(IFacesConfigConstants.LIST_ENTRIES)) {
-				ListEntriesType listEntriesType = (ListEntriesType) dialog
-						.getValueObject();
-				managedProperty.setListEntries(listEntriesType);
-			} else if (valueType.equals(IFacesConfigConstants.NULL_VALUE)) {
-				NullValueType nullValue = (NullValueType) dialog
-						.getValueObject();
-				managedProperty.setNullValue(nullValue);
-			}
-		}
-		return managedProperty;
-	}
-
-	private void removeButtonSelected() {
-		ManagedPropertyType managedProperty = (ManagedPropertyType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		Assert.isNotNull(managedProperty);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getManagedBeanType_ManagedProperty(), managedProperty);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-	}
-
-	public void setInput(Object newInput) {
-		if (newInput != null && newInput instanceof ManagedBeanType) {
-			managedBean = (ManagedBeanType) newInput;
-			refreshAll();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	public Object getInput() {
-		return managedBean;
-	}
-
-	private EditingDomain getEditingDomain() {
-		return section.getEditingDomain();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-		// do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/MapEntriesEditGroup.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/MapEntriesEditGroup.java
deleted file mode 100644
index e5a41b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/MapEntriesEditGroup.java
+++ /dev/null
@@ -1,692 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldBase;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditMapEntryDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * MapEntries Editing DialogFieldGroup
- * 
- * @author sfshi
- * @version
- */
-public class MapEntriesEditGroup extends DialogFieldGroup implements
-		IDialogFieldGroup, ISelectionProvider, ISelectionChangedListener {
-	private ClassButtonDialogField keyClassField;
-
-	private ClassButtonDialogField valueClassField;
-
-	private TableViewer tableViewer;
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private IProject currentProject;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	private ManagedBeanType managedBean;
-
-	private AbstractFacesConfigSection section;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	/**
-	 * @param section 
-	 */
-	public MapEntriesEditGroup(AbstractFacesConfigSection section) {
-		super();
-		this.section = section;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-        // TODO: initialize?
-	}
-
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		GridData data = new GridData(GridData.FILL_BOTH);
-		parent.setLayoutData(data);
-
-		GridLayout gl = new GridLayout();
-		gl.verticalSpacing = 0;
-		gl.marginHeight = 0;
-		parent.setLayout(gl);
-
-		layoutMapTypeSelectionSection(toolkit, parent);
-
-		createAndLayoutMapValueSection(toolkit, parent);
-	}
-
-	/**
-	 * 
-	 */
-	private void layoutMapTypeSelectionSection(FormToolkit toolkit,
-			Composite container) {
-
-		Composite typeSelectionSection = null;
-		if (toolkit != null) {
-			typeSelectionSection = toolkit.createComposite(container);
-			toolkit.paintBordersFor(typeSelectionSection);
-		} else {
-			typeSelectionSection = SWTUtils
-					.createComposite(container, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		typeSelectionSection.setLayoutData(gd);
-
-		int numberOfColumns = 4;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		typeSelectionSection.setLayout(gl);
-		keyClassField = new ClassButtonDialogField(getProject());
-		keyClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_KeyClass);
-		keyClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						ManagedBeanType managedBean1 = (ManagedBeanType) getInput();
-						String className = ((ClassButtonDialogField) field)
-								.getText();
-						KeyClassType keyClass = FacesConfigFactory.eINSTANCE
-								.createKeyClassType();
-						keyClass.setTextContent(className);
-						EditingDomain editingDomain = section
-								.getEditingDomain();
-						Command cmd;
-						boolean isNew;
-						if (managedBean1.getMapEntries() == null) {
-							isNew = true;
-							MapEntriesType mapEntries = FacesConfigFactory.eINSTANCE
-									.createMapEntriesType();
-							mapEntries.setKeyClass(keyClass);
-							cmd = SetCommand.create(editingDomain, managedBean1,
-									FacesConfigPackage.eINSTANCE
-											.getManagedBeanType_MapEntries(),
-									mapEntries);
-						} else {
-							isNew = false;
-							cmd = SetCommand.create(editingDomain, managedBean1
-									.getMapEntries(),
-									FacesConfigPackage.eINSTANCE
-											.getMapEntriesType_KeyClass(),
-									keyClass);
-						}
-
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-							if (isNew)
-								refreshAll();
-						}
-
-					}
-				});
-
-		valueClassField = new ClassButtonDialogField(getProject());
-
-		valueClassField
-				.setLabelText(EditorMessages.InitializationSection_MapType_ValueClass);
-		valueClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						ManagedBeanType managedBean1 = (ManagedBeanType) getInput();
-						String className = ((ClassButtonDialogField) field)
-								.getText();
-						ValueClassType valueClass = FacesConfigFactory.eINSTANCE
-								.createValueClassType();
-						valueClass.setTextContent(className);
-						EditingDomain editingDomain = section
-								.getEditingDomain();
-						Command cmd;
-						boolean isNew;
-						if (managedBean1.getMapEntries() == null) {
-							isNew = true;
-							MapEntriesType mapEntries = FacesConfigFactory.eINSTANCE
-									.createMapEntriesType();
-							mapEntries.setValueClass(valueClass);
-							cmd = SetCommand.create(editingDomain, managedBean1,
-									FacesConfigPackage.eINSTANCE
-											.getManagedBeanType_MapEntries(),
-									mapEntries);
-						} else {
-							isNew = false;
-							cmd = SetCommand.create(editingDomain, managedBean1
-									.getMapEntries(),
-									FacesConfigPackage.eINSTANCE
-											.getMapEntriesType_ValueClass(),
-									valueClass);
-						}
-
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-							if (isNew)
-								refreshAll();
-						}
-
-					}
-				});
-
-		keyClassField.doFillIntoGrid(toolkit, typeSelectionSection,
-				numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(keyClassField.getTextControl(toolkit,
-				container));
-
-		valueClassField.doFillIntoGrid(toolkit, typeSelectionSection,
-				numberOfColumns);
-	}
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 */
-	private void createAndLayoutMapValueSection(FormToolkit toolkit,
-			Composite parent) {
-		Composite mapValueSection = null;
-		if (toolkit != null) {
-			mapValueSection = toolkit.createComposite(parent);
-			toolkit.paintBordersFor(mapValueSection);
-		} else {
-			mapValueSection = SWTUtils.createComposite(parent, SWT.NONE);
-		}
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		mapValueSection.setLayoutData(gd);
-
-		int numberOfColumns = 3;
-		GridLayout gl = new GridLayout(numberOfColumns, false);
-		mapValueSection.setLayout(gl);
-		DialogField valuesTitle = new DialogFieldBase();
-		valuesTitle
-				.setLabelText(EditorMessages.InitializationSection_MapTable_Title);    
-
-		valuesTitle.doFillIntoGrid(toolkit, mapValueSection, numberOfColumns);
-		Table table;
-		if (toolkit == null) {
-			table = new Table(mapValueSection, SWT.FULL_SELECTION
-					| SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		} else {
-			table = new Table(mapValueSection, SWT.H_SCROLL | SWT.V_SCROLL
-					| SWT.FULL_SELECTION | SWT.BORDER);
-		}
-
-		table.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-
-			}
-		});
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn keyCol = new TableColumn(table, SWT.NONE);
-		keyCol.setText(EditorMessages.InitializationSection_MapTable_Key);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		keyCol.setResizable(true);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol.setText(EditorMessages.InitializationSection_MapTable_Value);
-		valueCol.setResizable(true);
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				section.getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(section
-				.getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getMapEntryType()
-						.isInstance(element);
-			}
-		});
-
-		tableViewer.addSelectionChangedListener(this);
-
-		Composite operationContainer = null;
-		if (toolkit != null) {
-			operationContainer = toolkit.createComposite(mapValueSection);
-		} else {
-			operationContainer = SWTUtils.createComposite(mapValueSection,
-					SWT.NONE);
-		}
-		gd = new GridData(GridData.FILL_VERTICAL);
-		operationContainer.setLayoutData(gd);
-		gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = null;
-		if (toolkit != null) {
-			addButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Add_more,
-					SWT.PUSH);
-		} else {
-			addButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Add_more);
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		if (toolkit != null) {
-			editButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more, SWT.PUSH);
-		} else {
-			editButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Edit_more);
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		if (toolkit != null) {
-			removeButton = toolkit.createButton(operationContainer,
-					EditorMessages.UI_Button_Remove,
-					SWT.PUSH);
-		} else {
-			removeButton = SWTUtils.createPushButton(operationContainer,
-					EditorMessages.UI_Button_Remove);
-		}
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-		});
-	}
-
-	private void addButtonSelected() {
-		AddEditMapEntryDialog dialog = new AddEditMapEntryDialog(EditorPlugin
-				.getActiveShell(), true);
-		if (dialog.open() == Dialog.OK) {
-			MapEntryType mapEntry = FacesConfigFactory.eINSTANCE
-					.createMapEntryType();
-			if (dialog.getKey() != null) {
-				KeyType key = FacesConfigFactory.eINSTANCE.createKeyType();
-				key.setTextContent(dialog.getKey());
-				mapEntry.setKey(key);
-			}
-			if (dialog.isNullValue()) {
-				NullValueType nullValue = FacesConfigFactory.eINSTANCE
-						.createNullValueType();
-				mapEntry.setNullValue(nullValue);
-			} else {
-				ValueType value = FacesConfigFactory.eINSTANCE
-						.createValueType();
-				value.setTextContent(dialog.getValue());
-				mapEntry.setValue(value);
-			}
-
-			EditingDomain editingDomain = section.getEditingDomain();
-			Command command;
-			boolean isNewMapEntries = false;
-			if (managedBean.getMapEntries() == null) {
-				MapEntriesType mapEntriesType = FacesConfigFactory.eINSTANCE
-						.createMapEntriesType();
-				mapEntriesType.getMapEntry().add(mapEntry);
-				command = SetCommand.create(editingDomain, managedBean,
-						FacesConfigPackage.eINSTANCE
-								.getManagedBeanType_MapEntries(),
-						mapEntriesType);
-				isNewMapEntries = true;
-			} else {
-				MapEntriesType mapEntries = managedBean.getMapEntries();
-
-				command = AddCommand.create(editingDomain, mapEntries,
-						FacesConfigPackage.eINSTANCE
-								.getMapEntriesType_MapEntry(), mapEntry);
-			}
-
-			if (command.canExecute()) {
-				editingDomain.getCommandStack().execute(command);
-				if (isNewMapEntries)
-					refreshAll();
-			}
-
-		}
-	}
-
-	private void editButtonSelected() {
-		if (tableViewer.getSelection() == null
-				|| ((IStructuredSelection) tableViewer.getSelection())
-						.isEmpty()) {
-			return;
-		}
-		MapEntryType mapEntry = (MapEntryType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		AddEditMapEntryDialog dialog = new AddEditMapEntryDialog(EditorPlugin
-				.getActiveShell(), false);
-		if (mapEntry.getKey() != null)
-			dialog.setKey(mapEntry.getKey().getTextContent());
-		if (mapEntry.getNullValue() != null)
-			dialog.setNullValue(true);
-		else if (mapEntry.getValue() != null)
-			dialog.setValue(mapEntry.getValue().getTextContent());
-
-		if (dialog.open() == Dialog.OK) {
-			EditingDomain editingDomain = section.getEditingDomain();
-			List commands = new ArrayList();
-
-			if (mapEntry.getKey() != null) {
-				Command cmd1 = SetCommand.create(editingDomain, mapEntry
-						.getKey(), FacesConfigPackage.eINSTANCE
-						.getKeyType_TextContent(), dialog.getKey());
-				commands.add(cmd1);
-
-			} else {
-				KeyType keyType = FacesConfigFactory.eINSTANCE.createKeyType();
-				keyType.setTextContent(dialog.getKey());
-				Command cmd2 = SetCommand.create(editingDomain, mapEntry,
-						FacesConfigPackage.eINSTANCE.getMapEntryType_Key(),
-						keyType);
-				commands.add(cmd2);
-			}
-
-			if (dialog.isNullValue()) {
-				if (mapEntry.getValue() != null) {
-					Command cmd3 = SetCommand.create(editingDomain, mapEntry,
-							FacesConfigPackage.eINSTANCE
-									.getMapEntryType_Value(),
-							SetCommand.UNSET_VALUE);
-					commands.add(cmd3);
-				}
-				Command cmd4 = SetCommand.create(editingDomain, mapEntry,
-						FacesConfigPackage.eINSTANCE
-								.getMapEntryType_NullValue(),
-						FacesConfigFactory.eINSTANCE.createNullValueType());
-
-				commands.add(cmd4);
-			} else {
-				if (mapEntry.getNullValue() != null) {
-					Command cmd5 = SetCommand.create(editingDomain, mapEntry,
-							FacesConfigPackage.eINSTANCE
-									.getMapEntryType_NullValue(),
-							SetCommand.UNSET_VALUE);
-					commands.add(cmd5);
-				}
-
-				if (mapEntry.getValue() != null) {
-					Command cmd6 = SetCommand.create(editingDomain, mapEntry
-							.getValue(), FacesConfigPackage.eINSTANCE
-							.getValueType_TextContent(), dialog.getValue());
-					commands.add(cmd6);
-				} else {
-					ValueType value = FacesConfigFactory.eINSTANCE
-							.createValueType();
-					value.setTextContent(dialog.getValue());
-					Command cmd7 = SetCommand.create(editingDomain, mapEntry,
-							FacesConfigPackage.eINSTANCE
-									.getMapEntryType_Value(), value);
-					commands.add(cmd7);
-				}
-
-			}
-
-			Command command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				editingDomain.getCommandStack().execute(command);
-				tableViewer.refresh(mapEntry);
-			}
-
-		}
-
-	}
-
-	private void removeButtonSelected() {
-
-		MapEntryType mapEntry = (MapEntryType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-		EditingDomain editingDomain = section.getEditingDomain();
-		Command cmd = RemoveCommand.create(editingDomain, mapEntry);
-		if (cmd.canExecute()) {
-			editingDomain.getCommandStack().execute(cmd);
-			refresh();
-		}
-	}
-
-	/**
-	 * get the project according to current xml node.
-	 * 
-	 * @return
-	 */
-	private IProject getProject() {
-		if (currentProject == null) {
-			currentProject = (IProject) section.getPage().getEditor()
-					.getAdapter(IProject.class);
-		}
-		return currentProject;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.common.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IDialogFieldGroup#setInput(java.lang.Object)
-	 */
-	public void setInput(Object newInput) {
-		if (newInput != null && newInput instanceof ManagedBeanType) {
-			managedBean = (ManagedBeanType) newInput;
-			if (managedBean.getMapEntries() != null)
-				refreshAll();
-		}
-	}
-
-	/*package*/ void refreshAll() {
-		if (managedBean.getMapEntries() != null
-				&& managedBean.getMapEntries().getKeyClass() != null) {
-			this.keyClassField.setTextWithoutUpdate(managedBean.getMapEntries()
-					.getKeyClass().getTextContent());
-		} else {
-			this.keyClassField.setTextWithoutUpdate(null);
-		}
-
-		if (managedBean.getMapEntries() != null
-				&& managedBean.getMapEntries().getValueClass() != null) {
-			this.valueClassField.setTextWithoutUpdate(managedBean
-					.getMapEntries().getValueClass().getTextContent());
-		} else {
-			this.valueClassField.setTextWithoutUpdate(null);
-		}
-
-		tableViewer.setInput(((ManagedBeanType) getInput()).getMapEntries());
-		updateButtons();
-	}
-
-	public Object getInput() {
-		return this.managedBean;
-	}
-
-	public void refreshData() {
-		refresh();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		for (Iterator listeners = selectionChangedListeners.iterator(); listeners
-				.hasNext();) {
-			ISelectionChangedListener listener = (ISelectionChangedListener) listeners
-					.next();
-			listener.selectionChanged(new SelectionChangedEvent(this, event
-					.getSelection()));
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OthersPageBaseSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OthersPageBaseSection.java
deleted file mode 100644
index 4eeca69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OthersPageBaseSection.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-/**
- * The base class for the Sections in Others Page.
- */
-public abstract class OthersPageBaseSection extends AbstractFacesConfigSection {
-
-	/**
-	 * Table viewer for all sections based on this calss
-	 */
-	protected TableViewer tableViewer;
-
-	private Button removeButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 * @param helpContextId
-	 * @param helpTooltip
-	 */
-	public OthersPageBaseSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit, String helpContextId,
-			String helpTooltip) {
-		super(parent, managedForm, page, toolkit, helpContextId, helpTooltip);
-	}
-
-	/**
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OthersPageBaseSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		this(parent, managedForm, page, toolkit, null, null);
-	}
-
-	public void dispose() {
-		tableViewer.removeSelectionChangedListener(this);
-		tableViewer = null;
-		super.dispose();
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#createContents(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.ui.forms.widgets.FormToolkit)
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		layout.marginWidth = layout.marginHeight = 5;
-		container.setLayout(layout);
-		createViewer(container, toolkit);
-		createOperationSection(container, toolkit);
-	}
-
-	/**
-	 * create TableViewer for this section. sub-class may override it to return
-	 * a new type tableViewer. for example CheckboxTableViewer.
-	 * 
-	 * @param parent
-	 * @return the table viewer for this section
-	 */
-	protected TableViewer createTableViewer(Composite parent) {
-		return new TableViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.BORDER);
-	}
-
-	/**
-	 * Config the viewer, such as set a filter and so on. Sub classes should
-	 * override this method to add filter.
-	 * 
-	 * @param tableViewer1
-	 */
-	protected abstract void configTableViewer(TableViewer tableViewer1);
-
-	/**
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 */
-	protected void createViewer(Composite parent, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(parent);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.heightHint = 200;
-		tableContainer.setLayoutData(gd);
-		tableContainer.setLayout(new GridLayout());
-
-		tableViewer = createTableViewer(tableContainer);
-		tableViewer.getControl()
-				.setLayoutData(new GridData(GridData.FILL_BOTH));
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-		configTableViewer(tableViewer);
-
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * 
-	 * @param parent
-	 * @param toolkit
-	 */
-	protected void createOperationSection(Composite parent, FormToolkit toolkit) {
-		Composite operationContainer = toolkit.createComposite(parent);
-		operationContainer.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-
-		operationContainer.setLayout(new GridLayout());
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add, SWT.PUSH);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				addButtonSelected(e);
-			}
-		});
-
-		setRemoveButton(toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove, SWT.PUSH));
-
-		getRemoveButton().setEnabled(true);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		getRemoveButton().setLayoutData(gd);
-		getRemoveButton().addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected(e);
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				removeButtonSelected(e);
-			}
-		});
-	}
-
-
-	abstract void addButtonSelected(SelectionEvent e);
-
-	/**
-	 * Respond to selection of the remove button
-	 * @param e
-	 */
-	protected void removeButtonSelected(SelectionEvent e) {
-		IStructuredSelection ssel = StructuredSelection.EMPTY;
-		ISelection selection = getSelection();
-		if (selection instanceof IStructuredSelection) {
-			ssel = (IStructuredSelection) selection;
-		}
-
-		if (!ssel.isEmpty()) {
-			List commands = new ArrayList(ssel.size());
-			for (Iterator iter = ssel.iterator(); iter.hasNext();) {
-				EObject element = (EObject) iter.next();
-				if (element.eContainer().eContents().size() == 1) {
-					// if the parent only have this one child, then remove it
-					// together.
-					element = element.eContainer();
-				}
-				Command command = RemoveCommand.create(getEditingDomain(),
-						element);
-				commands.add(command);
-
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				getEditingDomain().getCommandStack().execute(command);
-			}
-		}
-	}
-
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-	/**
-	 * update all buttons with the current selection
-	 */
-	protected void updateButtons() {
-		if (!getRemoveButton().isDisposed()) {
-			IStructuredSelection ssel = (IStructuredSelection) getSelection();
-			getRemoveButton().setEnabled(!ssel.isEmpty());
-		}
-	}
-
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	public void setSelection(ISelection selection) {
-		tableViewer.setSelection(selection);
-	}
-
-	/**
-	 * @return Returns the tableViewer.
-	 */
-	public TableViewer getTableViewer() {
-		return tableViewer;
-	}
-
-	public void refreshAll() {
-		setViewerInput(getInput());
-		updateButtons();
-	}
-
-	/**
-	 * set the structuredViewer's input
-	 * 
-	 * @param input
-	 */
-	abstract protected void setViewerInput(Object input);
-
-	public void expansionStateChanged(boolean expanded) {
-		if (expanded) {
-			if (tableViewer.getInput() == null) {
-				refreshAll();
-			}
-			tableViewer.setSelection(tableViewer.getSelection());
-		} else {
-			tableViewer.setSelection(null);
-		}
-		super.expansionStateChanged(expanded);
-	}
-
-	protected void expansionStateChanging(boolean expanding) {
-		if (!expanding) {
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			this.getSection().setLayoutData(gd);
-		} else {
-			((OthersPage) getPage()).closeOtherSections(this);
-
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			this.getSection().setLayoutData(gd);
-		}
-
-		super.expansionStateChanging(expanding);
-	}
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		super.selectionChanged(event);
-		updateButtons();
-	}
-
-    /**
-     * @param removeButton
-     */
-    protected void setRemoveButton(Button removeButton) {
-        this.removeButton = removeButton;
-    }
-
-    /**
-     * @return the button widget
-     */
-    protected Button getRemoveButton() {
-        return removeButton;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewComponentsSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewComponentsSection.java
deleted file mode 100644
index 4ef59aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewComponentsSection.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ComponentsPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * @version
- */
-public class OverviewComponentsSection extends AbstractOverviewSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewComponentsSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, ComponentsPage.PAGE_ID,
-				EditorMessages.OverviewPage_ComponentsSection_name,
-				EditorMessages.OverviewPage_ComponentsSection_description,
-				null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getComponentType()
-						.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getConverterType()
-								.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getRenderKitType()
-								.isInstance(element)
-						|| FacesConfigPackage.eINSTANCE.getValidatorType()
-								.isInstance(element);
-			}
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn typecol = new TableColumn(table, SWT.LEFT);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		typecol
-				.setText(EditorMessages.OverviewPage_ComponentsSection_table_namecol);
-		typecol.setResizable(true);
-
-		TableColumn namecol = new TableColumn(table, SWT.LEFT);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		namecol
-				.setText(EditorMessages.OverviewPage_ComponentsSection_table_typecol);
-		namecol.setResizable(true);
-
-		return table;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewGeneralSection.java
deleted file mode 100644
index 8de1c9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewGeneralSection.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.part.FileEditorInput;
-
-/**
- * @author jchoi, Xiao-guang Zhang
- * @version
- */
-public class OverviewGeneralSection extends AbstractFacesConfigSection {
-
-	private Text versionText;
-
-	/**
-	 * @param parent
-	 * @param managedForm 
-	 * @param page 
-	 * @param toolkit
-	 */
-	public OverviewGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-
-		getSection().setText(
-				EditorMessages.OverviewPage_GeneralSection_name);
-		getSection().setDescription(
-				EditorMessages.OverviewPage_GeneralSection_description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.update.ui.forms.internal.FormSection#createClient(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.update.ui.forms.internal.FormWidgetFactory)
-	 */
-	public void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		container.setLayout(layout);
-
-		IEditorInput editorInput = this.getPage().getEditor().getEditorInput();
-
-		toolkit.createLabel(container,
-				EditorMessages.OverviewPage_GeneralSection_label_name); 	 
-		Text typeText = toolkit.createText(container, ((FileEditorInput)editorInput).getName());
-		typeText.setEditable(false);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		typeText.setLayoutData(data);
-
-		toolkit.createLabel(container,
-				EditorMessages.OverviewPage_GeneralSection_label_version);
-		versionText = toolkit.createText(container, ""); //$NON-NLS-1$
-		versionText.setLayoutData(data);
-		versionText.setEditable(false);
-
-		// set the service type description
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		versionText.setLayoutData(data);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		Label sep = toolkit.createSeparator(container, SWT.HORIZONTAL);
-		sep.setLayoutData(gd);
-		toolkit.paintBordersFor(container);
-
-		// return container;
-	}
-
-	public void refreshAll() {
-		if (getInput() == null || !(getInput() instanceof EObject)) {
-			return;
-		}
-		
-//		FacesConfigType facesConfig = (FacesConfigType)getInput();
-		// TODO get the version and display it.
-		// String version = FacesConfigUtil
-		// .getFacesConfigVersion((IDOMModel) getInput());
-		//
-		// if (null == version) {
-		// Document document = ((IDOMModel) getInput()).getDocument();
-		// DocumentType doctype = document.getDoctype();
-		// if (doctype != null) {
-		// String pid = doctype.getPublicId();
-		// version = pid.substring(PUBLIC_ID.length() + 1);
-		// version = version.substring(version.indexOf(VERSION_PREFIX)
-		// + VERSION_PREFIX.length() + 1, version.indexOf("//"));
-		// }
-		// if (null == version) {
-		// version = "";
-		// }
-		// }
-		// versionText.setText(version);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewManagedBeanSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewManagedBeanSection.java
deleted file mode 100644
index c066246..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewManagedBeanSection.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.ManagedBeanPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * @version
- */
-public class OverviewManagedBeanSection extends AbstractOverviewSection {
-
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewManagedBeanSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, ManagedBeanPage.PAGE_ID,
-				EditorMessages.OverviewPage_ManagedBeanSection_name,
-				EditorMessages.OverviewPage_ManagedBeanSection_description,
-				null, null);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getManagedBeanType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable()
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn namecol = new TableColumn(table, SWT.LEFT);
-		namecol
-				.setText(EditorMessages.OverviewPage_ManagedBeanSection_table_namecol);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		namecol.setResizable(true);
-
-		TableColumn scopecol = new TableColumn(table, SWT.LEFT);
-		scopecol
-				.setText(EditorMessages.OverviewPage_ManagedBeanSection_table_scopecol);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		scopecol.setResizable(true);
-
-		TableColumn classcol = new TableColumn(table, SWT.LEFT);
-		classcol
-				.setText(EditorMessages.OverviewPage_ManagedBeanSection_table_classcol);
-		tablelayout.addColumnData(new ColumnWeightData(1, true));
-		classcol.setResizable(true);
-
-		return table;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewNavigationSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewNavigationSection.java
deleted file mode 100644
index ae4bd8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewNavigationSection.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * 
- */
-public class OverviewNavigationSection extends AbstractOverviewSection {
-
-	private static final int COLUMN_WITH = 70;
-
-	private OverviewNavigationSectionAdapter overviewNavigationSectionAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewNavigationSection(Composite parent,
-			IManagedForm managedForm, IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, PageflowEditor.PAGE_ID,
-				EditorMessages.OverviewPage_NavigationSection_name,
-				EditorMessages.OverviewPage_NavigationSection_description,
-				null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.setContentProvider(new IStructuredContentProvider() {
-
-			public Object[] getElements(Object inputElement) {
-				List navigationCaseList = (List) inputElement;
-				return navigationCaseList.toArray();
-			}
-
-			public void dispose() {
-			    // nothing to dispose
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			    // do nothing
-			}
-		});
-
-		tableViewer1.setLabelProvider(new ITableLabelProvider() {
-
-			public Image getColumnImage(Object element, int columnIndex) {
-				return null;
-			}
-
-			public String getColumnText(Object element, int columnIndex) {
-				NavigationCaseType navigationCase = (NavigationCaseType) element;
-				switch (columnIndex) {
-
-				case 0:
-					return ((NavigationRuleType) navigationCase.eContainer())
-							.getFromViewId() == null ? "" //$NON-NLS-1$
-							: ((NavigationRuleType) navigationCase.eContainer())
-									.getFromViewId().getTextContent();
-
-				case 1:
-					return navigationCase.getFromOutcome() == null ? "" //$NON-NLS-1$
-							: navigationCase.getFromOutcome().getTextContent();
-
-				case 2:
-					return navigationCase.getToViewId() == null ? "" //$NON-NLS-1$
-							: navigationCase.getToViewId().getTextContent();
-				}
-				return null;
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-			    // no listeners?
-			}
-
-			public void dispose() {
-			    // do nothing
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-			    // no listeners?
-			}
-		});
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn column1 = new TableColumn(table, SWT.LEFT);
-		column1
-				.setText(EditorMessages.OverviewPage_NavigationSection_table_col1);
-		// column1.setWidth(COLUMN_WITH);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		// tablelayout.addColumnData(new ColumnWeightData(1, true));
-		column1.setResizable(true);
-
-		TableColumn column2 = new TableColumn(table, SWT.LEFT);
-		column2
-				.setText(EditorMessages.OverviewPage_NavigationSection_table_col2);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		// tablelayout.addColumnData(new ColumnWeightData(1, true));
-		column2.setResizable(true);
-		// column2.setWidth(COLUMN_WITH);
-
-		TableColumn column3 = new TableColumn(table, SWT.LEFT);
-		column3
-				.setText(EditorMessages.OverviewPage_NavigationSection_table_col3);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		// tablelayout.addColumnData(new ColumnWeightData(1, true));
-		column3.setResizable(true);
-		// column3.setWidth(COLUMN_WITH);
-
-		return table;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.IFacesConfigSection#refreshAll()
-	 */
-	public void refreshAll() {			
-		List navigationCaseList = new ArrayList();
-		if (getInput() instanceof FacesConfigType) {
-			List navigationRules = ((FacesConfigType) getInput())
-					.getNavigationRule();
-			for (int i = 0, n = navigationRules.size(); i < n; i++) {
-				NavigationRuleType navigationRule = (NavigationRuleType) navigationRules
-						.get(i);
-				navigationCaseList.addAll(navigationRule.getNavigationCase());
-			}
-		}
-
-		tableViewer.setInput(navigationCaseList);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#addAdaptersOntoInput(java.lang.Object)
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		FacesConfigType facesConfig = (FacesConfigType) newInput;
-		addOverviewNavigationSectionAdapter(facesConfig);
-
-		for (Iterator it = facesConfig.getNavigationRule().iterator(); it
-				.hasNext();) {
-			NavigationRuleType navigationRule = (NavigationRuleType) it.next();
-
-			addOverviewNavigationSectionAdapter(navigationRule);
-
-			if (navigationRule.getFromViewId() != null) {
-				addOverviewNavigationSectionAdapter(navigationRule
-						.getFromViewId());
-			}
-
-			for (Iterator it2 = navigationRule.getNavigationCase().iterator(); it2
-					.hasNext();) {
-				NavigationCaseType navigationCase = (NavigationCaseType) it2
-						.next();
-				addOverviewNavigationSectionAdapter(navigationCase);
-
-				if (navigationCase.getFromOutcome() != null) {
-					addOverviewNavigationSectionAdapter(navigationCase
-							.getFromOutcome());
-				}
-
-				if (navigationCase.getToViewId() != null) {
-					addOverviewNavigationSectionAdapter(navigationCase
-							.getToViewId());
-				}
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#removeAdaptersFromInput(java.lang.Object)
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		super.removeAdaptersFromInput(oldInput);		
-		FacesConfigType facesConfig = (FacesConfigType) oldInput;
-		removeOverviewNavigationSectionAdapter(facesConfig);
-		
-		for (Iterator it = facesConfig.getNavigationRule().iterator(); it
-				.hasNext();) {
-			NavigationRuleType navigationRule = (NavigationRuleType) it.next();
-
-			removeOverviewNavigationSectionAdapter(navigationRule);
-
-			if (navigationRule.getFromViewId() != null) {
-				removeOverviewNavigationSectionAdapter(navigationRule
-						.getFromViewId());
-			}
-
-			for (Iterator it2 = navigationRule.getNavigationCase().iterator(); it2
-					.hasNext();) {
-				NavigationCaseType navigationCase = (NavigationCaseType) it2
-						.next();
-				removeOverviewNavigationSectionAdapter(navigationCase);
-
-				if (navigationCase.getFromOutcome() != null) {
-					removeOverviewNavigationSectionAdapter(navigationCase
-							.getFromOutcome());
-				}
-
-				if (navigationCase.getToViewId() != null) {
-					removeOverviewNavigationSectionAdapter(navigationCase
-							.getToViewId());
-				}
-			}
-		}
-
-	}
-
-	private void addOverviewNavigationSectionAdapter(EObject object) {
-		if (EcoreUtil.getExistingAdapter(object,
-				OverviewNavigationSection.class) == null) {
-			object.eAdapters().add(getOverviewNavigationSectionAdapter());
-		}
-
-	}
-	
-	private void removeOverviewNavigationSectionAdapter(EObject object) {
-		if (object != null && EcoreUtil.getExistingAdapter(object,
-				OverviewNavigationSection.class) != null) {
-			object.eAdapters().remove(getOverviewNavigationSectionAdapter());
-		}
-	}
-
-	private OverviewNavigationSectionAdapter getOverviewNavigationSectionAdapter() {
-		if (overviewNavigationSectionAdapter == null)
-			overviewNavigationSectionAdapter = new OverviewNavigationSectionAdapter();
-		return overviewNavigationSectionAdapter;
-	}
-
-	class OverviewNavigationSectionAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == OverviewNavigationSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if ((msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFacesConfigType_NavigationRule()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getNavigationRuleType_NavigationCase()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getNavigationRuleType_FromViewId() || msg
-					.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFromViewIdType_TextContent())) {
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.SET) {
-					if (msg.getNewValue() instanceof EObject) {
-						EObject newObject = (EObject) msg.getNewValue();
-						addOverviewNavigationSectionAdapter(newObject);
-					}
-				}
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET)
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshAll();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								refreshAll();
-							}	
-						});
-					}
-					return;
-			}
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getNavigationCaseType_FromOutcome()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getNavigationCaseType_ToViewId()) {
-
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.SET) {
-					if (msg.getNewValue() instanceof EObject) {
-						EObject newObject = (EObject) msg.getNewValue();
-						addOverviewNavigationSectionAdapter(newObject);
-					}
-				}
-				if (msg.getEventType() == Notification.ADD
-
-				|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET) {
-
-					NavigationCaseType navigationCase = (NavigationCaseType) msg
-							.getNotifier();
-					refreshViewerOnUIThread(navigationCase);
-				}
-				return;
-			}
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFromOutcomeType_TextContent()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getToViewIdType_TextContent()) {
-
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET) {
-					NavigationCaseType navigationCase = (NavigationCaseType) ((EObject) msg
-							.getNotifier()).eContainer();
-					refreshViewerOnUIThread(navigationCase);
-				}
-				return;
-			}
-
-		}
-
-		private void refreshViewerOnUIThread(final NavigationCaseType navigationCase) {
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-					tableViewer.refresh(navigationCase);
-			} else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						tableViewer.refresh(navigationCase);
-					}
-				});
-			}
-			
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewOthersSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewOthersSection.java
deleted file mode 100644
index a1179bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewOthersSection.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author sfshi
- * 
- */
-public class OverviewOthersSection extends AbstractOverviewSection {
-
-	private static final int COLUMN_WITH = 100;
-
-	private OverviewOthersSectionAdapter overviewOthersSectionAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public OverviewOthersSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, OthersPage.PAGE_ID,
-				EditorMessages.OverviewPage_OthersSection_name,
-				EditorMessages.OverviewPage_OthersSection_description,
-				null, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#configTableViewer(org.eclipse.jface.viewers.TableViewer)
-	 */
-	protected void configTableViewer(TableViewer tableViewer1) {
-		tableViewer1.setContentProvider(new IStructuredContentProvider() {
-
-			public Object[] getElements(Object inputElement) {
-				List othersNodesList = (List) inputElement;
-				return othersNodesList.toArray();
-			}
-
-			public void dispose() {
-                // do nothing
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-			    // do nothing
-			}
-		});
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#createTable(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Table createTable(Composite container) {
-		Table table = new Table(container, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = 100;
-		table.setLayoutData(gd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-		TableLayout tablelayout = new TableLayout();
-		table.setLayout(tablelayout);
-
-		TableColumn valuecol = new TableColumn(table, SWT.NONE);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		valuecol
-				.setText(EditorMessages.OverviewPage_OthersSection_table_valuecol);
-		valuecol.setResizable(true);
-
-		TableColumn typecol = new TableColumn(table, SWT.NONE);
-		tablelayout.addColumnData(new ColumnWeightData(1, COLUMN_WITH, true));
-		typecol
-				.setText(EditorMessages.OverviewPage_OthersSection_table_typecol);
-		typecol.setResizable(true);
-
-		return table;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractOverviewSection#refreshAll()
-	 */
-	public void refreshAll() {
-		if(getSection() == null || getSection().isDisposed()) {
-			return;
-		}
-		List othersNodesList = new ArrayList();
-		if (getInput() instanceof FacesConfigType) {
-			Object[] applicationNodes = null;
-			Object[] factoryNodes = null;
-			Object[] lifecycleNodes = null;
-			FacesConfigType facesConfig = (FacesConfigType) getInput();
-			IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-					getAdapterFactory());
-			if (facesConfig.getApplication().size() > 0) {
-
-				ApplicationType application = (ApplicationType) facesConfig
-						.getApplication().get(0);
-				applicationNodes = contentProvider.getElements(application);
-
-			}
-
-			if (facesConfig.getFactory().size() > 0) {
-				FactoryType factory = (FactoryType) facesConfig.getFactory()
-						.get(0);
-				factoryNodes = contentProvider.getElements(factory);
-			}
-
-			if (facesConfig.getLifecycle().size() > 0) {
-				LifecycleType lifecycle = (LifecycleType) facesConfig
-						.getLifecycle().get(0);
-				lifecycleNodes = contentProvider.getElements(lifecycle);
-			}
-
-			if (applicationNodes != null) {
-				for (int i = 0, n = applicationNodes.length; i < n; i++) {
-					othersNodesList.add(applicationNodes[i]);
-				}
-			}
-
-			if (factoryNodes != null) {
-				for (int i = 0, n = factoryNodes.length; i < n; i++) {
-					othersNodesList.add(factoryNodes[i]);
-				}
-			}
-
-			if (lifecycleNodes != null) {
-				for (int i = 0, n = lifecycleNodes.length; i < n; i++) {
-					othersNodesList.add(lifecycleNodes[i]);
-				}
-			}
-		}
-
-		tableViewer.setInput(othersNodesList);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#addAdaptersOntoInput(java.lang.Object)
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		FacesConfigType facesConfig = (FacesConfigType) newInput;
-		addOverviewOthersSectionAdapter(facesConfig);
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				getAdapterFactory());
-		if (facesConfig.getApplication().size() > 0) {
-			ApplicationType application = (ApplicationType) facesConfig
-					.getApplication().get(0);
-			addOverviewOthersSectionAdapter(application);
-
-			Object[] applicationNodes = contentProvider
-					.getElements(application);
-			for (int i = 0, n = applicationNodes.length; i < n; i++) {
-				addOverviewOthersSectionAdapter((EObject) applicationNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getFactory().size() > 0) {
-			FactoryType factory = (FactoryType) facesConfig.getFactory().get(0);
-			addOverviewOthersSectionAdapter(factory);
-
-			Object[] factoryNodes = contentProvider.getElements(factory);
-			for (int i = 0, n = factoryNodes.length; i < n; i++) {
-				addOverviewOthersSectionAdapter((EObject) factoryNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getLifecycle().size() > 0) {
-			LifecycleType lifecycle = (LifecycleType) facesConfig
-					.getLifecycle().get(0);
-			addOverviewOthersSectionAdapter(lifecycle);
-
-			Object[] lifecycleNodes = contentProvider.getElements(lifecycle);
-			for (int i = 0, n = lifecycleNodes.length; i < n; i++) {
-				addOverviewOthersSectionAdapter((EObject) lifecycleNodes[i]);
-			}
-
-		}
-
-	}
-
-	private void addOverviewOthersSectionAdapter(EObject object) {
-		if (EcoreUtil.getExistingAdapter(object, OverviewOthersSection.class) == null) {
-			object.eAdapters().add(getOverviewOthersSectionAdapter());
-		}
-
-	}
-
-	private void removeOverviewOthersSectionAdapter(EObject object) {
-		if (EcoreUtil.getExistingAdapter(object, OverviewOthersSection.class) != null) {
-			object.eAdapters().remove(getOverviewOthersSectionAdapter());
-		}
-	}
-
-	private OverviewOthersSectionAdapter getOverviewOthersSectionAdapter() {
-		if (overviewOthersSectionAdapter == null) {
-			overviewOthersSectionAdapter = new OverviewOthersSectionAdapter();
-		}
-
-		return overviewOthersSectionAdapter;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection#removeAdaptersFromInput(java.lang.Object)
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-
-		FacesConfigType facesConfig = (FacesConfigType) oldInput;
-		removeOverviewOthersSectionAdapter(facesConfig);
-		IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
-				getAdapterFactory());
-		if (facesConfig.getApplication().size() > 0) {
-			ApplicationType application = (ApplicationType) facesConfig
-					.getApplication().get(0);
-			removeOverviewOthersSectionAdapter(application);
-
-			Object[] applicationNodes = contentProvider
-					.getElements(application);
-			for (int i = 0, n = applicationNodes.length; i < n; i++) {
-				removeOverviewOthersSectionAdapter((EObject) applicationNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getFactory().size() > 0) {
-			FactoryType factory = (FactoryType) facesConfig.getFactory().get(0);
-			removeOverviewOthersSectionAdapter(factory);
-
-			Object[] factoryNodes = contentProvider.getElements(factory);
-			for (int i = 0, n = factoryNodes.length; i < n; i++) {
-				removeOverviewOthersSectionAdapter((EObject) factoryNodes[i]);
-			}
-
-		}
-
-		if (facesConfig.getLifecycle().size() > 0) {
-			LifecycleType lifecycle = (LifecycleType) facesConfig
-					.getLifecycle().get(0);
-			removeOverviewOthersSectionAdapter(lifecycle);
-
-			Object[] lifecycleNodes = contentProvider.getElements(lifecycle);
-			for (int i = 0, n = lifecycleNodes.length; i < n; i++) {
-				removeOverviewOthersSectionAdapter((EObject) lifecycleNodes[i]);
-			}
-
-		}
-
-	}
-
-	class OverviewOthersSectionAdapter extends AdapterImpl {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(java.lang.Object)
-		 */
-		public boolean isAdapterForType(Object type) {
-			if (type == OverviewOthersSection.class)
-				return true;
-			return false;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
-		 */
-		public void notifyChanged(Notification msg) {
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getFacesConfigType_Application()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getFacesConfigType_Factory()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getFacesConfigType_Lifecycle()
-					|| msg.getNotifier() instanceof ApplicationType
-					|| msg.getNotifier() instanceof FactoryType
-					|| msg.getNotifier() instanceof LifecycleType) {
-
-				if (msg.getEventType() == Notification.ADD) {
-					EObject newObject = (EObject) msg.getNewValue();
-					if (newObject != null) {
-						addOverviewOthersSectionAdapter(newObject);
-					}
-				}
-
-				if (msg.getEventType() == Notification.ADD
-						|| msg.getEventType() == Notification.REMOVE
-						|| msg.getEventType() == Notification.SET) {
-					
-					if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-						refreshAll();
-					} else {
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								refreshAll();
-							}
-						});
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/PropertySection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/PropertySection.java
deleted file mode 100644
index e3ca1a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/PropertySection.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditPropertyDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Section for properties
- *
- */
-public class PropertySection extends AbstractFacesConfigSection {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public PropertySection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.PropertySection_Name);
-		this.getSection().setDescription(
-				EditorMessages.PropertySection_Description);
-
-	}
-
-	/**
-	 * @param container
-	 * @param toolkit
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite propertySection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.verticalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.marginHeight = 0;
-		gl2.numColumns = 2;
-		propertySection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		propertySection.setLayoutData(gd);
-
-		createTableSection(propertySection, toolkit);
-		createButtonsSection(propertySection, toolkit);
-
-	}
-
-	/**
-	 * create table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn nameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		nameCol.setText(EditorMessages.PropertySection_Table_NameColumn);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol
-				.setText(EditorMessages.PropertySection_Table_ClassColumn);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.PropertySection_Table_DefaultValueColumn);
-
-		TableColumn suggestedValueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		suggestedValueCol
-				.setText(EditorMessages.PropertySection_Table_SuggestedValueColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getPropertyType()
-						.isInstance(element);
-			}
-		});
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create property's editing buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-	}
-
-	/**
-	 * refresh the table viewer and update buttons.
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * add a property.
-	 * 
-	 */
-	private void addButtonSelected() {
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditPropertyDialog dialog = new AddEditPropertyDialog(shell, true);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (dialog.open() == Dialog.OK) {
-
-			PropertyType newProperty = FacesConfigFactory.eINSTANCE
-					.createPropertyType();
-
-			if (dialog.getPropertyName().length() > 0) {
-				PropertyNameType propertyNameType = FacesConfigFactory.eINSTANCE
-						.createPropertyNameType();
-				propertyNameType.setTextContent(dialog.getPropertyName());
-				newProperty.setPropertyName(propertyNameType);
-			}
-
-			if (dialog.getPropertyClass().length() > 0) {
-				PropertyClassType propertyClassType = FacesConfigFactory.eINSTANCE
-						.createPropertyClassType();
-				propertyClassType.setTextContent(dialog.getPropertyClass());
-				newProperty.setPropertyClass(propertyClassType);
-			}
-
-			if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				newProperty.setDefaultValue(defaultValueType);
-			}
-
-			if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				newProperty.setSuggestedValue(suggestedValueType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), null, newProperty);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit a property.
-	 * 
-	 */
-	private void editButtonSelected() {
-
-		PropertyType property = (PropertyType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(property);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditPropertyDialog dialog = new AddEditPropertyDialog(shell, false);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (property.getPropertyName() != null) {
-			dialog.setPropertyName(property.getPropertyName().getTextContent());
-		}
-
-		if (property.getPropertyClass() != null) {
-			dialog.setPropertyClass(property.getPropertyClass()
-					.getTextContent());
-		}
-
-		if (property.getDefaultValue() != null) {
-			dialog.setDefaultValue(property.getDefaultValue().getTextContent());
-		}
-
-		if (property.getSuggestedValue() != null) {
-			dialog.setSuggestedValue(property.getSuggestedValue()
-					.getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(4);
-
-			if (property.getPropertyName() != null) {
-				Command cmd1 = SetCommand.create(this.getEditingDomain(),
-						property.getPropertyName(),
-						FacesConfigPackage.eINSTANCE
-								.getPropertyNameType_TextContent(), dialog
-								.getPropertyName());
-				commands.add(cmd1);
-			} else if (dialog.getPropertyName().length() > 0) {
-				PropertyNameType propertyNameType = FacesConfigFactory.eINSTANCE
-						.createPropertyNameType();
-				propertyNameType.setTextContent(dialog.getPropertyName());
-
-				Command cmd2 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_PropertyName(),
-						propertyNameType);
-				commands.add(cmd2);
-			}
-
-			if (property.getPropertyClass() != null) {
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						property.getPropertyClass(),
-						FacesConfigPackage.eINSTANCE
-								.getPropertyClassType_TextContent(), dialog
-								.getPropertyClass());
-				commands.add(cmd3);
-			} else if (dialog.getPropertyClass().length() > 0) {
-				PropertyClassType propertyClassType = FacesConfigFactory.eINSTANCE
-						.createPropertyClassType();
-				propertyClassType.setTextContent(dialog.getPropertyClass());
-
-				Command cmd4 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_PropertyClass(),
-						propertyClassType);
-				commands.add(cmd4);
-			}
-
-			if (property.getDefaultValue() != null) {
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						property.getDefaultValue(),
-						FacesConfigPackage.eINSTANCE
-								.getDefaultValueType_TextContent(), dialog
-								.getDefaultValue());
-				commands.add(cmd5);
-
-			} else if (dialog.getDefaultValue().length() > 0) {
-				DefaultValueType defaultValueType = FacesConfigFactory.eINSTANCE
-						.createDefaultValueType();
-				defaultValueType.setTextContent(dialog.getDefaultValue());
-				Command cmd6 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_DefaultValue(),
-						defaultValueType);
-				commands.add(cmd6);
-			}
-
-			if (property.getSuggestedValue() != null) {
-				Command cmd7 = SetCommand.create(this.getEditingDomain(),
-						property.getSuggestedValue(),
-						FacesConfigPackage.eINSTANCE
-								.getSuggestedValueType_TextContent(), dialog
-								.getSuggestedValue());
-				commands.add(cmd7);
-			} else if (dialog.getSuggestedValue().length() > 0) {
-				SuggestedValueType suggestedValueType = FacesConfigFactory.eINSTANCE
-						.createSuggestedValueType();
-				suggestedValueType.setTextContent(dialog.getSuggestedValue());
-				Command cmd8 = AddCommand.create(this.getEditingDomain(),
-						property, FacesConfigPackage.eINSTANCE
-								.getPropertyType_SuggestedValue(),
-						suggestedValueType);
-				commands.add(cmd8);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(property);
-
-			}
-		}
-
-	}
-
-	/**
-	 * remove a property.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		PropertyType property = (PropertyType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(property);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), null, property);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RendererSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RendererSection.java
deleted file mode 100644
index 0d16483..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RendererSection.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CompoundCommand;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.dialog.AddEditRendererDialog;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RendererSection extends AbstractFacesConfigSection {
-
-	private static final int TABLE_DEFAULT_HEIGHT = 160;
-
-	private TableViewer tableViewer;
-
-	private Button removeButton;
-
-	private Button editButton;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public RendererSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		this.getSection().setText(EditorMessages.RendererSection_Name);
-		this.getSection().setDescription(
-				EditorMessages.RendererSection_Description);
-
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		GridLayout gl = new GridLayout();
-		gl.horizontalSpacing = 0;
-		gl.marginWidth = 0;
-		gl.numColumns = 2;
-		container.setLayout(gl);
-		GridData td = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-
-		Composite RendererSection = toolkit.createComposite(container);
-		GridLayout gl2 = new GridLayout();
-		gl2.horizontalSpacing = 0;
-		gl2.verticalSpacing = 0;
-		gl2.marginWidth = 0;
-		gl2.marginHeight = 0;
-		gl2.numColumns = 2;
-		RendererSection.setLayout(gl2);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		RendererSection.setLayoutData(gd);
-
-		createTableSection(RendererSection, toolkit);
-		createButtonsSection(RendererSection, toolkit);
-
-	}
-
-	/**
-	 * create table section
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createTableSection(Composite container, FormToolkit toolkit) {
-		Composite tableContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_BOTH
-				| GridData.GRAB_HORIZONTAL);
-		tableContainer.setLayoutData(gd);
-		toolkit.paintBordersFor(tableContainer);
-
-		GridLayout gl = new GridLayout();
-		tableContainer.setLayout(gl);
-
-		Table table = new Table(tableContainer, SWT.H_SCROLL | SWT.V_SCROLL
-				| SWT.FULL_SELECTION | SWT.BORDER);
-		gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.heightHint = TABLE_DEFAULT_HEIGHT;
-		table.setLayoutData(gd);
-
-		table.setHeaderVisible(true);
-		table.setLinesVisible(true);
-		TableLayout layout = new TableLayout();
-		table.setLayout(layout);
-
-		TableColumn nameCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		nameCol.setText(EditorMessages.RendererSection_Table_NameColumn);
-
-		TableColumn valueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		valueCol
-				.setText(EditorMessages.RendererSection_Table_ComponentFamilyColumn);
-
-		TableColumn suggestedValueCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		suggestedValueCol
-				.setText(EditorMessages.RendererSection_Table_TypeColumn);
-
-		TableColumn classCol = new TableColumn(table, SWT.NONE);
-		layout.addColumnData(new ColumnWeightData(1, true));
-		classCol.setText(EditorMessages.RendererSection_Table_ClassColumn);
-
-		table.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				updateButtons();
-			}
-		});
-
-		table.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				if (((IStructuredSelection) tableViewer.getSelection()).size() > 0)
-					editButtonSelected();
-			}
-		});
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setContentProvider(new AdapterFactoryContentProvider(
-				getAdapterFactory()));
-		tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(
-				getAdapterFactory()));
-
-		tableViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getRendererType()
-						.isInstance(element);
-			}
-		});
-		
-		tableViewer.addSelectionChangedListener(this);
-	}
-
-	/**
-	 * Update the buttons' enable and disable status
-	 */
-	private void updateButtons() {
-		if (((IStructuredSelection) tableViewer.getSelection()).size() > 0) {
-			editButton.setEnabled(true);
-			removeButton.setEnabled(true);
-		} else {
-			editButton.setEnabled(false);
-			removeButton.setEnabled(false);
-		}
-	}
-
-	/**
-	 * create buttons
-	 * 
-	 * @param container
-	 * @param toolkit
-	 */
-	private void createButtonsSection(Composite container, FormToolkit toolkit) {
-		// create operation buttons's container
-		Composite operationContainer = toolkit.createComposite(container);
-		GridData gd = new GridData(GridData.FILL_VERTICAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		operationContainer.setLayoutData(gd);
-		GridLayout gl = new GridLayout();
-		operationContainer.setLayout(gl);
-
-		Button addButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Add_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		addButton.setLayoutData(gd);
-
-		editButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Edit_more,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		editButton.setLayoutData(gd);
-
-		removeButton = toolkit.createButton(operationContainer,
-				EditorMessages.UI_Button_Remove,
-				SWT.PUSH);
-		gd = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING);
-		gd.grabExcessHorizontalSpace = false;
-		removeButton.setLayoutData(gd);
-
-		addButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				addButtonSelected();
-			}
-
-		});
-
-		editButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				editButtonSelected();
-			}
-
-		});
-		removeButton.addSelectionListener(new SelectionAdapter() {
-
-			public void widgetSelected(SelectionEvent e) {
-				removeButtonSelected();
-			}
-
-		});
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private EReference getEReference() {
-		EReference reference = null;
-		if (getInput() instanceof RenderKitType) {
-			reference = FacesConfigPackage.eINSTANCE
-					.getRenderKitType_Renderer();
-		}
-		return reference;
-	}
-
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		tableViewer.setInput(getInput());
-		updateButtons();
-
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		tableViewer.refresh();
-		updateButtons();
-	}
-
-	/**
-	 * add an Renderer.
-	 * 
-	 */
-	private void addButtonSelected() {
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditRendererDialog dialog = new AddEditRendererDialog(shell, this
-				.getPage(), true);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (dialog.open() == Dialog.OK) {
-
-			// RendererType newRenderer = dialog.getResult();
-			RendererType newRenderer = FacesConfigFactory.eINSTANCE
-					.createRendererType();
-
-			if (dialog.getRendererName().length() > 0) {
-				DisplayNameType diaplayName = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				diaplayName.setTextContent(dialog.getRendererName());
-				newRenderer.getDisplayName().add(diaplayName);
-			}
-
-			if (dialog.getRendererClass().length() > 0) {
-				RendererClassType RendererClassType = FacesConfigFactory.eINSTANCE
-						.createRendererClassType();
-				RendererClassType.setTextContent(dialog.getRendererClass());
-				newRenderer.setRendererClass(RendererClassType);
-			}
-
-			if (dialog.getComponentFamily().length() > 0) {
-				ComponentFamilyType componentFamilyType = FacesConfigFactory.eINSTANCE
-						.createComponentFamilyType();
-				componentFamilyType.setTextContent(dialog.getComponentFamily());
-				newRenderer.setComponentFamily(componentFamilyType);
-			}
-
-			if (dialog.getRendererType().length() > 0) {
-				RendererTypeType rendererType = FacesConfigFactory.eINSTANCE
-						.createRendererTypeType();
-				rendererType.setTextContent(dialog.getRendererType());
-				newRenderer.setRendererType(rendererType);
-			}
-
-			Command addCommand = AddCommand.create(this.getEditingDomain(),
-					getInput(), getEReference(), newRenderer);
-			if (addCommand.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(addCommand);
-
-			}
-		}
-
-	}
-
-	/**
-	 * edit an Renderer.
-	 * 
-	 */
-	private void editButtonSelected() {
-
-		RendererType renderer = (RendererType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(renderer);
-
-		Shell shell = EditorPlugin.getActiveShell();
-
-		AddEditRendererDialog dialog = new AddEditRendererDialog(shell, this
-				.getPage(), false);
-		dialog.setProject((IProject) getPage().getEditor().getAdapter(
-				IProject.class));
-		if (renderer.getDisplayName() != null
-				&& renderer.getDisplayName().size() > 0) {
-			String name = ((DisplayNameType) (renderer.getDisplayName().get(0)))
-					.getTextContent();
-			if (name == null) {
-				name = ""; //$NON-NLS-1$
-			}
-			dialog.setRendererName(name);
-		}
-
-		if (renderer.getRendererClass() != null) {
-			dialog.setRendererClass(renderer.getRendererClass()
-					.getTextContent());
-		}
-
-		if (renderer.getComponentFamily() != null) {
-			dialog.setComponentFamily(renderer.getComponentFamily()
-					.getTextContent());
-		}
-
-		if (renderer.getRendererType() != null) {
-			dialog.setRendererType(renderer.getRendererType().getTextContent());
-		}
-
-		if (dialog.open() == Dialog.OK) {
-			List commands = new ArrayList(4);
-
-			if (renderer.getDisplayName() != null
-					&& renderer.getDisplayName().size() > 0) {
-				DisplayNameType diaplayName = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				diaplayName.setTextContent(dialog.getRendererName());
-
-				Command cmd1 = SetCommand.create(this.getEditingDomain(),
-						renderer.getDisplayName().get(0),
-						FacesConfigPackage.eINSTANCE
-								.getRendererType_DisplayName(), diaplayName);
-				commands.add(cmd1);
-			} else if (dialog.getRendererName().length() > 0) {
-				DisplayNameType displayName = FacesConfigFactory.eINSTANCE
-						.createDisplayNameType();
-				displayName.setTextContent(dialog.getRendererName());
-
-				EList dl = renderer.getDisplayName();
-				dl.add(displayName);
-				Command cmd2 = AddCommand.create(this.getEditingDomain(),
-						renderer.getDisplayName(), FacesConfigPackage.eINSTANCE
-								.getRendererType_DisplayName(), dl);
-				commands.add(cmd2);
-			}
-
-			if (renderer.getRendererClass() != null) {
-				Command cmd3 = SetCommand.create(this.getEditingDomain(),
-						renderer.getRendererClass(),
-						FacesConfigPackage.eINSTANCE
-								.getRendererClassType_TextContent(), dialog
-								.getRendererClass());
-				commands.add(cmd3);
-			} else if (dialog.getRendererClass().length() > 0) {
-				RendererClassType RendererClassType = FacesConfigFactory.eINSTANCE
-						.createRendererClassType();
-				RendererClassType.setTextContent(dialog.getRendererClass());
-
-				Command cmd4 = AddCommand.create(this.getEditingDomain(),
-						renderer, FacesConfigPackage.eINSTANCE
-								.getRendererType_RendererClass(),
-						RendererClassType);
-				commands.add(cmd4);
-			}
-
-			if (renderer.getComponentFamily() != null) {
-				Command cmd5 = SetCommand.create(this.getEditingDomain(),
-						renderer.getComponentFamily(),
-						FacesConfigPackage.eINSTANCE
-								.getDefaultValueType_TextContent(), dialog
-								.getComponentFamily());
-				commands.add(cmd5);
-
-			} else if (dialog.getComponentFamily().length() > 0) {
-				ComponentFamilyType componentFamily = FacesConfigFactory.eINSTANCE
-						.createComponentFamilyType();
-				componentFamily.setTextContent(dialog.getComponentFamily());
-				Command cmd6 = AddCommand.create(this.getEditingDomain(),
-						renderer, FacesConfigPackage.eINSTANCE
-								.getRendererType_ComponentFamily(),
-						componentFamily);
-				commands.add(cmd6);
-			}
-
-			if (renderer.getRendererType() != null) {
-				Command cmd7 = SetCommand.create(this.getEditingDomain(),
-						renderer.getRendererType(),
-						FacesConfigPackage.eINSTANCE
-								.getSuggestedValueType_TextContent(), dialog
-								.getRendererType());
-				commands.add(cmd7);
-			} else if (dialog.getRendererType().length() > 0) {
-				RendererTypeType rendererType = FacesConfigFactory.eINSTANCE
-						.createRendererTypeType();
-				rendererType.setTextContent(dialog.getRendererType());
-				Command cmd8 = AddCommand.create(this.getEditingDomain(),
-						renderer, FacesConfigPackage.eINSTANCE
-								.getRendererType_RendererType(), rendererType);
-				commands.add(cmd8);
-			}
-
-			CompoundCommand command = new CompoundCommand(commands);
-			if (command.canExecute()) {
-				this.getEditingDomain().getCommandStack().execute(command);
-				tableViewer.refresh(renderer);
-
-			}
-		}
-
-	}
-
-	/**
-	 * remove an Renderer.
-	 * 
-	 */
-	private void removeButtonSelected() {
-		RendererType Renderer = (RendererType) ((IStructuredSelection) tableViewer
-				.getSelection()).getFirstElement();
-
-		Assert.isNotNull(Renderer);
-
-		Command removeCommand = RemoveCommand.create(this.getEditingDomain(),
-				getInput(), getEReference(), Renderer);
-
-		if (removeCommand.canExecute()) {
-			this.getEditingDomain().getCommandStack().execute(removeCommand);
-			refreshAll();
-		}
-
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-	 */
-	public ISelection getSelection() {
-		return tableViewer.getSelection();
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection selection) {
-
-		tableViewer.setSelection(selection);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitGeneralSection.java
deleted file mode 100644
index 58e83e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitGeneralSection.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RenderkitGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField renderkitIdField;
-
-	private ClassButtonDialogField renderkitClassField;
-
-	private RenderKitGeneralAdapter renderKitGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public RenderkitGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.RenderKitGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.RenderKitGeneralSection_Description);
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						RenderKitType Renderkit = (RenderKitType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Renderkit.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) Renderkit
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-							displayNameType.eAdapters().add(
-									getRenderKitGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, Renderkit,
-									FacesConfigPackage.eINSTANCE
-											.getRenderKitType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						RenderKitType Renderkit = (RenderKitType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (Renderkit.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) Renderkit
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-							description.eAdapters().add(
-									getRenderKitGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, Renderkit,
-									FacesConfigPackage.eINSTANCE
-											.getRenderKitType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		renderkitIdField = new StringDialogField();
-		// renderkitIdField.setRequired(true);
-		renderkitIdField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_RenderKitID);
-		renderkitIdField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		renderkitIdField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						RenderKitIdType RenderkitId = FacesConfigFactory.eINSTANCE
-								.createRenderKitIdType();
-						RenderkitId.setTextContent(((StringDialogField) field)
-								.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getRenderKitType_RenderKitId(),
-									RenderkitId);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-					}
-				});
-
-		renderkitClassField = new ClassButtonDialogField(null);
-		// renderkitClassField.setRequired(true);
-		renderkitClassField
-				.setLabelText(EditorMessages.RenderKitGeneralSection_Label_RenderKitClass);
-		renderkitClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		renderkitClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		LayoutUtil.setHorizontalGrabbing(renderkitClassField.getTextControl(
-				toolkit, container));
-
-		renderkitClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						RenderKitClassType RenderkitClass = FacesConfigFactory.eINSTANCE
-								.createRenderKitClassType();
-						RenderkitClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getRenderKitType_RenderKitClass(),
-									RenderkitClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		renderkitClassField
-				.setSuperClassName(IFacesConfigConstants.RENDER_KIT_SUPER_CLASS);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof RenderKitType) {
-			final RenderKitType renderkit = (RenderKitType) input;
-			refreshControls(renderkit);
-		}
-	}
-
-	private void refreshControls(RenderKitType renderkit) {
-		if (renderkit.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) renderkit
-					.getDisplayName().get(0);
-			displayNameField.setTextWithoutUpdate(displayName
-					.getTextContent());
-		} else {
-			displayNameField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (renderkit.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) renderkit
-					.getDescription().get(0);
-			String descriptionString = description.getTextContent();
-			descriptionString = ModelUtil
-					.unEscapeEntities(descriptionString);
-			descriptionField.setTextWithoutUpdate(descriptionString);
-		} else {
-			descriptionField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (renderkit.getRenderKitId() != null) {
-			renderkitIdField.setTextWithoutUpdate(renderkit
-					.getRenderKitId().getTextContent());
-		} else {
-			renderkitIdField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (renderkit.getRenderKitClass() != null) {
-			renderkitClassField.setTextWithoutUpdate(renderkit
-					.getRenderKitClass().getTextContent());
-		} else {
-			renderkitClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-	}
-	/**
-	 * Add RenderKitGeneralAdapter onto <render-kit> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		RenderKitType renderkit = (RenderKitType) newInput;
-		if (EcoreUtil.getExistingAdapter(renderkit,
-				RenderkitGeneralSection.class) == null) {
-
-			renderkit.eAdapters().add(getRenderKitGeneralAdapter());
-		}
-
-		if (renderkit.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) renderkit
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					RenderkitGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getRenderKitGeneralAdapter());
-			}
-		}
-
-		if (renderkit.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) renderkit
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					RenderkitGeneralSection.class) == null) {
-
-				description.eAdapters().add(getRenderKitGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove RenderKitGeneralAdapter from <render-kit> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		RenderKitType renderkit = (RenderKitType) oldInput;
-		if (EcoreUtil.getExistingAdapter(renderkit,
-				RenderkitGeneralSection.class) != null) {
-			renderkit.eAdapters().remove(getRenderKitGeneralAdapter());
-		}
-		if (renderkit.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) renderkit
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					RenderkitGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getRenderKitGeneralAdapter());
-			}
-		}
-
-		if (renderkit.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) renderkit
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					RenderkitGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getRenderKitGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getRenderKitGeneralAdapter() {
-
-		if (renderKitGeneralAdapter == null) {
-			renderKitGeneralAdapter = new RenderKitGeneralAdapter();
-		}
-		return renderKitGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <render-kit> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class RenderKitGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == RenderkitGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getRenderKitType_RenderKitId()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getRenderKitType_RenderKitClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getRenderKitType_Description()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getRenderKitType_DisplayName()) {
-					refreshInUIThread();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refreshInUIThread();
-				}
-			}
-		}
-
-		private void refreshInUIThread() {
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-				refresh();
-			} else {				
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						refresh();
-					}
-				});
-			}		
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitMasterSection.java
deleted file mode 100644
index 513426c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitMasterSection.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class RenderkitMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public RenderkitMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.RenderKitMasterSection_Name);
-		getSection().setDescription(
-				EditorMessages.RenderKitMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * RenderKitType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getRenderKitType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new render kit.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		RenderKitType Renderkit = FacesConfigFactory.eINSTANCE
-				.createRenderKitType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_RenderKit(), Renderkit);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(Renderkit);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorGeneralSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorGeneralSection.java
deleted file mode 100644
index 3b478ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorGeneralSection.java
+++ /dev/null
@@ -1,416 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ValidatorGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField validatorIDField;
-
-	private ClassButtonDialogField validatorClassField;
-
-	private ValidatorGeneralAdapter validatorGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ValidatorGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.ValidatorGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ValidatorGeneralSection_Description);
-	}
-
-	/**
-	 * 
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						ValidatorType validator = (ValidatorType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (validator.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) validator
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-							displayNameType.eAdapters().add(
-									getValidatorGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, validator,
-									FacesConfigPackage.eINSTANCE
-											.getValidatorType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						ValidatorType validator = (ValidatorType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (validator.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) validator
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-							description.eAdapters().add(
-									getValidatorGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, validator,
-									FacesConfigPackage.eINSTANCE
-											.getValidatorType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		validatorIDField = new StringDialogField();
-		// validatorIDField.setRequired(true);
-		validatorIDField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_ValidatorID);
-		validatorIDField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		validatorIDField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						ValidatorIdType ValidatorType = FacesConfigFactory.eINSTANCE
-								.createValidatorIdType();
-						ValidatorType
-								.setTextContent(((StringDialogField) field)
-										.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getValidatorType_ValidatorId(),
-									ValidatorType);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-					}
-				});
-
-		validatorClassField = new ClassButtonDialogField(null);
-		// validatorClassField.setRequired(true);
-		validatorClassField
-				.setLabelText(EditorMessages.ValidatorGeneralSection_Label_ValidatorClass);
-		validatorClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		validatorClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(validatorClassField.getTextControl(
-				toolkit, container));
-
-		validatorClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ValidatorClassType ValidatorClass = FacesConfigFactory.eINSTANCE
-								.createValidatorClassType();
-						ValidatorClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getValidatorType_ValidatorClass(),
-									ValidatorClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		validatorClassField
-				.setInterface(IFacesConfigConstants.VALIDATOR_INTERFACE);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * 
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ValidatorType) {
-			final ValidatorType validator = (ValidatorType) input;
-			refreshControls(validator);
-		}
-	}
-	
-	private void refreshControls(final ValidatorType validator) {
-		if (validator.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) validator
-					.getDisplayName().get(0);
-			displayNameField.setTextWithoutUpdate(displayName
-					.getTextContent());
-		} else {
-			displayNameField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (validator.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) validator
-					.getDescription().get(0);
-			String descriptionString = description.getTextContent();
-			descriptionString = ModelUtil
-					.unEscapeEntities(descriptionString);
-			descriptionField.setTextWithoutUpdate(descriptionString);
-		} else {
-			descriptionField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (validator.getValidatorId() != null) {
-			validatorIDField.setTextWithoutUpdate(validator
-					.getValidatorId().getTextContent());
-		} else {
-			validatorIDField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-		if (validator.getValidatorClass() != null) {
-			validatorClassField.setTextWithoutUpdate(validator
-					.getValidatorClass().getTextContent());
-		} else {
-			validatorClassField.setTextWithoutUpdate(""); //$NON-NLS-1$
-		}
-
-	}
-
-	/**
-	 * Add ValidatorGeneralAdapter onto <validator> and the first <display-name>
-	 * and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		ValidatorType validator = (ValidatorType) newInput;
-		if (EcoreUtil.getExistingAdapter(validator,
-				ValidatorGeneralSection.class) == null) {
-
-			validator.eAdapters().add(getValidatorGeneralAdapter());
-		}
-
-		if (validator.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) validator
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ValidatorGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getValidatorGeneralAdapter());
-			}
-		}
-
-		if (validator.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) validator
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ValidatorGeneralSection.class) == null) {
-
-				description.eAdapters().add(getValidatorGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove ValidatorGeneralAdapter from <validator> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		ValidatorType validator = (ValidatorType) oldInput;
-		if (EcoreUtil.getExistingAdapter(validator,
-				ValidatorGeneralSection.class) != null) {
-			validator.eAdapters().remove(getValidatorGeneralAdapter());
-		}
-		if (validator.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) validator
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ValidatorGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getValidatorGeneralAdapter());
-			}
-		}
-
-		if (validator.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) validator
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ValidatorGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getValidatorGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getValidatorGeneralAdapter() {
-
-		if (validatorGeneralAdapter == null) {
-			validatorGeneralAdapter = new ValidatorGeneralAdapter();
-		}
-		return validatorGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <validator> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class ValidatorGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ValidatorGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getValidatorType_ValidatorId()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getValidatorType_ValidatorClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getValidatorType_Description()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getValidatorType_DisplayName()) {
-					refreshInUIThread();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refreshInUIThread();
-				}
-			}
-		}
-		private void refreshInUIThread() {
-			if (Thread.currentThread() == PlatformUI.getWorkbench().getDisplay().getThread()) {
-				refresh();
-			} else {				
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						refresh();
-					}
-				});
-			}		
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorMasterSection.java
deleted file mode 100644
index 89f3298..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorMasterSection.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.page.FacesConfigMasterDetailPage;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Bryan Yang
- * 
- */
-public class ValidatorMasterSection extends FacesConfigMasterSection {
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param toolkit
-	 * @param page
-	 */
-	public ValidatorMasterSection(Composite parent, IManagedForm managedForm,
-			FormToolkit toolkit, FacesConfigMasterDetailPage page) {
-		super(parent, managedForm, toolkit, page, null, null);
-		getSection().setText(EditorMessages.ValidatorMasterSection_Name);
-		getSection().setDescription(
-				EditorMessages.ValidatorMasterSection_Description);
-	}
-
-	/**
-	 * Config the table viwer, set a filter for it, only the object of
-	 * ValidatorType will be selected.
-	 */
-	protected void configViewer(StructuredViewer structuredViewer) {
-		super.configViewer(structuredViewer);
-		structuredViewer.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement,
-					Object element) {
-				return FacesConfigPackage.eINSTANCE.getValidatorType()
-						.isInstance(element);
-			}
-		});
-
-	}
-
-	/**
-	 * Create a new Validator.
-	 */
-	protected void addButtonSelected(SelectionEvent e) {
-		ValidatorType Validator = FacesConfigFactory.eINSTANCE
-				.createValidatorType();
-
-		Command command = AddCommand.create(getEditingDomain(),
-				this.getInput(), FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Validator(), Validator);
-
-		if (command.canExecute()) {
-			getEditingDomain().getCommandStack().execute(command);
-			IStructuredSelection selection = new StructuredSelection(Validator);
-			getStructuredViewer().refresh();
-			getStructuredViewer().setSelection(selection);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanProperty.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanProperty.java
deleted file mode 100644
index fcd01ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanProperty.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import org.eclipse.jdt.core.IMethod;
-
-/**
- * This class is used to encapsulate the property following the java bean's
- * spec.
- * 
- * @author xgzhang
- * @version
- */
-public class JavaBeanProperty {
-	private String name;
-
-	private String qualifiedType;
-
-	private String signatureType;
-
-	private IMethod getterMethod;
-
-	private IMethod setterMethod;
-
-	/**
-	 * @param name 
-	 * @param signatureType 
-	 * @param getterMethod 
-	 * @param setterMethod 
-	 */
-	public JavaBeanProperty(String name, String signatureType,
-			IMethod getterMethod, IMethod setterMethod) {
-		this.name = name;
-		this.signatureType = signatureType;
-
-		this.getterMethod = getterMethod;
-		this.setterMethod = setterMethod;
-	}
-
-	/**
-	 * @return Returns the name.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @return Returns the setterMethod.
-	 */
-	public IMethod getSetterMethod() {
-		return setterMethod;
-	}
-
-	/**
-	 * @return Returns the setterMethod.
-	 */
-	public IMethod getGetterMethod() {
-		return getterMethod;
-	}
-
-	/**
-	 * @return Returns the type.
-	 */
-	public String getQualifiedType() {
-		if (qualifiedType == null) {
-			IMethod getterSetterMethod = getterMethod != null ? getterMethod
-					: setterMethod;
-
-			qualifiedType = JavaClassUtils.getQualifiedTypeNameInTypeHierarchy(
-					getterSetterMethod.getDeclaringType(), signatureType);
-		}
-		return qualifiedType;
-	}
-
-	/**
-	 * @return Returns the signatureType.
-	 */
-	public String getSignatureType() {
-		return signatureType;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanUtils.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanUtils.java
deleted file mode 100644
index 83c36cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaBeanUtils.java
+++ /dev/null
@@ -1,775 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import java.beans.Introspector;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JavaModelUtil;
-
-/**
- * This utility class is used to access java bean class, e.g., get java bean's
- * property
- * 
- * @author xgzhang
- * @version
- */
-public final class JavaBeanUtils {
-	/**
-	 * fully qualified name of a List
-	 */
-	private static final String JAVA_UTIL_LIST = "java.util.List"; //$NON-NLS-1$
-
-	/**
-	 * fully qualifed name of a Map
-	 */
-	private static final String JAVA_UTIL_MAP = "java.util.Map"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	private JavaBeanUtils() {
-		super();
-	}
-
-	/**
-	 * get the getter method according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertyGetterMethod(IType type,
-			String propertyName)  {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod getterMethod = null;
-
-		String methodBaseName = null;
-		// Uppercase 1st letter
-		if (propertyName.length() == 1) {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase();
-		} else {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase()
-					+ propertyName.substring(1);
-		}
-
-		String getterMethodName = "get" + methodBaseName; //$NON-NLS-1$
-
-		getterMethod = type.getMethod(getterMethodName, null);
-		if (getterMethod == null || !getterMethod.exists()
-				|| !JavaClassUtils.isPublicMethod(getterMethod)) {
-			getterMethodName = "is" + methodBaseName; //$NON-NLS-1$
-			getterMethod = type.getMethod(getterMethodName, null);
-
-			if (getterMethod == null || !getterMethod.exists()
-					|| !JavaClassUtils.isPublicMethod(getterMethod)) {
-				getterMethod = null;
-			}
-		}
-		return getterMethod;
-	}
-
-	/**
-	 * get the getter method in the type hierarchy according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertyGetterMethodInTypeHierarchy(IType type,
-			String propertyName) throws JavaModelException {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod getterMethod = null;
-
-		getterMethod = getPropertyGetterMethod(type, propertyName);
-
-		if (getterMethod == null) {
-			ITypeHierarchy typeHierarchy = null;
-			typeHierarchy = type.newSupertypeHierarchy(null);
-
-			if (typeHierarchy == null) {
-				return null;
-			}
-
-			IType[] superTypes = typeHierarchy.getAllSuperclasses(type);
-
-			if (superTypes == null || superTypes.length == 0) {
-				return null;
-			}
-			for (int i = 0; i < superTypes.length; i++) {
-				if (!superTypes[i].getFullyQualifiedName().equals(
-						"java.lang.Object")) { //$NON-NLS-1$
-					getterMethod = getPropertyGetterMethod(superTypes[i],
-							propertyName);
-					if (getterMethod != null) {
-						break;
-					}
-				}
-			}
-		}
-		return getterMethod;
-	}
-
-	/**
-	 * get the setter method in the type hierarchy according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertySetterMethodInTypeHierarchy(IType type,
-			String propertyName) throws JavaModelException {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod setterMethod = null;
-
-		setterMethod = getPropertySetterMethod(type, propertyName);
-
-		if (setterMethod == null) {
-			ITypeHierarchy typeHierarchy = null;
-			typeHierarchy = type.newSupertypeHierarchy(null);
-
-			if (typeHierarchy == null) {
-				return null;
-			}
-
-			IType[] superTypes = typeHierarchy.getAllSuperclasses(type);
-
-			if (superTypes == null || superTypes.length == 0) {
-				return null;
-			}
-			for (int i = 0; i < superTypes.length; i++) {
-				if (!superTypes[i].getFullyQualifiedName().equals(
-						"java.lang.Object")) { //$NON-NLS-1$
-					setterMethod = getPropertySetterMethod(superTypes[i],
-							propertyName);
-					if (setterMethod != null) {
-						break;
-					}
-				}
-			}
-		}
-
-		return setterMethod;
-	}
-
-	/**
-	 * get the setter method according to property name
-	 * 
-	 * @param type
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * @throws JavaModelException
-	 */
-	private static IMethod getPropertySetterMethod(IType type,
-			String propertyName) throws JavaModelException {
-		if (type == null || !type.exists() || propertyName == null) {
-			return null;
-		}
-		IMethod setterMethod = null;
-
-		String methodBaseName = null;
-		// Uppercase 1st letter
-		if (propertyName.length() == 1) {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase();
-		} else {
-			methodBaseName = propertyName.substring(0, 1).toUpperCase()
-					+ propertyName.substring(1);
-		}
-
-		String setterMethodName = "set" + methodBaseName; //$NON-NLS-1$
-
-		IMethod[] methods = null;
-
-		methods = type.getMethods();
-
-		if (methods == null || methods.length == 0) {
-			return null;
-		}
-
-		for (int i = 0; i < methods.length; i++) {
-			if (methods[i].getElementName().equals(setterMethodName)) {
-				if (methods[i] == null || !methods[i].exists()
-						|| !JavaClassUtils.isPublicMethod(methods[i])) {
-					continue;
-				}
-
-				// Method must return void
-				String returnType = methods[i].getReturnType();
-				if (!returnType.equals(Signature.SIG_VOID)) {
-					continue;
-				}
-
-				String params[] = methods[i].getParameterTypes();
-				// method must have only one argument
-				if (params.length != 1) {
-					continue;
-				}
-				setterMethod = methods[i];
-			}
-		}
-
-		return setterMethod;
-	}
-
-	/**
-	 * Check whether the propertyName is bean's property or not.
-	 * 
-	 * @param baseType
-	 * @param propertyName
-	 * 
-	 * @return - True means the property name is valid bean's property,
-	 *         otherwise, not.
-	 * 
-	 */
-	public static boolean isBeanProperty(IType baseType, String propertyName)
-    {
-		if (baseType == null || !baseType.exists() || propertyName == null) {
-			return false;
-		}
-
-		return (getBeanPropertyType(baseType, propertyName) != null);
-	}
-
-	/**
-	 * get the bean's property type
-	 * 
-	 * @param baseType
-	 * @param propertyName
-	 * @return - can be <b>null</b>, if not found
-	 * 
-	 */
-	public static IType getBeanPropertyType(IType baseType, String propertyName) {
-		if (baseType == null || !baseType.exists() || propertyName == null) {
-			return null;
-		}
-
-		String typeSignature = null;
-		IMethod getterMethod = null;
-		IMethod setterMethod = null;
-
-		IType declaredType = baseType;
-		try {
-			getterMethod = getPropertyGetterMethodInTypeHierarchy(baseType,
-					propertyName);
-			setterMethod = getPropertySetterMethodInTypeHierarchy(baseType,
-					propertyName);
-		} catch (JavaModelException e1) {
-			// Need not any error handling.
-		}
-
-		if (getterMethod != null && setterMethod == null) {
-			declaredType = getterMethod.getDeclaringType();
-			try {
-				typeSignature = getterMethod.getReturnType();
-			} catch (JavaModelException e2) {
-				// Need not any error handling.
-			}
-		} else if (setterMethod != null && getterMethod == null) {
-			declaredType = setterMethod.getDeclaringType();
-			typeSignature = setterMethod.getParameterTypes()[0];
-		} else if (setterMethod != null && getterMethod != null) {
-			declaredType = getterMethod.getDeclaringType();
-			try {
-				// FIXME: should check the type hierachy
-				if (getterMethod.getReturnType().equals(
-						setterMethod.getParameterTypes()[0])) {
-					typeSignature = getterMethod.getReturnType();
-				}
-			} catch (JavaModelException e2) {
-				// Need not any error handling.
-			}
-		}
-
-		if (typeSignature == null) {
-			return null;
-		}
-
-		IType type = null;
-
-		try {
-			String typeName = JavaModelUtil.getResolvedTypeName(typeSignature,
-					declaredType);
-			if (typeName != null) {
-				type = baseType.getJavaProject().findType(typeName);
-			}
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-		return type;
-	}
-
-	/**
-	 * get the bean's property's getter and setter methods.
-	 * 
-	 * @param baseType
-	 * @param propertyName
-	 * @return - IMethod[], the first is getter and the second is setter method,
-	 *         however, both of them can be null.
-	 */
-	public static IMethod[] getBeanPropertyMethods(IType baseType,
-			String propertyName) {
-		if (baseType == null || !baseType.exists() || propertyName == null) {
-			return null;
-		}
-
-		IMethod[] methods = new IMethod[2];
-
-		IMethod getterMethod = null;
-		IMethod setterMethod = null;
-		try {
-			getterMethod = getPropertyGetterMethodInTypeHierarchy(baseType,
-					propertyName);
-
-			setterMethod = getPropertySetterMethodInTypeHierarchy(baseType,
-					propertyName);
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-
-		if (getterMethod != null && setterMethod == null) {
-			methods[0] = getterMethod;
-		} else if (setterMethod != null && getterMethod == null) {
-			methods[1] = setterMethod;
-		} else if (setterMethod != null && getterMethod != null) {
-			try {
-				// FIXME: should check the type hierachy
-				if (getterMethod.getReturnType().equals(
-						setterMethod.getParameterTypes()[0])) {
-					methods[0] = getterMethod;
-					methods[1] = setterMethod;
-				}
-			} catch (JavaModelException e1) {
-				// Need not any error handling.
-			}
-		}
-
-		return methods;
-	}
-
-	/**
-	 * check whether the type implements <code>java.util.List</code>
-	 * 
-	 * @param type
-	 * @return - True if the type is the sub class of
-	 *         <code>java.util.List</code>, otherwise, not.
-	 */
-	public static boolean isListType(IType type) {
-		if (type == null) {
-			return false;
-		}
-		if (type.getFullyQualifiedName().equalsIgnoreCase(JAVA_UTIL_LIST)) {
-			return true;
-		}
-
-		return JavaClassUtils.isSubClassOf(type.getJavaProject(), type
-				.getFullyQualifiedName(), JAVA_UTIL_LIST);
-	}
-
-	/**
-	 * check whether the type implements <code>java.util.Map</code>
-	 * 
-	 * @param type
-	 * @return - True if the type is the sub class of <code>java.uitl.Map</code>,
-	 *         otherwise, not.
-	 */
-	public static boolean isMapType(IType type) {
-		if (type == null) {
-			return false;
-		}
-		if (type.getFullyQualifiedName().equalsIgnoreCase(JAVA_UTIL_MAP)) {
-			return true;
-		}
-
-		return JavaClassUtils.isSubClassOf(type.getJavaProject(), type
-				.getFullyQualifiedName(), JAVA_UTIL_MAP);
-	}
-
-	/**
-	 * Test for method inclusion in bindings list.
-	 * <p>
-	 * This test has the following conditions:
-	 * </p>
-	 * <ul>
-	 * <li>method starts with <code>get</code></li>
-	 * <li>method has no arguments</li>
-	 * <li>method does not return void</li>
-	 * </ul>
-	 * 
-	 * @param method -
-	 *            the IMethod to examine
-	 * @return boolean - true, if method satisfies the condition test
-	 */
-	public static boolean isGetterMethod(IMethod method) {
-		try {
-			if (!JavaClassUtils.isPublicMethod(method)) {
-				return false;
-			}
-			String params[] = method.getParameterTypes();
-			// Has no arguments
-			if (params.length > 0) {
-				return false;
-			}
-
-			// Starts with "get"
-			if (!(method.getElementName().startsWith("get") || method.getElementName().startsWith("is"))) //$NON-NLS-1$ //$NON-NLS-2$
-			{
-				return false;
-			}
-			// Does not return void
-			String rtn = method.getReturnType();
-			if (!rtn.equals(Signature.SIG_VOID)) {
-				return true;
-			}
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-		return false;
-	}
-
-	/**
-	 * Test for method inclusion in bindings list.
-	 * <p>
-	 * This test has the following conditions:
-	 * </p>
-	 * <ul>
-	 * <li>method starts with <code>set</code></li>
-	 * <li>method returns void</li>
-	 * </ul>
-	 * 
-	 * @param method -
-	 *            the IMethod to examine
-	 * @return boolean - true, if method satisfies the condition test
-	 */
-	public static boolean isSetterMethod(IMethod method) {
-		try {
-			if (!JavaClassUtils.isPublicMethod(method)) {
-				return false;
-			}
-			// Starts with "set"
-			if (!method.getElementName().startsWith("set")) //$NON-NLS-1$
-			{
-				return false;
-			}
-
-			// the parameter's number should be one.
-			if (method.getParameterTypes().length != 1) {
-				return false;
-			}
-			// Returns void
-			String rtn = method.getReturnType();
-			if (rtn.equals(Signature.SIG_VOID)) {
-				return true;
-			}
-		} catch (JavaModelException e) {
-			// Need not any error handling.
-		}
-		return false;
-	}
-
-	/**
-	 * set the first character into low case.
-	 * 
-	 * @param str
-	 * @return str with the first char lower cased
-	 */
-	public static String toLowCaseFirstChar(String str) {
-		// change the first alphabet to lowcase.
-		if (str != null && str.length() > 0) {
-			if (str.length() == 1) {
-				str = str.toLowerCase();
-			} else {
-				str = str.substring(0, 1).toLowerCase() + str.substring(1);
-			}
-		}
-		return str;
-	}
-
-	/**
-	 * set the first character into low case.
-	 * 
-	 * @param str
-	 * @return str with the first char upper-cased
-	 */
-	public static String toUpperCaseFirstChar(String str) {
-		// change the first alphabet to lowcase.
-		if (str != null && str.length() > 0) {
-			if (str.length() == 1) {
-				str = str.toUpperCase();
-			} else {
-				str = str.substring(0, 1).toUpperCase() + str.substring(1);
-			}
-		}
-		return str;
-	}
-
-	/**
-	 * get property name from getter method.
-	 * 
-	 * @param method
-	 * @return - can be <b>null</b>, if the method is not a valid getter method
-	 */
-	public static String getPropertyNameFromGetterMethod(IMethod method) {
-		if (!isGetterMethod(method)) {
-			return null;
-		}
-		String methodName = method.getElementName();
-		String propertyName = null;
-		// Starts with "get"
-		if (methodName.startsWith("get") && methodName.length() > 3) { //$NON-NLS-1$
-			propertyName = methodName.substring(3);
-		} else if (methodName.startsWith("is") && methodName.length() > 2) // Starts //$NON-NLS-1$
-		// with
-		// "is"
-		{
-			propertyName = methodName.substring(2);
-		}
-		propertyName = Introspector.decapitalize(propertyName);
-		return propertyName;
-	}
-
-	/**
-	 * get property name from setter class.
-	 * 
-	 * @param method
-	 * @return - can be <b>null</b>, if the method is not a valid setter method
-	 */
-	public static String getPropertyNameFromSetterMethod(IMethod method) {
-		if (!isSetterMethod(method)) {
-			return null;
-		}
-		String methodName = method.getElementName();
-		String propertyName = null;
-		// Starts with "get"
-		if (methodName.startsWith("set") && methodName.length() > 3) { //$NON-NLS-1$
-			propertyName = methodName.substring(3);
-		}
-		propertyName = Introspector.decapitalize(propertyName);
-		return propertyName;
-	}
-
-	/**
-	 * get the method with the same parameters
-	 * 
-	 * @param methods
-	 * @param visitedMethods
-	 * @param foundMethod
-	 * @param foundMethodName
-	 * @param foundParamTypes
-	 * @return
-	 */
-	private static IMethod getMethodWithSameParamters(IMethod[] methods,
-			Map visitedMethods, IMethod foundMethod, String foundMethodName,
-			String[] foundParamTypes) {
-		// get all qualified type name for the found method's parameters.
-		String[] foundParamQulifiedTypeNames = null;
-		if (foundParamTypes != null && foundParamTypes.length > 0) {
-			foundParamQulifiedTypeNames = new String[foundParamTypes.length];
-			for (int i = 0; i < foundParamTypes.length; i++) {
-				foundParamQulifiedTypeNames[i] = JavaClassUtils
-						.getQualifiedTypeNameInTypeHierarchy(foundMethod
-								.getDeclaringType(), foundParamTypes[i]);
-			}
-		}
-		for (int i = 0; i < methods.length; i++) {
-			if (visitedMethods.get(methods[i]) != null) {
-				continue;
-			}
-
-			if (!methods[i].getElementName().equals(foundMethodName)) {
-				continue;
-			}
-			if (methods[i].getParameterTypes() == null
-					&& foundParamTypes == null) {
-				return methods[i];
-			} else if (methods[i].getParameterTypes() != null
-					&& foundParamTypes != null
-					&& foundParamTypes.length == methods[i].getParameterTypes().length) {
-				boolean bSameParams = true;
-				String[] methodParamTypes = methods[i].getParameterTypes();
-				for (int j = 0; j < foundParamQulifiedTypeNames.length; j++) {
-					String methodParamQualifiedTypeName = JavaClassUtils
-							.getQualifiedTypeNameInTypeHierarchy(methods[i]
-									.getDeclaringType(), methodParamTypes[j]);
-					// if the qualified type name is not same or not subclass or
-					// supper class between each other.
-					if (!methodParamQualifiedTypeName
-							.equals(foundParamQulifiedTypeNames[j])
-							&& !JavaClassUtils.isSubClassOf(methods[i]
-									.getJavaProject(),
-									methodParamQualifiedTypeName,
-									foundParamQulifiedTypeNames[j])
-							&& !JavaClassUtils.isSubClassOf(methods[i]
-									.getJavaProject(),
-									foundParamQulifiedTypeNames[j],
-									methodParamQualifiedTypeName)) {
-						bSameParams = false;
-						break;
-					}
-				}
-				if (bSameParams) {
-					return methods[i];
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Creates an array of bean properties
-	 * 
-	 * 
-	 * @param classType
-	 * @return it can be <b>null</b>, if property is not found.
-	 */
-	public static JavaBeanProperty[] getBeanProperties(IType classType) {
-		IMethod[] methods;
-		try {
-			methods = JavaClassUtils.getMethods(classType);
-		} catch (JavaModelException e2) {
-			return null;
-		}
-
-		return getBeanProperties(classType, methods);
-	}
-
-	/**
-	 * Creates an array of bean properties
-	 * 
-	 * @param type
-	 * @param methods
-	 * 
-	 * @return - the array of java bean properties.
-	 */
-	public static JavaBeanProperty[] getBeanProperties(IType type,
-			IMethod[] methods) {
-		if (methods == null || methods.length == 0) {
-			return null;
-		}
-
-		List properties = new ArrayList();
-		Map visitedMethods = new HashMap();
-		for (int m = 0; m < methods.length; m++) {
-			String propertyName = null;
-			// if a property's getter method or setter method already visited,
-			// just skip it.
-			if (visitedMethods.get(methods[m]) != null) {
-				continue;
-			}
-
-			visitedMethods.put(methods[m], methods[m]);
-
-			// Check getter firstly
-			propertyName = JavaBeanUtils
-					.getPropertyNameFromGetterMethod(methods[m]);
-
-			if (propertyName != null && propertyName.length() > 0)
-			{
-				String setterMethodName = "set" //$NON-NLS-1$
-						+ JavaBeanUtils.toUpperCaseFirstChar(propertyName);
-
-				String getterReturnType = null;
-				try {
-					getterReturnType = methods[m].getReturnType();
-				} catch (JavaModelException e1) {
-					continue;
-				}
-				IMethod setterMethod = getMethodWithSameParamters(methods,
-						visitedMethods, methods[m], setterMethodName,
-						new String[] { getterReturnType });
-				if (setterMethod != null && setterMethod.exists()) {
-					visitedMethods.put(setterMethod, setterMethod);
-				}
-
-				properties.add(new JavaBeanProperty(propertyName,
-						getterReturnType, methods[m], setterMethod));
-				continue;
-			}
-
-			// Check setter secondly.
-			propertyName = JavaBeanUtils
-					.getPropertyNameFromSetterMethod(methods[m]);
-
-			if (propertyName != null && propertyName.length() > 0)
-			{
-				// first form of getter method, "get..."
-				String getterMethodName = "get" //$NON-NLS-1$
-						+ JavaBeanUtils.toUpperCaseFirstChar(propertyName);
-				IMethod getterMethod = getMethodWithSameParamters(methods,
-						visitedMethods, methods[m], getterMethodName, null);
-
-				if (getterMethod != null && getterMethod.exists()) {
-					try {
-						if (getterMethod.getReturnType().equals(
-								methods[m].getParameterTypes()[0])) {
-							visitedMethods.put(getterMethod, getterMethod);
-						}
-					} catch (JavaModelException e) {
-						// need not error logging
-					}
-				} else {
-					// another form of getter method, "is...".
-					getterMethodName = "is" //$NON-NLS-1$
-							+ JavaBeanUtils.toUpperCaseFirstChar(propertyName);
-					getterMethod = getMethodWithSameParamters(methods,
-							visitedMethods, methods[m], getterMethodName, null);
-					try {
-						if (getterMethod != null
-								&& getterMethod.exists()
-								&& getterMethod.getReturnType().equals(
-										methods[m].getParameterTypes()[0])) {
-							visitedMethods.put(getterMethod, getterMethod);
-						}
-					} catch (JavaModelException e) {
-						// need not error logging
-					}
-				}
-
-				properties.add(new JavaBeanProperty(propertyName, methods[m]
-						.getParameterTypes()[0], getterMethod, methods[m]));
-				continue;
-			}
-		}
-
-		JavaBeanProperty[] propertyArray = (JavaBeanProperty[]) properties
-				.toArray(new JavaBeanProperty[properties.size()]);
-
-		Arrays.sort(propertyArray, new Comparator() {
-			public int compare(Object o1, Object o2) {
-				String name1 = ((JavaBeanProperty) o1).getName();
-				String name2 = ((JavaBeanProperty) o2).getName();
-				return name1.compareTo(name2);
-			}
-		});
-		return propertyArray;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaClassUtils.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaClassUtils.java
deleted file mode 100644
index 6d24899..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/JavaClassUtils.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageDeclaration;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JavaModelUtil;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-
-/**
- * This utility class defines typical operations on java class, such as check
- * public constructor, and check type is primitive or not, etc.
- * 
- * @author Jane Cantz, Xiao-guang Zhang
- */
-public class JavaClassUtils {
-	/**
-	 * Determines if a string contains any illegal characters
-	 * 
-	 * @param text -
-	 *            the string to test
-	 * @return boolean - true if an illegal character is found, otherwise false
-	 */
-	public static boolean hasIllegalCharacters(String text) {
-		if (text.length() == 0
-				|| !Character.isJavaIdentifierStart(text.charAt(0))) {
-			return true;
-		}
-		for (int i = 1; i < text.length(); i++) {
-			if (!Character.isJavaIdentifierPart(text.charAt(i))) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Test for constructor.
-	 * <p>
-	 * This test determines if the class has any constructors
-	 * </p>
-	 * 
-	 * @param methods -
-	 *            the IMethod array to examine
-	 * @return boolean - true, if method has no constructors
-	 */
-	public static boolean hasNoConstructor(IMethod[] methods) {
-		for (int m = 0; m < methods.length; m++) {
-			try {
-				if (methods[m].isConstructor()) {
-					return false;
-				}
-			} catch (JavaModelException e) {
-                // suppress: this is possible; fall through
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * check whether the method is public or not.
-	 * 
-	 * @param method
-	 * @return true if method is public
-	 */
-	public static boolean isPublicMethod(IMethod method) {
-		int accessFlags = 0;
-
-		try {
-			accessFlags = method.getFlags();
-		} catch (JavaModelException e) {
-			return false;
-		}
-
-		boolean isPublic = Flags.isPublic(accessFlags);
-		if ((!Flags.isPrivate(accessFlags))
-				&& (!Flags.isProtected(accessFlags))
-				&& (!Flags.isPublic(accessFlags))) {
-			// No specific modifier was set, so assume to be public
-			isPublic = true;
-		}
-		if (!isPublic) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Test for constructor.
-	 * <p>
-	 * This test has the following conditions:
-	 * </p>
-	 * <ul>
-	 * <li>method takes 0 arguments and the method name is the class name:
-	 * <ul>
-	 * <li>takes 0 arguments</li>
-	 * <li>the method name is the class name</li>
-	 * <li>the method returns void</code></li>
-	 * </ul>
-	 * </li>
-	 * </ul>
-	 * 
-	 * @param methods -
-	 *            the IMethod array to examine
-	 * @return boolean - true, if method is a constructor
-	 */
-	public static boolean hasPublicConstructor(IMethod[] methods) {
-		for (int m = 0; m < methods.length; m++) {
-			try {
-				if (methods[m].isConstructor() && isPublicMethod(methods[m])) {
-					// Constructor must have the following 0 arguments
-					String[] params = methods[m].getParameterTypes();
-					if (params.length == 0) {
-						// And must return a void
-						String rtn = methods[m].getReturnType();
-						if (rtn.equals(Signature.SIG_VOID)) {
-							return true;
-						}
-						break;
-					}
-				}
-			} catch (JavaModelException e) {
-				// Nothing to do.
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Determines if a datatype is primitive type or part of java.lang or
-	 * java.util package. If not, it is considered to be a bean reference
-	 * 
-	 * @param classType -
-	 *            the parent class compilation unit
-	 * @param signatureName -
-	 *            the datatype of the property
-	 * @return boolean - true, if the datatype is primitive or part of java.lang
-	 *         or java.util package
-	 */
-	public static boolean isPrimitiveType(IType classType, String signatureName) {
-		while (signatureName.startsWith("[")) { //$NON-NLS-1$
-			signatureName = signatureName.substring(1);
-		}
-		int kind = Signature.getTypeSignatureKind(signatureName);
-		if (kind == Signature.BASE_TYPE_SIGNATURE
-				|| signatureName.equals(Signature.SIG_VOID)) {
-			// These are true primitive types
-			return true;
-		}
-
-		String qualifiedName = getQualifiedTypeNameInTypeHierarchy(classType,
-				signatureName);
-
-		if ((qualifiedName.startsWith("java.lang")) || (qualifiedName.startsWith("java.util"))) //$NON-NLS-1$ //$NON-NLS-2$
-		{
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * get the type from the input class name
-	 * 
-	 * @param project
-	 * @param className
-	 * @return - can be null.
-	 */
-	public static IType getType(IProject project, String className) {
-		if (project == null) {
-			return null;
-		}
-		IType cunit = null;
-		if (className.length() > 0) {
-
-			IJavaProject jProject = JavaCore.create(project);
-			try {
-				cunit = jProject.findType(className);
-			} catch (JavaModelException e) {
-                // suppress: fall-through and return null
-			}
-		}
-		return cunit;
-	}
-
-	/**
-	 * open the type in the editor.
-	 * 
-	 * @param type
-	 * @return true if the type could opened in an editor
-	 */
-	public static boolean openType(IType type) {
-		if (type == null || !type.exists()) {
-			return false;
-		}
-
-		try {
-			IEditorPart editorPart = JavaUI.openInEditor(type
-					.getPrimaryElement());
-			if (editorPart != null) {
-				JavaUI.revealInEditor(editorPart, type.getPrimaryElement());
-				return true;
-			}
-		} catch (PartInitException e) {
-			// ignore this error.
-		} catch (JavaModelException e) {
-			// ignore this error.
-		}
-		return false;
-	}
-
-	/**
-	 * get package name from java source file
-	 * 
-	 * @param javaFile
-	 * @return - can be null.
-	 */
-	public static String getPackageName(IFile javaFile) {
-		if (javaFile == null) {
-			return null;
-		}
-		String ext = "." + javaFile.getFileExtension(); //$NON-NLS-1$
-		// See if the file is a java file
-		if (!ext.equalsIgnoreCase(IFileFolderConstants.EXT_JAVA)) {
-			return null;
-		}
-		String packagename = new String();
-		ICompilationUnit cunit = JavaCore.createCompilationUnitFrom(javaFile);
-		try {
-			IPackageDeclaration[] packages = cunit.getPackageDeclarations();
-			if (packages.length == 0) {
-				packagename = new String();
-			} else {
-				packagename = packages[0].getElementName();
-			}
-		} catch (JavaModelException jme) {
-            // suppress: fall-through and return an empty string?? TODO:?
-		}
-		return packagename;
-	}
-
-	/**
-	 * copy the array to the list.
-	 * 
-	 * @param methodList
-	 * @param methods
-	 */
-	private static void copyToMethodList(List methodList, IMethod[] methods) {
-		if (methods != null && methods.length > 0) {
-			for (int i = 0; i < methods.length; i++) {
-				if (!isDuplicateMethod(methodList, methods[i])) {
-					methodList.add(methods[i]);
-				}
-			}
-		}
-	}
-
-	/**
-	 * check whether this method is duplicated or not in the existing method
-	 * list.
-	 * 
-	 * @param methodList
-	 * @param method
-	 * @return
-	 */
-	private static boolean isDuplicateMethod(List methodList, IMethod method) {
-		if (method == null || !method.exists()) {
-			return false;
-		}
-
-		String[] paramTypes = method.getParameterTypes();
-		String methodName = method.getElementName();
-
-		for (Iterator iter = methodList.iterator(); iter.hasNext();) {
-			IMethod existedMethod = (IMethod) iter.next();
-			if (isSameMethodSignature(methodName, paramTypes, existedMethod)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Tests if a method equals to the given signature. Parameter types are only
-	 * compared by the simple name, no resolving for the fully qualified type
-	 * name is done. Constructors are only compared by parameters, not the name.
-	 * 
-	 * @param name
-	 *            Name of the method
-	 * @param paramTypes
-	 *            The type signatures of the parameters e.g.
-	 *            <code>{"QString;","I"}</code>
-	 * @param curr 
-	 * @return Returns <code>true</code> if the method has the given name and
-	 *         parameter types and constructor state.
-	 */
-	public static boolean isSameMethodSignature(String name,
-			String[] paramTypes, IMethod curr) {
-		if (name.equals(curr.getElementName())) {
-			String[] currParamTypes = curr.getParameterTypes();
-			if (paramTypes.length == currParamTypes.length) {
-				for (int i = 0; i < paramTypes.length; i++) {
-					String t1 = Signature.getSimpleName(Signature
-							.toString(paramTypes[i]));
-					String t2 = Signature.getSimpleName(Signature
-							.toString(currParamTypes[i]));
-					if (!t1.equals(t2)) {
-						return false;
-					}
-				}
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * get methods for the class Type including its super class
-	 * 
-	 * @param classType
-	 * @return - can be null
-	 * @throws JavaModelException
-	 */
-	public static IMethod[] getMethods(IType classType)
-			throws JavaModelException {
-		if (classType == null) {
-			return null;
-		}
-		List methodList = new ArrayList();
-		IMethod[] methods = classType.getMethods();
-		copyToMethodList(methodList, methods);
-
-		ITypeHierarchy typeHierarchy = classType.newSupertypeHierarchy(null);
-
-		if (typeHierarchy != null) {
-			IType[] superTypes = typeHierarchy.getAllSuperclasses(classType);
-
-			if (superTypes != null && superTypes.length > 0) {
-				for (int i = 0; i < superTypes.length; i++) {
-					if (!superTypes[i].getFullyQualifiedName().equals(
-							"java.lang.Object")) { //$NON-NLS-1$
-						methods = superTypes[i].getMethods();
-
-						copyToMethodList(methodList, methods);
-					}
-				}
-			}
-		}
-
-		if (methodList != null && methodList.size() > 0) {
-			IMethod[] validMethods = (IMethod[]) methodList
-					.toArray(new IMethod[methodList.size()]);
-
-			Arrays.sort(validMethods, new Comparator() {
-				public int compare(Object o1, Object o2) {
-					String name1 = ((IMethod) o1).getElementName();
-					String name2 = ((IMethod) o2).getElementName();
-					return name1.compareTo(name2);
-				}
-			});
-			return validMethods;
-		}
-		return null;
-	}
-
-	/**
-	 * resolve and get the qualified name for the incomplete typename
-	 * 
-	 * @param classType
-	 * @param signatureName
-	 * @return - at least equal to Signature.toString(signatureName).
-	 */
-	public static String getQualifiedTypeNameInTypeHierarchy(IType classType,
-			String signatureName) {
-		int arrayNum = 0;
-		while (signatureName.startsWith("[")) { //$NON-NLS-1$
-			arrayNum++;
-			signatureName = signatureName.substring(1);
-		}
-
-		String qualifiedTypeName = Signature.toString(signatureName);
-		int kind = Signature.getTypeSignatureKind(signatureName);
-		if (kind == Signature.BASE_TYPE_SIGNATURE
-				|| signatureName.equals(Signature.SIG_VOID)) {
-			// Add back array identifiers
-			while (arrayNum > 0) {
-				qualifiedTypeName = qualifiedTypeName + "[]"; //$NON-NLS-1$
-				arrayNum--;
-			}
-			return qualifiedTypeName;
-		}
-
-		String typeName = Signature.toString(signatureName);
-
-		String foundName = getQualifiedTypeName(classType, typeName);
-		// if found in current type
-		if (foundName != null) {
-			qualifiedTypeName = foundName;
-		} else // else found in the type hierachy.
-		{
-			ITypeHierarchy typeHierarchy = null;
-			try {
-				typeHierarchy = classType.newSupertypeHierarchy(null);
-			} catch (JavaModelException e) {
-				// Nothing to do.
-			}
-			if (typeHierarchy != null) {
-				IType[] superTypes = typeHierarchy.getAllSupertypes(classType);
-
-				if (superTypes != null && superTypes.length > 0) {
-					for (int i = 0; i < superTypes.length; i++) {
-						if (!superTypes[i].getFullyQualifiedName().equals(
-								"java.lang.Object")) { //$NON-NLS-1$
-							foundName = getQualifiedTypeName(superTypes[i],
-									typeName);
-							if (foundName != null) {
-								qualifiedTypeName = foundName;
-								break;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		// Add back array identifiers
-		while (arrayNum > 0) {
-			qualifiedTypeName = qualifiedTypeName + "[]"; //$NON-NLS-1$
-			arrayNum--;
-		}
-		return qualifiedTypeName;
-	}
-
-	/**
-	 * resolve and get the qualified name for the incomplete typename
-	 * 
-	 * @param classType
-	 * @param typeName
-	 * @return can be null.
-	 */
-	public static String getQualifiedTypeName(IType classType, String typeName) {
-		String qualifiedTypeName = null;
-
-		try {
-			String[][] resolvedNames = classType.resolveType(typeName);
-			if (resolvedNames != null && resolvedNames.length > 0) {
-				qualifiedTypeName = JavaModelUtil.concatenateName(
-						resolvedNames[0][0], resolvedNames[0][1]);
-			}
-		} catch (JavaModelException e1) {
-			// Nothing to do.
-		}
-
-		return qualifiedTypeName;
-	}
-
-	/**
-	 * check whether subclass is sub class of supperclass
-	 * 
-	 * @param jProject
-	 * @param subClass -
-	 *            fully qualified name of sub class
-	 * @param superClass -
-	 *            fully qualified name of super class
-	 * 
-	 * @return true if subClass is a sub  of  superClass
-	 */
-	public static boolean isSubClassOf(IJavaProject jProject, String subClass,
-			String superClass) {
-		if (jProject == null || subClass == null || superClass == null) {
-			return false;
-		}
-
-		try {
-			IType subClassType = jProject.findType(subClass);
-
-			if (subClassType != null) {
-				ITypeHierarchy typeHierarchy = null;
-				try {
-					typeHierarchy = subClassType.newSupertypeHierarchy(null);
-				} catch (JavaModelException e) {
-					// Nothing to do.
-				}
-				IType[] superTypes = typeHierarchy
-						.getAllSupertypes(subClassType);
-
-				if (superTypes != null && superTypes.length > 0) {
-					for (int i = 0; i < superTypes.length; i++) {
-						if (superTypes[i].getFullyQualifiedName().equals(
-								superClass)) {
-							return true;
-						}
-					}
-				}
-			}
-		} catch (JavaModelException e) {
-			// Nothing to do.
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ManagedBeanUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ManagedBeanUtil.java
deleted file mode 100644
index 337fe22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ManagedBeanUtil.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-
-/**
- * 
- * @author sfshi
- * 
- */
-public class ManagedBeanUtil {
-
-	/**
-	 * Determines if the new bean to be added is already a member of the
-	 * configuration set.
-	 * @param project 
-	 * 
-	 * @param beanName -
-	 *            The name of the bean being added
-	 * @return int - 0 if bean doesn't exist, otherwise the choice from the
-	 *         Duplicate Bean dialog
-	 */
-	public static boolean isBeanDuplicate(final IProject project, final String beanName) 
-    {
-	    final IJSFAppConfigManager appCfgMgr = JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(project);
-        
-		if (appCfgMgr != null) 
-        {
-			final List<ManagedBeanType> beans = appCfgMgr.getManagedBeans();
-
-			// Iterate through the bean list
-			for (final ManagedBeanType mbti : beans) {
-				if (mbti.getManagedBeanName() != null) {
-					final String name = mbti.getManagedBeanName()
-							.getTextContent();
-					if (name != null && name.equals(beanName)) {
-						return true;
-					}
-				}
-			}
-
-		}
-		return false;
-	}
-
-	/**
-	 * get the default managed bean name in the current project according to
-	 * reference name
-	 * 
-	 * @param project -
-	 *            current project
-	 * @param refName -
-	 *            seed reference name
-	 * @return String - default managed bean name
-	 */
-	public static String getDefaultManagedBeanName(final IProject project,
-			final String refName) {
-		String defaultName = refName;
-
-		int newRefNameIndex = 1;
-		while (isBeanDuplicate(project, defaultName)) {
-			defaultName = refName + newRefNameIndex;
-			newRefNameIndex++;
-		}
-		return defaultName;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ModelUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ModelUtil.java
deleted file mode 100644
index a468136..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/ModelUtil.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-
-/**
- * @author Zhi-peng Zhang
- * @version
- */
-public class ModelUtil {
-
-	private static final String ENTITY_NEWLINE = "&#xA;"; //$NON-NLS-1$
-	private static final String ENTITY_TAB = "&#x9;"; //$NON-NLS-1$
-	private static final String ENTITY_CARRIAGE_RETURN = "&#xD;"; //$NON-NLS-1$
-	private static final String ENTITY_AMPERSAND = "&amp;"; //$NON-NLS-1$
-	private static final String ENTITY_DOUBLE_QUOTE = "&quot;"; //$NON-NLS-1$
-	private static final String ENTITY_SINGLE_QUOTE = "&apos;"; //$NON-NLS-1$
-	private static final String ENTITY_GREATER_THAN = "&gt;"; //$NON-NLS-1$
-	private static final String ENTITY_LESS_THAN = "&lt;"; //$NON-NLS-1$
-
-	/**
-	 * Get the super class's name of certain element. For example, a class for
-	 * <action-listener> should implement interface
-	 * "javax.faces.event.ActionListener".
-	 * 
-	 * 
-	 * 
-	 * @param key
-	 *            the EClass object of the application child.
-	 * @return the expected super type for a particular element
-	 * TODO: could make common with the faces-config validator
-	 */
-	public static String getSuperType(Object key) {
-		if (key == FacesConfigPackage.eINSTANCE.getActionListenerType()) {
-			return IFacesConfigConstants.ACTION_LISTENER_INTERFACE;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getNavigationHandlerType()) {
-			return IFacesConfigConstants.NAVIGATION_HANDLE_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getPropertyResolverType()) {
-			return IFacesConfigConstants.PROPERTY_RESOLVER_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getStateManagerType()) {
-			return IFacesConfigConstants.STATE_MANAGER_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getVariableResolverType()) {
-			return IFacesConfigConstants.VARIABLE_RESOLVER_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getViewHandlerType()) {
-			return IFacesConfigConstants.VIEW_HANDLER_SUPER_CLASS;
-		}
-
-		if (key == FacesConfigPackage.eINSTANCE.getApplicationFactoryType()) {
-			return IFacesConfigConstants.APPLICATION_FACTORY_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getFacesContextFactoryType()) {
-			return IFacesConfigConstants.FACES_CONTEXT_FACTORY_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getLifecycleFactoryType()) {
-			return IFacesConfigConstants.LIFECYCLE_FACTORY_SUPER_CLASS;
-		}
-		if (key == FacesConfigPackage.eINSTANCE.getRenderKitFactoryType()) {
-			return IFacesConfigConstants.RENDER_KIT_FACTORY_SUPER_CLASS;
-		}
-
-		if (key == FacesConfigPackage.eINSTANCE.getPhaseListenerType()) {
-			return IFacesConfigConstants.PHASE_LISTENER_INTERFACE;
-		}
-
-		return null;
-	}
-	
-
-	/**
-	 * This will take the three pre-defined entities in XML 1.0 (used
-	 * specifically in XML elements) and convert their character representation
-	 * to the appropriate entity reference, suitable for XML element content.
-	 * 
-	 * @param str
-	 *            <code>String</code> input to escape.
-	 * @return <code>String</code> with escaped content.
-	 */
-	public static String escapeEntities(String str) {
-		if (isEmptyString(str)) {
-			return ""; //$NON-NLS-1$
-		}
-
-		StringBuffer buffer;
-		char ch;
-		String entity;
-
-		buffer = null;
-		for (int i = 0, n = str.length(); i < n; i++) {
-			ch = str.charAt(i);
-			switch (ch) {
-			case '<':
-				entity = ENTITY_LESS_THAN;
-				break;
-			case '>':
-				entity = ENTITY_GREATER_THAN;
-				break;
-			case '\'':
-				entity = ENTITY_SINGLE_QUOTE;
-				break;
-			case '\"':
-				entity = ENTITY_DOUBLE_QUOTE;
-				break;
-			case '&':
-				entity = ENTITY_AMPERSAND;
-				break;
-			case '\r':
-				entity = ENTITY_CARRIAGE_RETURN;
-				break;
-			case '\t':
-				entity = ENTITY_TAB;
-				break;
-			case '\n':
-				entity = ENTITY_NEWLINE;
-				break;
-			default:
-				entity = null;
-				break;
-			}
-			if (buffer == null) {
-				if (entity != null) {
-					// An entity occurred, so we'll have to use StringBuffer
-					// (allocate room for it plus a few more entities).
-					buffer = new StringBuffer(str.length() + 20);
-					// Copy previous skipped characters and fall through
-					// to pickup current character
-					buffer.append(str.substring(0, i));
-					buffer.append(entity);
-				}
-			} else {
-				if (entity == null) {
-					buffer.append(ch);
-				} else {
-					buffer.append(entity);
-				}
-			}
-		}
-
-		// If there were any entities, return the escaped characters
-		// that we put in the StringBuffer. Otherwise, just return
-		// the unmodified input string.
-		return (buffer == null) ? str : buffer.toString();
-	}
-
-	/**
-	 * @param str
-	 * @return removes XML/HTML escaped characters from str.
-	 */
-	public static String unEscapeEntities(String str) {
-		if (isEmptyString(str)) {
-			return ""; //$NON-NLS-1$
-		}
-
-		String result = new String(str);
-
-		result = result.replaceAll(ENTITY_AMPERSAND, "&"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_LESS_THAN, "<"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_GREATER_THAN, ">"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_SINGLE_QUOTE, "\'"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_DOUBLE_QUOTE, "\""); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_CARRIAGE_RETURN, "\r"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_TAB, "\t"); //$NON-NLS-1$
-		result = result.replaceAll(ENTITY_NEWLINE, "\n"); //$NON-NLS-1$
-
-		return result;
-	}
-
-	private static boolean isEmptyString(String value) {
-		if (value == null || value.length() == 0) {
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java
deleted file mode 100644
index 0f3ada6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/util/WebrootUtil.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.util;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-
-
-/**
- * This utility class is used to make a bridge between the relative path from
- * webroot and physical path in the project.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class WebrootUtil extends
-            org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil {
-
-	/**
-	 * get the the project path for webpath The project path is something like
-	 * "/projectname/webroot/filename.jsp", or "/projectname/webroot/folder".
-	 * The project information should be removed from project path, e.g,
-	 * "/filename.jsp" or "/folder/*";
-	 * @param model 
-	 * 
-	 * @param strPath -
-	 *            the web path
-	 * @return - project path from "/projectname/webroot"
-	 */
-	static public String getProjectPath(EObject model, String strPath) {
-
-		IProject project = getProject(model);
-
-		String strProjectPath = ""; //$NON-NLS-1$
-		if (strPath != null) {
-			IPath path = new Path(strPath);
-			// jsp file
-			if (path.getFileExtension() != null) {
-				IPath webContentPath = getWebContentPath(project);
-				if (webContentPath != null)
-					strProjectPath = webContentPath.toString() + strPath;
-
-			} else
-			// jsp folder
-			{
-				strPath = new String(strPath.getBytes(), 0,
-						strPath.length() - 1);
-				IPath webContentPath = getWebContentPath(project);
-				if (webContentPath != null)
-					strProjectPath = webContentPath.toString() + strPath;
-			}
-		}
-		return strProjectPath;
-	}
-
-	/**
-	 * @param model -
-	 *            emf model
-	 * @return the current resource according to EMF model
-	 */
-	static public IResource getResource(EObject model) {
-		IResource resource = null;
-
-		if (model != null && model.eResource() != null) {
-			URI uri = model.eResource().getURI();
-			IPath path = new Path(URI.decode(uri.devicePath()));
-
-			// since the uri format is "platform:/resource/..."
-			// we will remove the first part
-			path = path.removeFirstSegments(1);
-
-			IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace()
-					.getRoot();
-			resource = workspaceRoot.findMember(path);
-		}
-
-		return resource;
-	}
-
-	/**
-	 * get the current project according to EMF model
-	 * 
-	 * @param model -
-	 *            emf model
-	 * @return the current project according to EMF model
-	 */
-	static public IProject getProject(EObject model) {
-		IProject project = null;
-
-		IResource resource = getResource(model);
-
-		if (resource != null) {
-			project = resource.getProject();
-		}
-
-		return project;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ISummaryDataSource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ISummaryDataSource.java
deleted file mode 100644
index ae1fa5e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ISummaryDataSource.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.List;
-
-/**
- * Specifies behavior for a datasource that client wizards use to communicate
- * summary information to summary page.
- * 
- * @author plevin
- * @version 1.0
- */
-public interface ISummaryDataSource {
-	/**
-	 * Returns key-value summary data.
-	 * 
-	 * @return List - Summary data.
-	 */
-	public List getSummaryData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanClassSelectionPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanClassSelectionPage.java
deleted file mode 100644
index c2306cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanClassSelectionPage.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaClassUtils;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * This class used to select an existing java class or generate a new one.
- * However, the actural generated new java class is left to other pages.
- * 
- * @author Xiao-guang Zhang
- */
-public class ManagedBeanClassSelectionPage extends WizardPage {
-	private static final int HORIZONTAL_INDENT_DEFAULT = 25;
-
-	/** the class name */
-	private String className;
-
-	/**
-	 * Search Section, including radio button, label, text and browser button.
-	 */
-	private Button searchRadioButton;
-
-	private ClassButtonDialogField classSearchDialogField;
-
-	/** selected type */
-	private IType searchedType;
-
-	/** Generate radio button */
-	private Button createRadioButton;
-
-	private IProject currentProject;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param project
-	 *            The project.
-	 */
-	public ManagedBeanClassSelectionPage(IProject project) {
-		super("JavaSelectionWizardPage"); //$NON-NLS-1$
-
-		currentProject = project;
-		setTitle(WizardMessages.JavaSelectionWizardPage_Title);
-		setDescription(WizardMessages.JavaSelectionWizardPage_Description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 10;
-		layout.marginHeight = 5;
-		container.setLayout(layout);
-		container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		final Group group = new Group(container, SWT.NONE);
-
-		group.setLayout(new GridLayout());
-
-		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		createSearchSection(group);
-		createGenerateSection(group);
-
-		setControl(container);
-		Dialog.applyDialogFont(container);
-		setPageComplete(classSearchDialogField.getText().length() > 0);
-		EditorPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(
-				container,
-				WizardMessages.JavaSelectionWizardPage_HelpContextID);
-	}
-
-	/**
-	 * enabled or disabled the search section including the labels and texts
-	 * 
-	 * @param enabled -
-	 *            enabled or disabled the search section
-	 */
-	private void enableSearchSection(boolean enabled) {
-		classSearchDialogField.setEnabled(enabled);
-	}
-
-	/**
-	 * Create the search section including the labels, texts, and browser
-	 * buttons
-	 * 
-	 * @param parent -
-	 *            parent composite control
-	 */
-	private void createSearchSection(Composite parent) {
-		searchRadioButton = new Button(parent, SWT.RADIO);
-		// JavaSelectionWizardPage.Search = Using an existing Java class
-		searchRadioButton
-				.setText(WizardMessages.JavaSelectionWizardPage_Search);
-		searchRadioButton.setSelection(true);
-		searchRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				createRadioButton.setSelection(!searchRadioButton
-						.getSelection());
-				enableSearchSection(searchRadioButton.getSelection());
-				verifyComplete();
-			}
-		});
-
-		Composite searchSection = new Composite(parent, SWT.NULL);
-
-		classSearchDialogField = new ClassButtonDialogField(currentProject);
-		classSearchDialogField.setHyperLink(null);
-		int numberOfControls = classSearchDialogField.getNumberOfControls();
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = numberOfControls;
-		layout.verticalSpacing = 9;
-		searchSection.setLayout(layout);
-		searchSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		classSearchDialogField.doFillIntoGrid(null, searchSection,
-				numberOfControls);
-
-		GridData gd = (GridData) classSearchDialogField.getLabelControl(null,
-				searchSection).getLayoutData();
-		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
-
-		// JavaSelectionWizardPage.Search.ClassName = Qulified class name:
-		classSearchDialogField
-				.setLabelText(WizardMessages.JavaSelectionWizardPage_Search_ClassName);
-
-		LayoutUtil.setHorizontalGrabbing(classSearchDialogField.getTextControl(
-				null, searchSection));
-
-		classSearchDialogField
-				.setDialogFieldChangeListener(new IDialogFieldChangeListener() {
-					public void dialogFieldChanged(DialogField field) {
-						className = classSearchDialogField.getText();
-						verifyComplete();
-					}
-
-				});
-
-		Label searchDesp = new Label(searchSection, SWT.NONE);
-		searchDesp
-				.setText(WizardMessages.JavaSelectionWizardPage_Search_Description);
-
-		gd = new GridData();
-		gd.horizontalSpan = numberOfControls;
-		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
-		searchDesp.setLayoutData(gd);
-	}
-
-	/**
-	 * Create the generation section including the labels, texts, and browser
-	 * buttons
-	 * 
-	 * @param parent -
-	 *            parent composite control
-	 */
-	private void createGenerateSection(Composite parent) {
-		createRadioButton = new Button(parent, SWT.RADIO);
-		createRadioButton
-				.setText(WizardMessages.JavaSelectionWizardPage_Create);
-		createRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				searchRadioButton.setSelection(!createRadioButton
-						.getSelection());
-				enableSearchSection(!createRadioButton.getSelection());
-				verifyComplete();
-			}
-		});
-
-		Composite createSection = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		layout.verticalSpacing = 9;
-		createSection.setLayout(layout);
-		createSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label createDesp = new Label(createSection, SWT.NONE);
-		createDesp
-				.setText(WizardMessages.JavaSelectionWizardPage_Create_Description);
-
-		GridData gd = new GridData();
-		gd.horizontalIndent = HORIZONTAL_INDENT_DEFAULT;
-		createDesp.setLayoutData(gd);
-	}
-
-	/**
-	 * create a new java class or not
-	 * 
-	 * @return true if the create new java class radio button is selected
-	 */
-	public boolean isCreateNewJavaClass() {
-		return createRadioButton.getSelection();
-	}
-
-	/**
-	 * get the selected java type
-	 * 
-	 * @return - type
-	 */
-	public IType getSelectedType() {
-		searchedType = JavaClassUtils.getType(currentProject,
-				classSearchDialogField.getText());
-
-		return searchedType;
-	}
-
-	/**
-	 * @return the class name
-	 */
-	public String getClassName() {
-		return className;
-	}
-
-	/**
-	 * validate the selected or input java type name
-	 * 
-	 * @return
-	 */
-	private IStatus validateJavaTypeName() {
-		IStatus status = null;
-		if (classSearchDialogField.getText().length() == 0) {
-			status = new Status(
-					IStatus.ERROR,
-					EditorPlugin.getPluginId(),
-					-1,
-					NLS
-							.bind(
-									WizardMessages.JavaSelectionWizardPage_Error_ClassIsEmpty,
-									classSearchDialogField.getText()), null);
-		} else {
-			// ensure the name follows the java conventsions.
-			status = JavaConventions
-					    .validateJavaTypeName(classSearchDialogField.getText(), JavaCore.VERSION_1_3,JavaCore.VERSION_1_3);
-			if (status.getSeverity() != IStatus.ERROR) {
-				// ensure the input or selected type is defined in the current
-				// project
-				if (getSelectedType() == null) {
-					status = new Status(
-							IStatus.ERROR,
-							EditorPlugin.getPluginId(),
-							-1,
-							NLS
-									.bind(
-											WizardMessages.JavaSelectionWizardPage_Error_ClassIsNotDefined,
-											classSearchDialogField.getText()),
-							null);
-				}
-			}
-		}
-		return status;
-	}
-
-	/**
-	 * verify and update the complete status
-	 */
-	private void verifyComplete() {
-		IStatus status = null;
-
-		if (isCreateNewJavaClass()) {
-			setPageComplete(true);
-			setMessage(null);
-			setErrorMessage(null);
-		} else {
-			if (searchRadioButton.getSelection()) {
-				status = validateJavaTypeName();
-			}
-			String errorMessage = null;
-			setPageComplete(status.getSeverity() != IStatus.ERROR);
-
-			if (status.getSeverity() == IStatus.ERROR) {
-				errorMessage = status.getMessage();
-			}
-
-			if (errorMessage != null) {
-				setErrorMessage(errorMessage);
-			} else {
-				setErrorMessage(null);
-			}
-
-			if (status.getSeverity() != IStatus.OK) {
-				setMessage(status.getMessage());
-			} else {
-				setMessage(null);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanPropertyPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanPropertyPage.java
deleted file mode 100644
index cf221a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/ManagedBeanPropertyPage.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.util.JavaClassUtils;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ManagedBeanUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * ManangedBeanProperty wizard page used to show properties of the previous
- * selected java class, suade services. and set the default values for each
- * property.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class ManagedBeanPropertyPage extends WizardPage implements ISummaryDataSource {
-	/** Default height of description Text Control */
-	private static final int DESCRIPTION_TEXT_HEIGHT = 60;
-
-	private static final int DEFAULT_WIDTHHINT = 10;
-
-	/** The Text control for managed bean instance name */
-	private Text managedBeanNameText;
-
-	/** The Combo control for Project Selection */
-	private Combo scopeCombo;
-
-	/** The Text control for managed bean's description */
-	private Text managedBeanDescriptionText;
-
-	private String helpID = null;
-
-	private IProject currentProject;
-
-	private String defaultScope;
-
-	/**
-	 * @param defaultScope
-	 *            the default scope, if be null, then use "session".
-	 * @param project
-	 */
-	public ManagedBeanPropertyPage(String defaultScope, IProject project) {
-		super("ManagedBeanPropertyWizardPage"); //$NON-NLS-1$);
-
-		this.defaultScope = defaultScope;
-		currentProject = project;
-		setTitle(WizardMessages.ManagedBeanPropertyWizardPage_Title);
-		setDescription(WizardMessages.ManagedBeanPropertyWizardPage_Description);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see WizardPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-
-		Composite container = new Composite(parent, SWT.NONE);
-		GridLayout gl = new GridLayout();
-		gl.numColumns = 1;
-		container.setLayout(gl);
-		GridData gridData = new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gridData);
-
-		createGeneralSection(container);
-
-		setControl(container);
-
-		setPageComplete(false);
-
-		if (helpID != null) {
-			EditorPlugin.getDefault().getWorkbench().getHelpSystem().setHelp(
-					getControl(), helpID);
-		}
-	}
-
-	/**
-	 * create managed bean 's configuration group
-	 * 
-	 * @param container
-	 */
-	private void createGeneralSection(Composite container) {
-		Group generalSection = new Group(container, SWT.NONE);
-
-		// ManagedBeanPropertyWizardPage.General = General
-		generalSection
-				.setText(WizardMessages.ManagedBeanPropertyWizardPage_General);
-
-		GridLayout gl = new GridLayout();
-		// gl.marginHeight = 20;
-		gl.numColumns = 2;
-		generalSection.setLayout(gl);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		generalSection.setLayoutData(gridData);
-
-		SWTUtils
-				.createLabel(
-						generalSection,
-						WizardMessages.ManagedBeanPropertyWizardPage_ManagedBeanName,
-						1);
-
-		managedBeanNameText = SWTUtils.createTextBox(generalSection, 1);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		gd.widthHint = DEFAULT_WIDTHHINT;
-		managedBeanNameText.setLayoutData(gd);
-
-		managedBeanNameText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				// dialogChanged();
-				if (isValidManagedBeanName(true)) {
-					setPageComplete(true);
-				} else {
-					setPageComplete(false);
-				}
-			}
-		});
-
-		SWTUtils
-				.createLabel(
-						generalSection,
-						WizardMessages.ManagedBeanPropertyWizardPage_ManagedBeanScope,
-						1);
-
-		String[] items = {
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_APPLICATION,
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_SESSION,
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_REQUEST,
-				IFacesConfigConstants.MANAGED_BEAN_SCOPE_NONE };
-
-		scopeCombo = SWTUtils.createCombo(generalSection, items, 1);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		gd.widthHint = DEFAULT_WIDTHHINT;
-		scopeCombo.setLayoutData(gd);
-
-		Label labelDesp = SWTUtils
-				.createLabel(
-						generalSection,
-						WizardMessages.ManagedBeanPropertyWizardPage_ManagedBeanDescription,
-						1);
-
-		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
-		labelDesp.setLayoutData(gd);
-
-		managedBeanDescriptionText = SWTUtils.createTextBoxScrollable(
-				generalSection, 1, -1, DESCRIPTION_TEXT_HEIGHT);
-
-	}
-
-	/**
-	 * Validates the managed bean Name entry
-	 * 
-	 * @param reportError -
-	 *            true, to report errors.
-	 * @return boolean - the valid state of the data entered
-	 */
-	private boolean isValidManagedBeanName(boolean reportError) {
-		if (managedBeanNameText.getText().length() == 0) {
-			if (reportError) {
-				setErrorMessage(WizardMessages.ManagedBeanPropertyWizardPage_Warning_MissingManagedBeanName);
-			}
-			return false;
-		} else if (JavaClassUtils.hasIllegalCharacters(managedBeanNameText
-				.getText())) {
-			if (reportError) {
-				setErrorMessage(WizardMessages.ManagedBeanPropertyWizardPage_Warning_InvalidManagedBeanName);
-			}
-			return false;
-		} else {
-			if (ManagedBeanUtil.isBeanDuplicate(currentProject,
-					managedBeanNameText.getText())) {
-				if (reportError) {
-					setErrorMessage(WizardMessages.ManagedBeanPropertyWizardPage_Warning_DuplicateManagedBeanName);
-				}
-				return false;
-			}
-
-		}
-
-		setErrorMessage(null);
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardPage#setPreviousPage(org.eclipse.jface.wizard.IWizardPage)
-	 */
-	public void setPreviousPage(IWizardPage page) {
-		super.setPreviousPage(page);
-		initialize();
-	}
-
-	private void initialize() {
-		if (defaultScope != null && defaultScope.length() > 0)
-			scopeCombo.setText(defaultScope);
-		else
-			scopeCombo.setText("session"); //$NON-NLS-1$
-
-		if (((NewManagedBeanWizard) getWizard()).getSuggestedBeanName() != null) {
-			this.managedBeanNameText
-					.setText(((NewManagedBeanWizard) getWizard())
-							.getSuggestedBeanName());
-		} else {
-			String beanName;
-			if (this.getPreviousPage() instanceof ManagedBeanClassSelectionPage) {
-				beanName = ((ManagedBeanClassSelectionPage) this.getPreviousPage())
-						.getClassName();
-			} else {
-				beanName = ((NewJavaClassPage) this.getPreviousPage())
-						.getTypeName();
-			}
-			beanName = beanName.substring(beanName.lastIndexOf(".") + 1); //$NON-NLS-1$
-			if (beanName != null && beanName.length() > 0) {
-				beanName = (beanName.substring(0, 1)).toLowerCase()
-						+ (beanName.substring(1));
-
-				beanName = ManagedBeanUtil.getDefaultManagedBeanName(
-						currentProject, beanName);
-
-			} else
-				beanName = ""; //$NON-NLS-1$
-			managedBeanNameText.setText(beanName);
-		}
-	}
-
-	/**
-	 * Returns key-value summary data.
-	 * 
-	 * @return List - Summary data.
-	 */
-	public List getSummaryData() {
-		List data = new ArrayList();
-
-		data
-				.add(new String[] {
-						WizardMessages.NewJavaManagedBeanWizard_Summary_ManagedBeanName,
-						getManagedBeanName() });
-		data
-				.add(new String[] {
-						WizardMessages.NewJavaManagedBeanWizard_Summary_ManagedBeanScope,
-						getManagedBeanScope() });
-		data.add(new String[] {
-				WizardMessages.NewJavaManagedBeanWizard_Summary_ClassName,
-				getManagedBeanClass() });
-
-		data
-				.add(new String[] {
-						WizardMessages.NewJavaManagedBeanWizard_Summary_Description,
-						getManagedBeanDescription() });
-		return data;
-	}
-
-	/**
-	 * @return the name of the managed bean
-	 */
-	public String getManagedBeanName() {
-		return this.managedBeanNameText.getText().trim();
-	}
-
-	/**
-	 * @return the managed bean class name
-	 */
-	public String getManagedBeanClass() {
-		if (this.getPreviousPage() instanceof ManagedBeanClassSelectionPage) {
-			return ((ManagedBeanClassSelectionPage) this.getPreviousPage()).getClassName();
-		} else if (this.getPreviousPage() instanceof NewJavaClassPage) {
-			NewJavaClassPage newJavaClassPage = (NewJavaClassPage) this.getPreviousPage();
-			StringBuffer buffer = new StringBuffer();
-			if (newJavaClassPage.getPackageText() != null
-					&& newJavaClassPage.getPackageText().length() > 0) {
-				buffer.append(newJavaClassPage.getPackageText());
-				buffer.append("."); //$NON-NLS-1$
-			}
-			buffer.append(newJavaClassPage.getTypeName());
-			return buffer.toString();
-		}
-
-		return "";//$NON-NLS-1$
-	}
-
-	/**
-	 * @return the managed bean scope
-	 */
-	public String getManagedBeanScope() {
-		return this.scopeCombo.getText().trim();
-	}
-
-	/**
-	 * @return the managed bean description
-	 */
-	public String getManagedBeanDescription() {
-		return this.managedBeanDescriptionText.getText().trim();
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewJavaClassPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewJavaClassPage.java
deleted file mode 100644
index 4cc972c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewJavaClassPage.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * Wizard page to create a new class.
- * 
- * @author Xiao-guang Zhang
- * 
- */
-public class NewJavaClassPage extends org.eclipse.jdt.ui.wizards.NewClassWizardPage
-		implements ISummaryDataSource {
-
-	private final IProject currentProject;
-
-	/**
-	 * @param project
-	 */
-	public NewJavaClassPage(IProject project) {
-		super();
-		currentProject = project;
-		setPageComplete(false);
-	}
-
-	private void initialize() {
-		if (getPackageFragmentRoot() == null
-				|| currentProject != getPackageFragmentRoot().getJavaProject()
-						.getProject()) {
-			IJavaProject jProject = JavaCore.create(currentProject);
-			StructuredSelection selection = new StructuredSelection(jProject);
-			init(selection);
-		}
-	}
-
-	private boolean isSkipped() {
-		if ((getPreviousPage() instanceof ManagedBeanClassSelectionPage)
-				&& !((ManagedBeanClassSelectionPage) getPreviousPage()).isCreateNewJavaClass())
-			return true;
-		return false;
-	}
-
-	public List getSummaryData() {
-		List data = new ArrayList();
-
-		if (!isSkipped()) {
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_SourceFolder,
-							getPackageFragmentRootText(), });
-
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_PackageName,
-							getPackageText(), });
-
-			data
-					.add(new String[] {
-							WizardMessages.NewJavaManagedBeanWizard_Summary_TypeName,
-							getTypeName() }); 
-		}
-		return data;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardPage#setPreviousPage(org.eclipse.jface.wizard.IWizardPage)
-	 */
-	public void setPreviousPage(IWizardPage page) {
-		super.setPreviousPage(page);
-		initialize();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewManagedBeanWizard.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewManagedBeanWizard.java
deleted file mode 100644
index 4226952..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/NewManagedBeanWizard.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
-
-/**
- * The wizard for creating a managed bean on faces config model.
- * 
- * @author Xiao-guang Zhang, sfshi
- */
-public class NewManagedBeanWizard extends Wizard implements ISummaryDataSource {
-
-	/** log instance */
-	private static final Logger log = EditorPlugin
-			.getLogger(NewManagedBeanWizard.class);
-
-	/**
-	 * The wizard page where user can select a Java class for the managed bean
-	 * to be created.
-	 */
-	private ManagedBeanClassSelectionPage managedBeanClassSelectionPage;
-
-	/**
-	 * The wizard page where user can create a new Java class for the managed
-	 * bean to be created.
-	 */
-	private NewJavaClassPage newJavaClassPage;
-
-	private ManagedBeanPropertyPage managedBeanPropertyPage;
-
-	private String managedBeanName;
-
-	private String managedBeanScope;
-
-	private String managedBeanClass;
-
-	private String managedBeanDescription;
-
-	private IProject project;
-
-	/**
-	 * the suggested name for the managed bean, if setted, then use it in
-	 * ManagedBeanPropertyWizardPage.
-	 */
-	private String suggestedBeanName;
-
-	private String defaultScope;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param project
-	 *            The project.
-	 */
-	public NewManagedBeanWizard(IProject project) {
-		super();
-		setWindowTitle(WizardMessages.NewManagedBeanWizardBase_Title);
-		this.project = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.facesconfig.ui.wizards.NewWizard#addPages()
-	 */
-	public void addPages() {
-		setDialogSettings(EditorPlugin.getDefault().getDialogSettings());
-
-		// add java source selection page.
-		managedBeanClassSelectionPage = new ManagedBeanClassSelectionPage(project);
-		addPage(managedBeanClassSelectionPage);
-
-		// add the class type page
-		newJavaClassPage = new NewJavaClassPage(project);
-		addPage(newJavaClassPage);
-
-		managedBeanPropertyPage = new ManagedBeanPropertyPage(defaultScope, project);
-		addPage(managedBeanPropertyPage);
-
-		// // add the summary page
-		SummaryPage summaryPage = new SummaryPage(this);
-		addPage(summaryPage);
-		summaryPage
-				.setDescription(WizardMessages.NewJavaManagedBeanWizard_SummaryPage_Description);
-	}
-
-	/**
-	 * Skip the NewJavaClassPage when user select "Using an existing class" on the
-	 * ManagedBeanClassSelectionPage.
-	 */
-	public IWizardPage getNextPage(IWizardPage page) {
-		IWizardPage nextPage = super.getNextPage(page);
-		if (page instanceof ManagedBeanClassSelectionPage
-				&& !((ManagedBeanClassSelectionPage) page).isCreateNewJavaClass()) {
-			((WizardPage) nextPage).setPageComplete(true);
-			return getNextPage(nextPage);
-		}
-		return nextPage;
-	}
-
-	public boolean performFinish() {
-
-		managedBeanName = managedBeanPropertyPage.getManagedBeanName();
-		managedBeanClass = managedBeanPropertyPage.getManagedBeanClass();
-		managedBeanScope = managedBeanPropertyPage.getManagedBeanScope();
-		managedBeanDescription = managedBeanPropertyPage.getManagedBeanDescription();
-		if (managedBeanClassSelectionPage.isCreateNewJavaClass())
-			createNewJavaClass();
-
-		return true;
-	}
-
-	/**
-	 * create a new java class according to current inputs in
-	 * NewClassWizardPage.
-	 */
-	private void createNewJavaClass() {
-		try {
-			newJavaClassPage.createType(new NullProgressMonitor());
-		} catch (CoreException e) {
-			log.info("NewJavaManagedBeanWizard.Error.CreateType", e); //$NON-NLS-1$
-
-			EditorPlugin.getAlerts().error(
-					"NewJavaManagedBeanWizard.Alert.CreateType.Title", //$NON-NLS-1$
-					"NewJavaManagedBeanWizard.Alert.CreateType.Description"); //$NON-NLS-1$
-			return;
-		} catch (InterruptedException e) {
-			log.info("NewJavaManagedBeanWizard.Error.CreateType", e); //$NON-NLS-1$
-			EditorPlugin.getAlerts().error(
-					"NewJavaManagedBeanWizard.Alert.CreateType.Title", //$NON-NLS-1$
-					"NewJavaManagedBeanWizard.Alert.CreateType.Description"); //$NON-NLS-1$
-			return;
-		}
-		newJavaClassPage.getCreatedType();
-	}
-
-	/**
-	 * @return the suggested bean name
-	 */
-	public String getSuggestedBeanName() {
-		return suggestedBeanName;
-	}
-
-	/**
-	 * Set a name for the new managed bean, this name will be shown in the
-	 * ManagedBeanPropertyWizardPage. If don't set the name, then will get a
-	 * default bean name from the managed bean class name.
-	 * 
-	 * @param suggestedBeanName
-	 */
-	public void setSuggestedBeanName(String suggestedBeanName) {
-		this.suggestedBeanName = suggestedBeanName;
-	}
-
-	/**
-	 * @return the default scope value
-	 */
-	public String getDefaultScope() {
-		return defaultScope;
-	}
-
-	/**
-	 * set a default scope value for this new managed bean.
-	 * 
-	 * @param defaultScope
-	 */
-	public void setDefaultScope(String defaultScope) {
-		this.defaultScope = defaultScope;
-	}
-
-	/**
-	 * @return the class name
-	 */
-	public String getManagedBeanClass() {
-		return managedBeanClass;
-	}
-
-	/**
-	 * @return the bean description
-	 */
-	public String getManagedBeanDescription() {
-		return managedBeanDescription;
-	}
-
-	/**
-	 * @return the managed bean's symbolic name
-	 */
-	public String getManagedBeanName() {
-		return managedBeanName;
-	}
-
-	/**
-	 * @return the managed bean's scope
-	 */
-	public String getManagedBeanScope() {
-		return managedBeanScope;
-	}
-
-	public List getSummaryData() {
-		List data = new ArrayList();
-		IWizardPage[] pages = getPages();
-
-		for (int i = 0; i < pages.length; i++) {
-			if (pages[i] instanceof ISummaryDataSource) {
-
-				data.addAll(((ISummaryDataSource) pages[i]).getSummaryData());
-			}
-		}
-		return data;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/SummaryPage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/SummaryPage.java
deleted file mode 100644
index e917466..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/SummaryPage.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others. All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html Contributors: Sybase,
- * Inc. - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import org.eclipse.jface.viewers.ColumnPixelData;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Common wizard page used to summarize information entered in previous pages.
- * 
- * @author plevin
- * @version 1.0
- */
-public class SummaryPage extends WizardPage
-{
-	private static final String WIZARD_SUMMARY_PAGE = "WizardSummaryPage"; //$NON-NLS-1$
-
-	/** The source of the summary items */
-	private ISummaryDataSource source;
-
-	/** The table control that displays the summary items */
-	private Table table;
-
-	/**
-	 * This Constructor creates the summary page
-	 */
-	public SummaryPage()
-	{
-		super( WIZARD_SUMMARY_PAGE );
-		setTitle( WizardMessages.WizardSummaryPage_Title_WizardSummary );
-		setDescription( WizardMessages.WizardSummaryPage_Summary_SummaryDesc );
-	}
-
-	/**
-	 * This Constructor initializes the data source.
-	 * 
-	 * @param source -
-	 *            Summary data source
-	 */
-	public SummaryPage( ISummaryDataSource source )
-	{
-		this();
-		this.source = source;
-	}
-
-	/**
-	 * Determines if the wizard can enable the Next button
-	 * 
-	 * @return boolean - the state of the Next button
-	 */
-	public boolean canFlipToNextPage()
-	{
-		return false;
-	}
-
-	/**
-	 * Creates the page controls
-	 * 
-	 * @param parent -
-	 *            the wizard composite
-	 */
-	public void createControl( Composite parent )
-	{
-
-		Composite composite = SWTUtils.createComposite( parent, 1 );
-
-		table = new Table( composite, SWT.BORDER );
-		table.setLayoutData( new GridData( GridData.FILL_BOTH ) );
-		table.setHeaderVisible( true );
-		table.setLinesVisible( true );
-
-		TableLayout layout = new TableLayout();
-		table.setLayout( layout );
-
-		layout.addColumnData( new ColumnPixelData( 163 ) );
-		layout.addColumnData( new ColumnPixelData( 350 ) );
-
-		TableColumn keyCol = new TableColumn( table, SWT.NONE );
-		keyCol.setText( WizardMessages.WizardSummaryPage_Label_Field );
-
-		TableColumn valueCol = new TableColumn( table, SWT.NONE );
-		valueCol
-				.setText( WizardMessages.WizardSummaryPage_Label_Value );
-
-		setControl( composite );
-		setPageComplete( true );
-	}
-
-	/**
-	 * Populates the table with summary information.
-	 */
-	public void loadSummaryData()
-	{
-		if ( source == null )
-		{
-			return;
-		}
-		Object[] data = source.getSummaryData().toArray();
-		table.removeAll();
-		for ( int i = 0; i < data.length; i++ )
-		{
-			TableItem item = new TableItem( table, SWT.NONE );
-			item.setText( (String[]) data[i] );
-		}
-		return;
-	}
-
-	/**
-	 * Sets summary page data source.
-	 * 
-	 * @param s -
-	 *            Data source.
-	 */
-	public void setSummaryDataSource( ISummaryDataSource s )
-	{
-		source = s;
-	}
-
-	/**
-	 * Populates the table with summary items when the page becomes visible.
-	 * 
-	 * @param visible -
-	 *            the visible state of the page
-	 */
-	public void setVisible( boolean visible )
-	{
-		super.setVisible( visible );
-
-		if ( visible == true )
-		{
-			loadSummaryData();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.java
deleted file mode 100644
index b128bfd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.java
+++ /dev/null
@@ -1,461 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.wizard;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Message bundle for wizards
- *
- */
-public final class WizardMessages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.ui.wizard.WizardMessages"; //$NON-NLS-1$
-
-	private WizardMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, WizardMessages.class);
-	}
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewManagedBeanWizardBase_Type;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewManagedBeanWizardBase_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewManagedBeanWizardBase_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewManagedBeanCreationWizard_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String IntroWizardPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String IntroWizardPage_Intro;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanWizardSelectionPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanWizardSelectionPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanWizardSelectionPage_Group;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanWizardSelectionPage_HelpContextID;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String Registry_LoadWizard_Error;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewWizard_Title_WizardDefault;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_General;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanScope;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanDescription;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_ManagedBeanProperty;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_PropertyName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Type;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Value;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Button_Add;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Button_Edit;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Button_Remove;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Warning_MissingManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Warning_InvalidManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyWizardPage_Warning_DuplicateManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_PropertyName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_DataType;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_InitialValue;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Title_NewPropertyEntry;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String ManagedBeanPropertyEditDialog_Title_ExistingPropertyEntry;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Project;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_FacesConfig;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_FacesConfig_Browser;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Warning_MissingProjectName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Warning_MissingFacesConfigName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigContent;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_Warning_FacesConfigNotDefinedInWebDotXML;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigSelectionWizardPage_HelpContextID;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigFileSelectionDialog_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String FacesConfigFileSelectionDialog_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Group;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Search;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Search_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Search_ClassName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Search_ClassName_Browse;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Create;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Create_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_FindType;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_FindType_Filter;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Error_ClassIsEmpty;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_Error_ClassIsNotDefined;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String JavaSelectionWizardPage_HelpContextID;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_ProjectName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_FacesConfigFileName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_TypeName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_PackageName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_SourceFolder;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_ManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_ManagedBeanScope;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_ClassName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Summary_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_SummaryPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Task_CreateNewManagedBean;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String NewJavaManagedBeanWizard_Task_CreateNewJavaClass;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanWizard_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanPage_Title;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanPage_Description;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_Group_Label;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_OverwriteButton_Text;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_NewButton_Text;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_NewNameDialogField_Label;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_Error_EmptyManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_Error_InvalidManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String DuplicateBeanGroup_Error_DuplicatedManagedBeanName;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String WizardSummaryPage_Title_WizardSummary;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String WizardSummaryPage_Summary_SummaryDesc;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String WizardSummaryPage_Label_Field;
-
-	/**
-	 * see WizardMessages.properties
-	 */
-	public static String WizardSummaryPage_Label_Value;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.properties
deleted file mode 100644
index e594ea8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/wizard/WizardMessages.properties
+++ /dev/null
@@ -1,128 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-NewManagedBeanWizardBase_Type = ManagedBeanTypeName
-NewManagedBeanWizardBase_Description = ManagedBeanTypeDescription
-NewManagedBeanWizardBase_Title = New Managed Bean Wizard
-
-NewManagedBeanCreationWizard_Title = Create a Managed Bean
-
-IntroWizardPage_Title = Introduction Page
-IntroWizardPage_Intro = This wizard walks through the steps to create a managed bean.
-
-ManagedBeanWizardSelectionPage_Title = Managed Bean Selection Page
-ManagedBeanWizardSelectionPage_Description = Select a managed bean type to proceed
-ManagedBeanWizardSelectionPage_Group = Please select the managed bean type:
-ManagedBeanWizardSelectionPage_HelpContextID = com.sybase.stf.jmt.new_managedbean_wizard
-
-Registry_LoadWizard_Error = Error loading wizard element, couldn't initialize!
-####################################################
-# Resource message for NewWizard
-####################################################
-NewWizard_Title_WizardDefault = call setWindowTitle(String) in your wizard sub-class
-
-##################################################################
-# Resource message for NewJavaManagedBeanWizards and its' pages.
-##################################################################
-ManagedBeanPropertyWizardPage_Title = Managed Bean Configuration
-ManagedBeanPropertyWizardPage_Description = Set managed bean's name and scope, and create or update Managed Bean's properties, their types and default values.
-
-ManagedBeanPropertyWizardPage_General = General
-
-ManagedBeanPropertyWizardPage_ManagedBeanName = Name:
-ManagedBeanPropertyWizardPage_ManagedBeanScope = Scope:
-ManagedBeanPropertyWizardPage_ManagedBeanDescription = Description:
-
-ManagedBeanPropertyWizardPage_ManagedBeanProperty = Properties:
-ManagedBeanPropertyWizardPage_PropertyName = Property Name
-ManagedBeanPropertyWizardPage_Type = Property Type
-ManagedBeanPropertyWizardPage_Value = Value
-ManagedBeanPropertyWizardPage_Button_Add = Add...
-ManagedBeanPropertyWizardPage_Button_Edit = Edit...
-ManagedBeanPropertyWizardPage_Button_Remove = Remove
-
-ManagedBeanPropertyWizardPage_Warning_MissingManagedBeanName = Managed bean name must be entered!
-ManagedBeanPropertyWizardPage_Warning_InvalidManagedBeanName = Managed bean name is not valid!
-ManagedBeanPropertyWizardPage_Warning_DuplicateManagedBeanName = Managed bean name can not be duplicate!
-
-ManagedBeanPropertyEditDialog_PropertyName = Property name:
-ManagedBeanPropertyEditDialog_DataType = Data type:
-ManagedBeanPropertyEditDialog_InitialValue = Initial value:
-
-ManagedBeanPropertyEditDialog_Title_NewPropertyEntry = New Property Entry
-ManagedBeanPropertyEditDialog_Title_ExistingPropertyEntry = Existing Property Entry
-
-FacesConfigSelectionWizardPage_Title = Faces-Config File
-FacesConfigSelectionWizardPage_Description = Select an existing faces-config file, such as faces-config.xml, to save the new managed bean.
-
-FacesConfigSelectionWizardPage_Project = Project name:
-FacesConfigSelectionWizardPage_FacesConfig = Faces-Config file:
-FacesConfigSelectionWizardPage_FacesConfig_Browser = Browse...
-
-FacesConfigSelectionWizardPage_Warning_MissingProjectName = Project name must be entered!
-FacesConfigSelectionWizardPage_Warning_MissingFacesConfigName = Faces-Config file name must be entered!
-FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigName = Faces-config file name does not exist!
-FacesConfigSelectionWizardPage_Warning_InvalidFacesConfigContent = ''{0}'' is not a valid faces-config file!
-FacesConfigSelectionWizardPage_Warning_FacesConfigNotDefinedInWebDotXML = ''{0}'' is not specified in web.xml file!
-FacesConfigSelectionWizardPage_HelpContextID = com.sybase.stf.jmt.select_facesconfig_page
-
-FacesConfigFileSelectionDialog_Title = Faces-config File Selection
-FacesConfigFileSelectionDialog_Description = Select a faces-config file in the current project.
-
-JavaSelectionWizardPage_Title = Java Class Selection
-JavaSelectionWizardPage_Description = Search for an existing class or generate a new one.
-JavaSelectionWizardPage_Group = Source type for Java class
-JavaSelectionWizardPage_Search = Using an existing Java class
-JavaSelectionWizardPage_Search_Description = (This option will use an existing java class as managed bean's type.)
-JavaSelectionWizardPage_Search_ClassName = Qualified class name:
-JavaSelectionWizardPage_Search_ClassName_Browse = Browse...
-JavaSelectionWizardPage_Create = Create a new Java class
-JavaSelectionWizardPage_Create_Description = (This option will create a new java class in the next wizard page.)
-
-JavaSelectionWizardPage_FindType = Find Type
-JavaSelectionWizardPage_FindType_Filter = Choose a type (?=any character, *=any string):
-JavaSelectionWizardPage_Error_ClassIsEmpty = The type name should not be empty.
-JavaSelectionWizardPage_Error_ClassIsNotDefined = The type name ''{0}'' does not exist.
-JavaSelectionWizardPage_HelpContextID = com.sybase.stf.jmt.new_java_managedbean_wizard
-
-NewJavaManagedBeanWizard_Summary_ProjectName = Project name
-NewJavaManagedBeanWizard_Summary_FacesConfigFileName = Faces-Config file name
-NewJavaManagedBeanWizard_Summary_TypeName = Type name
-NewJavaManagedBeanWizard_Summary_PackageName = Package name
-NewJavaManagedBeanWizard_Summary_SourceFolder = Source folder
-NewJavaManagedBeanWizard_Summary_ManagedBeanName = Managed bean name
-NewJavaManagedBeanWizard_Summary_ManagedBeanScope = Managed bean scope
-NewJavaManagedBeanWizard_Summary_ClassName = Managed bean class
-NewJavaManagedBeanWizard_Summary_Description = Description
-NewJavaManagedBeanWizard_SummaryPage_Description = A new java managed bean will be created.
-
-NewJavaManagedBeanWizard_Task_CreateNewManagedBean = Creating a new managed bean
-NewJavaManagedBeanWizard_Task_CreateNewJavaClass = Creating a new java class
-
-DuplicateBeanWizard_Title = Set Duplicated Managed Bean
-DuplicateBeanPage_Title = Set duplicated managed bean
-DuplicateBeanPage_Description = Overwrite the duplicated managed bean or create a new one.
-
-DuplicateBeanGroup_Group_Label = Duplicated Managed Bean Options
-DuplicateBeanGroup_OverwriteButton_Text = Overwrite an existing managed bean using the new one
-
-DuplicateBeanGroup_NewButton_Text = Create a new managed bean
-DuplicateBeanGroup_NewNameDialogField_Label = New managed bean name:
-
-DuplicateBeanGroup_Error_EmptyManagedBeanName = The managed bean name can not be empty.
-DuplicateBeanGroup_Error_InvalidManagedBeanName = The managed bean name ''{0}'' contains invalid string, such as #,!.
-DuplicateBeanGroup_Error_DuplicatedManagedBeanName = The managed bean name ''{0}'' is duplicated.
-
-WizardSummaryPage_Title_WizardSummary = Wizard Summarys
-WizardSummaryPage_Summary_SummaryDesc = A new java managed bean will be created.
-WizardSummaryPage_Label_Field = Field
-WizardSummaryPage_Label_Value = Value
-
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.classpath b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.classpath
deleted file mode 100644
index eb95f1a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="facesconfig"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.cvsignore
deleted file mode 100644
index 96a949c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-build.xml
-javaCompiler...args
-@dot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.project b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.project
deleted file mode 100644
index 2b7e076..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.facesconfig</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 2a4d55b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:03:03 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 46bff72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,88 +0,0 @@
-#Tue Mar 16 20:45:27 PDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 669d251..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:55:28 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/META-INF/MANIFEST.MF
deleted file mode 100644
index 5783abc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,30 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.facesconfig; singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin$Implementation
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.emf.edit.ui;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.uriresolver;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.common.frameworks;bundle-version="[1.1.0,2.0.0)"
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.jst.jsf.facesconfig,
- org.eclipse.jst.jsf.facesconfig.edit.provider,
- org.eclipse.jst.jsf.facesconfig.emf,
- org.eclipse.jst.jsf.facesconfig.emf.impl,
- org.eclipse.jst.jsf.facesconfig.emf.util,
- org.eclipse.jst.jsf.facesconfig.internal;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.internal.nls;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.internal.translator;x-internal:=true,
- org.eclipse.jst.jsf.facesconfig.util
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/about.html b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/build.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/build.properties
deleted file mode 100644
index a8eeb89..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/build.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-
-bin.includes = .,\
-               model/,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties,\
-               about.html,\
-               icons/
-jars.compile.order = .
-source.. = facesconfig/
-output.. = bin/
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/FacesConfigPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/FacesConfigPlugin.java
deleted file mode 100644
index a13bdb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/FacesConfigPlugin.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig;
-
-import org.eclipse.emf.common.EMFPlugin;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl;
-import org.eclipse.jst.jsf.facesconfig.util.FacesConfigResourceFactory;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * This class should not be extended by clients.
- * 
- * The main plugin class to be used in the desktop.
- */
-public final class FacesConfigPlugin extends EMFPlugin {
-
-    /**
-     * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-     * @generated
-     */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Editor id string.  TODO: broken?
-	 */
-	public static final String FACES_CONFIG_EDITOR_ID = "org.eclipse.jst.jsf.facesconfig.internal.presentation.FacesConfigEditor"; //$NON-NLS-1$
-
-	/**
-	 * The plugin instance
-	 */
-	public static final FacesConfigPlugin INSTANCE = new FacesConfigPlugin();
-	private static Implementation plugin;
-
-    private FacesConfigPlugin() {
-	    super(new ResourceLocator[] {});
-    }
-
-    public ResourceLocator getPluginResourceLocator() {
-      return plugin;
-    }
-
-    /**
-     * Returns the singleton instance of the Eclipse plugin.
-     * @return the singleton instance.
-     */
-    public static Implementation getPlugin() {
-      return plugin;
-    }
-
-    /**
-     * Returns the singleton instance of the Eclipse plugin.
-     * @param exception 
-     */
-    public static void write(Exception exception)
-    {
-      INSTANCE.log(exception);
-    }
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 */
-	public final static class Implementation extends EMFPlugin.EclipsePlugin {
-		/**
-		 * Internal constructor
-		 */
-		public Implementation() {
-			super();
-			// Remember the static instance.
-			plugin = this;
-		}
-		public void start(BundleContext context) throws Exception {
-			super.start(context);
-			// Init Faces Config Package
-			FacesConfigPackageImpl.init();
-
-			getFacesconfigPackage();
-			
-			// TODO: XN: no sure whether this line is needed
-			FacesConfigResourceFactory.registerDtds();
-			
-			FacesConfigResourceFactory.register();
-		}
-
-		/**
-		 * @return The faces config package instance
-		 * TODO: used?
-		 */
-		public FacesConfigPackage getFacesconfigPackage() {
-			return FacesConfigPackage.eINSTANCE;
-		}
-		
-		/**
-		 * @return the faces config factory instance.
-		 * TODO: used?
-		 */
-		public FacesConfigFactory getFacesconfigFactory() {
-			return (FacesConfigFactory) getFacesconfigPackage().getEFactoryInstance();
-		}
-
-	}
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AbsoluteOrderingTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AbsoluteOrderingTypeItemProvider.java
deleted file mode 100644
index 40c500f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AbsoluteOrderingTypeItemProvider.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class AbsoluteOrderingTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param adapterFactory 
-	 * @generated NOT
-	 */
-	public AbsoluteOrderingTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.ABSOLUTE_ORDERING_TYPE__NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.ABSOLUTE_ORDERING_TYPE__OTHERS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns AbsoluteOrderingType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/AbsoluteOrderingType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_AbsoluteOrderingType_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(AbsoluteOrderingType.class)) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ABSOLUTE_ORDERING_TYPE__NAME,
-				 FacesConfigFactory.eINSTANCE.createNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ABSOLUTE_ORDERING_TYPE__OTHERS,
-				 FacesConfigFactory.eINSTANCE.createOrderingOthersType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ActionListenerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ActionListenerTypeItemProvider.java
deleted file mode 100644
index f27e6fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ActionListenerTypeItemProvider.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType} object. <!--
- * begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-@SuppressWarnings("nls")
-public class ActionListenerTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!--begin-user-doc --> 
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActionListenerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc --> 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * @param object 
-	 * 
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ActionListenerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ActionListenerType_textContent_feature", "_UI_ActionListenerType_type"),
-				 FacesConfigPackage.Literals.ACTION_LISTENER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc>
-     * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ActionListenerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ActionListenerType_id_feature", "_UI_ActionListenerType_type"),
-				 FacesConfigPackage.Literals.ACTION_LISTENER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ActionListenerType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ActionListenerType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ActionListenerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ActionListenerType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ActionListenerType.class)) {
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ActionListenerType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationExtensionTypeItemProvider.java
deleted file mode 100644
index 59ddbc8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ApplicationExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ApplicationExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns ApplicationExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ApplicationExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((ApplicationExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ApplicationExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_ApplicationExtensionType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationFactoryTypeItemProvider.java
deleted file mode 100644
index f2da630..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType} object.
- * <!-- begin-user-doc --> 
- * @extends {@link ITableItemLabelProvider}
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ApplicationFactoryTypeItemProvider
-extends ItemProviderAdapter
-implements
-	IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!--begin-user-doc --> 
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationFactoryType_textContent_feature", "_UI_ApplicationFactoryType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationFactoryType_id_feature", "_UI_ApplicationFactoryType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ApplicationFactoryType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ApplicationFactoryType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ApplicationFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ApplicationFactoryType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ApplicationFactoryType.class)) {
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-
-	/**
-	 * @param object
-	 * @param columnIndex
-	 * @return the column image
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ApplicationFactoryType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationTypeItemProvider.java
deleted file mode 100644
index 85d5c1f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ApplicationTypeItemProvider.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ApplicationTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addELResolverPropertyDescriptor(object);
-			addSystemEventListenerPropertyDescriptor(object);
-			addResourceBundlePropertyDescriptor(object);
-			addApplicationExtensionPropertyDescriptor(object);
-			addDefaultValidatorsPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_id_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the EL Resolver feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addELResolverPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_eLResolver_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_eLResolver_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__EL_RESOLVER,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the System Event Listener feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addSystemEventListenerPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_systemEventListener_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_systemEventListener_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-				/**
-	 * This adds a property descriptor for the Resource Bundle feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addResourceBundlePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_resourceBundle_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_resourceBundle_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__RESOURCE_BUNDLE,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Application Extension feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addApplicationExtensionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_applicationExtension_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_applicationExtension_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__APPLICATION_EXTENSION,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Default Validators feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addDefaultValidatorsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ApplicationType_defaultValidators_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ApplicationType_defaultValidators_feature", "_UI_ApplicationType_type"),
-				 FacesConfigPackage.Literals.APPLICATION_TYPE__DEFAULT_VALIDATORS,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-				/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__ACTION_LISTENER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__MESSAGE_BUNDLE);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__NAVIGATION_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__VIEW_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__STATE_MANAGER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__PROPERTY_RESOLVER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__VARIABLE_RESOLVER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__RESOURCE_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.APPLICATION_TYPE__LOCALE_CONFIG);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ApplicationType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ApplicationType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ApplicationType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ApplicationType_type") :
-			getString("_UI_ApplicationType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ApplicationType.class)) {
-			case FacesConfigPackage.APPLICATION_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__ACTION_LISTENER,
-				 FacesConfigFactory.eINSTANCE.createActionListenerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID,
-				 FacesConfigFactory.eINSTANCE.createDefaultRenderKitIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__MESSAGE_BUNDLE,
-				 FacesConfigFactory.eINSTANCE.createMessageBundleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__NAVIGATION_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createNavigationHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__VIEW_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createViewHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__STATE_MANAGER,
-				 FacesConfigFactory.eINSTANCE.createStateManagerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__PROPERTY_RESOLVER,
-				 FacesConfigFactory.eINSTANCE.createPropertyResolverType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__VARIABLE_RESOLVER,
-				 FacesConfigFactory.eINSTANCE.createVariableResolverType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__RESOURCE_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createResourceHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.APPLICATION_TYPE__LOCALE_CONFIG,
-				 FacesConfigFactory.eINSTANCE.createLocaleConfigType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeClassTypeItemProvider.java
deleted file mode 100644
index a920fda..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class AttributeClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_AttributeClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_AttributeClassType_textContent_feature", "_UI_AttributeClassType_type"),
-				 FacesConfigPackage.Literals.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_AttributeClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_AttributeClassType_id_feature", "_UI_AttributeClassType_type"),
-				 FacesConfigPackage.Literals.ATTRIBUTE_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns AttributeClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((AttributeClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_AttributeClassType_type") :
-			getString("_UI_AttributeClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(AttributeClassType.class)) {
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeExtensionTypeItemProvider.java
deleted file mode 100644
index 3c77533..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class AttributeExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns AttributeExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeExtensionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((AttributeExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_AttributeExtensionType_type") :
-			getString("_UI_AttributeExtensionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeNameTypeItemProvider.java
deleted file mode 100644
index 0cbbe4a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class AttributeNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_AttributeNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_AttributeNameType_textContent_feature", "_UI_AttributeNameType_type"),
-				 FacesConfigPackage.Literals.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_AttributeNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_AttributeNameType_id_feature", "_UI_AttributeNameType_type"),
-				 FacesConfigPackage.Literals.ATTRIBUTE_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns AttributeNameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((AttributeNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_AttributeNameType_type") :
-			getString("_UI_AttributeNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(AttributeNameType.class)) {
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeTypeItemProvider.java
deleted file mode 100644
index 8b3edb3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/AttributeTypeItemProvider.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- */
-@SuppressWarnings("nls")
-public class AttributeTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-		ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_AttributeType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_AttributeType_id_feature", "_UI_AttributeType_type"),
-				 FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DEFAULT_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__SUGGESTED_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns AttributeType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/AttributeType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((AttributeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_AttributeType_type") :
-			getString("_UI_AttributeType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(AttributeType.class)) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_NAME,
-				 FacesConfigFactory.eINSTANCE.createAttributeNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createAttributeClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__DEFAULT_VALUE,
-				 FacesConfigFactory.eINSTANCE.createDefaultValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__SUGGESTED_VALUE,
-				 FacesConfigFactory.eINSTANCE.createSuggestedValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createAttributeExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		AttributeType attribute = (AttributeType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return attribute.getAttributeName() == null ? "" : attribute //$NON-NLS-1$
-					.getAttributeName().getTextContent();
-		case 1:
-			return attribute.getAttributeClass() == null ? "" : attribute //$NON-NLS-1$
-					.getAttributeClass().getTextContent();
-		case 2:
-			return attribute.getDefaultValue() == null ? "" : attribute //$NON-NLS-1$
-					.getDefaultValue().getTextContent();
-		case 3:
-			return attribute.getSuggestedValue() == null ? "" : attribute //$NON-NLS-1$
-					.getSuggestedValue().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BaseNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BaseNameTypeItemProvider.java
deleted file mode 100644
index 5fbe1f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BaseNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class BaseNameTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public BaseNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BaseNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BaseNameType_textContent_feature", "_UI_BaseNameType_type"),
-				 FacesConfigPackage.Literals.BASE_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BaseNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BaseNameType_id_feature", "_UI_BaseNameType_type"),
-				 FacesConfigPackage.Literals.BASE_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns BaseNameType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/BaseNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((BaseNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_BaseNameType_type") :
-			getString("_UI_BaseNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(BaseNameType.class)) {
-			case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.BASE_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorClassTypeItemProvider.java
deleted file mode 100644
index 12a7b9c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class BehaviorClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BehaviorClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BehaviorClassType_textContent_feature", "_UI_BehaviorClassType_type"),
-				 FacesConfigPackage.Literals.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object  
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BehaviorClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BehaviorClassType_id_feature", "_UI_BehaviorClassType_type"),
-				 FacesConfigPackage.Literals.BEHAVIOR_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns BehaviorClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/BehaviorClassType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((BehaviorClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_BehaviorClassType_type") :
-			getString("_UI_BehaviorClassType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(BehaviorClassType.class)) {
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorExtensionTypeItemProvider.java
deleted file mode 100644
index 0e7a513..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class BehaviorExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This returns BehaviorExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/BehaviorExtensionType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((BehaviorExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_BehaviorExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_BehaviorExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorIdTypeItemProvider.java
deleted file mode 100644
index b6fe2d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorIdTypeItemProvider.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class BehaviorIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-
-	 * @generated
-	 */
-	public BehaviorIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BehaviorIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BehaviorIdType_textContent_feature", "_UI_BehaviorIdType_type"),
-				 FacesConfigPackage.Literals.BEHAVIOR_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_BehaviorIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_BehaviorIdType_id_feature", "_UI_BehaviorIdType_type"),
-				 FacesConfigPackage.Literals.BEHAVIOR_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns BehaviorIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/BehaviorIdType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((BehaviorIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_BehaviorIdType_type") : //$NON-NLS-1$
-			getString("_UI_BehaviorIdType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(BehaviorIdType.class)) {
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorTypeItemProvider.java
deleted file mode 100644
index 1deaa16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/BehaviorTypeItemProvider.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class BehaviorTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns BehaviorType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/BehaviorType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_BehaviorType_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(BehaviorType.class)) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_ID,
-				 FacesConfigFactory.eINSTANCE.createBehaviorIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createBehaviorClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createBehaviorExtensionType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererClassTypeItemProvider.java
deleted file mode 100644
index b553b27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ClientBehaviorRendererClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ClientBehaviorRendererClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ClientBehaviorRendererClassType_textContent_feature", "_UI_ClientBehaviorRendererClassType_type"),
-				 FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ClientBehaviorRendererClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ClientBehaviorRendererClassType_id_feature", "_UI_ClientBehaviorRendererClassType_type"),
-				 FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ClientBehaviorRendererClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ClientBehaviorRendererClassType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ClientBehaviorRendererClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ClientBehaviorRendererClassType_type") :
-			getString("_UI_ClientBehaviorRendererClassType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ClientBehaviorRendererClassType.class)) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeItemProvider.java
deleted file mode 100644
index 04b041e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeItemProvider.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ClientBehaviorRendererTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ClientBehaviorRendererType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ClientBehaviorRendererType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_ClientBehaviorRendererType_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ClientBehaviorRendererType.class)) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE,
-				 FacesConfigFactory.eINSTANCE.createClientBehaviorRendererTypeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createClientBehaviorRendererClassType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeTypeItemProvider.java
deleted file mode 100644
index 4133218..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ClientBehaviorRendererTypeTypeItemProvider.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ClientBehaviorRendererTypeTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererTypeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ClientBehaviorRendererTypeType_textContent_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ClientBehaviorRendererTypeType_textContent_feature", "_UI_ClientBehaviorRendererTypeType_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 *  
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ClientBehaviorRendererTypeType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ClientBehaviorRendererTypeType_id_feature", "_UI_ClientBehaviorRendererTypeType_type"),  //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$
-				 FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ClientBehaviorRendererTypeType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ClientBehaviorRendererTypeType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ClientBehaviorRendererTypeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ClientBehaviorRendererTypeType_type") : //$NON-NLS-1$
-			getString("_UI_ClientBehaviorRendererTypeType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ClientBehaviorRendererTypeType.class)) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentClassTypeItemProvider.java
deleted file mode 100644
index f5011bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ComponentClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentClassType_textContent_feature", "_UI_ComponentClassType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentClassType_id_feature", "_UI_ComponentClassType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ComponentClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ComponentClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ComponentClassType_type") :
-			getString("_UI_ComponentClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ComponentClassType.class)) {
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentExtensionTypeItemProvider.java
deleted file mode 100644
index 90ae0fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns ComponentExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ComponentExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ComponentExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_ComponentExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentFamilyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentFamilyTypeItemProvider.java
deleted file mode 100644
index 2865fff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentFamilyTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ComponentFamilyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentFamilyTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentFamilyType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentFamilyType_textContent_feature", "_UI_ComponentFamilyType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_FAMILY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentFamilyType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentFamilyType_id_feature", "_UI_ComponentFamilyType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_FAMILY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ComponentFamilyType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentFamilyType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ComponentFamilyType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ComponentFamilyType_type") :
-			getString("_UI_ComponentFamilyType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ComponentFamilyType.class)) {
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeItemProvider.java
deleted file mode 100644
index c823f2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeItemProvider.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class ComponentTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * @param adapterFactory 
-	 * 
-	 * @generated
-	 */
-	public ComponentTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc --> 
-	 * 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * @param object
-	 */
-	protected void addComponentClassPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-				((ComposeableAdapterFactory) adapterFactory)
-						.getRootAdapterFactory(), getResourceLocator(),
-				getString("_UI_ComponentType_componentClass_feature"), //$NON-NLS-1$
-				getString("_UI_PropertyDescriptor_description", //$NON-NLS-1$
-						"_UI_ComponentType_componentClass_feature", //$NON-NLS-1$
-						"_UI_ComponentType_type"), FacesConfigPackage.eINSTANCE //$NON-NLS-1$
-						.getComponentType_ComponentClass(), true, null, null,
-				null));
-	}
-	
-	/**
-	 * @param object
-	 */
-	protected void addComponentTypePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-				((ComposeableAdapterFactory) adapterFactory)
-						.getRootAdapterFactory(), getResourceLocator(),
-				getString("_UI_ComponentType_componentType_feature"), //$NON-NLS-1$
-				getString("_UI_PropertyDescriptor_description", //$NON-NLS-1$
-						"_UI_ComponentType_componentType_feature", //$NON-NLS-1$
-						"_UI_ComponentType_type"), FacesConfigPackage.eINSTANCE //$NON-NLS-1$
-						.getComponentType_ComponentType(), true, null, null,
-				null));
-	}
-	
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentType_id_feature", "_UI_ComponentType_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.COMPONENT_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_TYPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__FACET);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ComponentType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 * 
-	 */
-	public String getText(Object object) {
-		String label = null;
-		if (((ComponentType) object).getDisplayName() != null
-				&& ((ComponentType) object).getDisplayName().size() > 0) {
-			label = ((DisplayNameType) ((ComponentType) object)
-					.getDisplayName().get(0)).getTextContent();
-		}
-
-		if (label == null || label.length() == 0) {
-			if (((ComponentType) object).getComponentClass() != null) {
-				label = ((ComponentType) object).getComponentClass()
-						.getTextContent();
-			}
-		}
-		
-		return label == null || label.length() == 0 ? getString("_UI_ComponentType_type") //$NON-NLS-1$
-				: label;
-//				: getString("_UI_ComponentType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ComponentType.class)) {
-			case FacesConfigPackage.COMPONENT_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_TYPE,
-				 FacesConfigFactory.eINSTANCE.createComponentTypeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createComponentClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__FACET,
-				 FacesConfigFactory.eINSTANCE.createFacetType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.COMPONENT_TYPE__COMPONENT_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createComponentExtensionType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ComponentType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeTypeItemProvider.java
deleted file mode 100644
index 20927a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ComponentTypeTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ComponentTypeTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentTypeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentTypeType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentTypeType_textContent_feature", "_UI_ComponentTypeType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_TYPE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ComponentTypeType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ComponentTypeType_id_feature", "_UI_ComponentTypeType_type"),
-				 FacesConfigPackage.Literals.COMPONENT_TYPE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ComponentTypeType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ComponentTypeType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ComponentTypeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ComponentTypeType_type") :
-			getString("_UI_ComponentTypeType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ComponentTypeType.class)) {
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterClassTypeItemProvider.java
deleted file mode 100644
index a9f940e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ConverterClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterClassType_textContent_feature", "_UI_ConverterClassType_type"),
-				 FacesConfigPackage.Literals.CONVERTER_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterClassType_id_feature", "_UI_ConverterClassType_type"),
-				 FacesConfigPackage.Literals.CONVERTER_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ConverterClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ConverterClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ConverterClassType_type") :
-			getString("_UI_ConverterClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ConverterClassType.class)) {
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterExtensionTypeItemProvider.java
deleted file mode 100644
index f0f5080..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConverterExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ConverterExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns ConverterExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((ConverterExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ConverterExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_ConverterExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterForClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterForClassTypeItemProvider.java
deleted file mode 100644
index 7539298..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterForClassTypeItemProvider.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ConverterForClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterForClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterForClassType_textContent_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterForClassType_textContent_feature", "_UI_ConverterForClassType_type"),  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterForClassType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterForClassType_id_feature", "_UI_ConverterForClassType_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.CONVERTER_FOR_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ConverterForClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterForClassType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ConverterForClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ConverterForClassType_type") : //$NON-NLS-1$
-			getString("_UI_ConverterForClassType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ConverterForClassType.class)) {
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterIdTypeItemProvider.java
deleted file mode 100644
index 7a5edf0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterIdTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ConverterIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterIdType_textContent_feature", "_UI_ConverterIdType_type"),
-				 FacesConfigPackage.Literals.CONVERTER_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterIdType_id_feature", "_UI_ConverterIdType_type"),
-				 FacesConfigPackage.Literals.CONVERTER_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ConverterIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ConverterIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ConverterIdType_type") :
-			getString("_UI_ConverterIdType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ConverterIdType.class)) {
-			case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterTypeItemProvider.java
deleted file mode 100644
index 1ad9ab6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ConverterTypeItemProvider.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ConverterTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ConverterType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ConverterType_id_feature", "_UI_ConverterType_type"),
-				 FacesConfigPackage.Literals.CONVERTER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_FOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ConverterType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ConverterType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = null;
-		
-		if (((ConverterType) object).getDisplayName() != null
-				&& ((ConverterType) object).getDisplayName().size() > 0) {
-			label = ((DisplayNameType) ((ConverterType) object)
-					.getDisplayName().get(0)).getTextContent();
-		}
-		
-		if (label == null && ((ConverterType) object).getConverterId() != null) {
-			label = ((ConverterType) object).getConverterId().getTextContent();
-		}
-
-		if (label == null || label.length() == 0) {
-			if (((ConverterType) object).getConverterClass() != null)
-				label = ((ConverterType) object).getConverterClass()
-						.getTextContent();
-		}
-		if (label == null || label.length() ==0) {
-			label = ((ConverterType) object).getId();
-		}
-
-		return label == null || label.length() == 0 ? getString("_UI_ConverterType_type") 
-				: label;
-//				: getString("_UI_ConverterType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ConverterType.class)) {
-			case FacesConfigPackage.CONVERTER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_ID,
-				 FacesConfigFactory.eINSTANCE.createConverterIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_FOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createConverterForClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createConverterClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.CONVERTER_TYPE__CONVERTER_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createConverterExtensionType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ConverterType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultLocaleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultLocaleTypeItemProvider.java
deleted file mode 100644
index 8777aa4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultLocaleTypeItemProvider.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-@SuppressWarnings("nls")
-public class DefaultLocaleTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultLocaleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
- 	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultLocaleType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultLocaleType_textContent_feature", "_UI_DefaultLocaleType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_LOCALE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultLocaleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultLocaleType_id_feature", "_UI_DefaultLocaleType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_LOCALE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DefaultLocaleType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultLocaleType"));
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((DefaultLocaleType)object).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_DefaultLocaleType_type") : //$NON-NLS-1$
-            label;
-    }
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DefaultLocaleType.class)) {
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultRenderKitIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultRenderKitIdTypeItemProvider.java
deleted file mode 100644
index 82efd15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultRenderKitIdTypeItemProvider.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DefaultRenderKitIdTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultRenderKitIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultRenderKitIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultRenderKitIdType_textContent_feature", "_UI_DefaultRenderKitIdType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultRenderKitIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultRenderKitIdType_id_feature", "_UI_DefaultRenderKitIdType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_RENDER_KIT_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DefaultRenderKitIdType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultRenderKitIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((DefaultRenderKitIdType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_DefaultRenderKitIdType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DefaultRenderKitIdType.class)) {
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_DefaultRenderKitIdType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValidatorsTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValidatorsTypeItemProvider.java
deleted file mode 100644
index 67afedd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValidatorsTypeItemProvider.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DefaultValidatorsTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValidatorsTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultValidatorsType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultValidatorsType_id_feature", "_UI_DefaultValidatorsType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_VALIDATORS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns DefaultValidatorsType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultValidatorsType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DefaultValidatorsType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DefaultValidatorsType_type") :
-			getString("_UI_DefaultValidatorsType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DefaultValidatorsType.class)) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID,
-				 FacesConfigFactory.eINSTANCE.createValidatorIdType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValueTypeItemProvider.java
deleted file mode 100644
index b830289..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DefaultValueTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DefaultValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValueTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultValueType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultValueType_textContent_feature", "_UI_DefaultValueType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_VALUE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DefaultValueType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DefaultValueType_id_feature", "_UI_DefaultValueType_type"),
-				 FacesConfigPackage.Literals.DEFAULT_VALUE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DefaultValueType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DefaultValueType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DefaultValueType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DefaultValueType_type") :
-			getString("_UI_DefaultValueType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DefaultValueType.class)) {
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DescriptionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DescriptionTypeItemProvider.java
deleted file mode 100644
index 4bf86c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DescriptionTypeItemProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DescriptionTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescriptionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addLangPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DescriptionType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DescriptionType_textContent_feature", "_UI_DescriptionType_type"),
-				 FacesConfigPackage.Literals.DESCRIPTION_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Lang feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLangPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DescriptionType_lang_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DescriptionType_lang_feature", "_UI_DescriptionType_type"),
-				 FacesConfigPackage.Literals.DESCRIPTION_TYPE__LANG,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DescriptionType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DescriptionType_id_feature", "_UI_DescriptionType_type"),
-				 FacesConfigPackage.Literals.DESCRIPTION_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DescriptionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DescriptionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DescriptionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DescriptionType_type") :
-			getString("_UI_DescriptionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DescriptionType.class)) {
-			case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-			case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DisplayNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DisplayNameTypeItemProvider.java
deleted file mode 100644
index 91d43b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DisplayNameTypeItemProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DisplayNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DisplayNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addLangPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DisplayNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DisplayNameType_textContent_feature", "_UI_DisplayNameType_type"),
-				 FacesConfigPackage.Literals.DISPLAY_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Lang feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLangPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DisplayNameType_lang_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DisplayNameType_lang_feature", "_UI_DisplayNameType_type"),
-				 FacesConfigPackage.Literals.DISPLAY_NAME_TYPE__LANG,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DisplayNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DisplayNameType_id_feature", "_UI_DisplayNameType_type"),
-				 FacesConfigPackage.Literals.DISPLAY_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DisplayNameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DisplayNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((DisplayNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DisplayNameType_type") :
-			getString("_UI_DisplayNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DisplayNameType.class)) {
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DocumentRootItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DocumentRootItemProvider.java
deleted file mode 100644
index 09acd88..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DocumentRootItemProvider.java
+++ /dev/null
@@ -1,886 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class DocumentRootItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DocumentRootItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ABSOLUTE_ORDERING);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_FAMILY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_FOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALIDATORS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_ACTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_OUTCOME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_VIEW_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__IF);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__LARGE_ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING_ORDERING);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__OTHERS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_TYPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__RESOURCE_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SOURCE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUGGESTED_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER);
-			childrenFeatures.add(FacesConfigPackage.Literals.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns DocumentRoot.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DocumentRoot")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_DocumentRoot_type"); //$NON-NLS-1$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DocumentRoot.class)) {
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ABSOLUTE_ORDERING,
-				 FacesConfigFactory.eINSTANCE.createAbsoluteOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER,
-				 FacesConfigFactory.eINSTANCE.createActionListenerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION,
-				 FacesConfigFactory.eINSTANCE.createApplicationType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createApplicationFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createAttributeClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createAttributeExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME,
-				 FacesConfigFactory.eINSTANCE.createAttributeNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR,
-				 FacesConfigFactory.eINSTANCE.createBehaviorType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createBehaviorClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_ID,
-				 FacesConfigFactory.eINSTANCE.createBehaviorIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createBehaviorExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT,
-				 FacesConfigFactory.eINSTANCE.createComponentType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createComponentClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createComponentExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_FAMILY,
-				 FacesConfigFactory.eINSTANCE.createComponentFamilyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE,
-				 FacesConfigFactory.eINSTANCE.createComponentTypeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER,
-				 FacesConfigFactory.eINSTANCE.createConverterType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createConverterClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_FOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createConverterForClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_ID,
-				 FacesConfigFactory.eINSTANCE.createConverterIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE,
-				 FacesConfigFactory.eINSTANCE.createDefaultLocaleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID,
-				 FacesConfigFactory.eINSTANCE.createDefaultRenderKitIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALIDATORS,
-				 FacesConfigFactory.eINSTANCE.createDefaultValidatorsType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE,
-				 FacesConfigFactory.eINSTANCE.createDefaultValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createExceptionHandlerFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createExternalContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG,
-				 FacesConfigFactory.eINSTANCE.createFacesConfigType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createFacesContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET,
-				 FacesConfigFactory.eINSTANCE.createFacetType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createFacetExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_NAME,
-				 FacesConfigFactory.eINSTANCE.createFacetNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY,
-				 FacesConfigFactory.eINSTANCE.createFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_ACTION,
-				 FacesConfigFactory.eINSTANCE.createFromActionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_OUTCOME,
-				 FacesConfigFactory.eINSTANCE.createFromOutcomeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_VIEW_ID,
-				 FacesConfigFactory.eINSTANCE.createFromViewIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__IF,
-				 FacesConfigFactory.eINSTANCE.createIfType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY,
-				 FacesConfigFactory.eINSTANCE.createKeyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY_CLASS,
-				 FacesConfigFactory.eINSTANCE.createKeyClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__LARGE_ICON,
-				 FacesConfigFactory.eINSTANCE.createLargeIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE,
-				 FacesConfigFactory.eINSTANCE.createLifecycleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createLifecycleFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createListEntriesType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG,
-				 FacesConfigFactory.eINSTANCE.createLocaleConfigType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_CLASS,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_NAME,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanScopeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createManagedPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createMapEntriesType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY,
-				 FacesConfigFactory.eINSTANCE.createMapEntryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE,
-				 FacesConfigFactory.eINSTANCE.createMessageBundleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAME,
-				 FacesConfigFactory.eINSTANCE.createNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE,
-				 FacesConfigFactory.eINSTANCE.createNavigationCaseType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createNavigationHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE,
-				 FacesConfigFactory.eINSTANCE.createNavigationRuleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE,
-				 FacesConfigFactory.eINSTANCE.createNullValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING,
-				 FacesConfigFactory.eINSTANCE.createOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING_ORDERING,
-				 FacesConfigFactory.eINSTANCE.createOrderingOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__OTHERS,
-				 FacesConfigFactory.eINSTANCE.createOrderingOthersType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createPartialViewContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER,
-				 FacesConfigFactory.eINSTANCE.createPhaseListenerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_CLASS,
-				 FacesConfigFactory.eINSTANCE.createPropertyClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createPropertyExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_NAME,
-				 FacesConfigFactory.eINSTANCE.createPropertyNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER,
-				 FacesConfigFactory.eINSTANCE.createPropertyResolverType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT,
-				 FacesConfigFactory.eINSTANCE.createRedirectType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM,
-				 FacesConfigFactory.eINSTANCE.createRedirectViewParamType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_NAME,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER,
-				 FacesConfigFactory.eINSTANCE.createRendererType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createRendererClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createRendererExtensionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_TYPE,
-				 FacesConfigFactory.eINSTANCE.createRendererTypeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT,
-				 FacesConfigFactory.eINSTANCE.createRenderKitType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createRenderKitClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createRenderKitFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID,
-				 FacesConfigFactory.eINSTANCE.createRenderKitIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__RESOURCE_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createResourceHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON,
-				 FacesConfigFactory.eINSTANCE.createSmallIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SOURCE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSourceClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER,
-				 FacesConfigFactory.eINSTANCE.createStateManagerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUGGESTED_VALUE,
-				 FacesConfigFactory.eINSTANCE.createSuggestedValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE,
-				 FacesConfigFactory.eINSTANCE.createSupportedLocaleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSystemEventClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER,
-				 FacesConfigFactory.eINSTANCE.createSystemEventListenerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSystemEventListenerClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createTagHandlerDelegateFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID,
-				 FacesConfigFactory.eINSTANCE.createToViewIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR,
-				 FacesConfigFactory.eINSTANCE.createValidatorType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createValidatorClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_ID,
-				 FacesConfigFactory.eINSTANCE.createValidatorIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE,
-				 FacesConfigFactory.eINSTANCE.createValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createValueClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER,
-				 FacesConfigFactory.eINSTANCE.createVariableResolverType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createViewDeclarationLanguageFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER,
-				 FacesConfigFactory.eINSTANCE.createViewHandlerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createVisitContextFactoryType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicAttributeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicAttributeItemProvider.java
deleted file mode 100644
index e44c452..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicAttributeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DynamicAttributeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public DynamicAttributeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addValuePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DynamicAttribute_name_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DynamicAttribute_name_feature", "_UI_DynamicAttribute_type"),
-				 FacesConfigPackage.Literals.DYNAMIC_ATTRIBUTE__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Value feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addValuePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DynamicAttribute_value_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DynamicAttribute_value_feature", "_UI_DynamicAttribute_type"),
-				 FacesConfigPackage.Literals.DYNAMIC_ATTRIBUTE__VALUE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns DynamicAttribute.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DynamicAttribute"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((DynamicAttribute)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DynamicAttribute_type") :
-			getString("_UI_DynamicAttribute_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DynamicAttribute.class)) {
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicElementItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicElementItemProvider.java
deleted file mode 100644
index cd537af..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/DynamicElementItemProvider.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class DynamicElementItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public DynamicElementItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addNamePropertyDescriptor(object);
-			addAttributesPropertyDescriptor(object);
-			addTextContentPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Attributes feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addAttributesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DynamicElement_attributes_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DynamicElement_attributes_feature", "_UI_DynamicElement_type"),
-				 FacesConfigPackage.Literals.DYNAMIC_ELEMENT__ATTRIBUTES,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DynamicElement_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DynamicElement_textContent_feature", "_UI_DynamicElement_type"),
-				 FacesConfigPackage.Literals.DYNAMIC_ELEMENT__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_DynamicElement_name_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_DynamicElement_name_feature", "_UI_DynamicElement_type"),
-				 FacesConfigPackage.Literals.DYNAMIC_ELEMENT__NAME,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.DYNAMIC_ELEMENT__CHILD_NODES);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns DynamicElement.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DynamicElement"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((DynamicElement)object).getName();
-		return label == null || label.length() == 0 ?
-			getString("_UI_DynamicElement_type") :
-			getString("_UI_DynamicElement_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DynamicElement.class)) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-			case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.DYNAMIC_ELEMENT__CHILD_NODES,
-				 FacesConfigFactory.eINSTANCE.createDynamicElement()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ELResolverTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ELResolverTypeItemProvider.java
deleted file mode 100644
index cb209a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ELResolverTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ELResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ELResolverTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ELResolverTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ELResolverType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ELResolverType_textContent_feature", "_UI_ELResolverType_type"),
-				 FacesConfigPackage.Literals.EL_RESOLVER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ELResolverType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ELResolverType_id_feature", "_UI_ELResolverType_type"),
-				 FacesConfigPackage.Literals.EL_RESOLVER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ELResolverType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ELResolverType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ELResolverType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ELResolverType_type") :
-			getString("_UI_ELResolverType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ELResolverType.class)) {
-			case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExceptionHandlerFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExceptionHandlerFactoryTypeItemProvider.java
deleted file mode 100644
index 654f40f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExceptionHandlerFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ExceptionHandlerFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExceptionHandlerFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExceptionHandlerFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExceptionHandlerFactoryType_textContent_feature", "_UI_ExceptionHandlerFactoryType_type"),
-				 FacesConfigPackage.Literals.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExceptionHandlerFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExceptionHandlerFactoryType_id_feature", "_UI_ExceptionHandlerFactoryType_type"),
-				 FacesConfigPackage.Literals.EXCEPTION_HANDLER_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ExceptionHandlerFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ExceptionHandlerFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ExceptionHandlerFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ExceptionHandlerFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ExceptionHandlerFactoryType.class)) {
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ExceptionHandlerFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExtensionTypeItemProvider.java
deleted file mode 100644
index 66bcdb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ExtensionTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addChildNodesPropertyDescriptor(object);
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Child Nodes feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addChildNodesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExtensionType_childNodes_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExtensionType_childNodes_feature", "_UI_ExtensionType_type"),
-				 FacesConfigPackage.Literals.EXTENSION_TYPE__CHILD_NODES,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExtensionType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExtensionType_textContent_feature", "_UI_ExtensionType_type"),
-				 FacesConfigPackage.Literals.EXTENSION_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExtensionType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExtensionType_id_feature", "_UI_ExtensionType_type"),
-				 FacesConfigPackage.Literals.EXTENSION_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ExtensionType_type") :
-			getString("_UI_ExtensionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ExtensionType.class)) {
-			case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.EXTENSION_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExternalContextFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExternalContextFactoryTypeItemProvider.java
deleted file mode 100644
index 6e2d0e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ExternalContextFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ExternalContextFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExternalContextFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExternalContextFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExternalContextFactoryType_textContent_feature", "_UI_ExternalContextFactoryType_type"),
-				 FacesConfigPackage.Literals.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ExternalContextFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ExternalContextFactoryType_id_feature", "_UI_ExternalContextFactoryType_type"),
-				 FacesConfigPackage.Literals.EXTERNAL_CONTEXT_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ExternalContextFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ExternalContextFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ExternalContextFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ExternalContextFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ExternalContextFactoryType.class)) {
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ExternalContextFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigEditPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigEditPlugin.java
deleted file mode 100644
index 05c525e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigEditPlugin.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import org.eclipse.emf.common.EMFPlugin;
-import org.eclipse.emf.common.util.ResourceLocator;
-
-/**
- * This is the central singleton for the FacesConfig edit plugin.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public final class FacesConfigEditPlugin extends EMFPlugin {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final FacesConfigEditPlugin INSTANCE = new FacesConfigEditPlugin();
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static Implementation plugin;
-
-	/**
-	 * Create the instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigEditPlugin() {
-		super
-		  (new ResourceLocator [] {
-		   });
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public ResourceLocator getPluginResourceLocator() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public static Implementation getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static class Implementation extends EclipsePlugin {
-		/**
-		 * Creates an instance.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		public Implementation() {
-			super();
-
-			// Remember the static instance.
-			//
-			plugin = this;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigExtensionTypeItemProvider.java
deleted file mode 100644
index 1767f9f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacesConfigExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public FacesConfigExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns FacesConfigExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacesConfigExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((FacesConfigExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FacesConfigExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_FacesConfigExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigItemProviderAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigItemProviderAdapterFactory.java
deleted file mode 100644
index b196519..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,2995 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.edit.provider.ChangeNotifier;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.util.FacesConfigAdapterFactory;
-
-/**
- * This is the factory that is used to provide the interfaces needed to support Viewers.
- * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
- * The adapters also support Eclipse property sheets.
- * Note that most of the adapters are shared among multiple instances.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacesConfigItemProviderAdapterFactory extends FacesConfigAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This keeps track of the root adapter factory that delegates to this adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComposedAdapterFactory parentAdapterFactory;
-
-    /**
-	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IChangeNotifier changeNotifier = new ChangeNotifier();
-
-    /**
-	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Collection supportedTypes = new ArrayList();
-
-    /**
-     * This constructs an instance.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public FacesConfigItemProviderAdapterFactory() {
-        supportedTypes.add(IEditingDomainItemProvider.class);
-        supportedTypes.add(IStructuredItemContentProvider.class);
-        supportedTypes.add(ITreeItemContentProvider.class);
-        supportedTypes.add(IItemLabelProvider.class);
-        supportedTypes.add(IItemPropertySource.class);		
-        supportedTypes.add(ITableItemLabelProvider.class);
-    }
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AbsoluteOrderingTypeItemProvider absoluteOrderingTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createAbsoluteOrderingTypeAdapter() {
-		if (absoluteOrderingTypeItemProvider == null) {
-			absoluteOrderingTypeItemProvider = new AbsoluteOrderingTypeItemProvider(this);
-		}
-
-		return absoluteOrderingTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActionListenerTypeItemProvider actionListenerTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createActionListenerTypeAdapter() {
-		if (actionListenerTypeItemProvider == null) {
-			actionListenerTypeItemProvider = new ActionListenerTypeItemProvider(this);
-		}
-
-		return actionListenerTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ApplicationFactoryTypeItemProvider applicationFactoryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createApplicationFactoryTypeAdapter() {
-		if (applicationFactoryTypeItemProvider == null) {
-			applicationFactoryTypeItemProvider = new ApplicationFactoryTypeItemProvider(this);
-		}
-
-		return applicationFactoryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ApplicationTypeItemProvider applicationTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createApplicationTypeAdapter() {
-		if (applicationTypeItemProvider == null) {
-			applicationTypeItemProvider = new ApplicationTypeItemProvider(this);
-		}
-
-		return applicationTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeClassTypeItemProvider attributeClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createAttributeClassTypeAdapter() {
-		if (attributeClassTypeItemProvider == null) {
-			attributeClassTypeItemProvider = new AttributeClassTypeItemProvider(this);
-		}
-
-		return attributeClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeExtensionTypeItemProvider attributeExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createAttributeExtensionTypeAdapter() {
-		if (attributeExtensionTypeItemProvider == null) {
-			attributeExtensionTypeItemProvider = new AttributeExtensionTypeItemProvider(this);
-		}
-
-		return attributeExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeNameTypeItemProvider attributeNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createAttributeNameTypeAdapter() {
-		if (attributeNameTypeItemProvider == null) {
-			attributeNameTypeItemProvider = new AttributeNameTypeItemProvider(this);
-		}
-
-		return attributeNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeTypeItemProvider attributeTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createAttributeTypeAdapter() {
-		if (attributeTypeItemProvider == null) {
-			attributeTypeItemProvider = new AttributeTypeItemProvider(this);
-		}
-
-		return attributeTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorClassTypeItemProvider behaviorClassTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createBehaviorClassTypeAdapter() {
-		if (behaviorClassTypeItemProvider == null) {
-			behaviorClassTypeItemProvider = new BehaviorClassTypeItemProvider(this);
-		}
-
-		return behaviorClassTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorIdTypeItemProvider behaviorIdTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createBehaviorIdTypeAdapter() {
-		if (behaviorIdTypeItemProvider == null) {
-			behaviorIdTypeItemProvider = new BehaviorIdTypeItemProvider(this);
-		}
-
-		return behaviorIdTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorTypeItemProvider behaviorTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createBehaviorTypeAdapter() {
-		if (behaviorTypeItemProvider == null) {
-			behaviorTypeItemProvider = new BehaviorTypeItemProvider(this);
-		}
-
-		return behaviorTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorExtensionTypeItemProvider behaviorExtensionTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createBehaviorExtensionTypeAdapter() {
-		if (behaviorExtensionTypeItemProvider == null) {
-			behaviorExtensionTypeItemProvider = new BehaviorExtensionTypeItemProvider(this);
-		}
-
-		return behaviorExtensionTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererClassTypeItemProvider clientBehaviorRendererClassTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererClassTypeAdapter() {
-		if (clientBehaviorRendererClassTypeItemProvider == null) {
-			clientBehaviorRendererClassTypeItemProvider = new ClientBehaviorRendererClassTypeItemProvider(this);
-		}
-
-		return clientBehaviorRendererClassTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererTypeItemProvider clientBehaviorRendererTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererTypeAdapter() {
-		if (clientBehaviorRendererTypeItemProvider == null) {
-			clientBehaviorRendererTypeItemProvider = new ClientBehaviorRendererTypeItemProvider(this);
-		}
-
-		return clientBehaviorRendererTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererTypeTypeItemProvider clientBehaviorRendererTypeTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererTypeTypeAdapter() {
-		if (clientBehaviorRendererTypeTypeItemProvider == null) {
-			clientBehaviorRendererTypeTypeItemProvider = new ClientBehaviorRendererTypeTypeItemProvider(this);
-		}
-
-		return clientBehaviorRendererTypeTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentClassTypeItemProvider componentClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createComponentClassTypeAdapter() {
-		if (componentClassTypeItemProvider == null) {
-			componentClassTypeItemProvider = new ComponentClassTypeItemProvider(this);
-		}
-
-		return componentClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentExtensionTypeItemProvider componentExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createComponentExtensionTypeAdapter() {
-		if (componentExtensionTypeItemProvider == null) {
-			componentExtensionTypeItemProvider = new ComponentExtensionTypeItemProvider(this);
-		}
-
-		return componentExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentFamilyTypeItemProvider componentFamilyTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createComponentFamilyTypeAdapter() {
-		if (componentFamilyTypeItemProvider == null) {
-			componentFamilyTypeItemProvider = new ComponentFamilyTypeItemProvider(this);
-		}
-
-		return componentFamilyTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentTypeItemProvider componentTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createComponentTypeAdapter() {
-		if (componentTypeItemProvider == null) {
-			componentTypeItemProvider = new ComponentTypeItemProvider(this);
-		}
-
-		return componentTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentTypeTypeItemProvider componentTypeTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createComponentTypeTypeAdapter() {
-		if (componentTypeTypeItemProvider == null) {
-			componentTypeTypeItemProvider = new ComponentTypeTypeItemProvider(this);
-		}
-
-		return componentTypeTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterClassTypeItemProvider converterClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createConverterClassTypeAdapter() {
-		if (converterClassTypeItemProvider == null) {
-			converterClassTypeItemProvider = new ConverterClassTypeItemProvider(this);
-		}
-
-		return converterClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterForClassTypeItemProvider converterForClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createConverterForClassTypeAdapter() {
-		if (converterForClassTypeItemProvider == null) {
-			converterForClassTypeItemProvider = new ConverterForClassTypeItemProvider(this);
-		}
-
-		return converterForClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterIdTypeItemProvider converterIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createConverterIdTypeAdapter() {
-		if (converterIdTypeItemProvider == null) {
-			converterIdTypeItemProvider = new ConverterIdTypeItemProvider(this);
-		}
-
-		return converterIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterTypeItemProvider converterTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createConverterTypeAdapter() {
-		if (converterTypeItemProvider == null) {
-			converterTypeItemProvider = new ConverterTypeItemProvider(this);
-		}
-
-		return converterTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultLocaleTypeItemProvider defaultLocaleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDefaultLocaleTypeAdapter() {
-		if (defaultLocaleTypeItemProvider == null) {
-			defaultLocaleTypeItemProvider = new DefaultLocaleTypeItemProvider(this);
-		}
-
-		return defaultLocaleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultRenderKitIdTypeItemProvider defaultRenderKitIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDefaultRenderKitIdTypeAdapter() {
-		if (defaultRenderKitIdTypeItemProvider == null) {
-			defaultRenderKitIdTypeItemProvider = new DefaultRenderKitIdTypeItemProvider(this);
-		}
-
-		return defaultRenderKitIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultValidatorsTypeItemProvider defaultValidatorsTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDefaultValidatorsTypeAdapter() {
-		if (defaultValidatorsTypeItemProvider == null) {
-			defaultValidatorsTypeItemProvider = new DefaultValidatorsTypeItemProvider(this);
-		}
-
-		return defaultValidatorsTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultValueTypeItemProvider defaultValueTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDefaultValueTypeAdapter() {
-		if (defaultValueTypeItemProvider == null) {
-			defaultValueTypeItemProvider = new DefaultValueTypeItemProvider(this);
-		}
-
-		return defaultValueTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescriptionTypeItemProvider descriptionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDescriptionTypeAdapter() {
-		if (descriptionTypeItemProvider == null) {
-			descriptionTypeItemProvider = new DescriptionTypeItemProvider(this);
-		}
-
-		return descriptionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DisplayNameTypeItemProvider displayNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDisplayNameTypeAdapter() {
-		if (displayNameTypeItemProvider == null) {
-			displayNameTypeItemProvider = new DisplayNameTypeItemProvider(this);
-		}
-
-		return displayNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DocumentRootItemProvider documentRootItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createDocumentRootAdapter() {
-		if (documentRootItemProvider == null) {
-			documentRootItemProvider = new DocumentRootItemProvider(this);
-		}
-
-		return documentRootItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected DynamicAttributeItemProvider dynamicAttributeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createDynamicAttributeAdapter() {
-		if (dynamicAttributeItemProvider == null) {
-			dynamicAttributeItemProvider = new DynamicAttributeItemProvider(this);
-		}
-
-		return dynamicAttributeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected DynamicElementItemProvider dynamicElementItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createDynamicElementAdapter() {
-		if (dynamicElementItemProvider == null) {
-			dynamicElementItemProvider = new DynamicElementItemProvider(this);
-		}
-
-		return dynamicElementItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ELResolverTypeItemProvider elResolverTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createELResolverTypeAdapter() {
-		if (elResolverTypeItemProvider == null) {
-			elResolverTypeItemProvider = new ELResolverTypeItemProvider(this);
-		}
-
-		return elResolverTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExceptionHandlerFactoryTypeItemProvider exceptionHandlerFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createExceptionHandlerFactoryTypeAdapter() {
-		if (exceptionHandlerFactoryTypeItemProvider == null) {
-			exceptionHandlerFactoryTypeItemProvider = new ExceptionHandlerFactoryTypeItemProvider(this);
-		}
-
-		return exceptionHandlerFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExternalContextFactoryTypeItemProvider externalContextFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createExternalContextFactoryTypeAdapter() {
-		if (externalContextFactoryTypeItemProvider == null) {
-			externalContextFactoryTypeItemProvider = new ExternalContextFactoryTypeItemProvider(this);
-		}
-
-		return externalContextFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected FacesConfigExtensionTypeItemProvider facesConfigExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createFacesConfigExtensionTypeAdapter() {
-		if (facesConfigExtensionTypeItemProvider == null) {
-			facesConfigExtensionTypeItemProvider = new FacesConfigExtensionTypeItemProvider(this);
-		}
-
-		return facesConfigExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected FactoryExtensionTypeItemProvider factoryExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createFactoryExtensionTypeAdapter() {
-		if (factoryExtensionTypeItemProvider == null) {
-			factoryExtensionTypeItemProvider = new FactoryExtensionTypeItemProvider(this);
-		}
-
-		return factoryExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected LifecycleExtensionTypeItemProvider lifecycleExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createLifecycleExtensionTypeAdapter() {
-		if (lifecycleExtensionTypeItemProvider == null) {
-			lifecycleExtensionTypeItemProvider = new LifecycleExtensionTypeItemProvider(this);
-		}
-
-		return lifecycleExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ManagedBeanExtensionTypeItemProvider managedBeanExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createManagedBeanExtensionTypeAdapter() {
-		if (managedBeanExtensionTypeItemProvider == null) {
-			managedBeanExtensionTypeItemProvider = new ManagedBeanExtensionTypeItemProvider(this);
-		}
-
-		return managedBeanExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected NavigationRuleExtensionTypeItemProvider navigationRuleExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createNavigationRuleExtensionTypeAdapter() {
-		if (navigationRuleExtensionTypeItemProvider == null) {
-			navigationRuleExtensionTypeItemProvider = new NavigationRuleExtensionTypeItemProvider(this);
-		}
-
-		return navigationRuleExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ValidatorExtensionTypeItemProvider validatorExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createValidatorExtensionTypeAdapter() {
-		if (validatorExtensionTypeItemProvider == null) {
-			validatorExtensionTypeItemProvider = new ValidatorExtensionTypeItemProvider(this);
-		}
-
-		return validatorExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacesConfigTypeItemProvider facesConfigTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFacesConfigTypeAdapter() {
-		if (facesConfigTypeItemProvider == null) {
-			facesConfigTypeItemProvider = new FacesConfigTypeItemProvider(this);
-		}
-
-		return facesConfigTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacesContextFactoryTypeItemProvider facesContextFactoryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFacesContextFactoryTypeAdapter() {
-		if (facesContextFactoryTypeItemProvider == null) {
-			facesContextFactoryTypeItemProvider = new FacesContextFactoryTypeItemProvider(this);
-		}
-
-		return facesContextFactoryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetExtensionTypeItemProvider facetExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFacetExtensionTypeAdapter() {
-		if (facetExtensionTypeItemProvider == null) {
-			facetExtensionTypeItemProvider = new FacetExtensionTypeItemProvider(this);
-		}
-
-		return facetExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetNameTypeItemProvider facetNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFacetNameTypeAdapter() {
-		if (facetNameTypeItemProvider == null) {
-			facetNameTypeItemProvider = new FacetNameTypeItemProvider(this);
-		}
-
-		return facetNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetTypeItemProvider facetTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFacetTypeAdapter() {
-		if (facetTypeItemProvider == null) {
-			facetTypeItemProvider = new FacetTypeItemProvider(this);
-		}
-
-		return facetTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FactoryTypeItemProvider factoryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFactoryTypeAdapter() {
-		if (factoryTypeItemProvider == null) {
-			factoryTypeItemProvider = new FactoryTypeItemProvider(this);
-		}
-
-		return factoryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromActionTypeItemProvider fromActionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFromActionTypeAdapter() {
-		if (fromActionTypeItemProvider == null) {
-			fromActionTypeItemProvider = new FromActionTypeItemProvider(this);
-		}
-
-		return fromActionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromOutcomeTypeItemProvider fromOutcomeTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFromOutcomeTypeAdapter() {
-		if (fromOutcomeTypeItemProvider == null) {
-			fromOutcomeTypeItemProvider = new FromOutcomeTypeItemProvider(this);
-		}
-
-		return fromOutcomeTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromViewIdTypeItemProvider fromViewIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createFromViewIdTypeAdapter() {
-		if (fromViewIdTypeItemProvider == null) {
-			fromViewIdTypeItemProvider = new FromViewIdTypeItemProvider(this);
-		}
-
-		return fromViewIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.IconType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IconTypeItemProvider iconTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIconTypeAdapter() {
-		if (iconTypeItemProvider == null) {
-			iconTypeItemProvider = new IconTypeItemProvider(this);
-		}
-
-		return iconTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.IfType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IfTypeItemProvider ifTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.IfType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createIfTypeAdapter() {
-		if (ifTypeItemProvider == null) {
-			ifTypeItemProvider = new IfTypeItemProvider(this);
-		}
-
-		return ifTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected KeyClassTypeItemProvider keyClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createKeyClassTypeAdapter() {
-		if (keyClassTypeItemProvider == null) {
-			keyClassTypeItemProvider = new KeyClassTypeItemProvider(this);
-		}
-
-		return keyClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.KeyType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected KeyTypeItemProvider keyTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createKeyTypeAdapter() {
-		if (keyTypeItemProvider == null) {
-			keyTypeItemProvider = new KeyTypeItemProvider(this);
-		}
-
-		return keyTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LargeIconTypeItemProvider largeIconTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createLargeIconTypeAdapter() {
-		if (largeIconTypeItemProvider == null) {
-			largeIconTypeItemProvider = new LargeIconTypeItemProvider(this);
-		}
-
-		return largeIconTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LifecycleFactoryTypeItemProvider lifecycleFactoryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createLifecycleFactoryTypeAdapter() {
-		if (lifecycleFactoryTypeItemProvider == null) {
-			lifecycleFactoryTypeItemProvider = new LifecycleFactoryTypeItemProvider(this);
-		}
-
-		return lifecycleFactoryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LifecycleTypeItemProvider lifecycleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createLifecycleTypeAdapter() {
-		if (lifecycleTypeItemProvider == null) {
-			lifecycleTypeItemProvider = new LifecycleTypeItemProvider(this);
-		}
-
-		return lifecycleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ListEntriesTypeItemProvider listEntriesTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createListEntriesTypeAdapter() {
-		if (listEntriesTypeItemProvider == null) {
-			listEntriesTypeItemProvider = new ListEntriesTypeItemProvider(this);
-		}
-
-		return listEntriesTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LocaleConfigTypeItemProvider localeConfigTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createLocaleConfigTypeAdapter() {
-		if (localeConfigTypeItemProvider == null) {
-			localeConfigTypeItemProvider = new LocaleConfigTypeItemProvider(this);
-		}
-
-		return localeConfigTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanClassTypeItemProvider managedBeanClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createManagedBeanClassTypeAdapter() {
-		if (managedBeanClassTypeItemProvider == null) {
-			managedBeanClassTypeItemProvider = new ManagedBeanClassTypeItemProvider(this);
-		}
-
-		return managedBeanClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanNameTypeItemProvider managedBeanNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createManagedBeanNameTypeAdapter() {
-		if (managedBeanNameTypeItemProvider == null) {
-			managedBeanNameTypeItemProvider = new ManagedBeanNameTypeItemProvider(this);
-		}
-
-		return managedBeanNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanScopeTypeItemProvider managedBeanScopeTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createManagedBeanScopeTypeAdapter() {
-		if (managedBeanScopeTypeItemProvider == null) {
-			managedBeanScopeTypeItemProvider = new ManagedBeanScopeTypeItemProvider(this);
-		}
-
-		return managedBeanScopeTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanTypeItemProvider managedBeanTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createManagedBeanTypeAdapter() {
-		if (managedBeanTypeItemProvider == null) {
-			managedBeanTypeItemProvider = new ManagedBeanTypeItemProvider(this);
-		}
-
-		return managedBeanTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedPropertyTypeItemProvider managedPropertyTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createManagedPropertyTypeAdapter() {
-		if (managedPropertyTypeItemProvider == null) {
-			managedPropertyTypeItemProvider = new ManagedPropertyTypeItemProvider(this);
-		}
-
-		return managedPropertyTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MapEntriesTypeItemProvider mapEntriesTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMapEntriesTypeAdapter() {
-		if (mapEntriesTypeItemProvider == null) {
-			mapEntriesTypeItemProvider = new MapEntriesTypeItemProvider(this);
-		}
-
-		return mapEntriesTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MapEntryTypeItemProvider mapEntryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMapEntryTypeAdapter() {
-		if (mapEntryTypeItemProvider == null) {
-			mapEntryTypeItemProvider = new MapEntryTypeItemProvider(this);
-		}
-
-		return mapEntryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MessageBundleTypeItemProvider messageBundleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createMessageBundleTypeAdapter() {
-		if (messageBundleTypeItemProvider == null) {
-			messageBundleTypeItemProvider = new MessageBundleTypeItemProvider(this);
-		}
-
-		return messageBundleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NameTypeItemProvider nameTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createNameTypeAdapter() {
-		if (nameTypeItemProvider == null) {
-			nameTypeItemProvider = new NameTypeItemProvider(this);
-		}
-
-		return nameTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationCaseTypeItemProvider navigationCaseTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createNavigationCaseTypeAdapter() {
-		if (navigationCaseTypeItemProvider == null) {
-			navigationCaseTypeItemProvider = new NavigationCaseTypeItemProvider(this);
-		}
-
-		return navigationCaseTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationHandlerTypeItemProvider navigationHandlerTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createNavigationHandlerTypeAdapter() {
-		if (navigationHandlerTypeItemProvider == null) {
-			navigationHandlerTypeItemProvider = new NavigationHandlerTypeItemProvider(this);
-		}
-
-		return navigationHandlerTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationRuleTypeItemProvider navigationRuleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createNavigationRuleTypeAdapter() {
-		if (navigationRuleTypeItemProvider == null) {
-			navigationRuleTypeItemProvider = new NavigationRuleTypeItemProvider(this);
-		}
-
-		return navigationRuleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NullValueTypeItemProvider nullValueTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createNullValueTypeAdapter() {
-		if (nullValueTypeItemProvider == null) {
-			nullValueTypeItemProvider = new NullValueTypeItemProvider(this);
-		}
-
-		return nullValueTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingTypeItemProvider orderingTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createOrderingTypeAdapter() {
-		if (orderingTypeItemProvider == null) {
-			orderingTypeItemProvider = new OrderingTypeItemProvider(this);
-		}
-
-		return orderingTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingOrderingTypeItemProvider orderingOrderingTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createOrderingOrderingTypeAdapter() {
-		if (orderingOrderingTypeItemProvider == null) {
-			orderingOrderingTypeItemProvider = new OrderingOrderingTypeItemProvider(this);
-		}
-
-		return orderingOrderingTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingOthersTypeItemProvider orderingOthersTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createOrderingOthersTypeAdapter() {
-		if (orderingOthersTypeItemProvider == null) {
-			orderingOthersTypeItemProvider = new OrderingOthersTypeItemProvider(this);
-		}
-
-		return orderingOthersTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PartialViewContextFactoryTypeItemProvider partialViewContextFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPartialViewContextFactoryTypeAdapter() {
-		if (partialViewContextFactoryTypeItemProvider == null) {
-			partialViewContextFactoryTypeItemProvider = new PartialViewContextFactoryTypeItemProvider(this);
-		}
-
-		return partialViewContextFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PhaseListenerTypeItemProvider phaseListenerTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPhaseListenerTypeAdapter() {
-		if (phaseListenerTypeItemProvider == null) {
-			phaseListenerTypeItemProvider = new PhaseListenerTypeItemProvider(this);
-		}
-
-		return phaseListenerTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyClassTypeItemProvider propertyClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyClassTypeAdapter() {
-		if (propertyClassTypeItemProvider == null) {
-			propertyClassTypeItemProvider = new PropertyClassTypeItemProvider(this);
-		}
-
-		return propertyClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyExtensionTypeItemProvider propertyExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyExtensionTypeAdapter() {
-		if (propertyExtensionTypeItemProvider == null) {
-			propertyExtensionTypeItemProvider = new PropertyExtensionTypeItemProvider(this);
-		}
-
-		return propertyExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyNameTypeItemProvider propertyNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyNameTypeAdapter() {
-		if (propertyNameTypeItemProvider == null) {
-			propertyNameTypeItemProvider = new PropertyNameTypeItemProvider(this);
-		}
-
-		return propertyNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyResolverTypeItemProvider propertyResolverTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyResolverTypeAdapter() {
-		if (propertyResolverTypeItemProvider == null) {
-			propertyResolverTypeItemProvider = new PropertyResolverTypeItemProvider(this);
-		}
-
-		return propertyResolverTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyTypeItemProvider propertyTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createPropertyTypeAdapter() {
-		if (propertyTypeItemProvider == null) {
-			propertyTypeItemProvider = new PropertyTypeItemProvider(this);
-		}
-
-		return propertyTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RedirectTypeItemProvider redirectTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRedirectTypeAdapter() {
-		if (redirectTypeItemProvider == null) {
-			redirectTypeItemProvider = new RedirectTypeItemProvider(this);
-		}
-
-		return redirectTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RedirectViewParamTypeItemProvider redirectViewParamTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRedirectViewParamTypeAdapter() {
-		if (redirectViewParamTypeItemProvider == null) {
-			redirectViewParamTypeItemProvider = new RedirectViewParamTypeItemProvider(this);
-		}
-
-		return redirectViewParamTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanClassTypeItemProvider referencedBeanClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createReferencedBeanClassTypeAdapter() {
-		if (referencedBeanClassTypeItemProvider == null) {
-			referencedBeanClassTypeItemProvider = new ReferencedBeanClassTypeItemProvider(this);
-		}
-
-		return referencedBeanClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanNameTypeItemProvider referencedBeanNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createReferencedBeanNameTypeAdapter() {
-		if (referencedBeanNameTypeItemProvider == null) {
-			referencedBeanNameTypeItemProvider = new ReferencedBeanNameTypeItemProvider(this);
-		}
-
-		return referencedBeanNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanTypeItemProvider referencedBeanTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createReferencedBeanTypeAdapter() {
-		if (referencedBeanTypeItemProvider == null) {
-			referencedBeanTypeItemProvider = new ReferencedBeanTypeItemProvider(this);
-		}
-
-		return referencedBeanTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererClassTypeItemProvider rendererClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRendererClassTypeAdapter() {
-		if (rendererClassTypeItemProvider == null) {
-			rendererClassTypeItemProvider = new RendererClassTypeItemProvider(this);
-		}
-
-		return rendererClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererExtensionTypeItemProvider rendererExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRendererExtensionTypeAdapter() {
-		if (rendererExtensionTypeItemProvider == null) {
-			rendererExtensionTypeItemProvider = new RendererExtensionTypeItemProvider(this);
-		}
-
-		return rendererExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererTypeItemProvider rendererTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRendererTypeAdapter() {
-		if (rendererTypeItemProvider == null) {
-			rendererTypeItemProvider = new RendererTypeItemProvider(this);
-		}
-
-		return rendererTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererTypeTypeItemProvider rendererTypeTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRendererTypeTypeAdapter() {
-		if (rendererTypeTypeItemProvider == null) {
-			rendererTypeTypeItemProvider = new RendererTypeTypeItemProvider(this);
-		}
-
-		return rendererTypeTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitClassTypeItemProvider renderKitClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRenderKitClassTypeAdapter() {
-		if (renderKitClassTypeItemProvider == null) {
-			renderKitClassTypeItemProvider = new RenderKitClassTypeItemProvider(this);
-		}
-
-		return renderKitClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitFactoryTypeItemProvider renderKitFactoryTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRenderKitFactoryTypeAdapter() {
-		if (renderKitFactoryTypeItemProvider == null) {
-			renderKitFactoryTypeItemProvider = new RenderKitFactoryTypeItemProvider(this);
-		}
-
-		return renderKitFactoryTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitIdTypeItemProvider renderKitIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRenderKitIdTypeAdapter() {
-		if (renderKitIdTypeItemProvider == null) {
-			renderKitIdTypeItemProvider = new RenderKitIdTypeItemProvider(this);
-		}
-
-		return renderKitIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitTypeItemProvider renderKitTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createRenderKitTypeAdapter() {
-		if (renderKitTypeItemProvider == null) {
-			renderKitTypeItemProvider = new RenderKitTypeItemProvider(this);
-		}
-
-		return renderKitTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SmallIconTypeItemProvider smallIconTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSmallIconTypeAdapter() {
-		if (smallIconTypeItemProvider == null) {
-			smallIconTypeItemProvider = new SmallIconTypeItemProvider(this);
-		}
-
-		return smallIconTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SourceClassTypeItemProvider sourceClassTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSourceClassTypeAdapter() {
-		if (sourceClassTypeItemProvider == null) {
-			sourceClassTypeItemProvider = new SourceClassTypeItemProvider(this);
-		}
-
-		return sourceClassTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected StateManagerTypeItemProvider stateManagerTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createStateManagerTypeAdapter() {
-		if (stateManagerTypeItemProvider == null) {
-			stateManagerTypeItemProvider = new StateManagerTypeItemProvider(this);
-		}
-
-		return stateManagerTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SuggestedValueTypeItemProvider suggestedValueTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSuggestedValueTypeAdapter() {
-		if (suggestedValueTypeItemProvider == null) {
-			suggestedValueTypeItemProvider = new SuggestedValueTypeItemProvider(this);
-		}
-
-		return suggestedValueTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SupportedLocaleTypeItemProvider supportedLocaleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSupportedLocaleTypeAdapter() {
-		if (supportedLocaleTypeItemProvider == null) {
-			supportedLocaleTypeItemProvider = new SupportedLocaleTypeItemProvider(this);
-		}
-
-		return supportedLocaleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventClassTypeItemProvider systemEventClassTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSystemEventClassTypeAdapter() {
-		if (systemEventClassTypeItemProvider == null) {
-			systemEventClassTypeItemProvider = new SystemEventClassTypeItemProvider(this);
-		}
-
-		return systemEventClassTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventListenerClassTypeItemProvider systemEventListenerClassTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSystemEventListenerClassTypeAdapter() {
-		if (systemEventListenerClassTypeItemProvider == null) {
-			systemEventListenerClassTypeItemProvider = new SystemEventListenerClassTypeItemProvider(this);
-		}
-
-		return systemEventListenerClassTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventListenerTypeItemProvider systemEventListenerTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createSystemEventListenerTypeAdapter() {
-		if (systemEventListenerTypeItemProvider == null) {
-			systemEventListenerTypeItemProvider = new SystemEventListenerTypeItemProvider(this);
-		}
-
-		return systemEventListenerTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagHandlerDelegateFactoryTypeItemProvider tagHandlerDelegateFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createTagHandlerDelegateFactoryTypeAdapter() {
-		if (tagHandlerDelegateFactoryTypeItemProvider == null) {
-			tagHandlerDelegateFactoryTypeItemProvider = new TagHandlerDelegateFactoryTypeItemProvider(this);
-		}
-
-		return tagHandlerDelegateFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ToViewIdTypeItemProvider toViewIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createToViewIdTypeAdapter() {
-		if (toViewIdTypeItemProvider == null) {
-			toViewIdTypeItemProvider = new ToViewIdTypeItemProvider(this);
-		}
-
-		return toViewIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorClassTypeItemProvider validatorClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createValidatorClassTypeAdapter() {
-		if (validatorClassTypeItemProvider == null) {
-			validatorClassTypeItemProvider = new ValidatorClassTypeItemProvider(this);
-		}
-
-		return validatorClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorIdTypeItemProvider validatorIdTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createValidatorIdTypeAdapter() {
-		if (validatorIdTypeItemProvider == null) {
-			validatorIdTypeItemProvider = new ValidatorIdTypeItemProvider(this);
-		}
-
-		return validatorIdTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorTypeItemProvider validatorTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createValidatorTypeAdapter() {
-		if (validatorTypeItemProvider == null) {
-			validatorTypeItemProvider = new ValidatorTypeItemProvider(this);
-		}
-
-		return validatorTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValueClassTypeItemProvider valueClassTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createValueClassTypeAdapter() {
-		if (valueClassTypeItemProvider == null) {
-			valueClassTypeItemProvider = new ValueClassTypeItemProvider(this);
-		}
-
-		return valueClassTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValueTypeItemProvider valueTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createValueTypeAdapter() {
-		if (valueTypeItemProvider == null) {
-			valueTypeItemProvider = new ValueTypeItemProvider(this);
-		}
-
-		return valueTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VariableResolverTypeItemProvider variableResolverTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createVariableResolverTypeAdapter() {
-		if (variableResolverTypeItemProvider == null) {
-			variableResolverTypeItemProvider = new VariableResolverTypeItemProvider(this);
-		}
-
-		return variableResolverTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ViewHandlerTypeItemProvider viewHandlerTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createViewHandlerTypeAdapter() {
-		if (viewHandlerTypeItemProvider == null) {
-			viewHandlerTypeItemProvider = new ViewHandlerTypeItemProvider(this);
-		}
-
-		return viewHandlerTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ApplicationExtensionTypeItemProvider applicationExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createApplicationExtensionTypeAdapter() {
-		if (applicationExtensionTypeItemProvider == null) {
-			applicationExtensionTypeItemProvider = new ApplicationExtensionTypeItemProvider(this);
-		}
-
-		return applicationExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ConverterExtensionTypeItemProvider converterExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createConverterExtensionTypeAdapter() {
-		if (converterExtensionTypeItemProvider == null) {
-			converterExtensionTypeItemProvider = new ConverterExtensionTypeItemProvider(this);
-		}
-
-		return converterExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ResourceBundleTypeItemProvider resourceBundleTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createResourceBundleTypeAdapter() {
-		if (resourceBundleTypeItemProvider == null) {
-			resourceBundleTypeItemProvider = new ResourceBundleTypeItemProvider(this);
-		}
-
-		return resourceBundleTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected BaseNameTypeItemProvider baseNameTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createBaseNameTypeAdapter() {
-		if (baseNameTypeItemProvider == null) {
-			baseNameTypeItemProvider = new BaseNameTypeItemProvider(this);
-		}
-
-		return baseNameTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.VarType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected VarTypeItemProvider varTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VarType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createVarTypeAdapter() {
-		if (varTypeItemProvider == null) {
-			varTypeItemProvider = new VarTypeItemProvider(this);
-		}
-
-		return varTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ViewDeclarationLanguageFactoryTypeItemProvider viewDeclarationLanguageFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createViewDeclarationLanguageFactoryTypeAdapter() {
-		if (viewDeclarationLanguageFactoryTypeItemProvider == null) {
-			viewDeclarationLanguageFactoryTypeItemProvider = new ViewDeclarationLanguageFactoryTypeItemProvider(this);
-		}
-
-		return viewDeclarationLanguageFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VisitContextFactoryTypeItemProvider visitContextFactoryTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createVisitContextFactoryTypeAdapter() {
-		if (visitContextFactoryTypeItemProvider == null) {
-			visitContextFactoryTypeItemProvider = new VisitContextFactoryTypeItemProvider(this);
-		}
-
-		return visitContextFactoryTypeItemProvider;
-	}
-
-				/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType} instances.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected RenderKitExtensionTypeItemProvider renderKitExtensionTypeItemProvider;
-
-    /**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Adapter createRenderKitExtensionTypeAdapter() {
-		if (renderKitExtensionTypeItemProvider == null) {
-			renderKitExtensionTypeItemProvider = new RenderKitExtensionTypeItemProvider(this);
-		}
-
-		return renderKitExtensionTypeItemProvider;
-	}
-
-    /**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType} instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResourceHandlerTypeItemProvider resourceHandlerTypeItemProvider;
-
-				/**
-	 * This creates an adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter createResourceHandlerTypeAdapter() {
-		if (resourceHandlerTypeItemProvider == null) {
-			resourceHandlerTypeItemProvider = new ResourceHandlerTypeItemProvider(this);
-		}
-
-		return resourceHandlerTypeItemProvider;
-	}
-
-				/**
-	 * This returns the root adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComposeableAdapterFactory getRootAdapterFactory() {
-		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
-	}
-
-    /**
-	 * This sets the composed adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
-		this.parentAdapterFactory = parentAdapterFactory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object type) {
-		return supportedTypes.contains(type) || super.isFactoryForType(type);
-	}
-
-    /**
-	 * This implementation substitutes the factory itself as the key for the adapter.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Adapter adapt(Notifier notifier, Object type) {
-		return super.adapt(notifier, this);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object adapt(Object object, Object type) {
-		if (isFactoryForType(type)) {
-			Object adapter = super.adapt(object, type);
-			if (!(type instanceof Class) || (((Class)type).isInstance(adapter))) {
-				return adapter;
-			}
-		}
-
-		return null;
-	}
-
-    /**
-	 * This adds a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void addListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.addListener(notifyChangedListener);
-	}
-
-    /**
-	 * This removes a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void removeListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.removeListener(notifyChangedListener);
-	}
-
-    /**
-	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void fireNotifyChanged(Notification notification) {
-		changeNotifier.fireNotifyChanged(notification);
-
-		if (parentAdapterFactory != null) {
-			parentAdapterFactory.fireNotifyChanged(notification);
-		}
-	}
-
-    /**
-	 * This disposes all of the item providers created by this factory. 
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void dispose() {
-		if (absoluteOrderingTypeItemProvider != null) absoluteOrderingTypeItemProvider.dispose();
-		if (actionListenerTypeItemProvider != null) actionListenerTypeItemProvider.dispose();
-		if (applicationFactoryTypeItemProvider != null) applicationFactoryTypeItemProvider.dispose();
-		if (applicationTypeItemProvider != null) applicationTypeItemProvider.dispose();
-		if (applicationExtensionTypeItemProvider != null) applicationExtensionTypeItemProvider.dispose();
-		if (attributeClassTypeItemProvider != null) attributeClassTypeItemProvider.dispose();
-		if (attributeExtensionTypeItemProvider != null) attributeExtensionTypeItemProvider.dispose();
-		if (attributeNameTypeItemProvider != null) attributeNameTypeItemProvider.dispose();
-		if (attributeTypeItemProvider != null) attributeTypeItemProvider.dispose();
-		if (behaviorClassTypeItemProvider != null) behaviorClassTypeItemProvider.dispose();
-		if (behaviorIdTypeItemProvider != null) behaviorIdTypeItemProvider.dispose();
-		if (behaviorTypeItemProvider != null) behaviorTypeItemProvider.dispose();
-		if (behaviorExtensionTypeItemProvider != null) behaviorExtensionTypeItemProvider.dispose();
-		if (clientBehaviorRendererClassTypeItemProvider != null) clientBehaviorRendererClassTypeItemProvider.dispose();
-		if (clientBehaviorRendererTypeItemProvider != null) clientBehaviorRendererTypeItemProvider.dispose();
-		if (clientBehaviorRendererTypeTypeItemProvider != null) clientBehaviorRendererTypeTypeItemProvider.dispose();
-		if (componentClassTypeItemProvider != null) componentClassTypeItemProvider.dispose();
-		if (componentExtensionTypeItemProvider != null) componentExtensionTypeItemProvider.dispose();
-		if (componentFamilyTypeItemProvider != null) componentFamilyTypeItemProvider.dispose();
-		if (componentTypeItemProvider != null) componentTypeItemProvider.dispose();
-		if (componentTypeTypeItemProvider != null) componentTypeTypeItemProvider.dispose();
-		if (converterClassTypeItemProvider != null) converterClassTypeItemProvider.dispose();
-		if (converterForClassTypeItemProvider != null) converterForClassTypeItemProvider.dispose();
-		if (converterIdTypeItemProvider != null) converterIdTypeItemProvider.dispose();
-		if (converterTypeItemProvider != null) converterTypeItemProvider.dispose();
-		if (converterExtensionTypeItemProvider != null) converterExtensionTypeItemProvider.dispose();
-		if (defaultLocaleTypeItemProvider != null) defaultLocaleTypeItemProvider.dispose();
-		if (defaultRenderKitIdTypeItemProvider != null) defaultRenderKitIdTypeItemProvider.dispose();
-		if (defaultValidatorsTypeItemProvider != null) defaultValidatorsTypeItemProvider.dispose();
-		if (defaultValueTypeItemProvider != null) defaultValueTypeItemProvider.dispose();
-		if (descriptionTypeItemProvider != null) descriptionTypeItemProvider.dispose();
-		if (displayNameTypeItemProvider != null) displayNameTypeItemProvider.dispose();
-		if (documentRootItemProvider != null) documentRootItemProvider.dispose();
-		if (dynamicAttributeItemProvider != null) dynamicAttributeItemProvider.dispose();
-		if (dynamicElementItemProvider != null) dynamicElementItemProvider.dispose();
-		if (elResolverTypeItemProvider != null) elResolverTypeItemProvider.dispose();
-		if (exceptionHandlerFactoryTypeItemProvider != null) exceptionHandlerFactoryTypeItemProvider.dispose();
-		if (externalContextFactoryTypeItemProvider != null) externalContextFactoryTypeItemProvider.dispose();
-		if (facesConfigTypeItemProvider != null) facesConfigTypeItemProvider.dispose();
-		if (facesConfigExtensionTypeItemProvider != null) facesConfigExtensionTypeItemProvider.dispose();
-		if (facesContextFactoryTypeItemProvider != null) facesContextFactoryTypeItemProvider.dispose();
-		if (facetExtensionTypeItemProvider != null) facetExtensionTypeItemProvider.dispose();
-		if (facetNameTypeItemProvider != null) facetNameTypeItemProvider.dispose();
-		if (facetTypeItemProvider != null) facetTypeItemProvider.dispose();
-		if (factoryTypeItemProvider != null) factoryTypeItemProvider.dispose();
-		if (factoryExtensionTypeItemProvider != null) factoryExtensionTypeItemProvider.dispose();
-		if (fromActionTypeItemProvider != null) fromActionTypeItemProvider.dispose();
-		if (fromOutcomeTypeItemProvider != null) fromOutcomeTypeItemProvider.dispose();
-		if (fromViewIdTypeItemProvider != null) fromViewIdTypeItemProvider.dispose();
-		if (iconTypeItemProvider != null) iconTypeItemProvider.dispose();
-		if (ifTypeItemProvider != null) ifTypeItemProvider.dispose();
-		if (keyClassTypeItemProvider != null) keyClassTypeItemProvider.dispose();
-		if (keyTypeItemProvider != null) keyTypeItemProvider.dispose();
-		if (largeIconTypeItemProvider != null) largeIconTypeItemProvider.dispose();
-		if (lifecycleFactoryTypeItemProvider != null) lifecycleFactoryTypeItemProvider.dispose();
-		if (lifecycleTypeItemProvider != null) lifecycleTypeItemProvider.dispose();
-		if (lifecycleExtensionTypeItemProvider != null) lifecycleExtensionTypeItemProvider.dispose();
-		if (listEntriesTypeItemProvider != null) listEntriesTypeItemProvider.dispose();
-		if (localeConfigTypeItemProvider != null) localeConfigTypeItemProvider.dispose();
-		if (managedBeanClassTypeItemProvider != null) managedBeanClassTypeItemProvider.dispose();
-		if (managedBeanNameTypeItemProvider != null) managedBeanNameTypeItemProvider.dispose();
-		if (managedBeanScopeTypeItemProvider != null) managedBeanScopeTypeItemProvider.dispose();
-		if (managedBeanTypeItemProvider != null) managedBeanTypeItemProvider.dispose();
-		if (managedBeanExtensionTypeItemProvider != null) managedBeanExtensionTypeItemProvider.dispose();
-		if (managedPropertyTypeItemProvider != null) managedPropertyTypeItemProvider.dispose();
-		if (mapEntriesTypeItemProvider != null) mapEntriesTypeItemProvider.dispose();
-		if (mapEntryTypeItemProvider != null) mapEntryTypeItemProvider.dispose();
-		if (messageBundleTypeItemProvider != null) messageBundleTypeItemProvider.dispose();
-		if (nameTypeItemProvider != null) nameTypeItemProvider.dispose();
-		if (navigationCaseTypeItemProvider != null) navigationCaseTypeItemProvider.dispose();
-		if (navigationHandlerTypeItemProvider != null) navigationHandlerTypeItemProvider.dispose();
-		if (navigationRuleTypeItemProvider != null) navigationRuleTypeItemProvider.dispose();
-		if (navigationRuleExtensionTypeItemProvider != null) navigationRuleExtensionTypeItemProvider.dispose();
-		if (nullValueTypeItemProvider != null) nullValueTypeItemProvider.dispose();
-		if (orderingTypeItemProvider != null) orderingTypeItemProvider.dispose();
-		if (orderingOrderingTypeItemProvider != null) orderingOrderingTypeItemProvider.dispose();
-		if (orderingOthersTypeItemProvider != null) orderingOthersTypeItemProvider.dispose();
-		if (partialViewContextFactoryTypeItemProvider != null) partialViewContextFactoryTypeItemProvider.dispose();
-		if (phaseListenerTypeItemProvider != null) phaseListenerTypeItemProvider.dispose();
-		if (propertyClassTypeItemProvider != null) propertyClassTypeItemProvider.dispose();
-		if (propertyExtensionTypeItemProvider != null) propertyExtensionTypeItemProvider.dispose();
-		if (propertyNameTypeItemProvider != null) propertyNameTypeItemProvider.dispose();
-		if (propertyResolverTypeItemProvider != null) propertyResolverTypeItemProvider.dispose();
-		if (propertyTypeItemProvider != null) propertyTypeItemProvider.dispose();
-		if (redirectTypeItemProvider != null) redirectTypeItemProvider.dispose();
-		if (redirectViewParamTypeItemProvider != null) redirectViewParamTypeItemProvider.dispose();
-		if (referencedBeanClassTypeItemProvider != null) referencedBeanClassTypeItemProvider.dispose();
-		if (referencedBeanNameTypeItemProvider != null) referencedBeanNameTypeItemProvider.dispose();
-		if (referencedBeanTypeItemProvider != null) referencedBeanTypeItemProvider.dispose();
-		if (rendererClassTypeItemProvider != null) rendererClassTypeItemProvider.dispose();
-		if (rendererExtensionTypeItemProvider != null) rendererExtensionTypeItemProvider.dispose();
-		if (rendererTypeItemProvider != null) rendererTypeItemProvider.dispose();
-		if (rendererTypeTypeItemProvider != null) rendererTypeTypeItemProvider.dispose();
-		if (renderKitClassTypeItemProvider != null) renderKitClassTypeItemProvider.dispose();
-		if (renderKitFactoryTypeItemProvider != null) renderKitFactoryTypeItemProvider.dispose();
-		if (renderKitIdTypeItemProvider != null) renderKitIdTypeItemProvider.dispose();
-		if (renderKitTypeItemProvider != null) renderKitTypeItemProvider.dispose();
-		if (renderKitExtensionTypeItemProvider != null) renderKitExtensionTypeItemProvider.dispose();
-		if (resourceHandlerTypeItemProvider != null) resourceHandlerTypeItemProvider.dispose();
-		if (smallIconTypeItemProvider != null) smallIconTypeItemProvider.dispose();
-		if (sourceClassTypeItemProvider != null) sourceClassTypeItemProvider.dispose();
-		if (stateManagerTypeItemProvider != null) stateManagerTypeItemProvider.dispose();
-		if (suggestedValueTypeItemProvider != null) suggestedValueTypeItemProvider.dispose();
-		if (supportedLocaleTypeItemProvider != null) supportedLocaleTypeItemProvider.dispose();
-		if (systemEventClassTypeItemProvider != null) systemEventClassTypeItemProvider.dispose();
-		if (systemEventListenerClassTypeItemProvider != null) systemEventListenerClassTypeItemProvider.dispose();
-		if (systemEventListenerTypeItemProvider != null) systemEventListenerTypeItemProvider.dispose();
-		if (tagHandlerDelegateFactoryTypeItemProvider != null) tagHandlerDelegateFactoryTypeItemProvider.dispose();
-		if (toViewIdTypeItemProvider != null) toViewIdTypeItemProvider.dispose();
-		if (validatorClassTypeItemProvider != null) validatorClassTypeItemProvider.dispose();
-		if (validatorIdTypeItemProvider != null) validatorIdTypeItemProvider.dispose();
-		if (validatorTypeItemProvider != null) validatorTypeItemProvider.dispose();
-		if (validatorExtensionTypeItemProvider != null) validatorExtensionTypeItemProvider.dispose();
-		if (valueClassTypeItemProvider != null) valueClassTypeItemProvider.dispose();
-		if (valueTypeItemProvider != null) valueTypeItemProvider.dispose();
-		if (variableResolverTypeItemProvider != null) variableResolverTypeItemProvider.dispose();
-		if (viewHandlerTypeItemProvider != null) viewHandlerTypeItemProvider.dispose();
-		if (resourceBundleTypeItemProvider != null) resourceBundleTypeItemProvider.dispose();
-		if (baseNameTypeItemProvider != null) baseNameTypeItemProvider.dispose();
-		if (varTypeItemProvider != null) varTypeItemProvider.dispose();
-		if (viewDeclarationLanguageFactoryTypeItemProvider != null) viewDeclarationLanguageFactoryTypeItemProvider.dispose();
-		if (visitContextFactoryTypeItemProvider != null) visitContextFactoryTypeItemProvider.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigTypeItemProvider.java
deleted file mode 100644
index 6160d6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesConfigTypeItemProvider.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FacesConfigTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addFacesConfigExtensionPropertyDescriptor(object);
-			addXmlnsPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-			addMetadataCompletePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Faces Config Extension feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addFacesConfigExtensionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesConfigType_facesConfigExtension_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesConfigType_facesConfigExtension_feature", "_UI_FacesConfigType_type"),
-				 FacesConfigPackage.Literals.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Xmlns feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addXmlnsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesConfigType_xmlns_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesConfigType_xmlns_feature", "_UI_FacesConfigType_type"),
-				 FacesConfigPackage.Literals.FACES_CONFIG_TYPE__XMLNS,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesConfigType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesConfigType_id_feature", "_UI_FacesConfigType_type"),
-				 FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Metadata Complete feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addMetadataCompletePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesConfigType_metadataComplete_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesConfigType_metadataComplete_feature", "_UI_FacesConfigType_type"),
-				 FacesConfigPackage.Literals.FACES_CONFIG_TYPE__METADATA_COMPLETE,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-				/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__APPLICATION);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ORDERING);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__COMPONENT);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__CONVERTER);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__MANAGED_BEAN);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__NAVIGATION_RULE);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__REFERENCED_BEAN);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__RENDER_KIT);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__LIFECYCLE);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__VALIDATOR);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__BEHAVIOR);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns FacesConfigType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacesConfigType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FacesConfigType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FacesConfigType_type") :
-			getString("_UI_FacesConfigType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FacesConfigType.class)) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__APPLICATION,
-				 FacesConfigFactory.eINSTANCE.createApplicationType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ORDERING,
-				 FacesConfigFactory.eINSTANCE.createOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING,
-				 FacesConfigFactory.eINSTANCE.createAbsoluteOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__FACTORY,
-				 FacesConfigFactory.eINSTANCE.createFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__COMPONENT,
-				 FacesConfigFactory.eINSTANCE.createComponentType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__CONVERTER,
-				 FacesConfigFactory.eINSTANCE.createConverterType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__MANAGED_BEAN,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__NAME,
-				 FacesConfigFactory.eINSTANCE.createNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__NAVIGATION_RULE,
-				 FacesConfigFactory.eINSTANCE.createNavigationRuleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__REFERENCED_BEAN,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__RENDER_KIT,
-				 FacesConfigFactory.eINSTANCE.createRenderKitType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__LIFECYCLE,
-				 FacesConfigFactory.eINSTANCE.createLifecycleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__VALIDATOR,
-				 FacesConfigFactory.eINSTANCE.createValidatorType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACES_CONFIG_TYPE__BEHAVIOR,
-				 FacesConfigFactory.eINSTANCE.createBehaviorType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesContextFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesContextFactoryTypeItemProvider.java
deleted file mode 100644
index 2fe6e23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacesContextFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider 
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FacesContextFactoryTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesContextFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesContextFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesContextFactoryType_textContent_feature", "_UI_FacesContextFactoryType_type"),
-				 FacesConfigPackage.Literals.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc--> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacesContextFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacesContextFactoryType_id_feature", "_UI_FacesContextFactoryType_type"),
-				 FacesConfigPackage.Literals.FACES_CONTEXT_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns FacesContextFactoryType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacesContextFactoryType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((FacesContextFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_FacesContextFactoryType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FacesContextFactoryType.class)) {
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_FacesContextFactoryType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetExtensionTypeItemProvider.java
deleted file mode 100644
index 913fa62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacetExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns FacetExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacetExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((FacetExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FacetExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_FacetExtensionType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetNameTypeItemProvider.java
deleted file mode 100644
index a7e1a60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FacetNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacetNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacetNameType_textContent_feature", "_UI_FacetNameType_type"),
-				 FacesConfigPackage.Literals.FACET_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacetNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacetNameType_id_feature", "_UI_FacetNameType_type"),
-				 FacesConfigPackage.Literals.FACET_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns FacetNameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacetNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FacetNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FacetNameType_type") :
-			getString("_UI_FacetNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FacetNameType.class)) {
-			case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.FACET_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetTypeItemProvider.java
deleted file mode 100644
index d060438..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FacetTypeItemProvider.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FacetTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-		ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FacetType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FacetType_id_feature", "_UI_FacetType_type"),
-				 FacesConfigPackage.Literals.FACET_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__FACET_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACET_TYPE__FACET_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns FacetType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FacetType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FacetType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FacetType_type") :
-			getString("_UI_FacetType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FacetType.class)) {
-			case FacesConfigPackage.FACET_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.FACET_TYPE__ICON:
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACET_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACET_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACET_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACET_TYPE__FACET_NAME,
-				 FacesConfigFactory.eINSTANCE.createFacetNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACET_TYPE__FACET_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createFacetExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		FacetType facet = (FacetType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return facet.getFacetName() == null ? "" : facet.getFacetName() //$NON-NLS-1$
-					.getTextContent();
-		case 1:
-			return facet.getDisplayName().size() > 0 ? ((DisplayNameType) facet
-					.getDisplayName().get(0)).getTextContent() : ""; //$NON-NLS-1$
-		case 2:
-			return facet.getDescription().size() > 0 ? ((DescriptionType) facet
-					.getDescription().get(0)).getTextContent() : ""; //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryExtensionTypeItemProvider.java
deleted file mode 100644
index 20b75ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class FactoryExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public FactoryExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns FactoryExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FactoryExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((FactoryExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FactoryExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_FactoryExtensionType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryTypeItemProvider.java
deleted file mode 100644
index 3b64b58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FactoryTypeItemProvider.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addFactoryExtensionPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Factory Extension feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addFactoryExtensionPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FactoryType_factoryExtension_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FactoryType_factoryExtension_feature", "_UI_FactoryType_type"),
-				 FacesConfigPackage.Literals.FACTORY_TYPE__FACTORY_EXTENSION,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FactoryType_id_feature", "_UI_FactoryType_type"),
-				 FacesConfigPackage.Literals.FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__APPLICATION_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__FACES_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__LIFECYCLE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__RENDER_KIT_FACTORY);
-			childrenFeatures.add(FacesConfigPackage.Literals.FACTORY_TYPE__VISIT_CONTEXT_FACTORY);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns FactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FactoryType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FactoryType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FactoryType_type") :
-			getString("_UI_FactoryType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FactoryType.class)) {
-			case FacesConfigPackage.FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__APPLICATION_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createApplicationFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createExceptionHandlerFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createExternalContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__FACES_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createFacesContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createPartialViewContextFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__LIFECYCLE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createLifecycleFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createViewDeclarationLanguageFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createTagHandlerDelegateFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__RENDER_KIT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createRenderKitFactoryType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.FACTORY_TYPE__VISIT_CONTEXT_FACTORY,
-				 FacesConfigFactory.eINSTANCE.createVisitContextFactoryType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromActionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromActionTypeItemProvider.java
deleted file mode 100644
index eb0491d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromActionTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FromActionTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromActionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromActionType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromActionType_textContent_feature", "_UI_FromActionType_type"),
-				 FacesConfigPackage.Literals.FROM_ACTION_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromActionType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromActionType_id_feature", "_UI_FromActionType_type"),
-				 FacesConfigPackage.Literals.FROM_ACTION_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns FromActionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FromActionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FromActionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FromActionType_type") :
-			getString("_UI_FromActionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FromActionType.class)) {
-			case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromOutcomeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromOutcomeTypeItemProvider.java
deleted file mode 100644
index 5ec950b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromOutcomeTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FromOutcomeTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromOutcomeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromOutcomeType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromOutcomeType_textContent_feature", "_UI_FromOutcomeType_type"),
-				 FacesConfigPackage.Literals.FROM_OUTCOME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromOutcomeType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromOutcomeType_id_feature", "_UI_FromOutcomeType_type"),
-				 FacesConfigPackage.Literals.FROM_OUTCOME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns FromOutcomeType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FromOutcomeType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FromOutcomeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FromOutcomeType_type") :
-			getString("_UI_FromOutcomeType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FromOutcomeType.class)) {
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromViewIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromViewIdTypeItemProvider.java
deleted file mode 100644
index 06d9901..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/FromViewIdTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FromViewIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromViewIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromViewIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromViewIdType_textContent_feature", "_UI_FromViewIdType_type"),
-				 FacesConfigPackage.Literals.FROM_VIEW_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_FromViewIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_FromViewIdType_id_feature", "_UI_FromViewIdType_type"),
-				 FacesConfigPackage.Literals.FROM_VIEW_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns FromViewIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/FromViewIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((FromViewIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_FromViewIdType_type") :
-			getString("_UI_FromViewIdType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(FromViewIdType.class)) {
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IconTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IconTypeItemProvider.java
deleted file mode 100644
index 0f4ad44..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IconTypeItemProvider.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.IconType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class IconTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IconTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addLangPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Lang feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addLangPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IconType_lang_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_IconType_lang_feature", "_UI_IconType_type"),
-				 FacesConfigPackage.Literals.ICON_TYPE__LANG,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IconType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_IconType_id_feature", "_UI_IconType_type"),
-				 FacesConfigPackage.Literals.ICON_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.ICON_TYPE__SMALL_ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.ICON_TYPE__LARGE_ICON);
-		}
-		return childrenFeatures;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns IconType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IconType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((IconType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IconType_type") :
-			getString("_UI_IconType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IconType.class)) {
-			case FacesConfigPackage.ICON_TYPE__LANG:
-			case FacesConfigPackage.ICON_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ICON_TYPE__SMALL_ICON,
-				 FacesConfigFactory.eINSTANCE.createSmallIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ICON_TYPE__LARGE_ICON,
-				 FacesConfigFactory.eINSTANCE.createLargeIconType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IfTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IfTypeItemProvider.java
deleted file mode 100644
index 37a725c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/IfTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IfType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.IfType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class IfTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IfTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IfType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_IfType_textContent_feature", "_UI_IfType_type"),
-				 FacesConfigPackage.Literals.IF_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_IfType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_IfType_id_feature", "_UI_IfType_type"),
-				 FacesConfigPackage.Literals.IF_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns IfType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/IfType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((IfType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_IfType_type") :
-			getString("_UI_IfType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(IfType.class)) {
-			case FacesConfigPackage.IF_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.IF_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyClassTypeItemProvider.java
deleted file mode 100644
index 264b281..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class KeyClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_KeyClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_KeyClassType_textContent_feature", "_UI_KeyClassType_type"),
-				 FacesConfigPackage.Literals.KEY_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_KeyClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_KeyClassType_id_feature", "_UI_KeyClassType_type"),
-				 FacesConfigPackage.Literals.KEY_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns KeyClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/KeyClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((KeyClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_KeyClassType_type") :
-			getString("_UI_KeyClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(KeyClassType.class)) {
-			case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyTypeItemProvider.java
deleted file mode 100644
index 62c5d35..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/KeyTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.KeyType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class KeyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_KeyType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_KeyType_textContent_feature", "_UI_KeyType_type"),
-				 FacesConfigPackage.Literals.KEY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_KeyType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_KeyType_id_feature", "_UI_KeyType_type"),
-				 FacesConfigPackage.Literals.KEY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns KeyType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/KeyType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((KeyType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_KeyType_type") :
-			getString("_UI_KeyType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(KeyType.class)) {
-			case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.KEY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LargeIconTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LargeIconTypeItemProvider.java
deleted file mode 100644
index caca793..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LargeIconTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class LargeIconTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LargeIconTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LargeIconType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_LargeIconType_textContent_feature", "_UI_LargeIconType_type"),
-				 FacesConfigPackage.Literals.LARGE_ICON_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LargeIconType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_LargeIconType_id_feature", "_UI_LargeIconType_type"),
-				 FacesConfigPackage.Literals.LARGE_ICON_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns LargeIconType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/LargeIconType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((LargeIconType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_LargeIconType_type") :
-			getString("_UI_LargeIconType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(LargeIconType.class)) {
-			case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleExtensionTypeItemProvider.java
deleted file mode 100644
index fa06c39..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class LifecycleExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource,
-        ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public LifecycleExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns LifecycleExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/LifecycleExtensionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((LifecycleExtensionType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_LifecycleExtensionType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_LifecycleExtensionType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleFactoryTypeItemProvider.java
deleted file mode 100644
index 58fbeca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class LifecycleFactoryTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!--begin-user-doc --> 
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
- 	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LifecycleFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_LifecycleFactoryType_textContent_feature", "_UI_LifecycleFactoryType_type"),
-				 FacesConfigPackage.Literals.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LifecycleFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_LifecycleFactoryType_id_feature", "_UI_LifecycleFactoryType_type"),
-				 FacesConfigPackage.Literals.LIFECYCLE_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns LifecycleFactoryType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/LifecycleFactoryType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((LifecycleFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_LifecycleFactoryType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(LifecycleFactoryType.class)) {
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-			case 0:
-				return getText(object);
-			case 1:
-				return getString("_UI_LifecycleFactoryType_type"); //$NON-NLS-1$
-			}
-
-			return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleTypeItemProvider.java
deleted file mode 100644
index 611aaf6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LifecycleTypeItemProvider.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class LifecycleTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LifecycleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_LifecycleType_id_feature", "_UI_LifecycleType_type"),
-				 FacesConfigPackage.Literals.LIFECYCLE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.LIFECYCLE_TYPE__PHASE_LISTENER);
-			childrenFeatures.add(FacesConfigPackage.Literals.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns LifecycleType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/LifecycleType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((LifecycleType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_LifecycleType_type") :
-			getString("_UI_LifecycleType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(LifecycleType.class)) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LIFECYCLE_TYPE__PHASE_LISTENER,
-				 FacesConfigFactory.eINSTANCE.createPhaseListenerType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createLifecycleExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ListEntriesTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ListEntriesTypeItemProvider.java
deleted file mode 100644
index b7c6c79..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ListEntriesTypeItemProvider.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ListEntriesTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ListEntriesTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ListEntriesType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ListEntriesType_id_feature", "_UI_ListEntriesType_type"),
-				 FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__NULL_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ListEntriesType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ListEntriesType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ListEntriesType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ListEntriesType_type") :
-			getString("_UI_ListEntriesType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ListEntriesType.class)) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createValueClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__NULL_VALUE,
-				 FacesConfigFactory.eINSTANCE.createNullValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LIST_ENTRIES_TYPE__VALUE,
-				 FacesConfigFactory.eINSTANCE.createValueType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/Literals.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/Literals.java
deleted file mode 100644
index 678a586..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/Literals.java
+++ /dev/null
@@ -1,3595 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * Literal package types
- * 
- * @author cbateman
- *
- */
-public interface Literals {
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl <em>Action Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getActionListenerType()
-	 * @generated
-	 */
-	EClass ACTION_LISTENER_TYPE = FacesConfigPackage.eINSTANCE.getActionListenerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ACTION_LISTENER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getActionListenerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ACTION_LISTENER_TYPE__ID = FacesConfigPackage.eINSTANCE.getActionListenerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl <em>Application Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationFactoryType()
-	 * @generated
-	 */
-	EClass APPLICATION_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getApplicationFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute APPLICATION_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getApplicationFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute APPLICATION_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getApplicationFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl <em>Application Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationType()
-	 * @generated
-	 */
-	EClass APPLICATION_TYPE = FacesConfigPackage.eINSTANCE.getApplicationType();
-
-	/**
-	 * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__ACTION_LISTENER = FacesConfigPackage.eINSTANCE.getApplicationType_ActionListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getApplicationType_DefaultRenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__MESSAGE_BUNDLE = FacesConfigPackage.eINSTANCE.getApplicationType_MessageBundle();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__NAVIGATION_HANDLER = FacesConfigPackage.eINSTANCE.getApplicationType_NavigationHandler();
-
-	/**
-	 * The meta object literal for the '<em><b>View Handler</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__VIEW_HANDLER = FacesConfigPackage.eINSTANCE.getApplicationType_ViewHandler();
-
-	/**
-	 * The meta object literal for the '<em><b>State Manager</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__STATE_MANAGER = FacesConfigPackage.eINSTANCE.getApplicationType_StateManager();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__PROPERTY_RESOLVER = FacesConfigPackage.eINSTANCE.getApplicationType_PropertyResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__VARIABLE_RESOLVER = FacesConfigPackage.eINSTANCE.getApplicationType_VariableResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference APPLICATION_TYPE__LOCALE_CONFIG = FacesConfigPackage.eINSTANCE.getApplicationType_LocaleConfig();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute APPLICATION_TYPE__ID = FacesConfigPackage.eINSTANCE.getApplicationType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl <em>Attribute Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeClassType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getAttributeClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getAttributeClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getAttributeClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl <em>Attribute Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeExtensionType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getAttributeExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl <em>Attribute Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeNameType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_NAME_TYPE = FacesConfigPackage.eINSTANCE.getAttributeNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getAttributeNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getAttributeNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl <em>Attribute Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeType()
-	 * @generated
-	 */
-	EClass ATTRIBUTE_TYPE = FacesConfigPackage.eINSTANCE.getAttributeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getAttributeType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getAttributeType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ICON = FacesConfigPackage.eINSTANCE.getAttributeType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ATTRIBUTE_NAME = FacesConfigPackage.eINSTANCE.getAttributeType_AttributeName();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ATTRIBUTE_CLASS = FacesConfigPackage.eINSTANCE.getAttributeType_AttributeClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__DEFAULT_VALUE = FacesConfigPackage.eINSTANCE.getAttributeType_DefaultValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__SUGGESTED_VALUE = FacesConfigPackage.eINSTANCE.getAttributeType_SuggestedValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION = FacesConfigPackage.eINSTANCE.getAttributeType_AttributeExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ATTRIBUTE_TYPE__ID = FacesConfigPackage.eINSTANCE.getAttributeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl <em>Component Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentClassType()
-	 * @generated
-	 */
-	EClass COMPONENT_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getComponentClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getComponentClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl <em>Component Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentExtensionType()
-	 * @generated
-	 */
-	EClass COMPONENT_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getComponentExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl <em>Component Family Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentFamilyType()
-	 * @generated
-	 */
-	EClass COMPONENT_FAMILY_TYPE = FacesConfigPackage.eINSTANCE.getComponentFamilyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_FAMILY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getComponentFamilyType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_FAMILY_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentFamilyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl <em>Component Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentType()
-	 * @generated
-	 */
-	EClass COMPONENT_TYPE = FacesConfigPackage.eINSTANCE.getComponentType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getComponentType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getComponentType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__ICON = FacesConfigPackage.eINSTANCE.getComponentType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__COMPONENT_TYPE = FacesConfigPackage.eINSTANCE.getComponentType_ComponentType();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__COMPONENT_CLASS = FacesConfigPackage.eINSTANCE.getComponentType_ComponentClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__FACET = FacesConfigPackage.eINSTANCE.getComponentType_Facet();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getComponentType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__PROPERTY = FacesConfigPackage.eINSTANCE.getComponentType_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference COMPONENT_TYPE__COMPONENT_EXTENSION = FacesConfigPackage.eINSTANCE.getComponentType_ComponentExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl <em>Component Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentTypeType()
-	 * @generated
-	 */
-	EClass COMPONENT_TYPE_TYPE = FacesConfigPackage.eINSTANCE.getComponentTypeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_TYPE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getComponentTypeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute COMPONENT_TYPE_TYPE__ID = FacesConfigPackage.eINSTANCE.getComponentTypeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl <em>Converter Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterClassType()
-	 * @generated
-	 */
-	EClass CONVERTER_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getConverterClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getConverterClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl <em>Converter For Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterForClassType()
-	 * @generated
-	 */
-	EClass CONVERTER_FOR_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getConverterForClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getConverterForClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_FOR_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterForClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl <em>Converter Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterIdType()
-	 * @generated
-	 */
-	EClass CONVERTER_ID_TYPE = FacesConfigPackage.eINSTANCE.getConverterIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getConverterIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl <em>Converter Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterType()
-	 * @generated
-	 */
-	EClass CONVERTER_TYPE = FacesConfigPackage.eINSTANCE.getConverterType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getConverterType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getConverterType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__ICON = FacesConfigPackage.eINSTANCE.getConverterType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__CONVERTER_ID = FacesConfigPackage.eINSTANCE.getConverterType_ConverterId();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__CONVERTER_FOR_CLASS = FacesConfigPackage.eINSTANCE.getConverterType_ConverterForClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__CONVERTER_CLASS = FacesConfigPackage.eINSTANCE.getConverterType_ConverterClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getConverterType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference CONVERTER_TYPE__PROPERTY = FacesConfigPackage.eINSTANCE.getConverterType_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute CONVERTER_TYPE__ID = FacesConfigPackage.eINSTANCE.getConverterType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl <em>Default Locale Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultLocaleType()
-	 * @generated
-	 */
-	EClass DEFAULT_LOCALE_TYPE = FacesConfigPackage.eINSTANCE.getDefaultLocaleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_LOCALE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDefaultLocaleType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_LOCALE_TYPE__ID = FacesConfigPackage.eINSTANCE.getDefaultLocaleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl <em>Default Render Kit Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultRenderKitIdType()
-	 * @generated
-	 */
-	EClass DEFAULT_RENDER_KIT_ID_TYPE = FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_RENDER_KIT_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getDefaultRenderKitIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl <em>Default Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValueType()
-	 * @generated
-	 */
-	EClass DEFAULT_VALUE_TYPE = FacesConfigPackage.eINSTANCE.getDefaultValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_VALUE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDefaultValueType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DEFAULT_VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getDefaultValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl <em>Description Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDescriptionType()
-	 * @generated
-	 */
-	EClass DESCRIPTION_TYPE = FacesConfigPackage.eINSTANCE.getDescriptionType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DESCRIPTION_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDescriptionType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DESCRIPTION_TYPE__LANG = FacesConfigPackage.eINSTANCE.getDescriptionType_Lang();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DESCRIPTION_TYPE__ID = FacesConfigPackage.eINSTANCE.getDescriptionType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl <em>Display Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDisplayNameType()
-	 * @generated
-	 */
-	EClass DISPLAY_NAME_TYPE = FacesConfigPackage.eINSTANCE.getDisplayNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DISPLAY_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getDisplayNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DISPLAY_NAME_TYPE__LANG = FacesConfigPackage.eINSTANCE.getDisplayNameType_Lang();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DISPLAY_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getDisplayNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl <em>Document Root</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDocumentRoot()
-	 * @generated
-	 */
-	EClass DOCUMENT_ROOT = FacesConfigPackage.eINSTANCE.getDocumentRoot();
-
-	/**
-	 * The meta object literal for the '<em><b>Mixed</b></em>' attribute list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute DOCUMENT_ROOT__MIXED = FacesConfigPackage.eINSTANCE.getDocumentRoot_Mixed();
-
-	/**
-	 * The meta object literal for the '<em><b>XMLNS Prefix Map</b></em>' map feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__XMLNS_PREFIX_MAP = FacesConfigPackage.eINSTANCE.getDocumentRoot_XMLNSPrefixMap();
-
-	/**
-	 * The meta object literal for the '<em><b>XSI Schema Location</b></em>' map feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = FacesConfigPackage.eINSTANCE.getDocumentRoot_XSISchemaLocation();
-
-	/**
-	 * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ACTION_LISTENER = FacesConfigPackage.eINSTANCE.getDocumentRoot_ActionListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Application</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__APPLICATION = FacesConfigPackage.eINSTANCE.getDocumentRoot_Application();
-
-	/**
-	 * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__APPLICATION_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_ApplicationFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getDocumentRoot_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_AttributeClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_AttributeExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ATTRIBUTE_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_AttributeName();
-
-	/**
-	 * The meta object literal for the '<em><b>Component</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT = FacesConfigPackage.eINSTANCE.getDocumentRoot_Component();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_FAMILY = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentFamily();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__COMPONENT_TYPE = FacesConfigPackage.eINSTANCE.getDocumentRoot_ComponentType();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER = FacesConfigPackage.eINSTANCE.getDocumentRoot_Converter();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ConverterClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER_FOR_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ConverterForClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__CONVERTER_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_ConverterId();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DEFAULT_LOCALE = FacesConfigPackage.eINSTANCE.getDocumentRoot_DefaultLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_DefaultRenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DEFAULT_VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_DefaultValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DESCRIPTION = FacesConfigPackage.eINSTANCE.getDocumentRoot_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Faces Config</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACES_CONFIG = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacesConfig();
-
-	/**
-	 * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACES_CONTEXT_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacesContextFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACET = FacesConfigPackage.eINSTANCE.getDocumentRoot_Facet();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACET_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacetExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACET_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_FacetName();
-
-	/**
-	 * The meta object literal for the '<em><b>Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_Factory();
-
-	/**
-	 * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FROM_ACTION = FacesConfigPackage.eINSTANCE.getDocumentRoot_FromAction();
-
-	/**
-	 * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FROM_OUTCOME = FacesConfigPackage.eINSTANCE.getDocumentRoot_FromOutcome();
-
-	/**
-	 * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__FROM_VIEW_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_FromViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__ICON = FacesConfigPackage.eINSTANCE.getDocumentRoot_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__KEY = FacesConfigPackage.eINSTANCE.getDocumentRoot_Key();
-
-	/**
-	 * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__KEY_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_KeyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LARGE_ICON = FacesConfigPackage.eINSTANCE.getDocumentRoot_LargeIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LIFECYCLE = FacesConfigPackage.eINSTANCE.getDocumentRoot_Lifecycle();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LIFECYCLE_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_LifecycleFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LIST_ENTRIES = FacesConfigPackage.eINSTANCE.getDocumentRoot_ListEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__LOCALE_CONFIG = FacesConfigPackage.eINSTANCE.getDocumentRoot_LocaleConfig();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_BEAN_SCOPE = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedBeanScope();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MANAGED_PROPERTY = FacesConfigPackage.eINSTANCE.getDocumentRoot_ManagedProperty();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MAP_ENTRIES = FacesConfigPackage.eINSTANCE.getDocumentRoot_MapEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MAP_ENTRY = FacesConfigPackage.eINSTANCE.getDocumentRoot_MapEntry();
-
-	/**
-	 * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__MESSAGE_BUNDLE = FacesConfigPackage.eINSTANCE.getDocumentRoot_MessageBundle();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NAVIGATION_CASE = FacesConfigPackage.eINSTANCE.getDocumentRoot_NavigationCase();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NAVIGATION_HANDLER = FacesConfigPackage.eINSTANCE.getDocumentRoot_NavigationHandler();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NAVIGATION_RULE = FacesConfigPackage.eINSTANCE.getDocumentRoot_NavigationRule();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__NULL_VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PHASE_LISTENER = FacesConfigPackage.eINSTANCE.getDocumentRoot_PhaseListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY = FacesConfigPackage.eINSTANCE.getDocumentRoot_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyName();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__PROPERTY_RESOLVER = FacesConfigPackage.eINSTANCE.getDocumentRoot_PropertyResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REDIRECT = FacesConfigPackage.eINSTANCE.getDocumentRoot_Redirect();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REFERENCED_BEAN = FacesConfigPackage.eINSTANCE.getDocumentRoot_ReferencedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REFERENCED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ReferencedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__REFERENCED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getDocumentRoot_ReferencedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER = FacesConfigPackage.eINSTANCE.getDocumentRoot_Renderer();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_RendererClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER_EXTENSION = FacesConfigPackage.eINSTANCE.getDocumentRoot_RendererExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDERER_TYPE = FacesConfigPackage.eINSTANCE.getDocumentRoot_RendererType();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKit();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKitClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT_FACTORY = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKitFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_RenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__SMALL_ICON = FacesConfigPackage.eINSTANCE.getDocumentRoot_SmallIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>State Manager</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__STATE_MANAGER = FacesConfigPackage.eINSTANCE.getDocumentRoot_StateManager();
-
-	/**
-	 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__SUGGESTED_VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_SuggestedValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__SUPPORTED_LOCALE = FacesConfigPackage.eINSTANCE.getDocumentRoot_SupportedLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__TO_VIEW_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_ToViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALIDATOR = FacesConfigPackage.eINSTANCE.getDocumentRoot_Validator();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALIDATOR_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ValidatorClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALIDATOR_ID = FacesConfigPackage.eINSTANCE.getDocumentRoot_ValidatorId();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALUE = FacesConfigPackage.eINSTANCE.getDocumentRoot_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VALUE_CLASS = FacesConfigPackage.eINSTANCE.getDocumentRoot_ValueClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VARIABLE_RESOLVER = FacesConfigPackage.eINSTANCE.getDocumentRoot_VariableResolver();
-
-	/**
-	 * The meta object literal for the '<em><b>View Handler</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference DOCUMENT_ROOT__VIEW_HANDLER = FacesConfigPackage.eINSTANCE.getDocumentRoot_ViewHandler();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl <em>Faces Config Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigType()
-	 * @generated
-	 */
-	EClass FACES_CONFIG_TYPE = FacesConfigPackage.eINSTANCE.getFacesConfigType();
-
-	/**
-	 * The meta object literal for the '<em><b>Application</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__APPLICATION = FacesConfigPackage.eINSTANCE.getFacesConfigType_Application();
-
-	/**
-	 * The meta object literal for the '<em><b>Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__FACTORY = FacesConfigPackage.eINSTANCE.getFacesConfigType_Factory();
-
-	/**
-	 * The meta object literal for the '<em><b>Component</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__COMPONENT = FacesConfigPackage.eINSTANCE.getFacesConfigType_Component();
-
-	/**
-	 * The meta object literal for the '<em><b>Converter</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__CONVERTER = FacesConfigPackage.eINSTANCE.getFacesConfigType_Converter();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__MANAGED_BEAN = FacesConfigPackage.eINSTANCE.getFacesConfigType_ManagedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__NAVIGATION_RULE = FacesConfigPackage.eINSTANCE.getFacesConfigType_NavigationRule();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__REFERENCED_BEAN = FacesConfigPackage.eINSTANCE.getFacesConfigType_ReferencedBean();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__RENDER_KIT = FacesConfigPackage.eINSTANCE.getFacesConfigType_RenderKit();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__LIFECYCLE = FacesConfigPackage.eINSTANCE.getFacesConfigType_Lifecycle();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACES_CONFIG_TYPE__VALIDATOR = FacesConfigPackage.eINSTANCE.getFacesConfigType_Validator();
-
-	/**
-	 * The meta object literal for the '<em><b>Xmlns</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONFIG_TYPE__XMLNS = FacesConfigPackage.eINSTANCE.getFacesConfigType_Xmlns();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONFIG_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacesConfigType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl <em>Faces Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesContextFactoryType()
-	 * @generated
-	 */
-	EClass FACES_CONTEXT_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getFacesContextFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFacesContextFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACES_CONTEXT_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacesContextFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl <em>Facet Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetExtensionType()
-	 * @generated
-	 */
-	EClass FACET_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getFacetExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl <em>Facet Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetNameType()
-	 * @generated
-	 */
-	EClass FACET_NAME_TYPE = FacesConfigPackage.eINSTANCE.getFacetNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACET_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFacetNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACET_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacetNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl <em>Facet Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetType()
-	 * @generated
-	 */
-	EClass FACET_TYPE = FacesConfigPackage.eINSTANCE.getFacetType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getFacetType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getFacetType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__ICON = FacesConfigPackage.eINSTANCE.getFacetType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__FACET_NAME = FacesConfigPackage.eINSTANCE.getFacetType_FacetName();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACET_TYPE__FACET_EXTENSION = FacesConfigPackage.eINSTANCE.getFacetType_FacetExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACET_TYPE__ID = FacesConfigPackage.eINSTANCE.getFacetType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl <em>Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryType()
-	 * @generated
-	 */
-	EClass FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__APPLICATION_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_ApplicationFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__FACES_CONTEXT_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_FacesContextFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__LIFECYCLE_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_LifecycleFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference FACTORY_TYPE__RENDER_KIT_FACTORY = FacesConfigPackage.eINSTANCE.getFactoryType_RenderKitFactory();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl <em>From Action Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromActionType()
-	 * @generated
-	 */
-	EClass FROM_ACTION_TYPE = FacesConfigPackage.eINSTANCE.getFromActionType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_ACTION_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFromActionType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_ACTION_TYPE__ID = FacesConfigPackage.eINSTANCE.getFromActionType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl <em>From Outcome Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromOutcomeType()
-	 * @generated
-	 */
-	EClass FROM_OUTCOME_TYPE = FacesConfigPackage.eINSTANCE.getFromOutcomeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_OUTCOME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFromOutcomeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_OUTCOME_TYPE__ID = FacesConfigPackage.eINSTANCE.getFromOutcomeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl <em>From View Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromViewIdType()
-	 * @generated
-	 */
-	EClass FROM_VIEW_ID_TYPE = FacesConfigPackage.eINSTANCE.getFromViewIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_VIEW_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getFromViewIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute FROM_VIEW_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getFromViewIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl <em>Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIconType()
-	 * @generated
-	 */
-	EClass ICON_TYPE = FacesConfigPackage.eINSTANCE.getIconType();
-
-	/**
-	 * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ICON_TYPE__SMALL_ICON = FacesConfigPackage.eINSTANCE.getIconType_SmallIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference ICON_TYPE__LARGE_ICON = FacesConfigPackage.eINSTANCE.getIconType_LargeIcon();
-
-	/**
-	 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ICON_TYPE__LANG = FacesConfigPackage.eINSTANCE.getIconType_Lang();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute ICON_TYPE__ID = FacesConfigPackage.eINSTANCE.getIconType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl <em>Key Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyClassType()
-	 * @generated
-	 */
-	EClass KEY_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getKeyClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getKeyClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getKeyClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl <em>Key Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyType()
-	 * @generated
-	 */
-	EClass KEY_TYPE = FacesConfigPackage.eINSTANCE.getKeyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getKeyType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute KEY_TYPE__ID = FacesConfigPackage.eINSTANCE.getKeyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl <em>Large Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLargeIconType()
-	 * @generated
-	 */
-	EClass LARGE_ICON_TYPE = FacesConfigPackage.eINSTANCE.getLargeIconType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LARGE_ICON_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getLargeIconType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LARGE_ICON_TYPE__ID = FacesConfigPackage.eINSTANCE.getLargeIconType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl <em>Lifecycle Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleFactoryType()
-	 * @generated
-	 */
-	EClass LIFECYCLE_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getLifecycleFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getLifecycleFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIFECYCLE_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getLifecycleFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl <em>Lifecycle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleType()
-	 * @generated
-	 */
-	EClass LIFECYCLE_TYPE = FacesConfigPackage.eINSTANCE.getLifecycleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIFECYCLE_TYPE__PHASE_LISTENER = FacesConfigPackage.eINSTANCE.getLifecycleType_PhaseListener();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIFECYCLE_TYPE__ID = FacesConfigPackage.eINSTANCE.getLifecycleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl <em>List Entries Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getListEntriesType()
-	 * @generated
-	 */
-	EClass LIST_ENTRIES_TYPE = FacesConfigPackage.eINSTANCE.getListEntriesType();
-
-	/**
-	 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIST_ENTRIES_TYPE__VALUE_CLASS = FacesConfigPackage.eINSTANCE.getListEntriesType_ValueClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIST_ENTRIES_TYPE__NULL_VALUE = FacesConfigPackage.eINSTANCE.getListEntriesType_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LIST_ENTRIES_TYPE__VALUE = FacesConfigPackage.eINSTANCE.getListEntriesType_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LIST_ENTRIES_TYPE__ID = FacesConfigPackage.eINSTANCE.getListEntriesType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl <em>Locale Config Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLocaleConfigType()
-	 * @generated
-	 */
-	EClass LOCALE_CONFIG_TYPE = FacesConfigPackage.eINSTANCE.getLocaleConfigType();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LOCALE_CONFIG_TYPE__DEFAULT_LOCALE = FacesConfigPackage.eINSTANCE.getLocaleConfigType_DefaultLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE = FacesConfigPackage.eINSTANCE.getLocaleConfigType_SupportedLocale();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute LOCALE_CONFIG_TYPE__ID = FacesConfigPackage.eINSTANCE.getLocaleConfigType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl <em>Managed Bean Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanClassType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getManagedBeanClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl <em>Managed Bean Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanNameType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_NAME_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getManagedBeanNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl <em>Managed Bean Scope Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanScopeType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_SCOPE_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanScopeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getManagedBeanScopeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_SCOPE_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanScopeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl <em>Managed Bean Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanType()
-	 * @generated
-	 */
-	EClass MANAGED_BEAN_TYPE = FacesConfigPackage.eINSTANCE.getManagedBeanType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getManagedBeanType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getManagedBeanType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__ICON = FacesConfigPackage.eINSTANCE.getManagedBeanType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedBeanScope();
-
-	/**
-	 * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MANAGED_PROPERTY = FacesConfigPackage.eINSTANCE.getManagedBeanType_ManagedProperty();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__MAP_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedBeanType_MapEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_BEAN_TYPE__LIST_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedBeanType_ListEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_BEAN_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedBeanType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl <em>Managed Property Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedPropertyType()
-	 * @generated
-	 */
-	EClass MANAGED_PROPERTY_TYPE = FacesConfigPackage.eINSTANCE.getManagedPropertyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getManagedPropertyType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__ICON = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__PROPERTY_NAME = FacesConfigPackage.eINSTANCE.getManagedPropertyType_PropertyName();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__PROPERTY_CLASS = FacesConfigPackage.eINSTANCE.getManagedPropertyType_PropertyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__MAP_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedPropertyType_MapEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__NULL_VALUE = FacesConfigPackage.eINSTANCE.getManagedPropertyType_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__VALUE = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MANAGED_PROPERTY_TYPE__LIST_ENTRIES = FacesConfigPackage.eINSTANCE.getManagedPropertyType_ListEntries();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MANAGED_PROPERTY_TYPE__ID = FacesConfigPackage.eINSTANCE.getManagedPropertyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl <em>Map Entries Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntriesType()
-	 * @generated
-	 */
-	EClass MAP_ENTRIES_TYPE = FacesConfigPackage.eINSTANCE.getMapEntriesType();
-
-	/**
-	 * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRIES_TYPE__KEY_CLASS = FacesConfigPackage.eINSTANCE.getMapEntriesType_KeyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRIES_TYPE__VALUE_CLASS = FacesConfigPackage.eINSTANCE.getMapEntriesType_ValueClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRIES_TYPE__MAP_ENTRY = FacesConfigPackage.eINSTANCE.getMapEntriesType_MapEntry();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MAP_ENTRIES_TYPE__ID = FacesConfigPackage.eINSTANCE.getMapEntriesType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl <em>Map Entry Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntryType()
-	 * @generated
-	 */
-	EClass MAP_ENTRY_TYPE = FacesConfigPackage.eINSTANCE.getMapEntryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRY_TYPE__KEY = FacesConfigPackage.eINSTANCE.getMapEntryType_Key();
-
-	/**
-	 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRY_TYPE__NULL_VALUE = FacesConfigPackage.eINSTANCE.getMapEntryType_NullValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference MAP_ENTRY_TYPE__VALUE = FacesConfigPackage.eINSTANCE.getMapEntryType_Value();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MAP_ENTRY_TYPE__ID = FacesConfigPackage.eINSTANCE.getMapEntryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl <em>Message Bundle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMessageBundleType()
-	 * @generated
-	 */
-	EClass MESSAGE_BUNDLE_TYPE = FacesConfigPackage.eINSTANCE.getMessageBundleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MESSAGE_BUNDLE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getMessageBundleType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute MESSAGE_BUNDLE_TYPE__ID = FacesConfigPackage.eINSTANCE.getMessageBundleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl <em>Navigation Case Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationCaseType()
-	 * @generated
-	 */
-	EClass NAVIGATION_CASE_TYPE = FacesConfigPackage.eINSTANCE.getNavigationCaseType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getNavigationCaseType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__ICON = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__FROM_ACTION = FacesConfigPackage.eINSTANCE.getNavigationCaseType_FromAction();
-
-	/**
-	 * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__FROM_OUTCOME = FacesConfigPackage.eINSTANCE.getNavigationCaseType_FromOutcome();
-
-	/**
-	 * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__TO_VIEW_ID = FacesConfigPackage.eINSTANCE.getNavigationCaseType_ToViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_CASE_TYPE__REDIRECT = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Redirect();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_CASE_TYPE__ID = FacesConfigPackage.eINSTANCE.getNavigationCaseType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl <em>Navigation Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationHandlerType()
-	 * @generated
-	 */
-	EClass NAVIGATION_HANDLER_TYPE = FacesConfigPackage.eINSTANCE.getNavigationHandlerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_HANDLER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getNavigationHandlerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_HANDLER_TYPE__ID = FacesConfigPackage.eINSTANCE.getNavigationHandlerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl <em>Navigation Rule Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleType()
-	 * @generated
-	 */
-	EClass NAVIGATION_RULE_TYPE = FacesConfigPackage.eINSTANCE.getNavigationRuleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getNavigationRuleType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getNavigationRuleType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__ICON = FacesConfigPackage.eINSTANCE.getNavigationRuleType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__FROM_VIEW_ID = FacesConfigPackage.eINSTANCE.getNavigationRuleType_FromViewId();
-
-	/**
-	 * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference NAVIGATION_RULE_TYPE__NAVIGATION_CASE = FacesConfigPackage.eINSTANCE.getNavigationRuleType_NavigationCase();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NAVIGATION_RULE_TYPE__ID = FacesConfigPackage.eINSTANCE.getNavigationRuleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl <em>Null Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNullValueType()
-	 * @generated
-	 */
-	EClass NULL_VALUE_TYPE = FacesConfigPackage.eINSTANCE.getNullValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute NULL_VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getNullValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl <em>Phase Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPhaseListenerType()
-	 * @generated
-	 */
-	EClass PHASE_LISTENER_TYPE = FacesConfigPackage.eINSTANCE.getPhaseListenerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PHASE_LISTENER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPhaseListenerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PHASE_LISTENER_TYPE__ID = FacesConfigPackage.eINSTANCE.getPhaseListenerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl <em>Property Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyClassType()
-	 * @generated
-	 */
-	EClass PROPERTY_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getPropertyClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPropertyClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl <em>Property Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyExtensionType()
-	 * @generated
-	 */
-	EClass PROPERTY_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getPropertyExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl <em>Property Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyNameType()
-	 * @generated
-	 */
-	EClass PROPERTY_NAME_TYPE = FacesConfigPackage.eINSTANCE.getPropertyNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPropertyNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl <em>Property Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyResolverType()
-	 * @generated
-	 */
-	EClass PROPERTY_RESOLVER_TYPE = FacesConfigPackage.eINSTANCE.getPropertyResolverType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_RESOLVER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getPropertyResolverType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_RESOLVER_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyResolverType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl <em>Property Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyType()
-	 * @generated
-	 */
-	EClass PROPERTY_TYPE = FacesConfigPackage.eINSTANCE.getPropertyType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getPropertyType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getPropertyType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__ICON = FacesConfigPackage.eINSTANCE.getPropertyType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__PROPERTY_NAME = FacesConfigPackage.eINSTANCE.getPropertyType_PropertyName();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__PROPERTY_CLASS = FacesConfigPackage.eINSTANCE.getPropertyType_PropertyClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__DEFAULT_VALUE = FacesConfigPackage.eINSTANCE.getPropertyType_DefaultValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__SUGGESTED_VALUE = FacesConfigPackage.eINSTANCE.getPropertyType_SuggestedValue();
-
-	/**
-	 * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference PROPERTY_TYPE__PROPERTY_EXTENSION = FacesConfigPackage.eINSTANCE.getPropertyType_PropertyExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute PROPERTY_TYPE__ID = FacesConfigPackage.eINSTANCE.getPropertyType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl <em>Redirect Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectType()
-	 * @generated
-	 */
-	EClass REDIRECT_TYPE = FacesConfigPackage.eINSTANCE.getRedirectType();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REDIRECT_TYPE__ID = FacesConfigPackage.eINSTANCE.getRedirectType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl <em>Referenced Bean Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanClassType()
-	 * @generated
-	 */
-	EClass REFERENCED_BEAN_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getReferencedBeanClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getReferencedBeanClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getReferencedBeanClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl <em>Referenced Bean Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanNameType()
-	 * @generated
-	 */
-	EClass REFERENCED_BEAN_NAME_TYPE = FacesConfigPackage.eINSTANCE.getReferencedBeanNameType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getReferencedBeanNameType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_NAME_TYPE__ID = FacesConfigPackage.eINSTANCE.getReferencedBeanNameType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl <em>Referenced Bean Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanType()
-	 * @generated
-	 */
-	EClass REFERENCED_BEAN_TYPE = FacesConfigPackage.eINSTANCE.getReferencedBeanType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getReferencedBeanType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getReferencedBeanType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__ICON = FacesConfigPackage.eINSTANCE.getReferencedBeanType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME = FacesConfigPackage.eINSTANCE.getReferencedBeanType_ReferencedBeanName();
-
-	/**
-	 * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS = FacesConfigPackage.eINSTANCE.getReferencedBeanType_ReferencedBeanClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute REFERENCED_BEAN_TYPE__ID = FacesConfigPackage.eINSTANCE.getReferencedBeanType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl <em>Renderer Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererClassType()
-	 * @generated
-	 */
-	EClass RENDERER_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getRendererClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRendererClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getRendererClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl <em>Renderer Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererExtensionType()
-	 * @generated
-	 */
-	EClass RENDERER_EXTENSION_TYPE = FacesConfigPackage.eINSTANCE.getRendererExtensionType();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl <em>Renderer Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererType()
-	 * @generated
-	 */
-	EClass RENDERER_TYPE = FacesConfigPackage.eINSTANCE.getRendererType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getRendererType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getRendererType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__ICON = FacesConfigPackage.eINSTANCE.getRendererType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__COMPONENT_FAMILY = FacesConfigPackage.eINSTANCE.getRendererType_ComponentFamily();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__RENDERER_TYPE = FacesConfigPackage.eINSTANCE.getRendererType_RendererType();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__RENDERER_CLASS = FacesConfigPackage.eINSTANCE.getRendererType_RendererClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__FACET = FacesConfigPackage.eINSTANCE.getRendererType_Facet();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getRendererType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDERER_TYPE__RENDERER_EXTENSION = FacesConfigPackage.eINSTANCE.getRendererType_RendererExtension();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_TYPE__ID = FacesConfigPackage.eINSTANCE.getRendererType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl <em>Renderer Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererTypeType()
-	 * @generated
-	 */
-	EClass RENDERER_TYPE_TYPE = FacesConfigPackage.eINSTANCE.getRendererTypeType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_TYPE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRendererTypeType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDERER_TYPE_TYPE__ID = FacesConfigPackage.eINSTANCE.getRendererTypeType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl <em>Render Kit Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitClassType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRenderKitClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl <em>Render Kit Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitFactoryType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_FACTORY_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitFactoryType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRenderKitFactoryType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_FACTORY_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitFactoryType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl <em>Render Kit Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitIdType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_ID_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getRenderKitIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl <em>Render Kit Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitType()
-	 * @generated
-	 */
-	EClass RENDER_KIT_TYPE = FacesConfigPackage.eINSTANCE.getRenderKitType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getRenderKitType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getRenderKitType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__ICON = FacesConfigPackage.eINSTANCE.getRenderKitType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__RENDER_KIT_ID = FacesConfigPackage.eINSTANCE.getRenderKitType_RenderKitId();
-
-	/**
-	 * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__RENDER_KIT_CLASS = FacesConfigPackage.eINSTANCE.getRenderKitType_RenderKitClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Renderer</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference RENDER_KIT_TYPE__RENDERER = FacesConfigPackage.eINSTANCE.getRenderKitType_Renderer();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute RENDER_KIT_TYPE__ID = FacesConfigPackage.eINSTANCE.getRenderKitType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl <em>Small Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSmallIconType()
-	 * @generated
-	 */
-	EClass SMALL_ICON_TYPE = FacesConfigPackage.eINSTANCE.getSmallIconType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SMALL_ICON_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getSmallIconType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SMALL_ICON_TYPE__ID = FacesConfigPackage.eINSTANCE.getSmallIconType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl <em>State Manager Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getStateManagerType()
-	 * @generated
-	 */
-	EClass STATE_MANAGER_TYPE = FacesConfigPackage.eINSTANCE.getStateManagerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute STATE_MANAGER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getStateManagerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute STATE_MANAGER_TYPE__ID = FacesConfigPackage.eINSTANCE.getStateManagerType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl <em>Suggested Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSuggestedValueType()
-	 * @generated
-	 */
-	EClass SUGGESTED_VALUE_TYPE = FacesConfigPackage.eINSTANCE.getSuggestedValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUGGESTED_VALUE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getSuggestedValueType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUGGESTED_VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getSuggestedValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl <em>Supported Locale Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSupportedLocaleType()
-	 * @generated
-	 */
-	EClass SUPPORTED_LOCALE_TYPE = FacesConfigPackage.eINSTANCE.getSupportedLocaleType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUPPORTED_LOCALE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getSupportedLocaleType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute SUPPORTED_LOCALE_TYPE__ID = FacesConfigPackage.eINSTANCE.getSupportedLocaleType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl <em>To View Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getToViewIdType()
-	 * @generated
-	 */
-	EClass TO_VIEW_ID_TYPE = FacesConfigPackage.eINSTANCE.getToViewIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute TO_VIEW_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getToViewIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute TO_VIEW_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getToViewIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl <em>Validator Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorClassType()
-	 * @generated
-	 */
-	EClass VALIDATOR_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getValidatorClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValidatorClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getValidatorClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl <em>Validator Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorIdType()
-	 * @generated
-	 */
-	EClass VALIDATOR_ID_TYPE = FacesConfigPackage.eINSTANCE.getValidatorIdType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_ID_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValidatorIdType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_ID_TYPE__ID = FacesConfigPackage.eINSTANCE.getValidatorIdType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl <em>Validator Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorType()
-	 * @generated
-	 */
-	EClass VALIDATOR_TYPE = FacesConfigPackage.eINSTANCE.getValidatorType();
-
-	/**
-	 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__DESCRIPTION = FacesConfigPackage.eINSTANCE.getValidatorType_Description();
-
-	/**
-	 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__DISPLAY_NAME = FacesConfigPackage.eINSTANCE.getValidatorType_DisplayName();
-
-	/**
-	 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__ICON = FacesConfigPackage.eINSTANCE.getValidatorType_Icon();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__VALIDATOR_ID = FacesConfigPackage.eINSTANCE.getValidatorType_ValidatorId();
-
-	/**
-	 * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__VALIDATOR_CLASS = FacesConfigPackage.eINSTANCE.getValidatorType_ValidatorClass();
-
-	/**
-	 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__ATTRIBUTE = FacesConfigPackage.eINSTANCE.getValidatorType_Attribute();
-
-	/**
-	 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EReference VALIDATOR_TYPE__PROPERTY = FacesConfigPackage.eINSTANCE.getValidatorType_Property();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALIDATOR_TYPE__ID = FacesConfigPackage.eINSTANCE.getValidatorType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl <em>Value Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueClassType()
-	 * @generated
-	 */
-	EClass VALUE_CLASS_TYPE = FacesConfigPackage.eINSTANCE.getValueClassType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_CLASS_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValueClassType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_CLASS_TYPE__ID = FacesConfigPackage.eINSTANCE.getValueClassType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl <em>Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueType()
-	 * @generated
-	 */
-	EClass VALUE_TYPE = FacesConfigPackage.eINSTANCE.getValueType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getValueType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VALUE_TYPE__ID = FacesConfigPackage.eINSTANCE.getValueType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl <em>Variable Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVariableResolverType()
-	 * @generated
-	 */
-	EClass VARIABLE_RESOLVER_TYPE = FacesConfigPackage.eINSTANCE.getVariableResolverType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VARIABLE_RESOLVER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getVariableResolverType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VARIABLE_RESOLVER_TYPE__ID = FacesConfigPackage.eINSTANCE.getVariableResolverType_Id();
-
-	/**
-	 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl <em>View Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewHandlerType()
-	 * @generated
-	 */
-	EClass VIEW_HANDLER_TYPE = FacesConfigPackage.eINSTANCE.getViewHandlerType();
-
-	/**
-	 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VIEW_HANDLER_TYPE__TEXT_CONTENT = FacesConfigPackage.eINSTANCE.getViewHandlerType_TextContent();
-
-	/**
-	 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	EAttribute VIEW_HANDLER_TYPE__ID = FacesConfigPackage.eINSTANCE.getViewHandlerType_Id();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LocaleConfigTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LocaleConfigTypeItemProvider.java
deleted file mode 100644
index adc2f0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/LocaleConfigTypeItemProvider.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class LocaleConfigTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LocaleConfigTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_LocaleConfigType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_LocaleConfigType_id_feature", "_UI_LocaleConfigType_type"),  //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$
-				 FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE);
-			childrenFeatures.add(FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns LocaleConfigType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/LocaleConfigType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = null;
-		
-		final StringBuffer buf = new StringBuffer();
-		final LocaleConfigType l = (LocaleConfigType)object;
-		
-		if (l.getDefaultLocale() != null)
-			buf.append(l.getDefaultLocale().getTextContent());
-
-		for (final Object locObj : l.getSupportedLocale()) {
-			final SupportedLocaleType loc = (SupportedLocaleType)locObj;
-			if (loc.getTextContent() != null) {
-				if (buf.toString() != null) {
-					buf.append(',');
-				}
-				buf.append(loc.getTextContent());
-			}
-		}
-		label = buf.toString();
-		
-		return label == null || label.length() == 0 ?
-				getString("_UI_LocaleConfigType_type")  //$NON-NLS-1$
-				: label;
-
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(LocaleConfigType.class)) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE,
-				 FacesConfigFactory.eINSTANCE.createDefaultLocaleType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE,
-				 FacesConfigFactory.eINSTANCE.createSupportedLocaleType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_LocaleConfigType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanClassTypeItemProvider.java
deleted file mode 100644
index 79c2e98..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ManagedBeanClassTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ManagedBeanClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanClassType_textContent_feature", "_UI_ManagedBeanClassType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanClassType_id_feature", "_UI_ManagedBeanClassType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ManagedBeanClassType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ManagedBeanClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ManagedBeanClassType_type") :
-			getString("_UI_ManagedBeanClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ManagedBeanClassType.class)) {
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanExtensionTypeItemProvider.java
deleted file mode 100644
index 844f736..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ManagedBeanExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ManagedBeanExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns ManagedBeanExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanExtensionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ManagedBeanExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ManagedBeanExtensionType_type") :
-			getString("_UI_ManagedBeanExtensionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanNameTypeItemProvider.java
deleted file mode 100644
index 8393274..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ManagedBeanNameTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ManagedBeanNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanNameType_textContent_feature", "_UI_ManagedBeanNameType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanNameType_id_feature", "_UI_ManagedBeanNameType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ManagedBeanNameType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ManagedBeanNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ManagedBeanNameType_type") :
-			getString("_UI_ManagedBeanNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ManagedBeanNameType.class)) {
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanScopeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanScopeTypeItemProvider.java
deleted file mode 100644
index a402249..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanScopeTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ManagedBeanScopeTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ManagedBeanScopeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanScopeType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanScopeType_textContent_feature", "_UI_ManagedBeanScopeType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanScopeType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanScopeType_id_feature", "_UI_ManagedBeanScopeType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_SCOPE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ManagedBeanScopeType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanScopeType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ManagedBeanScopeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ManagedBeanScopeType_type") :
-			getString("_UI_ManagedBeanScopeType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ManagedBeanScopeType.class)) {
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java
deleted file mode 100644
index e3238b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ManagedBeanTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-			addEagerPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_id_feature", "_UI_ManagedBeanType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Eager feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addEagerPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedBeanType_eager_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedBeanType_eager_feature", "_UI_ManagedBeanType_type"),
-				 FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__EAGER,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-				/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MAP_ENTRIES);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__LIST_ENTRIES);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ManagedBeanType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedBeanType"));
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = null;
-        if (((ManagedBeanType) object).getManagedBeanName() != null)
-        {
-            label = ((ManagedBeanType) object).getManagedBeanName()
-                    .getTextContent();
-        }
-        if (label == null || label.length() == 0) {
-            if (((ManagedBeanType) object).getManagedBeanClass() != null)
-                label = ((ManagedBeanType) object).getManagedBeanClass()
-                        .getTextContent();
-        }
-        return label == null || label.length() == 0 ? getString("_UI_ManagedBeanType_type") //$NON-NLS-1$
-                : label;
-    }
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ManagedBeanType.class)) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanScopeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createManagedPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MAP_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createMapEntriesType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__LIST_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createListEntriesType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createManagedBeanExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		ManagedBeanType managedBean = (ManagedBeanType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return managedBean.getManagedBeanName() == null ? "" : managedBean //$NON-NLS-1$
-					.getManagedBeanName().getTextContent();
-		case 1:
-			return managedBean.getManagedBeanScope() == null ? "" : managedBean //$NON-NLS-1$
-					.getManagedBeanScope().getTextContent();
-
-		case 2:
-			return managedBean.getManagedBeanClass() == null ? "" : managedBean //$NON-NLS-1$
-					.getManagedBeanClass().getTextContent();
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedPropertyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedPropertyTypeItemProvider.java
deleted file mode 100644
index 2b05a4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedPropertyTypeItemProvider.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-public class ManagedPropertyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedPropertyTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ManagedPropertyType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_ManagedPropertyType_id_feature", "_UI_ManagedPropertyType_type"),  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__MAP_ENTRIES);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__NULL_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__LIST_ENTRIES);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ManagedPropertyType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ManagedPropertyType")); //$NON-NLS-1$
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((ManagedPropertyType) object).getId();
-        if (((ManagedPropertyType) object).getPropertyName() != null) {
-            label = ((ManagedPropertyType) object).getPropertyName()
-                    .getTextContent();
-        }
-        return label == null || label.length() == 0 ? getString("_UI_ManagedPropertyType_type") //$NON-NLS-1$
-                : label;
-
-    }
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ManagedPropertyType.class)) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_NAME,
-				 FacesConfigFactory.eINSTANCE.createPropertyNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS,
-				 FacesConfigFactory.eINSTANCE.createPropertyClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__MAP_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createMapEntriesType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__NULL_VALUE,
-				 FacesConfigFactory.eINSTANCE.createNullValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__VALUE,
-				 FacesConfigFactory.eINSTANCE.createValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE__LIST_ENTRIES,
-				 FacesConfigFactory.eINSTANCE.createListEntriesType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		ManagedPropertyType attribute = (ManagedPropertyType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return attribute.getPropertyName() == null ? "" : attribute //$NON-NLS-1$
-					.getPropertyName().getTextContent();
-		case 1:
-			return attribute.getPropertyClass() == null ? "" : attribute //$NON-NLS-1$
-					.getPropertyClass().getTextContent();
-		case 2:
-			if(attribute.getValue() != null)
-			{
-				return attribute.getValue().getTextContent();
-			}
-			else if(attribute.getNullValue() != null)
-				return "<null-value>"; //$NON-NLS-1$
-			else if(attribute.getMapEntries() != null)
-				return "<map-entries>"; //$NON-NLS-1$
-			else if(attribute.getListEntries() != null)
-				return "<list-entries>"; //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntriesTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntriesTypeItemProvider.java
deleted file mode 100644
index 652dab8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntriesTypeItemProvider.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class MapEntriesTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntriesTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_MapEntriesType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_MapEntriesType_id_feature", "_UI_MapEntriesType_type"),
-				 FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__KEY_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__VALUE_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__MAP_ENTRY);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns MapEntriesType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/MapEntriesType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((MapEntriesType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_MapEntriesType_type") :
-			getString("_UI_MapEntriesType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MapEntriesType.class)) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__KEY_CLASS,
-				 FacesConfigFactory.eINSTANCE.createKeyClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__VALUE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createValueClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRIES_TYPE__MAP_ENTRY,
-				 FacesConfigFactory.eINSTANCE.createMapEntryType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntryTypeItemProvider.java
deleted file mode 100644
index 13b4bbb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MapEntryTypeItemProvider.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class MapEntryTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource,
-		ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_MapEntryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_MapEntryType_id_feature", "_UI_MapEntryType_type"),
-				 FacesConfigPackage.Literals.MAP_ENTRY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__KEY);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__NULL_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__VALUE);
-		}
-		return childrenFeatures;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns MapEntryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/MapEntryType"));
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        KeyType key = ((MapEntryType)object).getKey();
-        
-        String label = key != null ? key.getTextContent() : null;
-        return label == null || label.length() == 0 ?
-            getString("_UI_MapEntryType_type") : label; //$NON-NLS-1$
-    }
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MapEntryType.class)) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__KEY,
-				 FacesConfigFactory.eINSTANCE.createKeyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__NULL_VALUE,
-				 FacesConfigFactory.eINSTANCE.createNullValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.MAP_ENTRY_TYPE__VALUE,
-				 FacesConfigFactory.eINSTANCE.createValueType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-
-		MapEntryType mapEntry = (MapEntryType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return mapEntry.getKey() == null ? "" : mapEntry.getKey() //$NON-NLS-1$
-					.getTextContent();
-		case 1:
-			if (mapEntry.getNullValue() != null)
-            {
-				return "<null-value>"; //$NON-NLS-1$
-            }
-			return mapEntry.getValue() == null ? "" : mapEntry.getValue() //$NON-NLS-1$
-					.getTextContent();
-		}
-		return null;
-	}	
-    public Object getColumnImage(Object object, int columnIndex) {
-		// no column images
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MessageBundleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MessageBundleTypeItemProvider.java
deleted file mode 100644
index 56d4ce0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/MessageBundleTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class MessageBundleTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MessageBundleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_MessageBundleType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_MessageBundleType_textContent_feature", "_UI_MessageBundleType_type"),
-				 FacesConfigPackage.Literals.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc--> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_MessageBundleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_MessageBundleType_id_feature", "_UI_MessageBundleType_type"),
-				 FacesConfigPackage.Literals.MESSAGE_BUNDLE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns MessageBundleType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/MessageBundleType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((MessageBundleType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_MessageBundleType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MessageBundleType.class)) {
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_MessageBundleType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NameTypeItemProvider.java
deleted file mode 100644
index 1f8f3bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class NameTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	public NameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NameType_textContent_feature", "_UI_NameType_type"),
-				 FacesConfigPackage.Literals.NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NameType_id_feature", "_UI_NameType_type"),
-				 FacesConfigPackage.Literals.NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns NameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NameType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((NameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NameType_type") :
-			getString("_UI_NameType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NameType.class)) {
-			case FacesConfigPackage.NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationCaseTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationCaseTypeItemProvider.java
deleted file mode 100644
index 1247a1b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationCaseTypeItemProvider.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class NavigationCaseTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationCaseTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NavigationCaseType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NavigationCaseType_id_feature", "_UI_NavigationCaseType_type"),
-				 FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_ACTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_OUTCOME);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__IF);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__TO_VIEW_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__REDIRECT);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns NavigationCaseType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationCaseType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((NavigationCaseType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NavigationCaseType_type") :
-			getString("_UI_NavigationCaseType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NavigationCaseType.class)) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_ACTION,
-				 FacesConfigFactory.eINSTANCE.createFromActionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__FROM_OUTCOME,
-				 FacesConfigFactory.eINSTANCE.createFromOutcomeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__IF,
-				 FacesConfigFactory.eINSTANCE.createIfType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__TO_VIEW_ID,
-				 FacesConfigFactory.eINSTANCE.createToViewIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE__REDIRECT,
-				 FacesConfigFactory.eINSTANCE.createRedirectType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		NavigationCaseType navigationcase = (NavigationCaseType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return ((NavigationRuleType) navigationcase.eContainer())
-					.getFromViewId() == null ? "" //$NON-NLS-1$
-					: ((NavigationRuleType) navigationcase.eContainer())
-							.getFromViewId().getTextContent();
-		case 1:
-			return navigationcase.getFromOutcome() == null ? "" : navigationcase //$NON-NLS-1$
-					.getFromOutcome().getTextContent();
-		case 2:
-			return navigationcase.getToViewId() == null ? "" : navigationcase //$NON-NLS-1$
-					.getToViewId().getTextContent();
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationHandlerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationHandlerTypeItemProvider.java
deleted file mode 100644
index c61240b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationHandlerTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class NavigationHandlerTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationHandlerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NavigationHandlerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NavigationHandlerType_textContent_feature", "_UI_NavigationHandlerType_type"),
-				 FacesConfigPackage.Literals.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NavigationHandlerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NavigationHandlerType_id_feature", "_UI_NavigationHandlerType_type"),
-				 FacesConfigPackage.Literals.NAVIGATION_HANDLER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns NavigationHandlerType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationHandlerType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((NavigationHandlerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_NavigationHandlerType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NavigationHandlerType.class)) {
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_NavigationHandlerType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleExtensionTypeItemProvider.java
deleted file mode 100644
index 5570808..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class NavigationRuleExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NavigationRuleExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns NavigationRuleExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationRuleExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((NavigationRuleExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NavigationRuleExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_NavigationRuleExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleTypeItemProvider.java
deleted file mode 100644
index 485aee4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NavigationRuleTypeItemProvider.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class NavigationRuleTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationRuleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NavigationRuleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NavigationRuleType_id_feature", "_UI_NavigationRuleType_type"),
-				 FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__FROM_VIEW_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_CASE);
-			childrenFeatures.add(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns NavigationRuleType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NavigationRuleType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((NavigationRuleType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NavigationRuleType_type") :
-			getString("_UI_NavigationRuleType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NavigationRuleType.class)) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__FROM_VIEW_ID,
-				 FacesConfigFactory.eINSTANCE.createFromViewIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_CASE,
-				 FacesConfigFactory.eINSTANCE.createNavigationCaseType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createNavigationRuleExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NullValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NullValueTypeItemProvider.java
deleted file mode 100644
index 7ce6233..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/NullValueTypeItemProvider.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class NullValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NullValueTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_NullValueType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_NullValueType_id_feature", "_UI_NullValueType_type"),
-				 FacesConfigPackage.Literals.NULL_VALUE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns NullValueType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/NullValueType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((NullValueType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_NullValueType_type") :
-			getString("_UI_NullValueType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(NullValueType.class)) {
-			case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		return "<null-value>"; //$NON-NLS-1$
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOrderingTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOrderingTypeItemProvider.java
deleted file mode 100644
index d351827..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOrderingTypeItemProvider.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class OrderingOrderingTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	public OrderingOrderingTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.ORDERING_ORDERING_TYPE__NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.ORDERING_ORDERING_TYPE__OTHERS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns OrderingOrderingType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/OrderingOrderingType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_OrderingOrderingType_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(OrderingOrderingType.class)) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ORDERING_ORDERING_TYPE__NAME,
-				 FacesConfigFactory.eINSTANCE.createNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ORDERING_ORDERING_TYPE__OTHERS,
-				 FacesConfigFactory.eINSTANCE.createOrderingOthersType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOthersTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOthersTypeItemProvider.java
deleted file mode 100644
index 4790f6b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingOthersTypeItemProvider.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class OrderingOthersTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	public OrderingOthersTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_OrderingOthersType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_OrderingOthersType_id_feature", "_UI_OrderingOthersType_type"),
-				 FacesConfigPackage.Literals.ORDERING_OTHERS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns OrderingOthersType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/OrderingOthersType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((OrderingOthersType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_OrderingOthersType_type") :
-			getString("_UI_OrderingOthersType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(OrderingOthersType.class)) {
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingTypeItemProvider.java
deleted file mode 100644
index 5e21cd1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/OrderingTypeItemProvider.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class OrderingTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.ORDERING_TYPE__BEFORE);
-			childrenFeatures.add(FacesConfigPackage.Literals.ORDERING_TYPE__AFTER);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns OrderingType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/OrderingType")); //$NON-NLS-1$
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		return getString("_UI_OrderingType_type"); //$NON-NLS-1$
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(OrderingType.class)) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ORDERING_TYPE__BEFORE,
-				 FacesConfigFactory.eINSTANCE.createOrderingOrderingType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.ORDERING_TYPE__AFTER,
-				 FacesConfigFactory.eINSTANCE.createOrderingOrderingType()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getCreateChildText(Object owner, Object feature, Object child, Collection selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify =
-			childFeature == FacesConfigPackage.Literals.ORDERING_TYPE__BEFORE ||
-			childFeature == FacesConfigPackage.Literals.ORDERING_TYPE__AFTER;
-
-		if (qualify) {
-			return getString
-				("_UI_CreateChild_text2", //$NON-NLS-1$
-				 new Object[] { getTypeText(childObject), getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PartialViewContextFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PartialViewContextFactoryTypeItemProvider.java
deleted file mode 100644
index 228d214..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PartialViewContextFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class PartialViewContextFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PartialViewContextFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->	 
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PartialViewContextFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PartialViewContextFactoryType_textContent_feature", "_UI_PartialViewContextFactoryType_type"),
-				 FacesConfigPackage.Literals.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PartialViewContextFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PartialViewContextFactoryType_id_feature", "_UI_PartialViewContextFactoryType_type"),
-				 FacesConfigPackage.Literals.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns PartialViewContextFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PartialViewContextFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((PartialViewContextFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_PartialViewContextFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PartialViewContextFactoryType.class)) {
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_PartialViewContextFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PhaseListenerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PhaseListenerTypeItemProvider.java
deleted file mode 100644
index 9eec941..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PhaseListenerTypeItemProvider.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class PhaseListenerTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PhaseListenerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
- 	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PhaseListenerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PhaseListenerType_textContent_feature", "_UI_PhaseListenerType_type"),
-				 FacesConfigPackage.Literals.PHASE_LISTENER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PhaseListenerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PhaseListenerType_id_feature", "_UI_PhaseListenerType_type"),
-				 FacesConfigPackage.Literals.PHASE_LISTENER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns PhaseListenerType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PhaseListenerType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((PhaseListenerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_PhaseListenerType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PhaseListenerType.class)) {
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-			case 0:
-				return getText(object);
-			case 1:
-				return getString("_UI_ActionListenerType_type"); //$NON-NLS-1$
-			}
-
-			return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyClassTypeItemProvider.java
deleted file mode 100644
index c58a1f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class PropertyClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyClassType_textContent_feature", "_UI_PropertyClassType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyClassType_id_feature", "_UI_PropertyClassType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns PropertyClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((PropertyClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_PropertyClassType_type") :
-			getString("_UI_PropertyClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PropertyClassType.class)) {
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyExtensionTypeItemProvider.java
deleted file mode 100644
index 6ee9752..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class PropertyExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns PropertyExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((PropertyExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_PropertyExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_PropertyExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyNameTypeItemProvider.java
deleted file mode 100644
index 708ac34..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class PropertyNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyNameType_textContent_feature", "_UI_PropertyNameType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyNameType_id_feature", "_UI_PropertyNameType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns PropertyNameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((PropertyNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_PropertyNameType_type") :
-			getString("_UI_PropertyNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PropertyNameType.class)) {
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyResolverTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyResolverTypeItemProvider.java
deleted file mode 100644
index e26873d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyResolverTypeItemProvider.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class PropertyResolverTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyResolverTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyResolverType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyResolverType_textContent_feature", "_UI_PropertyResolverType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc--> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyResolverType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyResolverType_id_feature", "_UI_PropertyResolverType_type"),
-				 FacesConfigPackage.Literals.PROPERTY_RESOLVER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns PropertyResolverType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyResolverType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((PropertyResolverType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_PropertyResolverType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PropertyResolverType.class)) {
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_PropertyResolverType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyTypeItemProvider.java
deleted file mode 100644
index c635925..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/PropertyTypeItemProvider.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * 
- * @gemerated
- */
-public class PropertyTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource, 
-		ITableItemLabelProvider{
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_PropertyType_id_feature"), //$NON-NLS-1$
-				 getString("_UI_PropertyDescriptor_description", "_UI_PropertyType_id_feature", "_UI_PropertyType_type"),  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
-				 FacesConfigPackage.Literals.PROPERTY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__DEFAULT_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__SUGGESTED_VALUE);
-			childrenFeatures.add(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns PropertyType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/PropertyType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((PropertyType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_PropertyType_type") : //$NON-NLS-1$
-			getString("_UI_PropertyType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(PropertyType.class)) {
-			case FacesConfigPackage.PROPERTY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_NAME,
-				 FacesConfigFactory.eINSTANCE.createPropertyNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_CLASS,
-				 FacesConfigFactory.eINSTANCE.createPropertyClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__DEFAULT_VALUE,
-				 FacesConfigFactory.eINSTANCE.createDefaultValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__SUGGESTED_VALUE,
-				 FacesConfigFactory.eINSTANCE.createSuggestedValueType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.PROPERTY_TYPE__PROPERTY_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createPropertyExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		PropertyType property = (PropertyType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return property.getPropertyName() == null ? "" : property //$NON-NLS-1$
-					.getPropertyName().getTextContent();
-		case 1:
-			return property.getPropertyClass() == null ? "" : property //$NON-NLS-1$
-					.getPropertyClass().getTextContent();
-		case 2:
-			return property.getDefaultValue() == null ? "" : property //$NON-NLS-1$
-					.getDefaultValue().getTextContent();
-		case 3:
-			return property.getSuggestedValue() == null ? "" : property //$NON-NLS-1$
-					.getSuggestedValue().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectTypeItemProvider.java
deleted file mode 100644
index b2599d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectTypeItemProvider.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RedirectTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-			addIncludeViewParamsPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RedirectType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RedirectType_id_feature", "_UI_RedirectType_type"),
-				 FacesConfigPackage.Literals.REDIRECT_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Include View Params feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIncludeViewParamsPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RedirectType_includeViewParams_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RedirectType_includeViewParams_feature", "_UI_RedirectType_type"),
-				 FacesConfigPackage.Literals.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-				/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.REDIRECT_TYPE__VIEW_PARAM);
-		}
-		return childrenFeatures;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-				/**
-	 * This returns RedirectType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RedirectType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RedirectType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RedirectType_type") :
-			getString("_UI_RedirectType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RedirectType.class)) {
-			case FacesConfigPackage.REDIRECT_TYPE__ID:
-			case FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REDIRECT_TYPE__VIEW_PARAM,
-				 FacesConfigFactory.eINSTANCE.createRedirectViewParamType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectViewParamTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectViewParamTypeItemProvider.java
deleted file mode 100644
index 83ebec0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RedirectViewParamTypeItemProvider.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RedirectViewParamTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectViewParamTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RedirectViewParamType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RedirectViewParamType_id_feature", "_UI_RedirectViewParamType_type"),
-				 FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE__NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE__VALUE);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns RedirectViewParamType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RedirectViewParamType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RedirectViewParamType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RedirectViewParamType_type") :
-			getString("_UI_RedirectViewParamType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RedirectViewParamType.class)) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE__NAME,
-				 FacesConfigFactory.eINSTANCE.createNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE__VALUE,
-				 FacesConfigFactory.eINSTANCE.createValueType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanClassTypeItemProvider.java
deleted file mode 100644
index 36aa462..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ReferencedBeanClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ReferencedBeanClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanClassType_textContent_feature", "_UI_ReferencedBeanClassType_type"),
-				 FacesConfigPackage.Literals.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ReferencedBeanClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanClassType_id_feature", "_UI_ReferencedBeanClassType_type"),
-				 FacesConfigPackage.Literals.REFERENCED_BEAN_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ReferencedBeanClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ReferencedBeanClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ReferencedBeanClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ReferencedBeanClassType_type") :
-			getString("_UI_ReferencedBeanClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ReferencedBeanClassType.class)) {
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanNameTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanNameTypeItemProvider.java
deleted file mode 100644
index 5709669..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanNameTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ReferencedBeanNameTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanNameTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ReferencedBeanNameType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanNameType_textContent_feature", "_UI_ReferencedBeanNameType_type"),
-				 FacesConfigPackage.Literals.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ReferencedBeanNameType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanNameType_id_feature", "_UI_ReferencedBeanNameType_type"),
-				 FacesConfigPackage.Literals.REFERENCED_BEAN_NAME_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ReferencedBeanNameType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ReferencedBeanNameType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ReferencedBeanNameType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ReferencedBeanNameType_type") :
-			getString("_UI_ReferencedBeanNameType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ReferencedBeanNameType.class)) {
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanTypeItemProvider.java
deleted file mode 100644
index 8ca747c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ReferencedBeanTypeItemProvider.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ReferencedBeanTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ReferencedBeanType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ReferencedBeanType_id_feature", "_UI_ReferencedBeanType_type"),
-				 FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ReferencedBeanType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ReferencedBeanType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ReferencedBeanType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ReferencedBeanType_type") :
-			getString("_UI_ReferencedBeanType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ReferencedBeanType.class)) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS,
-				 FacesConfigFactory.eINSTANCE.createReferencedBeanClassType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitClassTypeItemProvider.java
deleted file mode 100644
index d13060b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RenderKitClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitClassType_textContent_feature", "_UI_RenderKitClassType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitClassType_id_feature", "_UI_RenderKitClassType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns RenderKitClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RenderKitClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RenderKitClassType_type") :
-			getString("_UI_RenderKitClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RenderKitClassType.class)) {
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitExtensionTypeItemProvider.java
deleted file mode 100644
index 359661f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RenderKitExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public RenderKitExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns RenderKitExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitExtensionType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((RenderKitExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RenderKitExtensionType_type") :
-			getString("_UI_RenderKitExtensionType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitFactoryTypeItemProvider.java
deleted file mode 100644
index 804431a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RenderKitFactoryTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitFactoryType_textContent_feature", "_UI_RenderKitFactoryType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitFactoryType_id_feature", "_UI_RenderKitFactoryType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns RenderKitFactoryType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitFactoryType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((RenderKitFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_RenderKitFactoryType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RenderKitFactoryType.class)) {
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-
-		switch (columnIndex) {
-
-			case 0:
-				return getText(object);
-			case 1:
-				return getString("_UI_RenderKitFactoryType_type"); //$NON-NLS-1$
-			}
-
-			return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitIdTypeItemProvider.java
deleted file mode 100644
index 4f96da3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitIdTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RenderKitIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitIdType_textContent_feature", "_UI_RenderKitIdType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitIdType_id_feature", "_UI_RenderKitIdType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns RenderKitIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RenderKitIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RenderKitIdType_type") :
-			getString("_UI_RenderKitIdType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RenderKitIdType.class)) {
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitTypeItemProvider.java
deleted file mode 100644
index 560e7a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RenderKitTypeItemProvider.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RenderKitTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RenderKitType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RenderKitType_id_feature", "_UI_RenderKitType_type"),
-				 FacesConfigPackage.Literals.RENDER_KIT_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDERER);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns RenderKitType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RenderKitType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-
-		String label = null;
-		
-		if (((RenderKitType) object).getDisplayName() != null
-				&& ((RenderKitType) object).getDisplayName().size() > 0) {
-			label = ((DisplayNameType) ((RenderKitType) object)
-					.getDisplayName().get(0)).getTextContent();
-		}
-
-		if ((label == null || label.length() == 0) && ((RenderKitType) object).getRenderKitId() != null
-				&& ((RenderKitType) object).getRenderKitId().getTextContent() != null) {
-			label = ((RenderKitType) object).getRenderKitId().getTextContent();
-		}
-
-		if (label == null || label.length() == 0) {
-			if (((RenderKitType) object).getRenderKitClass() != null)
-				label = ((RenderKitType) object).getRenderKitClass()
-						.getTextContent();
-		}
-		
-		if (label == null || label.length() == 0) {
-			label = ((RenderKitType) object).getId();
-		}
-
-		return label == null || label.length() == 0 ? getString("_UI_RenderKitType_type")
-				: label;
-//				: getString("_UI_RenderKitType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RenderKitType.class)) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_ID,
-				 FacesConfigFactory.eINSTANCE.createRenderKitIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createRenderKitClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDERER,
-				 FacesConfigFactory.eINSTANCE.createRendererType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER,
-				 FacesConfigFactory.eINSTANCE.createClientBehaviorRendererType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createRenderKitExtensionType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-//		RenderKitType renderkit = (RenderKitType) object;
-//		switch (columnIndex) {
-//		case 0:
-//			return getText(object);
-//		case 1:
-//			return renderkit.getRenderKitClass() == null ? "" : renderkit //$NON-NLS-1$
-//					.getRenderKitClass().getTextContent();
-//		}
-//		return null;
-//		RenderKitType renderkit = (RenderKitType) object;
-		switch (columnIndex) {
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_RenderKitType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererClassTypeItemProvider.java
deleted file mode 100644
index 77eabbe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RendererClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RendererClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RendererClassType_textContent_feature", "_UI_RendererClassType_type"),
-				 FacesConfigPackage.Literals.RENDERER_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RendererClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RendererClassType_id_feature", "_UI_RendererClassType_type"),
-				 FacesConfigPackage.Literals.RENDERER_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns RendererClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RendererClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RendererClassType_type") :
-			getString("_UI_RendererClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RendererClassType.class)) {
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererExtensionTypeItemProvider.java
deleted file mode 100644
index 16659ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class RendererExtensionTypeItemProvider
-	extends ExtensionTypeItemProvider
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns RendererExtensionType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((RendererExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RendererExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_RendererExtensionType_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeItemProvider.java
deleted file mode 100644
index e851182..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeItemProvider.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RendererTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RendererType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RendererType_id_feature", "_UI_RendererType_type"),
-				 FacesConfigPackage.Literals.RENDERER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__COMPONENT_FAMILY);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_TYPE);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__FACET);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns RendererType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RendererType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RendererType_type") :
-			getString("_UI_RendererType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RendererType.class)) {
-			case FacesConfigPackage.RENDERER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__COMPONENT_FAMILY,
-				 FacesConfigFactory.eINSTANCE.createComponentFamilyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_TYPE,
-				 FacesConfigFactory.eINSTANCE.createRendererTypeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createRendererClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__FACET,
-				 FacesConfigFactory.eINSTANCE.createFacetType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RENDERER_TYPE__RENDERER_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createRendererExtensionType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		RendererType renderer = (RendererType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return renderer.getDisplayName() == null || renderer.getDisplayName().size()==0 ? "" //$NON-NLS-1$
-					: ((DisplayNameType) renderer.getDisplayName().get(0)).getTextContent();
-		case 1:
-			return renderer.getComponentFamily() == null ? "" //$NON-NLS-1$
-					: renderer.getComponentFamily().getTextContent();
-		case 2:
-			return renderer.getRendererType()==null  ? "" //$NON-NLS-1$
-					: renderer.getRendererType().getTextContent();
-		case 3:
-			return renderer.getRendererClass() == null ? "" : renderer //$NON-NLS-1$
-					.getRendererClass().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeTypeItemProvider.java
deleted file mode 100644
index ed7fbb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/RendererTypeTypeItemProvider.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider 
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class RendererTypeTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererTypeTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RendererTypeType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RendererTypeType_textContent_feature", "_UI_RendererTypeType_type"),
-				 FacesConfigPackage.Literals.RENDERER_TYPE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_RendererTypeType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_RendererTypeType_id_feature", "_UI_RendererTypeType_type"),
-				 FacesConfigPackage.Literals.RENDERER_TYPE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns RendererTypeType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/RendererTypeType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((RendererTypeType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_RendererTypeType_type") :
-			getString("_UI_RendererTypeType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(RendererTypeType.class)) {
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-		RendererType renderer = (RendererType) object;
-		switch (columnIndex) {
-
-		case 0:
-			return renderer.getDisplayName().get(0) == null ? "" //$NON-NLS-1$
-					: (String) renderer.getDisplayName().get(0);
-		case 1:
-			return renderer.getRendererClass() == null ? "" : renderer //$NON-NLS-1$
-					.getRendererClass().getTextContent();
-		case 2:
-			return renderer.getComponentFamily().getTextContent() == null ? "" //$NON-NLS-1$
-					: renderer.getComponentFamily().getTextContent();
-		case 3:
-			return renderer.getRendererType().getTextContent() == null ? "" //$NON-NLS-1$
-					: renderer.getRendererType().getTextContent();
-		}
-		return null;
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceBundleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceBundleTypeItemProvider.java
deleted file mode 100644
index 8df4e92..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceBundleTypeItemProvider.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ResourceBundleTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceBundleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addBaseNamePropertyDescriptor(object);
-			addVarPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Base Name feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addBaseNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ResourceBundleType_baseName_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ResourceBundleType_baseName_feature", "_UI_ResourceBundleType_type"),
-				 FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__BASE_NAME,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Var feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addVarPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ResourceBundleType_var_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ResourceBundleType_var_feature", "_UI_ResourceBundleType_type"),
-				 FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__VAR,
-				 true,
-				 false,
-				 true,
-				 null,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ResourceBundleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ResourceBundleType_id_feature", "_UI_ResourceBundleType_type"),
-				 FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__ICON);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-    /**
-	 * This returns ResourceBundleType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ResourceBundleType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((ResourceBundleType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ResourceBundleType_type") :
-			getString("_UI_ResourceBundleType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ResourceBundleType.class)) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceHandlerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceHandlerTypeItemProvider.java
deleted file mode 100644
index 0324d21..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ResourceHandlerTypeItemProvider.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ResourceHandlerTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceHandlerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ResourceHandlerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ResourceHandlerType_textContent_feature", "_UI_ResourceHandlerType_type"),
-				 FacesConfigPackage.Literals.RESOURCE_HANDLER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ResourceHandlerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ResourceHandlerType_id_feature", "_UI_ResourceHandlerType_type"),
-				 FacesConfigPackage.Literals.RESOURCE_HANDLER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ResourceHandlerType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ResourceHandlerType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ResourceHandlerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ResourceHandlerType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ResourceHandlerType.class)) {
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ResourceHandlerType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SmallIconTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SmallIconTypeItemProvider.java
deleted file mode 100644
index 3972ae6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SmallIconTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SmallIconTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SmallIconTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SmallIconType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SmallIconType_textContent_feature", "_UI_SmallIconType_type"),
-				 FacesConfigPackage.Literals.SMALL_ICON_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SmallIconType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SmallIconType_id_feature", "_UI_SmallIconType_type"),
-				 FacesConfigPackage.Literals.SMALL_ICON_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns SmallIconType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SmallIconType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SmallIconType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SmallIconType_type") :
-			getString("_UI_SmallIconType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SmallIconType.class)) {
-			case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SourceClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SourceClassTypeItemProvider.java
deleted file mode 100644
index ad36381..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SourceClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SourceClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SourceClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SourceClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SourceClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SourceClassType_textContent_feature", "_UI_SourceClassType_type"),
-				 FacesConfigPackage.Literals.SOURCE_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SourceClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SourceClassType_id_feature", "_UI_SourceClassType_type"),
-				 FacesConfigPackage.Literals.SOURCE_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns SourceClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SourceClassType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SourceClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SourceClassType_type") :
-			getString("_UI_SourceClassType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SourceClassType.class)) {
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/StateManagerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/StateManagerTypeItemProvider.java
deleted file mode 100644
index 2e9cd5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/StateManagerTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.StateManagerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class StateManagerTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateManagerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_StateManagerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_StateManagerType_textContent_feature", "_UI_StateManagerType_type"),
-				 FacesConfigPackage.Literals.STATE_MANAGER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_StateManagerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_StateManagerType_id_feature", "_UI_StateManagerType_type"),
-				 FacesConfigPackage.Literals.STATE_MANAGER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns StateManagerType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/StateManagerType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((StateManagerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_StateManagerType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(StateManagerType.class)) {
-			case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_StateManagerType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SuggestedValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SuggestedValueTypeItemProvider.java
deleted file mode 100644
index 28da5cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SuggestedValueTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SuggestedValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SuggestedValueTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SuggestedValueType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SuggestedValueType_textContent_feature", "_UI_SuggestedValueType_type"),
-				 FacesConfigPackage.Literals.SUGGESTED_VALUE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SuggestedValueType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SuggestedValueType_id_feature", "_UI_SuggestedValueType_type"),
-				 FacesConfigPackage.Literals.SUGGESTED_VALUE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns SuggestedValueType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SuggestedValueType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SuggestedValueType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SuggestedValueType_type") :
-			getString("_UI_SuggestedValueType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SuggestedValueType.class)) {
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SupportedLocaleTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SupportedLocaleTypeItemProvider.java
deleted file mode 100644
index ed772f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SupportedLocaleTypeItemProvider.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-/**
- * This is the item provider adapter for a
- * {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType} object. <!--
- * begin-user-doc --> <!-- end-user-doc -->
- * 
- * @generated
- */
-@SuppressWarnings("nls")
-public class SupportedLocaleTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider,
-		ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportedLocaleTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SupportedLocaleType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SupportedLocaleType_textContent_feature", "_UI_SupportedLocaleType_type"),
-				 FacesConfigPackage.Literals.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SupportedLocaleType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SupportedLocaleType_id_feature", "_UI_SupportedLocaleType_type"),
-				 FacesConfigPackage.Literals.SUPPORTED_LOCALE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns SupportedLocaleType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SupportedLocaleType"));
-	}
-
-    /**
-     * This returns the label text for the adapted class.
-     * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-     * @generated NOT
-     */
-	public String getText(Object object) {
-        String label = ((SupportedLocaleType)object).getTextContent();
-        return label == null || label.length() == 0 ?
-            getString("_UI_SupportedLocaleType_type") : //$NON-NLS-1$
-            label;
-    }
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SupportedLocaleType.class)) {
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventClassTypeItemProvider.java
deleted file mode 100644
index d25776b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SystemEventClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SystemEventClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SystemEventClassType_textContent_feature", "_UI_SystemEventClassType_type"),
-				 FacesConfigPackage.Literals.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc --> 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SystemEventClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SystemEventClassType_id_feature", "_UI_SystemEventClassType_type"),
-				 FacesConfigPackage.Literals.SYSTEM_EVENT_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns SystemEventClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SystemEventClassType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SystemEventClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SystemEventClassType_type") :
-			getString("_UI_SystemEventClassType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SystemEventClassType.class)) {
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerClassTypeItemProvider.java
deleted file mode 100644
index be6cfb7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SystemEventListenerClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SystemEventListenerClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SystemEventListenerClassType_textContent_feature", "_UI_SystemEventListenerClassType_type"),
-				 FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SystemEventListenerClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SystemEventListenerClassType_id_feature", "_UI_SystemEventListenerClassType_type"),
-				 FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns SystemEventListenerClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SystemEventListenerClassType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SystemEventListenerClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SystemEventListenerClassType_type") :
-			getString("_UI_SystemEventListenerClassType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SystemEventListenerClassType.class)) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerTypeItemProvider.java
deleted file mode 100644
index 7197cab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/SystemEventListenerTypeItemProvider.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class SystemEventListenerTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_SystemEventListenerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_SystemEventListenerType_id_feature", "_UI_SystemEventListenerType_type"),
-				 FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns SystemEventListenerType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/SystemEventListenerType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((SystemEventListenerType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_SystemEventListenerType_type") :
-			getString("_UI_SystemEventListenerType_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(SystemEventListenerType.class)) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSystemEventListenerClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSystemEventClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS,
-				 FacesConfigFactory.eINSTANCE.createSourceClassType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/TagHandlerDelegateFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/TagHandlerDelegateFactoryTypeItemProvider.java
deleted file mode 100644
index c13c9e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/TagHandlerDelegateFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class TagHandlerDelegateFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagHandlerDelegateFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_TagHandlerDelegateFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_TagHandlerDelegateFactoryType_textContent_feature", "_UI_TagHandlerDelegateFactoryType_type"),
-				 FacesConfigPackage.Literals.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_TagHandlerDelegateFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_TagHandlerDelegateFactoryType_id_feature", "_UI_TagHandlerDelegateFactoryType_type"),
-				 FacesConfigPackage.Literals.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns TagHandlerDelegateFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/TagHandlerDelegateFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((TagHandlerDelegateFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_TagHandlerDelegateFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TagHandlerDelegateFactoryType.class)) {
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_TagHandlerDelegateFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ToViewIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ToViewIdTypeItemProvider.java
deleted file mode 100644
index dc2c6c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ToViewIdTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ToViewIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToViewIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ToViewIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ToViewIdType_textContent_feature", "_UI_ToViewIdType_type"),
-				 FacesConfigPackage.Literals.TO_VIEW_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ToViewIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ToViewIdType_id_feature", "_UI_ToViewIdType_type"),
-				 FacesConfigPackage.Literals.TO_VIEW_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ToViewIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ToViewIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ToViewIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ToViewIdType_type") :
-			getString("_UI_ToViewIdType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ToViewIdType.class)) {
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorClassTypeItemProvider.java
deleted file mode 100644
index 9a6788e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ValidatorClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValidatorClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorClassType_textContent_feature", "_UI_ValidatorClassType_type"),
-				 FacesConfigPackage.Literals.VALIDATOR_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValidatorClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorClassType_id_feature", "_UI_ValidatorClassType_type"),
-				 FacesConfigPackage.Literals.VALIDATOR_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ValidatorClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ValidatorClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ValidatorClassType_type") :
-			getString("_UI_ValidatorClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ValidatorClassType.class)) {
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorExtensionTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorExtensionTypeItemProvider.java
deleted file mode 100644
index aba55e2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorExtensionTypeItemProvider.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-public class ValidatorExtensionTypeItemProvider
-    extends ExtensionTypeItemProvider
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ValidatorExtensionTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This returns ValidatorExtensionType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorExtensionType")); //$NON-NLS-1$
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String getText(Object object) {
-		String label = ((ValidatorExtensionType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ValidatorExtensionType_type") : //$NON-NLS-1$
-			getString("_UI_ValidatorExtensionType_type") + " " + label;  //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorIdTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorIdTypeItemProvider.java
deleted file mode 100644
index b71789f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorIdTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ValidatorIdTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorIdTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValidatorIdType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorIdType_textContent_feature", "_UI_ValidatorIdType_type"),
-				 FacesConfigPackage.Literals.VALIDATOR_ID_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValidatorIdType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorIdType_id_feature", "_UI_ValidatorIdType_type"),
-				 FacesConfigPackage.Literals.VALIDATOR_ID_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ValidatorIdType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorIdType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ValidatorIdType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ValidatorIdType_type") :
-			getString("_UI_ValidatorIdType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ValidatorIdType.class)) {
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorTypeItemProvider.java
deleted file mode 100644
index 59cbdc7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValidatorTypeItemProvider.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ValidatorTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValidatorType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValidatorType_id_feature", "_UI_ValidatorType_type"),
-				 FacesConfigPackage.Literals.VALIDATOR_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Collection getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__DESCRIPTION);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__DISPLAY_NAME);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__ICON);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_ID);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_CLASS);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__ATTRIBUTE);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__PROPERTY);
-			childrenFeatures.add(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_EXTENSION);
-		}
-		return childrenFeatures;
-	}
-
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns ValidatorType.gif. <!-- begin-user-doc --> <!-- end-user-doc
-	 * -->
-	 * 
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValidatorType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class. <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * 
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = null;
-
-		if (((ValidatorType) object).getDisplayName() != null
-				&& ((ValidatorType) object).getDisplayName().size() > 0) {
-			label = ((DisplayNameType) ((ValidatorType) object)
-					.getDisplayName().get(0)).getTextContent();
-		}
-		
-		if ((label == null || label.length() == 0) && ((ValidatorType) object).getValidatorId() != null
-				&& ((ValidatorType) object).getValidatorId().getTextContent() != null) {
-			label = ((ValidatorType) object).getValidatorId().getTextContent();
-		}
-
-		if (label == null || label.length() == 0) {
-			if (((ValidatorType) object).getValidatorClass() != null)
-				label = ((ValidatorType) object).getValidatorClass()
-						.getTextContent();
-		}
-		if (label == null || label.length() == 0) {
-			label = ((ValidatorType) object).getId();
-		}
-		return label == null || label.length() == 0 ? getString("_UI_ValidatorType_type")
-				: label;
-//				: getString("_UI_ValidatorType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ValidatorType.class)) {
-			case FacesConfigPackage.VALIDATOR_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__DESCRIPTION,
-				 FacesConfigFactory.eINSTANCE.createDescriptionType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__DISPLAY_NAME,
-				 FacesConfigFactory.eINSTANCE.createDisplayNameType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__ICON,
-				 FacesConfigFactory.eINSTANCE.createIconType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_ID,
-				 FacesConfigFactory.eINSTANCE.createValidatorIdType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_CLASS,
-				 FacesConfigFactory.eINSTANCE.createValidatorClassType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__ATTRIBUTE,
-				 FacesConfigFactory.eINSTANCE.createAttributeType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__PROPERTY,
-				 FacesConfigFactory.eINSTANCE.createPropertyType()));
-
-		newChildDescriptors.add
-			(createChildParameter
-				(FacesConfigPackage.Literals.VALIDATOR_TYPE__VALIDATOR_EXTENSION,
-				 FacesConfigFactory.eINSTANCE.createValidatorExtensionType()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ValidatorType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueClassTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueClassTypeItemProvider.java
deleted file mode 100644
index 39c7d6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueClassTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ValueClassTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider,	
-		IStructuredItemContentProvider,	
-		ITreeItemContentProvider,	
-		IItemLabelProvider,	
-		IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueClassTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValueClassType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValueClassType_textContent_feature", "_UI_ValueClassType_type"),
-				 FacesConfigPackage.Literals.VALUE_CLASS_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValueClassType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValueClassType_id_feature", "_UI_ValueClassType_type"),
-				 FacesConfigPackage.Literals.VALUE_CLASS_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ValueClassType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValueClassType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ValueClassType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ValueClassType_type") :
-			getString("_UI_ValueClassType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ValueClassType.class)) {
-			case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueTypeItemProvider.java
deleted file mode 100644
index 1230800..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ValueTypeItemProvider.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ValueTypeItemProvider
-	extends ItemProviderAdapter
-	implements	
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValueType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValueType_textContent_feature", "_UI_ValueType_type"),
-				 FacesConfigPackage.Literals.VALUE_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ValueType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ValueType_id_feature", "_UI_ValueType_type"),
-				 FacesConfigPackage.Literals.VALUE_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ValueType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ValueType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getText(Object object) {
-		String label = ((ValueType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_ValueType_type") :
-			getString("_UI_ValueType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ValueType.class)) {
-			case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VALUE_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	public String getColumnText(Object object, int columnIndex) {
-
-		ValueType value = (ValueType)object;
-		return value.getTextContent();
-	}
-
-	public Object getColumnImage(Object object, int columnIndex) {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VarTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VarTypeItemProvider.java
deleted file mode 100644
index 91b1d96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VarTypeItemProvider.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VarType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VarType} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class VarTypeItemProvider
-    extends ItemProviderAdapter
-    implements	
-        IEditingDomainItemProvider,	
-        IStructuredItemContentProvider,	
-        ITreeItemContentProvider,	
-        IItemLabelProvider,	
-        IItemPropertySource {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-     * @param adapterFactory 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public VarTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-    /**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-    /**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VarType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VarType_textContent_feature", "_UI_VarType_type"),
-				 FacesConfigPackage.Literals.VAR_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VarType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VarType_id_feature", "_UI_VarType_type"),
-				 FacesConfigPackage.Literals.VAR_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns VarType.gif.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/VarType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getText(Object object) {
-		String label = ((VarType)object).getId();
-		return label == null || label.length() == 0 ?
-			getString("_UI_VarType_type") :
-			getString("_UI_VarType_type") + " " + label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(VarType.class)) {
-			case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VAR_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-    /**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VariableResolverTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VariableResolverTypeItemProvider.java
deleted file mode 100644
index 38b6260..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VariableResolverTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class VariableResolverTypeItemProvider extends ItemProviderAdapter
-		implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
- 	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariableResolverTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VariableResolverType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VariableResolverType_textContent_feature", "_UI_VariableResolverType_type"),
-				 FacesConfigPackage.Literals.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VariableResolverType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VariableResolverType_id_feature", "_UI_VariableResolverType_type"),
-				 FacesConfigPackage.Literals.VARIABLE_RESOLVER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns VariableResolverType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/VariableResolverType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((VariableResolverType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_VariableResolverType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(VariableResolverType.class)) {
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_VariableResolverType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewDeclarationLanguageFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewDeclarationLanguageFactoryTypeItemProvider.java
deleted file mode 100644
index 7e2b6d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewDeclarationLanguageFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ViewDeclarationLanguageFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewDeclarationLanguageFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ViewDeclarationLanguageFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ViewDeclarationLanguageFactoryType_textContent_feature", "_UI_ViewDeclarationLanguageFactoryType_type"),
-				 FacesConfigPackage.Literals.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * @param object
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ViewDeclarationLanguageFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ViewDeclarationLanguageFactoryType_id_feature", "_UI_ViewDeclarationLanguageFactoryType_type"),
-				 FacesConfigPackage.Literals.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns ViewDeclarationLanguageFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ViewDeclarationLanguageFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ViewDeclarationLanguageFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ViewDeclarationLanguageFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ViewDeclarationLanguageFactoryType.class)) {
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ViewDeclarationLanguageFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewHandlerTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewHandlerTypeItemProvider.java
deleted file mode 100644
index 8cd0a0d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ViewHandlerTypeItemProvider.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType} object.
- * <!-- begin-user-doc --> 
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class ViewHandlerTypeItemProvider extends ItemProviderAdapter implements
-		IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, ITableItemLabelProvider {
-    /**
-	 * <!-- begin-user-doc --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc --> 
-	 * @param adapterFactory
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewHandlerTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ViewHandlerType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ViewHandlerType_textContent_feature", "_UI_ViewHandlerType_type"),
-				 FacesConfigPackage.Literals.VIEW_HANDLER_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-     * @param object 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_ViewHandlerType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_ViewHandlerType_id_feature", "_UI_ViewHandlerType_type"),
-				 FacesConfigPackage.Literals.VIEW_HANDLER_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-    /**
-	 * This returns ViewHandlerType.gif.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/ViewHandlerType"));
-	}
-
-    /**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((ViewHandlerType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_ViewHandlerType_type")
-				: label;
-	}
-
-    /**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc --> <!--
-	 * end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(ViewHandlerType.class)) {
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-    /**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc
-	 * --> <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_ViewHandlerType_type"); //$NON-NLS-1$
-		}
-
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VisitContextFactoryTypeItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VisitContextFactoryTypeItemProvider.java
deleted file mode 100644
index a2acdb4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/VisitContextFactoryTypeItemProvider.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
-
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType} object.
- * <!-- begin-user-doc -->
- * @extends ITableItemLabelProvider
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class VisitContextFactoryTypeItemProvider
-	extends ItemProviderAdapter
-	implements
-		IEditingDomainItemProvider,
-		IStructuredItemContentProvider,
-		ITreeItemContentProvider,
-		IItemLabelProvider,
-		IItemPropertySource,
-		ITableItemLabelProvider{
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * @param adapterFactory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VisitContextFactoryTypeItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public List getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTextContentPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Text Content feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addTextContentPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VisitContextFactoryType_textContent_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VisitContextFactoryType_textContent_feature", "_UI_VisitContextFactoryType_type"),
-				 FacesConfigPackage.Literals.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc --> 
-	 * @param object 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add
-			(createItemPropertyDescriptor
-				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
-				 getResourceLocator(),
-				 getString("_UI_VisitContextFactoryType_id_feature"),
-				 getString("_UI_PropertyDescriptor_description", "_UI_VisitContextFactoryType_id_feature", "_UI_VisitContextFactoryType_type"),
-				 FacesConfigPackage.Literals.VISIT_CONTEXT_FACTORY_TYPE__ID,
-				 true,
-				 false,
-				 false,
-				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-				 null,
-				 null));
-	}
-
-	/**
-	 * This returns VisitContextFactoryType.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/VisitContextFactoryType"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String getText(Object object) {
-		String label = ((VisitContextFactoryType) object).getTextContent();
-		return label == null || label.length() == 0 ? getString("_UI_VisitContextFactoryType_type")
-				: label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(VisitContextFactoryType.class)) {
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID:
-				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-				return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceLocator getResourceLocator() {
-		return FacesConfigPlugin.INSTANCE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, int)
-	 */
-	public Object getColumnImage(Object object, int columnIndex) {
-		// TODO Auto-generated method stub
-		if(columnIndex ==0)
-			return getImage(object);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, int)
-	 */
-	public String getColumnText(Object object, int columnIndex) {
-		switch (columnIndex) {
-
-		case 0:
-			return getText(object);
-		case 1:
-			return getString("_UI_VisitContextFactoryType_type"); //$NON-NLS-1$
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/package-info.java
deleted file mode 100644
index 71a1afa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * EMF providers for JSF application configuration model. 
- */
-package org.eclipse.jst.jsf.facesconfig.edit.provider;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AbsoluteOrderingType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AbsoluteOrderingType.java
deleted file mode 100644
index c874529..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AbsoluteOrderingType.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Absolute Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getOthers <em>Others</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAbsoluteOrderingType()
- * @model extendedMetaData="name='absolute-ordering_._type' kind='elementOnly'"
- * @generated
- */
-public interface AbsoluteOrderingType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAbsoluteOrderingType_Name()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NameType" containment="true"
-	 *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getName();
-
-	/**
-	 * Returns the value of the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Others</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Others</em>' containment reference.
-	 * @see #setOthers(OrderingOthersType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAbsoluteOrderingType_Others()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='others' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOthersType getOthers();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getOthers <em>Others</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Others</em>' containment reference.
-	 * @see #getOthers()
-	 * @generated
-	 */
-	void setOthers(OrderingOthersType value);
-
-} // AbsoluteOrderingType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ActionListenerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ActionListenerType.java
deleted file mode 100644
index 272bb43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ActionListenerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Action Listener Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getActionListenerType()
- * @model extendedMetaData="name='action-listener_._type' kind='simple'"
- * @generated
- */
-public interface ActionListenerType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getActionListenerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getActionListenerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ActionListenerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationExtensionType.java
deleted file mode 100644
index 09e2e93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Application Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationExtensionType()
- * @model extendedMetaData="name='application-extension_._type'"
- * @generated
- */
-public interface ApplicationExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // ApplicationExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationFactoryType.java
deleted file mode 100644
index 72c50ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Application Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationFactoryType()
- * @model extendedMetaData="name='application-factory_._type' kind='simple'"
- * @generated
- */
-public interface ApplicationFactoryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ApplicationFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationType.java
deleted file mode 100644
index ea98ef6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ApplicationType.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Application Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getViewHandler <em>View Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getELResolver <em>EL Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceHandler <em>Resource Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getSystemEventListener <em>System Event Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceBundle <em>Resource Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getApplicationExtension <em>Application Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultValidators <em>Default Validators</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType()
- * @model extendedMetaData="name='application_._type' kind='elementOnly'"
- * @generated
- */
-public interface ApplicationType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Action Listener</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Action Listener</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Action Listener</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ActionListener()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType" containment="true"
-	 *        extendedMetaData="kind='element' name='action-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getActionListener();
-
-    /**
-	 * Returns the value of the '<em><b>Default Render Kit Id</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Render Kit Id</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Render Kit Id</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_DefaultRenderKitId()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType" containment="true"
-	 *        extendedMetaData="kind='element' name='default-render-kit-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDefaultRenderKitId();
-
-    /**
-	 * Returns the value of the '<em><b>Message Bundle</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Message Bundle</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Message Bundle</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_MessageBundle()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType" containment="true"
-	 *        extendedMetaData="kind='element' name='message-bundle' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getMessageBundle();
-
-    /**
-	 * Returns the value of the '<em><b>Navigation Handler</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Navigation Handler</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Navigation Handler</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_NavigationHandler()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType" containment="true"
-	 *        extendedMetaData="kind='element' name='navigation-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getNavigationHandler();
-
-    /**
-	 * Returns the value of the '<em><b>View Handler</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>View Handler</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>View Handler</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ViewHandler()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType" containment="true"
-	 *        extendedMetaData="kind='element' name='view-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getViewHandler();
-
-    /**
-	 * Returns the value of the '<em><b>State Manager</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>State Manager</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>State Manager</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_StateManager()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.StateManagerType" containment="true"
-	 *        extendedMetaData="kind='element' name='state-manager' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getStateManager();
-
-    /**
-	 * Returns the value of the '<em><b>Property Resolver</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Resolver</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Resolver</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_PropertyResolver()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType" containment="true"
-	 *        extendedMetaData="kind='element' name='property-resolver' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getPropertyResolver();
-
-    /**
-	 * Returns the value of the '<em><b>Variable Resolver</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Variable Resolver</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Variable Resolver</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_VariableResolver()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType" containment="true"
-	 *        extendedMetaData="kind='element' name='variable-resolver' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getVariableResolver();
-
-    /**
-	 * Returns the value of the '<em><b>Resource Handler</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resource Handler</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resource Handler</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ResourceHandler()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType" containment="true"
-	 *        extendedMetaData="kind='element' name='resource-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getResourceHandler();
-
-				/**
-	 * Returns the value of the '<em><b>System Event Listener</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>System Event Listener</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>System Event Listener</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_SystemEventListener()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType"
-	 *        extendedMetaData="kind='element' name='system-event-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getSystemEventListener();
-
-				/**
-	 * Returns the value of the '<em><b>Locale Config</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Locale Config</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Locale Config</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_LocaleConfig()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType" containment="true"
-	 *        extendedMetaData="kind='element' name='locale-config' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getLocaleConfig();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-    /**
-	 * Returns the value of the '<em><b>EL Resolver</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>EL Resolver</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>EL Resolver</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ELResolver()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ELResolverType"
-	 *        extendedMetaData="kind='element' name='el-resolver' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getELResolver();
-
-    /**
-	 * Returns the value of the '<em><b>Resource Bundle</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Resource Bundle</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resource Bundle</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ResourceBundle()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType"
-	 *        extendedMetaData="kind='element' name='resource-bundle' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getResourceBundle();
-
-    /**
-	 * Returns the value of the '<em><b>Application Extension</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Application Extension</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Application Extension</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_ApplicationExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType"
-	 *        extendedMetaData="kind='element' name='application-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getApplicationExtension();
-
-				/**
-	 * Returns the value of the '<em><b>Default Validators</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Validators</em>' reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Validators</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getApplicationType_DefaultValidators()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType"
-	 *        extendedMetaData="kind='element' name='default-validators' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDefaultValidators();
-
-} // ApplicationType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeClassType.java
deleted file mode 100644
index a19aa9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeClassType()
- * @model extendedMetaData="name='attribute-class_._type' kind='simple'"
- * @generated
- */
-public interface AttributeClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // AttributeClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeExtensionType.java
deleted file mode 100644
index 422dcc5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeExtensionType()
- * @model extendedMetaData="name='attribute-extension_._type'"
- * @generated
- */
-public interface AttributeExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // AttributeExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeNameType.java
deleted file mode 100644
index c44d47f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeNameType()
- * @model extendedMetaData="name='attribute-name_._type' kind='simple'"
- * @generated
- */
-public interface AttributeNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // AttributeNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeType.java
deleted file mode 100644
index 0fb14f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/AttributeType.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Attribute Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType()
- * @model extendedMetaData="name='attribute_._type' kind='elementOnly'"
- * @generated
- */
-public interface AttributeType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute Name</em>' containment reference.
-	 * @see #setAttributeName(AttributeNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_AttributeName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='attribute-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeNameType getAttributeName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName <em>Attribute Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Name</em>' containment reference.
-	 * @see #getAttributeName()
-	 * @generated
-	 */
-	void setAttributeName(AttributeNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute Class</em>' containment reference.
-	 * @see #setAttributeClass(AttributeClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_AttributeClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='attribute-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeClassType getAttributeClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass <em>Attribute Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Class</em>' containment reference.
-	 * @see #getAttributeClass()
-	 * @generated
-	 */
-	void setAttributeClass(AttributeClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Value</em>' containment reference.
-	 * @see #setDefaultValue(DefaultValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_DefaultValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='default-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultValueType getDefaultValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue <em>Default Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Value</em>' containment reference.
-	 * @see #getDefaultValue()
-	 * @generated
-	 */
-	void setDefaultValue(DefaultValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Suggested Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #setSuggestedValue(SuggestedValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_SuggestedValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='suggested-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SuggestedValueType getSuggestedValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue <em>Suggested Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #getSuggestedValue()
-	 * @generated
-	 */
-	void setSuggestedValue(SuggestedValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_AttributeExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttributeExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getAttributeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // AttributeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BaseNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BaseNameType.java
deleted file mode 100644
index 7fe6f63..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BaseNameType.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Base Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBaseNameType()
- * @model extendedMetaData="name='base-name_._type' kind='simple'"
- * @generated
- */
-public interface BaseNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBaseNameType_TextContent()
-	 * @model extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-    String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-    void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBaseNameType_Id()
-	 * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-} // BaseNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorClassType.java
deleted file mode 100644
index 78ffb25..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Behavior Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorClassType()
- * @model extendedMetaData="name='behavior-class_._type' kind='simple'"
- * @generated
- */
-public interface BehaviorClassType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // BehaviorClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorExtensionType.java
deleted file mode 100644
index 699e5ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Behavior Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorExtensionType()
- * @model extendedMetaData="name='behavior-extension_._type'"
- * @generated
- */
-public interface BehaviorExtensionType extends ExtensionType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // BehaviorExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorIdType.java
deleted file mode 100644
index cacea62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Behavior Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorIdType()
- * @model extendedMetaData="name='behavior-id_._type' kind='simple'"
- * @generated
- */
-public interface BehaviorIdType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // BehaviorIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorType.java
deleted file mode 100644
index a9eb3df..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/BehaviorType.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Behavior Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorId <em>Behavior Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorClass <em>Behavior Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorExtension <em>Behavior Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType()
- * @model extendedMetaData="name='behavior_._type' kind='elementOnly'"
- * @generated
- */
-public interface BehaviorType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-	/**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-	/**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-	/**
-	 * Returns the value of the '<em><b>Behavior Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Behavior Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Behavior Id</em>' containment reference.
-	 * @see #setBehaviorId(BehaviorIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_BehaviorId()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='behavior-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorIdType getBehaviorId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorId <em>Behavior Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior Id</em>' containment reference.
-	 * @see #getBehaviorId()
-	 * @generated
-	 */
-	void setBehaviorId(BehaviorIdType value);
-
-	/**
-	 * Returns the value of the '<em><b>Behavior Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Behavior Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Behavior Class</em>' containment reference.
-	 * @see #setBehaviorClass(BehaviorClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_BehaviorClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='behavior-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorClassType getBehaviorClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorClass <em>Behavior Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior Class</em>' containment reference.
-	 * @see #getBehaviorClass()
-	 * @generated
-	 */
-	void setBehaviorClass(BehaviorClassType value);
-
-	/**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_Attribute()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttribute();
-
-	/**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_Property()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-	 *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getProperty();
-
-	/**
-	 * Returns the value of the '<em><b>Behavior Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Behavior Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Behavior Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getBehaviorType_BehaviorExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='behavior-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getBehaviorExtension();
-
-} // BehaviorType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererClassType.java
deleted file mode 100644
index b99d00f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Client Behavior Renderer Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererClassType()
- * @model extendedMetaData="name='client-behavior-renderer-class_._type' kind='simple'"
- * @generated
- */
-public interface ClientBehaviorRendererClassType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ClientBehaviorRendererClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererType.java
deleted file mode 100644
index 9428d03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Client Behavior Renderer Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererClass <em>Client Behavior Renderer Class</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererType()
- * @model extendedMetaData="name='client-behavior-renderer_._type' kind='elementOnly'"
- * @generated
- */
-public interface ClientBehaviorRendererType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Client Behavior Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Client Behavior Renderer Type</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Client Behavior Renderer Type</em>' containment reference.
-	 * @see #setClientBehaviorRendererType(ClientBehaviorRendererTypeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererType_ClientBehaviorRendererType()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='client-behavior-renderer-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ClientBehaviorRendererTypeType getClientBehaviorRendererType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Client Behavior Renderer Type</em>' containment reference.
-	 * @see #getClientBehaviorRendererType()
-	 * @generated
-	 */
-	void setClientBehaviorRendererType(ClientBehaviorRendererTypeType value);
-
-	/**
-	 * Returns the value of the '<em><b>Client Behavior Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Client Behavior Renderer Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Client Behavior Renderer Class</em>' containment reference.
-	 * @see #setClientBehaviorRendererClass(ClientBehaviorRendererClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererType_ClientBehaviorRendererClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='client-behavior-renderer-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ClientBehaviorRendererClassType getClientBehaviorRendererClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererClass <em>Client Behavior Renderer Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Client Behavior Renderer Class</em>' containment reference.
-	 * @see #getClientBehaviorRendererClass()
-	 * @generated
-	 */
-	void setClientBehaviorRendererClass(ClientBehaviorRendererClassType value);
-
-} // ClientBehaviorRendererType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererTypeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererTypeType.java
deleted file mode 100644
index 5b6c47a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ClientBehaviorRendererTypeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Client Behavior Renderer Type Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererTypeType()
- * @model extendedMetaData="name='client-behavior-renderer-type_._type' kind='simple'"
- * @generated
- */
-public interface ClientBehaviorRendererTypeType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererTypeType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getClientBehaviorRendererTypeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ClientBehaviorRendererTypeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentClassType.java
deleted file mode 100644
index d970637..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentClassType()
- * @model extendedMetaData="name='component-class_._type' kind='simple'"
- * @generated
- */
-public interface ComponentClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ComponentClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentExtensionType.java
deleted file mode 100644
index efd1b71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentExtensionType()
- * @model extendedMetaData="name='component-extension_._type'"
- * @generated
- */
-public interface ComponentExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // ComponentExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentFamilyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentFamilyType.java
deleted file mode 100644
index 4079ca0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentFamilyType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Family Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentFamilyType()
- * @model extendedMetaData="name='component-family_._type' kind='simple'"
- * @generated
- */
-public interface ComponentFamilyType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentFamilyType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentFamilyType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ComponentFamilyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentType.java
deleted file mode 100644
index bbd4673..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentType.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType()
- * @model extendedMetaData="name='component_._type' kind='elementOnly'"
- * @generated
- */
-public interface ComponentType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Component Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Type</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Component Type</em>' containment reference.
-	 * @see #setComponentType(ComponentTypeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_ComponentType()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='component-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentTypeType getComponentType();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType <em>Component Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Type</em>' containment reference.
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	void setComponentType(ComponentTypeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Component Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Component Class</em>' containment reference.
-	 * @see #setComponentClass(ComponentClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_ComponentClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='component-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentClassType getComponentClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass <em>Component Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Class</em>' containment reference.
-	 * @see #getComponentClass()
-	 * @generated
-	 */
-	void setComponentClass(ComponentClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Facet</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Facet()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacetType" containment="true"
-	 *        extendedMetaData="kind='element' name='facet' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getFacet();
-
-    /**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Attribute()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttribute();
-
-    /**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Property()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-	 *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getProperty();
-
-    /**
-	 * Returns the value of the '<em><b>Component Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Component Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_ComponentExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='component-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getComponentExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ComponentType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentTypeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentTypeType.java
deleted file mode 100644
index be947b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ComponentTypeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Component Type Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentTypeType()
- * @model extendedMetaData="name='component-type_._type' kind='simple'"
- * @generated
- */
-public interface ComponentTypeType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentTypeType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getComponentTypeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ComponentTypeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterClassType.java
deleted file mode 100644
index f2b2dd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterClassType()
- * @model extendedMetaData="name='converter-class_._type' kind='simple'"
- * @generated
- */
-public interface ConverterClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ConverterClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterExtensionType.java
deleted file mode 100644
index 018aade..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterExtensionType()
- * @model extendedMetaData="name='converter-extension_._type'"
- * @generated
- */
-public interface ConverterExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // ConverterExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterForClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterForClassType.java
deleted file mode 100644
index 90348e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterForClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter For Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterForClassType()
- * @model extendedMetaData="name='converter-for-class_._type' kind='simple'"
- * @generated
- */
-public interface ConverterForClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterForClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterForClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ConverterForClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterIdType.java
deleted file mode 100644
index 2adfd4e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterIdType()
- * @model extendedMetaData="name='converter-id_._type' kind='simple'"
- * @generated
- */
-public interface ConverterIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ConverterIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterType.java
deleted file mode 100644
index 90eba92..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ConverterType.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Converter Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterExtension <em>Converter Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType()
- * @model extendedMetaData="name='converter_._type' kind='elementOnly'"
- * @generated
- */
-public interface ConverterType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Converter Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Converter Id</em>' containment reference.
-	 * @see #setConverterId(ConverterIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterId()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='converter-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterIdType getConverterId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId <em>Converter Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter Id</em>' containment reference.
-	 * @see #getConverterId()
-	 * @generated
-	 */
-	void setConverterId(ConverterIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter For Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter For Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Converter For Class</em>' containment reference.
-	 * @see #setConverterForClass(ConverterForClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterForClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='converter-for-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterForClassType getConverterForClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass <em>Converter For Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter For Class</em>' containment reference.
-	 * @see #getConverterForClass()
-	 * @generated
-	 */
-	void setConverterForClass(ConverterForClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Converter Class</em>' containment reference.
-	 * @see #setConverterClass(ConverterClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='converter-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterClassType getConverterClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass <em>Converter Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter Class</em>' containment reference.
-	 * @see #getConverterClass()
-	 * @generated
-	 */
-	void setConverterClass(ConverterClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Attribute()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttribute();
-
-    /**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Property()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-	 *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getProperty();
-
-    /**
-	 * Returns the value of the '<em><b>Converter Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Converter Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Converter Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_ConverterExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='converter-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getConverterExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getConverterType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ConverterType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultLocaleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultLocaleType.java
deleted file mode 100644
index c58b3f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultLocaleType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Locale Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultLocaleType()
- * @model extendedMetaData="name='default-locale_._type' kind='simple'"
- * @generated
- */
-public interface DefaultLocaleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultLocaleType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultLocaleType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DefaultLocaleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultRenderKitIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultRenderKitIdType.java
deleted file mode 100644
index 3f9ddda..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultRenderKitIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultRenderKitIdType()
- * @model extendedMetaData="name='default-render-kit-id_._type' kind='simple'"
- * @generated
- */
-public interface DefaultRenderKitIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultRenderKitIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultRenderKitIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DefaultRenderKitIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValidatorsType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValidatorsType.java
deleted file mode 100644
index 18d4e8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValidatorsType.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Validators Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValidatorsType()
- * @model extendedMetaData="name='default-validators_._type' kind='elementOnly'"
- * @generated
- */
-public interface DefaultValidatorsType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Validator Id</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator Id</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Validator Id</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValidatorsType_ValidatorId()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType" containment="true"
-	 *        extendedMetaData="kind='element' name='validator-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getValidatorId();
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValidatorsType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DefaultValidatorsType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValueType.java
deleted file mode 100644
index 50950fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DefaultValueType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Default Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValueType()
- * @model extendedMetaData="name='default-value_._type' kind='simple'"
- * @generated
- */
-public interface DefaultValueType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValueType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDefaultValueType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DefaultValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DescriptionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DescriptionType.java
deleted file mode 100644
index 004c2aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DescriptionType.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Description Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType()
- * @model extendedMetaData="name='description_._type' kind='simple'"
- * @generated
- */
-public interface DescriptionType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lang</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lang</em>' attribute.
-	 * @see #setLang(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType_Lang()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Language"
-	 *        extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-	 * @generated
-	 */
-	String getLang();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lang</em>' attribute.
-	 * @see #getLang()
-	 * @generated
-	 */
-	void setLang(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDescriptionType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DescriptionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DisplayNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DisplayNameType.java
deleted file mode 100644
index 0e47ccc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DisplayNameType.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Display Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType()
- * @model extendedMetaData="name='display-name_._type' kind='simple'"
- * @generated
- */
-public interface DisplayNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lang</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lang</em>' attribute.
-	 * @see #setLang(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType_Lang()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Language"
-	 *        extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-	 * @generated
-	 */
-	String getLang();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lang</em>' attribute.
-	 * @see #getLang()
-	 * @generated
-	 */
-	void setLang(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDisplayNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // DisplayNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DocumentRoot.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DocumentRoot.java
deleted file mode 100644
index d6fe20b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DocumentRoot.java
+++ /dev/null
@@ -1,3208 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAbsoluteOrdering <em>Absolute Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehavior <em>Behavior</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorClass <em>Behavior Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorId <em>Behavior Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorExtension <em>Behavior Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValidators <em>Default Validators</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExceptionHandlerFactory <em>Exception Handler Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExternalContextFactory <em>External Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig <em>Faces Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIf <em>If</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrdering <em>Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrderingOrdering <em>Ordering Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOthers <em>Others</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPartialViewContextFactory <em>Partial View Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirectViewParam <em>Redirect View Param</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getResourceHandler <em>Resource Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSourceClass <em>Source Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventClass <em>System Event Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListener <em>System Event Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListenerClass <em>System Event Listener Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler <em>View Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVisitContextFactory <em>Visit Context Factory</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot()
- * @model extendedMetaData="name='' kind='mixed'"
- * @generated
- */
-public interface DocumentRoot extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Mixed</b></em>' attribute list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.util.FeatureMap.Entry}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mixed</em>' attribute list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Mixed</em>' attribute list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Mixed()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.EFeatureMapEntry" many="true"
-	 *        extendedMetaData="kind='elementWildcard' name=':mixed'"
-	 * @generated
-	 */
-	FeatureMap getMixed();
-
-    /**
-	 * Returns the value of the '<em><b>XMLNS Prefix Map</b></em>' map.
-	 * The key is of type {@link java.lang.String},
-	 * and the value is of type {@link java.lang.String},
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>XMLNS Prefix Map</em>' map isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>XMLNS Prefix Map</em>' map.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_XMLNSPrefixMap()
-	 * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry" keyType="java.lang.String" valueType="java.lang.String" transient="true"
-	 *        extendedMetaData="kind='attribute' name='xmlns:prefix'"
-	 * @generated
-	 */
-	EMap getXMLNSPrefixMap();
-
-    /**
-	 * Returns the value of the '<em><b>XSI Schema Location</b></em>' map.
-	 * The key is of type {@link java.lang.String},
-	 * and the value is of type {@link java.lang.String},
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>XSI Schema Location</em>' map isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>XSI Schema Location</em>' map.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_XSISchemaLocation()
-	 * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry" keyType="java.lang.String" valueType="java.lang.String" transient="true"
-	 *        extendedMetaData="kind='attribute' name='xsi:schemaLocation'"
-	 * @generated
-	 */
-	EMap getXSISchemaLocation();
-
-    /**
-	 * Returns the value of the '<em><b>Absolute Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Absolute Ordering</em>' containment reference.
-	 * @see #setAbsoluteOrdering(AbsoluteOrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AbsoluteOrdering()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='absolute-ordering' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AbsoluteOrderingType getAbsoluteOrdering();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAbsoluteOrdering <em>Absolute Ordering</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Absolute Ordering</em>' containment reference.
-	 * @see #getAbsoluteOrdering()
-	 * @generated
-	 */
-	void setAbsoluteOrdering(AbsoluteOrderingType value);
-
-				/**
-	 * Returns the value of the '<em><b>Action Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *  ==================== Subordinate
-	 *                 Elements ============================       The
-	 *                 "action-listener" element contains the fully
-	 *                 qualified class name     of the concrete ActionListener
-	 *                 implementation class that will be called     during the
-	 *                 Invoke Application phase of the request processing
-	 *                 lifecycle.     It must be of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Action Listener</em>' containment reference.
-	 * @see #setActionListener(ActionListenerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ActionListener()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='action-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ActionListenerType getActionListener();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener <em>Action Listener</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Action Listener</em>' containment reference.
-	 * @see #getActionListener()
-	 * @generated
-	 */
-	void setActionListener(ActionListenerType value);
-
-    /**
-	 * Returns the value of the '<em><b>Application</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *  ==================== Definition Elements
-	 *                 =============================       The
-	 *                 "application" element provides a mechanism to
-	 *                 define the various     per-application-singleton
-	 *                 implementation classes for a particular web
-	 *                 application that is utilizing JavaServer Faces.  For
-	 *                 nested elements     that are not specified, the JSF
-	 *                 implementation must provide a suitable     default. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Application</em>' containment reference.
-	 * @see #setApplication(ApplicationType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Application()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='application' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ApplicationType getApplication();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication <em>Application</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Application</em>' containment reference.
-	 * @see #getApplication()
-	 * @generated
-	 */
-	void setApplication(ApplicationType value);
-
-    /**
-	 * Returns the value of the '<em><b>Application Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "application-factory"
-	 *                 element contains the fully qualified class     name of
-	 *                 the concrete ApplicationFactory implementation class
-	 *                 that     will be called when
-	 *                 FactoryFinder.getFactory(APPLICATION_FACTORY) is
-	 *                 called. It must be of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Application Factory</em>' containment reference.
-	 * @see #setApplicationFactory(ApplicationFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ApplicationFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='application-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ApplicationFactoryType getApplicationFactory();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory <em>Application Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Application Factory</em>' containment reference.
-	 * @see #getApplicationFactory()
-	 * @generated
-	 */
-	void setApplicationFactory(ApplicationFactoryType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "attribute" element
-	 *                 represents a named, typed, value associated with     the
-	 *                 parent UIComponent via the generic attributes mechanism.
-	 *                 Attribute names must be unique within the scope of the
-	 *                 parent (or related)     component. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference.
-	 * @see #setAttribute(AttributeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Attribute()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeType getAttribute();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute <em>Attribute</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute</em>' containment reference.
-	 * @see #getAttribute()
-	 * @generated
-	 */
-	void setAttribute(AttributeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "attribute-class" element represents the Java type of the value
-	 *     associated with this attribute name.  It must be of type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Attribute Class</em>' containment reference.
-	 * @see #setAttributeClass(AttributeClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AttributeClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='attribute-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeClassType getAttributeClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass <em>Attribute Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Class</em>' containment reference.
-	 * @see #getAttributeClass()
-	 * @generated
-	 */
-	void setAttributeClass(AttributeClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       Extension element for attribute.
-	 *                 May contain implementation     specific content. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Attribute Extension</em>' containment reference.
-	 * @see #setAttributeExtension(AttributeExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AttributeExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='attribute-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeExtensionType getAttributeExtension();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension <em>Attribute Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Extension</em>' containment reference.
-	 * @see #getAttributeExtension()
-	 * @generated
-	 */
-	void setAttributeExtension(AttributeExtensionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "attribute-name"
-	 *                 element represents the name under which the
-	 *                 corresponding value will be stored, in the generic
-	 *                 attributes of the     UIComponent we are related to. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Attribute Name</em>' containment reference.
-	 * @see #setAttributeName(AttributeNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_AttributeName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='attribute-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AttributeNameType getAttributeName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName <em>Attribute Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Name</em>' containment reference.
-	 * @see #getAttributeName()
-	 * @generated
-	 */
-	void setAttributeName(AttributeNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Behavior</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Behavior</em>' containment reference.
-	 * @see #setBehavior(BehaviorType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Behavior()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='behavior' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorType getBehavior();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehavior <em>Behavior</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior</em>' containment reference.
-	 * @see #getBehavior()
-	 * @generated
-	 */
-	void setBehavior(BehaviorType value);
-
-				/**
-	 * Returns the value of the '<em><b>Behavior Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Behavior Class</em>' containment reference.
-	 * @see #setBehaviorClass(BehaviorClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_BehaviorClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='behavior-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorClassType getBehaviorClass();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorClass <em>Behavior Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior Class</em>' containment reference.
-	 * @see #getBehaviorClass()
-	 * @generated
-	 */
-	void setBehaviorClass(BehaviorClassType value);
-
-				/**
-	 * Returns the value of the '<em><b>Behavior Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Behavior Id</em>' containment reference.
-	 * @see #setBehaviorId(BehaviorIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_BehaviorId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='behavior-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorIdType getBehaviorId();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorId <em>Behavior Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior Id</em>' containment reference.
-	 * @see #getBehaviorId()
-	 * @generated
-	 */
-	void setBehaviorId(BehaviorIdType value);
-
-				/**
-	 * Returns the value of the '<em><b>Behavior Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Behavior Extension</em>' containment reference.
-	 * @see #setBehaviorExtension(BehaviorExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_BehaviorExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='behavior-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	BehaviorExtensionType getBehaviorExtension();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorExtension <em>Behavior Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Behavior Extension</em>' containment reference.
-	 * @see #getBehaviorExtension()
-	 * @generated
-	 */
-	void setBehaviorExtension(BehaviorExtensionType value);
-
-				/**
-	 * Returns the value of the '<em><b>Component</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "component" element
-	 *                 represents a concrete UIComponent implementation
-	 *                 class that should be registered under the specified type
-	 *                 identifier,     along with its associated properties and
-	 *                 attributes.  Component types must     be unique within
-	 *                 the entire web application.      Nested
-	 *                 "attribute" elements identify generic
-	 *                 attributes that are recognized     by the implementation
-	 *                 logic of this component.  Nested "property"
-	 *                 elements     identify JavaBeans properties of the
-	 *                 component class that may be exposed     for manipulation
-	 *                 via tools. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Component</em>' containment reference.
-	 * @see #setComponent(ComponentType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Component()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='component' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentType getComponent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent <em>Component</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component</em>' containment reference.
-	 * @see #getComponent()
-	 * @generated
-	 */
-	void setComponent(ComponentType value);
-
-    /**
-	 * Returns the value of the '<em><b>Component Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "component-class"
-	 *                 element represents the fully qualified class name     of
-	 *                 a concrete UIComponent implementation class.  It must be
-	 *                 of     type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Component Class</em>' containment reference.
-	 * @see #setComponentClass(ComponentClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='component-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentClassType getComponentClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass <em>Component Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Class</em>' containment reference.
-	 * @see #getComponentClass()
-	 * @generated
-	 */
-	void setComponentClass(ComponentClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Component Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       Extension element for component.
-	 *                 May contain implementation     specific content. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Component Extension</em>' containment reference.
-	 * @see #setComponentExtension(ComponentExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='component-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentExtensionType getComponentExtension();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension <em>Component Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Extension</em>' containment reference.
-	 * @see #getComponentExtension()
-	 * @generated
-	 */
-	void setComponentExtension(ComponentExtensionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Component Family</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "component-family" element represents the component family for
-	 *     which the Renderer represented by the parent "renderer" element will be
-	 *     used.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Component Family</em>' containment reference.
-	 * @see #setComponentFamily(ComponentFamilyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentFamily()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='component-family' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentFamilyType getComponentFamily();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily <em>Component Family</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Family</em>' containment reference.
-	 * @see #getComponentFamily()
-	 * @generated
-	 */
-	void setComponentFamily(ComponentFamilyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Component Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "component-type"
-	 *                 element represents the name under which the
-	 *                 corresponding UIComponent class should be registered. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Component Type</em>' containment reference.
-	 * @see #setComponentType(ComponentTypeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ComponentType()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='component-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentTypeType getComponentType();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType <em>Component Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Type</em>' containment reference.
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	void setComponentType(ComponentTypeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "converter" element
-	 *                 represents a concrete Converter implementation     class
-	 *                 that should be registered under the specified converter
-	 *                 identifier.     Converter identifiers must be unique
-	 *                 within the entire web application.      Nested
-	 *                 "attribute" elements identify generic
-	 *                 attributes that may be     configured on the
-	 *                 corresponding UIComponent in order to affect the
-	 *                 operation of the Converter.  Nested "property"
-	 *                 elements identify JavaBeans     properties of the
-	 *                 Converter implementation class that may be configured
-	 *                 to affect the operation of the Converter. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Converter</em>' containment reference.
-	 * @see #setConverter(ConverterType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Converter()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='converter' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterType getConverter();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter <em>Converter</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter</em>' containment reference.
-	 * @see #getConverter()
-	 * @generated
-	 */
-	void setConverter(ConverterType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "converter-class" element represents the fully qualified class name
-	 *     of a concrete Converter implementation class.  It must be of
-	 *     type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Converter Class</em>' containment reference.
-	 * @see #setConverterClass(ConverterClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ConverterClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='converter-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterClassType getConverterClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass <em>Converter Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter Class</em>' containment reference.
-	 * @see #getConverterClass()
-	 * @generated
-	 */
-	void setConverterClass(ConverterClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter For Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "converter-for-class" element represents the fully qualified class name
-	 *     for which a Converter class will be registered.  It must be of
-	 *     type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Converter For Class</em>' containment reference.
-	 * @see #setConverterForClass(ConverterForClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ConverterForClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='converter-for-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterForClassType getConverterForClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass <em>Converter For Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter For Class</em>' containment reference.
-	 * @see #getConverterForClass()
-	 * @generated
-	 */
-	void setConverterForClass(ConverterForClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Converter Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "converter-id" element represents the identifier under which the
-	 *     corresponding Converter class should be registered.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Converter Id</em>' containment reference.
-	 * @see #setConverterId(ConverterIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ConverterId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='converter-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ConverterIdType getConverterId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId <em>Converter Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Converter Id</em>' containment reference.
-	 * @see #getConverterId()
-	 * @generated
-	 */
-	void setConverterId(ConverterIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Default Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       The "default-locale"
-	 *                 element declares the default locale for this
-	 *                 application instance.  It must be specified as
-	 *                 :language:[_:country:[_:variant:]] without the colons,
-	 *                 for example      "ja_JP_SJIS".  The separators
-	 *                 between the segments may be '-' or
-	 *                 '_'. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Locale</em>' containment reference.
-	 * @see #setDefaultLocale(DefaultLocaleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultLocale()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='default-locale' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultLocaleType getDefaultLocale();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale <em>Default Locale</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Locale</em>' containment reference.
-	 * @see #getDefaultLocale()
-	 * @generated
-	 */
-	void setDefaultLocale(DefaultLocaleType value);
-
-    /**
-	 * Returns the value of the '<em><b>Default Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "default-render-kit-id" element allows the application to define
-	 *     a renderkit to be used other than the standard one. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Render Kit Id</em>' containment reference.
-	 * @see #setDefaultRenderKitId(DefaultRenderKitIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultRenderKitId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='default-render-kit-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultRenderKitIdType getDefaultRenderKitId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId <em>Default Render Kit Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Render Kit Id</em>' containment reference.
-	 * @see #getDefaultRenderKitId()
-	 * @generated
-	 */
-	void setDefaultRenderKitId(DefaultRenderKitIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Default Validators</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Validators</em>' containment reference.
-	 * @see #setDefaultValidators(DefaultValidatorsType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultValidators()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='default-validators' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultValidatorsType getDefaultValidators();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValidators <em>Default Validators</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Validators</em>' containment reference.
-	 * @see #getDefaultValidators()
-	 * @generated
-	 */
-	void setDefaultValidators(DefaultValidatorsType value);
-
-				/**
-	 * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "default-value" contains the value for the property or attribute
-	 *     in which this element resides.  This value differs from the
-	 *     "suggested-value" in that the property or attribute must take the
-	 *     value, whereas in "suggested-value" taking the value is optional.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Default Value</em>' containment reference.
-	 * @see #setDefaultValue(DefaultValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DefaultValue()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='default-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultValueType getDefaultValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue <em>Default Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Value</em>' containment reference.
-	 * @see #getDefaultValue()
-	 * @generated
-	 */
-	void setDefaultValue(DefaultValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "description" element
-	 *                 contains a textual description of the element     it is
-	 *                 nested in, optionally flagged with a language code using
-	 *                 the     "xml:lang" attribute. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference.
-	 * @see #setDescription(DescriptionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Description()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DescriptionType getDescription();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription <em>Description</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Description</em>' containment reference.
-	 * @see #getDescription()
-	 * @generated
-	 */
-	void setDescription(DescriptionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "display-name" element
-	 *                 is a short descriptive name describing the     entity
-	 *                 associated with the element it is nested in, intended to
-	 *                 be     displayed by tools, and optionally flagged with a
-	 *                 language code using     the "xml:lang"
-	 *                 attribute. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference.
-	 * @see #setDisplayName(DisplayNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_DisplayName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DisplayNameType getDisplayName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName <em>Display Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Display Name</em>' containment reference.
-	 * @see #getDisplayName()
-	 * @generated
-	 */
-	void setDisplayName(DisplayNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Exception Handler Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Exception Handler Factory</em>' containment reference.
-	 * @see #setExceptionHandlerFactory(ExceptionHandlerFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ExceptionHandlerFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='exception-handler-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ExceptionHandlerFactoryType getExceptionHandlerFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExceptionHandlerFactory <em>Exception Handler Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Exception Handler Factory</em>' containment reference.
-	 * @see #getExceptionHandlerFactory()
-	 * @generated
-	 */
-	void setExceptionHandlerFactory(ExceptionHandlerFactoryType value);
-
-				/**
-	 * Returns the value of the '<em><b>External Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>External Context Factory</em>' containment reference.
-	 * @see #setExternalContextFactory(ExternalContextFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ExternalContextFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='external-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ExternalContextFactoryType getExternalContextFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExternalContextFactory <em>External Context Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>External Context Factory</em>' containment reference.
-	 * @see #getExternalContextFactory()
-	 * @generated
-	 */
-	void setExternalContextFactory(ExternalContextFactoryType value);
-
-				/**
-	 * Returns the value of the '<em><b>Faces Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *  ==================== Top Level Elements
-	 *                 ==============================       The
-	 *                 "faces-config" element is the root of the
-	 *                 configuration information     hierarchy, and contains
-	 *                 nested elements for all of the other configuration
-	 *                 settings. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Faces Config</em>' containment reference.
-	 * @see #setFacesConfig(FacesConfigType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacesConfig()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='faces-config' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacesConfigType getFacesConfig();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig <em>Faces Config</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Faces Config</em>' containment reference.
-	 * @see #getFacesConfig()
-	 * @generated
-	 */
-	void setFacesConfig(FacesConfigType value);
-
-    /**
-	 * Returns the value of the '<em><b>Faces Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The
-	 *                 "faces-context-factory" element contains the
-	 *                 fully qualified     class name of the concrete
-	 *                 FacesContextFactory implementation class     that will
-	 *                 be called when
-	 *                 FactoryFinder.getFactory(FACES_CONTEXT_FACTORY) is
-	 *                 called. It must     be of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Faces Context Factory</em>' containment reference.
-	 * @see #setFacesContextFactory(FacesContextFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacesContextFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='faces-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacesContextFactoryType getFacesContextFactory();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory <em>Faces Context Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Faces Context Factory</em>' containment reference.
-	 * @see #getFacesContextFactory()
-	 * @generated
-	 */
-	void setFacesContextFactory(FacesContextFactoryType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *    Define the name and other design-time information for a facet that is
-	 *    associated with a renderer or a component.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Facet</em>' containment reference.
-	 * @see #setFacet(FacetType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Facet()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='facet' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacetType getFacet();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet <em>Facet</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Facet</em>' containment reference.
-	 * @see #getFacet()
-	 * @generated
-	 */
-	void setFacet(FacetType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     Extension element for facet.  May contain implementation
-	 *     specific content.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Facet Extension</em>' containment reference.
-	 * @see #setFacetExtension(FacetExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacetExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='facet-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacetExtensionType getFacetExtension();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension <em>Facet Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Facet Extension</em>' containment reference.
-	 * @see #getFacetExtension()
-	 * @generated
-	 */
-	void setFacetExtension(FacetExtensionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "facet-name" element represents the facet name under which a
-	 *     UIComponent will be added to its parent.  It must be of type
-	 *     "Identifier".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Facet Name</em>' containment reference.
-	 * @see #setFacetName(FacetNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FacetName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='facet-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacetNameType getFacetName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName <em>Facet Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Facet Name</em>' containment reference.
-	 * @see #getFacetName()
-	 * @generated
-	 */
-	void setFacetName(FacetNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "factory" element
-	 *                 provides a mechanism to define the various     Factories
-	 *                 that comprise parts of the implementation of JavaServer
-	 *                 Faces.  For nested elements that are not specified, the
-	 *                 JSF     implementation must provide a suitable default. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Factory</em>' containment reference.
-	 * @see #setFactory(FactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Factory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FactoryType getFactory();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory <em>Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Factory</em>' containment reference.
-	 * @see #getFactory()
-	 * @generated
-	 */
-	void setFactory(FactoryType value);
-
-    /**
-	 * Returns the value of the '<em><b>From Action</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "from-action" element contains an action reference expression
-	 *     that must have been executed (by the default ActionListener for handling
-	 *     application level events) in order to select this navigation rule.  If
-	 *     not specified, this rule will be relevant no matter which action reference
-	 *     was executed (or if no action reference was executed).
-	 * 
-	 *     This value must be of type "Action".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>From Action</em>' containment reference.
-	 * @see #setFromAction(FromActionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FromAction()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='from-action' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromActionType getFromAction();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction <em>From Action</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From Action</em>' containment reference.
-	 * @see #getFromAction()
-	 * @generated
-	 */
-	void setFromAction(FromActionType value);
-
-    /**
-	 * Returns the value of the '<em><b>From Outcome</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "from-outcome" element contains a logical outcome string returned
-	 *     by the execution of an application action method selected via an
-	 *     "actionRef" property (or a literal value specified by an "action"
-	 *     property) of a UICommand component.  If specified, this rule will be
-	 *     relevant only if the outcome value matches this element's value.  If
-	 *     not specified, this rule will be relevant no matter what the outcome
-	 *     value was.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>From Outcome</em>' containment reference.
-	 * @see #setFromOutcome(FromOutcomeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FromOutcome()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='from-outcome' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromOutcomeType getFromOutcome();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome <em>From Outcome</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From Outcome</em>' containment reference.
-	 * @see #getFromOutcome()
-	 * @generated
-	 */
-	void setFromOutcome(FromOutcomeType value);
-
-    /**
-	 * Returns the value of the '<em><b>From View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "from-view-id" element contains the view identifier of the view
-	 *     for which the containing navigation rule is relevant.  If no
-	 *     "from-view" element is specified, this rule applies to navigation
-	 *     decisions on all views.  If this element is not specified, a value
-	 *     of "*" is assumed, meaning that this navigation rule applies to all
-	 *     views.
-	 * 
-	 *     This value must be of type "ViewIdPattern".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>From View Id</em>' containment reference.
-	 * @see #setFromViewId(FromViewIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_FromViewId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='from-view-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromViewIdType getFromViewId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId <em>From View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From View Id</em>' containment reference.
-	 * @see #getFromViewId()
-	 * @generated
-	 */
-	void setFromViewId(FromViewIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "icon" element
-	 *                 contains "small-icon" and
-	 *                 "large-icon" elements that     specify the
-	 *                 resoruce paths for small and large GIF or JPG icon
-	 *                 images     used to represent the parent element in a GUI
-	 *                 tool. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference.
-	 * @see #setIcon(IconType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Icon()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	IconType getIcon();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon <em>Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Icon</em>' containment reference.
-	 * @see #getIcon()
-	 * @generated
-	 */
-	void setIcon(IconType value);
-
-    /**
-	 * Returns the value of the '<em><b>If</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>If</em>' containment reference.
-	 * @see #setIf(IfType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_If()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='if' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	IfType getIf();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIf <em>If</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>If</em>' containment reference.
-	 * @see #getIf()
-	 * @generated
-	 */
-	void setIf(IfType value);
-
-				/**
-	 * Returns the value of the '<em><b>Key</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "key" element is the String representation of a map key that
-	 *     will be stored in a managed property of type java.util.Map.  
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Key</em>' containment reference.
-	 * @see #setKey(KeyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Key()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='key' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	KeyType getKey();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey <em>Key</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key</em>' containment reference.
-	 * @see #getKey()
-	 * @generated
-	 */
-	void setKey(KeyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Key Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "key-class" element defines the Java type to which each "key"
-	 *     element in a set of "map-entry" elements will be converted to.  It
-	 *     must be of type "ClassName".  If omitted, "java.lang.String"
-	 *     is assumed.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Key Class</em>' containment reference.
-	 * @see #setKeyClass(KeyClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_KeyClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='key-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	KeyClassType getKeyClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass <em>Key Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key Class</em>' containment reference.
-	 * @see #getKeyClass()
-	 * @generated
-	 */
-	void setKeyClass(KeyClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Large Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "large-icon" element contains the resource path to a large (32x32)
-	 *     icon image.  The image may be in either GIF or JPG format.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Large Icon</em>' containment reference.
-	 * @see #setLargeIcon(LargeIconType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_LargeIcon()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='large-icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	LargeIconType getLargeIcon();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon <em>Large Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Large Icon</em>' containment reference.
-	 * @see #getLargeIcon()
-	 * @generated
-	 */
-	void setLargeIcon(LargeIconType value);
-
-    /**
-	 * Returns the value of the '<em><b>Lifecycle</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "lifecycle" element
-	 *                 provides a mechanism to specify     modifications to the
-	 *                 behaviour of the default Lifecycle     implementation
-	 *                 for this web application. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Lifecycle</em>' containment reference.
-	 * @see #setLifecycle(LifecycleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Lifecycle()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='lifecycle' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	LifecycleType getLifecycle();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle <em>Lifecycle</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lifecycle</em>' containment reference.
-	 * @see #getLifecycle()
-	 * @generated
-	 */
-	void setLifecycle(LifecycleType value);
-
-    /**
-	 * Returns the value of the '<em><b>Lifecycle Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "lifecycle-factory"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete LifecycleFactory implementation class that
-	 *                 will be called     when
-	 *                 FactoryFinder.getFactory(LIFECYCLE_FACTORY) is called.
-	 *                 It must be      of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Lifecycle Factory</em>' containment reference.
-	 * @see #setLifecycleFactory(LifecycleFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_LifecycleFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='lifecycle-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	LifecycleFactoryType getLifecycleFactory();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory <em>Lifecycle Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lifecycle Factory</em>' containment reference.
-	 * @see #getLifecycleFactory()
-	 * @generated
-	 */
-	void setLifecycleFactory(LifecycleFactoryType value);
-
-    /**
-	 * Returns the value of the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "list-entries" element
-	 *                 represents a set of initialization     elements for a
-	 *                 managed property that is a java.util.List or an
-	 *                 array.  In the former case, the "value-class"
-	 *                 element can optionally     be used to declare the Java
-	 *                 type to which each value should be     converted before
-	 *                 adding it to the Collection. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>List Entries</em>' containment reference.
-	 * @see #setListEntries(ListEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ListEntries()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='list-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ListEntriesType getListEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries <em>List Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>List Entries</em>' containment reference.
-	 * @see #getListEntries()
-	 * @generated
-	 */
-	void setListEntries(ListEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>Locale Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       The "locale-config"
-	 *                 element allows the app developer to declare the
-	 *                 supported locales for this application.   
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Locale Config</em>' containment reference.
-	 * @see #setLocaleConfig(LocaleConfigType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_LocaleConfig()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='locale-config' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	LocaleConfigType getLocaleConfig();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig <em>Locale Config</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Locale Config</em>' containment reference.
-	 * @see #getLocaleConfig()
-	 * @generated
-	 */
-	void setLocaleConfig(LocaleConfigType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "managed-bean" element
-	 *                 represents a JavaBean, of a particular class,     that
-	 *                 will be dynamically instantiated at runtime (by the
-	 *                 default     VariableResolver implementation) if it is
-	 *                 referenced as the first element     of a value reference
-	 *                 expression, and no corresponding bean can be
-	 *                 identified in any scope.  In addition to the creation of
-	 *                 the managed bean,     and the optional storing of it
-	 *                 into the specified scope, the nested
-	 *                 managed-property elements can be used to initialize the
-	 *                 contents of     settable JavaBeans properties of the
-	 *                 created instance. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Managed Bean</em>' containment reference.
-	 * @see #setManagedBean(ManagedBeanType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBean()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='managed-bean' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanType getManagedBean();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean <em>Managed Bean</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean</em>' containment reference.
-	 * @see #getManagedBean()
-	 * @generated
-	 */
-	void setManagedBean(ManagedBeanType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "managed-bean-class" element represents the fully qualified class
-	 *     name of the Java class that will be used to instantiate a new instance
-	 *     if creation of the specified managed bean is requested.  It must be of
-	 *     type "ClassName".
-	 * 
-	 *     The specified class must conform to standard JavaBeans conventions.
-	 *     In particular, it must have a public zero-arguments constructor, and
-	 *     zero or more public property setters.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Managed Bean Class</em>' containment reference.
-	 * @see #setManagedBeanClass(ManagedBeanClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBeanClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanClassType getManagedBeanClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass <em>Managed Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Class</em>' containment reference.
-	 * @see #getManagedBeanClass()
-	 * @generated
-	 */
-	void setManagedBeanClass(ManagedBeanClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "managed-bean-name" element represents the attribute name under
-	 *     which a managed bean will be searched for, as well as stored (unless
-	 *     the "managed-bean-scope" value is "none").  It must be of type
-	 *     "Identifier".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Managed Bean Name</em>' containment reference.
-	 * @see #setManagedBeanName(ManagedBeanNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBeanName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanNameType getManagedBeanName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName <em>Managed Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Name</em>' containment reference.
-	 * @see #getManagedBeanName()
-	 * @generated
-	 */
-	void setManagedBeanName(ManagedBeanNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Scope</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "managed-bean-scope" element represents the scope into which a newly
-	 *     created instance of the specified managed bean will be stored (unless
-	 *     the value is "none").  It must be of type "ScopeOrNone".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Managed Bean Scope</em>' containment reference.
-	 * @see #setManagedBeanScope(ManagedBeanScopeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedBeanScope()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-scope' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanScopeType getManagedBeanScope();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope <em>Managed Bean Scope</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Scope</em>' containment reference.
-	 * @see #getManagedBeanScope()
-	 * @generated
-	 */
-	void setManagedBeanScope(ManagedBeanScopeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Property</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "managed-property"
-	 *                 element represents an individual property of a
-	 *                 managed bean that will be configured to the specified
-	 *                 value (or value set)     if the corresponding managed
-	 *                 bean is automatically created. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Managed Property</em>' containment reference.
-	 * @see #setManagedProperty(ManagedPropertyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ManagedProperty()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='managed-property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedPropertyType getManagedProperty();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty <em>Managed Property</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Property</em>' containment reference.
-	 * @see #getManagedProperty()
-	 * @generated
-	 */
-	void setManagedProperty(ManagedPropertyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "map-entries' element
-	 *                 represents a set of key-entry pairs that     will be
-	 *                 added to the computed value of a managed property of
-	 *                 type     java.util.Map.  In addition, the Java class
-	 *                 types of the key and entry     values may be optionally
-	 *                 declared. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Map Entries</em>' containment reference.
-	 * @see #setMapEntries(MapEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_MapEntries()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='map-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MapEntriesType getMapEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries <em>Map Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Map Entries</em>' containment reference.
-	 * @see #getMapEntries()
-	 * @generated
-	 */
-	void setMapEntries(MapEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>Map Entry</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "map-entry" element
-	 *                 reprsents a single key-entry pair that     will be added
-	 *                 to the computed value of a managed property of type
-	 *                 java.util.Map. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Map Entry</em>' containment reference.
-	 * @see #setMapEntry(MapEntryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_MapEntry()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='map-entry' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MapEntryType getMapEntry();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry <em>Map Entry</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Map Entry</em>' containment reference.
-	 * @see #getMapEntry()
-	 * @generated
-	 */
-	void setMapEntry(MapEntryType value);
-
-    /**
-	 * Returns the value of the '<em><b>Message Bundle</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The base name of a resource bundle
-	 *                 representing the message resources     for this
-	 *                 application.  See the JavaDocs for the
-	 *                 "java.util.ResourceBundle"     class for more
-	 *                 information on the syntax of resource bundle names. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Message Bundle</em>' containment reference.
-	 * @see #setMessageBundle(MessageBundleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_MessageBundle()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='message-bundle' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MessageBundleType getMessageBundle();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle <em>Message Bundle</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Message Bundle</em>' containment reference.
-	 * @see #getMessageBundle()
-	 * @generated
-	 */
-	void setMessageBundle(MessageBundleType value);
-
-    /**
-	 * Returns the value of the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Name</em>' containment reference.
-	 * @see #setName(NameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Name()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NameType getName();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getName <em>Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' containment reference.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(NameType value);
-
-				/**
-	 * Returns the value of the '<em><b>Navigation Case</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "navigation-case"
-	 *                 element describes a particular combination of
-	 *                 conditions that must match for this case to be executed,
-	 *                 and the     view id of the component tree that should be
-	 *                 selected next. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Navigation Case</em>' containment reference.
-	 * @see #setNavigationCase(NavigationCaseType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NavigationCase()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='navigation-case' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NavigationCaseType getNavigationCase();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase <em>Navigation Case</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Navigation Case</em>' containment reference.
-	 * @see #getNavigationCase()
-	 * @generated
-	 */
-	void setNavigationCase(NavigationCaseType value);
-
-    /**
-	 * Returns the value of the '<em><b>Navigation Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "navigation-handler"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete NavigationHandler implementation class that
-	 *                 will be called     during the Invoke Application phase
-	 *                 of the request processing lifecycle,     if the default
-	 *                 ActionListener (provided by the JSF implementation) is
-	 *                 used.     It must be of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Navigation Handler</em>' containment reference.
-	 * @see #setNavigationHandler(NavigationHandlerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NavigationHandler()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='navigation-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NavigationHandlerType getNavigationHandler();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler <em>Navigation Handler</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Navigation Handler</em>' containment reference.
-	 * @see #getNavigationHandler()
-	 * @generated
-	 */
-	void setNavigationHandler(NavigationHandlerType value);
-
-    /**
-	 * Returns the value of the '<em><b>Navigation Rule</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "navigation-rule"
-	 *                 element represents an individual decision rule     that
-	 *                 will be utilized by the default NavigationHandler
-	 *                 implementation to make decisions on what view should be
-	 *                 displayed     next, based on the view id being
-	 *                 processed. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Navigation Rule</em>' containment reference.
-	 * @see #setNavigationRule(NavigationRuleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NavigationRule()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='navigation-rule' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NavigationRuleType getNavigationRule();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule <em>Navigation Rule</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Navigation Rule</em>' containment reference.
-	 * @see #getNavigationRule()
-	 * @generated
-	 */
-	void setNavigationRule(NavigationRuleType value);
-
-    /**
-	 * Returns the value of the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "null-value" element
-	 *                 indicates that the managed property in which we     are
-	 *                 nested will be explicitly set to null if our managed
-	 *                 bean is     automatically created.  This is different
-	 *                 from omitting the managed     property element entirely,
-	 *                 which will cause no property setter to be     called for
-	 *                 this property.      The "null-value" element
-	 *                 can only be used when the associated
-	 *                 "property-class" identifies a Java class, not
-	 *                 a Java primitive. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Null Value</em>' containment reference.
-	 * @see #setNullValue(NullValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_NullValue()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NullValueType getNullValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue <em>Null Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Null Value</em>' containment reference.
-	 * @see #getNullValue()
-	 * @generated
-	 */
-	void setNullValue(NullValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Ordering</em>' containment reference.
-	 * @see #setOrdering(OrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Ordering()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ordering' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingType getOrdering();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrdering <em>Ordering</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Ordering</em>' containment reference.
-	 * @see #getOrdering()
-	 * @generated
-	 */
-	void setOrdering(OrderingType value);
-
-				/**
-	 * Returns the value of the '<em><b>Ordering Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Ordering Ordering</em>' containment reference.
-	 * @see #setOrderingOrdering(OrderingOrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_OrderingOrdering()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='ordering-ordering' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOrderingType getOrderingOrdering();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrderingOrdering <em>Ordering Ordering</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Ordering Ordering</em>' containment reference.
-	 * @see #getOrderingOrdering()
-	 * @generated
-	 */
-	void setOrderingOrdering(OrderingOrderingType value);
-
-				/**
-	 * Returns the value of the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Others</em>' containment reference.
-	 * @see #setOthers(OrderingOthersType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Others()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='others' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOthersType getOthers();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOthers <em>Others</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Others</em>' containment reference.
-	 * @see #getOthers()
-	 * @generated
-	 */
-	void setOthers(OrderingOthersType value);
-
-				/**
-	 * Returns the value of the '<em><b>Partial View Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Partial View Context Factory</em>' containment reference.
-	 * @see #setPartialViewContextFactory(PartialViewContextFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PartialViewContextFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='partial-view-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PartialViewContextFactoryType getPartialViewContextFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPartialViewContextFactory <em>Partial View Context Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Partial View Context Factory</em>' containment reference.
-	 * @see #getPartialViewContextFactory()
-	 * @generated
-	 */
-	void setPartialViewContextFactory(PartialViewContextFactoryType value);
-
-				/**
-	 * Returns the value of the '<em><b>Phase Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *  The "phase-listener" element
-	 *                 contains the fully qualified class name of the concrete
-	 *                 PhaseListener implementation class that will be
-	 *                 registered on the Lifecycle. It must be of type
-	 *                 "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Phase Listener</em>' containment reference.
-	 * @see #setPhaseListener(PhaseListenerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PhaseListener()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='phase-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PhaseListenerType getPhaseListener();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener <em>Phase Listener</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Phase Listener</em>' containment reference.
-	 * @see #getPhaseListener()
-	 * @generated
-	 */
-	void setPhaseListener(PhaseListenerType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "property" element
-	 *                 represents a JavaBean property of the Java class
-	 *                 represented by our parent element.      Property names
-	 *                 must be unique within the scope of the Java class
-	 *                 that is represented by the parent element, and must
-	 *                 correspond to     property names that will be recognized
-	 *                 when performing introspection     against that class via
-	 *                 java.beans.Introspector. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Property</em>' containment reference.
-	 * @see #setProperty(PropertyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Property()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyType getProperty();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty <em>Property</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property</em>' containment reference.
-	 * @see #getProperty()
-	 * @generated
-	 */
-	void setProperty(PropertyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "property-class" element represents the Java type of the value
-	 *     associated with this property name.  It must be of type "JavaType".
-	 *     If not specified, it can be inferred from existing classes; however,
-	 *     this element should be specified if the configuration file is going
-	 *     to be the source for generating the corresponding classes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Property Class</em>' containment reference.
-	 * @see #setPropertyClass(PropertyClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='property-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyClassType getPropertyClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass <em>Property Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Class</em>' containment reference.
-	 * @see #getPropertyClass()
-	 * @generated
-	 */
-	void setPropertyClass(PropertyClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       Extension element for property.
-	 *                 May contain implementation     specific content. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Property Extension</em>' containment reference.
-	 * @see #setPropertyExtension(PropertyExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='property-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyExtensionType getPropertyExtension();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension <em>Property Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Extension</em>' containment reference.
-	 * @see #getPropertyExtension()
-	 * @generated
-	 */
-	void setPropertyExtension(PropertyExtensionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "property-name" element represents the JavaBeans property name
-	 *     under which the corresponding value may be stored.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Property Name</em>' containment reference.
-	 * @see #setPropertyName(PropertyNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='property-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyNameType getPropertyName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName <em>Property Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Name</em>' containment reference.
-	 * @see #getPropertyName()
-	 * @generated
-	 */
-	void setPropertyName(PropertyNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Resolver</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "property-resolver"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete PropertyResolver implementation class that
-	 *                 will be used     during the processing of value
-	 *                 reference expressions.     It must be of type
-	 *                 "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Property Resolver</em>' containment reference.
-	 * @see #setPropertyResolver(PropertyResolverType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_PropertyResolver()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='property-resolver' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyResolverType getPropertyResolver();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver <em>Property Resolver</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Resolver</em>' containment reference.
-	 * @see #getPropertyResolver()
-	 * @generated
-	 */
-	void setPropertyResolver(PropertyResolverType value);
-
-    /**
-	 * Returns the value of the '<em><b>Redirect</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "redirect" element
-	 *                 indicates that navigation to the specified
-	 *                 "to-view-id" should be accomplished by
-	 *                 performing an HTTP redirect     rather than the usual
-	 *                 ViewHandler mechanisms. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Redirect</em>' containment reference.
-	 * @see #setRedirect(RedirectType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Redirect()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='redirect' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RedirectType getRedirect();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect <em>Redirect</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Redirect</em>' containment reference.
-	 * @see #getRedirect()
-	 * @generated
-	 */
-	void setRedirect(RedirectType value);
-
-    /**
-	 * Returns the value of the '<em><b>Redirect View Param</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Redirect View Param</em>' containment reference.
-	 * @see #setRedirectViewParam(RedirectViewParamType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RedirectViewParam()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='view-param' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RedirectViewParamType getRedirectViewParam();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirectViewParam <em>Redirect View Param</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Redirect View Param</em>' containment reference.
-	 * @see #getRedirectViewParam()
-	 * @generated
-	 */
-	void setRedirectViewParam(RedirectViewParamType value);
-
-				/**
-	 * Returns the value of the '<em><b>Referenced Bean</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "referenced-bean"
-	 *                 element represents at design time the promise     that a
-	 *                 Java object of the specified type will exist at runtime
-	 *                 in some     scope, under the specified key.  This can be
-	 *                 used by design time tools     to construct user
-	 *                 interface dialogs based on the properties of the
-	 *                 specified class.  The presence or absence of a
-	 *                 referenced bean     element has no impact on the
-	 *                 JavaServer Faces runtime environment     inside a web
-	 *                 application. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Referenced Bean</em>' containment reference.
-	 * @see #setReferencedBean(ReferencedBeanType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ReferencedBean()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ReferencedBeanType getReferencedBean();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean <em>Referenced Bean</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced Bean</em>' containment reference.
-	 * @see #getReferencedBean()
-	 * @generated
-	 */
-	void setReferencedBean(ReferencedBeanType value);
-
-    /**
-	 * Returns the value of the '<em><b>Referenced Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "referenced-bean-class" element represents the fully qualified class
-	 *     name of the Java class (either abstract or concrete) or Java interface
-	 *     implemented by the corresponding referenced bean.  It must be of type
-	 *     "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Referenced Bean Class</em>' containment reference.
-	 * @see #setReferencedBeanClass(ReferencedBeanClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ReferencedBeanClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ReferencedBeanClassType getReferencedBeanClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass <em>Referenced Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced Bean Class</em>' containment reference.
-	 * @see #getReferencedBeanClass()
-	 * @generated
-	 */
-	void setReferencedBeanClass(ReferencedBeanClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Referenced Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "referenced-bean-name" element represents the attribute name under
-	 *     which the corresponding referenced bean may be assumed to be stored,
-	 *     in one of the scopes defined by the "Scope" type.  It must be of type
-	 *     "Identifier".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Referenced Bean Name</em>' containment reference.
-	 * @see #setReferencedBeanName(ReferencedBeanNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ReferencedBeanName()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ReferencedBeanNameType getReferencedBeanName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName <em>Referenced Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced Bean Name</em>' containment reference.
-	 * @see #getReferencedBeanName()
-	 * @generated
-	 */
-	void setReferencedBeanName(ReferencedBeanNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "renderer" element
-	 *                 represents a concrete Renderer implementation     class
-	 *                 that should be registered under the specified type
-	 *                 identifier,     in the RenderKit associated with the
-	 *                 parent render-kit element.  Renderer     types must be
-	 *                 unique within the RenderKit associated with the parent
-	 *                 "render-kit" element.      Nested
-	 *                 "attribute" elements identify generic
-	 *                 component attributes that     are recognized by this
-	 *                 renderer.  Nested "supported-component-type"
-	 *                 and     "supported-component-class" elements
-	 *                 identify supported component classes,     by their type
-	 *                 identifiers or the implementation class name,
-	 *                 respectively,     that are supported by this Renderer. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Renderer</em>' containment reference.
-	 * @see #setRenderer(RendererType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Renderer()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='renderer' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererType getRenderer();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer <em>Renderer</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer</em>' containment reference.
-	 * @see #getRenderer()
-	 * @generated
-	 */
-	void setRenderer(RendererType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "renderer-class" element represents the fully qualified class name
-	 *     of a concrete Renderer implementation class.  It must be of
-	 *     type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Renderer Class</em>' containment reference.
-	 * @see #setRendererClass(RendererClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RendererClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='renderer-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererClassType getRendererClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass <em>Renderer Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer Class</em>' containment reference.
-	 * @see #getRendererClass()
-	 * @generated
-	 */
-	void setRendererClass(RendererClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       Extension element for renderer.
-	 *                 May contain implementation     specific content. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Renderer Extension</em>' containment reference.
-	 * @see #setRendererExtension(RendererExtensionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RendererExtension()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='renderer-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererExtensionType getRendererExtension();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension <em>Renderer Extension</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer Extension</em>' containment reference.
-	 * @see #getRendererExtension()
-	 * @generated
-	 */
-	void setRendererExtension(RendererExtensionType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "renderer-type" element represents a renderer type identifier for the
-	 *     Renderer represented by the parent "renderer" element.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Renderer Type</em>' containment reference.
-	 * @see #setRendererType(RendererTypeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RendererType()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='renderer-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererTypeType getRendererType();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType <em>Renderer Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer Type</em>' containment reference.
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	void setRendererType(RendererTypeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "render-kit" element
-	 *                 represents a concrete RenderKit implementation     that
-	 *                 should be registered under the specified render-kit-id.
-	 *                 If no     render-kit-id is specified, the identifier of
-	 *                 the default RenderKit
-	 *                 (RenderKitFactory.DEFAULT_RENDER_KIT) is assumed. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Render Kit</em>' containment reference.
-	 * @see #setRenderKit(RenderKitType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKit()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='render-kit' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitType getRenderKit();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit <em>Render Kit</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit</em>' containment reference.
-	 * @see #getRenderKit()
-	 * @generated
-	 */
-	void setRenderKit(RenderKitType value);
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "render-kit-class" element represents the fully qualified class name
-	 *     of a concrete RenderKit implementation class.  It must be of
-	 *     type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Render Kit Class</em>' containment reference.
-	 * @see #setRenderKitClass(RenderKitClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKitClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='render-kit-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitClassType getRenderKitClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass <em>Render Kit Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit Class</em>' containment reference.
-	 * @see #getRenderKitClass()
-	 * @generated
-	 */
-	void setRenderKitClass(RenderKitClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "render-kit-factory"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete RenderKitFactory implementation class that
-	 *                 will be called     when
-	 *                 FactoryFinder.getFactory(RENDER_KIT_FACTORY) is called.
-	 *                 It must be      of type "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Render Kit Factory</em>' containment reference.
-	 * @see #setRenderKitFactory(RenderKitFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKitFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='render-kit-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitFactoryType getRenderKitFactory();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory <em>Render Kit Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit Factory</em>' containment reference.
-	 * @see #getRenderKitFactory()
-	 * @generated
-	 */
-	void setRenderKitFactory(RenderKitFactoryType value);
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "render-kit-id" element represents an identifier for the
-	 *     RenderKit represented by the parent "render-kit" element.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Render Kit Id</em>' containment reference.
-	 * @see #setRenderKitId(RenderKitIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_RenderKitId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='render-kit-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitIdType getRenderKitId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId <em>Render Kit Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit Id</em>' containment reference.
-	 * @see #getRenderKitId()
-	 * @generated
-	 */
-	void setRenderKitId(RenderKitIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Resource Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Resource Handler</em>' containment reference.
-	 * @see #setResourceHandler(ResourceHandlerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ResourceHandler()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='resource-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ResourceHandlerType getResourceHandler();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getResourceHandler <em>Resource Handler</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resource Handler</em>' containment reference.
-	 * @see #getResourceHandler()
-	 * @generated
-	 */
-	void setResourceHandler(ResourceHandlerType value);
-
-				/**
-	 * Returns the value of the '<em><b>Small Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "small-icon" element contains the resource path to a small (16x16)
-	 *     icon image.  The image may be in either GIF or JPG format.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Small Icon</em>' containment reference.
-	 * @see #setSmallIcon(SmallIconType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SmallIcon()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='small-icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SmallIconType getSmallIcon();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon <em>Small Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Small Icon</em>' containment reference.
-	 * @see #getSmallIcon()
-	 * @generated
-	 */
-	void setSmallIcon(SmallIconType value);
-
-    /**
-	 * Returns the value of the '<em><b>Source Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Source Class</em>' containment reference.
-	 * @see #setSourceClass(SourceClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SourceClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='source-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SourceClassType getSourceClass();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSourceClass <em>Source Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Class</em>' containment reference.
-	 * @see #getSourceClass()
-	 * @generated
-	 */
-	void setSourceClass(SourceClassType value);
-
-				/**
-	 * Returns the value of the '<em><b>State Manager</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       The "state-manager"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete StateManager implementation class that will
-	 *                 be called     during the Restore View and Render
-	 *                 Response phases of the request     processing lifecycle.
-	 *                 The faces implementation must provide a     default
-	 *                 implementation of this class 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>State Manager</em>' containment reference.
-	 * @see #setStateManager(StateManagerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_StateManager()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='state-manager' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	StateManagerType getStateManager();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager <em>State Manager</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>State Manager</em>' containment reference.
-	 * @see #getStateManager()
-	 * @generated
-	 */
-	void setStateManager(StateManagerType value);
-
-    /**
-	 * Returns the value of the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "suggested-value" contains the value for the property or
-	 *     attribute in which this element resides.  This value is advisory
-	 *     only and is intended for tools to use when populating pallettes.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #setSuggestedValue(SuggestedValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SuggestedValue()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='suggested-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SuggestedValueType getSuggestedValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue <em>Suggested Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #getSuggestedValue()
-	 * @generated
-	 */
-	void setSuggestedValue(SuggestedValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Supported Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       The "supported-locale"
-	 *                 element allows authors to declare which      locales are
-	 *                 supported in this application instance.       It must be
-	 *                 specified as :language:[_:country:[_:variant:]] without
-	 *                 the colons, for example "ja_JP_SJIS".  The
-	 *                 separators between the      segments may be
-	 *                 '-' or '_'. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Supported Locale</em>' containment reference.
-	 * @see #setSupportedLocale(SupportedLocaleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SupportedLocale()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='supported-locale' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SupportedLocaleType getSupportedLocale();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale <em>Supported Locale</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Supported Locale</em>' containment reference.
-	 * @see #getSupportedLocale()
-	 * @generated
-	 */
-	void setSupportedLocale(SupportedLocaleType value);
-
-    /**
-	 * Returns the value of the '<em><b>System Event Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>System Event Class</em>' containment reference.
-	 * @see #setSystemEventClass(SystemEventClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SystemEventClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='system-event-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SystemEventClassType getSystemEventClass();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventClass <em>System Event Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>System Event Class</em>' containment reference.
-	 * @see #getSystemEventClass()
-	 * @generated
-	 */
-	void setSystemEventClass(SystemEventClassType value);
-
-				/**
-	 * Returns the value of the '<em><b>System Event Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>System Event Listener</em>' containment reference.
-	 * @see #setSystemEventListener(SystemEventListenerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SystemEventListener()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='system-event-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SystemEventListenerType getSystemEventListener();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListener <em>System Event Listener</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>System Event Listener</em>' containment reference.
-	 * @see #getSystemEventListener()
-	 * @generated
-	 */
-	void setSystemEventListener(SystemEventListenerType value);
-
-				/**
-	 * Returns the value of the '<em><b>System Event Listener Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>System Event Listener Class</em>' containment reference.
-	 * @see #setSystemEventListenerClass(SystemEventListenerClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_SystemEventListenerClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='system-event-listener-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SystemEventListenerClassType getSystemEventListenerClass();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListenerClass <em>System Event Listener Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>System Event Listener Class</em>' containment reference.
-	 * @see #getSystemEventListenerClass()
-	 * @generated
-	 */
-	void setSystemEventListenerClass(SystemEventListenerClassType value);
-
-				/**
-	 * Returns the value of the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Tag Handler Delegate Factory</em>' containment reference.
-	 * @see #setTagHandlerDelegateFactory(TagHandlerDelegateFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_TagHandlerDelegateFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='tag-handler-delegate-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	TagHandlerDelegateFactoryType getTagHandlerDelegateFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tag Handler Delegate Factory</em>' containment reference.
-	 * @see #getTagHandlerDelegateFactory()
-	 * @generated
-	 */
-	void setTagHandlerDelegateFactory(TagHandlerDelegateFactoryType value);
-
-				/**
-	 * Returns the value of the '<em><b>To View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "to-view" element contains the view identifier of the next view
-	 *     that should be displayed if this navigation rule is matched.  It
-	 *     must be of type "ViewId".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>To View Id</em>' containment reference.
-	 * @see #setToViewId(ToViewIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ToViewId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='to-view-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ToViewIdType getToViewId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId <em>To View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>To View Id</em>' containment reference.
-	 * @see #getToViewId()
-	 * @generated
-	 */
-	void setToViewId(ToViewIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Validator</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "validator" element
-	 *                 represents a concrete Validator implementation     class
-	 *                 that should be registered under the specified validator
-	 *                 identifier.     Validator identifiers must be unique
-	 *                 within the entire web application.      Nested
-	 *                 "attribute" elements identify generic
-	 *                 attributes that may be     configured on the
-	 *                 corresponding UIComponent in order to affect the
-	 *                 operation of the Validator.  Nested "property"
-	 *                 elements identify JavaBeans     properties of the
-	 *                 Validator implementation class that may be configured
-	 *                 to affect the operation of the Validator. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Validator</em>' containment reference.
-	 * @see #setValidator(ValidatorType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Validator()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='validator' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValidatorType getValidator();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator <em>Validator</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Validator</em>' containment reference.
-	 * @see #getValidator()
-	 * @generated
-	 */
-	void setValidator(ValidatorType value);
-
-    /**
-	 * Returns the value of the '<em><b>Validator Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "validator-class" element represents the fully qualified class name
-	 *     of a concrete Validator implementation class.  It must be of
-	 *     type "ClassName".
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Validator Class</em>' containment reference.
-	 * @see #setValidatorClass(ValidatorClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ValidatorClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='validator-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValidatorClassType getValidatorClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass <em>Validator Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Validator Class</em>' containment reference.
-	 * @see #getValidatorClass()
-	 * @generated
-	 */
-	void setValidatorClass(ValidatorClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Validator Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "validator-id" element represents the identifier under which the
-	 *     corresponding Validator class should be registered.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Validator Id</em>' containment reference.
-	 * @see #setValidatorId(ValidatorIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ValidatorId()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='validator-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValidatorIdType getValidatorId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId <em>Validator Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Validator Id</em>' containment reference.
-	 * @see #getValidatorId()
-	 * @generated
-	 */
-	void setValidatorId(ValidatorIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "value" element is the
-	 *                 String representation of a literal     value to which a
-	 *                 scalar managed property will be set, or a value
-	 *                 reference expression ("#{...}") that will be
-	 *                 used to calculate the     required value.  It will be
-	 *                 converted as specified for the actual     property type. 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference.
-	 * @see #setValue(ValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_Value()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueType getValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' containment reference.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(ValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *     The "value-class" element defines the Java type to which each
-	 *     "value" element's value will be converted to, prior to adding it to
-	 *     the "list-entries" list for a managed property that is a
-	 *     java.util.List, or a "map-entries" map for a managed property that
-	 *     is a java.util.Map.  It must be of type "ClassName".  If omitted,
-	 *     "java.lang.String" is assumed.
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Value Class</em>' containment reference.
-	 * @see #setValueClass(ValueClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ValueClass()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='value-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueClassType getValueClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass <em>Value Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value Class</em>' containment reference.
-	 * @see #getValueClass()
-	 * @generated
-	 */
-	void setValueClass(ValueClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Variable Resolver</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *      The "variable-resolver"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete VariableResolver implementation class that
-	 *                 will be used     during the processing of value
-	 *                 reference expressions.     It must be of type
-	 *                 "ClassName". 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Variable Resolver</em>' containment reference.
-	 * @see #setVariableResolver(VariableResolverType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_VariableResolver()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='variable-resolver' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	VariableResolverType getVariableResolver();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver <em>Variable Resolver</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Variable Resolver</em>' containment reference.
-	 * @see #getVariableResolver()
-	 * @generated
-	 */
-	void setVariableResolver(VariableResolverType value);
-
-    /**
-	 * Returns the value of the '<em><b>View Declaration Language Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>View Declaration Language Factory</em>' containment reference.
-	 * @see #setViewDeclarationLanguageFactory(ViewDeclarationLanguageFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ViewDeclarationLanguageFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='view-declaration-language-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ViewDeclarationLanguageFactoryType getViewDeclarationLanguageFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>View Declaration Language Factory</em>' containment reference.
-	 * @see #getViewDeclarationLanguageFactory()
-	 * @generated
-	 */
-	void setViewDeclarationLanguageFactory(ViewDeclarationLanguageFactoryType value);
-
-				/**
-	 * Returns the value of the '<em><b>View Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 *       The "view-handler"
-	 *                 element contains the fully qualified class name     of
-	 *                 the concrete ViewHandler implementation class that will
-	 *                 be called     during the Restore View and Render
-	 *                 Response phases of the request     processing lifecycle.
-	 *                 The faces implementation must provide a     default
-	 *                 implementation of this class 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>View Handler</em>' containment reference.
-	 * @see #setViewHandler(ViewHandlerType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_ViewHandler()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='view-handler' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ViewHandlerType getViewHandler();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler <em>View Handler</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>View Handler</em>' containment reference.
-	 * @see #getViewHandler()
-	 * @generated
-	 */
-	void setViewHandler(ViewHandlerType value);
-
-				/**
-	 * Returns the value of the '<em><b>Visit Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * <!-- begin-model-doc -->
-	 * 
-	 * <!-- end-model-doc -->
-	 * @return the value of the '<em>Visit Context Factory</em>' containment reference.
-	 * @see #setVisitContextFactory(VisitContextFactoryType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDocumentRoot_VisitContextFactory()
-	 * @model containment="true" upper="-2" transient="true" volatile="true" derived="true"
-	 *        extendedMetaData="kind='element' name='visit-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	VisitContextFactoryType getVisitContextFactory();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVisitContextFactory <em>Visit Context Factory</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Visit Context Factory</em>' containment reference.
-	 * @see #getVisitContextFactory()
-	 * @generated
-	 */
-	void setVisitContextFactory(VisitContextFactoryType value);
-
-} // DocumentRoot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicAttribute.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicAttribute.java
deleted file mode 100644
index 4eac574..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicAttribute.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Dynamic Attribute</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicAttribute()
- * @model
- * @generated
- */
-public interface DynamicAttribute extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicAttribute_Name()
-	 * @model
-	 * @generated
-	 */
-    String getName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-    void setName(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Value</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicAttribute_Value()
-	 * @model
-	 * @generated
-	 */
-    String getValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-    void setValue(String value);
-
-} // DynamicAttribute
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicElement.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicElement.java
deleted file mode 100644
index 3197969..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/DynamicElement.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Dynamic Element</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getAttributes <em>Attributes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent <em>Text Content</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement()
- * @model
- * @generated
- */
-public interface DynamicElement extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Child Nodes</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Child Nodes</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Child Nodes</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_ChildNodes()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DynamicElement" containment="true"
-	 * @generated
-	 */
-    EList getChildNodes();
-
-    /**
-	 * Returns the value of the '<em><b>Attributes</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Attributes</em>' attribute list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attributes</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_Attributes()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute"
-	 * @generated
-	 */
-    EList getAttributes();
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_TextContent()
-	 * @model
-	 * @generated
-	 */
-    String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-    void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Name</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getDynamicElement_Name()
-	 * @model
-	 * @generated
-	 */
-    String getName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-    void setName(String value);
-
-} // DynamicElement
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ELResolverType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ELResolverType.java
deleted file mode 100644
index 793bfb0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ELResolverType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>EL Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getELResolverType()
- * @model extendedMetaData="name='el-resolver_._type' kind='simple'"
- * @generated
- */
-public interface ELResolverType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getELResolverType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-    String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-    void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getELResolverType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-} // ELResolverType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExceptionHandlerFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExceptionHandlerFactoryType.java
deleted file mode 100644
index de6e30f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExceptionHandlerFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Exception Handler Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExceptionHandlerFactoryType()
- * @model extendedMetaData="name='exception-handler-factory_._type' kind='simple'"
- * @generated
- */
-public interface ExceptionHandlerFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExceptionHandlerFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExceptionHandlerFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ExceptionHandlerFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java
deleted file mode 100644
index 613fa11..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExtensionType.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType()
- * @model abstract="true"
- * @generated
- */
-public interface ExtensionType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Child Nodes</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Child Nodes</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Child Nodes</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType_ChildNodes()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DynamicElement"
-	 * @generated
-	 */
-    EList getChildNodes();
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType_TextContent()
-	 * @model extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-    String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-    void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExtensionType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-} // ExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExternalContextFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExternalContextFactoryType.java
deleted file mode 100644
index 563f9b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ExternalContextFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>External Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExternalContextFactoryType()
- * @model extendedMetaData="name='external-context-factory_._type' kind='simple'"
- * @generated
- */
-public interface ExternalContextFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExternalContextFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getExternalContextFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ExternalContextFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigExtensionType.java
deleted file mode 100644
index 2044448..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigExtensionType()
- * @model extendedMetaData="name='faces-config-extension_._type'"
- * @generated
- */
-public interface FacesConfigExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // FacesConfigExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigFactory.java
deleted file mode 100644
index c01c1f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigFactory.java
+++ /dev/null
@@ -1,1147 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage
- * @generated
- */
-public interface FacesConfigFactory extends EFactory {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	FacesConfigFactory eINSTANCE = org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigFactoryImpl.init();
-
-    /**
-	 * Returns a new object of class '<em>Absolute Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Absolute Ordering Type</em>'.
-	 * @generated
-	 */
-	AbsoluteOrderingType createAbsoluteOrderingType();
-
-				/**
-	 * Returns a new object of class '<em>Action Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Action Listener Type</em>'.
-	 * @generated
-	 */
-	ActionListenerType createActionListenerType();
-
-    /**
-	 * Returns a new object of class '<em>Application Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Application Factory Type</em>'.
-	 * @generated
-	 */
-	ApplicationFactoryType createApplicationFactoryType();
-
-    /**
-	 * Returns a new object of class '<em>Application Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Application Type</em>'.
-	 * @generated
-	 */
-	ApplicationType createApplicationType();
-
-    /**
-	 * Returns a new object of class '<em>Attribute Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Attribute Class Type</em>'.
-	 * @generated
-	 */
-	AttributeClassType createAttributeClassType();
-
-    /**
-	 * Returns a new object of class '<em>Attribute Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Attribute Extension Type</em>'.
-	 * @generated
-	 */
-	AttributeExtensionType createAttributeExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Attribute Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Attribute Name Type</em>'.
-	 * @generated
-	 */
-	AttributeNameType createAttributeNameType();
-
-    /**
-	 * Returns a new object of class '<em>Attribute Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Attribute Type</em>'.
-	 * @generated
-	 */
-	AttributeType createAttributeType();
-
-    /**
-	 * Returns a new object of class '<em>Behavior Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Behavior Class Type</em>'.
-	 * @generated
-	 */
-	BehaviorClassType createBehaviorClassType();
-
-				/**
-	 * Returns a new object of class '<em>Behavior Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Behavior Id Type</em>'.
-	 * @generated
-	 */
-	BehaviorIdType createBehaviorIdType();
-
-				/**
-	 * Returns a new object of class '<em>Behavior Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Behavior Type</em>'.
-	 * @generated
-	 */
-	BehaviorType createBehaviorType();
-
-				/**
-	 * Returns a new object of class '<em>Behavior Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Behavior Extension Type</em>'.
-	 * @generated
-	 */
-	BehaviorExtensionType createBehaviorExtensionType();
-
-				/**
-	 * Returns a new object of class '<em>Client Behavior Renderer Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Client Behavior Renderer Class Type</em>'.
-	 * @generated
-	 */
-	ClientBehaviorRendererClassType createClientBehaviorRendererClassType();
-
-				/**
-	 * Returns a new object of class '<em>Client Behavior Renderer Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Client Behavior Renderer Type</em>'.
-	 * @generated
-	 */
-	ClientBehaviorRendererType createClientBehaviorRendererType();
-
-				/**
-	 * Returns a new object of class '<em>Client Behavior Renderer Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Client Behavior Renderer Type Type</em>'.
-	 * @generated
-	 */
-	ClientBehaviorRendererTypeType createClientBehaviorRendererTypeType();
-
-				/**
-	 * Returns a new object of class '<em>Component Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Class Type</em>'.
-	 * @generated
-	 */
-	ComponentClassType createComponentClassType();
-
-    /**
-	 * Returns a new object of class '<em>Component Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Extension Type</em>'.
-	 * @generated
-	 */
-	ComponentExtensionType createComponentExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Component Family Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Family Type</em>'.
-	 * @generated
-	 */
-	ComponentFamilyType createComponentFamilyType();
-
-    /**
-	 * Returns a new object of class '<em>Component Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Type</em>'.
-	 * @generated
-	 */
-	ComponentType createComponentType();
-
-    /**
-	 * Returns a new object of class '<em>Component Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Component Type Type</em>'.
-	 * @generated
-	 */
-	ComponentTypeType createComponentTypeType();
-
-    /**
-	 * Returns a new object of class '<em>Converter Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Converter Class Type</em>'.
-	 * @generated
-	 */
-	ConverterClassType createConverterClassType();
-
-    /**
-	 * Returns a new object of class '<em>Converter For Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Converter For Class Type</em>'.
-	 * @generated
-	 */
-	ConverterForClassType createConverterForClassType();
-
-    /**
-	 * Returns a new object of class '<em>Converter Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Converter Id Type</em>'.
-	 * @generated
-	 */
-	ConverterIdType createConverterIdType();
-
-    /**
-	 * Returns a new object of class '<em>Converter Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Converter Type</em>'.
-	 * @generated
-	 */
-	ConverterType createConverterType();
-
-    /**
-	 * Returns a new object of class '<em>Default Locale Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Default Locale Type</em>'.
-	 * @generated
-	 */
-	DefaultLocaleType createDefaultLocaleType();
-
-    /**
-	 * Returns a new object of class '<em>Default Render Kit Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Default Render Kit Id Type</em>'.
-	 * @generated
-	 */
-	DefaultRenderKitIdType createDefaultRenderKitIdType();
-
-    /**
-	 * Returns a new object of class '<em>Default Validators Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Default Validators Type</em>'.
-	 * @generated
-	 */
-	DefaultValidatorsType createDefaultValidatorsType();
-
-				/**
-	 * Returns a new object of class '<em>Default Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Default Value Type</em>'.
-	 * @generated
-	 */
-	DefaultValueType createDefaultValueType();
-
-    /**
-	 * Returns a new object of class '<em>Description Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Description Type</em>'.
-	 * @generated
-	 */
-	DescriptionType createDescriptionType();
-
-    /**
-	 * Returns a new object of class '<em>Display Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Display Name Type</em>'.
-	 * @generated
-	 */
-	DisplayNameType createDisplayNameType();
-
-    /**
-	 * Returns a new object of class '<em>Document Root</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Document Root</em>'.
-	 * @generated
-	 */
-	DocumentRoot createDocumentRoot();
-
-    /**
-	 * Returns a new object of class '<em>Dynamic Attribute</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Dynamic Attribute</em>'.
-	 * @generated
-	 */
-    DynamicAttribute createDynamicAttribute();
-
-    /**
-	 * Returns a new object of class '<em>Dynamic Element</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Dynamic Element</em>'.
-	 * @generated
-	 */
-    DynamicElement createDynamicElement();
-
-    /**
-	 * Returns a new object of class '<em>EL Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>EL Resolver Type</em>'.
-	 * @generated
-	 */
-    ELResolverType createELResolverType();
-
-    /**
-	 * Returns a new object of class '<em>Exception Handler Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Exception Handler Factory Type</em>'.
-	 * @generated
-	 */
-	ExceptionHandlerFactoryType createExceptionHandlerFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>External Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>External Context Factory Type</em>'.
-	 * @generated
-	 */
-	ExternalContextFactoryType createExternalContextFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Type</em>'.
-	 * @generated
-	 */
-	FacesConfigType createFacesConfigType();
-
-    /**
-	 * Returns a new object of class '<em>Faces Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Faces Context Factory Type</em>'.
-	 * @generated
-	 */
-	FacesContextFactoryType createFacesContextFactoryType();
-
-    /**
-	 * Returns a new object of class '<em>Facet Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Facet Extension Type</em>'.
-	 * @generated
-	 */
-	FacetExtensionType createFacetExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Facet Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Facet Name Type</em>'.
-	 * @generated
-	 */
-	FacetNameType createFacetNameType();
-
-    /**
-	 * Returns a new object of class '<em>Facet Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Facet Type</em>'.
-	 * @generated
-	 */
-	FacetType createFacetType();
-
-    /**
-	 * Returns a new object of class '<em>Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Factory Type</em>'.
-	 * @generated
-	 */
-	FactoryType createFactoryType();
-
-    /**
-	 * Returns a new object of class '<em>From Action Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>From Action Type</em>'.
-	 * @generated
-	 */
-	FromActionType createFromActionType();
-
-    /**
-	 * Returns a new object of class '<em>From Outcome Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>From Outcome Type</em>'.
-	 * @generated
-	 */
-	FromOutcomeType createFromOutcomeType();
-
-    /**
-	 * Returns a new object of class '<em>From View Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>From View Id Type</em>'.
-	 * @generated
-	 */
-	FromViewIdType createFromViewIdType();
-
-    /**
-	 * Returns a new object of class '<em>Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Icon Type</em>'.
-	 * @generated
-	 */
-	IconType createIconType();
-
-    /**
-	 * Returns a new object of class '<em>If Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>If Type</em>'.
-	 * @generated
-	 */
-	IfType createIfType();
-
-				/**
-	 * Returns a new object of class '<em>Key Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Key Class Type</em>'.
-	 * @generated
-	 */
-	KeyClassType createKeyClassType();
-
-    /**
-	 * Returns a new object of class '<em>Key Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Key Type</em>'.
-	 * @generated
-	 */
-	KeyType createKeyType();
-
-    /**
-	 * Returns a new object of class '<em>Large Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Large Icon Type</em>'.
-	 * @generated
-	 */
-	LargeIconType createLargeIconType();
-
-    /**
-	 * Returns a new object of class '<em>Lifecycle Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Lifecycle Factory Type</em>'.
-	 * @generated
-	 */
-	LifecycleFactoryType createLifecycleFactoryType();
-
-    /**
-	 * Returns a new object of class '<em>Lifecycle Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Lifecycle Type</em>'.
-	 * @generated
-	 */
-	LifecycleType createLifecycleType();
-
-    /**
-	 * Returns a new object of class '<em>List Entries Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>List Entries Type</em>'.
-	 * @generated
-	 */
-	ListEntriesType createListEntriesType();
-
-    /**
-	 * Returns a new object of class '<em>Locale Config Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Locale Config Type</em>'.
-	 * @generated
-	 */
-	LocaleConfigType createLocaleConfigType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Bean Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Bean Class Type</em>'.
-	 * @generated
-	 */
-	ManagedBeanClassType createManagedBeanClassType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Bean Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Bean Name Type</em>'.
-	 * @generated
-	 */
-	ManagedBeanNameType createManagedBeanNameType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Bean Scope Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Bean Scope Type</em>'.
-	 * @generated
-	 */
-	ManagedBeanScopeType createManagedBeanScopeType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Bean Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Bean Type</em>'.
-	 * @generated
-	 */
-	ManagedBeanType createManagedBeanType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Property Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Property Type</em>'.
-	 * @generated
-	 */
-	ManagedPropertyType createManagedPropertyType();
-
-    /**
-	 * Returns a new object of class '<em>Map Entries Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Map Entries Type</em>'.
-	 * @generated
-	 */
-	MapEntriesType createMapEntriesType();
-
-    /**
-	 * Returns a new object of class '<em>Map Entry Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Map Entry Type</em>'.
-	 * @generated
-	 */
-	MapEntryType createMapEntryType();
-
-    /**
-	 * Returns a new object of class '<em>Message Bundle Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Message Bundle Type</em>'.
-	 * @generated
-	 */
-	MessageBundleType createMessageBundleType();
-
-    /**
-	 * Returns a new object of class '<em>Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Name Type</em>'.
-	 * @generated
-	 */
-	NameType createNameType();
-
-				/**
-	 * Returns a new object of class '<em>Navigation Case Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Navigation Case Type</em>'.
-	 * @generated
-	 */
-	NavigationCaseType createNavigationCaseType();
-
-    /**
-	 * Returns a new object of class '<em>Navigation Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Navigation Handler Type</em>'.
-	 * @generated
-	 */
-	NavigationHandlerType createNavigationHandlerType();
-
-    /**
-	 * Returns a new object of class '<em>Navigation Rule Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Navigation Rule Type</em>'.
-	 * @generated
-	 */
-	NavigationRuleType createNavigationRuleType();
-
-    /**
-	 * Returns a new object of class '<em>Null Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Null Value Type</em>'.
-	 * @generated
-	 */
-	NullValueType createNullValueType();
-
-    /**
-	 * Returns a new object of class '<em>Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Ordering Type</em>'.
-	 * @generated
-	 */
-	OrderingType createOrderingType();
-
-				/**
-	 * Returns a new object of class '<em>Ordering Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Ordering Ordering Type</em>'.
-	 * @generated
-	 */
-	OrderingOrderingType createOrderingOrderingType();
-
-				/**
-	 * Returns a new object of class '<em>Ordering Others Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Ordering Others Type</em>'.
-	 * @generated
-	 */
-	OrderingOthersType createOrderingOthersType();
-
-				/**
-	 * Returns a new object of class '<em>Partial View Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Partial View Context Factory Type</em>'.
-	 * @generated
-	 */
-	PartialViewContextFactoryType createPartialViewContextFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>Phase Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Phase Listener Type</em>'.
-	 * @generated
-	 */
-	PhaseListenerType createPhaseListenerType();
-
-    /**
-	 * Returns a new object of class '<em>Property Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property Class Type</em>'.
-	 * @generated
-	 */
-	PropertyClassType createPropertyClassType();
-
-    /**
-	 * Returns a new object of class '<em>Property Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property Extension Type</em>'.
-	 * @generated
-	 */
-	PropertyExtensionType createPropertyExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Property Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property Name Type</em>'.
-	 * @generated
-	 */
-	PropertyNameType createPropertyNameType();
-
-    /**
-	 * Returns a new object of class '<em>Property Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property Resolver Type</em>'.
-	 * @generated
-	 */
-	PropertyResolverType createPropertyResolverType();
-
-    /**
-	 * Returns a new object of class '<em>Property Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Property Type</em>'.
-	 * @generated
-	 */
-	PropertyType createPropertyType();
-
-    /**
-	 * Returns a new object of class '<em>Redirect Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Redirect Type</em>'.
-	 * @generated
-	 */
-	RedirectType createRedirectType();
-
-    /**
-	 * Returns a new object of class '<em>Redirect View Param Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Redirect View Param Type</em>'.
-	 * @generated
-	 */
-	RedirectViewParamType createRedirectViewParamType();
-
-				/**
-	 * Returns a new object of class '<em>Referenced Bean Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Referenced Bean Class Type</em>'.
-	 * @generated
-	 */
-	ReferencedBeanClassType createReferencedBeanClassType();
-
-    /**
-	 * Returns a new object of class '<em>Referenced Bean Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Referenced Bean Name Type</em>'.
-	 * @generated
-	 */
-	ReferencedBeanNameType createReferencedBeanNameType();
-
-    /**
-	 * Returns a new object of class '<em>Referenced Bean Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Referenced Bean Type</em>'.
-	 * @generated
-	 */
-	ReferencedBeanType createReferencedBeanType();
-
-    /**
-	 * Returns a new object of class '<em>Renderer Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Renderer Class Type</em>'.
-	 * @generated
-	 */
-	RendererClassType createRendererClassType();
-
-    /**
-	 * Returns a new object of class '<em>Renderer Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Renderer Extension Type</em>'.
-	 * @generated
-	 */
-	RendererExtensionType createRendererExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Renderer Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Renderer Type</em>'.
-	 * @generated
-	 */
-	RendererType createRendererType();
-
-    /**
-	 * Returns a new object of class '<em>Renderer Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Renderer Type Type</em>'.
-	 * @generated
-	 */
-	RendererTypeType createRendererTypeType();
-
-    /**
-	 * Returns a new object of class '<em>Render Kit Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Render Kit Class Type</em>'.
-	 * @generated
-	 */
-	RenderKitClassType createRenderKitClassType();
-
-    /**
-	 * Returns a new object of class '<em>Render Kit Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Render Kit Factory Type</em>'.
-	 * @generated
-	 */
-	RenderKitFactoryType createRenderKitFactoryType();
-
-    /**
-	 * Returns a new object of class '<em>Render Kit Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Render Kit Id Type</em>'.
-	 * @generated
-	 */
-	RenderKitIdType createRenderKitIdType();
-
-    /**
-	 * Returns a new object of class '<em>Render Kit Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Render Kit Type</em>'.
-	 * @generated
-	 */
-	RenderKitType createRenderKitType();
-
-    /**
-	 * Returns a new object of class '<em>Small Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Small Icon Type</em>'.
-	 * @generated
-	 */
-	SmallIconType createSmallIconType();
-
-    /**
-	 * Returns a new object of class '<em>Source Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Source Class Type</em>'.
-	 * @generated
-	 */
-	SourceClassType createSourceClassType();
-
-				/**
-	 * Returns a new object of class '<em>State Manager Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>State Manager Type</em>'.
-	 * @generated
-	 */
-	StateManagerType createStateManagerType();
-
-    /**
-	 * Returns a new object of class '<em>Suggested Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Suggested Value Type</em>'.
-	 * @generated
-	 */
-	SuggestedValueType createSuggestedValueType();
-
-    /**
-	 * Returns a new object of class '<em>Supported Locale Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Supported Locale Type</em>'.
-	 * @generated
-	 */
-	SupportedLocaleType createSupportedLocaleType();
-
-    /**
-	 * Returns a new object of class '<em>System Event Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>System Event Class Type</em>'.
-	 * @generated
-	 */
-	SystemEventClassType createSystemEventClassType();
-
-				/**
-	 * Returns a new object of class '<em>System Event Listener Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>System Event Listener Class Type</em>'.
-	 * @generated
-	 */
-	SystemEventListenerClassType createSystemEventListenerClassType();
-
-				/**
-	 * Returns a new object of class '<em>System Event Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>System Event Listener Type</em>'.
-	 * @generated
-	 */
-	SystemEventListenerType createSystemEventListenerType();
-
-				/**
-	 * Returns a new object of class '<em>Tag Handler Delegate Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Handler Delegate Factory Type</em>'.
-	 * @generated
-	 */
-	TagHandlerDelegateFactoryType createTagHandlerDelegateFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>To View Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>To View Id Type</em>'.
-	 * @generated
-	 */
-	ToViewIdType createToViewIdType();
-
-    /**
-	 * Returns a new object of class '<em>Validator Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Validator Class Type</em>'.
-	 * @generated
-	 */
-	ValidatorClassType createValidatorClassType();
-
-    /**
-	 * Returns a new object of class '<em>Validator Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Validator Id Type</em>'.
-	 * @generated
-	 */
-	ValidatorIdType createValidatorIdType();
-
-    /**
-	 * Returns a new object of class '<em>Validator Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Validator Type</em>'.
-	 * @generated
-	 */
-	ValidatorType createValidatorType();
-
-    /**
-	 * Returns a new object of class '<em>Value Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Value Class Type</em>'.
-	 * @generated
-	 */
-	ValueClassType createValueClassType();
-
-    /**
-	 * Returns a new object of class '<em>Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Value Type</em>'.
-	 * @generated
-	 */
-	ValueType createValueType();
-
-    /**
-	 * Returns a new object of class '<em>Variable Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Variable Resolver Type</em>'.
-	 * @generated
-	 */
-	VariableResolverType createVariableResolverType();
-
-    /**
-	 * Returns a new object of class '<em>View Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>View Handler Type</em>'.
-	 * @generated
-	 */
-	ViewHandlerType createViewHandlerType();
-
-    /**
-	 * Returns a new object of class '<em>Application Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Application Extension Type</em>'.
-	 * @generated
-	 */
-    ApplicationExtensionType createApplicationExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Resource Bundle Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resource Bundle Type</em>'.
-	 * @generated
-	 */
-    ResourceBundleType createResourceBundleType();
-
-    /**
-	 * Returns a new object of class '<em>Base Name Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Base Name Type</em>'.
-	 * @generated
-	 */
-    BaseNameType createBaseNameType();
-
-    /**
-	 * Returns a new object of class '<em>Var Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Var Type</em>'.
-	 * @generated
-	 */
-    VarType createVarType();
-
-    /**
-	 * Returns a new object of class '<em>View Declaration Language Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>View Declaration Language Factory Type</em>'.
-	 * @generated
-	 */
-	ViewDeclarationLanguageFactoryType createViewDeclarationLanguageFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>Visit Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Visit Context Factory Type</em>'.
-	 * @generated
-	 */
-	VisitContextFactoryType createVisitContextFactoryType();
-
-				/**
-	 * Returns a new object of class '<em>Render Kit Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Render Kit Extension Type</em>'.
-	 * @generated
-	 */
-    RenderKitExtensionType createRenderKitExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Resource Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resource Handler Type</em>'.
-	 * @generated
-	 */
-	ResourceHandlerType createResourceHandlerType();
-
-				/**
-	 * Returns a new object of class '<em>Navigation Rule Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Navigation Rule Extension Type</em>'.
-	 * @generated
-	 */
-    NavigationRuleExtensionType createNavigationRuleExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Validator Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Validator Extension Type</em>'.
-	 * @generated
-	 */
-    ValidatorExtensionType createValidatorExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Extension Type</em>'.
-	 * @generated
-	 */
-    FacesConfigExtensionType createFacesConfigExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Factory Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Factory Extension Type</em>'.
-	 * @generated
-	 */
-    FactoryExtensionType createFactoryExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Lifecycle Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Lifecycle Extension Type</em>'.
-	 * @generated
-	 */
-    LifecycleExtensionType createLifecycleExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Managed Bean Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Managed Bean Extension Type</em>'.
-	 * @generated
-	 */
-    ManagedBeanExtensionType createManagedBeanExtensionType();
-
-    /**
-	 * Returns a new object of class '<em>Converter Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Converter Extension Type</em>'.
-	 * @generated
-	 */
-    ConverterExtensionType createConverterExtensionType();
-
-    /**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	FacesConfigPackage getFacesConfigPackage();
-
-} //FacesConfigFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigPackage.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigPackage.java
deleted file mode 100644
index c2a356e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigPackage.java
+++ /dev/null
@@ -1,18749 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * <!-- begin-model-doc -->
- * 
- *    See http://www.w3.org/XML/1998/namespace.html and
- *    http://www.w3.org/TR/REC-xml for information about this namespace.
- * 
- *     This schema document describes the XML namespace, in a form
- *     suitable for import by other schema documents.  
- * 
- *     Note that local names in this namespace are intended to be defined
- *     only by the World Wide Web Consortium or its subgroups.  The
- *     following names are currently defined in this namespace and should
- *     not be used with conflicting semantics by any Working Group,
- *     specification, or document instance:
- * 
- *     base (as an attribute name): denotes an attribute whose value
- *          provides a URI to be used as the base for interpreting any
- *          relative URIs in the scope of the element on which it
- *          appears; its value is inherited.  This name is reserved
- *          by virtue of its definition in the XML Base specification.
- * 
- *     id   (as an attribute name): denotes an attribute whose value
- *          should be interpreted as if declared to be of type ID.
- *          The xml:id specification is not yet a W3C Recommendation,
- *          but this attribute is included here to facilitate experimentation
- *          with the mechanisms it proposes.  Note that it is _not_ included
- *          in the specialAttrs attribute group.
- * 
- *     lang (as an attribute name): denotes an attribute whose value
- *          is a language code for the natural language of the content of
- *          any element; its value is inherited.  This name is reserved
- *          by virtue of its definition in the XML specification.
- *   
- *     space (as an attribute name): denotes an attribute whose
- *          value is a keyword indicating what whitespace processing
- *          discipline is intended for the content of the element; its
- *          value is inherited.  This name is reserved by virtue of its
- *          definition in the XML specification.
- * 
- *     Father (in any context at all): denotes Jon Bosak, the chair of 
- *          the original XML Working Group.  This name is reserved by 
- *          the following decision of the W3C XML Plenary and 
- *          XML Coordination groups:
- * 
- *              In appreciation for his vision, leadership and dedication
- *              the W3C XML Plenary on this 10th day of February, 2000
- *              reserves for Jon Bosak in perpetuity the XML name
- *              xml:Father
- *   
- * This schema defines attributes and an attribute group
- *         suitable for use by
- *         schemas wishing to allow xml:base, xml:lang, xml:space or xml:id
- *         attributes on elements they define.
- * 
- *         To enable this, such a schema must import this schema
- *         for the XML namespace, e.g. as follows:
- *         &lt;schema . . .&gt;
- *          . . .
- *          &lt;import namespace="http://www.w3.org/XML/1998/namespace"
- *                     schemaLocation="http://www.w3.org/2001/xml.xsd"/&gt;
- * 
- *         Subsequently, qualified reference to any of the attributes
- *         or the group defined below will have the desired effect, e.g.
- * 
- *         &lt;type . . .&gt;
- *          . . .
- *          &lt;attributeGroup ref="xml:specialAttrs"/&gt;
- *  
- *          will define a type which will schema-validate an instance
- *          element with any of those attributes
- * In keeping with the XML Schema WG's standard versioning
- *    policy, this schema document will persist at
- *    http://www.w3.org/2005/08/xml.xsd.
- *    At the date of issue it can also be found at
- *    http://www.w3.org/2001/xml.xsd.
- *    The schema document at that URI may however change in the future,
- *    in order to remain compatible with the latest version of XML Schema
- *    itself, or with the XML namespace itself.  In other words, if the XML
- *    Schema or XML namespaces change, the version of this document at
- *    http://www.w3.org/2001/xml.xsd will change
- *    accordingly; the version at
- *    http://www.w3.org/2005/08/xml.xsd will not change.
- *   
- * <!-- end-model-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory
- * @model kind="package"
- *        extendedMetaData="qualified='false'"
- * @generated
- */
-@SuppressWarnings("hiding")
-public interface FacesConfigPackage extends EPackage {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "facesconfig"; //$NON-NLS-1$
-
-    /**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd"; //$NON-NLS-1$
-
-    /**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "facesconfig"; //$NON-NLS-1$
-
-    /**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	FacesConfigPackage eINSTANCE = org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl.init();
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl <em>Absolute Ordering Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAbsoluteOrderingType()
-	 * @generated
-	 */
-	int ABSOLUTE_ORDERING_TYPE = 0;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ABSOLUTE_ORDERING_TYPE__NAME = 0;
-
-				/**
-	 * The feature id for the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ABSOLUTE_ORDERING_TYPE__OTHERS = 1;
-
-				/**
-	 * The number of structural features of the '<em>Absolute Ordering Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ABSOLUTE_ORDERING_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl <em>Action Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getActionListenerType()
-	 * @generated
-	 */
-	int ACTION_LISTENER_TYPE = 1;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTION_LISTENER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTION_LISTENER_TYPE__ID = 1;
-
-    /**
-	 * The number of structural features of the '<em>Action Listener Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ACTION_LISTENER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl <em>Application Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationFactoryType()
-	 * @generated
-	 */
-	int APPLICATION_FACTORY_TYPE = 2;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_FACTORY_TYPE__ID = 1;
-
-    /**
-	 * The number of structural features of the '<em>Application Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl <em>Application Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationType()
-	 * @generated
-	 */
-	int APPLICATION_TYPE = 3;
-
-    /**
-	 * The feature id for the '<em><b>Action Listener</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__ACTION_LISTENER = 0;
-
-    /**
-	 * The feature id for the '<em><b>Default Render Kit Id</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID = 1;
-
-    /**
-	 * The feature id for the '<em><b>Message Bundle</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__MESSAGE_BUNDLE = 2;
-
-    /**
-	 * The feature id for the '<em><b>Navigation Handler</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__NAVIGATION_HANDLER = 3;
-
-    /**
-	 * The feature id for the '<em><b>View Handler</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__VIEW_HANDLER = 4;
-
-    /**
-	 * The feature id for the '<em><b>State Manager</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__STATE_MANAGER = 5;
-
-    /**
-	 * The feature id for the '<em><b>EL Resolver</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_TYPE__EL_RESOLVER = 6;
-
-				/**
-	 * The feature id for the '<em><b>Property Resolver</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__PROPERTY_RESOLVER = 7;
-
-				/**
-	 * The feature id for the '<em><b>Variable Resolver</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__VARIABLE_RESOLVER = 8;
-
-				/**
-	 * The feature id for the '<em><b>Resource Handler</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__RESOURCE_HANDLER = 9;
-
-				/**
-	 * The feature id for the '<em><b>System Event Listener</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__SYSTEM_EVENT_LISTENER = 10;
-
-				/**
-	 * The feature id for the '<em><b>Locale Config</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__LOCALE_CONFIG = 11;
-
-    /**
-	 * The feature id for the '<em><b>Resource Bundle</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_TYPE__RESOURCE_BUNDLE = 12;
-
-    /**
-	 * The feature id for the '<em><b>Application Extension</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_TYPE__APPLICATION_EXTENSION = 13;
-
-    /**
-	 * The feature id for the '<em><b>Default Validators</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__DEFAULT_VALIDATORS = 14;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE__ID = 15;
-
-				/**
-	 * The number of structural features of the '<em>Application Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int APPLICATION_TYPE_FEATURE_COUNT = 16;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl <em>Attribute Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeClassType()
-	 * @generated
-	 */
-	int ATTRIBUTE_CLASS_TYPE = 5;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl <em>Attribute Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeExtensionType()
-	 * @generated
-	 */
-	int ATTRIBUTE_EXTENSION_TYPE = 6;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl <em>Attribute Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeNameType()
-	 * @generated
-	 */
-	int ATTRIBUTE_NAME_TYPE = 7;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl <em>Attribute Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeType()
-	 * @generated
-	 */
-	int ATTRIBUTE_TYPE = 8;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl <em>Component Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentClassType()
-	 * @generated
-	 */
-	int COMPONENT_CLASS_TYPE = 16;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl <em>Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExtensionType()
-	 * @generated
-	 */
-    int EXTENSION_TYPE = 37;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EXTENSION_TYPE__CHILD_NODES = 0;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EXTENSION_TYPE__TEXT_CONTENT = 1;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EXTENSION_TYPE__ID = 2;
-
-    /**
-	 * The number of structural features of the '<em>Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EXTENSION_TYPE_FEATURE_COUNT = 3;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl <em>Behavior Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorClassType()
-	 * @generated
-	 */
-	int BEHAVIOR_CLASS_TYPE = 9;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl <em>Behavior Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorIdType()
-	 * @generated
-	 */
-	int BEHAVIOR_ID_TYPE = 10;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl <em>Behavior Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorType()
-	 * @generated
-	 */
-	int BEHAVIOR_TYPE = 11;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorExtensionTypeImpl <em>Behavior Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorExtensionType()
-	 * @generated
-	 */
-	int BEHAVIOR_EXTENSION_TYPE = 12;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl <em>Client Behavior Renderer Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererClassType()
-	 * @generated
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE = 13;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl <em>Client Behavior Renderer Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererType()
-	 * @generated
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE = 14;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl <em>Client Behavior Renderer Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererTypeType()
-	 * @generated
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE = 15;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl <em>Component Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentExtensionType()
-	 * @generated
-	 */
-	int COMPONENT_EXTENSION_TYPE = 17;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl <em>Component Family Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentFamilyType()
-	 * @generated
-	 */
-	int COMPONENT_FAMILY_TYPE = 18;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl <em>Component Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentType()
-	 * @generated
-	 */
-	int COMPONENT_TYPE = 19;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl <em>Component Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentTypeType()
-	 * @generated
-	 */
-	int COMPONENT_TYPE_TYPE = 20;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl <em>Converter Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterClassType()
-	 * @generated
-	 */
-	int CONVERTER_CLASS_TYPE = 21;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl <em>Converter For Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterForClassType()
-	 * @generated
-	 */
-	int CONVERTER_FOR_CLASS_TYPE = 22;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl <em>Converter Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterIdType()
-	 * @generated
-	 */
-	int CONVERTER_ID_TYPE = 23;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl <em>Converter Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterType()
-	 * @generated
-	 */
-	int CONVERTER_TYPE = 24;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl <em>Default Locale Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultLocaleType()
-	 * @generated
-	 */
-	int DEFAULT_LOCALE_TYPE = 26;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl <em>Default Render Kit Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultRenderKitIdType()
-	 * @generated
-	 */
-	int DEFAULT_RENDER_KIT_ID_TYPE = 27;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl <em>Default Validators Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValidatorsType()
-	 * @generated
-	 */
-	int DEFAULT_VALIDATORS_TYPE = 28;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl <em>Default Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValueType()
-	 * @generated
-	 */
-	int DEFAULT_VALUE_TYPE = 29;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl <em>Description Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDescriptionType()
-	 * @generated
-	 */
-	int DESCRIPTION_TYPE = 30;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl <em>Display Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDisplayNameType()
-	 * @generated
-	 */
-	int DISPLAY_NAME_TYPE = 31;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl <em>Document Root</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDocumentRoot()
-	 * @generated
-	 */
-	int DOCUMENT_ROOT = 32;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl <em>Dynamic Attribute</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicAttribute()
-	 * @generated
-	 */
-    int DYNAMIC_ATTRIBUTE = 33;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl <em>Dynamic Element</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicElement()
-	 * @generated
-	 */
-    int DYNAMIC_ELEMENT = 34;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl <em>EL Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getELResolverType()
-	 * @generated
-	 */
-    int EL_RESOLVER_TYPE = 35;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl <em>Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigType()
-	 * @generated
-	 */
-	int FACES_CONFIG_TYPE = 39;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl <em>Faces Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesContextFactoryType()
-	 * @generated
-	 */
-	int FACES_CONTEXT_FACTORY_TYPE = 41;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl <em>Facet Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetExtensionType()
-	 * @generated
-	 */
-	int FACET_EXTENSION_TYPE = 42;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl <em>Facet Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetNameType()
-	 * @generated
-	 */
-	int FACET_NAME_TYPE = 43;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl <em>Facet Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetType()
-	 * @generated
-	 */
-	int FACET_TYPE = 44;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl <em>Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryType()
-	 * @generated
-	 */
-	int FACTORY_TYPE = 45;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl <em>From Action Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromActionType()
-	 * @generated
-	 */
-	int FROM_ACTION_TYPE = 47;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl <em>From Outcome Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromOutcomeType()
-	 * @generated
-	 */
-	int FROM_OUTCOME_TYPE = 48;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl <em>From View Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromViewIdType()
-	 * @generated
-	 */
-	int FROM_VIEW_ID_TYPE = 49;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl <em>Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIconType()
-	 * @generated
-	 */
-	int ICON_TYPE = 50;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl <em>If Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIfType()
-	 * @generated
-	 */
-	int IF_TYPE = 51;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl <em>Key Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyClassType()
-	 * @generated
-	 */
-	int KEY_CLASS_TYPE = 52;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl <em>Key Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyType()
-	 * @generated
-	 */
-	int KEY_TYPE = 53;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl <em>Large Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLargeIconType()
-	 * @generated
-	 */
-	int LARGE_ICON_TYPE = 54;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl <em>Lifecycle Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleFactoryType()
-	 * @generated
-	 */
-	int LIFECYCLE_FACTORY_TYPE = 55;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl <em>Lifecycle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleType()
-	 * @generated
-	 */
-	int LIFECYCLE_TYPE = 56;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl <em>List Entries Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getListEntriesType()
-	 * @generated
-	 */
-	int LIST_ENTRIES_TYPE = 58;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl <em>Locale Config Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLocaleConfigType()
-	 * @generated
-	 */
-	int LOCALE_CONFIG_TYPE = 59;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl <em>Managed Bean Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanClassType()
-	 * @generated
-	 */
-	int MANAGED_BEAN_CLASS_TYPE = 60;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl <em>Managed Bean Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanNameType()
-	 * @generated
-	 */
-	int MANAGED_BEAN_NAME_TYPE = 61;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl <em>Managed Bean Scope Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanScopeType()
-	 * @generated
-	 */
-	int MANAGED_BEAN_SCOPE_TYPE = 62;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl <em>Managed Bean Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanType()
-	 * @generated
-	 */
-	int MANAGED_BEAN_TYPE = 63;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl <em>Managed Property Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedPropertyType()
-	 * @generated
-	 */
-	int MANAGED_PROPERTY_TYPE = 65;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl <em>Map Entries Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntriesType()
-	 * @generated
-	 */
-	int MAP_ENTRIES_TYPE = 66;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl <em>Map Entry Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntryType()
-	 * @generated
-	 */
-	int MAP_ENTRY_TYPE = 67;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl <em>Message Bundle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMessageBundleType()
-	 * @generated
-	 */
-	int MESSAGE_BUNDLE_TYPE = 68;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl <em>Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNameType()
-	 * @generated
-	 */
-	int NAME_TYPE = 69;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl <em>Navigation Case Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationCaseType()
-	 * @generated
-	 */
-	int NAVIGATION_CASE_TYPE = 70;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl <em>Navigation Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationHandlerType()
-	 * @generated
-	 */
-	int NAVIGATION_HANDLER_TYPE = 71;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl <em>Navigation Rule Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleType()
-	 * @generated
-	 */
-	int NAVIGATION_RULE_TYPE = 72;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl <em>Null Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNullValueType()
-	 * @generated
-	 */
-	int NULL_VALUE_TYPE = 74;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl <em>Ordering Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingType()
-	 * @generated
-	 */
-	int ORDERING_TYPE = 75;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl <em>Ordering Ordering Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingOrderingType()
-	 * @generated
-	 */
-	int ORDERING_ORDERING_TYPE = 76;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOthersTypeImpl <em>Ordering Others Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOthersTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingOthersType()
-	 * @generated
-	 */
-	int ORDERING_OTHERS_TYPE = 77;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl <em>Partial View Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPartialViewContextFactoryType()
-	 * @generated
-	 */
-	int PARTIAL_VIEW_CONTEXT_FACTORY_TYPE = 78;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl <em>Phase Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPhaseListenerType()
-	 * @generated
-	 */
-	int PHASE_LISTENER_TYPE = 79;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl <em>Property Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyClassType()
-	 * @generated
-	 */
-	int PROPERTY_CLASS_TYPE = 80;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl <em>Property Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyExtensionType()
-	 * @generated
-	 */
-	int PROPERTY_EXTENSION_TYPE = 81;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl <em>Property Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyNameType()
-	 * @generated
-	 */
-	int PROPERTY_NAME_TYPE = 82;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl <em>Property Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyResolverType()
-	 * @generated
-	 */
-	int PROPERTY_RESOLVER_TYPE = 83;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl <em>Property Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyType()
-	 * @generated
-	 */
-	int PROPERTY_TYPE = 84;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl <em>Redirect Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectType()
-	 * @generated
-	 */
-	int REDIRECT_TYPE = 85;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl <em>Redirect View Param Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectViewParamType()
-	 * @generated
-	 */
-	int REDIRECT_VIEW_PARAM_TYPE = 86;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl <em>Referenced Bean Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanClassType()
-	 * @generated
-	 */
-	int REFERENCED_BEAN_CLASS_TYPE = 87;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl <em>Referenced Bean Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanNameType()
-	 * @generated
-	 */
-	int REFERENCED_BEAN_NAME_TYPE = 88;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl <em>Referenced Bean Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanType()
-	 * @generated
-	 */
-	int REFERENCED_BEAN_TYPE = 89;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl <em>Renderer Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererClassType()
-	 * @generated
-	 */
-	int RENDERER_CLASS_TYPE = 90;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl <em>Renderer Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererExtensionType()
-	 * @generated
-	 */
-	int RENDERER_EXTENSION_TYPE = 91;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl <em>Renderer Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererType()
-	 * @generated
-	 */
-	int RENDERER_TYPE = 92;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl <em>Renderer Type Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererTypeType()
-	 * @generated
-	 */
-	int RENDERER_TYPE_TYPE = 93;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl <em>Render Kit Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitClassType()
-	 * @generated
-	 */
-	int RENDER_KIT_CLASS_TYPE = 94;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl <em>Render Kit Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitFactoryType()
-	 * @generated
-	 */
-	int RENDER_KIT_FACTORY_TYPE = 95;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl <em>Render Kit Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitIdType()
-	 * @generated
-	 */
-	int RENDER_KIT_ID_TYPE = 96;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl <em>Render Kit Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitType()
-	 * @generated
-	 */
-	int RENDER_KIT_TYPE = 97;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl <em>Small Icon Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSmallIconType()
-	 * @generated
-	 */
-	int SMALL_ICON_TYPE = 100;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl <em>Source Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSourceClassType()
-	 * @generated
-	 */
-	int SOURCE_CLASS_TYPE = 101;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl <em>State Manager Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getStateManagerType()
-	 * @generated
-	 */
-	int STATE_MANAGER_TYPE = 102;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl <em>Suggested Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSuggestedValueType()
-	 * @generated
-	 */
-	int SUGGESTED_VALUE_TYPE = 103;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl <em>Supported Locale Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSupportedLocaleType()
-	 * @generated
-	 */
-	int SUPPORTED_LOCALE_TYPE = 104;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl <em>System Event Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventClassType()
-	 * @generated
-	 */
-	int SYSTEM_EVENT_CLASS_TYPE = 105;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl <em>System Event Listener Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventListenerClassType()
-	 * @generated
-	 */
-	int SYSTEM_EVENT_LISTENER_CLASS_TYPE = 106;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl <em>System Event Listener Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventListenerType()
-	 * @generated
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE = 107;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl <em>Tag Handler Delegate Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getTagHandlerDelegateFactoryType()
-	 * @generated
-	 */
-	int TAG_HANDLER_DELEGATE_FACTORY_TYPE = 108;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl <em>To View Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getToViewIdType()
-	 * @generated
-	 */
-	int TO_VIEW_ID_TYPE = 109;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl <em>Validator Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorClassType()
-	 * @generated
-	 */
-	int VALIDATOR_CLASS_TYPE = 110;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl <em>Validator Id Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorIdType()
-	 * @generated
-	 */
-	int VALIDATOR_ID_TYPE = 111;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl <em>Validator Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorType()
-	 * @generated
-	 */
-	int VALIDATOR_TYPE = 112;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl <em>Value Class Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueClassType()
-	 * @generated
-	 */
-	int VALUE_CLASS_TYPE = 114;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl <em>Value Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueType()
-	 * @generated
-	 */
-	int VALUE_TYPE = 115;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl <em>Variable Resolver Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVariableResolverType()
-	 * @generated
-	 */
-	int VARIABLE_RESOLVER_TYPE = 116;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl <em>View Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewHandlerType()
-	 * @generated
-	 */
-	int VIEW_HANDLER_TYPE = 117;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl <em>Application Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationExtensionType()
-	 * @generated
-	 */
-    int APPLICATION_EXTENSION_TYPE = 4;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Application Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int APPLICATION_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Attribute Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int ATTRIBUTE_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int ATTRIBUTE_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Attribute Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Attribute Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__ATTRIBUTE_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__ATTRIBUTE_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__DEFAULT_VALUE = 5;
-
-				/**
-	 * The feature id for the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__SUGGESTED_VALUE = 6;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION = 7;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE__ID = 8;
-
-				/**
-	 * The number of structural features of the '<em>Attribute Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ATTRIBUTE_TYPE_FEATURE_COUNT = 9;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Behavior Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Behavior Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__BEHAVIOR_ID = 3;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__BEHAVIOR_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__ATTRIBUTE = 5;
-
-				/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__PROPERTY = 6;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE__BEHAVIOR_EXTENSION = 7;
-
-				/**
-	 * The number of structural features of the '<em>Behavior Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_TYPE_FEATURE_COUNT = 8;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Behavior Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BEHAVIOR_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Client Behavior Renderer Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Client Behavior Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE = 0;
-
-				/**
-	 * The feature id for the '<em><b>Client Behavior Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS = 1;
-
-				/**
-	 * The number of structural features of the '<em>Client Behavior Renderer Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Client Behavior Renderer Type Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Component Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int COMPONENT_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int COMPONENT_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Component Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_FAMILY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_FAMILY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Component Family Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_FAMILY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Component Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__COMPONENT_TYPE = 3;
-
-				/**
-	 * The feature id for the '<em><b>Component Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__COMPONENT_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Facet</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__FACET = 5;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__ATTRIBUTE = 6;
-
-				/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__PROPERTY = 7;
-
-				/**
-	 * The feature id for the '<em><b>Component Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__COMPONENT_EXTENSION = 8;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE__ID = 9;
-
-				/**
-	 * The number of structural features of the '<em>Component Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE_FEATURE_COUNT = 10;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Component Type Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int COMPONENT_TYPE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Converter Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_FOR_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Converter For Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_FOR_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Converter Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Converter Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__CONVERTER_ID = 3;
-
-				/**
-	 * The feature id for the '<em><b>Converter For Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__CONVERTER_FOR_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Converter Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__CONVERTER_CLASS = 5;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__ATTRIBUTE = 6;
-
-				/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__PROPERTY = 7;
-
-				/**
-	 * The feature id for the '<em><b>Converter Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int CONVERTER_TYPE__CONVERTER_EXTENSION = 8;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE__ID = 9;
-
-				/**
-	 * The number of structural features of the '<em>Converter Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int CONVERTER_TYPE_FEATURE_COUNT = 10;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl <em>Resource Bundle Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getResourceBundleType()
-	 * @generated
-	 */
-    int RESOURCE_BUNDLE_TYPE = 118;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl <em>Base Name Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBaseNameType()
-	 * @generated
-	 */
-    int BASE_NAME_TYPE = 119;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl <em>Var Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVarType()
-	 * @generated
-	 */
-    int VAR_TYPE = 120;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl <em>Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigExtensionType()
-	 * @generated
-	 */
-    int FACES_CONFIG_EXTENSION_TYPE = 40;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl <em>Factory Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryExtensionType()
-	 * @generated
-	 */
-    int FACTORY_EXTENSION_TYPE = 46;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl <em>Lifecycle Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleExtensionType()
-	 * @generated
-	 */
-    int LIFECYCLE_EXTENSION_TYPE = 57;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl <em>Converter Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterExtensionType()
-	 * @generated
-	 */
-    int CONVERTER_EXTENSION_TYPE = 25;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int CONVERTER_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int CONVERTER_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int CONVERTER_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Converter Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int CONVERTER_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_LOCALE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_LOCALE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Default Locale Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_LOCALE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_RENDER_KIT_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Default Render Kit Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_RENDER_KIT_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Validator Id</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALIDATORS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Default Validators Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALIDATORS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALUE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALUE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Default Value Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DEFAULT_VALUE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTION_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTION_TYPE__LANG = 1;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTION_TYPE__ID = 2;
-
-				/**
-	 * The number of structural features of the '<em>Description Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DESCRIPTION_TYPE_FEATURE_COUNT = 3;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISPLAY_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISPLAY_NAME_TYPE__LANG = 1;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISPLAY_NAME_TYPE__ID = 2;
-
-				/**
-	 * The number of structural features of the '<em>Display Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DISPLAY_NAME_TYPE_FEATURE_COUNT = 3;
-
-				/**
-	 * The feature id for the '<em><b>Mixed</b></em>' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MIXED = 0;
-
-				/**
-	 * The feature id for the '<em><b>XMLNS Prefix Map</b></em>' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__XMLNS_PREFIX_MAP = 1;
-
-				/**
-	 * The feature id for the '<em><b>XSI Schema Location</b></em>' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = 2;
-
-				/**
-	 * The feature id for the '<em><b>Absolute Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ABSOLUTE_ORDERING = 3;
-
-				/**
-	 * The feature id for the '<em><b>Action Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ACTION_LISTENER = 4;
-
-				/**
-	 * The feature id for the '<em><b>Application</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__APPLICATION = 5;
-
-				/**
-	 * The feature id for the '<em><b>Application Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__APPLICATION_FACTORY = 6;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ATTRIBUTE = 7;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ATTRIBUTE_CLASS = 8;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ATTRIBUTE_EXTENSION = 9;
-
-				/**
-	 * The feature id for the '<em><b>Attribute Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ATTRIBUTE_NAME = 10;
-
-				/**
-	 * The feature id for the '<em><b>Behavior</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__BEHAVIOR = 11;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__BEHAVIOR_CLASS = 12;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__BEHAVIOR_ID = 13;
-
-				/**
-	 * The feature id for the '<em><b>Behavior Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__BEHAVIOR_EXTENSION = 14;
-
-				/**
-	 * The feature id for the '<em><b>Component</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__COMPONENT = 15;
-
-				/**
-	 * The feature id for the '<em><b>Component Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__COMPONENT_CLASS = 16;
-
-				/**
-	 * The feature id for the '<em><b>Component Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__COMPONENT_EXTENSION = 17;
-
-				/**
-	 * The feature id for the '<em><b>Component Family</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__COMPONENT_FAMILY = 18;
-
-				/**
-	 * The feature id for the '<em><b>Component Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__COMPONENT_TYPE = 19;
-
-				/**
-	 * The feature id for the '<em><b>Converter</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__CONVERTER = 20;
-
-				/**
-	 * The feature id for the '<em><b>Converter Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__CONVERTER_CLASS = 21;
-
-				/**
-	 * The feature id for the '<em><b>Converter For Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__CONVERTER_FOR_CLASS = 22;
-
-				/**
-	 * The feature id for the '<em><b>Converter Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__CONVERTER_ID = 23;
-
-				/**
-	 * The feature id for the '<em><b>Default Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DEFAULT_LOCALE = 24;
-
-				/**
-	 * The feature id for the '<em><b>Default Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID = 25;
-
-				/**
-	 * The feature id for the '<em><b>Default Validators</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DEFAULT_VALIDATORS = 26;
-
-				/**
-	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DEFAULT_VALUE = 27;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DESCRIPTION = 28;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__DISPLAY_NAME = 29;
-
-				/**
-	 * The feature id for the '<em><b>Exception Handler Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY = 30;
-
-				/**
-	 * The feature id for the '<em><b>External Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY = 31;
-
-				/**
-	 * The feature id for the '<em><b>Faces Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACES_CONFIG = 32;
-
-				/**
-	 * The feature id for the '<em><b>Faces Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACES_CONTEXT_FACTORY = 33;
-
-				/**
-	 * The feature id for the '<em><b>Facet</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACET = 34;
-
-				/**
-	 * The feature id for the '<em><b>Facet Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACET_EXTENSION = 35;
-
-				/**
-	 * The feature id for the '<em><b>Facet Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACET_NAME = 36;
-
-				/**
-	 * The feature id for the '<em><b>Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FACTORY = 37;
-
-				/**
-	 * The feature id for the '<em><b>From Action</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FROM_ACTION = 38;
-
-				/**
-	 * The feature id for the '<em><b>From Outcome</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FROM_OUTCOME = 39;
-
-				/**
-	 * The feature id for the '<em><b>From View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__FROM_VIEW_ID = 40;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ICON = 41;
-
-				/**
-	 * The feature id for the '<em><b>If</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__IF = 42;
-
-				/**
-	 * The feature id for the '<em><b>Key</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__KEY = 43;
-
-				/**
-	 * The feature id for the '<em><b>Key Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__KEY_CLASS = 44;
-
-				/**
-	 * The feature id for the '<em><b>Large Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__LARGE_ICON = 45;
-
-				/**
-	 * The feature id for the '<em><b>Lifecycle</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__LIFECYCLE = 46;
-
-				/**
-	 * The feature id for the '<em><b>Lifecycle Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__LIFECYCLE_FACTORY = 47;
-
-				/**
-	 * The feature id for the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__LIST_ENTRIES = 48;
-
-				/**
-	 * The feature id for the '<em><b>Locale Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__LOCALE_CONFIG = 49;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MANAGED_BEAN = 50;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MANAGED_BEAN_CLASS = 51;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MANAGED_BEAN_NAME = 52;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Scope</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MANAGED_BEAN_SCOPE = 53;
-
-				/**
-	 * The feature id for the '<em><b>Managed Property</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MANAGED_PROPERTY = 54;
-
-				/**
-	 * The feature id for the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MAP_ENTRIES = 55;
-
-				/**
-	 * The feature id for the '<em><b>Map Entry</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MAP_ENTRY = 56;
-
-				/**
-	 * The feature id for the '<em><b>Message Bundle</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__MESSAGE_BUNDLE = 57;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__NAME = 58;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Case</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__NAVIGATION_CASE = 59;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__NAVIGATION_HANDLER = 60;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Rule</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__NAVIGATION_RULE = 61;
-
-				/**
-	 * The feature id for the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__NULL_VALUE = 62;
-
-				/**
-	 * The feature id for the '<em><b>Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ORDERING = 63;
-
-				/**
-	 * The feature id for the '<em><b>Ordering Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__ORDERING_ORDERING = 64;
-
-				/**
-	 * The feature id for the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__OTHERS = 65;
-
-				/**
-	 * The feature id for the '<em><b>Partial View Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY = 66;
-
-				/**
-	 * The feature id for the '<em><b>Phase Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PHASE_LISTENER = 67;
-
-				/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROPERTY = 68;
-
-				/**
-	 * The feature id for the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROPERTY_CLASS = 69;
-
-				/**
-	 * The feature id for the '<em><b>Property Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROPERTY_EXTENSION = 70;
-
-				/**
-	 * The feature id for the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROPERTY_NAME = 71;
-
-				/**
-	 * The feature id for the '<em><b>Property Resolver</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__PROPERTY_RESOLVER = 72;
-
-				/**
-	 * The feature id for the '<em><b>Redirect</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__REDIRECT = 73;
-
-				/**
-	 * The feature id for the '<em><b>Redirect View Param</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__REDIRECT_VIEW_PARAM = 74;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__REFERENCED_BEAN = 75;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__REFERENCED_BEAN_CLASS = 76;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__REFERENCED_BEAN_NAME = 77;
-
-				/**
-	 * The feature id for the '<em><b>Renderer</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDERER = 78;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDERER_CLASS = 79;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Extension</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDERER_EXTENSION = 80;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDERER_TYPE = 81;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDER_KIT = 82;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDER_KIT_CLASS = 83;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDER_KIT_FACTORY = 84;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RENDER_KIT_ID = 85;
-
-				/**
-	 * The feature id for the '<em><b>Resource Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__RESOURCE_HANDLER = 86;
-
-				/**
-	 * The feature id for the '<em><b>Small Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SMALL_ICON = 87;
-
-				/**
-	 * The feature id for the '<em><b>Source Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SOURCE_CLASS = 88;
-
-				/**
-	 * The feature id for the '<em><b>State Manager</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__STATE_MANAGER = 89;
-
-				/**
-	 * The feature id for the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SUGGESTED_VALUE = 90;
-
-				/**
-	 * The feature id for the '<em><b>Supported Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SUPPORTED_LOCALE = 91;
-
-				/**
-	 * The feature id for the '<em><b>System Event Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SYSTEM_EVENT_CLASS = 92;
-
-				/**
-	 * The feature id for the '<em><b>System Event Listener</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER = 93;
-
-				/**
-	 * The feature id for the '<em><b>System Event Listener Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS = 94;
-
-				/**
-	 * The feature id for the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY = 95;
-
-				/**
-	 * The feature id for the '<em><b>To View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__TO_VIEW_ID = 96;
-
-				/**
-	 * The feature id for the '<em><b>Validator</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VALIDATOR = 97;
-
-				/**
-	 * The feature id for the '<em><b>Validator Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VALIDATOR_CLASS = 98;
-
-				/**
-	 * The feature id for the '<em><b>Validator Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VALIDATOR_ID = 99;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VALUE = 100;
-
-				/**
-	 * The feature id for the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VALUE_CLASS = 101;
-
-				/**
-	 * The feature id for the '<em><b>Variable Resolver</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VARIABLE_RESOLVER = 102;
-
-				/**
-	 * The feature id for the '<em><b>View Declaration Language Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY = 103;
-
-				/**
-	 * The feature id for the '<em><b>View Handler</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VIEW_HANDLER = 104;
-
-				/**
-	 * The feature id for the '<em><b>Visit Context Factory</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY = 105;
-
-				/**
-	 * The number of structural features of the '<em>Document Root</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DOCUMENT_ROOT_FEATURE_COUNT = 106;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ATTRIBUTE__NAME = 0;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ATTRIBUTE__VALUE = 1;
-
-				/**
-	 * The number of structural features of the '<em>Dynamic Attribute</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ATTRIBUTE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ELEMENT__CHILD_NODES = 0;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ELEMENT__NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Attributes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ELEMENT__ATTRIBUTES = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ELEMENT__TEXT_CONTENT = 3;
-
-				/**
-	 * The number of structural features of the '<em>Dynamic Element</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int DYNAMIC_ELEMENT_FEATURE_COUNT = 4;
-
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EL_RESOLVER_TYPE__TEXT_CONTENT = 0;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EL_RESOLVER_TYPE__ID = 1;
-
-    /**
-	 * The number of structural features of the '<em>EL Resolver Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int EL_RESOLVER_TYPE_FEATURE_COUNT = 2;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl <em>Exception Handler Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExceptionHandlerFactoryType()
-	 * @generated
-	 */
-	int EXCEPTION_HANDLER_FACTORY_TYPE = 36;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXCEPTION_HANDLER_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Exception Handler Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXCEPTION_HANDLER_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl <em>External Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExternalContextFactoryType()
-	 * @generated
-	 */
-	int EXTERNAL_CONTEXT_FACTORY_TYPE = 38;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTERNAL_CONTEXT_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>External Context Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXTERNAL_CONTEXT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Application</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__APPLICATION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Ordering</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__ORDERING = 1;
-
-				/**
-	 * The feature id for the '<em><b>Absolute Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__ABSOLUTE_ORDERING = 2;
-
-				/**
-	 * The feature id for the '<em><b>Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__FACTORY = 3;
-
-				/**
-	 * The feature id for the '<em><b>Component</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__COMPONENT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Converter</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__CONVERTER = 5;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__MANAGED_BEAN = 6;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__NAME = 7;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Rule</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__NAVIGATION_RULE = 8;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__REFERENCED_BEAN = 9;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__RENDER_KIT = 10;
-
-				/**
-	 * The feature id for the '<em><b>Lifecycle</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__LIFECYCLE = 11;
-
-				/**
-	 * The feature id for the '<em><b>Validator</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__VALIDATOR = 12;
-
-				/**
-	 * The feature id for the '<em><b>Behavior</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__BEHAVIOR = 13;
-
-				/**
-	 * The feature id for the '<em><b>Faces Config Extension</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION = 14;
-
-				/**
-	 * The feature id for the '<em><b>Xmlns</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__XMLNS = 15;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__ID = 16;
-
-				/**
-	 * The feature id for the '<em><b>Metadata Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE__METADATA_COMPLETE = 17;
-
-				/**
-	 * The number of structural features of the '<em>Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONFIG_TYPE_FEATURE_COUNT = 18;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACES_CONFIG_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACES_CONFIG_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACES_CONFIG_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACES_CONFIG_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONTEXT_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Faces Context Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACES_CONTEXT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACET_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACET_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Facet Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Facet Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Facet Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__FACET_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Facet Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__FACET_EXTENSION = 4;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE__ID = 5;
-
-				/**
-	 * The number of structural features of the '<em>Facet Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACET_TYPE_FEATURE_COUNT = 6;
-
-				/**
-	 * The feature id for the '<em><b>Application Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__APPLICATION_FACTORY = 0;
-
-				/**
-	 * The feature id for the '<em><b>Exception Handler Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY = 1;
-
-				/**
-	 * The feature id for the '<em><b>External Context Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY = 2;
-
-				/**
-	 * The feature id for the '<em><b>Faces Context Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__FACES_CONTEXT_FACTORY = 3;
-
-				/**
-	 * The feature id for the '<em><b>Partial View Context Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY = 4;
-
-				/**
-	 * The feature id for the '<em><b>Lifecycle Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__LIFECYCLE_FACTORY = 5;
-
-				/**
-	 * The feature id for the '<em><b>View Declaration Language Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY = 6;
-
-				/**
-	 * The feature id for the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY = 7;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__RENDER_KIT_FACTORY = 8;
-
-				/**
-	 * The feature id for the '<em><b>Visit Context Factory</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__VISIT_CONTEXT_FACTORY = 9;
-
-				/**
-	 * The feature id for the '<em><b>Factory Extension</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACTORY_TYPE__FACTORY_EXTENSION = 10;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE__ID = 11;
-
-				/**
-	 * The number of structural features of the '<em>Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FACTORY_TYPE_FEATURE_COUNT = 12;
-
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACTORY_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACTORY_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACTORY_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Factory Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int FACTORY_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_ACTION_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_ACTION_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>From Action Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_ACTION_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_OUTCOME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_OUTCOME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>From Outcome Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_OUTCOME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_VIEW_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_VIEW_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>From View Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int FROM_VIEW_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Small Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ICON_TYPE__SMALL_ICON = 0;
-
-				/**
-	 * The feature id for the '<em><b>Large Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ICON_TYPE__LARGE_ICON = 1;
-
-				/**
-	 * The feature id for the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ICON_TYPE__LANG = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ICON_TYPE__ID = 3;
-
-				/**
-	 * The number of structural features of the '<em>Icon Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ICON_TYPE_FEATURE_COUNT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IF_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IF_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>If Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int IF_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Key Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Key Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int KEY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LARGE_ICON_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LARGE_ICON_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Large Icon Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LARGE_ICON_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Lifecycle Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Phase Listener</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_TYPE__PHASE_LISTENER = 0;
-
-				/**
-	 * The feature id for the '<em><b>Lifecycle Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LIFECYCLE_TYPE__LIFECYCLE_EXTENSION = 1;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_TYPE__ID = 2;
-
-				/**
-	 * The number of structural features of the '<em>Lifecycle Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIFECYCLE_TYPE_FEATURE_COUNT = 3;
-
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LIFECYCLE_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LIFECYCLE_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LIFECYCLE_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Lifecycle Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int LIFECYCLE_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_ENTRIES_TYPE__VALUE_CLASS = 0;
-
-				/**
-	 * The feature id for the '<em><b>Null Value</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_ENTRIES_TYPE__NULL_VALUE = 1;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_ENTRIES_TYPE__VALUE = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_ENTRIES_TYPE__ID = 3;
-
-				/**
-	 * The number of structural features of the '<em>List Entries Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LIST_ENTRIES_TYPE_FEATURE_COUNT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Default Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LOCALE_CONFIG_TYPE__DEFAULT_LOCALE = 0;
-
-				/**
-	 * The feature id for the '<em><b>Supported Locale</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE = 1;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LOCALE_CONFIG_TYPE__ID = 2;
-
-				/**
-	 * The number of structural features of the '<em>Locale Config Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LOCALE_CONFIG_TYPE_FEATURE_COUNT = 3;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Managed Bean Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Managed Bean Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_SCOPE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Managed Bean Scope Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_SCOPE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Scope</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE = 5;
-
-				/**
-	 * The feature id for the '<em><b>Managed Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__MANAGED_PROPERTY = 6;
-
-				/**
-	 * The feature id for the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__MAP_ENTRIES = 7;
-
-				/**
-	 * The feature id for the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__LIST_ENTRIES = 8;
-
-				/**
-	 * The feature id for the '<em><b>Managed Bean Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION = 9;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__ID = 10;
-
-				/**
-	 * The feature id for the '<em><b>Eager</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE__EAGER = 11;
-
-				/**
-	 * The number of structural features of the '<em>Managed Bean Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_BEAN_TYPE_FEATURE_COUNT = 12;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl <em>Managed Bean Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanExtensionType()
-	 * @generated
-	 */
-    int MANAGED_BEAN_EXTENSION_TYPE = 64;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int MANAGED_BEAN_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int MANAGED_BEAN_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int MANAGED_BEAN_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Managed Bean Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int MANAGED_BEAN_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__PROPERTY_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__PROPERTY_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__MAP_ENTRIES = 5;
-
-				/**
-	 * The feature id for the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__NULL_VALUE = 6;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__VALUE = 7;
-
-				/**
-	 * The feature id for the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__LIST_ENTRIES = 8;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE__ID = 9;
-
-				/**
-	 * The number of structural features of the '<em>Managed Property Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MANAGED_PROPERTY_TYPE_FEATURE_COUNT = 10;
-
-				/**
-	 * The feature id for the '<em><b>Key Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRIES_TYPE__KEY_CLASS = 0;
-
-				/**
-	 * The feature id for the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRIES_TYPE__VALUE_CLASS = 1;
-
-				/**
-	 * The feature id for the '<em><b>Map Entry</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRIES_TYPE__MAP_ENTRY = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRIES_TYPE__ID = 3;
-
-				/**
-	 * The number of structural features of the '<em>Map Entries Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRIES_TYPE_FEATURE_COUNT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Key</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRY_TYPE__KEY = 0;
-
-				/**
-	 * The feature id for the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRY_TYPE__NULL_VALUE = 1;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRY_TYPE__VALUE = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRY_TYPE__ID = 3;
-
-				/**
-	 * The number of structural features of the '<em>Map Entry Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MAP_ENTRY_TYPE_FEATURE_COUNT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MESSAGE_BUNDLE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MESSAGE_BUNDLE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Message Bundle Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MESSAGE_BUNDLE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>From Action</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__FROM_ACTION = 3;
-
-				/**
-	 * The feature id for the '<em><b>From Outcome</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__FROM_OUTCOME = 4;
-
-				/**
-	 * The feature id for the '<em><b>If</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__IF = 5;
-
-				/**
-	 * The feature id for the '<em><b>To View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__TO_VIEW_ID = 6;
-
-				/**
-	 * The feature id for the '<em><b>Redirect</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__REDIRECT = 7;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE__ID = 8;
-
-				/**
-	 * The number of structural features of the '<em>Navigation Case Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_CASE_TYPE_FEATURE_COUNT = 9;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_HANDLER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_HANDLER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Navigation Handler Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_HANDLER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>From View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__FROM_VIEW_ID = 3;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Case</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__NAVIGATION_CASE = 4;
-
-				/**
-	 * The feature id for the '<em><b>Navigation Rule Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION = 5;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE__ID = 6;
-
-				/**
-	 * The number of structural features of the '<em>Navigation Rule Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NAVIGATION_RULE_TYPE_FEATURE_COUNT = 7;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl <em>Navigation Rule Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleExtensionType()
-	 * @generated
-	 */
-    int NAVIGATION_RULE_EXTENSION_TYPE = 73;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAVIGATION_RULE_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAVIGATION_RULE_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAVIGATION_RULE_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Navigation Rule Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int NAVIGATION_RULE_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NULL_VALUE_TYPE__ID = 0;
-
-				/**
-	 * The number of structural features of the '<em>Null Value Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int NULL_VALUE_TYPE_FEATURE_COUNT = 1;
-
-				/**
-	 * The feature id for the '<em><b>Before</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_TYPE__BEFORE = 0;
-
-				/**
-	 * The feature id for the '<em><b>After</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_TYPE__AFTER = 1;
-
-				/**
-	 * The number of structural features of the '<em>Ordering Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_ORDERING_TYPE__NAME = 0;
-
-				/**
-	 * The feature id for the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_ORDERING_TYPE__OTHERS = 1;
-
-				/**
-	 * The number of structural features of the '<em>Ordering Ordering Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_ORDERING_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_OTHERS_TYPE__ID = 0;
-
-				/**
-	 * The number of structural features of the '<em>Ordering Others Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ORDERING_OTHERS_TYPE_FEATURE_COUNT = 1;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Partial View Context Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARTIAL_VIEW_CONTEXT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE_LISTENER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE_LISTENER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Phase Listener Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PHASE_LISTENER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Property Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int PROPERTY_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int PROPERTY_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Property Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Property Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_RESOLVER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_RESOLVER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Property Resolver Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_RESOLVER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__PROPERTY_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__PROPERTY_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__DEFAULT_VALUE = 5;
-
-				/**
-	 * The feature id for the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__SUGGESTED_VALUE = 6;
-
-				/**
-	 * The feature id for the '<em><b>Property Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__PROPERTY_EXTENSION = 7;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE__ID = 8;
-
-				/**
-	 * The number of structural features of the '<em>Property Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PROPERTY_TYPE_FEATURE_COUNT = 9;
-
-				/**
-	 * The feature id for the '<em><b>View Param</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_TYPE__VIEW_PARAM = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_TYPE__ID = 1;
-
-				/**
-	 * The feature id for the '<em><b>Include View Params</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_TYPE__INCLUDE_VIEW_PARAMS = 2;
-
-				/**
-	 * The number of structural features of the '<em>Redirect Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_TYPE_FEATURE_COUNT = 3;
-
-				/**
-	 * The feature id for the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_VIEW_PARAM_TYPE__NAME = 0;
-
-				/**
-	 * The feature id for the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_VIEW_PARAM_TYPE__VALUE = 1;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_VIEW_PARAM_TYPE__ID = 2;
-
-				/**
-	 * The number of structural features of the '<em>Redirect View Param Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REDIRECT_VIEW_PARAM_TYPE_FEATURE_COUNT = 3;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Referenced Bean Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Referenced Bean Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Referenced Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE__ID = 5;
-
-				/**
-	 * The number of structural features of the '<em>Referenced Bean Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int REFERENCED_BEAN_TYPE_FEATURE_COUNT = 6;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Renderer Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDERER_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDERER_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Renderer Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Component Family</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__COMPONENT_FAMILY = 3;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__RENDERER_TYPE = 4;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__RENDERER_CLASS = 5;
-
-				/**
-	 * The feature id for the '<em><b>Facet</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__FACET = 6;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__ATTRIBUTE = 7;
-
-				/**
-	 * The feature id for the '<em><b>Renderer Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__RENDERER_EXTENSION = 8;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE__ID = 9;
-
-				/**
-	 * The number of structural features of the '<em>Renderer Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE_FEATURE_COUNT = 10;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Renderer Type Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDERER_TYPE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Render Kit Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Render Kit Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Render Kit Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__RENDER_KIT_ID = 3;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__RENDER_KIT_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Renderer</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__RENDERER = 5;
-
-				/**
-	 * The feature id for the '<em><b>Client Behavior Renderer</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER = 6;
-
-				/**
-	 * The feature id for the '<em><b>Render Kit Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDER_KIT_TYPE__RENDER_KIT_EXTENSION = 7;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE__ID = 8;
-
-				/**
-	 * The number of structural features of the '<em>Render Kit Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RENDER_KIT_TYPE_FEATURE_COUNT = 9;
-
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl <em>Validator Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorExtensionType()
-	 * @generated
-	 */
-    int VALIDATOR_EXTENSION_TYPE = 113;
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl <em>View Declaration Language Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewDeclarationLanguageFactoryType()
-	 * @generated
-	 */
-	int VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE = 121;
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl <em>Visit Context Factory Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVisitContextFactoryType()
-	 * @generated
-	 */
-	int VISIT_CONTEXT_FACTORY_TYPE = 122;
-
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType <em>Absolute Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Absolute Ordering Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType
-	 * @generated
-	 */
-	EClass getAbsoluteOrderingType();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getName()
-	 * @see #getAbsoluteOrderingType()
-	 * @generated
-	 */
-	EReference getAbsoluteOrderingType_Name();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getOthers <em>Others</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Others</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType#getOthers()
-	 * @see #getAbsoluteOrderingType()
-	 * @generated
-	 */
-	EReference getAbsoluteOrderingType_Others();
-
-				/**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl <em>Render Kit Extension Type</em>}' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitExtensionType()
-	 * @generated
-	 */
-    int RENDER_KIT_EXTENSION_TYPE = 98;
-
-    /**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDER_KIT_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-    /**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDER_KIT_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-    /**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDER_KIT_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-    /**
-	 * The number of structural features of the '<em>Render Kit Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RENDER_KIT_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-
-    /**
-	 * The meta object id for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl <em>Resource Handler Type</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getResourceHandlerType()
-	 * @generated
-	 */
-	int RESOURCE_HANDLER_TYPE = 99;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_HANDLER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_HANDLER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Resource Handler Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_HANDLER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SMALL_ICON_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SMALL_ICON_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Small Icon Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SMALL_ICON_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SOURCE_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SOURCE_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Source Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SOURCE_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MANAGER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MANAGER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>State Manager Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int STATE_MANAGER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUGGESTED_VALUE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUGGESTED_VALUE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Suggested Value Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUGGESTED_VALUE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTED_LOCALE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTED_LOCALE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Supported Locale Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SUPPORTED_LOCALE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>System Event Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>System Event Listener Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>System Event Listener Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS = 0;
-
-				/**
-	 * The feature id for the '<em><b>System Event Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS = 1;
-
-				/**
-	 * The feature id for the '<em><b>Source Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS = 2;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE__ID = 3;
-
-				/**
-	 * The number of structural features of the '<em>System Event Listener Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SYSTEM_EVENT_LISTENER_TYPE_FEATURE_COUNT = 4;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Tag Handler Delegate Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_HANDLER_DELEGATE_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TO_VIEW_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TO_VIEW_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>To View Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TO_VIEW_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Validator Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_ID_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_ID_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Validator Id Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_ID_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Validator Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__VALIDATOR_ID = 3;
-
-				/**
-	 * The feature id for the '<em><b>Validator Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__VALIDATOR_CLASS = 4;
-
-				/**
-	 * The feature id for the '<em><b>Attribute</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__ATTRIBUTE = 5;
-
-				/**
-	 * The feature id for the '<em><b>Property</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__PROPERTY = 6;
-
-				/**
-	 * The feature id for the '<em><b>Validator Extension</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VALIDATOR_TYPE__VALIDATOR_EXTENSION = 7;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE__ID = 8;
-
-				/**
-	 * The number of structural features of the '<em>Validator Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALIDATOR_TYPE_FEATURE_COUNT = 9;
-
-				/**
-	 * The feature id for the '<em><b>Child Nodes</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VALIDATOR_EXTENSION_TYPE__CHILD_NODES = EXTENSION_TYPE__CHILD_NODES;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VALIDATOR_EXTENSION_TYPE__TEXT_CONTENT = EXTENSION_TYPE__TEXT_CONTENT;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VALIDATOR_EXTENSION_TYPE__ID = EXTENSION_TYPE__ID;
-
-				/**
-	 * The number of structural features of the '<em>Validator Extension Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VALIDATOR_EXTENSION_TYPE_FEATURE_COUNT = EXTENSION_TYPE_FEATURE_COUNT + 0;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_CLASS_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_CLASS_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Value Class Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_CLASS_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Value Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VALUE_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABLE_RESOLVER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABLE_RESOLVER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Variable Resolver Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VARIABLE_RESOLVER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_HANDLER_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_HANDLER_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>View Handler Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_HANDLER_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Description</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__DESCRIPTION = 0;
-
-				/**
-	 * The feature id for the '<em><b>Display Name</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__DISPLAY_NAME = 1;
-
-				/**
-	 * The feature id for the '<em><b>Icon</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__ICON = 2;
-
-				/**
-	 * The feature id for the '<em><b>Base Name</b></em>' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__BASE_NAME = 3;
-
-				/**
-	 * The feature id for the '<em><b>Var</b></em>' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__VAR = 4;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE__ID = 5;
-
-				/**
-	 * The number of structural features of the '<em>Resource Bundle Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int RESOURCE_BUNDLE_TYPE_FEATURE_COUNT = 6;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int BASE_NAME_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int BASE_NAME_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Base Name Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int BASE_NAME_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VAR_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VAR_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Var Type</em>' class.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-    int VAR_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>View Declaration Language Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-				/**
-	 * The feature id for the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = 0;
-
-				/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VISIT_CONTEXT_FACTORY_TYPE__ID = 1;
-
-				/**
-	 * The number of structural features of the '<em>Visit Context Factory Type</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int VISIT_CONTEXT_FACTORY_TYPE_FEATURE_COUNT = 2;
-
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType <em>Action Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Action Listener Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType
-	 * @generated
-	 */
-	EClass getActionListenerType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getTextContent()
-	 * @see #getActionListenerType()
-	 * @generated
-	 */
-	EAttribute getActionListenerType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType#getId()
-	 * @see #getActionListenerType()
-	 * @generated
-	 */
-	EAttribute getActionListenerType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType <em>Application Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Application Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType
-	 * @generated
-	 */
-	EClass getApplicationFactoryType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getTextContent()
-	 * @see #getApplicationFactoryType()
-	 * @generated
-	 */
-	EAttribute getApplicationFactoryType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType#getId()
-	 * @see #getApplicationFactoryType()
-	 * @generated
-	 */
-	EAttribute getApplicationFactoryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType <em>Application Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Application Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType
-	 * @generated
-	 */
-	EClass getApplicationType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getActionListener <em>Action Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Action Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getActionListener()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_ActionListener();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultRenderKitId <em>Default Render Kit Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Default Render Kit Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultRenderKitId()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_DefaultRenderKitId();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getMessageBundle <em>Message Bundle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Message Bundle</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getMessageBundle()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_MessageBundle();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getNavigationHandler <em>Navigation Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Navigation Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getNavigationHandler()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_NavigationHandler();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getViewHandler <em>View Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>View Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getViewHandler()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_ViewHandler();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getStateManager <em>State Manager</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>State Manager</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getStateManager()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_StateManager();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getPropertyResolver <em>Property Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property Resolver</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getPropertyResolver()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_PropertyResolver();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getVariableResolver <em>Variable Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Variable Resolver</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getVariableResolver()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_VariableResolver();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceHandler <em>Resource Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Resource Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceHandler()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_ResourceHandler();
-
-				/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getSystemEventListener <em>System Event Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>System Event Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getSystemEventListener()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_SystemEventListener();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getLocaleConfig <em>Locale Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Locale Config</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getLocaleConfig()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_LocaleConfig();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getId()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EAttribute getApplicationType_Id();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getELResolver <em>EL Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>EL Resolver</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getELResolver()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-    EReference getApplicationType_ELResolver();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceBundle <em>Resource Bundle</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Resource Bundle</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getResourceBundle()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-    EReference getApplicationType_ResourceBundle();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getApplicationExtension <em>Application Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Application Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getApplicationExtension()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-    EReference getApplicationType_ApplicationExtension();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultValidators <em>Default Validators</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Default Validators</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType#getDefaultValidators()
-	 * @see #getApplicationType()
-	 * @generated
-	 */
-	EReference getApplicationType_DefaultValidators();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType <em>Attribute Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Attribute Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType
-	 * @generated
-	 */
-	EClass getAttributeClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getTextContent()
-	 * @see #getAttributeClassType()
-	 * @generated
-	 */
-	EAttribute getAttributeClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType#getId()
-	 * @see #getAttributeClassType()
-	 * @generated
-	 */
-	EAttribute getAttributeClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType <em>Attribute Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Attribute Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType
-	 * @generated
-	 */
-	EClass getAttributeExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType <em>Attribute Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Attribute Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType
-	 * @generated
-	 */
-	EClass getAttributeNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getTextContent()
-	 * @see #getAttributeNameType()
-	 * @generated
-	 */
-	EAttribute getAttributeNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType#getId()
-	 * @see #getAttributeNameType()
-	 * @generated
-	 */
-	EAttribute getAttributeNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType <em>Attribute Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Attribute Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType
-	 * @generated
-	 */
-	EClass getAttributeType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDescription()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDisplayName()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getIcon()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName <em>Attribute Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeName()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_AttributeName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass <em>Attribute Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeClass()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_AttributeClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue <em>Default Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getDefaultValue()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_DefaultValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue <em>Suggested Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Suggested Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getSuggestedValue()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_SuggestedValue();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeExtension <em>Attribute Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getAttributeExtension()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EReference getAttributeType_AttributeExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType#getId()
-	 * @see #getAttributeType()
-	 * @generated
-	 */
-	EAttribute getAttributeType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType <em>Behavior Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Behavior Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType
-	 * @generated
-	 */
-	EClass getBehaviorClassType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getTextContent()
-	 * @see #getBehaviorClassType()
-	 * @generated
-	 */
-	EAttribute getBehaviorClassType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType#getId()
-	 * @see #getBehaviorClassType()
-	 * @generated
-	 */
-	EAttribute getBehaviorClassType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType <em>Behavior Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Behavior Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType
-	 * @generated
-	 */
-	EClass getBehaviorIdType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getTextContent()
-	 * @see #getBehaviorIdType()
-	 * @generated
-	 */
-	EAttribute getBehaviorIdType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType#getId()
-	 * @see #getBehaviorIdType()
-	 * @generated
-	 */
-	EAttribute getBehaviorIdType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType <em>Behavior Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Behavior Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType
-	 * @generated
-	 */
-	EClass getBehaviorType();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDescription()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_Description();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getDisplayName()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_DisplayName();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getIcon()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_Icon();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorId <em>Behavior Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorId()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_BehaviorId();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorClass <em>Behavior Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorClass()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_BehaviorClass();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getAttribute()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_Attribute();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getProperty()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_Property();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorExtension <em>Behavior Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Behavior Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType#getBehaviorExtension()
-	 * @see #getBehaviorType()
-	 * @generated
-	 */
-	EReference getBehaviorType_BehaviorExtension();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType <em>Behavior Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Behavior Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType
-	 * @generated
-	 */
-	EClass getBehaviorExtensionType();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType <em>Client Behavior Renderer Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Client Behavior Renderer Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType
-	 * @generated
-	 */
-	EClass getClientBehaviorRendererClassType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getTextContent()
-	 * @see #getClientBehaviorRendererClassType()
-	 * @generated
-	 */
-	EAttribute getClientBehaviorRendererClassType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType#getId()
-	 * @see #getClientBehaviorRendererClassType()
-	 * @generated
-	 */
-	EAttribute getClientBehaviorRendererClassType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Client Behavior Renderer Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType
-	 * @generated
-	 */
-	EClass getClientBehaviorRendererType();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Client Behavior Renderer Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererType()
-	 * @see #getClientBehaviorRendererType()
-	 * @generated
-	 */
-	EReference getClientBehaviorRendererType_ClientBehaviorRendererType();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererClass <em>Client Behavior Renderer Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Client Behavior Renderer Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType#getClientBehaviorRendererClass()
-	 * @see #getClientBehaviorRendererType()
-	 * @generated
-	 */
-	EReference getClientBehaviorRendererType_ClientBehaviorRendererClass();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType <em>Client Behavior Renderer Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Client Behavior Renderer Type Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType
-	 * @generated
-	 */
-	EClass getClientBehaviorRendererTypeType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getTextContent()
-	 * @see #getClientBehaviorRendererTypeType()
-	 * @generated
-	 */
-	EAttribute getClientBehaviorRendererTypeType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType#getId()
-	 * @see #getClientBehaviorRendererTypeType()
-	 * @generated
-	 */
-	EAttribute getClientBehaviorRendererTypeType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType <em>Component Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType
-	 * @generated
-	 */
-	EClass getComponentClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getTextContent()
-	 * @see #getComponentClassType()
-	 * @generated
-	 */
-	EAttribute getComponentClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType#getId()
-	 * @see #getComponentClassType()
-	 * @generated
-	 */
-	EAttribute getComponentClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType <em>Component Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType
-	 * @generated
-	 */
-	EClass getComponentExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType <em>Component Family Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Family Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType
-	 * @generated
-	 */
-	EClass getComponentFamilyType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getTextContent()
-	 * @see #getComponentFamilyType()
-	 * @generated
-	 */
-	EAttribute getComponentFamilyType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType#getId()
-	 * @see #getComponentFamilyType()
-	 * @generated
-	 */
-	EAttribute getComponentFamilyType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType <em>Component Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType
-	 * @generated
-	 */
-	EClass getComponentType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDescription()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getDisplayName()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getIcon()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType <em>Component Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentType()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_ComponentType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass <em>Component Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentClass()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_ComponentClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getFacet <em>Facet</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Facet</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getFacet()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Facet();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getAttribute()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Attribute();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getProperty()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_Property();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentExtension <em>Component Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Component Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getComponentExtension()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EReference getComponentType_ComponentExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType#getId()
-	 * @see #getComponentType()
-	 * @generated
-	 */
-	EAttribute getComponentType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType <em>Component Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Component Type Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType
-	 * @generated
-	 */
-	EClass getComponentTypeType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getTextContent()
-	 * @see #getComponentTypeType()
-	 * @generated
-	 */
-	EAttribute getComponentTypeType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType#getId()
-	 * @see #getComponentTypeType()
-	 * @generated
-	 */
-	EAttribute getComponentTypeType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType <em>Converter Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Converter Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType
-	 * @generated
-	 */
-	EClass getConverterClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getTextContent()
-	 * @see #getConverterClassType()
-	 * @generated
-	 */
-	EAttribute getConverterClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType#getId()
-	 * @see #getConverterClassType()
-	 * @generated
-	 */
-	EAttribute getConverterClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType <em>Converter For Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Converter For Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType
-	 * @generated
-	 */
-	EClass getConverterForClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getTextContent()
-	 * @see #getConverterForClassType()
-	 * @generated
-	 */
-	EAttribute getConverterForClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType#getId()
-	 * @see #getConverterForClassType()
-	 * @generated
-	 */
-	EAttribute getConverterForClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType <em>Converter Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Converter Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType
-	 * @generated
-	 */
-	EClass getConverterIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getTextContent()
-	 * @see #getConverterIdType()
-	 * @generated
-	 */
-	EAttribute getConverterIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType#getId()
-	 * @see #getConverterIdType()
-	 * @generated
-	 */
-	EAttribute getConverterIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType <em>Converter Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Converter Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType
-	 * @generated
-	 */
-	EClass getConverterType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDescription()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getDisplayName()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getIcon()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId <em>Converter Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterId()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_ConverterId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass <em>Converter For Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter For Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterForClass()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_ConverterForClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass <em>Converter Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterClass()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_ConverterClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getAttribute()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_Attribute();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getProperty()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EReference getConverterType_Property();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterExtension <em>Converter Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Converter Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getConverterExtension()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-    EReference getConverterType_ConverterExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType#getId()
-	 * @see #getConverterType()
-	 * @generated
-	 */
-	EAttribute getConverterType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType <em>Default Locale Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Default Locale Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType
-	 * @generated
-	 */
-	EClass getDefaultLocaleType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getTextContent()
-	 * @see #getDefaultLocaleType()
-	 * @generated
-	 */
-	EAttribute getDefaultLocaleType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType#getId()
-	 * @see #getDefaultLocaleType()
-	 * @generated
-	 */
-	EAttribute getDefaultLocaleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType <em>Default Render Kit Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Default Render Kit Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType
-	 * @generated
-	 */
-	EClass getDefaultRenderKitIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getTextContent()
-	 * @see #getDefaultRenderKitIdType()
-	 * @generated
-	 */
-	EAttribute getDefaultRenderKitIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType#getId()
-	 * @see #getDefaultRenderKitIdType()
-	 * @generated
-	 */
-	EAttribute getDefaultRenderKitIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType <em>Default Validators Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Default Validators Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType
-	 * @generated
-	 */
-	EClass getDefaultValidatorsType();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getValidatorId <em>Validator Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Validator Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getValidatorId()
-	 * @see #getDefaultValidatorsType()
-	 * @generated
-	 */
-	EReference getDefaultValidatorsType_ValidatorId();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType#getId()
-	 * @see #getDefaultValidatorsType()
-	 * @generated
-	 */
-	EAttribute getDefaultValidatorsType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType <em>Default Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Default Value Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType
-	 * @generated
-	 */
-	EClass getDefaultValueType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getTextContent()
-	 * @see #getDefaultValueType()
-	 * @generated
-	 */
-	EAttribute getDefaultValueType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType#getId()
-	 * @see #getDefaultValueType()
-	 * @generated
-	 */
-	EAttribute getDefaultValueType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType <em>Description Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Description Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType
-	 * @generated
-	 */
-	EClass getDescriptionType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getTextContent()
-	 * @see #getDescriptionType()
-	 * @generated
-	 */
-	EAttribute getDescriptionType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang <em>Lang</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Lang</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getLang()
-	 * @see #getDescriptionType()
-	 * @generated
-	 */
-	EAttribute getDescriptionType_Lang();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType#getId()
-	 * @see #getDescriptionType()
-	 * @generated
-	 */
-	EAttribute getDescriptionType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType <em>Display Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Display Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType
-	 * @generated
-	 */
-	EClass getDisplayNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getTextContent()
-	 * @see #getDisplayNameType()
-	 * @generated
-	 */
-	EAttribute getDisplayNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang <em>Lang</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Lang</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getLang()
-	 * @see #getDisplayNameType()
-	 * @generated
-	 */
-	EAttribute getDisplayNameType_Lang();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType#getId()
-	 * @see #getDisplayNameType()
-	 * @generated
-	 */
-	EAttribute getDisplayNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot <em>Document Root</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Document Root</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot
-	 * @generated
-	 */
-	EClass getDocumentRoot();
-
-    /**
-	 * Returns the meta object for the attribute list '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMixed <em>Mixed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute list '<em>Mixed</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMixed()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EAttribute getDocumentRoot_Mixed();
-
-    /**
-	 * Returns the meta object for the map '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the map '<em>XMLNS Prefix Map</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXMLNSPrefixMap()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_XMLNSPrefixMap();
-
-    /**
-	 * Returns the meta object for the map '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXSISchemaLocation <em>XSI Schema Location</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the map '<em>XSI Schema Location</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getXSISchemaLocation()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_XSISchemaLocation();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAbsoluteOrdering <em>Absolute Ordering</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Absolute Ordering</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAbsoluteOrdering()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_AbsoluteOrdering();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener <em>Action Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Action Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getActionListener()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ActionListener();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication <em>Application</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Application</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplication()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Application();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory <em>Application Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Application Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getApplicationFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ApplicationFactory();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttribute()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Attribute();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass <em>Attribute Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_AttributeClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension <em>Attribute Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_AttributeExtension();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName <em>Attribute Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Attribute Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getAttributeName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_AttributeName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehavior <em>Behavior</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehavior()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Behavior();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorClass <em>Behavior Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_BehaviorClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorId <em>Behavior Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_BehaviorId();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorExtension <em>Behavior Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Behavior Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getBehaviorExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_BehaviorExtension();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent <em>Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponent()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Component();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass <em>Component Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ComponentClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension <em>Component Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ComponentExtension();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily <em>Component Family</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Family</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentFamily()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ComponentFamily();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType <em>Component Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getComponentType()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ComponentType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter <em>Converter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverter()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Converter();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass <em>Converter Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ConverterClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass <em>Converter For Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter For Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterForClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ConverterForClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId <em>Converter Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Converter Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getConverterId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ConverterId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale <em>Default Locale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Locale</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultLocale()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_DefaultLocale();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId <em>Default Render Kit Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Render Kit Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultRenderKitId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_DefaultRenderKitId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValidators <em>Default Validators</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Validators</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValidators()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_DefaultValidators();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue <em>Default Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDefaultValue()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_DefaultValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDescription()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Description();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getDisplayName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExceptionHandlerFactory <em>Exception Handler Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Exception Handler Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExceptionHandlerFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ExceptionHandlerFactory();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExternalContextFactory <em>External Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>External Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getExternalContextFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ExternalContextFactory();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig <em>Faces Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Faces Config</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesConfig()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FacesConfig();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory <em>Faces Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Faces Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacesContextFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FacesContextFactory();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet <em>Facet</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Facet</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacet()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Facet();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension <em>Facet Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Facet Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FacetExtension();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName <em>Facet Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Facet Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFacetName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FacetName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory <em>Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Factory();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction <em>From Action</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From Action</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromAction()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FromAction();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome <em>From Outcome</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From Outcome</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromOutcome()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FromOutcome();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId <em>From View Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From View Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getFromViewId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_FromViewId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIcon()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIf <em>If</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>If</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getIf()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_If();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey <em>Key</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Key</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKey()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Key();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass <em>Key Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Key Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getKeyClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_KeyClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon <em>Large Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Large Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLargeIcon()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_LargeIcon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle <em>Lifecycle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Lifecycle</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycle()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Lifecycle();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory <em>Lifecycle Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Lifecycle Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLifecycleFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_LifecycleFactory();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries <em>List Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>List Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getListEntries()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ListEntries();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig <em>Locale Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Locale Config</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getLocaleConfig()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_LocaleConfig();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean <em>Managed Bean</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBean()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ManagedBean();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass <em>Managed Bean Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ManagedBeanClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName <em>Managed Bean Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ManagedBeanName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope <em>Managed Bean Scope</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Scope</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedBeanScope()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ManagedBeanScope();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty <em>Managed Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getManagedProperty()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ManagedProperty();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries <em>Map Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Map Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntries()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_MapEntries();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry <em>Map Entry</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Map Entry</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMapEntry()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_MapEntry();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle <em>Message Bundle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Message Bundle</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getMessageBundle()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_MessageBundle();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Name();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase <em>Navigation Case</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Navigation Case</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationCase()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_NavigationCase();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler <em>Navigation Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Navigation Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationHandler()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_NavigationHandler();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule <em>Navigation Rule</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Navigation Rule</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNavigationRule()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_NavigationRule();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue <em>Null Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Null Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getNullValue()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_NullValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrdering <em>Ordering</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Ordering</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrdering()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Ordering();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrderingOrdering <em>Ordering Ordering</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Ordering Ordering</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOrderingOrdering()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_OrderingOrdering();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOthers <em>Others</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Others</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getOthers()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Others();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPartialViewContextFactory <em>Partial View Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Partial View Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPartialViewContextFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PartialViewContextFactory();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener <em>Phase Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Phase Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPhaseListener()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PhaseListener();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getProperty()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Property();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass <em>Property Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PropertyClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension <em>Property Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PropertyExtension();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName <em>Property Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PropertyName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver <em>Property Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Resolver</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getPropertyResolver()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_PropertyResolver();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect <em>Redirect</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Redirect</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirect()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Redirect();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirectViewParam <em>Redirect View Param</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Redirect View Param</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRedirectViewParam()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RedirectViewParam();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean <em>Referenced Bean</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Referenced Bean</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBean()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ReferencedBean();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass <em>Referenced Bean Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Referenced Bean Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ReferencedBeanClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName <em>Referenced Bean Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Referenced Bean Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getReferencedBeanName()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ReferencedBeanName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer <em>Renderer</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderer()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Renderer();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass <em>Renderer Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RendererClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension <em>Renderer Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererExtension()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RendererExtension();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType <em>Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRendererType()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RendererType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit <em>Render Kit</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKit()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RenderKit();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass <em>Render Kit Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RenderKitClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory <em>Render Kit Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RenderKitFactory();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId <em>Render Kit Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getRenderKitId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_RenderKitId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getResourceHandler <em>Resource Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Resource Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getResourceHandler()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ResourceHandler();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon <em>Small Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Small Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSmallIcon()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SmallIcon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSourceClass <em>Source Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Source Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSourceClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SourceClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager <em>State Manager</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>State Manager</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getStateManager()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_StateManager();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue <em>Suggested Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Suggested Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSuggestedValue()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SuggestedValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale <em>Supported Locale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Supported Locale</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSupportedLocale()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SupportedLocale();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventClass <em>System Event Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>System Event Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SystemEventClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListener <em>System Event Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>System Event Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListener()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SystemEventListener();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListenerClass <em>System Event Listener Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>System Event Listener Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getSystemEventListenerClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_SystemEventListenerClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Tag Handler Delegate Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getTagHandlerDelegateFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_TagHandlerDelegateFactory();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId <em>To View Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>To View Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getToViewId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ToViewId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator <em>Validator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Validator</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidator()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Validator();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass <em>Validator Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Validator Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ValidatorClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId <em>Validator Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Validator Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValidatorId()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ValidatorId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValue()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_Value();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass <em>Value Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getValueClass()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ValueClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver <em>Variable Resolver</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Variable Resolver</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVariableResolver()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_VariableResolver();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>View Declaration Language Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewDeclarationLanguageFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ViewDeclarationLanguageFactory();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler <em>View Handler</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>View Handler</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getViewHandler()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_ViewHandler();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVisitContextFactory <em>Visit Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Visit Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot#getVisitContextFactory()
-	 * @see #getDocumentRoot()
-	 * @generated
-	 */
-	EReference getDocumentRoot_VisitContextFactory();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute <em>Dynamic Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Dynamic Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute
-	 * @generated
-	 */
-    EClass getDynamicAttribute();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getName()
-	 * @see #getDynamicAttribute()
-	 * @generated
-	 */
-    EAttribute getDynamicAttribute_Name();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute#getValue()
-	 * @see #getDynamicAttribute()
-	 * @generated
-	 */
-    EAttribute getDynamicAttribute_Value();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement <em>Dynamic Element</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Dynamic Element</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement
-	 * @generated
-	 */
-    EClass getDynamicElement();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getChildNodes <em>Child Nodes</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Child Nodes</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getChildNodes()
-	 * @see #getDynamicElement()
-	 * @generated
-	 */
-    EReference getDynamicElement_ChildNodes();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getAttributes <em>Attributes</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Attributes</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getAttributes()
-	 * @see #getDynamicElement()
-	 * @generated
-	 */
-    EReference getDynamicElement_Attributes();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getTextContent()
-	 * @see #getDynamicElement()
-	 * @generated
-	 */
-    EAttribute getDynamicElement_TextContent();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType <em>EL Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>EL Resolver Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType
-	 * @generated
-	 */
-    EClass getELResolverType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getTextContent()
-	 * @see #getELResolverType()
-	 * @generated
-	 */
-    EAttribute getELResolverType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType#getId()
-	 * @see #getELResolverType()
-	 * @generated
-	 */
-    EAttribute getELResolverType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType <em>Exception Handler Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Exception Handler Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType
-	 * @generated
-	 */
-	EClass getExceptionHandlerFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getTextContent()
-	 * @see #getExceptionHandlerFactoryType()
-	 * @generated
-	 */
-	EAttribute getExceptionHandlerFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType#getId()
-	 * @see #getExceptionHandlerFactoryType()
-	 * @generated
-	 */
-	EAttribute getExceptionHandlerFactoryType_Id();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement#getName()
-	 * @see #getDynamicElement()
-	 * @generated
-	 */
-    EAttribute getDynamicElement_Name();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType
-	 * @generated
-	 */
-	EClass getFacesConfigType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getApplication <em>Application</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Application</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getApplication()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Application();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getOrdering <em>Ordering</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Ordering</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getOrdering()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Ordering();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getAbsoluteOrdering <em>Absolute Ordering</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Absolute Ordering</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getAbsoluteOrdering()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_AbsoluteOrdering();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFactory <em>Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFactory()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Factory();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getComponent <em>Component</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Component</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getComponent()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Component();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getConverter <em>Converter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Converter</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getConverter()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Converter();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getManagedBean <em>Managed Bean</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Managed Bean</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getManagedBean()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_ManagedBean();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getName()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Name();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getNavigationRule <em>Navigation Rule</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Navigation Rule</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getNavigationRule()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_NavigationRule();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getReferencedBean <em>Referenced Bean</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Referenced Bean</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getReferencedBean()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_ReferencedBean();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getRenderKit <em>Render Kit</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Render Kit</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getRenderKit()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_RenderKit();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getLifecycle <em>Lifecycle</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Lifecycle</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getLifecycle()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Lifecycle();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getValidator <em>Validator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Validator</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getValidator()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Validator();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getBehavior <em>Behavior</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Behavior</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getBehavior()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EReference getFacesConfigType_Behavior();
-
-				/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFacesConfigExtension <em>Faces Config Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Faces Config Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFacesConfigExtension()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-    EReference getFacesConfigType_FacesConfigExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Xmlns</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EAttribute getFacesConfigType_Xmlns();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EAttribute getFacesConfigType_Id();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#isMetadataComplete <em>Metadata Complete</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Metadata Complete</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#isMetadataComplete()
-	 * @see #getFacesConfigType()
-	 * @generated
-	 */
-	EAttribute getFacesConfigType_MetadataComplete();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType <em>Faces Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Faces Context Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType
-	 * @generated
-	 */
-	EClass getFacesContextFactoryType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent()
-	 * @see #getFacesContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getFacesContextFactoryType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId()
-	 * @see #getFacesContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getFacesContextFactoryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType <em>Facet Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Facet Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType
-	 * @generated
-	 */
-	EClass getFacetExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType <em>Facet Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Facet Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType
-	 * @generated
-	 */
-	EClass getFacetNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent()
-	 * @see #getFacetNameType()
-	 * @generated
-	 */
-	EAttribute getFacetNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId()
-	 * @see #getFacetNameType()
-	 * @generated
-	 */
-	EAttribute getFacetNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType <em>Facet Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Facet Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType
-	 * @generated
-	 */
-	EClass getFacetType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDescription()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EReference getFacetType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDisplayName()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EReference getFacetType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getIcon()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EReference getFacetType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName <em>Facet Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Facet Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EReference getFacetType_FacetName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetExtension <em>Facet Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Facet Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetExtension()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EReference getFacetType_FacetExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId()
-	 * @see #getFacetType()
-	 * @generated
-	 */
-	EAttribute getFacetType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType <em>Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType
-	 * @generated
-	 */
-	EClass getFactoryType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getApplicationFactory <em>Application Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Application Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getApplicationFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_ApplicationFactory();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExceptionHandlerFactory <em>Exception Handler Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Exception Handler Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExceptionHandlerFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_ExceptionHandlerFactory();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExternalContextFactory <em>External Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>External Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExternalContextFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_ExternalContextFactory();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFacesContextFactory <em>Faces Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Faces Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFacesContextFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_FacesContextFactory();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getPartialViewContextFactory <em>Partial View Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Partial View Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getPartialViewContextFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_PartialViewContextFactory();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getLifecycleFactory <em>Lifecycle Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Lifecycle Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getLifecycleFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_LifecycleFactory();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>View Declaration Language Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getViewDeclarationLanguageFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_ViewDeclarationLanguageFactory();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Tag Handler Delegate Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getTagHandlerDelegateFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_TagHandlerDelegateFactory();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getRenderKitFactory <em>Render Kit Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Render Kit Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getRenderKitFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_RenderKitFactory();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getVisitContextFactory <em>Visit Context Factory</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Visit Context Factory</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getVisitContextFactory()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EReference getFactoryType_VisitContextFactory();
-
-				/**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFactoryExtension <em>Factory Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Factory Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFactoryExtension()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-    EReference getFactoryType_FactoryExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId()
-	 * @see #getFactoryType()
-	 * @generated
-	 */
-	EAttribute getFactoryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType <em>From Action Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>From Action Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType
-	 * @generated
-	 */
-	EClass getFromActionType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent()
-	 * @see #getFromActionType()
-	 * @generated
-	 */
-	EAttribute getFromActionType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId()
-	 * @see #getFromActionType()
-	 * @generated
-	 */
-	EAttribute getFromActionType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType <em>From Outcome Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>From Outcome Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType
-	 * @generated
-	 */
-	EClass getFromOutcomeType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent()
-	 * @see #getFromOutcomeType()
-	 * @generated
-	 */
-	EAttribute getFromOutcomeType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId()
-	 * @see #getFromOutcomeType()
-	 * @generated
-	 */
-	EAttribute getFromOutcomeType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType <em>From View Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>From View Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType
-	 * @generated
-	 */
-	EClass getFromViewIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent()
-	 * @see #getFromViewIdType()
-	 * @generated
-	 */
-	EAttribute getFromViewIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId()
-	 * @see #getFromViewIdType()
-	 * @generated
-	 */
-	EAttribute getFromViewIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType <em>Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Icon Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType
-	 * @generated
-	 */
-	EClass getIconType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon <em>Small Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Small Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon()
-	 * @see #getIconType()
-	 * @generated
-	 */
-	EReference getIconType_SmallIcon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon <em>Large Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Large Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon()
-	 * @see #getIconType()
-	 * @generated
-	 */
-	EReference getIconType_LargeIcon();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang <em>Lang</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Lang</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang()
-	 * @see #getIconType()
-	 * @generated
-	 */
-	EAttribute getIconType_Lang();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType#getId()
-	 * @see #getIconType()
-	 * @generated
-	 */
-	EAttribute getIconType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType <em>If Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>If Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IfType
-	 * @generated
-	 */
-	EClass getIfType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IfType#getTextContent()
-	 * @see #getIfType()
-	 * @generated
-	 */
-	EAttribute getIfType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IfType#getId()
-	 * @see #getIfType()
-	 * @generated
-	 */
-	EAttribute getIfType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType <em>Key Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Key Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType
-	 * @generated
-	 */
-	EClass getKeyClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent()
-	 * @see #getKeyClassType()
-	 * @generated
-	 */
-	EAttribute getKeyClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId()
-	 * @see #getKeyClassType()
-	 * @generated
-	 */
-	EAttribute getKeyClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType <em>Key Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Key Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType
-	 * @generated
-	 */
-	EClass getKeyType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent()
-	 * @see #getKeyType()
-	 * @generated
-	 */
-	EAttribute getKeyType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId()
-	 * @see #getKeyType()
-	 * @generated
-	 */
-	EAttribute getKeyType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType <em>Large Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Large Icon Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType
-	 * @generated
-	 */
-	EClass getLargeIconType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent()
-	 * @see #getLargeIconType()
-	 * @generated
-	 */
-	EAttribute getLargeIconType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId()
-	 * @see #getLargeIconType()
-	 * @generated
-	 */
-	EAttribute getLargeIconType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType <em>Lifecycle Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Lifecycle Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType
-	 * @generated
-	 */
-	EClass getLifecycleFactoryType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent()
-	 * @see #getLifecycleFactoryType()
-	 * @generated
-	 */
-	EAttribute getLifecycleFactoryType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId()
-	 * @see #getLifecycleFactoryType()
-	 * @generated
-	 */
-	EAttribute getLifecycleFactoryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType <em>Lifecycle Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Lifecycle Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType
-	 * @generated
-	 */
-	EClass getLifecycleType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getPhaseListener <em>Phase Listener</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Phase Listener</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getPhaseListener()
-	 * @see #getLifecycleType()
-	 * @generated
-	 */
-	EReference getLifecycleType_PhaseListener();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getLifecycleExtension <em>Lifecycle Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Lifecycle Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getLifecycleExtension()
-	 * @see #getLifecycleType()
-	 * @generated
-	 */
-    EReference getLifecycleType_LifecycleExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId()
-	 * @see #getLifecycleType()
-	 * @generated
-	 */
-	EAttribute getLifecycleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType <em>List Entries Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>List Entries Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType
-	 * @generated
-	 */
-	EClass getListEntriesType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass <em>Value Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass()
-	 * @see #getListEntriesType()
-	 * @generated
-	 */
-	EReference getListEntriesType_ValueClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getNullValue <em>Null Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Null Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getNullValue()
-	 * @see #getListEntriesType()
-	 * @generated
-	 */
-	EReference getListEntriesType_NullValue();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValue()
-	 * @see #getListEntriesType()
-	 * @generated
-	 */
-	EReference getListEntriesType_Value();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId()
-	 * @see #getListEntriesType()
-	 * @generated
-	 */
-	EAttribute getListEntriesType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType <em>Locale Config Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Locale Config Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType
-	 * @generated
-	 */
-	EClass getLocaleConfigType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale <em>Default Locale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Locale</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale()
-	 * @see #getLocaleConfigType()
-	 * @generated
-	 */
-	EReference getLocaleConfigType_DefaultLocale();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getSupportedLocale <em>Supported Locale</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Supported Locale</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getSupportedLocale()
-	 * @see #getLocaleConfigType()
-	 * @generated
-	 */
-	EReference getLocaleConfigType_SupportedLocale();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId()
-	 * @see #getLocaleConfigType()
-	 * @generated
-	 */
-	EAttribute getLocaleConfigType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType <em>Managed Bean Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Bean Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType
-	 * @generated
-	 */
-	EClass getManagedBeanClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent()
-	 * @see #getManagedBeanClassType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId()
-	 * @see #getManagedBeanClassType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType <em>Managed Bean Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Bean Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType
-	 * @generated
-	 */
-	EClass getManagedBeanNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent()
-	 * @see #getManagedBeanNameType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId()
-	 * @see #getManagedBeanNameType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType <em>Managed Bean Scope Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Bean Scope Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType
-	 * @generated
-	 */
-	EClass getManagedBeanScopeType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent()
-	 * @see #getManagedBeanScopeType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanScopeType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId()
-	 * @see #getManagedBeanScopeType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanScopeType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType <em>Managed Bean Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Bean Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType
-	 * @generated
-	 */
-	EClass getManagedBeanType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDescription()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDisplayName()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getIcon()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName <em>Managed Bean Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_ManagedBeanName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass <em>Managed Bean Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_ManagedBeanClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope <em>Managed Bean Scope</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Managed Bean Scope</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_ManagedBeanScope();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedProperty <em>Managed Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Managed Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedProperty()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_ManagedProperty();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries <em>Map Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Map Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_MapEntries();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries <em>List Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>List Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EReference getManagedBeanType_ListEntries();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanExtension <em>Managed Bean Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Managed Bean Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanExtension()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-    EReference getManagedBeanType_ManagedBeanExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanType_Id();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#isEager <em>Eager</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Eager</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#isEager()
-	 * @see #getManagedBeanType()
-	 * @generated
-	 */
-	EAttribute getManagedBeanType_Eager();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType <em>Managed Property Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Property Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType
-	 * @generated
-	 */
-	EClass getManagedPropertyType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDescription()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDisplayName()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getIcon()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName <em>Property Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_PropertyName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass <em>Property Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_PropertyClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries <em>Map Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Map Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_MapEntries();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue <em>Null Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Null Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_NullValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_Value();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries <em>List Entries</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>List Entries</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EReference getManagedPropertyType_ListEntries();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId()
-	 * @see #getManagedPropertyType()
-	 * @generated
-	 */
-	EAttribute getManagedPropertyType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType <em>Map Entries Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Map Entries Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType
-	 * @generated
-	 */
-	EClass getMapEntriesType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass <em>Key Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Key Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass()
-	 * @see #getMapEntriesType()
-	 * @generated
-	 */
-	EReference getMapEntriesType_KeyClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass <em>Value Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass()
-	 * @see #getMapEntriesType()
-	 * @generated
-	 */
-	EReference getMapEntriesType_ValueClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getMapEntry <em>Map Entry</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Map Entry</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getMapEntry()
-	 * @see #getMapEntriesType()
-	 * @generated
-	 */
-	EReference getMapEntriesType_MapEntry();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId()
-	 * @see #getMapEntriesType()
-	 * @generated
-	 */
-	EAttribute getMapEntriesType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType <em>Map Entry Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Map Entry Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType
-	 * @generated
-	 */
-	EClass getMapEntryType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey <em>Key</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Key</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey()
-	 * @see #getMapEntryType()
-	 * @generated
-	 */
-	EReference getMapEntryType_Key();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue <em>Null Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Null Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue()
-	 * @see #getMapEntryType()
-	 * @generated
-	 */
-	EReference getMapEntryType_NullValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue()
-	 * @see #getMapEntryType()
-	 * @generated
-	 */
-	EReference getMapEntryType_Value();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId()
-	 * @see #getMapEntryType()
-	 * @generated
-	 */
-	EAttribute getMapEntryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType <em>Message Bundle Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Message Bundle Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType
-	 * @generated
-	 */
-	EClass getMessageBundleType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent()
-	 * @see #getMessageBundleType()
-	 * @generated
-	 */
-	EAttribute getMessageBundleType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId()
-	 * @see #getMessageBundleType()
-	 * @generated
-	 */
-	EAttribute getMessageBundleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType <em>Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NameType
-	 * @generated
-	 */
-	EClass getNameType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NameType#getTextContent()
-	 * @see #getNameType()
-	 * @generated
-	 */
-	EAttribute getNameType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NameType#getId()
-	 * @see #getNameType()
-	 * @generated
-	 */
-	EAttribute getNameType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType <em>Navigation Case Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Navigation Case Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType
-	 * @generated
-	 */
-	EClass getNavigationCaseType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDescription()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDisplayName()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIcon()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction <em>From Action</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From Action</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_FromAction();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome <em>From Outcome</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From Outcome</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_FromOutcome();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIf <em>If</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>If</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIf()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_If();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId <em>To View Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>To View Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_ToViewId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect <em>Redirect</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Redirect</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EReference getNavigationCaseType_Redirect();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId()
-	 * @see #getNavigationCaseType()
-	 * @generated
-	 */
-	EAttribute getNavigationCaseType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType <em>Navigation Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Navigation Handler Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType
-	 * @generated
-	 */
-	EClass getNavigationHandlerType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent()
-	 * @see #getNavigationHandlerType()
-	 * @generated
-	 */
-	EAttribute getNavigationHandlerType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId()
-	 * @see #getNavigationHandlerType()
-	 * @generated
-	 */
-	EAttribute getNavigationHandlerType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType <em>Navigation Rule Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Navigation Rule Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType
-	 * @generated
-	 */
-	EClass getNavigationRuleType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDescription()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EReference getNavigationRuleType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDisplayName()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EReference getNavigationRuleType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getIcon()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EReference getNavigationRuleType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId <em>From View Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>From View Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EReference getNavigationRuleType_FromViewId();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationCase <em>Navigation Case</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Navigation Case</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationCase()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EReference getNavigationRuleType_NavigationCase();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationRuleExtension <em>Navigation Rule Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Navigation Rule Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationRuleExtension()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-    EReference getNavigationRuleType_NavigationRuleExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId()
-	 * @see #getNavigationRuleType()
-	 * @generated
-	 */
-	EAttribute getNavigationRuleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType <em>Null Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Null Value Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NullValueType
-	 * @generated
-	 */
-	EClass getNullValueType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId()
-	 * @see #getNullValueType()
-	 * @generated
-	 */
-	EAttribute getNullValueType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType <em>Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Ordering Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingType
-	 * @generated
-	 */
-	EClass getOrderingType();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getBefore <em>Before</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Before</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getBefore()
-	 * @see #getOrderingType()
-	 * @generated
-	 */
-	EReference getOrderingType_Before();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getAfter <em>After</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>After</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getAfter()
-	 * @see #getOrderingType()
-	 * @generated
-	 */
-	EReference getOrderingType_After();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType <em>Ordering Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Ordering Ordering Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType
-	 * @generated
-	 */
-	EClass getOrderingOrderingType();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getName()
-	 * @see #getOrderingOrderingType()
-	 * @generated
-	 */
-	EReference getOrderingOrderingType_Name();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getOthers <em>Others</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Others</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getOthers()
-	 * @see #getOrderingOrderingType()
-	 * @generated
-	 */
-	EReference getOrderingOrderingType_Others();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType <em>Ordering Others Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Ordering Others Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType
-	 * @generated
-	 */
-	EClass getOrderingOthersType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType#getId()
-	 * @see #getOrderingOthersType()
-	 * @generated
-	 */
-	EAttribute getOrderingOthersType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType <em>Partial View Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Partial View Context Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType
-	 * @generated
-	 */
-	EClass getPartialViewContextFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getTextContent()
-	 * @see #getPartialViewContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getPartialViewContextFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getId()
-	 * @see #getPartialViewContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getPartialViewContextFactoryType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType <em>Phase Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Phase Listener Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType
-	 * @generated
-	 */
-	EClass getPhaseListenerType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent()
-	 * @see #getPhaseListenerType()
-	 * @generated
-	 */
-	EAttribute getPhaseListenerType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId()
-	 * @see #getPhaseListenerType()
-	 * @generated
-	 */
-	EAttribute getPhaseListenerType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType <em>Property Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType
-	 * @generated
-	 */
-	EClass getPropertyClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent()
-	 * @see #getPropertyClassType()
-	 * @generated
-	 */
-	EAttribute getPropertyClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId()
-	 * @see #getPropertyClassType()
-	 * @generated
-	 */
-	EAttribute getPropertyClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType <em>Property Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType
-	 * @generated
-	 */
-	EClass getPropertyExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType <em>Property Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType
-	 * @generated
-	 */
-	EClass getPropertyNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent()
-	 * @see #getPropertyNameType()
-	 * @generated
-	 */
-	EAttribute getPropertyNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId()
-	 * @see #getPropertyNameType()
-	 * @generated
-	 */
-	EAttribute getPropertyNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType <em>Property Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property Resolver Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType
-	 * @generated
-	 */
-	EClass getPropertyResolverType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent()
-	 * @see #getPropertyResolverType()
-	 * @generated
-	 */
-	EAttribute getPropertyResolverType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId()
-	 * @see #getPropertyResolverType()
-	 * @generated
-	 */
-	EAttribute getPropertyResolverType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType <em>Property Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Property Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType
-	 * @generated
-	 */
-	EClass getPropertyType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDescription()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDisplayName()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getIcon()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName <em>Property Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_PropertyName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass <em>Property Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Property Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_PropertyClass();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue <em>Default Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Default Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_DefaultValue();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue <em>Suggested Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Suggested Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_SuggestedValue();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyExtension <em>Property Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyExtension()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EReference getPropertyType_PropertyExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId()
-	 * @see #getPropertyType()
-	 * @generated
-	 */
-	EAttribute getPropertyType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType <em>Redirect Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Redirect Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType
-	 * @generated
-	 */
-	EClass getRedirectType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getViewParam <em>View Param</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>View Param</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getViewParam()
-	 * @see #getRedirectType()
-	 * @generated
-	 */
-	EReference getRedirectType_ViewParam();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId()
-	 * @see #getRedirectType()
-	 * @generated
-	 */
-	EAttribute getRedirectType_Id();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#isIncludeViewParams <em>Include View Params</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Include View Params</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType#isIncludeViewParams()
-	 * @see #getRedirectType()
-	 * @generated
-	 */
-	EAttribute getRedirectType_IncludeViewParams();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType <em>Redirect View Param Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Redirect View Param Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType
-	 * @generated
-	 */
-	EClass getRedirectViewParamType();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getName()
-	 * @see #getRedirectViewParamType()
-	 * @generated
-	 */
-	EReference getRedirectViewParamType_Name();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Value</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getValue()
-	 * @see #getRedirectViewParamType()
-	 * @generated
-	 */
-	EReference getRedirectViewParamType_Value();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getId()
-	 * @see #getRedirectViewParamType()
-	 * @generated
-	 */
-	EAttribute getRedirectViewParamType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType <em>Referenced Bean Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Referenced Bean Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType
-	 * @generated
-	 */
-	EClass getReferencedBeanClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent()
-	 * @see #getReferencedBeanClassType()
-	 * @generated
-	 */
-	EAttribute getReferencedBeanClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId()
-	 * @see #getReferencedBeanClassType()
-	 * @generated
-	 */
-	EAttribute getReferencedBeanClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType <em>Referenced Bean Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Referenced Bean Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType
-	 * @generated
-	 */
-	EClass getReferencedBeanNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent()
-	 * @see #getReferencedBeanNameType()
-	 * @generated
-	 */
-	EAttribute getReferencedBeanNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId()
-	 * @see #getReferencedBeanNameType()
-	 * @generated
-	 */
-	EAttribute getReferencedBeanNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType <em>Referenced Bean Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Referenced Bean Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType
-	 * @generated
-	 */
-	EClass getReferencedBeanType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDescription()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EReference getReferencedBeanType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDisplayName()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EReference getReferencedBeanType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getIcon()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EReference getReferencedBeanType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName <em>Referenced Bean Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Referenced Bean Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EReference getReferencedBeanType_ReferencedBeanName();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass <em>Referenced Bean Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Referenced Bean Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EReference getReferencedBeanType_ReferencedBeanClass();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId()
-	 * @see #getReferencedBeanType()
-	 * @generated
-	 */
-	EAttribute getReferencedBeanType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType <em>Renderer Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Renderer Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType
-	 * @generated
-	 */
-	EClass getRendererClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent()
-	 * @see #getRendererClassType()
-	 * @generated
-	 */
-	EAttribute getRendererClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId()
-	 * @see #getRendererClassType()
-	 * @generated
-	 */
-	EAttribute getRendererClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType <em>Renderer Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Renderer Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType
-	 * @generated
-	 */
-	EClass getRendererExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType <em>Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Renderer Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType
-	 * @generated
-	 */
-	EClass getRendererType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDescription()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDisplayName()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getIcon()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily <em>Component Family</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Component Family</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_ComponentFamily();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType <em>Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_RendererType();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass <em>Renderer Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Renderer Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_RendererClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getFacet <em>Facet</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Facet</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getFacet()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_Facet();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getAttribute()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_Attribute();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererExtension <em>Renderer Extension</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Renderer Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererExtension()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EReference getRendererType_RendererExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId()
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	EAttribute getRendererType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType <em>Renderer Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Renderer Type Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType
-	 * @generated
-	 */
-	EClass getRendererTypeType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent()
-	 * @see #getRendererTypeType()
-	 * @generated
-	 */
-	EAttribute getRendererTypeType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId()
-	 * @see #getRendererTypeType()
-	 * @generated
-	 */
-	EAttribute getRendererTypeType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType <em>Render Kit Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Render Kit Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType
-	 * @generated
-	 */
-	EClass getRenderKitClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent()
-	 * @see #getRenderKitClassType()
-	 * @generated
-	 */
-	EAttribute getRenderKitClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId()
-	 * @see #getRenderKitClassType()
-	 * @generated
-	 */
-	EAttribute getRenderKitClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType <em>Render Kit Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Render Kit Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType
-	 * @generated
-	 */
-	EClass getRenderKitFactoryType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent()
-	 * @see #getRenderKitFactoryType()
-	 * @generated
-	 */
-	EAttribute getRenderKitFactoryType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId()
-	 * @see #getRenderKitFactoryType()
-	 * @generated
-	 */
-	EAttribute getRenderKitFactoryType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType <em>Render Kit Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Render Kit Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType
-	 * @generated
-	 */
-	EClass getRenderKitIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent()
-	 * @see #getRenderKitIdType()
-	 * @generated
-	 */
-	EAttribute getRenderKitIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId()
-	 * @see #getRenderKitIdType()
-	 * @generated
-	 */
-	EAttribute getRenderKitIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType <em>Render Kit Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Render Kit Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType
-	 * @generated
-	 */
-	EClass getRenderKitType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDescription()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDisplayName()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getIcon()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId <em>Render Kit Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_RenderKitId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass <em>Render Kit Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Render Kit Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_RenderKitClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderer <em>Renderer</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Renderer</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderer()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_Renderer();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getClientBehaviorRenderer <em>Client Behavior Renderer</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Client Behavior Renderer</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getClientBehaviorRenderer()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EReference getRenderKitType_ClientBehaviorRenderer();
-
-				/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitExtension <em>Render Kit Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Render Kit Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitExtension()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-    EReference getRenderKitType_RenderKitExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId()
-	 * @see #getRenderKitType()
-	 * @generated
-	 */
-	EAttribute getRenderKitType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType <em>Small Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Small Icon Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType
-	 * @generated
-	 */
-	EClass getSmallIconType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent()
-	 * @see #getSmallIconType()
-	 * @generated
-	 */
-	EAttribute getSmallIconType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId()
-	 * @see #getSmallIconType()
-	 * @generated
-	 */
-	EAttribute getSmallIconType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType <em>Source Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Source Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SourceClassType
-	 * @generated
-	 */
-	EClass getSourceClassType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getTextContent()
-	 * @see #getSourceClassType()
-	 * @generated
-	 */
-	EAttribute getSourceClassType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getId()
-	 * @see #getSourceClassType()
-	 * @generated
-	 */
-	EAttribute getSourceClassType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType <em>State Manager Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>State Manager Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType
-	 * @generated
-	 */
-	EClass getStateManagerType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent()
-	 * @see #getStateManagerType()
-	 * @generated
-	 */
-	EAttribute getStateManagerType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId()
-	 * @see #getStateManagerType()
-	 * @generated
-	 */
-	EAttribute getStateManagerType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType <em>Suggested Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Suggested Value Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType
-	 * @generated
-	 */
-	EClass getSuggestedValueType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent()
-	 * @see #getSuggestedValueType()
-	 * @generated
-	 */
-	EAttribute getSuggestedValueType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId()
-	 * @see #getSuggestedValueType()
-	 * @generated
-	 */
-	EAttribute getSuggestedValueType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType <em>Supported Locale Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Supported Locale Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType
-	 * @generated
-	 */
-	EClass getSupportedLocaleType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent()
-	 * @see #getSupportedLocaleType()
-	 * @generated
-	 */
-	EAttribute getSupportedLocaleType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId()
-	 * @see #getSupportedLocaleType()
-	 * @generated
-	 */
-	EAttribute getSupportedLocaleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType <em>System Event Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>System Event Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType
-	 * @generated
-	 */
-	EClass getSystemEventClassType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getTextContent()
-	 * @see #getSystemEventClassType()
-	 * @generated
-	 */
-	EAttribute getSystemEventClassType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getId()
-	 * @see #getSystemEventClassType()
-	 * @generated
-	 */
-	EAttribute getSystemEventClassType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType <em>System Event Listener Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>System Event Listener Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType
-	 * @generated
-	 */
-	EClass getSystemEventListenerClassType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getTextContent()
-	 * @see #getSystemEventListenerClassType()
-	 * @generated
-	 */
-	EAttribute getSystemEventListenerClassType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getId()
-	 * @see #getSystemEventListenerClassType()
-	 * @generated
-	 */
-	EAttribute getSystemEventListenerClassType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType <em>System Event Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>System Event Listener Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType
-	 * @generated
-	 */
-	EClass getSystemEventListenerType();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventListenerClass <em>System Event Listener Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>System Event Listener Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventListenerClass()
-	 * @see #getSystemEventListenerType()
-	 * @generated
-	 */
-	EReference getSystemEventListenerType_SystemEventListenerClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventClass <em>System Event Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>System Event Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventClass()
-	 * @see #getSystemEventListenerType()
-	 * @generated
-	 */
-	EReference getSystemEventListenerType_SystemEventClass();
-
-				/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSourceClass <em>Source Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Source Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSourceClass()
-	 * @see #getSystemEventListenerType()
-	 * @generated
-	 */
-	EReference getSystemEventListenerType_SourceClass();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getId()
-	 * @see #getSystemEventListenerType()
-	 * @generated
-	 */
-	EAttribute getSystemEventListenerType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType <em>Tag Handler Delegate Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Handler Delegate Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType
-	 * @generated
-	 */
-	EClass getTagHandlerDelegateFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getTextContent()
-	 * @see #getTagHandlerDelegateFactoryType()
-	 * @generated
-	 */
-	EAttribute getTagHandlerDelegateFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getId()
-	 * @see #getTagHandlerDelegateFactoryType()
-	 * @generated
-	 */
-	EAttribute getTagHandlerDelegateFactoryType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType <em>To View Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>To View Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType
-	 * @generated
-	 */
-	EClass getToViewIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent()
-	 * @see #getToViewIdType()
-	 * @generated
-	 */
-	EAttribute getToViewIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId()
-	 * @see #getToViewIdType()
-	 * @generated
-	 */
-	EAttribute getToViewIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType <em>Validator Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Validator Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType
-	 * @generated
-	 */
-	EClass getValidatorClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent()
-	 * @see #getValidatorClassType()
-	 * @generated
-	 */
-	EAttribute getValidatorClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId()
-	 * @see #getValidatorClassType()
-	 * @generated
-	 */
-	EAttribute getValidatorClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType <em>Validator Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Validator Id Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType
-	 * @generated
-	 */
-	EClass getValidatorIdType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent()
-	 * @see #getValidatorIdType()
-	 * @generated
-	 */
-	EAttribute getValidatorIdType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId()
-	 * @see #getValidatorIdType()
-	 * @generated
-	 */
-	EAttribute getValidatorIdType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType <em>Validator Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Validator Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType
-	 * @generated
-	 */
-	EClass getValidatorType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDescription()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDisplayName()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getIcon()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_Icon();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId <em>Validator Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Validator Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_ValidatorId();
-
-    /**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass <em>Validator Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Validator Class</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_ValidatorClass();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getAttribute <em>Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Attribute</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getAttribute()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_Attribute();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getProperty <em>Property</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Property</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getProperty()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EReference getValidatorType_Property();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorExtension <em>Validator Extension</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Validator Extension</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorExtension()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-    EReference getValidatorType_ValidatorExtension();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId()
-	 * @see #getValidatorType()
-	 * @generated
-	 */
-	EAttribute getValidatorType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType <em>Value Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Value Class Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType
-	 * @generated
-	 */
-	EClass getValueClassType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent()
-	 * @see #getValueClassType()
-	 * @generated
-	 */
-	EAttribute getValueClassType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId()
-	 * @see #getValueClassType()
-	 * @generated
-	 */
-	EAttribute getValueClassType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType <em>Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Value Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType
-	 * @generated
-	 */
-	EClass getValueType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent()
-	 * @see #getValueType()
-	 * @generated
-	 */
-	EAttribute getValueType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId()
-	 * @see #getValueType()
-	 * @generated
-	 */
-	EAttribute getValueType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType <em>Variable Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Variable Resolver Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType
-	 * @generated
-	 */
-	EClass getVariableResolverType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent()
-	 * @see #getVariableResolverType()
-	 * @generated
-	 */
-	EAttribute getVariableResolverType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId()
-	 * @see #getVariableResolverType()
-	 * @generated
-	 */
-	EAttribute getVariableResolverType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType <em>View Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>View Handler Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType
-	 * @generated
-	 */
-	EClass getViewHandlerType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent()
-	 * @see #getViewHandlerType()
-	 * @generated
-	 */
-	EAttribute getViewHandlerType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId()
-	 * @see #getViewHandlerType()
-	 * @generated
-	 */
-	EAttribute getViewHandlerType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType <em>Resource Bundle Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resource Bundle Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType
-	 * @generated
-	 */
-    EClass getResourceBundleType();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDescription <em>Description</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Description</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDescription()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EReference getResourceBundleType_Description();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDisplayName <em>Display Name</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Display Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDisplayName()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EReference getResourceBundleType_DisplayName();
-
-    /**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getIcon <em>Icon</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Icon</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getIcon()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EReference getResourceBundleType_Icon();
-
-    /**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName <em>Base Name</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Base Name</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EReference getResourceBundleType_BaseName();
-
-    /**
-	 * Returns the meta object for the reference '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar <em>Var</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Var</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EReference getResourceBundleType_Var();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId()
-	 * @see #getResourceBundleType()
-	 * @generated
-	 */
-    EAttribute getResourceBundleType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType <em>Base Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Base Name Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType
-	 * @generated
-	 */
-    EClass getBaseNameType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getTextContent()
-	 * @see #getBaseNameType()
-	 * @generated
-	 */
-    EAttribute getBaseNameType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType#getId()
-	 * @see #getBaseNameType()
-	 * @generated
-	 */
-    EAttribute getBaseNameType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType <em>Var Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Var Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VarType
-	 * @generated
-	 */
-    EClass getVarType();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent()
-	 * @see #getVarType()
-	 * @generated
-	 */
-    EAttribute getVarType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VarType#getId()
-	 * @see #getVarType()
-	 * @generated
-	 */
-    EAttribute getVarType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType <em>View Declaration Language Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>View Declaration Language Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType
-	 * @generated
-	 */
-	EClass getViewDeclarationLanguageFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getTextContent()
-	 * @see #getViewDeclarationLanguageFactoryType()
-	 * @generated
-	 */
-	EAttribute getViewDeclarationLanguageFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getId()
-	 * @see #getViewDeclarationLanguageFactoryType()
-	 * @generated
-	 */
-	EAttribute getViewDeclarationLanguageFactoryType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType <em>Visit Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Visit Context Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType
-	 * @generated
-	 */
-	EClass getVisitContextFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getTextContent()
-	 * @see #getVisitContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getVisitContextFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getId()
-	 * @see #getVisitContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getVisitContextFactoryType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType <em>Render Kit Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Render Kit Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType
-	 * @generated
-	 */
-    EClass getRenderKitExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType <em>Resource Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resource Handler Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType
-	 * @generated
-	 */
-	EClass getResourceHandlerType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getTextContent()
-	 * @see #getResourceHandlerType()
-	 * @generated
-	 */
-	EAttribute getResourceHandlerType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getId()
-	 * @see #getResourceHandlerType()
-	 * @generated
-	 */
-	EAttribute getResourceHandlerType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType <em>Navigation Rule Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Navigation Rule Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType
-	 * @generated
-	 */
-    EClass getNavigationRuleExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType <em>Validator Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Validator Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType
-	 * @generated
-	 */
-    EClass getValidatorExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType <em>Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType
-	 * @generated
-	 */
-    EClass getFacesConfigExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType <em>Factory Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Factory Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType
-	 * @generated
-	 */
-    EClass getFactoryExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType <em>Lifecycle Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Lifecycle Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType
-	 * @generated
-	 */
-    EClass getLifecycleExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType <em>Managed Bean Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Managed Bean Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType
-	 * @generated
-	 */
-    EClass getManagedBeanExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType <em>Converter Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Converter Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType
-	 * @generated
-	 */
-    EClass getConverterExtensionType();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType <em>Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType
-	 * @generated
-	 */
-    EClass getExtensionType();
-
-    /**
-	 * Returns the meta object for the reference list '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getChildNodes <em>Child Nodes</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the reference list '<em>Child Nodes</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getChildNodes()
-	 * @see #getExtensionType()
-	 * @generated
-	 */
-    EReference getExtensionType_ChildNodes();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getTextContent()
-	 * @see #getExtensionType()
-	 * @generated
-	 */
-    EAttribute getExtensionType_TextContent();
-
-    /**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType#getId()
-	 * @see #getExtensionType()
-	 * @generated
-	 */
-    EAttribute getExtensionType_Id();
-
-    /**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType <em>External Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>External Context Factory Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType
-	 * @generated
-	 */
-	EClass getExternalContextFactoryType();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getTextContent <em>Text Content</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Text Content</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getTextContent()
-	 * @see #getExternalContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getExternalContextFactoryType_TextContent();
-
-				/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType#getId()
-	 * @see #getExternalContextFactoryType()
-	 * @generated
-	 */
-	EAttribute getExternalContextFactoryType_Id();
-
-				/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType <em>Application Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Application Extension Type</em>'.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType
-	 * @generated
-	 */
-    EClass getApplicationExtensionType();
-
-    /**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	FacesConfigFactory getFacesConfigFactory();
-
-    /**
-	 * <!-- begin-user-doc -->
-     * Defines literals for the meta objects that represent
-     * <ul>
-     *   <li>each class,</li>
-     *   <li>each feature of each class,</li>
-     *   <li>each enum,</li>
-     *   <li>and each data type</li>
-     * </ul>
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-//    @SuppressWarnings("hiding")
-    interface Literals  {
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl <em>Absolute Ordering Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAbsoluteOrderingType()
-		 * @generated
-		 */
-		EClass ABSOLUTE_ORDERING_TYPE = eINSTANCE.getAbsoluteOrderingType();
-
-					/**
-		 * The meta object literal for the '<em><b>Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ABSOLUTE_ORDERING_TYPE__NAME = eINSTANCE.getAbsoluteOrderingType_Name();
-
-					/**
-		 * The meta object literal for the '<em><b>Others</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ABSOLUTE_ORDERING_TYPE__OTHERS = eINSTANCE.getAbsoluteOrderingType_Others();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl <em>Action Listener Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getActionListenerType()
-		 * @generated
-		 */
-        EClass ACTION_LISTENER_TYPE = eINSTANCE.getActionListenerType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ACTION_LISTENER_TYPE__TEXT_CONTENT = eINSTANCE.getActionListenerType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ACTION_LISTENER_TYPE__ID = eINSTANCE.getActionListenerType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl <em>Application Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationFactoryType()
-		 * @generated
-		 */
-        EClass APPLICATION_FACTORY_TYPE = eINSTANCE.getApplicationFactoryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute APPLICATION_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getApplicationFactoryType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute APPLICATION_FACTORY_TYPE__ID = eINSTANCE.getApplicationFactoryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl <em>Application Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationType()
-		 * @generated
-		 */
-        EClass APPLICATION_TYPE = eINSTANCE.getApplicationType();
-
-        /**
-		 * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__ACTION_LISTENER = eINSTANCE.getApplicationType_ActionListener();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID = eINSTANCE.getApplicationType_DefaultRenderKitId();
-
-        /**
-		 * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__MESSAGE_BUNDLE = eINSTANCE.getApplicationType_MessageBundle();
-
-        /**
-		 * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__NAVIGATION_HANDLER = eINSTANCE.getApplicationType_NavigationHandler();
-
-        /**
-		 * The meta object literal for the '<em><b>View Handler</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__VIEW_HANDLER = eINSTANCE.getApplicationType_ViewHandler();
-
-        /**
-		 * The meta object literal for the '<em><b>State Manager</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__STATE_MANAGER = eINSTANCE.getApplicationType_StateManager();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__PROPERTY_RESOLVER = eINSTANCE.getApplicationType_PropertyResolver();
-
-        /**
-		 * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__VARIABLE_RESOLVER = eINSTANCE.getApplicationType_VariableResolver();
-
-        /**
-		 * The meta object literal for the '<em><b>Resource Handler</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference APPLICATION_TYPE__RESOURCE_HANDLER = eINSTANCE.getApplicationType_ResourceHandler();
-
-								/**
-		 * The meta object literal for the '<em><b>System Event Listener</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference APPLICATION_TYPE__SYSTEM_EVENT_LISTENER = eINSTANCE.getApplicationType_SystemEventListener();
-
-								/**
-		 * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__LOCALE_CONFIG = eINSTANCE.getApplicationType_LocaleConfig();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute APPLICATION_TYPE__ID = eINSTANCE.getApplicationType_Id();
-
-        /**
-		 * The meta object literal for the '<em><b>EL Resolver</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__EL_RESOLVER = eINSTANCE.getApplicationType_ELResolver();
-
-        /**
-		 * The meta object literal for the '<em><b>Resource Bundle</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__RESOURCE_BUNDLE = eINSTANCE.getApplicationType_ResourceBundle();
-
-        /**
-		 * The meta object literal for the '<em><b>Application Extension</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference APPLICATION_TYPE__APPLICATION_EXTENSION = eINSTANCE.getApplicationType_ApplicationExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Validators</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference APPLICATION_TYPE__DEFAULT_VALIDATORS = eINSTANCE.getApplicationType_DefaultValidators();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl <em>Attribute Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeClassType()
-		 * @generated
-		 */
-        EClass ATTRIBUTE_CLASS_TYPE = eINSTANCE.getAttributeClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getAttributeClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ATTRIBUTE_CLASS_TYPE__ID = eINSTANCE.getAttributeClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl <em>Attribute Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeExtensionType()
-		 * @generated
-		 */
-        EClass ATTRIBUTE_EXTENSION_TYPE = eINSTANCE.getAttributeExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl <em>Attribute Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeNameType()
-		 * @generated
-		 */
-        EClass ATTRIBUTE_NAME_TYPE = eINSTANCE.getAttributeNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ATTRIBUTE_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getAttributeNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ATTRIBUTE_NAME_TYPE__ID = eINSTANCE.getAttributeNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl <em>Attribute Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getAttributeType()
-		 * @generated
-		 */
-        EClass ATTRIBUTE_TYPE = eINSTANCE.getAttributeType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__DESCRIPTION = eINSTANCE.getAttributeType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__DISPLAY_NAME = eINSTANCE.getAttributeType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__ICON = eINSTANCE.getAttributeType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__ATTRIBUTE_NAME = eINSTANCE.getAttributeType_AttributeName();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__ATTRIBUTE_CLASS = eINSTANCE.getAttributeType_AttributeClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__DEFAULT_VALUE = eINSTANCE.getAttributeType_DefaultValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__SUGGESTED_VALUE = eINSTANCE.getAttributeType_SuggestedValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION = eINSTANCE.getAttributeType_AttributeExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ATTRIBUTE_TYPE__ID = eINSTANCE.getAttributeType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl <em>Behavior Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorClassType()
-		 * @generated
-		 */
-		EClass BEHAVIOR_CLASS_TYPE = eINSTANCE.getBehaviorClassType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BEHAVIOR_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getBehaviorClassType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BEHAVIOR_CLASS_TYPE__ID = eINSTANCE.getBehaviorClassType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl <em>Behavior Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorIdType()
-		 * @generated
-		 */
-		EClass BEHAVIOR_ID_TYPE = eINSTANCE.getBehaviorIdType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BEHAVIOR_ID_TYPE__TEXT_CONTENT = eINSTANCE.getBehaviorIdType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BEHAVIOR_ID_TYPE__ID = eINSTANCE.getBehaviorIdType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl <em>Behavior Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorType()
-		 * @generated
-		 */
-		EClass BEHAVIOR_TYPE = eINSTANCE.getBehaviorType();
-
-								/**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__DESCRIPTION = eINSTANCE.getBehaviorType_Description();
-
-								/**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__DISPLAY_NAME = eINSTANCE.getBehaviorType_DisplayName();
-
-								/**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__ICON = eINSTANCE.getBehaviorType_Icon();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__BEHAVIOR_ID = eINSTANCE.getBehaviorType_BehaviorId();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__BEHAVIOR_CLASS = eINSTANCE.getBehaviorType_BehaviorClass();
-
-								/**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__ATTRIBUTE = eINSTANCE.getBehaviorType_Attribute();
-
-								/**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__PROPERTY = eINSTANCE.getBehaviorType_Property();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BEHAVIOR_TYPE__BEHAVIOR_EXTENSION = eINSTANCE.getBehaviorType_BehaviorExtension();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorExtensionTypeImpl <em>Behavior Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBehaviorExtensionType()
-		 * @generated
-		 */
-		EClass BEHAVIOR_EXTENSION_TYPE = eINSTANCE.getBehaviorExtensionType();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl <em>Client Behavior Renderer Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererClassType()
-		 * @generated
-		 */
-		EClass CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE = eINSTANCE.getClientBehaviorRendererClassType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getClientBehaviorRendererClassType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID = eINSTANCE.getClientBehaviorRendererClassType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl <em>Client Behavior Renderer Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererType()
-		 * @generated
-		 */
-		EClass CLIENT_BEHAVIOR_RENDERER_TYPE = eINSTANCE.getClientBehaviorRendererType();
-
-								/**
-		 * The meta object literal for the '<em><b>Client Behavior Renderer Type</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE = eINSTANCE.getClientBehaviorRendererType_ClientBehaviorRendererType();
-
-								/**
-		 * The meta object literal for the '<em><b>Client Behavior Renderer Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS = eINSTANCE.getClientBehaviorRendererType_ClientBehaviorRendererClass();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl <em>Client Behavior Renderer Type Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getClientBehaviorRendererTypeType()
-		 * @generated
-		 */
-		EClass CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE = eINSTANCE.getClientBehaviorRendererTypeType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT = eINSTANCE.getClientBehaviorRendererTypeType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID = eINSTANCE.getClientBehaviorRendererTypeType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl <em>Component Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentClassType()
-		 * @generated
-		 */
-        EClass COMPONENT_CLASS_TYPE = eINSTANCE.getComponentClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getComponentClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_CLASS_TYPE__ID = eINSTANCE.getComponentClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl <em>Component Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentExtensionType()
-		 * @generated
-		 */
-        EClass COMPONENT_EXTENSION_TYPE = eINSTANCE.getComponentExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl <em>Component Family Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentFamilyType()
-		 * @generated
-		 */
-        EClass COMPONENT_FAMILY_TYPE = eINSTANCE.getComponentFamilyType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_FAMILY_TYPE__TEXT_CONTENT = eINSTANCE.getComponentFamilyType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_FAMILY_TYPE__ID = eINSTANCE.getComponentFamilyType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl <em>Component Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentType()
-		 * @generated
-		 */
-        EClass COMPONENT_TYPE = eINSTANCE.getComponentType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference COMPONENT_TYPE__DESCRIPTION = eINSTANCE.getComponentType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__DISPLAY_NAME = eINSTANCE.getComponentType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__ICON = eINSTANCE.getComponentType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__COMPONENT_TYPE = eINSTANCE.getComponentType_ComponentType();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__COMPONENT_CLASS = eINSTANCE.getComponentType_ComponentClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__FACET = eINSTANCE.getComponentType_Facet();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__ATTRIBUTE = eINSTANCE.getComponentType_Attribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__PROPERTY = eINSTANCE.getComponentType_Property();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference COMPONENT_TYPE__COMPONENT_EXTENSION = eINSTANCE.getComponentType_ComponentExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_TYPE__ID = eINSTANCE.getComponentType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl <em>Component Type Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getComponentTypeType()
-		 * @generated
-		 */
-        EClass COMPONENT_TYPE_TYPE = eINSTANCE.getComponentTypeType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_TYPE_TYPE__TEXT_CONTENT = eINSTANCE.getComponentTypeType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute COMPONENT_TYPE_TYPE__ID = eINSTANCE.getComponentTypeType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl <em>Converter Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterClassType()
-		 * @generated
-		 */
-        EClass CONVERTER_CLASS_TYPE = eINSTANCE.getConverterClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getConverterClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_CLASS_TYPE__ID = eINSTANCE.getConverterClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl <em>Converter For Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterForClassType()
-		 * @generated
-		 */
-        EClass CONVERTER_FOR_CLASS_TYPE = eINSTANCE.getConverterForClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getConverterForClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_FOR_CLASS_TYPE__ID = eINSTANCE.getConverterForClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl <em>Converter Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterIdType()
-		 * @generated
-		 */
-        EClass CONVERTER_ID_TYPE = eINSTANCE.getConverterIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_ID_TYPE__TEXT_CONTENT = eINSTANCE.getConverterIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_ID_TYPE__ID = eINSTANCE.getConverterIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl <em>Converter Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterType()
-		 * @generated
-		 */
-        EClass CONVERTER_TYPE = eINSTANCE.getConverterType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__DESCRIPTION = eINSTANCE.getConverterType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__DISPLAY_NAME = eINSTANCE.getConverterType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__ICON = eINSTANCE.getConverterType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__CONVERTER_ID = eINSTANCE.getConverterType_ConverterId();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__CONVERTER_FOR_CLASS = eINSTANCE.getConverterType_ConverterForClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__CONVERTER_CLASS = eINSTANCE.getConverterType_ConverterClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__ATTRIBUTE = eINSTANCE.getConverterType_Attribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__PROPERTY = eINSTANCE.getConverterType_Property();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference CONVERTER_TYPE__CONVERTER_EXTENSION = eINSTANCE.getConverterType_ConverterExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute CONVERTER_TYPE__ID = eINSTANCE.getConverterType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl <em>Default Locale Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultLocaleType()
-		 * @generated
-		 */
-        EClass DEFAULT_LOCALE_TYPE = eINSTANCE.getDefaultLocaleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_LOCALE_TYPE__TEXT_CONTENT = eINSTANCE.getDefaultLocaleType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_LOCALE_TYPE__ID = eINSTANCE.getDefaultLocaleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl <em>Default Render Kit Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultRenderKitIdType()
-		 * @generated
-		 */
-        EClass DEFAULT_RENDER_KIT_ID_TYPE = eINSTANCE.getDefaultRenderKitIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT = eINSTANCE.getDefaultRenderKitIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_RENDER_KIT_ID_TYPE__ID = eINSTANCE.getDefaultRenderKitIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl <em>Default Validators Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValidatorsType()
-		 * @generated
-		 */
-		EClass DEFAULT_VALIDATORS_TYPE = eINSTANCE.getDefaultValidatorsType();
-
-								/**
-		 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID = eINSTANCE.getDefaultValidatorsType_ValidatorId();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DEFAULT_VALIDATORS_TYPE__ID = eINSTANCE.getDefaultValidatorsType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl <em>Default Value Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDefaultValueType()
-		 * @generated
-		 */
-        EClass DEFAULT_VALUE_TYPE = eINSTANCE.getDefaultValueType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_VALUE_TYPE__TEXT_CONTENT = eINSTANCE.getDefaultValueType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DEFAULT_VALUE_TYPE__ID = eINSTANCE.getDefaultValueType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl <em>Description Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDescriptionType()
-		 * @generated
-		 */
-        EClass DESCRIPTION_TYPE = eINSTANCE.getDescriptionType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DESCRIPTION_TYPE__TEXT_CONTENT = eINSTANCE.getDescriptionType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DESCRIPTION_TYPE__LANG = eINSTANCE.getDescriptionType_Lang();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DESCRIPTION_TYPE__ID = eINSTANCE.getDescriptionType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl <em>Display Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDisplayNameType()
-		 * @generated
-		 */
-        EClass DISPLAY_NAME_TYPE = eINSTANCE.getDisplayNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DISPLAY_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getDisplayNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DISPLAY_NAME_TYPE__LANG = eINSTANCE.getDisplayNameType_Lang();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DISPLAY_NAME_TYPE__ID = eINSTANCE.getDisplayNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl <em>Document Root</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDocumentRoot()
-		 * @generated
-		 */
-        EClass DOCUMENT_ROOT = eINSTANCE.getDocumentRoot();
-
-        /**
-		 * The meta object literal for the '<em><b>Mixed</b></em>' attribute list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DOCUMENT_ROOT__MIXED = eINSTANCE.getDocumentRoot_Mixed();
-
-        /**
-		 * The meta object literal for the '<em><b>XMLNS Prefix Map</b></em>' map feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__XMLNS_PREFIX_MAP = eINSTANCE.getDocumentRoot_XMLNSPrefixMap();
-
-        /**
-		 * The meta object literal for the '<em><b>XSI Schema Location</b></em>' map feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__XSI_SCHEMA_LOCATION = eINSTANCE.getDocumentRoot_XSISchemaLocation();
-
-        /**
-		 * The meta object literal for the '<em><b>Absolute Ordering</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__ABSOLUTE_ORDERING = eINSTANCE.getDocumentRoot_AbsoluteOrdering();
-
-								/**
-		 * The meta object literal for the '<em><b>Action Listener</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ACTION_LISTENER = eINSTANCE.getDocumentRoot_ActionListener();
-
-        /**
-		 * The meta object literal for the '<em><b>Application</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__APPLICATION = eINSTANCE.getDocumentRoot_Application();
-
-        /**
-		 * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__APPLICATION_FACTORY = eINSTANCE.getDocumentRoot_ApplicationFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ATTRIBUTE = eINSTANCE.getDocumentRoot_Attribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ATTRIBUTE_CLASS = eINSTANCE.getDocumentRoot_AttributeClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ATTRIBUTE_EXTENSION = eINSTANCE.getDocumentRoot_AttributeExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ATTRIBUTE_NAME = eINSTANCE.getDocumentRoot_AttributeName();
-
-        /**
-		 * The meta object literal for the '<em><b>Behavior</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__BEHAVIOR = eINSTANCE.getDocumentRoot_Behavior();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__BEHAVIOR_CLASS = eINSTANCE.getDocumentRoot_BehaviorClass();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__BEHAVIOR_ID = eINSTANCE.getDocumentRoot_BehaviorId();
-
-								/**
-		 * The meta object literal for the '<em><b>Behavior Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__BEHAVIOR_EXTENSION = eINSTANCE.getDocumentRoot_BehaviorExtension();
-
-								/**
-		 * The meta object literal for the '<em><b>Component</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__COMPONENT = eINSTANCE.getDocumentRoot_Component();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__COMPONENT_CLASS = eINSTANCE.getDocumentRoot_ComponentClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__COMPONENT_EXTENSION = eINSTANCE.getDocumentRoot_ComponentExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__COMPONENT_FAMILY = eINSTANCE.getDocumentRoot_ComponentFamily();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Type</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__COMPONENT_TYPE = eINSTANCE.getDocumentRoot_ComponentType();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__CONVERTER = eINSTANCE.getDocumentRoot_Converter();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__CONVERTER_CLASS = eINSTANCE.getDocumentRoot_ConverterClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter For Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__CONVERTER_FOR_CLASS = eINSTANCE.getDocumentRoot_ConverterForClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__CONVERTER_ID = eINSTANCE.getDocumentRoot_ConverterId();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__DEFAULT_LOCALE = eINSTANCE.getDocumentRoot_DefaultLocale();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Render Kit Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID = eINSTANCE.getDocumentRoot_DefaultRenderKitId();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Validators</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__DEFAULT_VALIDATORS = eINSTANCE.getDocumentRoot_DefaultValidators();
-
-								/**
-		 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__DEFAULT_VALUE = eINSTANCE.getDocumentRoot_DefaultValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__DESCRIPTION = eINSTANCE.getDocumentRoot_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__DISPLAY_NAME = eINSTANCE.getDocumentRoot_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Exception Handler Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY = eINSTANCE.getDocumentRoot_ExceptionHandlerFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>External Context Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY = eINSTANCE.getDocumentRoot_ExternalContextFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Faces Config</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACES_CONFIG = eINSTANCE.getDocumentRoot_FacesConfig();
-
-        /**
-		 * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACES_CONTEXT_FACTORY = eINSTANCE.getDocumentRoot_FacesContextFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACET = eINSTANCE.getDocumentRoot_Facet();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACET_EXTENSION = eINSTANCE.getDocumentRoot_FacetExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACET_NAME = eINSTANCE.getDocumentRoot_FacetName();
-
-        /**
-		 * The meta object literal for the '<em><b>Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FACTORY = eINSTANCE.getDocumentRoot_Factory();
-
-        /**
-		 * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FROM_ACTION = eINSTANCE.getDocumentRoot_FromAction();
-
-        /**
-		 * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FROM_OUTCOME = eINSTANCE.getDocumentRoot_FromOutcome();
-
-        /**
-		 * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__FROM_VIEW_ID = eINSTANCE.getDocumentRoot_FromViewId();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__ICON = eINSTANCE.getDocumentRoot_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>If</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__IF = eINSTANCE.getDocumentRoot_If();
-
-								/**
-		 * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__KEY = eINSTANCE.getDocumentRoot_Key();
-
-        /**
-		 * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__KEY_CLASS = eINSTANCE.getDocumentRoot_KeyClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__LARGE_ICON = eINSTANCE.getDocumentRoot_LargeIcon();
-
-        /**
-		 * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__LIFECYCLE = eINSTANCE.getDocumentRoot_Lifecycle();
-
-        /**
-		 * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__LIFECYCLE_FACTORY = eINSTANCE.getDocumentRoot_LifecycleFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__LIST_ENTRIES = eINSTANCE.getDocumentRoot_ListEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>Locale Config</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__LOCALE_CONFIG = eINSTANCE.getDocumentRoot_LocaleConfig();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN = eINSTANCE.getDocumentRoot_ManagedBean();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN_CLASS = eINSTANCE.getDocumentRoot_ManagedBeanClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN_NAME = eINSTANCE.getDocumentRoot_ManagedBeanName();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MANAGED_BEAN_SCOPE = eINSTANCE.getDocumentRoot_ManagedBeanScope();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MANAGED_PROPERTY = eINSTANCE.getDocumentRoot_ManagedProperty();
-
-        /**
-		 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MAP_ENTRIES = eINSTANCE.getDocumentRoot_MapEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MAP_ENTRY = eINSTANCE.getDocumentRoot_MapEntry();
-
-        /**
-		 * The meta object literal for the '<em><b>Message Bundle</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__MESSAGE_BUNDLE = eINSTANCE.getDocumentRoot_MessageBundle();
-
-        /**
-		 * The meta object literal for the '<em><b>Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__NAME = eINSTANCE.getDocumentRoot_Name();
-
-								/**
-		 * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__NAVIGATION_CASE = eINSTANCE.getDocumentRoot_NavigationCase();
-
-        /**
-		 * The meta object literal for the '<em><b>Navigation Handler</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__NAVIGATION_HANDLER = eINSTANCE.getDocumentRoot_NavigationHandler();
-
-        /**
-		 * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__NAVIGATION_RULE = eINSTANCE.getDocumentRoot_NavigationRule();
-
-        /**
-		 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__NULL_VALUE = eINSTANCE.getDocumentRoot_NullValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Ordering</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__ORDERING = eINSTANCE.getDocumentRoot_Ordering();
-
-								/**
-		 * The meta object literal for the '<em><b>Ordering Ordering</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__ORDERING_ORDERING = eINSTANCE.getDocumentRoot_OrderingOrdering();
-
-								/**
-		 * The meta object literal for the '<em><b>Others</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__OTHERS = eINSTANCE.getDocumentRoot_Others();
-
-								/**
-		 * The meta object literal for the '<em><b>Partial View Context Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY = eINSTANCE.getDocumentRoot_PartialViewContextFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PHASE_LISTENER = eINSTANCE.getDocumentRoot_PhaseListener();
-
-        /**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PROPERTY = eINSTANCE.getDocumentRoot_Property();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PROPERTY_CLASS = eINSTANCE.getDocumentRoot_PropertyClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PROPERTY_EXTENSION = eINSTANCE.getDocumentRoot_PropertyExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PROPERTY_NAME = eINSTANCE.getDocumentRoot_PropertyName();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Resolver</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__PROPERTY_RESOLVER = eINSTANCE.getDocumentRoot_PropertyResolver();
-
-        /**
-		 * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__REDIRECT = eINSTANCE.getDocumentRoot_Redirect();
-
-        /**
-		 * The meta object literal for the '<em><b>Redirect View Param</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__REDIRECT_VIEW_PARAM = eINSTANCE.getDocumentRoot_RedirectViewParam();
-
-								/**
-		 * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__REFERENCED_BEAN = eINSTANCE.getDocumentRoot_ReferencedBean();
-
-        /**
-		 * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__REFERENCED_BEAN_CLASS = eINSTANCE.getDocumentRoot_ReferencedBeanClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__REFERENCED_BEAN_NAME = eINSTANCE.getDocumentRoot_ReferencedBeanName();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDERER = eINSTANCE.getDocumentRoot_Renderer();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDERER_CLASS = eINSTANCE.getDocumentRoot_RendererClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDERER_EXTENSION = eINSTANCE.getDocumentRoot_RendererExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDERER_TYPE = eINSTANCE.getDocumentRoot_RendererType();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDER_KIT = eINSTANCE.getDocumentRoot_RenderKit();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDER_KIT_CLASS = eINSTANCE.getDocumentRoot_RenderKitClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDER_KIT_FACTORY = eINSTANCE.getDocumentRoot_RenderKitFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__RENDER_KIT_ID = eINSTANCE.getDocumentRoot_RenderKitId();
-
-        /**
-		 * The meta object literal for the '<em><b>Resource Handler</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__RESOURCE_HANDLER = eINSTANCE.getDocumentRoot_ResourceHandler();
-
-								/**
-		 * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__SMALL_ICON = eINSTANCE.getDocumentRoot_SmallIcon();
-
-        /**
-		 * The meta object literal for the '<em><b>Source Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__SOURCE_CLASS = eINSTANCE.getDocumentRoot_SourceClass();
-
-								/**
-		 * The meta object literal for the '<em><b>State Manager</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__STATE_MANAGER = eINSTANCE.getDocumentRoot_StateManager();
-
-        /**
-		 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__SUGGESTED_VALUE = eINSTANCE.getDocumentRoot_SuggestedValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__SUPPORTED_LOCALE = eINSTANCE.getDocumentRoot_SupportedLocale();
-
-        /**
-		 * The meta object literal for the '<em><b>System Event Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__SYSTEM_EVENT_CLASS = eINSTANCE.getDocumentRoot_SystemEventClass();
-
-								/**
-		 * The meta object literal for the '<em><b>System Event Listener</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER = eINSTANCE.getDocumentRoot_SystemEventListener();
-
-								/**
-		 * The meta object literal for the '<em><b>System Event Listener Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS = eINSTANCE.getDocumentRoot_SystemEventListenerClass();
-
-								/**
-		 * The meta object literal for the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY = eINSTANCE.getDocumentRoot_TagHandlerDelegateFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__TO_VIEW_ID = eINSTANCE.getDocumentRoot_ToViewId();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VALIDATOR = eINSTANCE.getDocumentRoot_Validator();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VALIDATOR_CLASS = eINSTANCE.getDocumentRoot_ValidatorClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VALIDATOR_ID = eINSTANCE.getDocumentRoot_ValidatorId();
-
-        /**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VALUE = eINSTANCE.getDocumentRoot_Value();
-
-        /**
-		 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VALUE_CLASS = eINSTANCE.getDocumentRoot_ValueClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Variable Resolver</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VARIABLE_RESOLVER = eINSTANCE.getDocumentRoot_VariableResolver();
-
-        /**
-		 * The meta object literal for the '<em><b>View Declaration Language Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY = eINSTANCE.getDocumentRoot_ViewDeclarationLanguageFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>View Handler</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DOCUMENT_ROOT__VIEW_HANDLER = eINSTANCE.getDocumentRoot_ViewHandler();
-
-        /**
-		 * The meta object literal for the '<em><b>Visit Context Factory</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY = eINSTANCE.getDocumentRoot_VisitContextFactory();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl <em>Dynamic Attribute</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicAttribute()
-		 * @generated
-		 */
-        EClass DYNAMIC_ATTRIBUTE = eINSTANCE.getDynamicAttribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DYNAMIC_ATTRIBUTE__NAME = eINSTANCE.getDynamicAttribute_Name();
-
-        /**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DYNAMIC_ATTRIBUTE__VALUE = eINSTANCE.getDynamicAttribute_Value();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl <em>Dynamic Element</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getDynamicElement()
-		 * @generated
-		 */
-        EClass DYNAMIC_ELEMENT = eINSTANCE.getDynamicElement();
-
-        /**
-		 * The meta object literal for the '<em><b>Child Nodes</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DYNAMIC_ELEMENT__CHILD_NODES = eINSTANCE.getDynamicElement_ChildNodes();
-
-        /**
-		 * The meta object literal for the '<em><b>Attributes</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DYNAMIC_ELEMENT__ATTRIBUTES = eINSTANCE.getDynamicElement_Attributes();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DYNAMIC_ELEMENT__TEXT_CONTENT = eINSTANCE.getDynamicElement_TextContent();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl <em>EL Resolver Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getELResolverType()
-		 * @generated
-		 */
-        EClass EL_RESOLVER_TYPE = eINSTANCE.getELResolverType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute EL_RESOLVER_TYPE__TEXT_CONTENT = eINSTANCE.getELResolverType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute EL_RESOLVER_TYPE__ID = eINSTANCE.getELResolverType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl <em>Exception Handler Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExceptionHandlerFactoryType()
-		 * @generated
-		 */
-		EClass EXCEPTION_HANDLER_FACTORY_TYPE = eINSTANCE.getExceptionHandlerFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getExceptionHandlerFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EXCEPTION_HANDLER_FACTORY_TYPE__ID = eINSTANCE.getExceptionHandlerFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute DYNAMIC_ELEMENT__NAME = eINSTANCE.getDynamicElement_Name();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl <em>Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigType()
-		 * @generated
-		 */
-        EClass FACES_CONFIG_TYPE = eINSTANCE.getFacesConfigType();
-
-        /**
-		 * The meta object literal for the '<em><b>Application</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__APPLICATION = eINSTANCE.getFacesConfigType_Application();
-
-        /**
-		 * The meta object literal for the '<em><b>Ordering</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACES_CONFIG_TYPE__ORDERING = eINSTANCE.getFacesConfigType_Ordering();
-
-								/**
-		 * The meta object literal for the '<em><b>Absolute Ordering</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACES_CONFIG_TYPE__ABSOLUTE_ORDERING = eINSTANCE.getFacesConfigType_AbsoluteOrdering();
-
-								/**
-		 * The meta object literal for the '<em><b>Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__FACTORY = eINSTANCE.getFacesConfigType_Factory();
-
-        /**
-		 * The meta object literal for the '<em><b>Component</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__COMPONENT = eINSTANCE.getFacesConfigType_Component();
-
-        /**
-		 * The meta object literal for the '<em><b>Converter</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__CONVERTER = eINSTANCE.getFacesConfigType_Converter();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__MANAGED_BEAN = eINSTANCE.getFacesConfigType_ManagedBean();
-
-        /**
-		 * The meta object literal for the '<em><b>Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACES_CONFIG_TYPE__NAME = eINSTANCE.getFacesConfigType_Name();
-
-								/**
-		 * The meta object literal for the '<em><b>Navigation Rule</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__NAVIGATION_RULE = eINSTANCE.getFacesConfigType_NavigationRule();
-
-        /**
-		 * The meta object literal for the '<em><b>Referenced Bean</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__REFERENCED_BEAN = eINSTANCE.getFacesConfigType_ReferencedBean();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__RENDER_KIT = eINSTANCE.getFacesConfigType_RenderKit();
-
-        /**
-		 * The meta object literal for the '<em><b>Lifecycle</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__LIFECYCLE = eINSTANCE.getFacesConfigType_Lifecycle();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__VALIDATOR = eINSTANCE.getFacesConfigType_Validator();
-
-        /**
-		 * The meta object literal for the '<em><b>Behavior</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACES_CONFIG_TYPE__BEHAVIOR = eINSTANCE.getFacesConfigType_Behavior();
-
-								/**
-		 * The meta object literal for the '<em><b>Faces Config Extension</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION = eINSTANCE.getFacesConfigType_FacesConfigExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Xmlns</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACES_CONFIG_TYPE__XMLNS = eINSTANCE.getFacesConfigType_Xmlns();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACES_CONFIG_TYPE__ID = eINSTANCE.getFacesConfigType_Id();
-
-        /**
-		 * The meta object literal for the '<em><b>Metadata Complete</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute FACES_CONFIG_TYPE__METADATA_COMPLETE = eINSTANCE.getFacesConfigType_MetadataComplete();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl <em>Faces Context Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesContextFactoryType()
-		 * @generated
-		 */
-        EClass FACES_CONTEXT_FACTORY_TYPE = eINSTANCE.getFacesContextFactoryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getFacesContextFactoryType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACES_CONTEXT_FACTORY_TYPE__ID = eINSTANCE.getFacesContextFactoryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl <em>Facet Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetExtensionType()
-		 * @generated
-		 */
-        EClass FACET_EXTENSION_TYPE = eINSTANCE.getFacetExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl <em>Facet Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetNameType()
-		 * @generated
-		 */
-        EClass FACET_NAME_TYPE = eINSTANCE.getFacetNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACET_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getFacetNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACET_NAME_TYPE__ID = eINSTANCE.getFacetNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl <em>Facet Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacetType()
-		 * @generated
-		 */
-        EClass FACET_TYPE = eINSTANCE.getFacetType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACET_TYPE__DESCRIPTION = eINSTANCE.getFacetType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACET_TYPE__DISPLAY_NAME = eINSTANCE.getFacetType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACET_TYPE__ICON = eINSTANCE.getFacetType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACET_TYPE__FACET_NAME = eINSTANCE.getFacetType_FacetName();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACET_TYPE__FACET_EXTENSION = eINSTANCE.getFacetType_FacetExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACET_TYPE__ID = eINSTANCE.getFacetType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl <em>Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryType()
-		 * @generated
-		 */
-        EClass FACTORY_TYPE = eINSTANCE.getFactoryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Application Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACTORY_TYPE__APPLICATION_FACTORY = eINSTANCE.getFactoryType_ApplicationFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Exception Handler Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY = eINSTANCE.getFactoryType_ExceptionHandlerFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>External Context Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY = eINSTANCE.getFactoryType_ExternalContextFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Faces Context Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACTORY_TYPE__FACES_CONTEXT_FACTORY = eINSTANCE.getFactoryType_FacesContextFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Partial View Context Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY = eINSTANCE.getFactoryType_PartialViewContextFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Lifecycle Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACTORY_TYPE__LIFECYCLE_FACTORY = eINSTANCE.getFactoryType_LifecycleFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>View Declaration Language Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY = eINSTANCE.getFactoryType_ViewDeclarationLanguageFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY = eINSTANCE.getFactoryType_TagHandlerDelegateFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Render Kit Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACTORY_TYPE__RENDER_KIT_FACTORY = eINSTANCE.getFactoryType_RenderKitFactory();
-
-        /**
-		 * The meta object literal for the '<em><b>Visit Context Factory</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference FACTORY_TYPE__VISIT_CONTEXT_FACTORY = eINSTANCE.getFactoryType_VisitContextFactory();
-
-								/**
-		 * The meta object literal for the '<em><b>Factory Extension</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference FACTORY_TYPE__FACTORY_EXTENSION = eINSTANCE.getFactoryType_FactoryExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FACTORY_TYPE__ID = eINSTANCE.getFactoryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl <em>From Action Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromActionType()
-		 * @generated
-		 */
-        EClass FROM_ACTION_TYPE = eINSTANCE.getFromActionType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_ACTION_TYPE__TEXT_CONTENT = eINSTANCE.getFromActionType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_ACTION_TYPE__ID = eINSTANCE.getFromActionType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl <em>From Outcome Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromOutcomeType()
-		 * @generated
-		 */
-        EClass FROM_OUTCOME_TYPE = eINSTANCE.getFromOutcomeType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_OUTCOME_TYPE__TEXT_CONTENT = eINSTANCE.getFromOutcomeType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_OUTCOME_TYPE__ID = eINSTANCE.getFromOutcomeType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl <em>From View Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFromViewIdType()
-		 * @generated
-		 */
-        EClass FROM_VIEW_ID_TYPE = eINSTANCE.getFromViewIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_VIEW_ID_TYPE__TEXT_CONTENT = eINSTANCE.getFromViewIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute FROM_VIEW_ID_TYPE__ID = eINSTANCE.getFromViewIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl <em>Icon Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIconType()
-		 * @generated
-		 */
-        EClass ICON_TYPE = eINSTANCE.getIconType();
-
-        /**
-		 * The meta object literal for the '<em><b>Small Icon</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ICON_TYPE__SMALL_ICON = eINSTANCE.getIconType_SmallIcon();
-
-        /**
-		 * The meta object literal for the '<em><b>Large Icon</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference ICON_TYPE__LARGE_ICON = eINSTANCE.getIconType_LargeIcon();
-
-        /**
-		 * The meta object literal for the '<em><b>Lang</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ICON_TYPE__LANG = eINSTANCE.getIconType_Lang();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute ICON_TYPE__ID = eINSTANCE.getIconType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl <em>If Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getIfType()
-		 * @generated
-		 */
-		EClass IF_TYPE = eINSTANCE.getIfType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute IF_TYPE__TEXT_CONTENT = eINSTANCE.getIfType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute IF_TYPE__ID = eINSTANCE.getIfType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl <em>Key Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyClassType()
-		 * @generated
-		 */
-        EClass KEY_CLASS_TYPE = eINSTANCE.getKeyClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute KEY_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getKeyClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute KEY_CLASS_TYPE__ID = eINSTANCE.getKeyClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl <em>Key Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getKeyType()
-		 * @generated
-		 */
-        EClass KEY_TYPE = eINSTANCE.getKeyType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute KEY_TYPE__TEXT_CONTENT = eINSTANCE.getKeyType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute KEY_TYPE__ID = eINSTANCE.getKeyType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl <em>Large Icon Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLargeIconType()
-		 * @generated
-		 */
-        EClass LARGE_ICON_TYPE = eINSTANCE.getLargeIconType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LARGE_ICON_TYPE__TEXT_CONTENT = eINSTANCE.getLargeIconType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LARGE_ICON_TYPE__ID = eINSTANCE.getLargeIconType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl <em>Lifecycle Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleFactoryType()
-		 * @generated
-		 */
-        EClass LIFECYCLE_FACTORY_TYPE = eINSTANCE.getLifecycleFactoryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getLifecycleFactoryType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LIFECYCLE_FACTORY_TYPE__ID = eINSTANCE.getLifecycleFactoryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl <em>Lifecycle Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleType()
-		 * @generated
-		 */
-        EClass LIFECYCLE_TYPE = eINSTANCE.getLifecycleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Phase Listener</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LIFECYCLE_TYPE__PHASE_LISTENER = eINSTANCE.getLifecycleType_PhaseListener();
-
-        /**
-		 * The meta object literal for the '<em><b>Lifecycle Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LIFECYCLE_TYPE__LIFECYCLE_EXTENSION = eINSTANCE.getLifecycleType_LifecycleExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LIFECYCLE_TYPE__ID = eINSTANCE.getLifecycleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl <em>List Entries Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getListEntriesType()
-		 * @generated
-		 */
-        EClass LIST_ENTRIES_TYPE = eINSTANCE.getListEntriesType();
-
-        /**
-		 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LIST_ENTRIES_TYPE__VALUE_CLASS = eINSTANCE.getListEntriesType_ValueClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LIST_ENTRIES_TYPE__NULL_VALUE = eINSTANCE.getListEntriesType_NullValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LIST_ENTRIES_TYPE__VALUE = eINSTANCE.getListEntriesType_Value();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LIST_ENTRIES_TYPE__ID = eINSTANCE.getListEntriesType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl <em>Locale Config Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLocaleConfigType()
-		 * @generated
-		 */
-        EClass LOCALE_CONFIG_TYPE = eINSTANCE.getLocaleConfigType();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Locale</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LOCALE_CONFIG_TYPE__DEFAULT_LOCALE = eINSTANCE.getLocaleConfigType_DefaultLocale();
-
-        /**
-		 * The meta object literal for the '<em><b>Supported Locale</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE = eINSTANCE.getLocaleConfigType_SupportedLocale();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute LOCALE_CONFIG_TYPE__ID = eINSTANCE.getLocaleConfigType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl <em>Managed Bean Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanClassType()
-		 * @generated
-		 */
-        EClass MANAGED_BEAN_CLASS_TYPE = eINSTANCE.getManagedBeanClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getManagedBeanClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_CLASS_TYPE__ID = eINSTANCE.getManagedBeanClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl <em>Managed Bean Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanNameType()
-		 * @generated
-		 */
-        EClass MANAGED_BEAN_NAME_TYPE = eINSTANCE.getManagedBeanNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getManagedBeanNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_NAME_TYPE__ID = eINSTANCE.getManagedBeanNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl <em>Managed Bean Scope Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanScopeType()
-		 * @generated
-		 */
-        EClass MANAGED_BEAN_SCOPE_TYPE = eINSTANCE.getManagedBeanScopeType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT = eINSTANCE.getManagedBeanScopeType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_SCOPE_TYPE__ID = eINSTANCE.getManagedBeanScopeType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl <em>Managed Bean Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanType()
-		 * @generated
-		 */
-        EClass MANAGED_BEAN_TYPE = eINSTANCE.getManagedBeanType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__DESCRIPTION = eINSTANCE.getManagedBeanType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__DISPLAY_NAME = eINSTANCE.getManagedBeanType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__ICON = eINSTANCE.getManagedBeanType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME = eINSTANCE.getManagedBeanType_ManagedBeanName();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS = eINSTANCE.getManagedBeanType_ManagedBeanClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Scope</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE = eINSTANCE.getManagedBeanType_ManagedBeanScope();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MANAGED_PROPERTY = eINSTANCE.getManagedBeanType_ManagedProperty();
-
-        /**
-		 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MAP_ENTRIES = eINSTANCE.getManagedBeanType_MapEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__LIST_ENTRIES = eINSTANCE.getManagedBeanType_ListEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>Managed Bean Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION = eINSTANCE.getManagedBeanType_ManagedBeanExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_BEAN_TYPE__ID = eINSTANCE.getManagedBeanType_Id();
-
-        /**
-		 * The meta object literal for the '<em><b>Eager</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute MANAGED_BEAN_TYPE__EAGER = eINSTANCE.getManagedBeanType_Eager();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl <em>Managed Property Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedPropertyType()
-		 * @generated
-		 */
-        EClass MANAGED_PROPERTY_TYPE = eINSTANCE.getManagedPropertyType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__DESCRIPTION = eINSTANCE.getManagedPropertyType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__DISPLAY_NAME = eINSTANCE.getManagedPropertyType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__ICON = eINSTANCE.getManagedPropertyType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__PROPERTY_NAME = eINSTANCE.getManagedPropertyType_PropertyName();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__PROPERTY_CLASS = eINSTANCE.getManagedPropertyType_PropertyClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Map Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__MAP_ENTRIES = eINSTANCE.getManagedPropertyType_MapEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__NULL_VALUE = eINSTANCE.getManagedPropertyType_NullValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__VALUE = eINSTANCE.getManagedPropertyType_Value();
-
-        /**
-		 * The meta object literal for the '<em><b>List Entries</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MANAGED_PROPERTY_TYPE__LIST_ENTRIES = eINSTANCE.getManagedPropertyType_ListEntries();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MANAGED_PROPERTY_TYPE__ID = eINSTANCE.getManagedPropertyType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl <em>Map Entries Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntriesType()
-		 * @generated
-		 */
-        EClass MAP_ENTRIES_TYPE = eINSTANCE.getMapEntriesType();
-
-        /**
-		 * The meta object literal for the '<em><b>Key Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRIES_TYPE__KEY_CLASS = eINSTANCE.getMapEntriesType_KeyClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Value Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRIES_TYPE__VALUE_CLASS = eINSTANCE.getMapEntriesType_ValueClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Map Entry</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRIES_TYPE__MAP_ENTRY = eINSTANCE.getMapEntriesType_MapEntry();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MAP_ENTRIES_TYPE__ID = eINSTANCE.getMapEntriesType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl <em>Map Entry Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMapEntryType()
-		 * @generated
-		 */
-        EClass MAP_ENTRY_TYPE = eINSTANCE.getMapEntryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Key</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRY_TYPE__KEY = eINSTANCE.getMapEntryType_Key();
-
-        /**
-		 * The meta object literal for the '<em><b>Null Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRY_TYPE__NULL_VALUE = eINSTANCE.getMapEntryType_NullValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference MAP_ENTRY_TYPE__VALUE = eINSTANCE.getMapEntryType_Value();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MAP_ENTRY_TYPE__ID = eINSTANCE.getMapEntryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl <em>Message Bundle Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getMessageBundleType()
-		 * @generated
-		 */
-        EClass MESSAGE_BUNDLE_TYPE = eINSTANCE.getMessageBundleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MESSAGE_BUNDLE_TYPE__TEXT_CONTENT = eINSTANCE.getMessageBundleType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute MESSAGE_BUNDLE_TYPE__ID = eINSTANCE.getMessageBundleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl <em>Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNameType()
-		 * @generated
-		 */
-		EClass NAME_TYPE = eINSTANCE.getNameType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NAME_TYPE__TEXT_CONTENT = eINSTANCE.getNameType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute NAME_TYPE__ID = eINSTANCE.getNameType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl <em>Navigation Case Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationCaseType()
-		 * @generated
-		 */
-        EClass NAVIGATION_CASE_TYPE = eINSTANCE.getNavigationCaseType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__DESCRIPTION = eINSTANCE.getNavigationCaseType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__DISPLAY_NAME = eINSTANCE.getNavigationCaseType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__ICON = eINSTANCE.getNavigationCaseType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>From Action</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__FROM_ACTION = eINSTANCE.getNavigationCaseType_FromAction();
-
-        /**
-		 * The meta object literal for the '<em><b>From Outcome</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__FROM_OUTCOME = eINSTANCE.getNavigationCaseType_FromOutcome();
-
-        /**
-		 * The meta object literal for the '<em><b>If</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference NAVIGATION_CASE_TYPE__IF = eINSTANCE.getNavigationCaseType_If();
-
-								/**
-		 * The meta object literal for the '<em><b>To View Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__TO_VIEW_ID = eINSTANCE.getNavigationCaseType_ToViewId();
-
-        /**
-		 * The meta object literal for the '<em><b>Redirect</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_CASE_TYPE__REDIRECT = eINSTANCE.getNavigationCaseType_Redirect();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute NAVIGATION_CASE_TYPE__ID = eINSTANCE.getNavigationCaseType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl <em>Navigation Handler Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationHandlerType()
-		 * @generated
-		 */
-        EClass NAVIGATION_HANDLER_TYPE = eINSTANCE.getNavigationHandlerType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute NAVIGATION_HANDLER_TYPE__TEXT_CONTENT = eINSTANCE.getNavigationHandlerType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute NAVIGATION_HANDLER_TYPE__ID = eINSTANCE.getNavigationHandlerType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl <em>Navigation Rule Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleType()
-		 * @generated
-		 */
-        EClass NAVIGATION_RULE_TYPE = eINSTANCE.getNavigationRuleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__DESCRIPTION = eINSTANCE.getNavigationRuleType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__DISPLAY_NAME = eINSTANCE.getNavigationRuleType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__ICON = eINSTANCE.getNavigationRuleType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>From View Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__FROM_VIEW_ID = eINSTANCE.getNavigationRuleType_FromViewId();
-
-        /**
-		 * The meta object literal for the '<em><b>Navigation Case</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__NAVIGATION_CASE = eINSTANCE.getNavigationRuleType_NavigationCase();
-
-        /**
-		 * The meta object literal for the '<em><b>Navigation Rule Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION = eINSTANCE.getNavigationRuleType_NavigationRuleExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute NAVIGATION_RULE_TYPE__ID = eINSTANCE.getNavigationRuleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl <em>Null Value Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNullValueType()
-		 * @generated
-		 */
-        EClass NULL_VALUE_TYPE = eINSTANCE.getNullValueType();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute NULL_VALUE_TYPE__ID = eINSTANCE.getNullValueType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl <em>Ordering Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingType()
-		 * @generated
-		 */
-		EClass ORDERING_TYPE = eINSTANCE.getOrderingType();
-
-								/**
-		 * The meta object literal for the '<em><b>Before</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ORDERING_TYPE__BEFORE = eINSTANCE.getOrderingType_Before();
-
-								/**
-		 * The meta object literal for the '<em><b>After</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ORDERING_TYPE__AFTER = eINSTANCE.getOrderingType_After();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl <em>Ordering Ordering Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingOrderingType()
-		 * @generated
-		 */
-		EClass ORDERING_ORDERING_TYPE = eINSTANCE.getOrderingOrderingType();
-
-								/**
-		 * The meta object literal for the '<em><b>Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ORDERING_ORDERING_TYPE__NAME = eINSTANCE.getOrderingOrderingType_Name();
-
-								/**
-		 * The meta object literal for the '<em><b>Others</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference ORDERING_ORDERING_TYPE__OTHERS = eINSTANCE.getOrderingOrderingType_Others();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOthersTypeImpl <em>Ordering Others Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOthersTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getOrderingOthersType()
-		 * @generated
-		 */
-		EClass ORDERING_OTHERS_TYPE = eINSTANCE.getOrderingOthersType();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ORDERING_OTHERS_TYPE__ID = eINSTANCE.getOrderingOthersType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl <em>Partial View Context Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPartialViewContextFactoryType()
-		 * @generated
-		 */
-		EClass PARTIAL_VIEW_CONTEXT_FACTORY_TYPE = eINSTANCE.getPartialViewContextFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getPartialViewContextFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID = eINSTANCE.getPartialViewContextFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl <em>Phase Listener Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPhaseListenerType()
-		 * @generated
-		 */
-        EClass PHASE_LISTENER_TYPE = eINSTANCE.getPhaseListenerType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PHASE_LISTENER_TYPE__TEXT_CONTENT = eINSTANCE.getPhaseListenerType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PHASE_LISTENER_TYPE__ID = eINSTANCE.getPhaseListenerType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl <em>Property Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyClassType()
-		 * @generated
-		 */
-        EClass PROPERTY_CLASS_TYPE = eINSTANCE.getPropertyClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getPropertyClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_CLASS_TYPE__ID = eINSTANCE.getPropertyClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl <em>Property Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyExtensionType()
-		 * @generated
-		 */
-        EClass PROPERTY_EXTENSION_TYPE = eINSTANCE.getPropertyExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl <em>Property Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyNameType()
-		 * @generated
-		 */
-        EClass PROPERTY_NAME_TYPE = eINSTANCE.getPropertyNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getPropertyNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_NAME_TYPE__ID = eINSTANCE.getPropertyNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl <em>Property Resolver Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyResolverType()
-		 * @generated
-		 */
-        EClass PROPERTY_RESOLVER_TYPE = eINSTANCE.getPropertyResolverType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_RESOLVER_TYPE__TEXT_CONTENT = eINSTANCE.getPropertyResolverType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_RESOLVER_TYPE__ID = eINSTANCE.getPropertyResolverType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl <em>Property Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getPropertyType()
-		 * @generated
-		 */
-        EClass PROPERTY_TYPE = eINSTANCE.getPropertyType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__DESCRIPTION = eINSTANCE.getPropertyType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__DISPLAY_NAME = eINSTANCE.getPropertyType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__ICON = eINSTANCE.getPropertyType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__PROPERTY_NAME = eINSTANCE.getPropertyType_PropertyName();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__PROPERTY_CLASS = eINSTANCE.getPropertyType_PropertyClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Default Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__DEFAULT_VALUE = eINSTANCE.getPropertyType_DefaultValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Suggested Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__SUGGESTED_VALUE = eINSTANCE.getPropertyType_SuggestedValue();
-
-        /**
-		 * The meta object literal for the '<em><b>Property Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference PROPERTY_TYPE__PROPERTY_EXTENSION = eINSTANCE.getPropertyType_PropertyExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute PROPERTY_TYPE__ID = eINSTANCE.getPropertyType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl <em>Redirect Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectType()
-		 * @generated
-		 */
-        EClass REDIRECT_TYPE = eINSTANCE.getRedirectType();
-
-        /**
-		 * The meta object literal for the '<em><b>View Param</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REDIRECT_TYPE__VIEW_PARAM = eINSTANCE.getRedirectType_ViewParam();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REDIRECT_TYPE__ID = eINSTANCE.getRedirectType_Id();
-
-        /**
-		 * The meta object literal for the '<em><b>Include View Params</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute REDIRECT_TYPE__INCLUDE_VIEW_PARAMS = eINSTANCE.getRedirectType_IncludeViewParams();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl <em>Redirect View Param Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRedirectViewParamType()
-		 * @generated
-		 */
-		EClass REDIRECT_VIEW_PARAM_TYPE = eINSTANCE.getRedirectViewParamType();
-
-								/**
-		 * The meta object literal for the '<em><b>Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REDIRECT_VIEW_PARAM_TYPE__NAME = eINSTANCE.getRedirectViewParamType_Name();
-
-								/**
-		 * The meta object literal for the '<em><b>Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference REDIRECT_VIEW_PARAM_TYPE__VALUE = eINSTANCE.getRedirectViewParamType_Value();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute REDIRECT_VIEW_PARAM_TYPE__ID = eINSTANCE.getRedirectViewParamType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl <em>Referenced Bean Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanClassType()
-		 * @generated
-		 */
-        EClass REFERENCED_BEAN_CLASS_TYPE = eINSTANCE.getReferencedBeanClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getReferencedBeanClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REFERENCED_BEAN_CLASS_TYPE__ID = eINSTANCE.getReferencedBeanClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl <em>Referenced Bean Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanNameType()
-		 * @generated
-		 */
-        EClass REFERENCED_BEAN_NAME_TYPE = eINSTANCE.getReferencedBeanNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getReferencedBeanNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REFERENCED_BEAN_NAME_TYPE__ID = eINSTANCE.getReferencedBeanNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl <em>Referenced Bean Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getReferencedBeanType()
-		 * @generated
-		 */
-        EClass REFERENCED_BEAN_TYPE = eINSTANCE.getReferencedBeanType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference REFERENCED_BEAN_TYPE__DESCRIPTION = eINSTANCE.getReferencedBeanType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference REFERENCED_BEAN_TYPE__DISPLAY_NAME = eINSTANCE.getReferencedBeanType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference REFERENCED_BEAN_TYPE__ICON = eINSTANCE.getReferencedBeanType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Referenced Bean Name</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME = eINSTANCE.getReferencedBeanType_ReferencedBeanName();
-
-        /**
-		 * The meta object literal for the '<em><b>Referenced Bean Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS = eINSTANCE.getReferencedBeanType_ReferencedBeanClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute REFERENCED_BEAN_TYPE__ID = eINSTANCE.getReferencedBeanType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl <em>Renderer Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererClassType()
-		 * @generated
-		 */
-        EClass RENDERER_CLASS_TYPE = eINSTANCE.getRendererClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDERER_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getRendererClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDERER_CLASS_TYPE__ID = eINSTANCE.getRendererClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl <em>Renderer Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererExtensionType()
-		 * @generated
-		 */
-        EClass RENDERER_EXTENSION_TYPE = eINSTANCE.getRendererExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl <em>Renderer Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererType()
-		 * @generated
-		 */
-        EClass RENDERER_TYPE = eINSTANCE.getRendererType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__DESCRIPTION = eINSTANCE.getRendererType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__DISPLAY_NAME = eINSTANCE.getRendererType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__ICON = eINSTANCE.getRendererType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Component Family</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__COMPONENT_FAMILY = eINSTANCE.getRendererType_ComponentFamily();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Type</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__RENDERER_TYPE = eINSTANCE.getRendererType_RendererType();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__RENDERER_CLASS = eINSTANCE.getRendererType_RendererClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Facet</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__FACET = eINSTANCE.getRendererType_Facet();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__ATTRIBUTE = eINSTANCE.getRendererType_Attribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDERER_TYPE__RENDERER_EXTENSION = eINSTANCE.getRendererType_RendererExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDERER_TYPE__ID = eINSTANCE.getRendererType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl <em>Renderer Type Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRendererTypeType()
-		 * @generated
-		 */
-        EClass RENDERER_TYPE_TYPE = eINSTANCE.getRendererTypeType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDERER_TYPE_TYPE__TEXT_CONTENT = eINSTANCE.getRendererTypeType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDERER_TYPE_TYPE__ID = eINSTANCE.getRendererTypeType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl <em>Render Kit Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitClassType()
-		 * @generated
-		 */
-        EClass RENDER_KIT_CLASS_TYPE = eINSTANCE.getRenderKitClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getRenderKitClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_CLASS_TYPE__ID = eINSTANCE.getRenderKitClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl <em>Render Kit Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitFactoryType()
-		 * @generated
-		 */
-        EClass RENDER_KIT_FACTORY_TYPE = eINSTANCE.getRenderKitFactoryType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getRenderKitFactoryType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_FACTORY_TYPE__ID = eINSTANCE.getRenderKitFactoryType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl <em>Render Kit Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitIdType()
-		 * @generated
-		 */
-        EClass RENDER_KIT_ID_TYPE = eINSTANCE.getRenderKitIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_ID_TYPE__TEXT_CONTENT = eINSTANCE.getRenderKitIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_ID_TYPE__ID = eINSTANCE.getRenderKitIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl <em>Render Kit Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitType()
-		 * @generated
-		 */
-        EClass RENDER_KIT_TYPE = eINSTANCE.getRenderKitType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__DESCRIPTION = eINSTANCE.getRenderKitType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__DISPLAY_NAME = eINSTANCE.getRenderKitType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__ICON = eINSTANCE.getRenderKitType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__RENDER_KIT_ID = eINSTANCE.getRenderKitType_RenderKitId();
-
-        /**
-		 * The meta object literal for the '<em><b>Render Kit Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__RENDER_KIT_CLASS = eINSTANCE.getRenderKitType_RenderKitClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Renderer</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__RENDERER = eINSTANCE.getRenderKitType_Renderer();
-
-        /**
-		 * The meta object literal for the '<em><b>Client Behavior Renderer</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER = eINSTANCE.getRenderKitType_ClientBehaviorRenderer();
-
-								/**
-		 * The meta object literal for the '<em><b>Render Kit Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RENDER_KIT_TYPE__RENDER_KIT_EXTENSION = eINSTANCE.getRenderKitType_RenderKitExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RENDER_KIT_TYPE__ID = eINSTANCE.getRenderKitType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl <em>Small Icon Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSmallIconType()
-		 * @generated
-		 */
-        EClass SMALL_ICON_TYPE = eINSTANCE.getSmallIconType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SMALL_ICON_TYPE__TEXT_CONTENT = eINSTANCE.getSmallIconType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SMALL_ICON_TYPE__ID = eINSTANCE.getSmallIconType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl <em>Source Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSourceClassType()
-		 * @generated
-		 */
-		EClass SOURCE_CLASS_TYPE = eINSTANCE.getSourceClassType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SOURCE_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getSourceClassType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SOURCE_CLASS_TYPE__ID = eINSTANCE.getSourceClassType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl <em>State Manager Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getStateManagerType()
-		 * @generated
-		 */
-        EClass STATE_MANAGER_TYPE = eINSTANCE.getStateManagerType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute STATE_MANAGER_TYPE__TEXT_CONTENT = eINSTANCE.getStateManagerType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute STATE_MANAGER_TYPE__ID = eINSTANCE.getStateManagerType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl <em>Suggested Value Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSuggestedValueType()
-		 * @generated
-		 */
-        EClass SUGGESTED_VALUE_TYPE = eINSTANCE.getSuggestedValueType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SUGGESTED_VALUE_TYPE__TEXT_CONTENT = eINSTANCE.getSuggestedValueType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SUGGESTED_VALUE_TYPE__ID = eINSTANCE.getSuggestedValueType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl <em>Supported Locale Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSupportedLocaleType()
-		 * @generated
-		 */
-        EClass SUPPORTED_LOCALE_TYPE = eINSTANCE.getSupportedLocaleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SUPPORTED_LOCALE_TYPE__TEXT_CONTENT = eINSTANCE.getSupportedLocaleType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute SUPPORTED_LOCALE_TYPE__ID = eINSTANCE.getSupportedLocaleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl <em>System Event Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventClassType()
-		 * @generated
-		 */
-		EClass SYSTEM_EVENT_CLASS_TYPE = eINSTANCE.getSystemEventClassType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getSystemEventClassType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SYSTEM_EVENT_CLASS_TYPE__ID = eINSTANCE.getSystemEventClassType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl <em>System Event Listener Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventListenerClassType()
-		 * @generated
-		 */
-		EClass SYSTEM_EVENT_LISTENER_CLASS_TYPE = eINSTANCE.getSystemEventListenerClassType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getSystemEventListenerClassType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID = eINSTANCE.getSystemEventListenerClassType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl <em>System Event Listener Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getSystemEventListenerType()
-		 * @generated
-		 */
-		EClass SYSTEM_EVENT_LISTENER_TYPE = eINSTANCE.getSystemEventListenerType();
-
-								/**
-		 * The meta object literal for the '<em><b>System Event Listener Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS = eINSTANCE.getSystemEventListenerType_SystemEventListenerClass();
-
-								/**
-		 * The meta object literal for the '<em><b>System Event Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS = eINSTANCE.getSystemEventListenerType_SystemEventClass();
-
-								/**
-		 * The meta object literal for the '<em><b>Source Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS = eINSTANCE.getSystemEventListenerType_SourceClass();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SYSTEM_EVENT_LISTENER_TYPE__ID = eINSTANCE.getSystemEventListenerType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl <em>Tag Handler Delegate Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getTagHandlerDelegateFactoryType()
-		 * @generated
-		 */
-		EClass TAG_HANDLER_DELEGATE_FACTORY_TYPE = eINSTANCE.getTagHandlerDelegateFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getTagHandlerDelegateFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID = eINSTANCE.getTagHandlerDelegateFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl <em>To View Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getToViewIdType()
-		 * @generated
-		 */
-        EClass TO_VIEW_ID_TYPE = eINSTANCE.getToViewIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute TO_VIEW_ID_TYPE__TEXT_CONTENT = eINSTANCE.getToViewIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute TO_VIEW_ID_TYPE__ID = eINSTANCE.getToViewIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl <em>Validator Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorClassType()
-		 * @generated
-		 */
-        EClass VALIDATOR_CLASS_TYPE = eINSTANCE.getValidatorClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALIDATOR_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getValidatorClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALIDATOR_CLASS_TYPE__ID = eINSTANCE.getValidatorClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl <em>Validator Id Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorIdType()
-		 * @generated
-		 */
-        EClass VALIDATOR_ID_TYPE = eINSTANCE.getValidatorIdType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALIDATOR_ID_TYPE__TEXT_CONTENT = eINSTANCE.getValidatorIdType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALIDATOR_ID_TYPE__ID = eINSTANCE.getValidatorIdType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl <em>Validator Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorType()
-		 * @generated
-		 */
-        EClass VALIDATOR_TYPE = eINSTANCE.getValidatorType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__DESCRIPTION = eINSTANCE.getValidatorType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__DISPLAY_NAME = eINSTANCE.getValidatorType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__ICON = eINSTANCE.getValidatorType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator Id</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__VALIDATOR_ID = eINSTANCE.getValidatorType_ValidatorId();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator Class</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__VALIDATOR_CLASS = eINSTANCE.getValidatorType_ValidatorClass();
-
-        /**
-		 * The meta object literal for the '<em><b>Attribute</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__ATTRIBUTE = eINSTANCE.getValidatorType_Attribute();
-
-        /**
-		 * The meta object literal for the '<em><b>Property</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__PROPERTY = eINSTANCE.getValidatorType_Property();
-
-        /**
-		 * The meta object literal for the '<em><b>Validator Extension</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference VALIDATOR_TYPE__VALIDATOR_EXTENSION = eINSTANCE.getValidatorType_ValidatorExtension();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALIDATOR_TYPE__ID = eINSTANCE.getValidatorType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl <em>Value Class Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueClassType()
-		 * @generated
-		 */
-        EClass VALUE_CLASS_TYPE = eINSTANCE.getValueClassType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALUE_CLASS_TYPE__TEXT_CONTENT = eINSTANCE.getValueClassType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALUE_CLASS_TYPE__ID = eINSTANCE.getValueClassType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl <em>Value Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValueType()
-		 * @generated
-		 */
-        EClass VALUE_TYPE = eINSTANCE.getValueType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALUE_TYPE__TEXT_CONTENT = eINSTANCE.getValueType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VALUE_TYPE__ID = eINSTANCE.getValueType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl <em>Variable Resolver Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVariableResolverType()
-		 * @generated
-		 */
-        EClass VARIABLE_RESOLVER_TYPE = eINSTANCE.getVariableResolverType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VARIABLE_RESOLVER_TYPE__TEXT_CONTENT = eINSTANCE.getVariableResolverType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VARIABLE_RESOLVER_TYPE__ID = eINSTANCE.getVariableResolverType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl <em>View Handler Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewHandlerType()
-		 * @generated
-		 */
-        EClass VIEW_HANDLER_TYPE = eINSTANCE.getViewHandlerType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VIEW_HANDLER_TYPE__TEXT_CONTENT = eINSTANCE.getViewHandlerType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VIEW_HANDLER_TYPE__ID = eINSTANCE.getViewHandlerType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl <em>Resource Bundle Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getResourceBundleType()
-		 * @generated
-		 */
-        EClass RESOURCE_BUNDLE_TYPE = eINSTANCE.getResourceBundleType();
-
-        /**
-		 * The meta object literal for the '<em><b>Description</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RESOURCE_BUNDLE_TYPE__DESCRIPTION = eINSTANCE.getResourceBundleType_Description();
-
-        /**
-		 * The meta object literal for the '<em><b>Display Name</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RESOURCE_BUNDLE_TYPE__DISPLAY_NAME = eINSTANCE.getResourceBundleType_DisplayName();
-
-        /**
-		 * The meta object literal for the '<em><b>Icon</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RESOURCE_BUNDLE_TYPE__ICON = eINSTANCE.getResourceBundleType_Icon();
-
-        /**
-		 * The meta object literal for the '<em><b>Base Name</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RESOURCE_BUNDLE_TYPE__BASE_NAME = eINSTANCE.getResourceBundleType_BaseName();
-
-        /**
-		 * The meta object literal for the '<em><b>Var</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference RESOURCE_BUNDLE_TYPE__VAR = eINSTANCE.getResourceBundleType_Var();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute RESOURCE_BUNDLE_TYPE__ID = eINSTANCE.getResourceBundleType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl <em>Base Name Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getBaseNameType()
-		 * @generated
-		 */
-        EClass BASE_NAME_TYPE = eINSTANCE.getBaseNameType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute BASE_NAME_TYPE__TEXT_CONTENT = eINSTANCE.getBaseNameType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute BASE_NAME_TYPE__ID = eINSTANCE.getBaseNameType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl <em>Var Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVarType()
-		 * @generated
-		 */
-        EClass VAR_TYPE = eINSTANCE.getVarType();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VAR_TYPE__TEXT_CONTENT = eINSTANCE.getVarType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute VAR_TYPE__ID = eINSTANCE.getVarType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl <em>View Declaration Language Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getViewDeclarationLanguageFactoryType()
-		 * @generated
-		 */
-		EClass VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE = eINSTANCE.getViewDeclarationLanguageFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getViewDeclarationLanguageFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID = eINSTANCE.getViewDeclarationLanguageFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl <em>Visit Context Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getVisitContextFactoryType()
-		 * @generated
-		 */
-		EClass VISIT_CONTEXT_FACTORY_TYPE = eINSTANCE.getVisitContextFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getVisitContextFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute VISIT_CONTEXT_FACTORY_TYPE__ID = eINSTANCE.getVisitContextFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl <em>Render Kit Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getRenderKitExtensionType()
-		 * @generated
-		 */
-        EClass RENDER_KIT_EXTENSION_TYPE = eINSTANCE.getRenderKitExtensionType();
-
-            /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl <em>Resource Handler Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getResourceHandlerType()
-		 * @generated
-		 */
-		EClass RESOURCE_HANDLER_TYPE = eINSTANCE.getResourceHandlerType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOURCE_HANDLER_TYPE__TEXT_CONTENT = eINSTANCE.getResourceHandlerType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOURCE_HANDLER_TYPE__ID = eINSTANCE.getResourceHandlerType_Id();
-
-												/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl <em>Navigation Rule Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getNavigationRuleExtensionType()
-		 * @generated
-		 */
-        EClass NAVIGATION_RULE_EXTENSION_TYPE = eINSTANCE.getNavigationRuleExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl <em>Validator Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getValidatorExtensionType()
-		 * @generated
-		 */
-        EClass VALIDATOR_EXTENSION_TYPE = eINSTANCE.getValidatorExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl <em>Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFacesConfigExtensionType()
-		 * @generated
-		 */
-        EClass FACES_CONFIG_EXTENSION_TYPE = eINSTANCE.getFacesConfigExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl <em>Factory Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getFactoryExtensionType()
-		 * @generated
-		 */
-        EClass FACTORY_EXTENSION_TYPE = eINSTANCE.getFactoryExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl <em>Lifecycle Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getLifecycleExtensionType()
-		 * @generated
-		 */
-        EClass LIFECYCLE_EXTENSION_TYPE = eINSTANCE.getLifecycleExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl <em>Managed Bean Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getManagedBeanExtensionType()
-		 * @generated
-		 */
-        EClass MANAGED_BEAN_EXTENSION_TYPE = eINSTANCE.getManagedBeanExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl <em>Converter Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getConverterExtensionType()
-		 * @generated
-		 */
-        EClass CONVERTER_EXTENSION_TYPE = eINSTANCE.getConverterExtensionType();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl <em>Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExtensionType()
-		 * @generated
-		 */
-        EClass EXTENSION_TYPE = eINSTANCE.getExtensionType();
-
-        /**
-		 * The meta object literal for the '<em><b>Child Nodes</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference EXTENSION_TYPE__CHILD_NODES = eINSTANCE.getExtensionType_ChildNodes();
-
-        /**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute EXTENSION_TYPE__TEXT_CONTENT = eINSTANCE.getExtensionType_TextContent();
-
-        /**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EAttribute EXTENSION_TYPE__ID = eINSTANCE.getExtensionType_Id();
-
-        /**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl <em>External Context Factory Type</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getExternalContextFactoryType()
-		 * @generated
-		 */
-		EClass EXTERNAL_CONTEXT_FACTORY_TYPE = eINSTANCE.getExternalContextFactoryType();
-
-								/**
-		 * The meta object literal for the '<em><b>Text Content</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT = eINSTANCE.getExternalContextFactoryType_TextContent();
-
-								/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EXTERNAL_CONTEXT_FACTORY_TYPE__ID = eINSTANCE.getExternalContextFactoryType_Id();
-
-								/**
-		 * The meta object literal for the '{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl <em>Application Extension Type</em>}' class.
-		 * <!-- begin-user-doc -->
-         * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationExtensionTypeImpl
-		 * @see org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigPackageImpl#getApplicationExtensionType()
-		 * @generated
-		 */
-        EClass APPLICATION_EXTENSION_TYPE = eINSTANCE.getApplicationExtensionType();
-
-}
-
-} //FacesConfigPackage
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigType.java
deleted file mode 100644
index 825bac3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesConfigType.java
+++ /dev/null
@@ -1,442 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getOrdering <em>Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getAbsoluteOrdering <em>Absolute Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getBehavior <em>Behavior</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getFacesConfigExtension <em>Faces Config Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#isMetadataComplete <em>Metadata Complete</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType()
- * @model extendedMetaData="name='faces-config_._type' kind='elementOnly'"
- * @generated
- */
-public interface FacesConfigType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Application</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Application</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Application</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Application()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ApplicationType" containment="true"
-	 *        extendedMetaData="kind='element' name='application' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getApplication();
-
-    /**
-	 * Returns the value of the '<em><b>Ordering</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Ordering</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Ordering</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Ordering()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.OrderingType" containment="true"
-	 *        extendedMetaData="kind='element' name='ordering' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getOrdering();
-
-				/**
-	 * Returns the value of the '<em><b>Absolute Ordering</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Absolute Ordering</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Absolute Ordering</em>' containment reference.
-	 * @see #setAbsoluteOrdering(AbsoluteOrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_AbsoluteOrdering()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='absolute-ordering' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	AbsoluteOrderingType getAbsoluteOrdering();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getAbsoluteOrdering <em>Absolute Ordering</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Absolute Ordering</em>' containment reference.
-	 * @see #getAbsoluteOrdering()
-	 * @generated
-	 */
-	void setAbsoluteOrdering(AbsoluteOrderingType value);
-
-				/**
-	 * Returns the value of the '<em><b>Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Factory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getFactory();
-
-    /**
-	 * Returns the value of the '<em><b>Component</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Component</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Component()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ComponentType" containment="true"
-	 *        extendedMetaData="kind='element' name='component' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getComponent();
-
-    /**
-	 * Returns the value of the '<em><b>Converter</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Converter</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Converter</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Converter()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ConverterType" containment="true"
-	 *        extendedMetaData="kind='element' name='converter' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getConverter();
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Bean</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_ManagedBean()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType" containment="true"
-	 *        extendedMetaData="kind='element' name='managed-bean' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getManagedBean();
-
-    /**
-	 * Returns the value of the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' containment reference.
-	 * @see #setName(NameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Name()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NameType getName();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getName <em>Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' containment reference.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(NameType value);
-
-				/**
-	 * Returns the value of the '<em><b>Navigation Rule</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Navigation Rule</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Navigation Rule</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_NavigationRule()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType" containment="true"
-	 *        extendedMetaData="kind='element' name='navigation-rule' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getNavigationRule();
-
-    /**
-	 * Returns the value of the '<em><b>Referenced Bean</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Bean</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Referenced Bean</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_ReferencedBean()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType" containment="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getReferencedBean();
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Render Kit</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_RenderKit()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RenderKitType" containment="true"
-	 *        extendedMetaData="kind='element' name='render-kit' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getRenderKit();
-
-    /**
-	 * Returns the value of the '<em><b>Lifecycle</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lifecycle</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lifecycle</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Lifecycle()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.LifecycleType" containment="true"
-	 *        extendedMetaData="kind='element' name='lifecycle' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getLifecycle();
-
-    /**
-	 * Returns the value of the '<em><b>Validator</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Validator</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Validator()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValidatorType" containment="true"
-	 *        extendedMetaData="kind='element' name='validator' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getValidator();
-
-    /**
-	 * Returns the value of the '<em><b>Behavior</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Behavior</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Behavior</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Behavior()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.BehaviorType" containment="true"
-	 *        extendedMetaData="kind='element' name='behavior' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getBehavior();
-
-				/**
-	 * Returns the value of the '<em><b>Faces Config Extension</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Faces Config Extension</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Faces Config Extension</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_FacesConfigExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType"
-	 *        extendedMetaData="kind='element' name='faces-config-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getFacesConfigExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Xmlns</b></em>' attribute.
-	 * The default value is <code>"http://java.sun.com/JSF/Configuration"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Xmlns</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Xmlns</em>' attribute.
-	 * @see #isSetXmlns()
-	 * @see #unsetXmlns()
-	 * @see #setXmlns(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Xmlns()
-	 * @model default="http://java.sun.com/JSF/Configuration" unique="false" unsettable="true" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="kind='attribute' name='xmlns' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getXmlns();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Xmlns</em>' attribute.
-	 * @see #isSetXmlns()
-	 * @see #unsetXmlns()
-	 * @see #getXmlns()
-	 * @generated
-	 */
-	void setXmlns(String value);
-
-    /**
-	 * Unsets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetXmlns()
-	 * @see #getXmlns()
-	 * @see #setXmlns(String)
-	 * @generated
-	 */
-	void unsetXmlns();
-
-    /**
-	 * Returns whether the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getXmlns <em>Xmlns</em>}' attribute is set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return whether the value of the '<em>Xmlns</em>' attribute is set.
-	 * @see #unsetXmlns()
-	 * @see #getXmlns()
-	 * @see #setXmlns(String)
-	 * @generated
-	 */
-	boolean isSetXmlns();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-				/**
-	 * Returns the value of the '<em><b>Metadata Complete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Metadata Complete</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Metadata Complete</em>' attribute.
-	 * @see #setMetadataComplete(boolean)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesConfigType_MetadataComplete()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='metadata-complete' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isMetadataComplete();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType#isMetadataComplete <em>Metadata Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Metadata Complete</em>' attribute.
-	 * @see #isMetadataComplete()
-	 * @generated
-	 */
-	void setMetadataComplete(boolean value);
-
-} // FacesConfigType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesContextFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesContextFactoryType.java
deleted file mode 100644
index a520c01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacesContextFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Faces Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesContextFactoryType()
- * @model extendedMetaData="name='faces-context-factory_._type' kind='simple'"
- * @generated
- */
-public interface FacesContextFactoryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesContextFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacesContextFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FacesContextFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetExtensionType.java
deleted file mode 100644
index 9f7d387..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facet Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetExtensionType()
- * @model extendedMetaData="name='facet-extension_._type'"
- * @generated
- */
-public interface FacetExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // FacetExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetNameType.java
deleted file mode 100644
index 5732733..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facet Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetNameType()
- * @model extendedMetaData="name='facet-name_._type' kind='simple'"
- * @generated
- */
-public interface FacetNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FacetNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetType.java
deleted file mode 100644
index 9cb62f3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FacetType.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Facet Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType()
- * @model extendedMetaData="name='facet_._type' kind='elementOnly'"
- * @generated
- */
-public interface FacetType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Facet Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Facet Name</em>' containment reference.
-	 * @see #setFacetName(FacetNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_FacetName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='facet-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FacetNameType getFacetName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getFacetName <em>Facet Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Facet Name</em>' containment reference.
-	 * @see #getFacetName()
-	 * @generated
-	 */
-	void setFacetName(FacetNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Facet Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_FacetExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='facet-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getFacetExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFacetType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FacetType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryExtensionType.java
deleted file mode 100644
index 67d67f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Factory Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryExtensionType()
- * @model extendedMetaData="name='factory-extension_._type'"
- * @generated
- */
-public interface FactoryExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // FactoryExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryType.java
deleted file mode 100644
index e2b9880..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FactoryType.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExceptionHandlerFactory <em>Exception Handler Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getExternalContextFactory <em>External Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getPartialViewContextFactory <em>Partial View Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getVisitContextFactory <em>Visit Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getFactoryExtension <em>Factory Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType()
- * @model extendedMetaData="name='factory_._type' kind='elementOnly'"
- * @generated
- */
-public interface FactoryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Application Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Application Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Application Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_ApplicationFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='application-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getApplicationFactory();
-
-    /**
-	 * Returns the value of the '<em><b>Exception Handler Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Exception Handler Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Exception Handler Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_ExceptionHandlerFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='exception-handler-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getExceptionHandlerFactory();
-
-				/**
-	 * Returns the value of the '<em><b>External Context Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>External Context Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>External Context Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_ExternalContextFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='external-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getExternalContextFactory();
-
-				/**
-	 * Returns the value of the '<em><b>Faces Context Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Faces Context Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Faces Context Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_FacesContextFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='faces-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getFacesContextFactory();
-
-    /**
-	 * Returns the value of the '<em><b>Partial View Context Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Partial View Context Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Partial View Context Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_PartialViewContextFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='partial-view-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getPartialViewContextFactory();
-
-				/**
-	 * Returns the value of the '<em><b>Lifecycle Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lifecycle Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lifecycle Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_LifecycleFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='lifecycle-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getLifecycleFactory();
-
-    /**
-	 * Returns the value of the '<em><b>View Declaration Language Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>View Declaration Language Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>View Declaration Language Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_ViewDeclarationLanguageFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='view-declaration-language-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getViewDeclarationLanguageFactory();
-
-				/**
-	 * Returns the value of the '<em><b>Tag Handler Delegate Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Handler Delegate Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Handler Delegate Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_TagHandlerDelegateFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='tag-handler-delegate-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getTagHandlerDelegateFactory();
-
-				/**
-	 * Returns the value of the '<em><b>Render Kit Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Render Kit Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_RenderKitFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='render-kit-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getRenderKitFactory();
-
-    /**
-	 * Returns the value of the '<em><b>Visit Context Factory</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Visit Context Factory</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Visit Context Factory</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_VisitContextFactory()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType" containment="true"
-	 *        extendedMetaData="kind='element' name='visit-context-factory' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getVisitContextFactory();
-
-				/**
-	 * Returns the value of the '<em><b>Factory Extension</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Factory Extension</em>' reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Factory Extension</em>' reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_FactoryExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType"
-	 *        extendedMetaData="kind='element' name='factory-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getFactoryExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromActionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromActionType.java
deleted file mode 100644
index e1db0f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromActionType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>From Action Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromActionType()
- * @model extendedMetaData="name='from-action_._type' kind='simple'"
- * @generated
- */
-public interface FromActionType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromActionType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromActionType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FromActionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromOutcomeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromOutcomeType.java
deleted file mode 100644
index 051d4ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromOutcomeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>From Outcome Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromOutcomeType()
- * @model extendedMetaData="name='from-outcome_._type' kind='simple'"
- * @generated
- */
-public interface FromOutcomeType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromOutcomeType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromOutcomeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FromOutcomeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromViewIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromViewIdType.java
deleted file mode 100644
index 30dadc1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/FromViewIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>From View Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromViewIdType()
- * @model extendedMetaData="name='from-view-id_._type' kind='simple'"
- * @generated
- */
-public interface FromViewIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromViewIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getFromViewIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // FromViewIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IconType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IconType.java
deleted file mode 100644
index aca11c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IconType.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Icon Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType()
- * @model extendedMetaData="name='icon_._type' kind='empty'"
- * @generated
- */
-public interface IconType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Small Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Small Icon</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Small Icon</em>' containment reference.
-	 * @see #setSmallIcon(SmallIconType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_SmallIcon()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='small-icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SmallIconType getSmallIcon();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getSmallIcon <em>Small Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Small Icon</em>' containment reference.
-	 * @see #getSmallIcon()
-	 * @generated
-	 */
-	void setSmallIcon(SmallIconType value);
-
-    /**
-	 * Returns the value of the '<em><b>Large Icon</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Large Icon</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Large Icon</em>' containment reference.
-	 * @see #setLargeIcon(LargeIconType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_LargeIcon()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='large-icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	LargeIconType getLargeIcon();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLargeIcon <em>Large Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Large Icon</em>' containment reference.
-	 * @see #getLargeIcon()
-	 * @generated
-	 */
-	void setLargeIcon(LargeIconType value);
-
-    /**
-	 * Returns the value of the '<em><b>Lang</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Lang</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lang</em>' attribute.
-	 * @see #setLang(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_Lang()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Language"
-	 *        extendedMetaData="kind='attribute' name='lang' namespace='http://www.w3.org/XML/1998/namespace'"
-	 * @generated
-	 */
-	String getLang();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getLang <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Lang</em>' attribute.
-	 * @see #getLang()
-	 * @generated
-	 */
-	void setLang(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIconType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // IconType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IfType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IfType.java
deleted file mode 100644
index a7025d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/IfType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>If Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIfType()
- * @model extendedMetaData="name='if_._type' kind='simple'"
- * @generated
- */
-public interface IfType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIfType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getIfType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // IfType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyClassType.java
deleted file mode 100644
index 353f56d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Key Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyClassType()
- * @model extendedMetaData="name='key-class_._type' kind='simple'"
- * @generated
- */
-public interface KeyClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // KeyClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyType.java
deleted file mode 100644
index c5793b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/KeyType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Key Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyType()
- * @model extendedMetaData="name='key_._type' kind='simple'"
- * @generated
- */
-public interface KeyType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getKeyType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // KeyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LargeIconType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LargeIconType.java
deleted file mode 100644
index 5d3c8ec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LargeIconType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Large Icon Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLargeIconType()
- * @model extendedMetaData="name='large-icon_._type' kind='simple'"
- * @generated
- */
-public interface LargeIconType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLargeIconType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLargeIconType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // LargeIconType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleExtensionType.java
deleted file mode 100644
index 94f9ca9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Lifecycle Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleExtensionType()
- * @model extendedMetaData="name='lifecycle-extension_._type'"
- * @generated
- */
-public interface LifecycleExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // LifecycleExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleFactoryType.java
deleted file mode 100644
index 4f64a99..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Lifecycle Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleFactoryType()
- * @model extendedMetaData="name='lifecycle-factory_._type' kind='simple'"
- * @generated
- */
-public interface LifecycleFactoryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // LifecycleFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleType.java
deleted file mode 100644
index 6273ca4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LifecycleType.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Lifecycle Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getLifecycleExtension <em>Lifecycle Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType()
- * @model extendedMetaData="name='lifecycle_._type' kind='elementOnly'"
- * @generated
- */
-public interface LifecycleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Phase Listener</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Phase Listener</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Phase Listener</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType_PhaseListener()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType" containment="true"
-	 *        extendedMetaData="kind='element' name='phase-listener' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getPhaseListener();
-
-    /**
-	 * Returns the value of the '<em><b>Lifecycle Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Lifecycle Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Lifecycle Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType_LifecycleExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='lifecycle-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getLifecycleExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLifecycleType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // LifecycleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ListEntriesType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ListEntriesType.java
deleted file mode 100644
index 43109f4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ListEntriesType.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>List Entries Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType()
- * @model extendedMetaData="name='list-entries_._type' kind='elementOnly'"
- * @generated
- */
-public interface ListEntriesType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value Class</em>' containment reference.
-	 * @see #setValueClass(ValueClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_ValueClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='value-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueClassType getValueClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getValueClass <em>Value Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value Class</em>' containment reference.
-	 * @see #getValueClass()
-	 * @generated
-	 */
-	void setValueClass(ValueClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Null Value</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Null Value</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Null Value</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_NullValue()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NullValueType" containment="true"
-	 *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getNullValue();
-
-    /**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValueType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_Value()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValueType" containment="true"
-	 *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getValue();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getListEntriesType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ListEntriesType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LocaleConfigType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LocaleConfigType.java
deleted file mode 100644
index a92adf2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/LocaleConfigType.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Locale Config Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType()
- * @model extendedMetaData="name='locale-config_._type' kind='elementOnly'"
- * @generated
- */
-public interface LocaleConfigType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Default Locale</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Locale</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Locale</em>' containment reference.
-	 * @see #setDefaultLocale(DefaultLocaleType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType_DefaultLocale()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='default-locale' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultLocaleType getDefaultLocale();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getDefaultLocale <em>Default Locale</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Locale</em>' containment reference.
-	 * @see #getDefaultLocale()
-	 * @generated
-	 */
-	void setDefaultLocale(DefaultLocaleType value);
-
-    /**
-	 * Returns the value of the '<em><b>Supported Locale</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Supported Locale</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Supported Locale</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType_SupportedLocale()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType" containment="true"
-	 *        extendedMetaData="kind='element' name='supported-locale' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getSupportedLocale();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getLocaleConfigType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // LocaleConfigType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanClassType.java
deleted file mode 100644
index 0860211..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanClassType()
- * @model extendedMetaData="name='managed-bean-class_._type' kind='simple'"
- * @generated
- */
-public interface ManagedBeanClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ManagedBeanClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanExtensionType.java
deleted file mode 100644
index 597491e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanExtensionType()
- * @model extendedMetaData="name='managed-bean-extension_._type'"
- * @generated
- */
-public interface ManagedBeanExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // ManagedBeanExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanNameType.java
deleted file mode 100644
index 8ff695b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanNameType()
- * @model extendedMetaData="name='managed-bean-name_._type' kind='simple'"
- * @generated
- */
-public interface ManagedBeanNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ManagedBeanNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanScopeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanScopeType.java
deleted file mode 100644
index 3c71f87..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanScopeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Scope Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanScopeType()
- * @model extendedMetaData="name='managed-bean-scope_._type' kind='simple'"
- * @generated
- */
-public interface ManagedBeanScopeType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanScopeType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanScopeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ManagedBeanScopeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanType.java
deleted file mode 100644
index f1e392a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedBeanType.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Bean Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanExtension <em>Managed Bean Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#isEager <em>Eager</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType()
- * @model extendedMetaData="name='managed-bean_._type' kind='elementOnly'"
- * @generated
- */
-public interface ManagedBeanType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Bean Name</em>' containment reference.
-	 * @see #setManagedBeanName(ManagedBeanNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanNameType getManagedBeanName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanName <em>Managed Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Name</em>' containment reference.
-	 * @see #getManagedBeanName()
-	 * @generated
-	 */
-	void setManagedBeanName(ManagedBeanNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Bean Class</em>' containment reference.
-	 * @see #setManagedBeanClass(ManagedBeanClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanClassType getManagedBeanClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanClass <em>Managed Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Class</em>' containment reference.
-	 * @see #getManagedBeanClass()
-	 * @generated
-	 */
-	void setManagedBeanClass(ManagedBeanClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Scope</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Bean Scope</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Bean Scope</em>' containment reference.
-	 * @see #setManagedBeanScope(ManagedBeanScopeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanScope()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-scope' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ManagedBeanScopeType getManagedBeanScope();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getManagedBeanScope <em>Managed Bean Scope</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Managed Bean Scope</em>' containment reference.
-	 * @see #getManagedBeanScope()
-	 * @generated
-	 */
-	void setManagedBeanScope(ManagedBeanScopeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Managed Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Property</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedProperty()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType" containment="true"
-	 *        extendedMetaData="kind='element' name='managed-property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getManagedProperty();
-
-    /**
-	 * Returns the value of the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Map Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Map Entries</em>' containment reference.
-	 * @see #setMapEntries(MapEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_MapEntries()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='map-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MapEntriesType getMapEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getMapEntries <em>Map Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Map Entries</em>' containment reference.
-	 * @see #getMapEntries()
-	 * @generated
-	 */
-	void setMapEntries(MapEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>List Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>List Entries</em>' containment reference.
-	 * @see #setListEntries(ListEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ListEntries()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='list-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ListEntriesType getListEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getListEntries <em>List Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>List Entries</em>' containment reference.
-	 * @see #getListEntries()
-	 * @generated
-	 */
-	void setListEntries(ListEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>Managed Bean Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Managed Bean Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Managed Bean Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_ManagedBeanExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='managed-bean-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getManagedBeanExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-				/**
-	 * Returns the value of the '<em><b>Eager</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Eager</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Eager</em>' attribute.
-	 * @see #setEager(boolean)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedBeanType_Eager()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='eager' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isEager();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType#isEager <em>Eager</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Eager</em>' attribute.
-	 * @see #isEager()
-	 * @generated
-	 */
-	void setEager(boolean value);
-
-} // ManagedBeanType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedPropertyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedPropertyType.java
deleted file mode 100644
index 4a06a39..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ManagedPropertyType.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Managed Property Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType()
- * @model extendedMetaData="name='managed-property_._type' kind='elementOnly'"
- * @generated
- */
-public interface ManagedPropertyType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Name</em>' containment reference.
-	 * @see #setPropertyName(PropertyNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_PropertyName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='property-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyNameType getPropertyName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyName <em>Property Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Name</em>' containment reference.
-	 * @see #getPropertyName()
-	 * @generated
-	 */
-	void setPropertyName(PropertyNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Class</em>' containment reference.
-	 * @see #setPropertyClass(PropertyClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_PropertyClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='property-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyClassType getPropertyClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getPropertyClass <em>Property Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Class</em>' containment reference.
-	 * @see #getPropertyClass()
-	 * @generated
-	 */
-	void setPropertyClass(PropertyClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Map Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Map Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Map Entries</em>' containment reference.
-	 * @see #setMapEntries(MapEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_MapEntries()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='map-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	MapEntriesType getMapEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getMapEntries <em>Map Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Map Entries</em>' containment reference.
-	 * @see #getMapEntries()
-	 * @generated
-	 */
-	void setMapEntries(MapEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Null Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Null Value</em>' containment reference.
-	 * @see #setNullValue(NullValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_NullValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NullValueType getNullValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getNullValue <em>Null Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Null Value</em>' containment reference.
-	 * @see #getNullValue()
-	 * @generated
-	 */
-	void setNullValue(NullValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference.
-	 * @see #setValue(ValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Value()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueType getValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getValue <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' containment reference.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(ValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>List Entries</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>List Entries</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>List Entries</em>' containment reference.
-	 * @see #setListEntries(ListEntriesType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_ListEntries()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='list-entries' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ListEntriesType getListEntries();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getListEntries <em>List Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>List Entries</em>' containment reference.
-	 * @see #getListEntries()
-	 * @generated
-	 */
-	void setListEntries(ListEntriesType value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getManagedPropertyType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ManagedPropertyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntriesType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntriesType.java
deleted file mode 100644
index f09502f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntriesType.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Map Entries Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType()
- * @model extendedMetaData="name='map-entries_._type' kind='elementOnly'"
- * @generated
- */
-public interface MapEntriesType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Key Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Key Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Key Class</em>' containment reference.
-	 * @see #setKeyClass(KeyClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_KeyClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='key-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	KeyClassType getKeyClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getKeyClass <em>Key Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key Class</em>' containment reference.
-	 * @see #getKeyClass()
-	 * @generated
-	 */
-	void setKeyClass(KeyClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Value Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value Class</em>' containment reference.
-	 * @see #setValueClass(ValueClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_ValueClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='value-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueClassType getValueClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getValueClass <em>Value Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value Class</em>' containment reference.
-	 * @see #getValueClass()
-	 * @generated
-	 */
-	void setValueClass(ValueClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Map Entry</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Map Entry</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Map Entry</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_MapEntry()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.MapEntryType" containment="true"
-	 *        extendedMetaData="kind='element' name='map-entry' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getMapEntry();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntriesType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // MapEntriesType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntryType.java
deleted file mode 100644
index 11e832e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MapEntryType.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Map Entry Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType()
- * @model extendedMetaData="name='map-entry_._type' kind='empty'"
- * @generated
- */
-public interface MapEntryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Key</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Key</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Key</em>' containment reference.
-	 * @see #setKey(KeyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_Key()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='key' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	KeyType getKey();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getKey <em>Key</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Key</em>' containment reference.
-	 * @see #getKey()
-	 * @generated
-	 */
-	void setKey(KeyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Null Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Null Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Null Value</em>' containment reference.
-	 * @see #setNullValue(NullValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_NullValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='null-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NullValueType getNullValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getNullValue <em>Null Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Null Value</em>' containment reference.
-	 * @see #getNullValue()
-	 * @generated
-	 */
-	void setNullValue(NullValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference.
-	 * @see #setValue(ValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_Value()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueType getValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getValue <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' containment reference.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(ValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMapEntryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // MapEntryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MessageBundleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MessageBundleType.java
deleted file mode 100644
index 0dbf441..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/MessageBundleType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Message Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMessageBundleType()
- * @model extendedMetaData="name='message-bundle_._type' kind='simple'"
- * @generated
- */
-public interface MessageBundleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMessageBundleType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getMessageBundleType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // MessageBundleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NameType.java
deleted file mode 100644
index 2d93c6e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNameType()
- * @model extendedMetaData="name='name_._type' kind='simple'"
- * @generated
- */
-public interface NameType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // NameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java
deleted file mode 100644
index a208e38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationCaseType.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Case Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIf <em>If</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType()
- * @model extendedMetaData="name='navigation-case_._type' kind='elementOnly'"
- * @generated
- */
-public interface NavigationCaseType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>From Action</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>From Action</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>From Action</em>' containment reference.
-	 * @see #setFromAction(FromActionType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_FromAction()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='from-action' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromActionType getFromAction();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromAction <em>From Action</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From Action</em>' containment reference.
-	 * @see #getFromAction()
-	 * @generated
-	 */
-	void setFromAction(FromActionType value);
-
-    /**
-	 * Returns the value of the '<em><b>From Outcome</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>From Outcome</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>From Outcome</em>' containment reference.
-	 * @see #setFromOutcome(FromOutcomeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_FromOutcome()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='from-outcome' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromOutcomeType getFromOutcome();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getFromOutcome <em>From Outcome</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From Outcome</em>' containment reference.
-	 * @see #getFromOutcome()
-	 * @generated
-	 */
-	void setFromOutcome(FromOutcomeType value);
-
-    /**
-	 * Returns the value of the '<em><b>If</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>If</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>If</em>' containment reference.
-	 * @see #setIf(IfType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_If()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='if' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	IfType getIf();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getIf <em>If</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>If</em>' containment reference.
-	 * @see #getIf()
-	 * @generated
-	 */
-	void setIf(IfType value);
-
-				/**
-	 * Returns the value of the '<em><b>To View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>To View Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>To View Id</em>' containment reference.
-	 * @see #setToViewId(ToViewIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_ToViewId()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='to-view-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ToViewIdType getToViewId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getToViewId <em>To View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>To View Id</em>' containment reference.
-	 * @see #getToViewId()
-	 * @generated
-	 */
-	void setToViewId(ToViewIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Redirect</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Redirect</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Redirect</em>' containment reference.
-	 * @see #setRedirect(RedirectType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Redirect()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='redirect' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RedirectType getRedirect();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getRedirect <em>Redirect</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Redirect</em>' containment reference.
-	 * @see #getRedirect()
-	 * @generated
-	 */
-	void setRedirect(RedirectType value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationCaseType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // NavigationCaseType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationHandlerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationHandlerType.java
deleted file mode 100644
index 0744840..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationHandlerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Handler Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationHandlerType()
- * @model extendedMetaData="name='navigation-handler_._type' kind='simple'"
- * @generated
- */
-public interface NavigationHandlerType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationHandlerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationHandlerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // NavigationHandlerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleExtensionType.java
deleted file mode 100644
index 7a0fdec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Rule Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleExtensionType()
- * @model extendedMetaData="name='navigation-rule-extension_._type'"
- * @generated
- */
-public interface NavigationRuleExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // NavigationRuleExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleType.java
deleted file mode 100644
index c36b87d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NavigationRuleType.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Navigation Rule Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getNavigationRuleExtension <em>Navigation Rule Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType()
- * @model extendedMetaData="name='navigation-rule_._type' kind='elementOnly'"
- * @generated
- */
-public interface NavigationRuleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>From View Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>From View Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>From View Id</em>' containment reference.
-	 * @see #setFromViewId(FromViewIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_FromViewId()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='from-view-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	FromViewIdType getFromViewId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getFromViewId <em>From View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>From View Id</em>' containment reference.
-	 * @see #getFromViewId()
-	 * @generated
-	 */
-	void setFromViewId(FromViewIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Navigation Case</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Navigation Case</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Navigation Case</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_NavigationCase()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType" containment="true"
-	 *        extendedMetaData="kind='element' name='navigation-case' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getNavigationCase();
-
-    /**
-	 * Returns the value of the '<em><b>Navigation Rule Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Navigation Rule Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Navigation Rule Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_NavigationRuleExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='navigation-rule-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getNavigationRuleExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNavigationRuleType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // NavigationRuleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NullValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NullValueType.java
deleted file mode 100644
index 390fb1a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/NullValueType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Null Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNullValueType()
- * @model extendedMetaData="name='null-value_._type' kind='empty'"
- * @generated
- */
-public interface NullValueType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getNullValueType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // NullValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOrderingType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOrderingType.java
deleted file mode 100644
index 5eeabde..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOrderingType.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Ordering Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getOthers <em>Others</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingOrderingType()
- * @model extendedMetaData="name='ordering-ordering_._type' kind='elementOnly'"
- * @generated
- */
-public interface OrderingOrderingType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.NameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingOrderingType_Name()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.NameType" containment="true"
-	 *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getName();
-
-	/**
-	 * Returns the value of the '<em><b>Others</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Others</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Others</em>' containment reference.
-	 * @see #setOthers(OrderingOthersType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingOrderingType_Others()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='others' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOthersType getOthers();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType#getOthers <em>Others</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Others</em>' containment reference.
-	 * @see #getOthers()
-	 * @generated
-	 */
-	void setOthers(OrderingOthersType value);
-
-} // OrderingOrderingType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOthersType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOthersType.java
deleted file mode 100644
index 9251006..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingOthersType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Ordering Others Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingOthersType()
- * @model extendedMetaData="name='others_._type' kind='elementOnly'"
- * @generated
- */
-public interface OrderingOthersType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingOthersType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // OrderingOthersType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingType.java
deleted file mode 100644
index b145ddd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/OrderingType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getBefore <em>Before</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getAfter <em>After</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingType()
- * @model extendedMetaData="name='ordering_._type' kind='elementOnly'"
- * @generated
- */
-public interface OrderingType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Before</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Before</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Before</em>' containment reference.
-	 * @see #setBefore(OrderingOrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingType_Before()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='before' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOrderingType getBefore();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getBefore <em>Before</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Before</em>' containment reference.
-	 * @see #getBefore()
-	 * @generated
-	 */
-	void setBefore(OrderingOrderingType value);
-
-	/**
-	 * Returns the value of the '<em><b>After</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>After</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>After</em>' containment reference.
-	 * @see #setAfter(OrderingOrderingType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getOrderingType_After()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='after' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	OrderingOrderingType getAfter();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType#getAfter <em>After</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>After</em>' containment reference.
-	 * @see #getAfter()
-	 * @generated
-	 */
-	void setAfter(OrderingOrderingType value);
-
-} // OrderingType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PartialViewContextFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PartialViewContextFactoryType.java
deleted file mode 100644
index e10d1d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PartialViewContextFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Partial View Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPartialViewContextFactoryType()
- * @model extendedMetaData="name='partial-view-context-factory_._type' kind='simple'"
- * @generated
- */
-public interface PartialViewContextFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPartialViewContextFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPartialViewContextFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PartialViewContextFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PhaseListenerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PhaseListenerType.java
deleted file mode 100644
index b175658..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PhaseListenerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Phase Listener Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPhaseListenerType()
- * @model extendedMetaData="name='phase-listener_._type' kind='simple'"
- * @generated
- */
-public interface PhaseListenerType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPhaseListenerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPhaseListenerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PhaseListenerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyClassType.java
deleted file mode 100644
index 42ddc6b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyClassType()
- * @model extendedMetaData="name='property-class_._type' kind='simple'"
- * @generated
- */
-public interface PropertyClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PropertyClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyExtensionType.java
deleted file mode 100644
index c31c1e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyExtensionType()
- * @model extendedMetaData="name='property-extension_._type'"
- * @generated
- */
-public interface PropertyExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // PropertyExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyNameType.java
deleted file mode 100644
index 45432b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyNameType()
- * @model extendedMetaData="name='property-name_._type' kind='simple'"
- * @generated
- */
-public interface PropertyNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PropertyNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyResolverType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyResolverType.java
deleted file mode 100644
index 6ec2e5e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyResolverType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyResolverType()
- * @model extendedMetaData="name='property-resolver_._type' kind='simple'"
- * @generated
- */
-public interface PropertyResolverType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyResolverType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyResolverType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PropertyResolverType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyType.java
deleted file mode 100644
index fcee95f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/PropertyType.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Property Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType()
- * @model extendedMetaData="name='property_._type' kind='elementOnly'"
- * @generated
- */
-public interface PropertyType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Property Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Name</em>' containment reference.
-	 * @see #setPropertyName(PropertyNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_PropertyName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='property-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyNameType getPropertyName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyName <em>Property Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Name</em>' containment reference.
-	 * @see #getPropertyName()
-	 * @generated
-	 */
-	void setPropertyName(PropertyNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Class</em>' containment reference.
-	 * @see #setPropertyClass(PropertyClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_PropertyClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='property-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	PropertyClassType getPropertyClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getPropertyClass <em>Property Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Property Class</em>' containment reference.
-	 * @see #getPropertyClass()
-	 * @generated
-	 */
-	void setPropertyClass(PropertyClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Default Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Default Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Default Value</em>' containment reference.
-	 * @see #setDefaultValue(DefaultValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_DefaultValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='default-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	DefaultValueType getDefaultValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getDefaultValue <em>Default Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Default Value</em>' containment reference.
-	 * @see #getDefaultValue()
-	 * @generated
-	 */
-	void setDefaultValue(DefaultValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Suggested Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Suggested Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #setSuggestedValue(SuggestedValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_SuggestedValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='suggested-value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SuggestedValueType getSuggestedValue();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getSuggestedValue <em>Suggested Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Suggested Value</em>' containment reference.
-	 * @see #getSuggestedValue()
-	 * @generated
-	 */
-	void setSuggestedValue(SuggestedValueType value);
-
-    /**
-	 * Returns the value of the '<em><b>Property Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_PropertyExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='property-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getPropertyExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getPropertyType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // PropertyType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectType.java
deleted file mode 100644
index dc7d1cc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectType.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Redirect Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getViewParam <em>View Param</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#isIncludeViewParams <em>Include View Params</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectType()
- * @model extendedMetaData="name='redirect_._type' kind='empty'"
- * @generated
- */
-public interface RedirectType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>View Param</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>View Param</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>View Param</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectType_ViewParam()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType" containment="true"
-	 *        extendedMetaData="kind='element' name='view-param' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getViewParam();
-
-				/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-				/**
-	 * Returns the value of the '<em><b>Include View Params</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Include View Params</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Include View Params</em>' attribute.
-	 * @see #setIncludeViewParams(boolean)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectType_IncludeViewParams()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.Boolean"
-	 *        extendedMetaData="kind='attribute' name='include-view-params' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	boolean isIncludeViewParams();
-
-				/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType#isIncludeViewParams <em>Include View Params</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Include View Params</em>' attribute.
-	 * @see #isIncludeViewParams()
-	 * @generated
-	 */
-	void setIncludeViewParams(boolean value);
-
-} // RedirectType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectViewParamType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectViewParamType.java
deleted file mode 100644
index f7b5360..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RedirectViewParamType.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Redirect View Param Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectViewParamType()
- * @model extendedMetaData="name='redirect-viewParam_._type' kind='empty'"
- * @generated
- */
-public interface RedirectViewParamType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' containment reference.
-	 * @see #setName(NameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectViewParamType_Name()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	NameType getName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getName <em>Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' containment reference.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(NameType value);
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' containment reference.
-	 * @see #setValue(ValueType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectViewParamType_Value()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='value' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValueType getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getValue <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' containment reference.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(ValueType value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRedirectViewParamType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RedirectViewParamType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanClassType.java
deleted file mode 100644
index 91d9c42..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Referenced Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanClassType()
- * @model extendedMetaData="name='referenced-bean-class_._type' kind='simple'"
- * @generated
- */
-public interface ReferencedBeanClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ReferencedBeanClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanNameType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanNameType.java
deleted file mode 100644
index bb47210..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanNameType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Referenced Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanNameType()
- * @model extendedMetaData="name='referenced-bean-name_._type' kind='simple'"
- * @generated
- */
-public interface ReferencedBeanNameType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanNameType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanNameType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ReferencedBeanNameType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanType.java
deleted file mode 100644
index 00049aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ReferencedBeanType.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Referenced Bean Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType()
- * @model extendedMetaData="name='referenced-bean_._type' kind='elementOnly'"
- * @generated
- */
-public interface ReferencedBeanType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Referenced Bean Name</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Bean Name</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Referenced Bean Name</em>' containment reference.
-	 * @see #setReferencedBeanName(ReferencedBeanNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_ReferencedBeanName()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ReferencedBeanNameType getReferencedBeanName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanName <em>Referenced Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced Bean Name</em>' containment reference.
-	 * @see #getReferencedBeanName()
-	 * @generated
-	 */
-	void setReferencedBeanName(ReferencedBeanNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Referenced Bean Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Referenced Bean Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Referenced Bean Class</em>' containment reference.
-	 * @see #setReferencedBeanClass(ReferencedBeanClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_ReferencedBeanClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='referenced-bean-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ReferencedBeanClassType getReferencedBeanClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getReferencedBeanClass <em>Referenced Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Referenced Bean Class</em>' containment reference.
-	 * @see #getReferencedBeanClass()
-	 * @generated
-	 */
-	void setReferencedBeanClass(ReferencedBeanClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getReferencedBeanType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ReferencedBeanType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitClassType.java
deleted file mode 100644
index 863cb61..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitClassType()
- * @model extendedMetaData="name='render-kit-class_._type' kind='simple'"
- * @generated
- */
-public interface RenderKitClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RenderKitClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitExtensionType.java
deleted file mode 100644
index 0d4d365..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitExtensionType()
- * @model extendedMetaData="name='render-kit-extension_._type'"
- * @generated
- */
-public interface RenderKitExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // RenderKitExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitFactoryType.java
deleted file mode 100644
index c1e1284..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitFactoryType()
- * @model extendedMetaData="name='render-kit-factory_._type' kind='simple'"
- * @generated
- */
-public interface RenderKitFactoryType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RenderKitFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitIdType.java
deleted file mode 100644
index e4c9b08..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitIdType()
- * @model extendedMetaData="name='render-kit-id_._type' kind='simple'"
- * @generated
- */
-public interface RenderKitIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RenderKitIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitType.java
deleted file mode 100644
index 05e3119..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RenderKitType.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Render Kit Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getClientBehaviorRenderer <em>Client Behavior Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitExtension <em>Render Kit Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType()
- * @model extendedMetaData="name='render-kit_._type' kind='elementOnly'"
- * @generated
- */
-public interface RenderKitType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Render Kit Id</em>' containment reference.
-	 * @see #setRenderKitId(RenderKitIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_RenderKitId()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='render-kit-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitIdType getRenderKitId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitId <em>Render Kit Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit Id</em>' containment reference.
-	 * @see #getRenderKitId()
-	 * @generated
-	 */
-	void setRenderKitId(RenderKitIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Render Kit Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Render Kit Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Render Kit Class</em>' containment reference.
-	 * @see #setRenderKitClass(RenderKitClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_RenderKitClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='render-kit-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RenderKitClassType getRenderKitClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getRenderKitClass <em>Render Kit Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Render Kit Class</em>' containment reference.
-	 * @see #getRenderKitClass()
-	 * @generated
-	 */
-	void setRenderKitClass(RenderKitClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RendererType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Renderer</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Renderer()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RendererType" containment="true"
-	 *        extendedMetaData="kind='element' name='renderer' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getRenderer();
-
-    /**
-	 * Returns the value of the '<em><b>Client Behavior Renderer</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Client Behavior Renderer</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Client Behavior Renderer</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_ClientBehaviorRenderer()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType" containment="true"
-	 *        extendedMetaData="kind='element' name='client-behavior-renderer' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getClientBehaviorRenderer();
-
-				/**
-	 * Returns the value of the '<em><b>Render Kit Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Render Kit Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Render Kit Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_RenderKitExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='render-kit-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getRenderKitExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRenderKitType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RenderKitType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererClassType.java
deleted file mode 100644
index e19bf9f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererClassType()
- * @model extendedMetaData="name='renderer-class_._type' kind='simple'"
- * @generated
- */
-public interface RendererClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RendererClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererExtensionType.java
deleted file mode 100644
index 3513b44..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererExtensionType()
- * @model extendedMetaData="name='renderer-extension_._type'"
- * @generated
- */
-public interface RendererExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // RendererExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererType.java
deleted file mode 100644
index a299c67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererType.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType()
- * @model extendedMetaData="name='renderer_._type' kind='elementOnly'"
- * @generated
- */
-public interface RendererType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Component Family</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Component Family</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Component Family</em>' containment reference.
-	 * @see #setComponentFamily(ComponentFamilyType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_ComponentFamily()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='component-family' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ComponentFamilyType getComponentFamily();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getComponentFamily <em>Component Family</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Component Family</em>' containment reference.
-	 * @see #getComponentFamily()
-	 * @generated
-	 */
-	void setComponentFamily(ComponentFamilyType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Type</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer Type</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Renderer Type</em>' containment reference.
-	 * @see #setRendererType(RendererTypeType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_RendererType()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='renderer-type' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererTypeType getRendererType();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererType <em>Renderer Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer Type</em>' containment reference.
-	 * @see #getRendererType()
-	 * @generated
-	 */
-	void setRendererType(RendererTypeType value);
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Renderer Class</em>' containment reference.
-	 * @see #setRendererClass(RendererClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_RendererClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='renderer-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	RendererClassType getRendererClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getRendererClass <em>Renderer Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Renderer Class</em>' containment reference.
-	 * @see #getRendererClass()
-	 * @generated
-	 */
-	void setRendererClass(RendererClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Facet</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.FacetType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Facet</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Facet</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Facet()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.FacetType" containment="true"
-	 *        extendedMetaData="kind='element' name='facet' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getFacet();
-
-    /**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Attribute()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttribute();
-
-    /**
-	 * Returns the value of the '<em><b>Renderer Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Renderer Extension</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Renderer Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_RendererExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='renderer-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getRendererExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RendererType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererTypeType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererTypeType.java
deleted file mode 100644
index bc5aafe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/RendererTypeType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Renderer Type Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererTypeType()
- * @model extendedMetaData="name='renderer-type_._type' kind='simple'"
- * @generated
- */
-public interface RendererTypeType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererTypeType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getRendererTypeType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // RendererTypeType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceBundleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceBundleType.java
deleted file mode 100644
index ee2cd8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceBundleType.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resource Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName <em>Base Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar <em>Var</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType()
- * @model extendedMetaData="name='resourceBundle_._type' kind='elementOnly'"
- * @generated
- */
-public interface ResourceBundleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Base Name</b></em>' reference.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Base Name</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Base Name</em>' reference.
-	 * @see #setBaseName(BaseNameType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_BaseName()
-	 * @model extendedMetaData="kind='element' name='base-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    BaseNameType getBaseName();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getBaseName <em>Base Name</em>}' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Base Name</em>' reference.
-	 * @see #getBaseName()
-	 * @generated
-	 */
-    void setBaseName(BaseNameType value);
-
-    /**
-	 * Returns the value of the '<em><b>Var</b></em>' reference.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Var</em>' reference isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Var</em>' reference.
-	 * @see #setVar(VarType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Var()
-	 * @model extendedMetaData="kind='element' name='var' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    VarType getVar();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getVar <em>Var</em>}' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Var</em>' reference.
-	 * @see #getVar()
-	 * @generated
-	 */
-    void setVar(VarType value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceBundleType_Id()
-	 * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-} // ResourceBundleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceHandlerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceHandlerType.java
deleted file mode 100644
index a78949b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ResourceHandlerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resource Handler Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceHandlerType()
- * @model extendedMetaData="name='resource-handler_._type' kind='simple'"
- * @generated
- */
-public interface ResourceHandlerType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceHandlerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getResourceHandlerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ResourceHandlerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SmallIconType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SmallIconType.java
deleted file mode 100644
index 910de54..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SmallIconType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Small Icon Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSmallIconType()
- * @model extendedMetaData="name='small-icon_._type' kind='simple'"
- * @generated
- */
-public interface SmallIconType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSmallIconType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSmallIconType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SmallIconType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SourceClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SourceClassType.java
deleted file mode 100644
index f5522ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SourceClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Source Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSourceClassType()
- * @model extendedMetaData="name='source-class_._type' kind='simple'"
- * @generated
- */
-public interface SourceClassType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSourceClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSourceClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SourceClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/StateManagerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/StateManagerType.java
deleted file mode 100644
index 46ec765..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/StateManagerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>State Manager Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getStateManagerType()
- * @model extendedMetaData="name='state-manager_._type' kind='simple'"
- * @generated
- */
-public interface StateManagerType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getStateManagerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getStateManagerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // StateManagerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SuggestedValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SuggestedValueType.java
deleted file mode 100644
index 3b98fa3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SuggestedValueType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Suggested Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSuggestedValueType()
- * @model extendedMetaData="name='suggested-value_._type' kind='simple'"
- * @generated
- */
-public interface SuggestedValueType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSuggestedValueType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSuggestedValueType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SuggestedValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SupportedLocaleType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SupportedLocaleType.java
deleted file mode 100644
index 2f5c394..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SupportedLocaleType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Supported Locale Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSupportedLocaleType()
- * @model extendedMetaData="name='supported-locale_._type' kind='simple'"
- * @generated
- */
-public interface SupportedLocaleType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSupportedLocaleType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSupportedLocaleType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SupportedLocaleType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventClassType.java
deleted file mode 100644
index a98e192..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>System Event Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventClassType()
- * @model extendedMetaData="name='system-event-class_._type' kind='simple'"
- * @generated
- */
-public interface SystemEventClassType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SystemEventClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerClassType.java
deleted file mode 100644
index fe5ebb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>System Event Listener Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerClassType()
- * @model extendedMetaData="name='system-event-listener-class_._type' kind='simple'"
- * @generated
- */
-public interface SystemEventListenerClassType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SystemEventListenerClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerType.java
deleted file mode 100644
index 3abb1d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/SystemEventListenerType.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>System Event Listener Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventListenerClass <em>System Event Listener Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventClass <em>System Event Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSourceClass <em>Source Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerType()
- * @model extendedMetaData="name='system-event-listener_._type' kind='elementOnly'"
- * @generated
- */
-public interface SystemEventListenerType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>System Event Listener Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>System Event Listener Class</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>System Event Listener Class</em>' containment reference.
-	 * @see #setSystemEventListenerClass(SystemEventListenerClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerType_SystemEventListenerClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='system-event-listener-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SystemEventListenerClassType getSystemEventListenerClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventListenerClass <em>System Event Listener Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>System Event Listener Class</em>' containment reference.
-	 * @see #getSystemEventListenerClass()
-	 * @generated
-	 */
-	void setSystemEventListenerClass(SystemEventListenerClassType value);
-
-	/**
-	 * Returns the value of the '<em><b>System Event Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>System Event Class</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>System Event Class</em>' containment reference.
-	 * @see #setSystemEventClass(SystemEventClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerType_SystemEventClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='system-event-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SystemEventClassType getSystemEventClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSystemEventClass <em>System Event Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>System Event Class</em>' containment reference.
-	 * @see #getSystemEventClass()
-	 * @generated
-	 */
-	void setSystemEventClass(SystemEventClassType value);
-
-	/**
-	 * Returns the value of the '<em><b>Source Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Source Class</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Source Class</em>' containment reference.
-	 * @see #setSourceClass(SourceClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerType_SourceClass()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='source-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	SourceClassType getSourceClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getSourceClass <em>Source Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Source Class</em>' containment reference.
-	 * @see #getSourceClass()
-	 * @generated
-	 */
-	void setSourceClass(SourceClassType value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getSystemEventListenerType_Id()
-	 * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // SystemEventListenerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/TagHandlerDelegateFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/TagHandlerDelegateFactoryType.java
deleted file mode 100644
index 7049c7d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/TagHandlerDelegateFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Handler Delegate Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getTagHandlerDelegateFactoryType()
- * @model extendedMetaData="name='tag-handler-delegate-factory_._type' kind='simple'"
- * @generated
- */
-public interface TagHandlerDelegateFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getTagHandlerDelegateFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getTagHandlerDelegateFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // TagHandlerDelegateFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ToViewIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ToViewIdType.java
deleted file mode 100644
index 1050610..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ToViewIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>To View Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getToViewIdType()
- * @model extendedMetaData="name='to-view-id_._type' kind='simple'"
- * @generated
- */
-public interface ToViewIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getToViewIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getToViewIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ToViewIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorClassType.java
deleted file mode 100644
index bbbecb8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorClassType()
- * @model extendedMetaData="name='validator-class_._type' kind='simple'"
- * @generated
- */
-public interface ValidatorClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ValidatorClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorExtensionType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorExtensionType.java
deleted file mode 100644
index 181de8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorExtensionType.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Extension Type</b></em>'.
- * <!-- end-user-doc -->
- *
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorExtensionType()
- * @model extendedMetaData="name='validator-extension_._type'"
- * @generated
- */
-public interface ValidatorExtensionType extends ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-} // ValidatorExtensionType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorIdType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorIdType.java
deleted file mode 100644
index fadc127..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorIdType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Id Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorIdType()
- * @model extendedMetaData="name='validator-id_._type' kind='simple'"
- * @generated
- */
-public interface ValidatorIdType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorIdType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorIdType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ValidatorIdType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorType.java
deleted file mode 100644
index 38e6e5b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValidatorType.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Validator Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorExtension <em>Validator Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType()
- * @model extendedMetaData="name='validator_._type' kind='elementOnly'"
- * @generated
- */
-public interface ValidatorType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Description</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Description</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Description</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Description()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DescriptionType" containment="true"
-	 *        extendedMetaData="kind='element' name='description' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDescription();
-
-    /**
-	 * Returns the value of the '<em><b>Display Name</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Display Name</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Display Name</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_DisplayName()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType" containment="true"
-	 *        extendedMetaData="kind='element' name='display-name' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getDisplayName();
-
-    /**
-	 * Returns the value of the '<em><b>Icon</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.IconType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Icon</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Icon</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Icon()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.IconType" containment="true"
-	 *        extendedMetaData="kind='element' name='icon' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getIcon();
-
-    /**
-	 * Returns the value of the '<em><b>Validator Id</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator Id</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Validator Id</em>' containment reference.
-	 * @see #setValidatorId(ValidatorIdType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_ValidatorId()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='validator-id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValidatorIdType getValidatorId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorId <em>Validator Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Validator Id</em>' containment reference.
-	 * @see #getValidatorId()
-	 * @generated
-	 */
-	void setValidatorId(ValidatorIdType value);
-
-    /**
-	 * Returns the value of the '<em><b>Validator Class</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Validator Class</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Validator Class</em>' containment reference.
-	 * @see #setValidatorClass(ValidatorClassType)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_ValidatorClass()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='validator-class' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	ValidatorClassType getValidatorClass();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getValidatorClass <em>Validator Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Validator Class</em>' containment reference.
-	 * @see #getValidatorClass()
-	 * @generated
-	 */
-	void setValidatorClass(ValidatorClassType value);
-
-    /**
-	 * Returns the value of the '<em><b>Attribute</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Attribute()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.AttributeType" containment="true"
-	 *        extendedMetaData="kind='element' name='attribute' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getAttribute();
-
-    /**
-	 * Returns the value of the '<em><b>Property</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Property</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Property</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Property()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.PropertyType" containment="true"
-	 *        extendedMetaData="kind='element' name='property' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	EList getProperty();
-
-    /**
-	 * Returns the value of the '<em><b>Validator Extension</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType}.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Validator Extension</em>' containment reference list isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Validator Extension</em>' containment reference list.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_ValidatorExtension()
-	 * @model type="org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType" containment="true"
-	 *        extendedMetaData="kind='element' name='validator-extension' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    EList getValidatorExtension();
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValidatorType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ValidatorType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueClassType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueClassType.java
deleted file mode 100644
index d13be62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueClassType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Value Class Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueClassType()
- * @model extendedMetaData="name='value-class_._type' kind='simple'"
- * @generated
- */
-public interface ValueClassType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueClassType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueClassType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ValueClassType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueType.java
deleted file mode 100644
index 5b95e85..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ValueType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Value Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueType()
- * @model extendedMetaData="name='value_._type' kind='simple'"
- * @generated
- */
-public interface ValueType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getValueType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ValueType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VarType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VarType.java
deleted file mode 100644
index e23d09e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VarType.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Var Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVarType()
- * @model extendedMetaData="name='var_._type' kind='simple'"
- * @generated
- */
-public interface VarType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVarType_TextContent()
-	 * @model extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-    String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-    void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-     * <p>
-     * If the meaning of the '<em>Id</em>' attribute isn't clear,
-     * there really should be more of a description here...
-     * </p>
-     * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVarType_Id()
-	 * @model id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-    String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-    void setId(String value);
-
-} // VarType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VariableResolverType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VariableResolverType.java
deleted file mode 100644
index dda6b9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VariableResolverType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Variable Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVariableResolverType()
- * @model extendedMetaData="name='variable-resolver_._type' kind='simple'"
- * @generated
- */
-public interface VariableResolverType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVariableResolverType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVariableResolverType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // VariableResolverType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewDeclarationLanguageFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewDeclarationLanguageFactoryType.java
deleted file mode 100644
index 191e462..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewDeclarationLanguageFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>View Declaration Language Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewDeclarationLanguageFactoryType()
- * @model extendedMetaData="name='view-declaration-language-factory_._type' kind='simple'"
- * @generated
- */
-public interface ViewDeclarationLanguageFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewDeclarationLanguageFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewDeclarationLanguageFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ViewDeclarationLanguageFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewHandlerType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewHandlerType.java
deleted file mode 100644
index 83819f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/ViewHandlerType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>View Handler Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewHandlerType()
- * @model extendedMetaData="name='view-handler_._type' kind='simple'"
- * @generated
- */
-public interface ViewHandlerType extends EObject {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewHandlerType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-    /**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getViewHandlerType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-    /**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // ViewHandlerType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VisitContextFactoryType.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VisitContextFactoryType.java
deleted file mode 100644
index 97b50d5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/VisitContextFactoryType.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Visit Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVisitContextFactoryType()
- * @model extendedMetaData="name='visit-context-factory_._type' kind='simple'"
- * @generated
- */
-public interface VisitContextFactoryType extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Text Content</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Text Content</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Text Content</em>' attribute.
-	 * @see #setTextContent(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVisitContextFactoryType_TextContent()
-	 * @model unique="false" dataType="org.eclipse.emf.ecore.xml.type.String"
-	 *        extendedMetaData="name=':0' kind='simple'"
-	 * @generated
-	 */
-	String getTextContent();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getTextContent <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Text Content</em>' attribute.
-	 * @see #getTextContent()
-	 * @generated
-	 */
-	void setTextContent(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#getVisitContextFactoryType_Id()
-	 * @model unique="false" id="true" dataType="org.eclipse.emf.ecore.xml.type.ID"
-	 *        extendedMetaData="kind='attribute' name='id' namespace='##targetNamespace'"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-} // VisitContextFactoryType
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AbsoluteOrderingTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AbsoluteOrderingTypeImpl.java
deleted file mode 100644
index c3347fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AbsoluteOrderingTypeImpl.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Absolute Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AbsoluteOrderingTypeImpl#getOthers <em>Others</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AbsoluteOrderingTypeImpl extends EObjectImpl implements AbsoluteOrderingType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList name;
-
-	/**
-	 * The cached value of the '{@link #getOthers() <em>Others</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOthers()
-	 * @generated
-	 * @ordered
-	 */
-	protected OrderingOthersType others;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AbsoluteOrderingTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ABSOLUTE_ORDERING_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getName() {
-		if (name == null) {
-			name = new EObjectContainmentEList(NameType.class, this, FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME);
-		}
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOthersType getOthers() {
-		return others;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param newOthers 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * @generated NOT
-	 */
-	public NotificationChain basicSetOthers(OrderingOthersType newOthers, NotificationChain msgs) {
-		OrderingOthersType oldOthers = others;
-		others = newOthers;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS, oldOthers, newOthers);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOthers(OrderingOthersType newOthers) {
-		if (newOthers != others) {
-			NotificationChain msgs = null;
-			if (others != null)
-				msgs = ((InternalEObject)others).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS, null, msgs);
-			if (newOthers != null)
-				msgs = ((InternalEObject)newOthers).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS, null, msgs);
-			msgs = basicSetOthers(newOthers, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS, newOthers, newOthers));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-				return ((InternalEList)getName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				return basicSetOthers(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-				return getName();
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				return getOthers();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-				getName().clear();
-				getName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				setOthers((OrderingOthersType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-				getName().clear();
-				return;
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				setOthers((OrderingOthersType)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__NAME:
-				return name != null && !name.isEmpty();
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE__OTHERS:
-				return others != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (names: "); //$NON-NLS-1$
-		for (final Object oname : getName()) {
-			NameType nameType = (NameType)oname;
-			result.append(nameType.getTextContent());
-			result.append(',');
-		}
-		result.append(')');
-//		result.append(" (id: "); //$NON-NLS-1$
-//		result.append(id);
-//		result.append(')');
-		return result.toString();
-	}
-
-} //AbsoluteOrderingTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ActionListenerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ActionListenerTypeImpl.java
deleted file mode 100644
index ad8360e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ActionListenerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Action Listener Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ActionListenerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ActionListenerTypeImpl extends EObjectImpl implements ActionListenerType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ActionListenerTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ACTION_LISTENER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ACTION_LISTENER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.ACTION_LISTENER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ActionListenerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationExtensionTypeImpl.java
deleted file mode 100644
index 2b74cf4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Application Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ApplicationExtensionTypeImpl extends ExtensionTypeImpl implements ApplicationExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ApplicationExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.APPLICATION_EXTENSION_TYPE;
-	}
-
-} //ApplicationExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationFactoryTypeImpl.java
deleted file mode 100644
index 4280a62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Application Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ApplicationFactoryTypeImpl extends EObjectImpl implements ApplicationFactoryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ApplicationFactoryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.APPLICATION_FACTORY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ApplicationFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationTypeImpl.java
deleted file mode 100644
index de8affd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ApplicationTypeImpl.java
+++ /dev/null
@@ -1,735 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType;
-import org.eclipse.jst.jsf.facesconfig.emf.ELResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType;
-import org.eclipse.jst.jsf.facesconfig.emf.StateManagerType;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Application Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getViewHandler <em>View Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getELResolver <em>EL Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getResourceHandler <em>Resource Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getSystemEventListener <em>System Event Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getResourceBundle <em>Resource Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getApplicationExtension <em>Application Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getDefaultValidators <em>Default Validators</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ApplicationTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ApplicationTypeImpl extends EObjectImpl implements ApplicationType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getActionListener() <em>Action Listener</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getActionListener()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList actionListener;
-
-    /**
-	 * The cached value of the '{@link #getDefaultRenderKitId() <em>Default Render Kit Id</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultRenderKitId()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList defaultRenderKitId;
-
-    /**
-	 * The cached value of the '{@link #getMessageBundle() <em>Message Bundle</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMessageBundle()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList messageBundle;
-
-    /**
-	 * The cached value of the '{@link #getNavigationHandler() <em>Navigation Handler</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNavigationHandler()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList navigationHandler;
-
-    /**
-	 * The cached value of the '{@link #getViewHandler() <em>View Handler</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getViewHandler()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList viewHandler;
-
-    /**
-	 * The cached value of the '{@link #getStateManager() <em>State Manager</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getStateManager()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList stateManager;
-
-    /**
-	 * The cached value of the '{@link #getELResolver() <em>EL Resolver</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getELResolver()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList eLResolver;
-
-				/**
-	 * The cached value of the '{@link #getPropertyResolver() <em>Property Resolver</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyResolver()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList propertyResolver;
-
-				/**
-	 * The cached value of the '{@link #getVariableResolver() <em>Variable Resolver</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVariableResolver()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList variableResolver;
-
-				/**
-	 * The cached value of the '{@link #getResourceHandler() <em>Resource Handler</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResourceHandler()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList resourceHandler;
-
-				/**
-	 * The cached value of the '{@link #getSystemEventListener() <em>System Event Listener</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSystemEventListener()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList systemEventListener;
-
-				/**
-	 * The cached value of the '{@link #getLocaleConfig() <em>Locale Config</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLocaleConfig()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList localeConfig;
-
-    /**
-	 * The cached value of the '{@link #getResourceBundle() <em>Resource Bundle</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getResourceBundle()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList resourceBundle;
-
-    /**
-	 * The cached value of the '{@link #getApplicationExtension() <em>Application Extension</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getApplicationExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList applicationExtension;
-
-    /**
-	 * The cached value of the '{@link #getDefaultValidators() <em>Default Validators</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultValidators()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList defaultValidators;
-
-				/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-				/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ApplicationTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.APPLICATION_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getActionListener() {
-		if (actionListener == null) {
-			actionListener = new EObjectContainmentEList(ActionListenerType.class, this, FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER);
-		}
-		return actionListener;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDefaultRenderKitId() {
-		if (defaultRenderKitId == null) {
-			defaultRenderKitId = new EObjectContainmentEList(DefaultRenderKitIdType.class, this, FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID);
-		}
-		return defaultRenderKitId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMessageBundle() {
-		if (messageBundle == null) {
-			messageBundle = new EObjectContainmentEList(MessageBundleType.class, this, FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE);
-		}
-		return messageBundle;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getNavigationHandler() {
-		if (navigationHandler == null) {
-			navigationHandler = new EObjectContainmentEList(NavigationHandlerType.class, this, FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER);
-		}
-		return navigationHandler;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getViewHandler() {
-		if (viewHandler == null) {
-			viewHandler = new EObjectContainmentEList(ViewHandlerType.class, this, FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER);
-		}
-		return viewHandler;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getStateManager() {
-		if (stateManager == null) {
-			stateManager = new EObjectContainmentEList(StateManagerType.class, this, FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER);
-		}
-		return stateManager;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPropertyResolver() {
-		if (propertyResolver == null) {
-			propertyResolver = new EObjectContainmentEList(PropertyResolverType.class, this, FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER);
-		}
-		return propertyResolver;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getVariableResolver() {
-		if (variableResolver == null) {
-			variableResolver = new EObjectContainmentEList(VariableResolverType.class, this, FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER);
-		}
-		return variableResolver;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getResourceHandler() {
-		if (resourceHandler == null) {
-			resourceHandler = new EObjectContainmentEList(ResourceHandlerType.class, this, FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER);
-		}
-		return resourceHandler;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSystemEventListener() {
-		if (systemEventListener == null) {
-			systemEventListener = new EObjectResolvingEList(SystemEventListenerType.class, this, FacesConfigPackage.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER);
-		}
-		return systemEventListener;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getLocaleConfig() {
-		if (localeConfig == null) {
-			localeConfig = new EObjectContainmentEList(LocaleConfigType.class, this, FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG);
-		}
-		return localeConfig;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.APPLICATION_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getELResolver() {
-		if (eLResolver == null) {
-			eLResolver = new EObjectResolvingEList(ELResolverType.class, this, FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER);
-		}
-		return eLResolver;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getResourceBundle() {
-		if (resourceBundle == null) {
-			resourceBundle = new EObjectResolvingEList(ResourceBundleType.class, this, FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE);
-		}
-		return resourceBundle;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getApplicationExtension() {
-		if (applicationExtension == null) {
-			applicationExtension = new EObjectResolvingEList(ApplicationExtensionType.class, this, FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION);
-		}
-		return applicationExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDefaultValidators() {
-		if (defaultValidators == null) {
-			defaultValidators = new EObjectResolvingEList(DefaultValidatorsType.class, this, FacesConfigPackage.APPLICATION_TYPE__DEFAULT_VALIDATORS);
-		}
-		return defaultValidators;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-				return ((InternalEList)getActionListener()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-				return ((InternalEList)getDefaultRenderKitId()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-				return ((InternalEList)getMessageBundle()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-				return ((InternalEList)getNavigationHandler()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-				return ((InternalEList)getViewHandler()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-				return ((InternalEList)getStateManager()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-				return ((InternalEList)getPropertyResolver()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-				return ((InternalEList)getVariableResolver()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-				return ((InternalEList)getResourceHandler()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				return ((InternalEList)getLocaleConfig()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-				return getActionListener();
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-				return getDefaultRenderKitId();
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-				return getMessageBundle();
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-				return getNavigationHandler();
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-				return getViewHandler();
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-				return getStateManager();
-			case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-				return getELResolver();
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-				return getPropertyResolver();
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-				return getVariableResolver();
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-				return getResourceHandler();
-			case FacesConfigPackage.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER:
-				return getSystemEventListener();
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				return getLocaleConfig();
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-				return getResourceBundle();
-			case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-				return getApplicationExtension();
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_VALIDATORS:
-				return getDefaultValidators();
-			case FacesConfigPackage.APPLICATION_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-				getActionListener().clear();
-				getActionListener().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-				getDefaultRenderKitId().clear();
-				getDefaultRenderKitId().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-				getMessageBundle().clear();
-				getMessageBundle().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-				getNavigationHandler().clear();
-				getNavigationHandler().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-				getViewHandler().clear();
-				getViewHandler().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-				getStateManager().clear();
-				getStateManager().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-				getELResolver().clear();
-				getELResolver().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-				getPropertyResolver().clear();
-				getPropertyResolver().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-				getVariableResolver().clear();
-				getVariableResolver().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-				getResourceHandler().clear();
-				getResourceHandler().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER:
-				getSystemEventListener().clear();
-				getSystemEventListener().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				getLocaleConfig().clear();
-				getLocaleConfig().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-				getResourceBundle().clear();
-				getResourceBundle().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-				getApplicationExtension().clear();
-				getApplicationExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_VALIDATORS:
-				getDefaultValidators().clear();
-				getDefaultValidators().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-				getActionListener().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-				getDefaultRenderKitId().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-				getMessageBundle().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-				getNavigationHandler().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-				getViewHandler().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-				getStateManager().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-				getELResolver().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-				getPropertyResolver().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-				getVariableResolver().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-				getResourceHandler().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER:
-				getSystemEventListener().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				getLocaleConfig().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-				getResourceBundle().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-				getApplicationExtension().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_VALIDATORS:
-				getDefaultValidators().clear();
-				return;
-			case FacesConfigPackage.APPLICATION_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.APPLICATION_TYPE__ACTION_LISTENER:
-				return actionListener != null && !actionListener.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID:
-				return defaultRenderKitId != null && !defaultRenderKitId.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__MESSAGE_BUNDLE:
-				return messageBundle != null && !messageBundle.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__NAVIGATION_HANDLER:
-				return navigationHandler != null && !navigationHandler.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__VIEW_HANDLER:
-				return viewHandler != null && !viewHandler.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__STATE_MANAGER:
-				return stateManager != null && !stateManager.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__EL_RESOLVER:
-				return eLResolver != null && !eLResolver.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__PROPERTY_RESOLVER:
-				return propertyResolver != null && !propertyResolver.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__VARIABLE_RESOLVER:
-				return variableResolver != null && !variableResolver.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_HANDLER:
-				return resourceHandler != null && !resourceHandler.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__SYSTEM_EVENT_LISTENER:
-				return systemEventListener != null && !systemEventListener.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__LOCALE_CONFIG:
-				return localeConfig != null && !localeConfig.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__RESOURCE_BUNDLE:
-				return resourceBundle != null && !resourceBundle.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__APPLICATION_EXTENSION:
-				return applicationExtension != null && !applicationExtension.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__DEFAULT_VALIDATORS:
-				return defaultValidators != null && !defaultValidators.isEmpty();
-			case FacesConfigPackage.APPLICATION_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ApplicationTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeClassTypeImpl.java
deleted file mode 100644
index 5f390f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeClassTypeImpl extends EObjectImpl implements AttributeClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ATTRIBUTE_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //AttributeClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeExtensionTypeImpl.java
deleted file mode 100644
index af1ea26..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeExtensionTypeImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class AttributeExtensionTypeImpl extends ExtensionTypeImpl implements AttributeExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ATTRIBUTE_EXTENSION_TYPE;
-	}
-
-} //AttributeExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeNameTypeImpl.java
deleted file mode 100644
index 87f3a86..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeNameTypeImpl extends EObjectImpl implements AttributeNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ATTRIBUTE_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //AttributeNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeTypeImpl.java
deleted file mode 100644
index d7e8709..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/AttributeTypeImpl.java
+++ /dev/null
@@ -1,617 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Attribute Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.AttributeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class AttributeTypeImpl extends EObjectImpl implements AttributeType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getAttributeName() <em>Attribute Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeName()
-	 * @generated
-	 * @ordered
-	 */
-	protected AttributeNameType attributeName;
-
-    /**
-	 * The cached value of the '{@link #getAttributeClass() <em>Attribute Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected AttributeClassType attributeClass;
-
-    /**
-	 * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected DefaultValueType defaultValue;
-
-    /**
-	 * The cached value of the '{@link #getSuggestedValue() <em>Suggested Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSuggestedValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected SuggestedValueType suggestedValue;
-
-    /**
-	 * The cached value of the '{@link #getAttributeExtension() <em>Attribute Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attributeExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected AttributeTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ATTRIBUTE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeNameType getAttributeName() {
-		return attributeName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttributeName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttributeName(AttributeNameType newAttributeName, NotificationChain msgs) {
-		AttributeNameType oldAttributeName = attributeName;
-		attributeName = newAttributeName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME, oldAttributeName, newAttributeName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeName(AttributeNameType newAttributeName) {
-		if (newAttributeName != attributeName) {
-			NotificationChain msgs = null;
-			if (attributeName != null)
-				msgs = ((InternalEObject)attributeName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME, null, msgs);
-			if (newAttributeName != null)
-				msgs = ((InternalEObject)newAttributeName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME, null, msgs);
-			msgs = basicSetAttributeName(newAttributeName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME, newAttributeName, newAttributeName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeClassType getAttributeClass() {
-		return attributeClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttributeClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttributeClass(AttributeClassType newAttributeClass, NotificationChain msgs) {
-		AttributeClassType oldAttributeClass = attributeClass;
-		attributeClass = newAttributeClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS, oldAttributeClass, newAttributeClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeClass(AttributeClassType newAttributeClass) {
-		if (newAttributeClass != attributeClass) {
-			NotificationChain msgs = null;
-			if (attributeClass != null)
-				msgs = ((InternalEObject)attributeClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS, null, msgs);
-			if (newAttributeClass != null)
-				msgs = ((InternalEObject)newAttributeClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS, null, msgs);
-			msgs = basicSetAttributeClass(newAttributeClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS, newAttributeClass, newAttributeClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValueType getDefaultValue() {
-		return defaultValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultValue(DefaultValueType newDefaultValue, NotificationChain msgs) {
-		DefaultValueType oldDefaultValue = defaultValue;
-		defaultValue = newDefaultValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE, oldDefaultValue, newDefaultValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultValue(DefaultValueType newDefaultValue) {
-		if (newDefaultValue != defaultValue) {
-			NotificationChain msgs = null;
-			if (defaultValue != null)
-				msgs = ((InternalEObject)defaultValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE, null, msgs);
-			if (newDefaultValue != null)
-				msgs = ((InternalEObject)newDefaultValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE, null, msgs);
-			msgs = basicSetDefaultValue(newDefaultValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE, newDefaultValue, newDefaultValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SuggestedValueType getSuggestedValue() {
-		return suggestedValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSuggestedValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSuggestedValue(SuggestedValueType newSuggestedValue, NotificationChain msgs) {
-		SuggestedValueType oldSuggestedValue = suggestedValue;
-		suggestedValue = newSuggestedValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, oldSuggestedValue, newSuggestedValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuggestedValue(SuggestedValueType newSuggestedValue) {
-		if (newSuggestedValue != suggestedValue) {
-			NotificationChain msgs = null;
-			if (suggestedValue != null)
-				msgs = ((InternalEObject)suggestedValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, null, msgs);
-			if (newSuggestedValue != null)
-				msgs = ((InternalEObject)newSuggestedValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, null, msgs);
-			msgs = basicSetSuggestedValue(newSuggestedValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE, newSuggestedValue, newSuggestedValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttributeExtension() {
-		if (attributeExtension == null) {
-			attributeExtension = new EObjectContainmentEList(AttributeExtensionType.class, this, FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION);
-		}
-		return attributeExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ATTRIBUTE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-				return basicSetAttributeName(null, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-				return basicSetAttributeClass(null, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-				return basicSetDefaultValue(null, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-				return basicSetSuggestedValue(null, msgs);
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				return ((InternalEList)getAttributeExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-				return getAttributeName();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-				return getAttributeClass();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-				return getDefaultValue();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-				return getSuggestedValue();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				return getAttributeExtension();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-				setAttributeName((AttributeNameType)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-				setAttributeClass((AttributeClassType)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				getAttributeExtension().clear();
-				getAttributeExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-				setAttributeName((AttributeNameType)null);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-				setAttributeClass((AttributeClassType)null);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)null);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)null);
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				getAttributeExtension().clear();
-				return;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_NAME:
-				return attributeName != null;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_CLASS:
-				return attributeClass != null;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__DEFAULT_VALUE:
-				return defaultValue != null;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__SUGGESTED_VALUE:
-				return suggestedValue != null;
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION:
-				return attributeExtension != null && !attributeExtension.isEmpty();
-			case FacesConfigPackage.ATTRIBUTE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //AttributeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BaseNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BaseNameTypeImpl.java
deleted file mode 100644
index 91ce976..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BaseNameTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Base Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BaseNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BaseNameTypeImpl extends EObjectImpl implements BaseNameType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected BaseNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.BASE_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BASE_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.BASE_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.BASE_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.BASE_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BASE_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.BASE_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BaseNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorClassTypeImpl.java
deleted file mode 100644
index 2909d63..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorClassTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Behavior Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BehaviorClassTypeImpl extends EObjectImpl implements BehaviorClassType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorClassTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.BEHAVIOR_CLASS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BehaviorClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorExtensionTypeImpl.java
deleted file mode 100644
index 902b255..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Behavior Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class BehaviorExtensionTypeImpl extends ExtensionTypeImpl implements BehaviorExtensionType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorExtensionTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.BEHAVIOR_EXTENSION_TYPE;
-	}
-
-} //BehaviorExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorIdTypeImpl.java
deleted file mode 100644
index 7eae39c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorIdTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Behavior Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BehaviorIdTypeImpl extends EObjectImpl implements BehaviorIdType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorIdTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.BEHAVIOR_ID_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_ID_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BehaviorIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorTypeImpl.java
deleted file mode 100644
index f37d470..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/BehaviorTypeImpl.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Behavior Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getBehaviorId <em>Behavior Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getBehaviorClass <em>Behavior Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.BehaviorTypeImpl#getBehaviorExtension <em>Behavior Extension</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class BehaviorTypeImpl extends EObjectImpl implements BehaviorType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-	/**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-	/**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-	/**
-	 * The cached value of the '{@link #getBehaviorId() <em>Behavior Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBehaviorId()
-	 * @generated
-	 * @ordered
-	 */
-	protected BehaviorIdType behaviorId;
-
-	/**
-	 * The cached value of the '{@link #getBehaviorClass() <em>Behavior Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBehaviorClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected BehaviorClassType behaviorClass;
-
-	/**
-	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attribute;
-
-	/**
-	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList property;
-
-	/**
-	 * The cached value of the '{@link #getBehaviorExtension() <em>Behavior Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBehaviorExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList behaviorExtension;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BehaviorTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.BEHAVIOR_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__ICON);
-		}
-		return icon;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorIdType getBehaviorId() {
-		return behaviorId;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param newBehaviorId 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * @generated NOT
-	 */
-	public NotificationChain basicSetBehaviorId(BehaviorIdType newBehaviorId, NotificationChain msgs) {
-		BehaviorIdType oldBehaviorId = behaviorId;
-		behaviorId = newBehaviorId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID, oldBehaviorId, newBehaviorId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehaviorId(BehaviorIdType newBehaviorId) {
-		if (newBehaviorId != behaviorId) {
-			NotificationChain msgs = null;
-			if (behaviorId != null)
-				msgs = ((InternalEObject)behaviorId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID, null, msgs);
-			if (newBehaviorId != null)
-				msgs = ((InternalEObject)newBehaviorId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID, null, msgs);
-			msgs = basicSetBehaviorId(newBehaviorId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID, newBehaviorId, newBehaviorId));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorClassType getBehaviorClass() {
-		return behaviorClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param newBehaviorClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * @generated NOT
-	 */
-	public NotificationChain basicSetBehaviorClass(BehaviorClassType newBehaviorClass, NotificationChain msgs) {
-		BehaviorClassType oldBehaviorClass = behaviorClass;
-		behaviorClass = newBehaviorClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS, oldBehaviorClass, newBehaviorClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehaviorClass(BehaviorClassType newBehaviorClass) {
-		if (newBehaviorClass != behaviorClass) {
-			NotificationChain msgs = null;
-			if (behaviorClass != null)
-				msgs = ((InternalEObject)behaviorClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS, null, msgs);
-			if (newBehaviorClass != null)
-				msgs = ((InternalEObject)newBehaviorClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS, null, msgs);
-			msgs = basicSetBehaviorClass(newBehaviorClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS, newBehaviorClass, newBehaviorClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttribute() {
-		if (attribute == null) {
-			attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE);
-		}
-		return attribute;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProperty() {
-		if (property == null) {
-			property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY);
-		}
-		return property;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getBehaviorExtension() {
-		if (behaviorExtension == null) {
-			behaviorExtension = new EObjectContainmentEList(BehaviorExtensionType.class, this, FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION);
-		}
-		return behaviorExtension;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-				return basicSetBehaviorId(null, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-				return basicSetBehaviorClass(null, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-				return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-				return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				return ((InternalEList)getBehaviorExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-				return getBehaviorId();
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-				return getBehaviorClass();
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-				return getProperty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				return getBehaviorExtension();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-				setBehaviorId((BehaviorIdType)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-				setBehaviorClass((BehaviorClassType)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				getAttribute().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-				getProperty().clear();
-				getProperty().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				getBehaviorExtension().clear();
-				getBehaviorExtension().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-				setBehaviorId((BehaviorIdType)null);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-				setBehaviorClass((BehaviorClassType)null);
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-				getProperty().clear();
-				return;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				getBehaviorExtension().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.BEHAVIOR_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_ID:
-				return behaviorId != null;
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_CLASS:
-				return behaviorClass != null;
-			case FacesConfigPackage.BEHAVIOR_TYPE__ATTRIBUTE:
-				return attribute != null && !attribute.isEmpty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__PROPERTY:
-				return property != null && !property.isEmpty();
-			case FacesConfigPackage.BEHAVIOR_TYPE__BEHAVIOR_EXTENSION:
-				return behaviorExtension != null && !behaviorExtension.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //BehaviorTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererClassTypeImpl.java
deleted file mode 100644
index 1190621..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererClassTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Client Behavior Renderer Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ClientBehaviorRendererClassTypeImpl extends EObjectImpl implements ClientBehaviorRendererClassType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererClassTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ClientBehaviorRendererClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeImpl.java
deleted file mode 100644
index 96921d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeImpl.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Client Behavior Renderer Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl#getClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeImpl#getClientBehaviorRendererClass <em>Client Behavior Renderer Class</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ClientBehaviorRendererTypeImpl extends EObjectImpl implements ClientBehaviorRendererType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getClientBehaviorRendererType() <em>Client Behavior Renderer Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getClientBehaviorRendererType()
-	 * @generated
-	 * @ordered
-	 */
-	protected ClientBehaviorRendererTypeType clientBehaviorRendererType;
-
-	/**
-	 * The cached value of the '{@link #getClientBehaviorRendererClass() <em>Client Behavior Renderer Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getClientBehaviorRendererClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ClientBehaviorRendererClassType clientBehaviorRendererClass;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererTypeType getClientBehaviorRendererType() {
-		return clientBehaviorRendererType;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * 
-	 * @param newClientBehaviorRendererType 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetClientBehaviorRendererType(ClientBehaviorRendererTypeType newClientBehaviorRendererType, NotificationChain msgs) {
-		ClientBehaviorRendererTypeType oldClientBehaviorRendererType = clientBehaviorRendererType;
-		clientBehaviorRendererType = newClientBehaviorRendererType;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE, oldClientBehaviorRendererType, newClientBehaviorRendererType);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setClientBehaviorRendererType(ClientBehaviorRendererTypeType newClientBehaviorRendererType) {
-		if (newClientBehaviorRendererType != clientBehaviorRendererType) {
-			NotificationChain msgs = null;
-			if (clientBehaviorRendererType != null)
-				msgs = ((InternalEObject)clientBehaviorRendererType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE, null, msgs);
-			if (newClientBehaviorRendererType != null)
-				msgs = ((InternalEObject)newClientBehaviorRendererType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE, null, msgs);
-			msgs = basicSetClientBehaviorRendererType(newClientBehaviorRendererType, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE, newClientBehaviorRendererType, newClientBehaviorRendererType));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererClassType getClientBehaviorRendererClass() {
-		return clientBehaviorRendererClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * 
-	 * @param newClientBehaviorRendererClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetClientBehaviorRendererClass(ClientBehaviorRendererClassType newClientBehaviorRendererClass, NotificationChain msgs) {
-		ClientBehaviorRendererClassType oldClientBehaviorRendererClass = clientBehaviorRendererClass;
-		clientBehaviorRendererClass = newClientBehaviorRendererClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS, oldClientBehaviorRendererClass, newClientBehaviorRendererClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setClientBehaviorRendererClass(ClientBehaviorRendererClassType newClientBehaviorRendererClass) {
-		if (newClientBehaviorRendererClass != clientBehaviorRendererClass) {
-			NotificationChain msgs = null;
-			if (clientBehaviorRendererClass != null)
-				msgs = ((InternalEObject)clientBehaviorRendererClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS, null, msgs);
-			if (newClientBehaviorRendererClass != null)
-				msgs = ((InternalEObject)newClientBehaviorRendererClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS, null, msgs);
-			msgs = basicSetClientBehaviorRendererClass(newClientBehaviorRendererClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS, newClientBehaviorRendererClass, newClientBehaviorRendererClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-				return basicSetClientBehaviorRendererType(null, msgs);
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				return basicSetClientBehaviorRendererClass(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-				return getClientBehaviorRendererType();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				return getClientBehaviorRendererClass();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-				setClientBehaviorRendererType((ClientBehaviorRendererTypeType)newValue);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				setClientBehaviorRendererClass((ClientBehaviorRendererClassType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-				setClientBehaviorRendererType((ClientBehaviorRendererTypeType)null);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				setClientBehaviorRendererClass((ClientBehaviorRendererClassType)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE:
-				return clientBehaviorRendererType != null;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS:
-				return clientBehaviorRendererClass != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //ClientBehaviorRendererTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeTypeImpl.java
deleted file mode 100644
index 5ee57a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ClientBehaviorRendererTypeTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Client Behavior Renderer Type Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ClientBehaviorRendererTypeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ClientBehaviorRendererTypeTypeImpl extends EObjectImpl implements ClientBehaviorRendererTypeType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ClientBehaviorRendererTypeTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ClientBehaviorRendererTypeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentClassTypeImpl.java
deleted file mode 100644
index 54b1f1a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentClassTypeImpl extends EObjectImpl implements ComponentClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.COMPONENT_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ComponentClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentExtensionTypeImpl.java
deleted file mode 100644
index f55a19d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentExtensionTypeImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ComponentExtensionTypeImpl extends ExtensionTypeImpl implements ComponentExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.COMPONENT_EXTENSION_TYPE;
-	}
-
-} //ComponentExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentFamilyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentFamilyTypeImpl.java
deleted file mode 100644
index 7f3bdb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentFamilyTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Family Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentFamilyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentFamilyTypeImpl extends EObjectImpl implements ComponentFamilyType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentFamilyTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.COMPONENT_FAMILY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ComponentFamilyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeImpl.java
deleted file mode 100644
index 304ebe4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeImpl.java
+++ /dev/null
@@ -1,588 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentTypeImpl extends EObjectImpl implements ComponentType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getComponentType() <em>Component Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponentType()
-	 * @generated
-	 * @ordered
-	 */
-	protected ComponentTypeType componentType;
-
-    /**
-	 * The cached value of the '{@link #getComponentClass() <em>Component Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponentClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ComponentClassType componentClass;
-
-    /**
-	 * The cached value of the '{@link #getFacet() <em>Facet</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFacet()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList facet;
-
-    /**
-	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attribute;
-
-    /**
-	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList property;
-
-    /**
-	 * The cached value of the '{@link #getComponentExtension() <em>Component Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponentExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList componentExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.COMPONENT_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.COMPONENT_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentTypeType getComponentType() {
-		return componentType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentType 
-     * @param msgs 
-     * @return the notification chain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentType(ComponentTypeType newComponentType, NotificationChain msgs) {
-		ComponentTypeType oldComponentType = componentType;
-		componentType = newComponentType;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE, oldComponentType, newComponentType);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentType(ComponentTypeType newComponentType) {
-		if (newComponentType != componentType) {
-			NotificationChain msgs = null;
-			if (componentType != null)
-				msgs = ((InternalEObject)componentType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE, null, msgs);
-			if (newComponentType != null)
-				msgs = ((InternalEObject)newComponentType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE, null, msgs);
-			msgs = basicSetComponentType(newComponentType, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE, newComponentType, newComponentType));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentClassType getComponentClass() {
-		return componentClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentClass(ComponentClassType newComponentClass, NotificationChain msgs) {
-		ComponentClassType oldComponentClass = componentClass;
-		componentClass = newComponentClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, oldComponentClass, newComponentClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentClass(ComponentClassType newComponentClass) {
-		if (newComponentClass != componentClass) {
-			NotificationChain msgs = null;
-			if (componentClass != null)
-				msgs = ((InternalEObject)componentClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, null, msgs);
-			if (newComponentClass != null)
-				msgs = ((InternalEObject)newComponentClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, null, msgs);
-			msgs = basicSetComponentClass(newComponentClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS, newComponentClass, newComponentClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getFacet() {
-		if (facet == null) {
-			facet = new EObjectContainmentEList(FacetType.class, this, FacesConfigPackage.COMPONENT_TYPE__FACET);
-		}
-		return facet;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttribute() {
-		if (attribute == null) {
-			attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE);
-		}
-		return attribute;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProperty() {
-		if (property == null) {
-			property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.COMPONENT_TYPE__PROPERTY);
-		}
-		return property;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getComponentExtension() {
-		if (componentExtension == null) {
-			componentExtension = new EObjectContainmentEList(ComponentExtensionType.class, this, FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION);
-		}
-		return componentExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-				return basicSetComponentType(null, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-				return basicSetComponentClass(null, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-				return ((InternalEList)getFacet()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-				return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-				return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				return ((InternalEList)getComponentExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-				return getComponentType();
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-				return getComponentClass();
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-				return getFacet();
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-				return getProperty();
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				return getComponentExtension();
-			case FacesConfigPackage.COMPONENT_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-				setComponentType((ComponentTypeType)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-				setComponentClass((ComponentClassType)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-				getFacet().clear();
-				getFacet().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				getAttribute().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-				getProperty().clear();
-				getProperty().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				getComponentExtension().clear();
-				getComponentExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-				setComponentType((ComponentTypeType)null);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-				setComponentClass((ComponentClassType)null);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-				getFacet().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-				getProperty().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				getComponentExtension().clear();
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_TYPE:
-				return componentType != null;
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_CLASS:
-				return componentClass != null;
-			case FacesConfigPackage.COMPONENT_TYPE__FACET:
-				return facet != null && !facet.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__ATTRIBUTE:
-				return attribute != null && !attribute.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__PROPERTY:
-				return property != null && !property.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__COMPONENT_EXTENSION:
-				return componentExtension != null && !componentExtension.isEmpty();
-			case FacesConfigPackage.COMPONENT_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ComponentTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeTypeImpl.java
deleted file mode 100644
index 56bfb41..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ComponentTypeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Component Type Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ComponentTypeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ComponentTypeTypeImpl extends EObjectImpl implements ComponentTypeType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ComponentTypeTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.COMPONENT_TYPE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.COMPONENT_TYPE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ComponentTypeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterClassTypeImpl.java
deleted file mode 100644
index f57f9f8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterClassTypeImpl extends EObjectImpl implements ConverterClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CONVERTER_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ConverterClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterExtensionTypeImpl.java
deleted file mode 100644
index 3b8b38d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ConverterExtensionTypeImpl extends ExtensionTypeImpl implements ConverterExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ConverterExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CONVERTER_EXTENSION_TYPE;
-	}
-
-} //ConverterExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterForClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterForClassTypeImpl.java
deleted file mode 100644
index 659359c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterForClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter For Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterForClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterForClassTypeImpl extends EObjectImpl implements ConverterForClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterForClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CONVERTER_FOR_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ConverterForClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterIdTypeImpl.java
deleted file mode 100644
index 82a4997..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterIdTypeImpl extends EObjectImpl implements ConverterIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CONVERTER_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.CONVERTER_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ConverterIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterTypeImpl.java
deleted file mode 100644
index fe331ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ConverterTypeImpl.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Converter Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getConverterExtension <em>Converter Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ConverterTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ConverterTypeImpl extends EObjectImpl implements ConverterType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getConverterId() <em>Converter Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConverterId()
-	 * @generated
-	 * @ordered
-	 */
-	protected ConverterIdType converterId;
-
-    /**
-	 * The cached value of the '{@link #getConverterForClass() <em>Converter For Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConverterForClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ConverterForClassType converterForClass;
-
-    /**
-	 * The cached value of the '{@link #getConverterClass() <em>Converter Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConverterClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ConverterClassType converterClass;
-
-    /**
-	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attribute;
-
-    /**
-	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList property;
-
-    /**
-	 * The cached value of the '{@link #getConverterExtension() <em>Converter Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getConverterExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList converterExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ConverterTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.CONVERTER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.CONVERTER_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterIdType getConverterId() {
-		return converterId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterId(ConverterIdType newConverterId, NotificationChain msgs) {
-		ConverterIdType oldConverterId = converterId;
-		converterId = newConverterId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID, oldConverterId, newConverterId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterId(ConverterIdType newConverterId) {
-		if (newConverterId != converterId) {
-			NotificationChain msgs = null;
-			if (converterId != null)
-				msgs = ((InternalEObject)converterId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID, null, msgs);
-			if (newConverterId != null)
-				msgs = ((InternalEObject)newConverterId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID, null, msgs);
-			msgs = basicSetConverterId(newConverterId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID, newConverterId, newConverterId));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterForClassType getConverterForClass() {
-		return converterForClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterForClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterForClass(ConverterForClassType newConverterForClass, NotificationChain msgs) {
-		ConverterForClassType oldConverterForClass = converterForClass;
-		converterForClass = newConverterForClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, oldConverterForClass, newConverterForClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterForClass(ConverterForClassType newConverterForClass) {
-		if (newConverterForClass != converterForClass) {
-			NotificationChain msgs = null;
-			if (converterForClass != null)
-				msgs = ((InternalEObject)converterForClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, null, msgs);
-			if (newConverterForClass != null)
-				msgs = ((InternalEObject)newConverterForClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, null, msgs);
-			msgs = basicSetConverterForClass(newConverterForClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS, newConverterForClass, newConverterForClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterClassType getConverterClass() {
-		return converterClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterClass 
-     * @param msgs 
-     * @return  
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterClass(ConverterClassType newConverterClass, NotificationChain msgs) {
-		ConverterClassType oldConverterClass = converterClass;
-		converterClass = newConverterClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, oldConverterClass, newConverterClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterClass(ConverterClassType newConverterClass) {
-		if (newConverterClass != converterClass) {
-			NotificationChain msgs = null;
-			if (converterClass != null)
-				msgs = ((InternalEObject)converterClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, null, msgs);
-			if (newConverterClass != null)
-				msgs = ((InternalEObject)newConverterClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, null, msgs);
-			msgs = basicSetConverterClass(newConverterClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS, newConverterClass, newConverterClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttribute() {
-		if (attribute == null) {
-			attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE);
-		}
-		return attribute;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProperty() {
-		if (property == null) {
-			property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.CONVERTER_TYPE__PROPERTY);
-		}
-		return property;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getConverterExtension() {
-		if (converterExtension == null) {
-			converterExtension = new EObjectContainmentEList(ConverterExtensionType.class, this, FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION);
-		}
-		return converterExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.CONVERTER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-				return basicSetConverterId(null, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-				return basicSetConverterForClass(null, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-				return basicSetConverterClass(null, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-				return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-				return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				return ((InternalEList)getConverterExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-				return getConverterId();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-				return getConverterForClass();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-				return getConverterClass();
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-				return getProperty();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				return getConverterExtension();
-			case FacesConfigPackage.CONVERTER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-				setConverterId((ConverterIdType)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-				setConverterForClass((ConverterForClassType)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-				setConverterClass((ConverterClassType)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				getAttribute().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-				getProperty().clear();
-				getProperty().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				getConverterExtension().clear();
-				getConverterExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-				setConverterId((ConverterIdType)null);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-				setConverterForClass((ConverterForClassType)null);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-				setConverterClass((ConverterClassType)null);
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-				getProperty().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				getConverterExtension().clear();
-				return;
-			case FacesConfigPackage.CONVERTER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.CONVERTER_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_ID:
-				return converterId != null;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_FOR_CLASS:
-				return converterForClass != null;
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_CLASS:
-				return converterClass != null;
-			case FacesConfigPackage.CONVERTER_TYPE__ATTRIBUTE:
-				return attribute != null && !attribute.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__PROPERTY:
-				return property != null && !property.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__CONVERTER_EXTENSION:
-				return converterExtension != null && !converterExtension.isEmpty();
-			case FacesConfigPackage.CONVERTER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ConverterTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultLocaleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultLocaleTypeImpl.java
deleted file mode 100644
index 78cb7b6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultLocaleTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Locale Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultLocaleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultLocaleTypeImpl extends EObjectImpl implements DefaultLocaleType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultLocaleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DEFAULT_LOCALE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DefaultLocaleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultRenderKitIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultRenderKitIdTypeImpl.java
deleted file mode 100644
index 7091636..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultRenderKitIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultRenderKitIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultRenderKitIdTypeImpl extends EObjectImpl implements DefaultRenderKitIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultRenderKitIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DEFAULT_RENDER_KIT_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DefaultRenderKitIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValidatorsTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValidatorsTypeImpl.java
deleted file mode 100644
index dc222bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValidatorsTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Validators Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValidatorsTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultValidatorsTypeImpl extends EObjectImpl implements DefaultValidatorsType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getValidatorId() <em>Validator Id</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValidatorId()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList validatorId;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultValidatorsTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DEFAULT_VALIDATORS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getValidatorId() {
-		if (validatorId == null) {
-			validatorId = new EObjectContainmentEList(ValidatorIdType.class, this, FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID);
-		}
-		return validatorId;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				return ((InternalEList)getValidatorId()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				return getValidatorId();
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				getValidatorId().clear();
-				getValidatorId().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				getValidatorId().clear();
-				return;
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID:
-				return validatorId != null && !validatorId.isEmpty();
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DefaultValidatorsTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValueTypeImpl.java
deleted file mode 100644
index c5da609..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DefaultValueTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Default Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DefaultValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DefaultValueTypeImpl extends EObjectImpl implements DefaultValueType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DefaultValueTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DEFAULT_VALUE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DEFAULT_VALUE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DefaultValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DescriptionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DescriptionTypeImpl.java
deleted file mode 100644
index 31368c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DescriptionTypeImpl.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Description Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DescriptionTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DescriptionTypeImpl extends EObjectImpl implements DescriptionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LANG_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected String lang = LANG_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DescriptionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DESCRIPTION_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLang() {
-		return lang;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLang(String newLang) {
-		String oldLang = lang;
-		lang = newLang;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DESCRIPTION_TYPE__LANG, oldLang, lang));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DESCRIPTION_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-				return getLang();
-			case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-				setLang((String)newValue);
-				return;
-			case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-				setLang(LANG_EDEFAULT);
-				return;
-			case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DESCRIPTION_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.DESCRIPTION_TYPE__LANG:
-				return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-			case FacesConfigPackage.DESCRIPTION_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", lang: ");//$NON-NLS-1$
-		result.append(lang);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DescriptionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DisplayNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DisplayNameTypeImpl.java
deleted file mode 100644
index 85b8ea0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DisplayNameTypeImpl.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Display Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DisplayNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DisplayNameTypeImpl extends EObjectImpl implements DisplayNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LANG_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected String lang = LANG_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DisplayNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DISPLAY_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLang() {
-		return lang;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLang(String newLang) {
-		String oldLang = lang;
-		lang = newLang;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DISPLAY_NAME_TYPE__LANG, oldLang, lang));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DISPLAY_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-				return getLang();
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-				setLang((String)newValue);
-				return;
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-				setLang(LANG_EDEFAULT);
-				return;
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__LANG:
-				return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-			case FacesConfigPackage.DISPLAY_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", lang: ");//$NON-NLS-1$
-		result.append(lang);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DisplayNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DocumentRootImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DocumentRootImpl.java
deleted file mode 100644
index 43083da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DocumentRootImpl.java
+++ /dev/null
@@ -1,4674 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
-import org.eclipse.emf.ecore.util.BasicFeatureMap;
-import org.eclipse.emf.ecore.util.EcoreEMap;
-import org.eclipse.emf.ecore.util.FeatureMap;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Document Root</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMixed <em>Mixed</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getXMLNSPrefixMap <em>XMLNS Prefix Map</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getXSISchemaLocation <em>XSI Schema Location</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAbsoluteOrdering <em>Absolute Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getActionListener <em>Action Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttributeClass <em>Attribute Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttributeExtension <em>Attribute Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getAttributeName <em>Attribute Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getBehavior <em>Behavior</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getBehaviorClass <em>Behavior Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getBehaviorId <em>Behavior Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getBehaviorExtension <em>Behavior Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentClass <em>Component Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentExtension <em>Component Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getComponentType <em>Component Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverterClass <em>Converter Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverterForClass <em>Converter For Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getConverterId <em>Converter Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultRenderKitId <em>Default Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultValidators <em>Default Validators</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getExceptionHandlerFactory <em>Exception Handler Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getExternalContextFactory <em>External Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacesConfig <em>Faces Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getIf <em>If</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getLocaleConfig <em>Locale Config</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getMessageBundle <em>Message Bundle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNavigationHandler <em>Navigation Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getOrdering <em>Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getOrderingOrdering <em>Ordering Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getOthers <em>Others</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPartialViewContextFactory <em>Partial View Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getPropertyResolver <em>Property Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRedirectViewParam <em>Redirect View Param</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getResourceHandler <em>Resource Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSourceClass <em>Source Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getStateManager <em>State Manager</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSystemEventClass <em>System Event Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSystemEventListener <em>System Event Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getSystemEventListenerClass <em>System Event Listener Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getVariableResolver <em>Variable Resolver</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getViewHandler <em>View Handler</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DocumentRootImpl#getVisitContextFactory <em>Visit Context Factory</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DocumentRootImpl extends EObjectImpl implements DocumentRoot {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getMixed() <em>Mixed</em>}' attribute list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMixed()
-	 * @generated
-	 * @ordered
-	 */
-	protected FeatureMap mixed;
-
-    /**
-	 * The cached value of the '{@link #getXMLNSPrefixMap() <em>XMLNS Prefix Map</em>}' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXMLNSPrefixMap()
-	 * @generated
-	 * @ordered
-	 */
-	protected EMap xMLNSPrefixMap;
-
-    /**
-	 * The cached value of the '{@link #getXSISchemaLocation() <em>XSI Schema Location</em>}' map.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXSISchemaLocation()
-	 * @generated
-	 * @ordered
-	 */
-	protected EMap xSISchemaLocation;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DocumentRootImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DOCUMENT_ROOT;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FeatureMap getMixed() {
-		if (mixed == null) {
-			mixed = new BasicFeatureMap(this, FacesConfigPackage.DOCUMENT_ROOT__MIXED);
-		}
-		return mixed;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EMap getXMLNSPrefixMap() {
-		if (xMLNSPrefixMap == null) {
-			xMLNSPrefixMap = new EcoreEMap(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-		}
-		return xMLNSPrefixMap;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EMap getXSISchemaLocation() {
-		if (xSISchemaLocation == null) {
-			xSISchemaLocation = new EcoreEMap(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-		}
-		return xSISchemaLocation;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AbsoluteOrderingType getAbsoluteOrdering() {
-		return (AbsoluteOrderingType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ABSOLUTE_ORDERING, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newAbsoluteOrdering 
-	 * @param msgs 
-	 * @return  NotficationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAbsoluteOrdering(AbsoluteOrderingType newAbsoluteOrdering, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ABSOLUTE_ORDERING, newAbsoluteOrdering, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAbsoluteOrdering(AbsoluteOrderingType newAbsoluteOrdering) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ABSOLUTE_ORDERING, newAbsoluteOrdering);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActionListenerType getActionListener() {
-		return (ActionListenerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newActionListener 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetActionListener(ActionListenerType newActionListener, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER, newActionListener, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setActionListener(ActionListenerType newActionListener) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ACTION_LISTENER, newActionListener);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationType getApplication() {
-		return (ApplicationType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newApplication 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetApplication(ApplicationType newApplication, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION, newApplication, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setApplication(ApplicationType newApplication) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION, newApplication);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationFactoryType getApplicationFactory() {
-		return (ApplicationFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newApplicationFactory 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetApplicationFactory(ApplicationFactoryType newApplicationFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY, newApplicationFactory, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setApplicationFactory(ApplicationFactoryType newApplicationFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__APPLICATION_FACTORY, newApplicationFactory);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeType getAttribute() {
-		return (AttributeType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttribute 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttribute(AttributeType newAttribute, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE, newAttribute, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttribute(AttributeType newAttribute) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE, newAttribute);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeClassType getAttributeClass() {
-		return (AttributeClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttributeClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttributeClass(AttributeClassType newAttributeClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_CLASS, newAttributeClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeClass(AttributeClassType newAttributeClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_CLASS, newAttributeClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeExtensionType getAttributeExtension() {
-		return (AttributeExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttributeExtension 
-     * @param msgs 
-     * @return the notification chiain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttributeExtension(AttributeExtensionType newAttributeExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION, newAttributeExtension, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeExtension(AttributeExtensionType newAttributeExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION, newAttributeExtension);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeNameType getAttributeName() {
-		return (AttributeNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newAttributeName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAttributeName(AttributeNameType newAttributeName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME, newAttributeName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeName(AttributeNameType newAttributeName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ATTRIBUTE_NAME, newAttributeName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorType getBehavior() {
-		return (BehaviorType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newBehavior 
-	 * @param msgs NotificationChain
-	 * @return 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetBehavior(BehaviorType newBehavior, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR, newBehavior, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehavior(BehaviorType newBehavior) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR, newBehavior);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorClassType getBehaviorClass() {
-		return (BehaviorClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_CLASS, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newBehaviorClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetBehaviorClass(BehaviorClassType newBehaviorClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_CLASS, newBehaviorClass, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehaviorClass(BehaviorClassType newBehaviorClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_CLASS, newBehaviorClass);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorIdType getBehaviorId() {
-		return (BehaviorIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_ID, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newBehaviorId 
-	 * @param msgs 
-	 * @return NotificationChain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetBehaviorId(BehaviorIdType newBehaviorId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_ID, newBehaviorId, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehaviorId(BehaviorIdType newBehaviorId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_ID, newBehaviorId);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorExtensionType getBehaviorExtension() {
-		return (BehaviorExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_EXTENSION, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newBehaviorExtension 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetBehaviorExtension(BehaviorExtensionType newBehaviorExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_EXTENSION, newBehaviorExtension, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBehaviorExtension(BehaviorExtensionType newBehaviorExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__BEHAVIOR_EXTENSION, newBehaviorExtension);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentType getComponent() {
-		return (ComponentType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponent 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponent(ComponentType newComponent, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT, newComponent, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponent(ComponentType newComponent) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT, newComponent);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentClassType getComponentClass() {
-		return (ComponentClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentClass(ComponentClassType newComponentClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS, newComponentClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentClass(ComponentClassType newComponentClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_CLASS, newComponentClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentExtensionType getComponentExtension() {
-		return (ComponentExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentExtension 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentExtension(ComponentExtensionType newComponentExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION, newComponentExtension, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentExtension(ComponentExtensionType newComponentExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_EXTENSION, newComponentExtension);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentFamilyType getComponentFamily() {
-		return (ComponentFamilyType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_FAMILY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentFamily 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentFamily(ComponentFamilyType newComponentFamily, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_FAMILY, newComponentFamily, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentFamily(ComponentFamilyType newComponentFamily) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_FAMILY, newComponentFamily);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentTypeType getComponentType() {
-		return (ComponentTypeType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentType 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentType(ComponentTypeType newComponentType, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE, newComponentType, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentType(ComponentTypeType newComponentType) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__COMPONENT_TYPE, newComponentType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterType getConverter() {
-		return (ConverterType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverter 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverter(ConverterType newConverter, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER, newConverter, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverter(ConverterType newConverter) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER, newConverter);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterClassType getConverterClass() {
-		return (ConverterClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterClass(ConverterClassType newConverterClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_CLASS, newConverterClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterClass(ConverterClassType newConverterClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_CLASS, newConverterClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterForClassType getConverterForClass() {
-		return (ConverterForClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_FOR_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterForClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterForClass(ConverterForClassType newConverterForClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_FOR_CLASS, newConverterForClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterForClass(ConverterForClassType newConverterForClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_FOR_CLASS, newConverterForClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterIdType getConverterId() {
-		return (ConverterIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newConverterId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetConverterId(ConverterIdType newConverterId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_ID, newConverterId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setConverterId(ConverterIdType newConverterId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__CONVERTER_ID, newConverterId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultLocaleType getDefaultLocale() {
-		return (DefaultLocaleType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultLocale 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultLocale(DefaultLocaleType newDefaultLocale, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE, newDefaultLocale, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultLocale(DefaultLocaleType newDefaultLocale) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_LOCALE, newDefaultLocale);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultRenderKitIdType getDefaultRenderKitId() {
-		return (DefaultRenderKitIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultRenderKitId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultRenderKitId(DefaultRenderKitIdType newDefaultRenderKitId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID, newDefaultRenderKitId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultRenderKitId(DefaultRenderKitIdType newDefaultRenderKitId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID, newDefaultRenderKitId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValidatorsType getDefaultValidators() {
-		return (DefaultValidatorsType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALIDATORS, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newDefaultValidators 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultValidators(DefaultValidatorsType newDefaultValidators, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALIDATORS, newDefaultValidators, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultValidators(DefaultValidatorsType newDefaultValidators) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALIDATORS, newDefaultValidators);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValueType getDefaultValue() {
-		return (DefaultValueType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultValue(DefaultValueType newDefaultValue, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE, newDefaultValue, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultValue(DefaultValueType newDefaultValue) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DEFAULT_VALUE, newDefaultValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescriptionType getDescription() {
-		return (DescriptionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDescription 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDescription(DescriptionType newDescription, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION, newDescription, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDescription(DescriptionType newDescription) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DESCRIPTION, newDescription);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DisplayNameType getDisplayName() {
-		return (DisplayNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDisplayName 
-     * @param msgs 
-     * @return the notification 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDisplayName(DisplayNameType newDisplayName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME, newDisplayName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDisplayName(DisplayNameType newDisplayName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__DISPLAY_NAME, newDisplayName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExceptionHandlerFactoryType getExceptionHandlerFactory() {
-		return (ExceptionHandlerFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newExceptionHandlerFactory 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetExceptionHandlerFactory(ExceptionHandlerFactoryType newExceptionHandlerFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY, newExceptionHandlerFactory, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExceptionHandlerFactory(ExceptionHandlerFactoryType newExceptionHandlerFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY, newExceptionHandlerFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExternalContextFactoryType getExternalContextFactory() {
-		return (ExternalContextFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newExternalContextFactory 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetExternalContextFactory(ExternalContextFactoryType newExternalContextFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY, newExternalContextFactory, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setExternalContextFactory(ExternalContextFactoryType newExternalContextFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY, newExternalContextFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigType getFacesConfig() {
-		return (FacesConfigType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacesConfig 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacesConfig(FacesConfigType newFacesConfig, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG, newFacesConfig, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacesConfig(FacesConfigType newFacesConfig) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONFIG, newFacesConfig);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesContextFactoryType getFacesContextFactory() {
-		return (FacesContextFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacesContextFactory 
-     * @param msgs 
-     * @return NotificationChain
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacesContextFactory(FacesContextFactoryType newFacesContextFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY, newFacesContextFactory, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacesContextFactory(FacesContextFactoryType newFacesContextFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY, newFacesContextFactory);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetType getFacet() {
-		return (FacetType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacet 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacet(FacetType newFacet, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET, newFacet, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacet(FacetType newFacet) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET, newFacet);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetExtensionType getFacetExtension() {
-		return (FacetExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_EXTENSION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacetExtension 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacetExtension(FacetExtensionType newFacetExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_EXTENSION, newFacetExtension, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacetExtension(FacetExtensionType newFacetExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_EXTENSION, newFacetExtension);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetNameType getFacetName() {
-		return (FacetNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacetName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacetName(FacetNameType newFacetName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_NAME, newFacetName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacetName(FacetNameType newFacetName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACET_NAME, newFacetName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FactoryType getFactory() {
-		return (FactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFactory 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFactory(FactoryType newFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY, newFactory, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFactory(FactoryType newFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FACTORY, newFactory);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromActionType getFromAction() {
-		return (FromActionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_ACTION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromAction 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromAction(FromActionType newFromAction, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_ACTION, newFromAction, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromAction(FromActionType newFromAction) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_ACTION, newFromAction);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromOutcomeType getFromOutcome() {
-		return (FromOutcomeType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_OUTCOME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromOutcome 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromOutcome(FromOutcomeType newFromOutcome, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_OUTCOME, newFromOutcome, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromOutcome(FromOutcomeType newFromOutcome) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_OUTCOME, newFromOutcome);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromViewIdType getFromViewId() {
-		return (FromViewIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_VIEW_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromViewId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromViewId(FromViewIdType newFromViewId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_VIEW_ID, newFromViewId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromViewId(FromViewIdType newFromViewId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__FROM_VIEW_ID, newFromViewId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IconType getIcon() {
-		return (IconType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newIcon 
-     * @param msgs 
-     * @return the notification  chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetIcon(IconType newIcon, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON, newIcon, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIcon(IconType newIcon) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ICON, newIcon);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IfType getIf() {
-		return (IfType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__IF, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newIf 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetIf(IfType newIf, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__IF, newIf, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIf(IfType newIf) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__IF, newIf);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyType getKey() {
-		return (KeyType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newKey 
-     * @param msgs 
-     * @return the notification chiainn 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetKey(KeyType newKey, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY, newKey, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKey(KeyType newKey) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY, newKey);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyClassType getKeyClass() {
-		return (KeyClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newKeyClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetKeyClass(KeyClassType newKeyClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY_CLASS, newKeyClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKeyClass(KeyClassType newKeyClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__KEY_CLASS, newKeyClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LargeIconType getLargeIcon() {
-		return (LargeIconType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__LARGE_ICON, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newLargeIcon 
-     * @param msgs 
-     * @return the notification  chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLargeIcon(LargeIconType newLargeIcon, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__LARGE_ICON, newLargeIcon, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLargeIcon(LargeIconType newLargeIcon) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__LARGE_ICON, newLargeIcon);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleType getLifecycle() {
-		return (LifecycleType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newLifecycle 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLifecycle(LifecycleType newLifecycle, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE, newLifecycle, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLifecycle(LifecycleType newLifecycle) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE, newLifecycle);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleFactoryType getLifecycleFactory() {
-		return (LifecycleFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newLifecycleFactory 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLifecycleFactory(LifecycleFactoryType newLifecycleFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY, newLifecycleFactory, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLifecycleFactory(LifecycleFactoryType newLifecycleFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIFECYCLE_FACTORY, newLifecycleFactory);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ListEntriesType getListEntries() {
-		return (ListEntriesType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newListEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetListEntries(ListEntriesType newListEntries, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES, newListEntries, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setListEntries(ListEntriesType newListEntries) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__LIST_ENTRIES, newListEntries);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LocaleConfigType getLocaleConfig() {
-		return (LocaleConfigType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newLocaleConfig 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLocaleConfig(LocaleConfigType newLocaleConfig, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG, newLocaleConfig, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLocaleConfig(LocaleConfigType newLocaleConfig) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__LOCALE_CONFIG, newLocaleConfig);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanType getManagedBean() {
-		return (ManagedBeanType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBean 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBean(ManagedBeanType newManagedBean, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN, newManagedBean, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBean(ManagedBeanType newManagedBean) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN, newManagedBean);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanClassType getManagedBeanClass() {
-		return (ManagedBeanClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanClass(ManagedBeanClassType newManagedBeanClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_CLASS, newManagedBeanClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanClass(ManagedBeanClassType newManagedBeanClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_CLASS, newManagedBeanClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanNameType getManagedBeanName() {
-		return (ManagedBeanNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanName(ManagedBeanNameType newManagedBeanName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_NAME, newManagedBeanName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanName(ManagedBeanNameType newManagedBeanName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_NAME, newManagedBeanName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanScopeType getManagedBeanScope() {
-		return (ManagedBeanScopeType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanScope 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanScope(ManagedBeanScopeType newManagedBeanScope, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE, newManagedBeanScope, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanScope(ManagedBeanScopeType newManagedBeanScope) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE, newManagedBeanScope);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedPropertyType getManagedProperty() {
-		return (ManagedPropertyType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedProperty 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedProperty(ManagedPropertyType newManagedProperty, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY, newManagedProperty, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedProperty(ManagedPropertyType newManagedProperty) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MANAGED_PROPERTY, newManagedProperty);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntriesType getMapEntries() {
-		return (MapEntriesType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newMapEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMapEntries(MapEntriesType newMapEntries, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES, newMapEntries, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMapEntries(MapEntriesType newMapEntries) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRIES, newMapEntries);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntryType getMapEntry() {
-		return (MapEntryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newMapEntry 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMapEntry(MapEntryType newMapEntry, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY, newMapEntry, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMapEntry(MapEntryType newMapEntry) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MAP_ENTRY, newMapEntry);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MessageBundleType getMessageBundle() {
-		return (MessageBundleType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newMessageBundle 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMessageBundle(MessageBundleType newMessageBundle, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE, newMessageBundle, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMessageBundle(MessageBundleType newMessageBundle) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__MESSAGE_BUNDLE, newMessageBundle);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NameType getName() {
-		return (NameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAME, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newName 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetName(NameType newName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAME, newName, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(NameType newName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAME, newName);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationCaseType getNavigationCase() {
-		return (NavigationCaseType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNavigationCase 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNavigationCase(NavigationCaseType newNavigationCase, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE, newNavigationCase, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNavigationCase(NavigationCaseType newNavigationCase) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_CASE, newNavigationCase);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationHandlerType getNavigationHandler() {
-		return (NavigationHandlerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNavigationHandler 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNavigationHandler(NavigationHandlerType newNavigationHandler, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER, newNavigationHandler, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNavigationHandler(NavigationHandlerType newNavigationHandler) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_HANDLER, newNavigationHandler);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationRuleType getNavigationRule() {
-		return (NavigationRuleType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNavigationRule 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNavigationRule(NavigationRuleType newNavigationRule, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE, newNavigationRule, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNavigationRule(NavigationRuleType newNavigationRule) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NAVIGATION_RULE, newNavigationRule);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NullValueType getNullValue() {
-		return (NullValueType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNullValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNullValue(NullValueType newNullValue, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE, newNullValue, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNullValue(NullValueType newNullValue) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__NULL_VALUE, newNullValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingType getOrdering() {
-		return (OrderingType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newOrdering 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetOrdering(OrderingType newOrdering, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING, newOrdering, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOrdering(OrderingType newOrdering) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING, newOrdering);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOrderingType getOrderingOrdering() {
-		return (OrderingOrderingType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING_ORDERING, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newOrderingOrdering 
-	 * @param msgs 
-	 * @return NotificationChain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetOrderingOrdering(OrderingOrderingType newOrderingOrdering, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING_ORDERING, newOrderingOrdering, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOrderingOrdering(OrderingOrderingType newOrderingOrdering) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__ORDERING_ORDERING, newOrderingOrdering);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOthersType getOthers() {
-		return (OrderingOthersType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__OTHERS, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newOthers 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetOthers(OrderingOthersType newOthers, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__OTHERS, newOthers, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOthers(OrderingOthersType newOthers) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__OTHERS, newOthers);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PartialViewContextFactoryType getPartialViewContextFactory() {
-		return (PartialViewContextFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newPartialViewContextFactory 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPartialViewContextFactory(PartialViewContextFactoryType newPartialViewContextFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY, newPartialViewContextFactory, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPartialViewContextFactory(PartialViewContextFactoryType newPartialViewContextFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY, newPartialViewContextFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PhaseListenerType getPhaseListener() {
-		return (PhaseListenerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPhaseListener 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPhaseListener(PhaseListenerType newPhaseListener, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER, newPhaseListener, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPhaseListener(PhaseListenerType newPhaseListener) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PHASE_LISTENER, newPhaseListener);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyType getProperty() {
-		return (PropertyType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newProperty 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetProperty(PropertyType newProperty, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY, newProperty, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setProperty(PropertyType newProperty) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY, newProperty);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyClassType getPropertyClass() {
-		return (PropertyClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyClass(PropertyClassType newPropertyClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_CLASS, newPropertyClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyClass(PropertyClassType newPropertyClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_CLASS, newPropertyClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyExtensionType getPropertyExtension() {
-		return (PropertyExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyExtension 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyExtension(PropertyExtensionType newPropertyExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION, newPropertyExtension, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyExtension(PropertyExtensionType newPropertyExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_EXTENSION, newPropertyExtension);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyNameType getPropertyName() {
-		return (PropertyNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyName(PropertyNameType newPropertyName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_NAME, newPropertyName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyName(PropertyNameType newPropertyName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_NAME, newPropertyName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyResolverType getPropertyResolver() {
-		return (PropertyResolverType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyResolver 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyResolver(PropertyResolverType newPropertyResolver, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER, newPropertyResolver, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyResolver(PropertyResolverType newPropertyResolver) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__PROPERTY_RESOLVER, newPropertyResolver);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectType getRedirect() {
-		return (RedirectType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRedirect 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRedirect(RedirectType newRedirect, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT, newRedirect, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRedirect(RedirectType newRedirect) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT, newRedirect);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectViewParamType getRedirectViewParam() {
-		return (RedirectViewParamType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newRedirectViewParam 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRedirectViewParam(RedirectViewParamType newRedirectViewParam, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM, newRedirectViewParam, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRedirectViewParam(RedirectViewParamType newRedirectViewParam) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM, newRedirectViewParam);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanType getReferencedBean() {
-		return (ReferencedBeanType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newReferencedBean 
-     * @param msgs 
-     * @return the notification chai 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferencedBean(ReferencedBeanType newReferencedBean, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN, newReferencedBean, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferencedBean(ReferencedBeanType newReferencedBean) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN, newReferencedBean);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanClassType getReferencedBeanClass() {
-		return (ReferencedBeanClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newReferencedBeanClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferencedBeanClass(ReferencedBeanClassType newReferencedBeanClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS, newReferencedBeanClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferencedBeanClass(ReferencedBeanClassType newReferencedBeanClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS, newReferencedBeanClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanNameType getReferencedBeanName() {
-		return (ReferencedBeanNameType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_NAME, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newReferencedBeanName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferencedBeanName(ReferencedBeanNameType newReferencedBeanName, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_NAME, newReferencedBeanName, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferencedBeanName(ReferencedBeanNameType newReferencedBeanName) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__REFERENCED_BEAN_NAME, newReferencedBeanName);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererType getRenderer() {
-		return (RendererType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderer 
-     * @param msgs 
-     * @return the notification chain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderer(RendererType newRenderer, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER, newRenderer, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderer(RendererType newRenderer) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER, newRenderer);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererClassType getRendererClass() {
-		return (RendererClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRendererClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRendererClass(RendererClassType newRendererClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_CLASS, newRendererClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRendererClass(RendererClassType newRendererClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_CLASS, newRendererClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererExtensionType getRendererExtension() {
-		return (RendererExtensionType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRendererExtension 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRendererExtension(RendererExtensionType newRendererExtension, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION, newRendererExtension, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRendererExtension(RendererExtensionType newRendererExtension) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_EXTENSION, newRendererExtension);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererTypeType getRendererType() {
-		return (RendererTypeType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_TYPE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRendererType 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRendererType(RendererTypeType newRendererType, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_TYPE, newRendererType, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRendererType(RendererTypeType newRendererType) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDERER_TYPE, newRendererType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitType getRenderKit() {
-		return (RenderKitType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKit 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKit(RenderKitType newRenderKit, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT, newRenderKit, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKit(RenderKitType newRenderKit) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT, newRenderKit);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitClassType getRenderKitClass() {
-		return (RenderKitClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKitClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKitClass(RenderKitClassType newRenderKitClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_CLASS, newRenderKitClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKitClass(RenderKitClassType newRenderKitClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_CLASS, newRenderKitClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitFactoryType getRenderKitFactory() {
-		return (RenderKitFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKitFactory 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKitFactory(RenderKitFactoryType newRenderKitFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY, newRenderKitFactory, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKitFactory(RenderKitFactoryType newRenderKitFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_FACTORY, newRenderKitFactory);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitIdType getRenderKitId() {
-		return (RenderKitIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKitId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKitId(RenderKitIdType newRenderKitId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID, newRenderKitId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKitId(RenderKitIdType newRenderKitId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RENDER_KIT_ID, newRenderKitId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceHandlerType getResourceHandler() {
-		return (ResourceHandlerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__RESOURCE_HANDLER, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newResourceHandler 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetResourceHandler(ResourceHandlerType newResourceHandler, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__RESOURCE_HANDLER, newResourceHandler, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResourceHandler(ResourceHandlerType newResourceHandler) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__RESOURCE_HANDLER, newResourceHandler);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SmallIconType getSmallIcon() {
-		return (SmallIconType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSmallIcon 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSmallIcon(SmallIconType newSmallIcon, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON, newSmallIcon, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSmallIcon(SmallIconType newSmallIcon) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SMALL_ICON, newSmallIcon);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SourceClassType getSourceClass() {
-		return (SourceClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SOURCE_CLASS, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newSourceClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSourceClass(SourceClassType newSourceClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SOURCE_CLASS, newSourceClass, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSourceClass(SourceClassType newSourceClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SOURCE_CLASS, newSourceClass);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateManagerType getStateManager() {
-		return (StateManagerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newStateManager 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetStateManager(StateManagerType newStateManager, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER, newStateManager, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setStateManager(StateManagerType newStateManager) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__STATE_MANAGER, newStateManager);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SuggestedValueType getSuggestedValue() {
-		return (SuggestedValueType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUGGESTED_VALUE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSuggestedValue 
-     * @param msgs 
-     * @return the notification chain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSuggestedValue(SuggestedValueType newSuggestedValue, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUGGESTED_VALUE, newSuggestedValue, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuggestedValue(SuggestedValueType newSuggestedValue) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUGGESTED_VALUE, newSuggestedValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportedLocaleType getSupportedLocale() {
-		return (SupportedLocaleType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSupportedLocale 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSupportedLocale(SupportedLocaleType newSupportedLocale, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE, newSupportedLocale, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSupportedLocale(SupportedLocaleType newSupportedLocale) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SUPPORTED_LOCALE, newSupportedLocale);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventClassType getSystemEventClass() {
-		return (SystemEventClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS, true);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newSystemEventClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSystemEventClass(SystemEventClassType newSystemEventClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS, newSystemEventClass, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSystemEventClass(SystemEventClassType newSystemEventClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS, newSystemEventClass);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerType getSystemEventListener() {
-		return (SystemEventListenerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newSystemEventListener 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSystemEventListener(SystemEventListenerType newSystemEventListener, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER, newSystemEventListener, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSystemEventListener(SystemEventListenerType newSystemEventListener) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER, newSystemEventListener);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerClassType getSystemEventListenerClass() {
-		return (SystemEventListenerClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newSystemEventListenerClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSystemEventListenerClass(SystemEventListenerClassType newSystemEventListenerClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS, newSystemEventListenerClass, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSystemEventListenerClass(SystemEventListenerClassType newSystemEventListenerClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS, newSystemEventListenerClass);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagHandlerDelegateFactoryType getTagHandlerDelegateFactory() {
-		return (TagHandlerDelegateFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newTagHandlerDelegateFactory 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTagHandlerDelegateFactory(TagHandlerDelegateFactoryType newTagHandlerDelegateFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY, newTagHandlerDelegateFactory, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTagHandlerDelegateFactory(TagHandlerDelegateFactoryType newTagHandlerDelegateFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY, newTagHandlerDelegateFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToViewIdType getToViewId() {
-		return (ToViewIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newToViewId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetToViewId(ToViewIdType newToViewId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID, newToViewId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setToViewId(ToViewIdType newToViewId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__TO_VIEW_ID, newToViewId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorType getValidator() {
-		return (ValidatorType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValidator 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValidator(ValidatorType newValidator, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR, newValidator, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValidator(ValidatorType newValidator) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR, newValidator);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorClassType getValidatorClass() {
-		return (ValidatorClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValidatorClass 
-     * @param msgs 
-     * @return NotificationChain
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValidatorClass(ValidatorClassType newValidatorClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS, newValidatorClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValidatorClass(ValidatorClassType newValidatorClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_CLASS, newValidatorClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorIdType getValidatorId() {
-		return (ValidatorIdType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_ID, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValidatorId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValidatorId(ValidatorIdType newValidatorId, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_ID, newValidatorId, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValidatorId(ValidatorIdType newValidatorId) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALIDATOR_ID, newValidatorId);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueType getValue() {
-		return (ValueType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValue(ValueType newValue, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE, newValue, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(ValueType newValue) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueClassType getValueClass() {
-		return (ValueClassType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE_CLASS, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValueClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValueClass(ValueClassType newValueClass, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE_CLASS, newValueClass, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueClass(ValueClassType newValueClass) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VALUE_CLASS, newValueClass);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariableResolverType getVariableResolver() {
-		return (VariableResolverType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newVariableResolver 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetVariableResolver(VariableResolverType newVariableResolver, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER, newVariableResolver, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVariableResolver(VariableResolverType newVariableResolver) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VARIABLE_RESOLVER, newVariableResolver);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewDeclarationLanguageFactoryType getViewDeclarationLanguageFactory() {
-		return (ViewDeclarationLanguageFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newViewDeclarationLanguageFactory 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetViewDeclarationLanguageFactory(ViewDeclarationLanguageFactoryType newViewDeclarationLanguageFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY, newViewDeclarationLanguageFactory, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setViewDeclarationLanguageFactory(ViewDeclarationLanguageFactoryType newViewDeclarationLanguageFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY, newViewDeclarationLanguageFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewHandlerType getViewHandler() {
-		return (ViewHandlerType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER, true);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newViewHandler 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetViewHandler(ViewHandlerType newViewHandler, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER, newViewHandler, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setViewHandler(ViewHandlerType newViewHandler) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VIEW_HANDLER, newViewHandler);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VisitContextFactoryType getVisitContextFactory() {
-		return (VisitContextFactoryType)getMixed().get(FacesConfigPackage.Literals.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY, true);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newVisitContextFactory 
-	 * @param msgs 
-	 * @return NotificationChain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetVisitContextFactory(VisitContextFactoryType newVisitContextFactory, NotificationChain msgs) {
-		return ((FeatureMap.Internal)getMixed()).basicAdd(FacesConfigPackage.Literals.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY, newVisitContextFactory, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setVisitContextFactory(VisitContextFactoryType newVisitContextFactory) {
-		((FeatureMap.Internal)getMixed()).set(FacesConfigPackage.Literals.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY, newVisitContextFactory);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-				return ((InternalEList)getMixed()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				return ((InternalEList)getXMLNSPrefixMap()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				return ((InternalEList)getXSISchemaLocation()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-				return basicSetAbsoluteOrdering(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-				return basicSetActionListener(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-				return basicSetApplication(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-				return basicSetApplicationFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-				return basicSetAttribute(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-				return basicSetAttributeClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-				return basicSetAttributeExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-				return basicSetAttributeName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-				return basicSetBehavior(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-				return basicSetBehaviorClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-				return basicSetBehaviorId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-				return basicSetBehaviorExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-				return basicSetComponent(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-				return basicSetComponentClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-				return basicSetComponentExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-				return basicSetComponentFamily(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-				return basicSetComponentType(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-				return basicSetConverter(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-				return basicSetConverterClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-				return basicSetConverterForClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-				return basicSetConverterId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-				return basicSetDefaultLocale(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-				return basicSetDefaultRenderKitId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-				return basicSetDefaultValidators(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-				return basicSetDefaultValue(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-				return basicSetDescription(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-				return basicSetDisplayName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-				return basicSetExceptionHandlerFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-				return basicSetExternalContextFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-				return basicSetFacesConfig(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-				return basicSetFacesContextFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-				return basicSetFacet(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-				return basicSetFacetExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-				return basicSetFacetName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-				return basicSetFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-				return basicSetFromAction(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-				return basicSetFromOutcome(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-				return basicSetFromViewId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-				return basicSetIcon(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-				return basicSetIf(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-				return basicSetKey(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-				return basicSetKeyClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-				return basicSetLargeIcon(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-				return basicSetLifecycle(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-				return basicSetLifecycleFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-				return basicSetListEntries(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-				return basicSetLocaleConfig(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-				return basicSetManagedBean(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-				return basicSetManagedBeanClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-				return basicSetManagedBeanName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-				return basicSetManagedBeanScope(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-				return basicSetManagedProperty(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-				return basicSetMapEntries(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-				return basicSetMapEntry(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-				return basicSetMessageBundle(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-				return basicSetName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-				return basicSetNavigationCase(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-				return basicSetNavigationHandler(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-				return basicSetNavigationRule(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-				return basicSetNullValue(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-				return basicSetOrdering(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-				return basicSetOrderingOrdering(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-				return basicSetOthers(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return basicSetPartialViewContextFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-				return basicSetPhaseListener(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-				return basicSetProperty(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-				return basicSetPropertyClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-				return basicSetPropertyExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-				return basicSetPropertyName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-				return basicSetPropertyResolver(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-				return basicSetRedirect(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-				return basicSetRedirectViewParam(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-				return basicSetReferencedBean(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-				return basicSetReferencedBeanClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-				return basicSetReferencedBeanName(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-				return basicSetRenderer(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-				return basicSetRendererClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-				return basicSetRendererExtension(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-				return basicSetRendererType(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-				return basicSetRenderKit(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-				return basicSetRenderKitClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-				return basicSetRenderKitFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-				return basicSetRenderKitId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-				return basicSetResourceHandler(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-				return basicSetSmallIcon(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-				return basicSetSourceClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-				return basicSetStateManager(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-				return basicSetSuggestedValue(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-				return basicSetSupportedLocale(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-				return basicSetSystemEventClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-				return basicSetSystemEventListener(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-				return basicSetSystemEventListenerClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-				return basicSetTagHandlerDelegateFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-				return basicSetToViewId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-				return basicSetValidator(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-				return basicSetValidatorClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-				return basicSetValidatorId(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-				return basicSetValue(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-				return basicSetValueClass(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-				return basicSetVariableResolver(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return basicSetViewDeclarationLanguageFactory(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-				return basicSetViewHandler(null, msgs);
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				return basicSetVisitContextFactory(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-				if (coreType) return getMixed();
-				return ((FeatureMap.Internal)getMixed()).getWrapper();
-			case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				if (coreType) return getXMLNSPrefixMap();
-				    return getXMLNSPrefixMap().map();
-			case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				if (coreType) return getXSISchemaLocation();
-				     return getXSISchemaLocation().map();
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-				return getAbsoluteOrdering();
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-				return getActionListener();
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-				return getApplication();
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-				return getApplicationFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-				return getAttributeClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-				return getAttributeExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-				return getAttributeName();
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-				return getBehavior();
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-				return getBehaviorClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-				return getBehaviorId();
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-				return getBehaviorExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-				return getComponent();
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-				return getComponentClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-				return getComponentExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-				return getComponentFamily();
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-				return getComponentType();
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-				return getConverter();
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-				return getConverterClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-				return getConverterForClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-				return getConverterId();
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-				return getDefaultLocale();
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-				return getDefaultRenderKitId();
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-				return getDefaultValidators();
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-				return getDefaultValue();
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-				return getExceptionHandlerFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-				return getExternalContextFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-				return getFacesConfig();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-				return getFacesContextFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-				return getFacet();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-				return getFacetExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-				return getFacetName();
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-				return getFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-				return getFromAction();
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-				return getFromOutcome();
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-				return getFromViewId();
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-				return getIcon();
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-				return getIf();
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-				return getKey();
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-				return getKeyClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-				return getLargeIcon();
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-				return getLifecycle();
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-				return getLifecycleFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-				return getListEntries();
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-				return getLocaleConfig();
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-				return getManagedBean();
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-				return getManagedBeanClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-				return getManagedBeanName();
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-				return getManagedBeanScope();
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-				return getManagedProperty();
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-				return getMapEntries();
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-				return getMapEntry();
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-				return getMessageBundle();
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-				return getName();
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-				return getNavigationCase();
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-				return getNavigationHandler();
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-				return getNavigationRule();
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-				return getNullValue();
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-				return getOrdering();
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-				return getOrderingOrdering();
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-				return getOthers();
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return getPartialViewContextFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-				return getPhaseListener();
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-				return getProperty();
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-				return getPropertyClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-				return getPropertyExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-				return getPropertyName();
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-				return getPropertyResolver();
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-				return getRedirect();
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-				return getRedirectViewParam();
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-				return getReferencedBean();
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-				return getReferencedBeanClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-				return getReferencedBeanName();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-				return getRenderer();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-				return getRendererClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-				return getRendererExtension();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-				return getRendererType();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-				return getRenderKit();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-				return getRenderKitClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-				return getRenderKitFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-				return getRenderKitId();
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-				return getResourceHandler();
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-				return getSmallIcon();
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-				return getSourceClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-				return getStateManager();
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-				return getSuggestedValue();
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-				return getSupportedLocale();
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-				return getSystemEventClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-				return getSystemEventListener();
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-				return getSystemEventListenerClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-				return getTagHandlerDelegateFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-				return getToViewId();
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-				return getValidator();
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-				return getValidatorClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-				return getValidatorId();
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-				return getValue();
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-				return getValueClass();
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-				return getVariableResolver();
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return getViewDeclarationLanguageFactory();
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-				return getViewHandler();
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				return getVisitContextFactory();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-				((FeatureMap.Internal)getMixed()).set(newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				((EStructuralFeature.Setting)getXMLNSPrefixMap()).set(newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				((EStructuralFeature.Setting)getXSISchemaLocation()).set(newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-				setAbsoluteOrdering((AbsoluteOrderingType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-				setActionListener((ActionListenerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-				setApplication((ApplicationType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-				setApplicationFactory((ApplicationFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-				setAttribute((AttributeType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-				setAttributeClass((AttributeClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-				setAttributeExtension((AttributeExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-				setAttributeName((AttributeNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-				setBehavior((BehaviorType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-				setBehaviorClass((BehaviorClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-				setBehaviorId((BehaviorIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-				setBehaviorExtension((BehaviorExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-				setComponent((ComponentType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-				setComponentClass((ComponentClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-				setComponentExtension((ComponentExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-				setComponentFamily((ComponentFamilyType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-				setComponentType((ComponentTypeType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-				setConverter((ConverterType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-				setConverterClass((ConverterClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-				setConverterForClass((ConverterForClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-				setConverterId((ConverterIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-				setDefaultLocale((DefaultLocaleType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-				setDefaultRenderKitId((DefaultRenderKitIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-				setDefaultValidators((DefaultValidatorsType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-				setDescription((DescriptionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-				setDisplayName((DisplayNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-				setExceptionHandlerFactory((ExceptionHandlerFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-				setExternalContextFactory((ExternalContextFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-				setFacesConfig((FacesConfigType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-				setFacesContextFactory((FacesContextFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-				setFacet((FacetType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-				setFacetExtension((FacetExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-				setFacetName((FacetNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-				setFactory((FactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-				setFromAction((FromActionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-				setFromOutcome((FromOutcomeType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-				setFromViewId((FromViewIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-				setIcon((IconType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-				setIf((IfType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-				setKey((KeyType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-				setKeyClass((KeyClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-				setLargeIcon((LargeIconType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-				setLifecycle((LifecycleType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-				setLifecycleFactory((LifecycleFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-				setListEntries((ListEntriesType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-				setLocaleConfig((LocaleConfigType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-				setManagedBean((ManagedBeanType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-				setManagedBeanClass((ManagedBeanClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-				setManagedBeanName((ManagedBeanNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-				setManagedBeanScope((ManagedBeanScopeType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-				setManagedProperty((ManagedPropertyType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-				setMapEntry((MapEntryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-				setMessageBundle((MessageBundleType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-				setName((NameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-				setNavigationCase((NavigationCaseType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-				setNavigationHandler((NavigationHandlerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-				setNavigationRule((NavigationRuleType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-				setNullValue((NullValueType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-				setOrdering((OrderingType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-				setOrderingOrdering((OrderingOrderingType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-				setOthers((OrderingOthersType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-				setPartialViewContextFactory((PartialViewContextFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-				setPhaseListener((PhaseListenerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-				setProperty((PropertyType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-				setPropertyExtension((PropertyExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-				setPropertyResolver((PropertyResolverType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-				setRedirect((RedirectType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-				setRedirectViewParam((RedirectViewParamType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-				setReferencedBean((ReferencedBeanType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-				setReferencedBeanClass((ReferencedBeanClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-				setReferencedBeanName((ReferencedBeanNameType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-				setRenderer((RendererType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-				setRendererClass((RendererClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-				setRendererExtension((RendererExtensionType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-				setRendererType((RendererTypeType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-				setRenderKit((RenderKitType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-				setRenderKitClass((RenderKitClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-				setRenderKitFactory((RenderKitFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-				setRenderKitId((RenderKitIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-				setResourceHandler((ResourceHandlerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-				setSmallIcon((SmallIconType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-				setSourceClass((SourceClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-				setStateManager((StateManagerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-				setSupportedLocale((SupportedLocaleType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-				setSystemEventClass((SystemEventClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-				setSystemEventListener((SystemEventListenerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-				setSystemEventListenerClass((SystemEventListenerClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-				setTagHandlerDelegateFactory((TagHandlerDelegateFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-				setToViewId((ToViewIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-				setValidator((ValidatorType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-				setValidatorClass((ValidatorClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-				setValidatorId((ValidatorIdType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-				setValue((ValueType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-				setValueClass((ValueClassType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-				setVariableResolver((VariableResolverType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				setViewDeclarationLanguageFactory((ViewDeclarationLanguageFactoryType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-				setViewHandler((ViewHandlerType)newValue);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				setVisitContextFactory((VisitContextFactoryType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-				getMixed().clear();
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				getXMLNSPrefixMap().clear();
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				getXSISchemaLocation().clear();
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-				setAbsoluteOrdering((AbsoluteOrderingType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-				setActionListener((ActionListenerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-				setApplication((ApplicationType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-				setApplicationFactory((ApplicationFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-				setAttribute((AttributeType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-				setAttributeClass((AttributeClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-				setAttributeExtension((AttributeExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-				setAttributeName((AttributeNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-				setBehavior((BehaviorType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-				setBehaviorClass((BehaviorClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-				setBehaviorId((BehaviorIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-				setBehaviorExtension((BehaviorExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-				setComponent((ComponentType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-				setComponentClass((ComponentClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-				setComponentExtension((ComponentExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-				setComponentFamily((ComponentFamilyType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-				setComponentType((ComponentTypeType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-				setConverter((ConverterType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-				setConverterClass((ConverterClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-				setConverterForClass((ConverterForClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-				setConverterId((ConverterIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-				setDefaultLocale((DefaultLocaleType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-				setDefaultRenderKitId((DefaultRenderKitIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-				setDefaultValidators((DefaultValidatorsType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-				setDescription((DescriptionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-				setDisplayName((DisplayNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-				setExceptionHandlerFactory((ExceptionHandlerFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-				setExternalContextFactory((ExternalContextFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-				setFacesConfig((FacesConfigType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-				setFacesContextFactory((FacesContextFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-				setFacet((FacetType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-				setFacetExtension((FacetExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-				setFacetName((FacetNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-				setFactory((FactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-				setFromAction((FromActionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-				setFromOutcome((FromOutcomeType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-				setFromViewId((FromViewIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-				setIcon((IconType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-				setIf((IfType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-				setKey((KeyType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-				setKeyClass((KeyClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-				setLargeIcon((LargeIconType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-				setLifecycle((LifecycleType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-				setLifecycleFactory((LifecycleFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-				setListEntries((ListEntriesType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-				setLocaleConfig((LocaleConfigType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-				setManagedBean((ManagedBeanType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-				setManagedBeanClass((ManagedBeanClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-				setManagedBeanName((ManagedBeanNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-				setManagedBeanScope((ManagedBeanScopeType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-				setManagedProperty((ManagedPropertyType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-				setMapEntry((MapEntryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-				setMessageBundle((MessageBundleType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-				setName((NameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-				setNavigationCase((NavigationCaseType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-				setNavigationHandler((NavigationHandlerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-				setNavigationRule((NavigationRuleType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-				setNullValue((NullValueType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-				setOrdering((OrderingType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-				setOrderingOrdering((OrderingOrderingType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-				setOthers((OrderingOthersType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-				setPartialViewContextFactory((PartialViewContextFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-				setPhaseListener((PhaseListenerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-				setProperty((PropertyType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-				setPropertyExtension((PropertyExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-				setPropertyResolver((PropertyResolverType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-				setRedirect((RedirectType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-				setRedirectViewParam((RedirectViewParamType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-				setReferencedBean((ReferencedBeanType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-				setReferencedBeanClass((ReferencedBeanClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-				setReferencedBeanName((ReferencedBeanNameType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-				setRenderer((RendererType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-				setRendererClass((RendererClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-				setRendererExtension((RendererExtensionType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-				setRendererType((RendererTypeType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-				setRenderKit((RenderKitType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-				setRenderKitClass((RenderKitClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-				setRenderKitFactory((RenderKitFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-				setRenderKitId((RenderKitIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-				setResourceHandler((ResourceHandlerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-				setSmallIcon((SmallIconType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-				setSourceClass((SourceClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-				setStateManager((StateManagerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-				setSupportedLocale((SupportedLocaleType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-				setSystemEventClass((SystemEventClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-				setSystemEventListener((SystemEventListenerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-				setSystemEventListenerClass((SystemEventListenerClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-				setTagHandlerDelegateFactory((TagHandlerDelegateFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-				setToViewId((ToViewIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-				setValidator((ValidatorType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-				setValidatorClass((ValidatorClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-				setValidatorId((ValidatorIdType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-				setValue((ValueType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-				setValueClass((ValueClassType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-				setVariableResolver((VariableResolverType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				setViewDeclarationLanguageFactory((ViewDeclarationLanguageFactoryType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-				setViewHandler((ViewHandlerType)null);
-				return;
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				setVisitContextFactory((VisitContextFactoryType)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DOCUMENT_ROOT__MIXED:
-				return mixed != null && !mixed.isEmpty();
-			case FacesConfigPackage.DOCUMENT_ROOT__XMLNS_PREFIX_MAP:
-				return xMLNSPrefixMap != null && !xMLNSPrefixMap.isEmpty();
-			case FacesConfigPackage.DOCUMENT_ROOT__XSI_SCHEMA_LOCATION:
-				return xSISchemaLocation != null && !xSISchemaLocation.isEmpty();
-			case FacesConfigPackage.DOCUMENT_ROOT__ABSOLUTE_ORDERING:
-				return getAbsoluteOrdering() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ACTION_LISTENER:
-				return getActionListener() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION:
-				return getApplication() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__APPLICATION_FACTORY:
-				return getApplicationFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE:
-				return getAttribute() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_CLASS:
-				return getAttributeClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_EXTENSION:
-				return getAttributeExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ATTRIBUTE_NAME:
-				return getAttributeName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR:
-				return getBehavior() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_CLASS:
-				return getBehaviorClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_ID:
-				return getBehaviorId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__BEHAVIOR_EXTENSION:
-				return getBehaviorExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT:
-				return getComponent() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_CLASS:
-				return getComponentClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_EXTENSION:
-				return getComponentExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_FAMILY:
-				return getComponentFamily() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__COMPONENT_TYPE:
-				return getComponentType() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER:
-				return getConverter() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_CLASS:
-				return getConverterClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_FOR_CLASS:
-				return getConverterForClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__CONVERTER_ID:
-				return getConverterId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_LOCALE:
-				return getDefaultLocale() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID:
-				return getDefaultRenderKitId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALIDATORS:
-				return getDefaultValidators() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DEFAULT_VALUE:
-				return getDefaultValue() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DESCRIPTION:
-				return getDescription() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__DISPLAY_NAME:
-				return getDisplayName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY:
-				return getExceptionHandlerFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY:
-				return getExternalContextFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONFIG:
-				return getFacesConfig() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACES_CONTEXT_FACTORY:
-				return getFacesContextFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET:
-				return getFacet() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_EXTENSION:
-				return getFacetExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACET_NAME:
-				return getFacetName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FACTORY:
-				return getFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_ACTION:
-				return getFromAction() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_OUTCOME:
-				return getFromOutcome() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__FROM_VIEW_ID:
-				return getFromViewId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ICON:
-				return getIcon() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__IF:
-				return getIf() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY:
-				return getKey() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__KEY_CLASS:
-				return getKeyClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__LARGE_ICON:
-				return getLargeIcon() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE:
-				return getLifecycle() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIFECYCLE_FACTORY:
-				return getLifecycleFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__LIST_ENTRIES:
-				return getListEntries() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__LOCALE_CONFIG:
-				return getLocaleConfig() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN:
-				return getManagedBean() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_CLASS:
-				return getManagedBeanClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_NAME:
-				return getManagedBeanName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_BEAN_SCOPE:
-				return getManagedBeanScope() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MANAGED_PROPERTY:
-				return getManagedProperty() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRIES:
-				return getMapEntries() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MAP_ENTRY:
-				return getMapEntry() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__MESSAGE_BUNDLE:
-				return getMessageBundle() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAME:
-				return getName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_CASE:
-				return getNavigationCase() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_HANDLER:
-				return getNavigationHandler() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__NAVIGATION_RULE:
-				return getNavigationRule() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__NULL_VALUE:
-				return getNullValue() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING:
-				return getOrdering() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__ORDERING_ORDERING:
-				return getOrderingOrdering() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__OTHERS:
-				return getOthers() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return getPartialViewContextFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PHASE_LISTENER:
-				return getPhaseListener() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY:
-				return getProperty() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_CLASS:
-				return getPropertyClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_EXTENSION:
-				return getPropertyExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_NAME:
-				return getPropertyName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__PROPERTY_RESOLVER:
-				return getPropertyResolver() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT:
-				return getRedirect() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__REDIRECT_VIEW_PARAM:
-				return getRedirectViewParam() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN:
-				return getReferencedBean() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_CLASS:
-				return getReferencedBeanClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__REFERENCED_BEAN_NAME:
-				return getReferencedBeanName() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER:
-				return getRenderer() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_CLASS:
-				return getRendererClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_EXTENSION:
-				return getRendererExtension() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDERER_TYPE:
-				return getRendererType() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT:
-				return getRenderKit() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_CLASS:
-				return getRenderKitClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_FACTORY:
-				return getRenderKitFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RENDER_KIT_ID:
-				return getRenderKitId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__RESOURCE_HANDLER:
-				return getResourceHandler() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SMALL_ICON:
-				return getSmallIcon() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SOURCE_CLASS:
-				return getSourceClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__STATE_MANAGER:
-				return getStateManager() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUGGESTED_VALUE:
-				return getSuggestedValue() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SUPPORTED_LOCALE:
-				return getSupportedLocale() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_CLASS:
-				return getSystemEventClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER:
-				return getSystemEventListener() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS:
-				return getSystemEventListenerClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY:
-				return getTagHandlerDelegateFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__TO_VIEW_ID:
-				return getToViewId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR:
-				return getValidator() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_CLASS:
-				return getValidatorClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALIDATOR_ID:
-				return getValidatorId() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE:
-				return getValue() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VALUE_CLASS:
-				return getValueClass() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VARIABLE_RESOLVER:
-				return getVariableResolver() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return getViewDeclarationLanguageFactory() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VIEW_HANDLER:
-				return getViewHandler() != null;
-			case FacesConfigPackage.DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY:
-				return getVisitContextFactory() != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (mixed: ");//$NON-NLS-1$
-		result.append(mixed);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DocumentRootImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicAttributeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicAttributeImpl.java
deleted file mode 100644
index 0105411..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicAttributeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Dynamic Attribute</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicAttributeImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DynamicAttributeImpl extends EObjectImpl implements DynamicAttribute {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String VALUE_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-    protected String value = VALUE_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected DynamicAttributeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DYNAMIC_ATTRIBUTE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getName() {
-		return name;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME, oldName, name));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getValue() {
-		return value;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE, oldValue, value));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-				return getName();
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-				return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-				setName((String)newValue);
-				return;
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: ");//$NON-NLS-1$
-		result.append(name);
-		result.append(", value: ");//$NON-NLS-1$
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DynamicAttributeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicElementImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicElementImpl.java
deleted file mode 100644
index 46b6e8a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/DynamicElementImpl.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Dynamic Element</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getAttributes <em>Attributes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.DynamicElementImpl#getTextContent <em>Text Content</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DynamicElementImpl extends EObjectImpl implements DynamicElement {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getChildNodes() <em>Child Nodes</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getChildNodes()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList childNodes;
-
-    /**
-	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String NAME_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-    protected String name = NAME_EDEFAULT;
-
-    /**
-	 * The cached value of the '{@link #getAttributes() <em>Attributes</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getAttributes()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList attributes;
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected DynamicElementImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.DYNAMIC_ELEMENT;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getChildNodes() {
-		if (childNodes == null) {
-			childNodes = new EObjectContainmentEList(DynamicElement.class, this, FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES);
-		}
-		return childNodes;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getAttributes() {
-		if (attributes == null) {
-			attributes = new EObjectResolvingEList(DynamicAttribute.class, this, FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES);
-		}
-		return attributes;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getName() {
-		return name;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setName(String newName) {
-		String oldName = name;
-		name = newName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.DYNAMIC_ELEMENT__NAME, oldName, name));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				return ((InternalEList)getChildNodes()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				return getChildNodes();
-			case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-				return getName();
-			case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-				return getAttributes();
-			case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-				return getTextContent();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				getChildNodes().clear();
-				getChildNodes().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-				setName((String)newValue);
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-				getAttributes().clear();
-				getAttributes().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				getChildNodes().clear();
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-				setName(NAME_EDEFAULT);
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-				getAttributes().clear();
-				return;
-			case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.DYNAMIC_ELEMENT__CHILD_NODES:
-				return childNodes != null && !childNodes.isEmpty();
-			case FacesConfigPackage.DYNAMIC_ELEMENT__NAME:
-				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case FacesConfigPackage.DYNAMIC_ELEMENT__ATTRIBUTES:
-				return attributes != null && !attributes.isEmpty();
-			case FacesConfigPackage.DYNAMIC_ELEMENT__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (name: ");//$NON-NLS-1$
-		result.append(name);
-		result.append(", textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(')');
-		return result.toString();
-	}
-
-} //DynamicElementImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ELResolverTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ELResolverTypeImpl.java
deleted file mode 100644
index 60006fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ELResolverTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ELResolverType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>EL Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ELResolverTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ELResolverTypeImpl extends EObjectImpl implements ELResolverType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ELResolverTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.EL_RESOLVER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EL_RESOLVER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EL_RESOLVER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.EL_RESOLVER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ELResolverTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExceptionHandlerFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExceptionHandlerFactoryTypeImpl.java
deleted file mode 100644
index fa5e031..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExceptionHandlerFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Exception Handler Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExceptionHandlerFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ExceptionHandlerFactoryTypeImpl extends EObjectImpl implements ExceptionHandlerFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExceptionHandlerFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.EXCEPTION_HANDLER_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExceptionHandlerFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExtensionTypeImpl.java
deleted file mode 100644
index acecd7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExtensionTypeImpl.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.ExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl#getChildNodes <em>Child Nodes</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExtensionTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public abstract class ExtensionTypeImpl extends EObjectImpl implements ExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getChildNodes() <em>Child Nodes</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getChildNodes()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList childNodes;
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.EXTENSION_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getChildNodes() {
-		if (childNodes == null) {
-			childNodes = new EObjectResolvingEList(DynamicElement.class, this, FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES);
-		}
-		return childNodes;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXTENSION_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-				return getChildNodes();
-			case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.EXTENSION_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-				getChildNodes().clear();
-				getChildNodes().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.EXTENSION_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-				getChildNodes().clear();
-				return;
-			case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.EXTENSION_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTENSION_TYPE__CHILD_NODES:
-				return childNodes != null && !childNodes.isEmpty();
-			case FacesConfigPackage.EXTENSION_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.EXTENSION_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExternalContextFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExternalContextFactoryTypeImpl.java
deleted file mode 100644
index f9d3685..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ExternalContextFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>External Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ExternalContextFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ExternalContextFactoryTypeImpl extends EObjectImpl implements ExternalContextFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExternalContextFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.EXTERNAL_CONTEXT_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: ");//$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: ");//$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExternalContextFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigExtensionTypeImpl.java
deleted file mode 100644
index 6f08de3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class FacesConfigExtensionTypeImpl extends ExtensionTypeImpl implements FacesConfigExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected FacesConfigExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACES_CONFIG_EXTENSION_TYPE;
-	}
-
-} //FacesConfigExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigFactoryImpl.java
deleted file mode 100644
index 9411297..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigFactoryImpl.java
+++ /dev/null
@@ -1,1440 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class FacesConfigFactoryImpl extends EFactoryImpl implements FacesConfigFactory {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the factory instance 
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public static FacesConfigFactory init() {
-		try {
-			FacesConfigFactory theFacesConfigFactory = (FacesConfigFactory)EPackage.Registry.INSTANCE.getEFactory("http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd"); //$NON-NLS-1$ 
-			if (theFacesConfigFactory != null) {
-				return theFacesConfigFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new FacesConfigFactoryImpl();
-	}
-
-    /**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigFactoryImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE: return createAbsoluteOrderingType();
-			case FacesConfigPackage.ACTION_LISTENER_TYPE: return createActionListenerType();
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE: return createApplicationFactoryType();
-			case FacesConfigPackage.APPLICATION_TYPE: return createApplicationType();
-			case FacesConfigPackage.APPLICATION_EXTENSION_TYPE: return createApplicationExtensionType();
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE: return createAttributeClassType();
-			case FacesConfigPackage.ATTRIBUTE_EXTENSION_TYPE: return createAttributeExtensionType();
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE: return createAttributeNameType();
-			case FacesConfigPackage.ATTRIBUTE_TYPE: return createAttributeType();
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE: return createBehaviorClassType();
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE: return createBehaviorIdType();
-			case FacesConfigPackage.BEHAVIOR_TYPE: return createBehaviorType();
-			case FacesConfigPackage.BEHAVIOR_EXTENSION_TYPE: return createBehaviorExtensionType();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE: return createClientBehaviorRendererClassType();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE: return createClientBehaviorRendererType();
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE: return createClientBehaviorRendererTypeType();
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE: return createComponentClassType();
-			case FacesConfigPackage.COMPONENT_EXTENSION_TYPE: return createComponentExtensionType();
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE: return createComponentFamilyType();
-			case FacesConfigPackage.COMPONENT_TYPE: return createComponentType();
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE: return createComponentTypeType();
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE: return createConverterClassType();
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE: return createConverterForClassType();
-			case FacesConfigPackage.CONVERTER_ID_TYPE: return createConverterIdType();
-			case FacesConfigPackage.CONVERTER_TYPE: return createConverterType();
-			case FacesConfigPackage.CONVERTER_EXTENSION_TYPE: return createConverterExtensionType();
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE: return createDefaultLocaleType();
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE: return createDefaultRenderKitIdType();
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE: return createDefaultValidatorsType();
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE: return createDefaultValueType();
-			case FacesConfigPackage.DESCRIPTION_TYPE: return createDescriptionType();
-			case FacesConfigPackage.DISPLAY_NAME_TYPE: return createDisplayNameType();
-			case FacesConfigPackage.DOCUMENT_ROOT: return createDocumentRoot();
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE: return createDynamicAttribute();
-			case FacesConfigPackage.DYNAMIC_ELEMENT: return createDynamicElement();
-			case FacesConfigPackage.EL_RESOLVER_TYPE: return createELResolverType();
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE: return createExceptionHandlerFactoryType();
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE: return createExternalContextFactoryType();
-			case FacesConfigPackage.FACES_CONFIG_TYPE: return createFacesConfigType();
-			case FacesConfigPackage.FACES_CONFIG_EXTENSION_TYPE: return createFacesConfigExtensionType();
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE: return createFacesContextFactoryType();
-			case FacesConfigPackage.FACET_EXTENSION_TYPE: return createFacetExtensionType();
-			case FacesConfigPackage.FACET_NAME_TYPE: return createFacetNameType();
-			case FacesConfigPackage.FACET_TYPE: return createFacetType();
-			case FacesConfigPackage.FACTORY_TYPE: return createFactoryType();
-			case FacesConfigPackage.FACTORY_EXTENSION_TYPE: return createFactoryExtensionType();
-			case FacesConfigPackage.FROM_ACTION_TYPE: return createFromActionType();
-			case FacesConfigPackage.FROM_OUTCOME_TYPE: return createFromOutcomeType();
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE: return createFromViewIdType();
-			case FacesConfigPackage.ICON_TYPE: return createIconType();
-			case FacesConfigPackage.IF_TYPE: return createIfType();
-			case FacesConfigPackage.KEY_CLASS_TYPE: return createKeyClassType();
-			case FacesConfigPackage.KEY_TYPE: return createKeyType();
-			case FacesConfigPackage.LARGE_ICON_TYPE: return createLargeIconType();
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE: return createLifecycleFactoryType();
-			case FacesConfigPackage.LIFECYCLE_TYPE: return createLifecycleType();
-			case FacesConfigPackage.LIFECYCLE_EXTENSION_TYPE: return createLifecycleExtensionType();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE: return createListEntriesType();
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE: return createLocaleConfigType();
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE: return createManagedBeanClassType();
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE: return createManagedBeanNameType();
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE: return createManagedBeanScopeType();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE: return createManagedBeanType();
-			case FacesConfigPackage.MANAGED_BEAN_EXTENSION_TYPE: return createManagedBeanExtensionType();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE: return createManagedPropertyType();
-			case FacesConfigPackage.MAP_ENTRIES_TYPE: return createMapEntriesType();
-			case FacesConfigPackage.MAP_ENTRY_TYPE: return createMapEntryType();
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE: return createMessageBundleType();
-			case FacesConfigPackage.NAME_TYPE: return createNameType();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE: return createNavigationCaseType();
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE: return createNavigationHandlerType();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE: return createNavigationRuleType();
-			case FacesConfigPackage.NAVIGATION_RULE_EXTENSION_TYPE: return createNavigationRuleExtensionType();
-			case FacesConfigPackage.NULL_VALUE_TYPE: return createNullValueType();
-			case FacesConfigPackage.ORDERING_TYPE: return createOrderingType();
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE: return createOrderingOrderingType();
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE: return createOrderingOthersType();
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE: return createPartialViewContextFactoryType();
-			case FacesConfigPackage.PHASE_LISTENER_TYPE: return createPhaseListenerType();
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE: return createPropertyClassType();
-			case FacesConfigPackage.PROPERTY_EXTENSION_TYPE: return createPropertyExtensionType();
-			case FacesConfigPackage.PROPERTY_NAME_TYPE: return createPropertyNameType();
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE: return createPropertyResolverType();
-			case FacesConfigPackage.PROPERTY_TYPE: return createPropertyType();
-			case FacesConfigPackage.REDIRECT_TYPE: return createRedirectType();
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE: return createRedirectViewParamType();
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE: return createReferencedBeanClassType();
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE: return createReferencedBeanNameType();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE: return createReferencedBeanType();
-			case FacesConfigPackage.RENDERER_CLASS_TYPE: return createRendererClassType();
-			case FacesConfigPackage.RENDERER_EXTENSION_TYPE: return createRendererExtensionType();
-			case FacesConfigPackage.RENDERER_TYPE: return createRendererType();
-			case FacesConfigPackage.RENDERER_TYPE_TYPE: return createRendererTypeType();
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE: return createRenderKitClassType();
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE: return createRenderKitFactoryType();
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE: return createRenderKitIdType();
-			case FacesConfigPackage.RENDER_KIT_TYPE: return createRenderKitType();
-			case FacesConfigPackage.RENDER_KIT_EXTENSION_TYPE: return createRenderKitExtensionType();
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE: return createResourceHandlerType();
-			case FacesConfigPackage.SMALL_ICON_TYPE: return createSmallIconType();
-			case FacesConfigPackage.SOURCE_CLASS_TYPE: return createSourceClassType();
-			case FacesConfigPackage.STATE_MANAGER_TYPE: return createStateManagerType();
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE: return createSuggestedValueType();
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE: return createSupportedLocaleType();
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE: return createSystemEventClassType();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE: return createSystemEventListenerClassType();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE: return createSystemEventListenerType();
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE: return createTagHandlerDelegateFactoryType();
-			case FacesConfigPackage.TO_VIEW_ID_TYPE: return createToViewIdType();
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE: return createValidatorClassType();
-			case FacesConfigPackage.VALIDATOR_ID_TYPE: return createValidatorIdType();
-			case FacesConfigPackage.VALIDATOR_TYPE: return createValidatorType();
-			case FacesConfigPackage.VALIDATOR_EXTENSION_TYPE: return createValidatorExtensionType();
-			case FacesConfigPackage.VALUE_CLASS_TYPE: return createValueClassType();
-			case FacesConfigPackage.VALUE_TYPE: return createValueType();
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE: return createVariableResolverType();
-			case FacesConfigPackage.VIEW_HANDLER_TYPE: return createViewHandlerType();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE: return createResourceBundleType();
-			case FacesConfigPackage.BASE_NAME_TYPE: return createBaseNameType();
-			case FacesConfigPackage.VAR_TYPE: return createVarType();
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE: return createViewDeclarationLanguageFactoryType();
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE: return createVisitContextFactoryType();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AbsoluteOrderingType createAbsoluteOrderingType() {
-		AbsoluteOrderingTypeImpl absoluteOrderingType = new AbsoluteOrderingTypeImpl();
-		return absoluteOrderingType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ActionListenerType createActionListenerType() {
-		ActionListenerTypeImpl actionListenerType = new ActionListenerTypeImpl();
-		return actionListenerType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationFactoryType createApplicationFactoryType() {
-		ApplicationFactoryTypeImpl applicationFactoryType = new ApplicationFactoryTypeImpl();
-		return applicationFactoryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ApplicationType createApplicationType() {
-		ApplicationTypeImpl applicationType = new ApplicationTypeImpl();
-		return applicationType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeClassType createAttributeClassType() {
-		AttributeClassTypeImpl attributeClassType = new AttributeClassTypeImpl();
-		return attributeClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeExtensionType createAttributeExtensionType() {
-		AttributeExtensionTypeImpl attributeExtensionType = new AttributeExtensionTypeImpl();
-		return attributeExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeNameType createAttributeNameType() {
-		AttributeNameTypeImpl attributeNameType = new AttributeNameTypeImpl();
-		return attributeNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AttributeType createAttributeType() {
-		AttributeTypeImpl attributeType = new AttributeTypeImpl();
-		return attributeType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorClassType createBehaviorClassType() {
-		BehaviorClassTypeImpl behaviorClassType = new BehaviorClassTypeImpl();
-		return behaviorClassType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorIdType createBehaviorIdType() {
-		BehaviorIdTypeImpl behaviorIdType = new BehaviorIdTypeImpl();
-		return behaviorIdType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorType createBehaviorType() {
-		BehaviorTypeImpl behaviorType = new BehaviorTypeImpl();
-		return behaviorType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BehaviorExtensionType createBehaviorExtensionType() {
-		BehaviorExtensionTypeImpl behaviorExtensionType = new BehaviorExtensionTypeImpl();
-		return behaviorExtensionType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererClassType createClientBehaviorRendererClassType() {
-		ClientBehaviorRendererClassTypeImpl clientBehaviorRendererClassType = new ClientBehaviorRendererClassTypeImpl();
-		return clientBehaviorRendererClassType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererType createClientBehaviorRendererType() {
-		ClientBehaviorRendererTypeImpl clientBehaviorRendererType = new ClientBehaviorRendererTypeImpl();
-		return clientBehaviorRendererType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ClientBehaviorRendererTypeType createClientBehaviorRendererTypeType() {
-		ClientBehaviorRendererTypeTypeImpl clientBehaviorRendererTypeType = new ClientBehaviorRendererTypeTypeImpl();
-		return clientBehaviorRendererTypeType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentClassType createComponentClassType() {
-		ComponentClassTypeImpl componentClassType = new ComponentClassTypeImpl();
-		return componentClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentExtensionType createComponentExtensionType() {
-		ComponentExtensionTypeImpl componentExtensionType = new ComponentExtensionTypeImpl();
-		return componentExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentFamilyType createComponentFamilyType() {
-		ComponentFamilyTypeImpl componentFamilyType = new ComponentFamilyTypeImpl();
-		return componentFamilyType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentType createComponentType() {
-		ComponentTypeImpl componentType = new ComponentTypeImpl();
-		return componentType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentTypeType createComponentTypeType() {
-		ComponentTypeTypeImpl componentTypeType = new ComponentTypeTypeImpl();
-		return componentTypeType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterClassType createConverterClassType() {
-		ConverterClassTypeImpl converterClassType = new ConverterClassTypeImpl();
-		return converterClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterForClassType createConverterForClassType() {
-		ConverterForClassTypeImpl converterForClassType = new ConverterForClassTypeImpl();
-		return converterForClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterIdType createConverterIdType() {
-		ConverterIdTypeImpl converterIdType = new ConverterIdTypeImpl();
-		return converterIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ConverterType createConverterType() {
-		ConverterTypeImpl converterType = new ConverterTypeImpl();
-		return converterType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultLocaleType createDefaultLocaleType() {
-		DefaultLocaleTypeImpl defaultLocaleType = new DefaultLocaleTypeImpl();
-		return defaultLocaleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultRenderKitIdType createDefaultRenderKitIdType() {
-		DefaultRenderKitIdTypeImpl defaultRenderKitIdType = new DefaultRenderKitIdTypeImpl();
-		return defaultRenderKitIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValidatorsType createDefaultValidatorsType() {
-		DefaultValidatorsTypeImpl defaultValidatorsType = new DefaultValidatorsTypeImpl();
-		return defaultValidatorsType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValueType createDefaultValueType() {
-		DefaultValueTypeImpl defaultValueType = new DefaultValueTypeImpl();
-		return defaultValueType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DescriptionType createDescriptionType() {
-		DescriptionTypeImpl descriptionType = new DescriptionTypeImpl();
-		return descriptionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DisplayNameType createDisplayNameType() {
-		DisplayNameTypeImpl displayNameType = new DisplayNameTypeImpl();
-		return displayNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DocumentRoot createDocumentRoot() {
-		DocumentRootImpl documentRoot = new DocumentRootImpl();
-		return documentRoot;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public DynamicAttribute createDynamicAttribute() {
-		DynamicAttributeImpl dynamicAttribute = new DynamicAttributeImpl();
-		return dynamicAttribute;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public DynamicElement createDynamicElement() {
-		DynamicElementImpl dynamicElement = new DynamicElementImpl();
-		return dynamicElement;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ELResolverType createELResolverType() {
-		ELResolverTypeImpl elResolverType = new ELResolverTypeImpl();
-		return elResolverType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExceptionHandlerFactoryType createExceptionHandlerFactoryType() {
-		ExceptionHandlerFactoryTypeImpl exceptionHandlerFactoryType = new ExceptionHandlerFactoryTypeImpl();
-		return exceptionHandlerFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExternalContextFactoryType createExternalContextFactoryType() {
-		ExternalContextFactoryTypeImpl externalContextFactoryType = new ExternalContextFactoryTypeImpl();
-		return externalContextFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigType createFacesConfigType() {
-		FacesConfigTypeImpl facesConfigType = new FacesConfigTypeImpl();
-		return facesConfigType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesContextFactoryType createFacesContextFactoryType() {
-		FacesContextFactoryTypeImpl facesContextFactoryType = new FacesContextFactoryTypeImpl();
-		return facesContextFactoryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetExtensionType createFacetExtensionType() {
-		FacetExtensionTypeImpl facetExtensionType = new FacetExtensionTypeImpl();
-		return facetExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetNameType createFacetNameType() {
-		FacetNameTypeImpl facetNameType = new FacetNameTypeImpl();
-		return facetNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetType createFacetType() {
-		FacetTypeImpl facetType = new FacetTypeImpl();
-		return facetType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FactoryType createFactoryType() {
-		FactoryTypeImpl factoryType = new FactoryTypeImpl();
-		return factoryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromActionType createFromActionType() {
-		FromActionTypeImpl fromActionType = new FromActionTypeImpl();
-		return fromActionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromOutcomeType createFromOutcomeType() {
-		FromOutcomeTypeImpl fromOutcomeType = new FromOutcomeTypeImpl();
-		return fromOutcomeType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromViewIdType createFromViewIdType() {
-		FromViewIdTypeImpl fromViewIdType = new FromViewIdTypeImpl();
-		return fromViewIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IconType createIconType() {
-		IconTypeImpl iconType = new IconTypeImpl();
-		return iconType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IfType createIfType() {
-		IfTypeImpl ifType = new IfTypeImpl();
-		return ifType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyClassType createKeyClassType() {
-		KeyClassTypeImpl keyClassType = new KeyClassTypeImpl();
-		return keyClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyType createKeyType() {
-		KeyTypeImpl keyType = new KeyTypeImpl();
-		return keyType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LargeIconType createLargeIconType() {
-		LargeIconTypeImpl largeIconType = new LargeIconTypeImpl();
-		return largeIconType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleFactoryType createLifecycleFactoryType() {
-		LifecycleFactoryTypeImpl lifecycleFactoryType = new LifecycleFactoryTypeImpl();
-		return lifecycleFactoryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LifecycleType createLifecycleType() {
-		LifecycleTypeImpl lifecycleType = new LifecycleTypeImpl();
-		return lifecycleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ListEntriesType createListEntriesType() {
-		ListEntriesTypeImpl listEntriesType = new ListEntriesTypeImpl();
-		return listEntriesType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LocaleConfigType createLocaleConfigType() {
-		LocaleConfigTypeImpl localeConfigType = new LocaleConfigTypeImpl();
-		return localeConfigType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanClassType createManagedBeanClassType() {
-		ManagedBeanClassTypeImpl managedBeanClassType = new ManagedBeanClassTypeImpl();
-		return managedBeanClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanNameType createManagedBeanNameType() {
-		ManagedBeanNameTypeImpl managedBeanNameType = new ManagedBeanNameTypeImpl();
-		return managedBeanNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanScopeType createManagedBeanScopeType() {
-		ManagedBeanScopeTypeImpl managedBeanScopeType = new ManagedBeanScopeTypeImpl();
-		return managedBeanScopeType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanType createManagedBeanType() {
-		ManagedBeanTypeImpl managedBeanType = new ManagedBeanTypeImpl();
-		return managedBeanType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedPropertyType createManagedPropertyType() {
-		ManagedPropertyTypeImpl managedPropertyType = new ManagedPropertyTypeImpl();
-		return managedPropertyType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntriesType createMapEntriesType() {
-		MapEntriesTypeImpl mapEntriesType = new MapEntriesTypeImpl();
-		return mapEntriesType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntryType createMapEntryType() {
-		MapEntryTypeImpl mapEntryType = new MapEntryTypeImpl();
-		return mapEntryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MessageBundleType createMessageBundleType() {
-		MessageBundleTypeImpl messageBundleType = new MessageBundleTypeImpl();
-		return messageBundleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NameType createNameType() {
-		NameTypeImpl nameType = new NameTypeImpl();
-		return nameType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationCaseType createNavigationCaseType() {
-		NavigationCaseTypeImpl navigationCaseType = new NavigationCaseTypeImpl();
-		return navigationCaseType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationHandlerType createNavigationHandlerType() {
-		NavigationHandlerTypeImpl navigationHandlerType = new NavigationHandlerTypeImpl();
-		return navigationHandlerType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NavigationRuleType createNavigationRuleType() {
-		NavigationRuleTypeImpl navigationRuleType = new NavigationRuleTypeImpl();
-		return navigationRuleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NullValueType createNullValueType() {
-		NullValueTypeImpl nullValueType = new NullValueTypeImpl();
-		return nullValueType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingType createOrderingType() {
-		OrderingTypeImpl orderingType = new OrderingTypeImpl();
-		return orderingType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOrderingType createOrderingOrderingType() {
-		OrderingOrderingTypeImpl orderingOrderingType = new OrderingOrderingTypeImpl();
-		return orderingOrderingType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOthersType createOrderingOthersType() {
-		OrderingOthersTypeImpl orderingOthersType = new OrderingOthersTypeImpl();
-		return orderingOthersType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PartialViewContextFactoryType createPartialViewContextFactoryType() {
-		PartialViewContextFactoryTypeImpl partialViewContextFactoryType = new PartialViewContextFactoryTypeImpl();
-		return partialViewContextFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PhaseListenerType createPhaseListenerType() {
-		PhaseListenerTypeImpl phaseListenerType = new PhaseListenerTypeImpl();
-		return phaseListenerType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyClassType createPropertyClassType() {
-		PropertyClassTypeImpl propertyClassType = new PropertyClassTypeImpl();
-		return propertyClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyExtensionType createPropertyExtensionType() {
-		PropertyExtensionTypeImpl propertyExtensionType = new PropertyExtensionTypeImpl();
-		return propertyExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyNameType createPropertyNameType() {
-		PropertyNameTypeImpl propertyNameType = new PropertyNameTypeImpl();
-		return propertyNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyResolverType createPropertyResolverType() {
-		PropertyResolverTypeImpl propertyResolverType = new PropertyResolverTypeImpl();
-		return propertyResolverType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyType createPropertyType() {
-		PropertyTypeImpl propertyType = new PropertyTypeImpl();
-		return propertyType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectType createRedirectType() {
-		RedirectTypeImpl redirectType = new RedirectTypeImpl();
-		return redirectType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectViewParamType createRedirectViewParamType() {
-		RedirectViewParamTypeImpl redirectViewParamType = new RedirectViewParamTypeImpl();
-		return redirectViewParamType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanClassType createReferencedBeanClassType() {
-		ReferencedBeanClassTypeImpl referencedBeanClassType = new ReferencedBeanClassTypeImpl();
-		return referencedBeanClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanNameType createReferencedBeanNameType() {
-		ReferencedBeanNameTypeImpl referencedBeanNameType = new ReferencedBeanNameTypeImpl();
-		return referencedBeanNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanType createReferencedBeanType() {
-		ReferencedBeanTypeImpl referencedBeanType = new ReferencedBeanTypeImpl();
-		return referencedBeanType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererClassType createRendererClassType() {
-		RendererClassTypeImpl rendererClassType = new RendererClassTypeImpl();
-		return rendererClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererExtensionType createRendererExtensionType() {
-		RendererExtensionTypeImpl rendererExtensionType = new RendererExtensionTypeImpl();
-		return rendererExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererType createRendererType() {
-		RendererTypeImpl rendererType = new RendererTypeImpl();
-		return rendererType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererTypeType createRendererTypeType() {
-		RendererTypeTypeImpl rendererTypeType = new RendererTypeTypeImpl();
-		return rendererTypeType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitClassType createRenderKitClassType() {
-		RenderKitClassTypeImpl renderKitClassType = new RenderKitClassTypeImpl();
-		return renderKitClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitFactoryType createRenderKitFactoryType() {
-		RenderKitFactoryTypeImpl renderKitFactoryType = new RenderKitFactoryTypeImpl();
-		return renderKitFactoryType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitIdType createRenderKitIdType() {
-		RenderKitIdTypeImpl renderKitIdType = new RenderKitIdTypeImpl();
-		return renderKitIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitType createRenderKitType() {
-		RenderKitTypeImpl renderKitType = new RenderKitTypeImpl();
-		return renderKitType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SmallIconType createSmallIconType() {
-		SmallIconTypeImpl smallIconType = new SmallIconTypeImpl();
-		return smallIconType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SourceClassType createSourceClassType() {
-		SourceClassTypeImpl sourceClassType = new SourceClassTypeImpl();
-		return sourceClassType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public StateManagerType createStateManagerType() {
-		StateManagerTypeImpl stateManagerType = new StateManagerTypeImpl();
-		return stateManagerType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SuggestedValueType createSuggestedValueType() {
-		SuggestedValueTypeImpl suggestedValueType = new SuggestedValueTypeImpl();
-		return suggestedValueType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SupportedLocaleType createSupportedLocaleType() {
-		SupportedLocaleTypeImpl supportedLocaleType = new SupportedLocaleTypeImpl();
-		return supportedLocaleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventClassType createSystemEventClassType() {
-		SystemEventClassTypeImpl systemEventClassType = new SystemEventClassTypeImpl();
-		return systemEventClassType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerClassType createSystemEventListenerClassType() {
-		SystemEventListenerClassTypeImpl systemEventListenerClassType = new SystemEventListenerClassTypeImpl();
-		return systemEventListenerClassType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerType createSystemEventListenerType() {
-		SystemEventListenerTypeImpl systemEventListenerType = new SystemEventListenerTypeImpl();
-		return systemEventListenerType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagHandlerDelegateFactoryType createTagHandlerDelegateFactoryType() {
-		TagHandlerDelegateFactoryTypeImpl tagHandlerDelegateFactoryType = new TagHandlerDelegateFactoryTypeImpl();
-		return tagHandlerDelegateFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToViewIdType createToViewIdType() {
-		ToViewIdTypeImpl toViewIdType = new ToViewIdTypeImpl();
-		return toViewIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorClassType createValidatorClassType() {
-		ValidatorClassTypeImpl validatorClassType = new ValidatorClassTypeImpl();
-		return validatorClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorIdType createValidatorIdType() {
-		ValidatorIdTypeImpl validatorIdType = new ValidatorIdTypeImpl();
-		return validatorIdType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorType createValidatorType() {
-		ValidatorTypeImpl validatorType = new ValidatorTypeImpl();
-		return validatorType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueClassType createValueClassType() {
-		ValueClassTypeImpl valueClassType = new ValueClassTypeImpl();
-		return valueClassType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueType createValueType() {
-		ValueTypeImpl valueType = new ValueTypeImpl();
-		return valueType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VariableResolverType createVariableResolverType() {
-		VariableResolverTypeImpl variableResolverType = new VariableResolverTypeImpl();
-		return variableResolverType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewHandlerType createViewHandlerType() {
-		ViewHandlerTypeImpl viewHandlerType = new ViewHandlerTypeImpl();
-		return viewHandlerType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ApplicationExtensionType createApplicationExtensionType() {
-		ApplicationExtensionTypeImpl applicationExtensionType = new ApplicationExtensionTypeImpl();
-		return applicationExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ResourceBundleType createResourceBundleType() {
-		ResourceBundleTypeImpl resourceBundleType = new ResourceBundleTypeImpl();
-		return resourceBundleType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public BaseNameType createBaseNameType() {
-		BaseNameTypeImpl baseNameType = new BaseNameTypeImpl();
-		return baseNameType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public VarType createVarType() {
-		VarTypeImpl varType = new VarTypeImpl();
-		return varType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ViewDeclarationLanguageFactoryType createViewDeclarationLanguageFactoryType() {
-		ViewDeclarationLanguageFactoryTypeImpl viewDeclarationLanguageFactoryType = new ViewDeclarationLanguageFactoryTypeImpl();
-		return viewDeclarationLanguageFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public VisitContextFactoryType createVisitContextFactoryType() {
-		VisitContextFactoryTypeImpl visitContextFactoryType = new VisitContextFactoryTypeImpl();
-		return visitContextFactoryType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public RenderKitExtensionType createRenderKitExtensionType() {
-		RenderKitExtensionTypeImpl renderKitExtensionType = new RenderKitExtensionTypeImpl();
-		return renderKitExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResourceHandlerType createResourceHandlerType() {
-		ResourceHandlerTypeImpl resourceHandlerType = new ResourceHandlerTypeImpl();
-		return resourceHandlerType;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NavigationRuleExtensionType createNavigationRuleExtensionType() {
-		NavigationRuleExtensionTypeImpl navigationRuleExtensionType = new NavigationRuleExtensionTypeImpl();
-		return navigationRuleExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ValidatorExtensionType createValidatorExtensionType() {
-		ValidatorExtensionTypeImpl validatorExtensionType = new ValidatorExtensionTypeImpl();
-		return validatorExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public FacesConfigExtensionType createFacesConfigExtensionType() {
-		FacesConfigExtensionTypeImpl facesConfigExtensionType = new FacesConfigExtensionTypeImpl();
-		return facesConfigExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public FactoryExtensionType createFactoryExtensionType() {
-		FactoryExtensionTypeImpl factoryExtensionType = new FactoryExtensionTypeImpl();
-		return factoryExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public LifecycleExtensionType createLifecycleExtensionType() {
-		LifecycleExtensionTypeImpl lifecycleExtensionType = new LifecycleExtensionTypeImpl();
-		return lifecycleExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ManagedBeanExtensionType createManagedBeanExtensionType() {
-		ManagedBeanExtensionTypeImpl managedBeanExtensionType = new ManagedBeanExtensionTypeImpl();
-		return managedBeanExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public ConverterExtensionType createConverterExtensionType() {
-		ConverterExtensionTypeImpl converterExtensionType = new ConverterExtensionTypeImpl();
-		return converterExtensionType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigPackage getFacesConfigPackage() {
-		return (FacesConfigPackage)getEPackage();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @return the package 
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static FacesConfigPackage getPackage() {
-		return FacesConfigPackage.eINSTANCE;
-	}
-
-} //FacesConfigFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigPackageImpl.java
deleted file mode 100644
index 3a9ae60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigPackageImpl.java
+++ /dev/null
@@ -1,12418 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-@SuppressWarnings("nls")
-public class FacesConfigPackageImpl extends EPackageImpl implements FacesConfigPackage {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; 
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass absoluteOrderingTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass actionListenerTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass applicationFactoryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass applicationTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass attributeClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass attributeExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass attributeNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass attributeTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behaviorClassTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behaviorIdTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behaviorTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass behaviorExtensionTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass clientBehaviorRendererClassTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass clientBehaviorRendererTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass clientBehaviorRendererTypeTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentFamilyTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass componentTypeTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass converterClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass converterForClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass converterIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass converterTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass defaultLocaleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass defaultRenderKitIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass defaultValidatorsTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass defaultValueTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass descriptionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass displayNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass documentRootEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass dynamicAttributeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass dynamicElementEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass elResolverTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass exceptionHandlerFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass facesConfigTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass facesContextFactoryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass facetExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass facetNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass facetTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass factoryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass fromActionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass fromOutcomeTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass fromViewIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass iconTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass ifTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass keyClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass keyTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass largeIconTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass lifecycleFactoryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass lifecycleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass listEntriesTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass localeConfigTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass managedBeanClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass managedBeanNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass managedBeanScopeTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass managedBeanTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass managedPropertyTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass mapEntriesTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass mapEntryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass messageBundleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass nameTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass navigationCaseTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass navigationHandlerTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass navigationRuleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass nullValueTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass orderingTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass orderingOrderingTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass orderingOthersTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass partialViewContextFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass phaseListenerTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyResolverTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass propertyTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass redirectTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass redirectViewParamTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass referencedBeanClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass referencedBeanNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass referencedBeanTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass rendererClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass rendererExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass rendererTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass rendererTypeTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass renderKitClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass renderKitFactoryTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass renderKitIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass renderKitTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass smallIconTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass sourceClassTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass stateManagerTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass suggestedValueTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass supportedLocaleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass systemEventClassTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass systemEventListenerClassTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass systemEventListenerTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagHandlerDelegateFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass toViewIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass validatorClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass validatorIdTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass validatorTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass valueClassTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass valueTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass variableResolverTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass viewHandlerTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass resourceBundleTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass baseNameTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass varTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass viewDeclarationLanguageFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass visitContextFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass renderKitExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass resourceHandlerTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass navigationRuleExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass validatorExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass facesConfigExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass factoryExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass lifecycleExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass managedBeanExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass converterExtensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass extensionTypeEClass = null;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass externalContextFactoryTypeEClass = null;
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    private EClass applicationExtensionTypeEClass = null;
-
-    /**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private FacesConfigPackageImpl() {
-		super(eNS_URI, FacesConfigFactory.eINSTANCE);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-    /**
-	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
-	 * 
-	 * <p>This method is used to initialize {@link FacesConfigPackage#eINSTANCE} when that field is accessed.
-	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
-	 * <!-- begin-user-doc -->
-     * @return the package 
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static FacesConfigPackage init() {
-		if (isInited) return (FacesConfigPackage)EPackage.Registry.INSTANCE.getEPackage(FacesConfigPackage.eNS_URI);
-
-		// Obtain or create and register package
-		FacesConfigPackageImpl theFacesConfigPackage = (FacesConfigPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof FacesConfigPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new FacesConfigPackageImpl());
-
-		isInited = true;
-
-		// Initialize simple dependencies
-		XMLTypePackage.eINSTANCE.eClass();
-
-		// Create package meta-data objects
-		theFacesConfigPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theFacesConfigPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theFacesConfigPackage.freeze();
-
-  
-		// Update the registry and return the package
-		EPackage.Registry.INSTANCE.put(FacesConfigPackage.eNS_URI, theFacesConfigPackage);
-		return theFacesConfigPackage;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAbsoluteOrderingType() {
-		return absoluteOrderingTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAbsoluteOrderingType_Name() {
-		return (EReference)absoluteOrderingTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAbsoluteOrderingType_Others() {
-		return (EReference)absoluteOrderingTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getActionListenerType() {
-		return actionListenerTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActionListenerType_TextContent() {
-		return (EAttribute)actionListenerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getActionListenerType_Id() {
-		return (EAttribute)actionListenerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getApplicationFactoryType() {
-		return applicationFactoryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getApplicationFactoryType_TextContent() {
-		return (EAttribute)applicationFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getApplicationFactoryType_Id() {
-		return (EAttribute)applicationFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getApplicationType() {
-		return applicationTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_ActionListener() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_DefaultRenderKitId() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_MessageBundle() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_NavigationHandler() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_ViewHandler() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_StateManager() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_PropertyResolver() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_VariableResolver() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_ResourceHandler() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_SystemEventListener() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(10);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_LocaleConfig() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(11);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getApplicationType_Id() {
-		return (EAttribute)applicationTypeEClass.getEStructuralFeatures().get(15);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getApplicationType_ELResolver() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getApplicationType_ResourceBundle() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(12);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getApplicationType_ApplicationExtension() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(13);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getApplicationType_DefaultValidators() {
-		return (EReference)applicationTypeEClass.getEStructuralFeatures().get(14);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAttributeClassType() {
-		return attributeClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAttributeClassType_TextContent() {
-		return (EAttribute)attributeClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAttributeClassType_Id() {
-		return (EAttribute)attributeClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAttributeExtensionType() {
-		return attributeExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAttributeNameType() {
-		return attributeNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAttributeNameType_TextContent() {
-		return (EAttribute)attributeNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAttributeNameType_Id() {
-		return (EAttribute)attributeNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAttributeType() {
-		return attributeTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_Description() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_DisplayName() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_Icon() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_AttributeName() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_AttributeClass() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_DefaultValue() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_SuggestedValue() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getAttributeType_AttributeExtension() {
-		return (EReference)attributeTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAttributeType_Id() {
-		return (EAttribute)attributeTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehaviorClassType() {
-		return behaviorClassTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehaviorClassType_TextContent() {
-		return (EAttribute)behaviorClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehaviorClassType_Id() {
-		return (EAttribute)behaviorClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehaviorIdType() {
-		return behaviorIdTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehaviorIdType_TextContent() {
-		return (EAttribute)behaviorIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBehaviorIdType_Id() {
-		return (EAttribute)behaviorIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehaviorType() {
-		return behaviorTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_Description() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_DisplayName() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_Icon() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_BehaviorId() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_BehaviorClass() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_Attribute() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_Property() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBehaviorType_BehaviorExtension() {
-		return (EReference)behaviorTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBehaviorExtensionType() {
-		return behaviorExtensionTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClientBehaviorRendererClassType() {
-		return clientBehaviorRendererClassTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClientBehaviorRendererClassType_TextContent() {
-		return (EAttribute)clientBehaviorRendererClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClientBehaviorRendererClassType_Id() {
-		return (EAttribute)clientBehaviorRendererClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClientBehaviorRendererType() {
-		return clientBehaviorRendererTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClientBehaviorRendererType_ClientBehaviorRendererType() {
-		return (EReference)clientBehaviorRendererTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getClientBehaviorRendererType_ClientBehaviorRendererClass() {
-		return (EReference)clientBehaviorRendererTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getClientBehaviorRendererTypeType() {
-		return clientBehaviorRendererTypeTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClientBehaviorRendererTypeType_TextContent() {
-		return (EAttribute)clientBehaviorRendererTypeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getClientBehaviorRendererTypeType_Id() {
-		return (EAttribute)clientBehaviorRendererTypeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentClassType() {
-		return componentClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentClassType_TextContent() {
-		return (EAttribute)componentClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentClassType_Id() {
-		return (EAttribute)componentClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentExtensionType() {
-		return componentExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentFamilyType() {
-		return componentFamilyTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentFamilyType_TextContent() {
-		return (EAttribute)componentFamilyTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentFamilyType_Id() {
-		return (EAttribute)componentFamilyTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentType() {
-		return componentTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Description() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_DisplayName() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Icon() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_ComponentType() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_ComponentClass() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Facet() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Attribute() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_Property() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getComponentType_ComponentExtension() {
-		return (EReference)componentTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentType_Id() {
-		return (EAttribute)componentTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getComponentTypeType() {
-		return componentTypeTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentTypeType_TextContent() {
-		return (EAttribute)componentTypeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getComponentTypeType_Id() {
-		return (EAttribute)componentTypeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConverterClassType() {
-		return converterClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterClassType_TextContent() {
-		return (EAttribute)converterClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterClassType_Id() {
-		return (EAttribute)converterClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConverterForClassType() {
-		return converterForClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterForClassType_TextContent() {
-		return (EAttribute)converterForClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterForClassType_Id() {
-		return (EAttribute)converterForClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConverterIdType() {
-		return converterIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterIdType_TextContent() {
-		return (EAttribute)converterIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterIdType_Id() {
-		return (EAttribute)converterIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getConverterType() {
-		return converterTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_Description() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_DisplayName() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_Icon() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_ConverterId() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_ConverterForClass() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_ConverterClass() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_Attribute() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getConverterType_Property() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getConverterType_ConverterExtension() {
-		return (EReference)converterTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getConverterType_Id() {
-		return (EAttribute)converterTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDefaultLocaleType() {
-		return defaultLocaleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultLocaleType_TextContent() {
-		return (EAttribute)defaultLocaleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultLocaleType_Id() {
-		return (EAttribute)defaultLocaleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDefaultRenderKitIdType() {
-		return defaultRenderKitIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultRenderKitIdType_TextContent() {
-		return (EAttribute)defaultRenderKitIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultRenderKitIdType_Id() {
-		return (EAttribute)defaultRenderKitIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDefaultValidatorsType() {
-		return defaultValidatorsTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDefaultValidatorsType_ValidatorId() {
-		return (EReference)defaultValidatorsTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultValidatorsType_Id() {
-		return (EAttribute)defaultValidatorsTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDefaultValueType() {
-		return defaultValueTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultValueType_TextContent() {
-		return (EAttribute)defaultValueTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDefaultValueType_Id() {
-		return (EAttribute)defaultValueTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDescriptionType() {
-		return descriptionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescriptionType_TextContent() {
-		return (EAttribute)descriptionTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescriptionType_Lang() {
-		return (EAttribute)descriptionTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDescriptionType_Id() {
-		return (EAttribute)descriptionTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDisplayNameType() {
-		return displayNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDisplayNameType_TextContent() {
-		return (EAttribute)displayNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDisplayNameType_Lang() {
-		return (EAttribute)displayNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDisplayNameType_Id() {
-		return (EAttribute)displayNameTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDocumentRoot() {
-		return documentRootEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getDocumentRoot_Mixed() {
-		return (EAttribute)documentRootEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_XMLNSPrefixMap() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_XSISchemaLocation() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_AbsoluteOrdering() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(3);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ActionListener() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Application() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ApplicationFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Attribute() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_AttributeClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_AttributeExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_AttributeName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(10);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Behavior() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(11);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_BehaviorClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(12);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_BehaviorId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(13);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_BehaviorExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(14);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Component() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(15);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ComponentClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(16);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ComponentExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(17);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ComponentFamily() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(18);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ComponentType() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(19);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Converter() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(20);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ConverterClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(21);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ConverterForClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(22);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ConverterId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(23);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_DefaultLocale() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(24);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_DefaultRenderKitId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(25);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_DefaultValidators() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(26);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_DefaultValue() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(27);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Description() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(28);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_DisplayName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(29);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ExceptionHandlerFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(30);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ExternalContextFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(31);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FacesConfig() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(32);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FacesContextFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(33);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Facet() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(34);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FacetExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(35);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FacetName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(36);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Factory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(37);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FromAction() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(38);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FromOutcome() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(39);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_FromViewId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(40);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Icon() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(41);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_If() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(42);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Key() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(43);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_KeyClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(44);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_LargeIcon() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(45);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Lifecycle() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(46);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_LifecycleFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(47);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ListEntries() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(48);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_LocaleConfig() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(49);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ManagedBean() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(50);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ManagedBeanClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(51);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ManagedBeanName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(52);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ManagedBeanScope() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(53);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ManagedProperty() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(54);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_MapEntries() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(55);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_MapEntry() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(56);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_MessageBundle() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(57);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Name() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(58);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_NavigationCase() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(59);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_NavigationHandler() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(60);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_NavigationRule() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(61);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_NullValue() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(62);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Ordering() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(63);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_OrderingOrdering() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(64);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Others() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(65);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PartialViewContextFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(66);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PhaseListener() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(67);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Property() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(68);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PropertyClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(69);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PropertyExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(70);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PropertyName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(71);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_PropertyResolver() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(72);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Redirect() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(73);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RedirectViewParam() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(74);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ReferencedBean() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(75);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ReferencedBeanClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(76);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ReferencedBeanName() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(77);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Renderer() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(78);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RendererClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(79);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RendererExtension() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(80);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RendererType() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(81);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RenderKit() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(82);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RenderKitClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(83);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RenderKitFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(84);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_RenderKitId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(85);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ResourceHandler() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(86);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SmallIcon() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(87);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SourceClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(88);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_StateManager() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(89);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SuggestedValue() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(90);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SupportedLocale() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(91);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SystemEventClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(92);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SystemEventListener() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(93);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_SystemEventListenerClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(94);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_TagHandlerDelegateFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(95);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ToViewId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(96);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Validator() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(97);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ValidatorClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(98);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ValidatorId() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(99);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_Value() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(100);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ValueClass() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(101);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_VariableResolver() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(102);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ViewDeclarationLanguageFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(103);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_ViewHandler() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(104);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDocumentRoot_VisitContextFactory() {
-		return (EReference)documentRootEClass.getEStructuralFeatures().get(105);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getDynamicAttribute() {
-		return dynamicAttributeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getDynamicAttribute_Name() {
-		return (EAttribute)dynamicAttributeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getDynamicAttribute_Value() {
-		return (EAttribute)dynamicAttributeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getDynamicElement() {
-		return dynamicElementEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getDynamicElement_ChildNodes() {
-		return (EReference)dynamicElementEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getDynamicElement_Attributes() {
-		return (EReference)dynamicElementEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getDynamicElement_TextContent() {
-		return (EAttribute)dynamicElementEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getELResolverType() {
-		return elResolverTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getELResolverType_TextContent() {
-		return (EAttribute)elResolverTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getELResolverType_Id() {
-		return (EAttribute)elResolverTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExceptionHandlerFactoryType() {
-		return exceptionHandlerFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExceptionHandlerFactoryType_TextContent() {
-		return (EAttribute)exceptionHandlerFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExceptionHandlerFactoryType_Id() {
-		return (EAttribute)exceptionHandlerFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getDynamicElement_Name() {
-		return (EAttribute)dynamicElementEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFacesConfigType() {
-		return facesConfigTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Application() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Ordering() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_AbsoluteOrdering() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Factory() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Component() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Converter() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_ManagedBean() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Name() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_NavigationRule() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_ReferencedBean() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_RenderKit() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(10);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Lifecycle() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(11);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Validator() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(12);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacesConfigType_Behavior() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(13);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getFacesConfigType_FacesConfigExtension() {
-		return (EReference)facesConfigTypeEClass.getEStructuralFeatures().get(14);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacesConfigType_Xmlns() {
-		return (EAttribute)facesConfigTypeEClass.getEStructuralFeatures().get(15);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacesConfigType_Id() {
-		return (EAttribute)facesConfigTypeEClass.getEStructuralFeatures().get(16);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacesConfigType_MetadataComplete() {
-		return (EAttribute)facesConfigTypeEClass.getEStructuralFeatures().get(17);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFacesContextFactoryType() {
-		return facesContextFactoryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacesContextFactoryType_TextContent() {
-		return (EAttribute)facesContextFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacesContextFactoryType_Id() {
-		return (EAttribute)facesContextFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFacetExtensionType() {
-		return facetExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFacetNameType() {
-		return facetNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacetNameType_TextContent() {
-		return (EAttribute)facetNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacetNameType_Id() {
-		return (EAttribute)facetNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFacetType() {
-		return facetTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacetType_Description() {
-		return (EReference)facetTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacetType_DisplayName() {
-		return (EReference)facetTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacetType_Icon() {
-		return (EReference)facetTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacetType_FacetName() {
-		return (EReference)facetTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFacetType_FacetExtension() {
-		return (EReference)facetTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFacetType_Id() {
-		return (EAttribute)facetTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFactoryType() {
-		return factoryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_ApplicationFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_ExceptionHandlerFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_ExternalContextFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_FacesContextFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_PartialViewContextFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_LifecycleFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_ViewDeclarationLanguageFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_TagHandlerDelegateFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_RenderKitFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getFactoryType_VisitContextFactory() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getFactoryType_FactoryExtension() {
-		return (EReference)factoryTypeEClass.getEStructuralFeatures().get(10);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFactoryType_Id() {
-		return (EAttribute)factoryTypeEClass.getEStructuralFeatures().get(11);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFromActionType() {
-		return fromActionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromActionType_TextContent() {
-		return (EAttribute)fromActionTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromActionType_Id() {
-		return (EAttribute)fromActionTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFromOutcomeType() {
-		return fromOutcomeTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromOutcomeType_TextContent() {
-		return (EAttribute)fromOutcomeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromOutcomeType_Id() {
-		return (EAttribute)fromOutcomeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getFromViewIdType() {
-		return fromViewIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromViewIdType_TextContent() {
-		return (EAttribute)fromViewIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getFromViewIdType_Id() {
-		return (EAttribute)fromViewIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getIconType() {
-		return iconTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getIconType_SmallIcon() {
-		return (EReference)iconTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getIconType_LargeIcon() {
-		return (EReference)iconTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIconType_Lang() {
-		return (EAttribute)iconTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIconType_Id() {
-		return (EAttribute)iconTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getIfType() {
-		return ifTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIfType_TextContent() {
-		return (EAttribute)ifTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getIfType_Id() {
-		return (EAttribute)ifTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getKeyClassType() {
-		return keyClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getKeyClassType_TextContent() {
-		return (EAttribute)keyClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getKeyClassType_Id() {
-		return (EAttribute)keyClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getKeyType() {
-		return keyTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getKeyType_TextContent() {
-		return (EAttribute)keyTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getKeyType_Id() {
-		return (EAttribute)keyTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLargeIconType() {
-		return largeIconTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLargeIconType_TextContent() {
-		return (EAttribute)largeIconTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLargeIconType_Id() {
-		return (EAttribute)largeIconTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLifecycleFactoryType() {
-		return lifecycleFactoryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLifecycleFactoryType_TextContent() {
-		return (EAttribute)lifecycleFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLifecycleFactoryType_Id() {
-		return (EAttribute)lifecycleFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLifecycleType() {
-		return lifecycleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLifecycleType_PhaseListener() {
-		return (EReference)lifecycleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getLifecycleType_LifecycleExtension() {
-		return (EReference)lifecycleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLifecycleType_Id() {
-		return (EAttribute)lifecycleTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getListEntriesType() {
-		return listEntriesTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getListEntriesType_ValueClass() {
-		return (EReference)listEntriesTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getListEntriesType_NullValue() {
-		return (EReference)listEntriesTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getListEntriesType_Value() {
-		return (EReference)listEntriesTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getListEntriesType_Id() {
-		return (EAttribute)listEntriesTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getLocaleConfigType() {
-		return localeConfigTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLocaleConfigType_DefaultLocale() {
-		return (EReference)localeConfigTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getLocaleConfigType_SupportedLocale() {
-		return (EReference)localeConfigTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getLocaleConfigType_Id() {
-		return (EAttribute)localeConfigTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManagedBeanClassType() {
-		return managedBeanClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanClassType_TextContent() {
-		return (EAttribute)managedBeanClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanClassType_Id() {
-		return (EAttribute)managedBeanClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManagedBeanNameType() {
-		return managedBeanNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanNameType_TextContent() {
-		return (EAttribute)managedBeanNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanNameType_Id() {
-		return (EAttribute)managedBeanNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManagedBeanScopeType() {
-		return managedBeanScopeTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanScopeType_TextContent() {
-		return (EAttribute)managedBeanScopeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanScopeType_Id() {
-		return (EAttribute)managedBeanScopeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManagedBeanType() {
-		return managedBeanTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_Description() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_DisplayName() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_Icon() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_ManagedBeanName() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_ManagedBeanClass() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_ManagedBeanScope() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_ManagedProperty() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_MapEntries() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedBeanType_ListEntries() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getManagedBeanType_ManagedBeanExtension() {
-		return (EReference)managedBeanTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanType_Id() {
-		return (EAttribute)managedBeanTypeEClass.getEStructuralFeatures().get(10);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedBeanType_Eager() {
-		return (EAttribute)managedBeanTypeEClass.getEStructuralFeatures().get(11);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getManagedPropertyType() {
-		return managedPropertyTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_Description() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_DisplayName() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_Icon() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_PropertyName() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_PropertyClass() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_MapEntries() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_NullValue() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_Value() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getManagedPropertyType_ListEntries() {
-		return (EReference)managedPropertyTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getManagedPropertyType_Id() {
-		return (EAttribute)managedPropertyTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMapEntriesType() {
-		return mapEntriesTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntriesType_KeyClass() {
-		return (EReference)mapEntriesTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntriesType_ValueClass() {
-		return (EReference)mapEntriesTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntriesType_MapEntry() {
-		return (EReference)mapEntriesTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMapEntriesType_Id() {
-		return (EAttribute)mapEntriesTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMapEntryType() {
-		return mapEntryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntryType_Key() {
-		return (EReference)mapEntryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntryType_NullValue() {
-		return (EReference)mapEntryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMapEntryType_Value() {
-		return (EReference)mapEntryTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMapEntryType_Id() {
-		return (EAttribute)mapEntryTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMessageBundleType() {
-		return messageBundleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMessageBundleType_TextContent() {
-		return (EAttribute)messageBundleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMessageBundleType_Id() {
-		return (EAttribute)messageBundleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNameType() {
-		return nameTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNameType_TextContent() {
-		return (EAttribute)nameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNameType_Id() {
-		return (EAttribute)nameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNavigationCaseType() {
-		return navigationCaseTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_Description() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_DisplayName() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_Icon() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_FromAction() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_FromOutcome() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_If() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_ToViewId() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationCaseType_Redirect() {
-		return (EReference)navigationCaseTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNavigationCaseType_Id() {
-		return (EAttribute)navigationCaseTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNavigationHandlerType() {
-		return navigationHandlerTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNavigationHandlerType_TextContent() {
-		return (EAttribute)navigationHandlerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNavigationHandlerType_Id() {
-		return (EAttribute)navigationHandlerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNavigationRuleType() {
-		return navigationRuleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationRuleType_Description() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationRuleType_DisplayName() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationRuleType_Icon() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationRuleType_FromViewId() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getNavigationRuleType_NavigationCase() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getNavigationRuleType_NavigationRuleExtension() {
-		return (EReference)navigationRuleTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNavigationRuleType_Id() {
-		return (EAttribute)navigationRuleTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getNullValueType() {
-		return nullValueTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getNullValueType_Id() {
-		return (EAttribute)nullValueTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOrderingType() {
-		return orderingTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOrderingType_Before() {
-		return (EReference)orderingTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOrderingType_After() {
-		return (EReference)orderingTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOrderingOrderingType() {
-		return orderingOrderingTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOrderingOrderingType_Name() {
-		return (EReference)orderingOrderingTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOrderingOrderingType_Others() {
-		return (EReference)orderingOrderingTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOrderingOthersType() {
-		return orderingOthersTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOrderingOthersType_Id() {
-		return (EAttribute)orderingOthersTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPartialViewContextFactoryType() {
-		return partialViewContextFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPartialViewContextFactoryType_TextContent() {
-		return (EAttribute)partialViewContextFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPartialViewContextFactoryType_Id() {
-		return (EAttribute)partialViewContextFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPhaseListenerType() {
-		return phaseListenerTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPhaseListenerType_TextContent() {
-		return (EAttribute)phaseListenerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPhaseListenerType_Id() {
-		return (EAttribute)phaseListenerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPropertyClassType() {
-		return propertyClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyClassType_TextContent() {
-		return (EAttribute)propertyClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyClassType_Id() {
-		return (EAttribute)propertyClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPropertyExtensionType() {
-		return propertyExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPropertyNameType() {
-		return propertyNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyNameType_TextContent() {
-		return (EAttribute)propertyNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyNameType_Id() {
-		return (EAttribute)propertyNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPropertyResolverType() {
-		return propertyResolverTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyResolverType_TextContent() {
-		return (EAttribute)propertyResolverTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyResolverType_Id() {
-		return (EAttribute)propertyResolverTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPropertyType() {
-		return propertyTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_Description() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_DisplayName() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_Icon() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_PropertyName() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_PropertyClass() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_DefaultValue() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_SuggestedValue() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPropertyType_PropertyExtension() {
-		return (EReference)propertyTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPropertyType_Id() {
-		return (EAttribute)propertyTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRedirectType() {
-		return redirectTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedirectType_ViewParam() {
-		return (EReference)redirectTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRedirectType_Id() {
-		return (EAttribute)redirectTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRedirectType_IncludeViewParams() {
-		return (EAttribute)redirectTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRedirectViewParamType() {
-		return redirectViewParamTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedirectViewParamType_Name() {
-		return (EReference)redirectViewParamTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRedirectViewParamType_Value() {
-		return (EReference)redirectViewParamTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRedirectViewParamType_Id() {
-		return (EAttribute)redirectViewParamTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReferencedBeanClassType() {
-		return referencedBeanClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedBeanClassType_TextContent() {
-		return (EAttribute)referencedBeanClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedBeanClassType_Id() {
-		return (EAttribute)referencedBeanClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReferencedBeanNameType() {
-		return referencedBeanNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedBeanNameType_TextContent() {
-		return (EAttribute)referencedBeanNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedBeanNameType_Id() {
-		return (EAttribute)referencedBeanNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getReferencedBeanType() {
-		return referencedBeanTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedBeanType_Description() {
-		return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedBeanType_DisplayName() {
-		return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedBeanType_Icon() {
-		return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedBeanType_ReferencedBeanName() {
-		return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getReferencedBeanType_ReferencedBeanClass() {
-		return (EReference)referencedBeanTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getReferencedBeanType_Id() {
-		return (EAttribute)referencedBeanTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRendererClassType() {
-		return rendererClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRendererClassType_TextContent() {
-		return (EAttribute)rendererClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRendererClassType_Id() {
-		return (EAttribute)rendererClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRendererExtensionType() {
-		return rendererExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRendererType() {
-		return rendererTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_Description() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_DisplayName() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_Icon() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_ComponentFamily() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_RendererType() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_RendererClass() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_Facet() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_Attribute() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRendererType_RendererExtension() {
-		return (EReference)rendererTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRendererType_Id() {
-		return (EAttribute)rendererTypeEClass.getEStructuralFeatures().get(9);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRendererTypeType() {
-		return rendererTypeTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRendererTypeType_TextContent() {
-		return (EAttribute)rendererTypeTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRendererTypeType_Id() {
-		return (EAttribute)rendererTypeTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRenderKitClassType() {
-		return renderKitClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitClassType_TextContent() {
-		return (EAttribute)renderKitClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitClassType_Id() {
-		return (EAttribute)renderKitClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRenderKitFactoryType() {
-		return renderKitFactoryTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitFactoryType_TextContent() {
-		return (EAttribute)renderKitFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitFactoryType_Id() {
-		return (EAttribute)renderKitFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRenderKitIdType() {
-		return renderKitIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitIdType_TextContent() {
-		return (EAttribute)renderKitIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitIdType_Id() {
-		return (EAttribute)renderKitIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getRenderKitType() {
-		return renderKitTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_Description() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_DisplayName() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_Icon() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_RenderKitId() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_RenderKitClass() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_Renderer() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getRenderKitType_ClientBehaviorRenderer() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getRenderKitType_RenderKitExtension() {
-		return (EReference)renderKitTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getRenderKitType_Id() {
-		return (EAttribute)renderKitTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSmallIconType() {
-		return smallIconTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSmallIconType_TextContent() {
-		return (EAttribute)smallIconTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSmallIconType_Id() {
-		return (EAttribute)smallIconTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSourceClassType() {
-		return sourceClassTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSourceClassType_TextContent() {
-		return (EAttribute)sourceClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSourceClassType_Id() {
-		return (EAttribute)sourceClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getStateManagerType() {
-		return stateManagerTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getStateManagerType_TextContent() {
-		return (EAttribute)stateManagerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getStateManagerType_Id() {
-		return (EAttribute)stateManagerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSuggestedValueType() {
-		return suggestedValueTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSuggestedValueType_TextContent() {
-		return (EAttribute)suggestedValueTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSuggestedValueType_Id() {
-		return (EAttribute)suggestedValueTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSupportedLocaleType() {
-		return supportedLocaleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSupportedLocaleType_TextContent() {
-		return (EAttribute)supportedLocaleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSupportedLocaleType_Id() {
-		return (EAttribute)supportedLocaleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSystemEventClassType() {
-		return systemEventClassTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSystemEventClassType_TextContent() {
-		return (EAttribute)systemEventClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSystemEventClassType_Id() {
-		return (EAttribute)systemEventClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSystemEventListenerClassType() {
-		return systemEventListenerClassTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSystemEventListenerClassType_TextContent() {
-		return (EAttribute)systemEventListenerClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSystemEventListenerClassType_Id() {
-		return (EAttribute)systemEventListenerClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSystemEventListenerType() {
-		return systemEventListenerTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSystemEventListenerType_SystemEventListenerClass() {
-		return (EReference)systemEventListenerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSystemEventListenerType_SystemEventClass() {
-		return (EReference)systemEventListenerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getSystemEventListenerType_SourceClass() {
-		return (EReference)systemEventListenerTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSystemEventListenerType_Id() {
-		return (EAttribute)systemEventListenerTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagHandlerDelegateFactoryType() {
-		return tagHandlerDelegateFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagHandlerDelegateFactoryType_TextContent() {
-		return (EAttribute)tagHandlerDelegateFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagHandlerDelegateFactoryType_Id() {
-		return (EAttribute)tagHandlerDelegateFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getToViewIdType() {
-		return toViewIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getToViewIdType_TextContent() {
-		return (EAttribute)toViewIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getToViewIdType_Id() {
-		return (EAttribute)toViewIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValidatorClassType() {
-		return validatorClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValidatorClassType_TextContent() {
-		return (EAttribute)validatorClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValidatorClassType_Id() {
-		return (EAttribute)validatorClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValidatorIdType() {
-		return validatorIdTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValidatorIdType_TextContent() {
-		return (EAttribute)validatorIdTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValidatorIdType_Id() {
-		return (EAttribute)validatorIdTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValidatorType() {
-		return validatorTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_Description() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_DisplayName() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_Icon() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_ValidatorId() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_ValidatorClass() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_Attribute() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getValidatorType_Property() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(6);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getValidatorType_ValidatorExtension() {
-		return (EReference)validatorTypeEClass.getEStructuralFeatures().get(7);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValidatorType_Id() {
-		return (EAttribute)validatorTypeEClass.getEStructuralFeatures().get(8);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValueClassType() {
-		return valueClassTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValueClassType_TextContent() {
-		return (EAttribute)valueClassTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValueClassType_Id() {
-		return (EAttribute)valueClassTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getValueType() {
-		return valueTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValueType_TextContent() {
-		return (EAttribute)valueTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getValueType_Id() {
-		return (EAttribute)valueTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getVariableResolverType() {
-		return variableResolverTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getVariableResolverType_TextContent() {
-		return (EAttribute)variableResolverTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getVariableResolverType_Id() {
-		return (EAttribute)variableResolverTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getViewHandlerType() {
-		return viewHandlerTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getViewHandlerType_TextContent() {
-		return (EAttribute)viewHandlerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getViewHandlerType_Id() {
-		return (EAttribute)viewHandlerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getResourceBundleType() {
-		return resourceBundleTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceBundleType_Description() {
-		return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceBundleType_DisplayName() {
-		return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceBundleType_Icon() {
-		return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceBundleType_BaseName() {
-		return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(3);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getResourceBundleType_Var() {
-		return (EReference)resourceBundleTypeEClass.getEStructuralFeatures().get(4);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getResourceBundleType_Id() {
-		return (EAttribute)resourceBundleTypeEClass.getEStructuralFeatures().get(5);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getBaseNameType() {
-		return baseNameTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getBaseNameType_TextContent() {
-		return (EAttribute)baseNameTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getBaseNameType_Id() {
-		return (EAttribute)baseNameTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getVarType() {
-		return varTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getVarType_TextContent() {
-		return (EAttribute)varTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getVarType_Id() {
-		return (EAttribute)varTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getViewDeclarationLanguageFactoryType() {
-		return viewDeclarationLanguageFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getViewDeclarationLanguageFactoryType_TextContent() {
-		return (EAttribute)viewDeclarationLanguageFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getViewDeclarationLanguageFactoryType_Id() {
-		return (EAttribute)viewDeclarationLanguageFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getVisitContextFactoryType() {
-		return visitContextFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getVisitContextFactoryType_TextContent() {
-		return (EAttribute)visitContextFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getVisitContextFactoryType_Id() {
-		return (EAttribute)visitContextFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getRenderKitExtensionType() {
-		return renderKitExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getResourceHandlerType() {
-		return resourceHandlerTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResourceHandlerType_TextContent() {
-		return (EAttribute)resourceHandlerTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResourceHandlerType_Id() {
-		return (EAttribute)resourceHandlerTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getNavigationRuleExtensionType() {
-		return navigationRuleExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getValidatorExtensionType() {
-		return validatorExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getFacesConfigExtensionType() {
-		return facesConfigExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getFactoryExtensionType() {
-		return factoryExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getLifecycleExtensionType() {
-		return lifecycleExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getManagedBeanExtensionType() {
-		return managedBeanExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getConverterExtensionType() {
-		return converterExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getExtensionType() {
-		return extensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EReference getExtensionType_ChildNodes() {
-		return (EReference)extensionTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getExtensionType_TextContent() {
-		return (EAttribute)extensionTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EAttribute getExtensionType_Id() {
-		return (EAttribute)extensionTypeEClass.getEStructuralFeatures().get(2);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExternalContextFactoryType() {
-		return externalContextFactoryTypeEClass;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExternalContextFactoryType_TextContent() {
-		return (EAttribute)externalContextFactoryTypeEClass.getEStructuralFeatures().get(0);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExternalContextFactoryType_Id() {
-		return (EAttribute)externalContextFactoryTypeEClass.getEStructuralFeatures().get(1);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EClass getApplicationExtensionType() {
-		return applicationExtensionTypeEClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigFactory getFacesConfigFactory() {
-		return (FacesConfigFactory)getEFactoryInstance();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-    /**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		absoluteOrderingTypeEClass = createEClass(ABSOLUTE_ORDERING_TYPE);
-		createEReference(absoluteOrderingTypeEClass, ABSOLUTE_ORDERING_TYPE__NAME);
-		createEReference(absoluteOrderingTypeEClass, ABSOLUTE_ORDERING_TYPE__OTHERS);
-
-		actionListenerTypeEClass = createEClass(ACTION_LISTENER_TYPE);
-		createEAttribute(actionListenerTypeEClass, ACTION_LISTENER_TYPE__TEXT_CONTENT);
-		createEAttribute(actionListenerTypeEClass, ACTION_LISTENER_TYPE__ID);
-
-		applicationFactoryTypeEClass = createEClass(APPLICATION_FACTORY_TYPE);
-		createEAttribute(applicationFactoryTypeEClass, APPLICATION_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(applicationFactoryTypeEClass, APPLICATION_FACTORY_TYPE__ID);
-
-		applicationTypeEClass = createEClass(APPLICATION_TYPE);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__ACTION_LISTENER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__DEFAULT_RENDER_KIT_ID);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__MESSAGE_BUNDLE);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__NAVIGATION_HANDLER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__VIEW_HANDLER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__STATE_MANAGER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__EL_RESOLVER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__PROPERTY_RESOLVER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__VARIABLE_RESOLVER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__RESOURCE_HANDLER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__SYSTEM_EVENT_LISTENER);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__LOCALE_CONFIG);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__RESOURCE_BUNDLE);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__APPLICATION_EXTENSION);
-		createEReference(applicationTypeEClass, APPLICATION_TYPE__DEFAULT_VALIDATORS);
-		createEAttribute(applicationTypeEClass, APPLICATION_TYPE__ID);
-
-		applicationExtensionTypeEClass = createEClass(APPLICATION_EXTENSION_TYPE);
-
-		attributeClassTypeEClass = createEClass(ATTRIBUTE_CLASS_TYPE);
-		createEAttribute(attributeClassTypeEClass, ATTRIBUTE_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(attributeClassTypeEClass, ATTRIBUTE_CLASS_TYPE__ID);
-
-		attributeExtensionTypeEClass = createEClass(ATTRIBUTE_EXTENSION_TYPE);
-
-		attributeNameTypeEClass = createEClass(ATTRIBUTE_NAME_TYPE);
-		createEAttribute(attributeNameTypeEClass, ATTRIBUTE_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(attributeNameTypeEClass, ATTRIBUTE_NAME_TYPE__ID);
-
-		attributeTypeEClass = createEClass(ATTRIBUTE_TYPE);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__DESCRIPTION);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__DISPLAY_NAME);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ICON);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ATTRIBUTE_NAME);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ATTRIBUTE_CLASS);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__DEFAULT_VALUE);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__SUGGESTED_VALUE);
-		createEReference(attributeTypeEClass, ATTRIBUTE_TYPE__ATTRIBUTE_EXTENSION);
-		createEAttribute(attributeTypeEClass, ATTRIBUTE_TYPE__ID);
-
-		behaviorClassTypeEClass = createEClass(BEHAVIOR_CLASS_TYPE);
-		createEAttribute(behaviorClassTypeEClass, BEHAVIOR_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(behaviorClassTypeEClass, BEHAVIOR_CLASS_TYPE__ID);
-
-		behaviorIdTypeEClass = createEClass(BEHAVIOR_ID_TYPE);
-		createEAttribute(behaviorIdTypeEClass, BEHAVIOR_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(behaviorIdTypeEClass, BEHAVIOR_ID_TYPE__ID);
-
-		behaviorTypeEClass = createEClass(BEHAVIOR_TYPE);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__DESCRIPTION);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__DISPLAY_NAME);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__ICON);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__BEHAVIOR_ID);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__BEHAVIOR_CLASS);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__ATTRIBUTE);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__PROPERTY);
-		createEReference(behaviorTypeEClass, BEHAVIOR_TYPE__BEHAVIOR_EXTENSION);
-
-		behaviorExtensionTypeEClass = createEClass(BEHAVIOR_EXTENSION_TYPE);
-
-		clientBehaviorRendererClassTypeEClass = createEClass(CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE);
-		createEAttribute(clientBehaviorRendererClassTypeEClass, CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(clientBehaviorRendererClassTypeEClass, CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE__ID);
-
-		clientBehaviorRendererTypeEClass = createEClass(CLIENT_BEHAVIOR_RENDERER_TYPE);
-		createEReference(clientBehaviorRendererTypeEClass, CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_TYPE);
-		createEReference(clientBehaviorRendererTypeEClass, CLIENT_BEHAVIOR_RENDERER_TYPE__CLIENT_BEHAVIOR_RENDERER_CLASS);
-
-		clientBehaviorRendererTypeTypeEClass = createEClass(CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE);
-		createEAttribute(clientBehaviorRendererTypeTypeEClass, CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__TEXT_CONTENT);
-		createEAttribute(clientBehaviorRendererTypeTypeEClass, CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE__ID);
-
-		componentClassTypeEClass = createEClass(COMPONENT_CLASS_TYPE);
-		createEAttribute(componentClassTypeEClass, COMPONENT_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(componentClassTypeEClass, COMPONENT_CLASS_TYPE__ID);
-
-		componentExtensionTypeEClass = createEClass(COMPONENT_EXTENSION_TYPE);
-
-		componentFamilyTypeEClass = createEClass(COMPONENT_FAMILY_TYPE);
-		createEAttribute(componentFamilyTypeEClass, COMPONENT_FAMILY_TYPE__TEXT_CONTENT);
-		createEAttribute(componentFamilyTypeEClass, COMPONENT_FAMILY_TYPE__ID);
-
-		componentTypeEClass = createEClass(COMPONENT_TYPE);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__DESCRIPTION);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__DISPLAY_NAME);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__ICON);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__COMPONENT_TYPE);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__COMPONENT_CLASS);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__FACET);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__ATTRIBUTE);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__PROPERTY);
-		createEReference(componentTypeEClass, COMPONENT_TYPE__COMPONENT_EXTENSION);
-		createEAttribute(componentTypeEClass, COMPONENT_TYPE__ID);
-
-		componentTypeTypeEClass = createEClass(COMPONENT_TYPE_TYPE);
-		createEAttribute(componentTypeTypeEClass, COMPONENT_TYPE_TYPE__TEXT_CONTENT);
-		createEAttribute(componentTypeTypeEClass, COMPONENT_TYPE_TYPE__ID);
-
-		converterClassTypeEClass = createEClass(CONVERTER_CLASS_TYPE);
-		createEAttribute(converterClassTypeEClass, CONVERTER_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(converterClassTypeEClass, CONVERTER_CLASS_TYPE__ID);
-
-		converterForClassTypeEClass = createEClass(CONVERTER_FOR_CLASS_TYPE);
-		createEAttribute(converterForClassTypeEClass, CONVERTER_FOR_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(converterForClassTypeEClass, CONVERTER_FOR_CLASS_TYPE__ID);
-
-		converterIdTypeEClass = createEClass(CONVERTER_ID_TYPE);
-		createEAttribute(converterIdTypeEClass, CONVERTER_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(converterIdTypeEClass, CONVERTER_ID_TYPE__ID);
-
-		converterTypeEClass = createEClass(CONVERTER_TYPE);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__DESCRIPTION);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__DISPLAY_NAME);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__ICON);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_ID);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_FOR_CLASS);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_CLASS);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__ATTRIBUTE);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__PROPERTY);
-		createEReference(converterTypeEClass, CONVERTER_TYPE__CONVERTER_EXTENSION);
-		createEAttribute(converterTypeEClass, CONVERTER_TYPE__ID);
-
-		converterExtensionTypeEClass = createEClass(CONVERTER_EXTENSION_TYPE);
-
-		defaultLocaleTypeEClass = createEClass(DEFAULT_LOCALE_TYPE);
-		createEAttribute(defaultLocaleTypeEClass, DEFAULT_LOCALE_TYPE__TEXT_CONTENT);
-		createEAttribute(defaultLocaleTypeEClass, DEFAULT_LOCALE_TYPE__ID);
-
-		defaultRenderKitIdTypeEClass = createEClass(DEFAULT_RENDER_KIT_ID_TYPE);
-		createEAttribute(defaultRenderKitIdTypeEClass, DEFAULT_RENDER_KIT_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(defaultRenderKitIdTypeEClass, DEFAULT_RENDER_KIT_ID_TYPE__ID);
-
-		defaultValidatorsTypeEClass = createEClass(DEFAULT_VALIDATORS_TYPE);
-		createEReference(defaultValidatorsTypeEClass, DEFAULT_VALIDATORS_TYPE__VALIDATOR_ID);
-		createEAttribute(defaultValidatorsTypeEClass, DEFAULT_VALIDATORS_TYPE__ID);
-
-		defaultValueTypeEClass = createEClass(DEFAULT_VALUE_TYPE);
-		createEAttribute(defaultValueTypeEClass, DEFAULT_VALUE_TYPE__TEXT_CONTENT);
-		createEAttribute(defaultValueTypeEClass, DEFAULT_VALUE_TYPE__ID);
-
-		descriptionTypeEClass = createEClass(DESCRIPTION_TYPE);
-		createEAttribute(descriptionTypeEClass, DESCRIPTION_TYPE__TEXT_CONTENT);
-		createEAttribute(descriptionTypeEClass, DESCRIPTION_TYPE__LANG);
-		createEAttribute(descriptionTypeEClass, DESCRIPTION_TYPE__ID);
-
-		displayNameTypeEClass = createEClass(DISPLAY_NAME_TYPE);
-		createEAttribute(displayNameTypeEClass, DISPLAY_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(displayNameTypeEClass, DISPLAY_NAME_TYPE__LANG);
-		createEAttribute(displayNameTypeEClass, DISPLAY_NAME_TYPE__ID);
-
-		documentRootEClass = createEClass(DOCUMENT_ROOT);
-		createEAttribute(documentRootEClass, DOCUMENT_ROOT__MIXED);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__XMLNS_PREFIX_MAP);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__XSI_SCHEMA_LOCATION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ABSOLUTE_ORDERING);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ACTION_LISTENER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__APPLICATION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__APPLICATION_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ATTRIBUTE_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__BEHAVIOR);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__BEHAVIOR_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__BEHAVIOR_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__BEHAVIOR_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_FAMILY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__COMPONENT_TYPE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER_FOR_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__CONVERTER_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_LOCALE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_RENDER_KIT_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_VALIDATORS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DEFAULT_VALUE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DESCRIPTION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__DISPLAY_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__EXCEPTION_HANDLER_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__EXTERNAL_CONTEXT_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACES_CONFIG);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACES_CONTEXT_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACET);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACET_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACET_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FROM_ACTION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FROM_OUTCOME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__FROM_VIEW_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ICON);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__IF);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__KEY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__KEY_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__LARGE_ICON);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__LIFECYCLE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__LIFECYCLE_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__LIST_ENTRIES);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__LOCALE_CONFIG);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_BEAN_SCOPE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MANAGED_PROPERTY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MAP_ENTRIES);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MAP_ENTRY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__MESSAGE_BUNDLE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_CASE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_HANDLER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__NAVIGATION_RULE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__NULL_VALUE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ORDERING);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__ORDERING_ORDERING);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__OTHERS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PARTIAL_VIEW_CONTEXT_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PHASE_LISTENER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__PROPERTY_RESOLVER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__REDIRECT);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__REDIRECT_VIEW_PARAM);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__REFERENCED_BEAN);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__REFERENCED_BEAN_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__REFERENCED_BEAN_NAME);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER_EXTENSION);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDERER_TYPE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RENDER_KIT_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__RESOURCE_HANDLER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SMALL_ICON);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SOURCE_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__STATE_MANAGER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SUGGESTED_VALUE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SUPPORTED_LOCALE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SYSTEM_EVENT_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__SYSTEM_EVENT_LISTENER_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__TAG_HANDLER_DELEGATE_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__TO_VIEW_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VALIDATOR);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VALIDATOR_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VALIDATOR_ID);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VALUE);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VALUE_CLASS);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VARIABLE_RESOLVER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VIEW_DECLARATION_LANGUAGE_FACTORY);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VIEW_HANDLER);
-		createEReference(documentRootEClass, DOCUMENT_ROOT__VISIT_CONTEXT_FACTORY);
-
-		dynamicAttributeEClass = createEClass(DYNAMIC_ATTRIBUTE);
-		createEAttribute(dynamicAttributeEClass, DYNAMIC_ATTRIBUTE__NAME);
-		createEAttribute(dynamicAttributeEClass, DYNAMIC_ATTRIBUTE__VALUE);
-
-		dynamicElementEClass = createEClass(DYNAMIC_ELEMENT);
-		createEReference(dynamicElementEClass, DYNAMIC_ELEMENT__CHILD_NODES);
-		createEAttribute(dynamicElementEClass, DYNAMIC_ELEMENT__NAME);
-		createEReference(dynamicElementEClass, DYNAMIC_ELEMENT__ATTRIBUTES);
-		createEAttribute(dynamicElementEClass, DYNAMIC_ELEMENT__TEXT_CONTENT);
-
-		elResolverTypeEClass = createEClass(EL_RESOLVER_TYPE);
-		createEAttribute(elResolverTypeEClass, EL_RESOLVER_TYPE__TEXT_CONTENT);
-		createEAttribute(elResolverTypeEClass, EL_RESOLVER_TYPE__ID);
-
-		exceptionHandlerFactoryTypeEClass = createEClass(EXCEPTION_HANDLER_FACTORY_TYPE);
-		createEAttribute(exceptionHandlerFactoryTypeEClass, EXCEPTION_HANDLER_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(exceptionHandlerFactoryTypeEClass, EXCEPTION_HANDLER_FACTORY_TYPE__ID);
-
-		extensionTypeEClass = createEClass(EXTENSION_TYPE);
-		createEReference(extensionTypeEClass, EXTENSION_TYPE__CHILD_NODES);
-		createEAttribute(extensionTypeEClass, EXTENSION_TYPE__TEXT_CONTENT);
-		createEAttribute(extensionTypeEClass, EXTENSION_TYPE__ID);
-
-		externalContextFactoryTypeEClass = createEClass(EXTERNAL_CONTEXT_FACTORY_TYPE);
-		createEAttribute(externalContextFactoryTypeEClass, EXTERNAL_CONTEXT_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(externalContextFactoryTypeEClass, EXTERNAL_CONTEXT_FACTORY_TYPE__ID);
-
-		facesConfigTypeEClass = createEClass(FACES_CONFIG_TYPE);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__APPLICATION);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__ORDERING);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__ABSOLUTE_ORDERING);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__FACTORY);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__COMPONENT);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__CONVERTER);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__MANAGED_BEAN);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__NAME);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__NAVIGATION_RULE);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__REFERENCED_BEAN);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__RENDER_KIT);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__LIFECYCLE);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__VALIDATOR);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__BEHAVIOR);
-		createEReference(facesConfigTypeEClass, FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION);
-		createEAttribute(facesConfigTypeEClass, FACES_CONFIG_TYPE__XMLNS);
-		createEAttribute(facesConfigTypeEClass, FACES_CONFIG_TYPE__ID);
-		createEAttribute(facesConfigTypeEClass, FACES_CONFIG_TYPE__METADATA_COMPLETE);
-
-		facesConfigExtensionTypeEClass = createEClass(FACES_CONFIG_EXTENSION_TYPE);
-
-		facesContextFactoryTypeEClass = createEClass(FACES_CONTEXT_FACTORY_TYPE);
-		createEAttribute(facesContextFactoryTypeEClass, FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(facesContextFactoryTypeEClass, FACES_CONTEXT_FACTORY_TYPE__ID);
-
-		facetExtensionTypeEClass = createEClass(FACET_EXTENSION_TYPE);
-
-		facetNameTypeEClass = createEClass(FACET_NAME_TYPE);
-		createEAttribute(facetNameTypeEClass, FACET_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(facetNameTypeEClass, FACET_NAME_TYPE__ID);
-
-		facetTypeEClass = createEClass(FACET_TYPE);
-		createEReference(facetTypeEClass, FACET_TYPE__DESCRIPTION);
-		createEReference(facetTypeEClass, FACET_TYPE__DISPLAY_NAME);
-		createEReference(facetTypeEClass, FACET_TYPE__ICON);
-		createEReference(facetTypeEClass, FACET_TYPE__FACET_NAME);
-		createEReference(facetTypeEClass, FACET_TYPE__FACET_EXTENSION);
-		createEAttribute(facetTypeEClass, FACET_TYPE__ID);
-
-		factoryTypeEClass = createEClass(FACTORY_TYPE);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__APPLICATION_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__FACES_CONTEXT_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__LIFECYCLE_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__RENDER_KIT_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__VISIT_CONTEXT_FACTORY);
-		createEReference(factoryTypeEClass, FACTORY_TYPE__FACTORY_EXTENSION);
-		createEAttribute(factoryTypeEClass, FACTORY_TYPE__ID);
-
-		factoryExtensionTypeEClass = createEClass(FACTORY_EXTENSION_TYPE);
-
-		fromActionTypeEClass = createEClass(FROM_ACTION_TYPE);
-		createEAttribute(fromActionTypeEClass, FROM_ACTION_TYPE__TEXT_CONTENT);
-		createEAttribute(fromActionTypeEClass, FROM_ACTION_TYPE__ID);
-
-		fromOutcomeTypeEClass = createEClass(FROM_OUTCOME_TYPE);
-		createEAttribute(fromOutcomeTypeEClass, FROM_OUTCOME_TYPE__TEXT_CONTENT);
-		createEAttribute(fromOutcomeTypeEClass, FROM_OUTCOME_TYPE__ID);
-
-		fromViewIdTypeEClass = createEClass(FROM_VIEW_ID_TYPE);
-		createEAttribute(fromViewIdTypeEClass, FROM_VIEW_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(fromViewIdTypeEClass, FROM_VIEW_ID_TYPE__ID);
-
-		iconTypeEClass = createEClass(ICON_TYPE);
-		createEReference(iconTypeEClass, ICON_TYPE__SMALL_ICON);
-		createEReference(iconTypeEClass, ICON_TYPE__LARGE_ICON);
-		createEAttribute(iconTypeEClass, ICON_TYPE__LANG);
-		createEAttribute(iconTypeEClass, ICON_TYPE__ID);
-
-		ifTypeEClass = createEClass(IF_TYPE);
-		createEAttribute(ifTypeEClass, IF_TYPE__TEXT_CONTENT);
-		createEAttribute(ifTypeEClass, IF_TYPE__ID);
-
-		keyClassTypeEClass = createEClass(KEY_CLASS_TYPE);
-		createEAttribute(keyClassTypeEClass, KEY_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(keyClassTypeEClass, KEY_CLASS_TYPE__ID);
-
-		keyTypeEClass = createEClass(KEY_TYPE);
-		createEAttribute(keyTypeEClass, KEY_TYPE__TEXT_CONTENT);
-		createEAttribute(keyTypeEClass, KEY_TYPE__ID);
-
-		largeIconTypeEClass = createEClass(LARGE_ICON_TYPE);
-		createEAttribute(largeIconTypeEClass, LARGE_ICON_TYPE__TEXT_CONTENT);
-		createEAttribute(largeIconTypeEClass, LARGE_ICON_TYPE__ID);
-
-		lifecycleFactoryTypeEClass = createEClass(LIFECYCLE_FACTORY_TYPE);
-		createEAttribute(lifecycleFactoryTypeEClass, LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(lifecycleFactoryTypeEClass, LIFECYCLE_FACTORY_TYPE__ID);
-
-		lifecycleTypeEClass = createEClass(LIFECYCLE_TYPE);
-		createEReference(lifecycleTypeEClass, LIFECYCLE_TYPE__PHASE_LISTENER);
-		createEReference(lifecycleTypeEClass, LIFECYCLE_TYPE__LIFECYCLE_EXTENSION);
-		createEAttribute(lifecycleTypeEClass, LIFECYCLE_TYPE__ID);
-
-		lifecycleExtensionTypeEClass = createEClass(LIFECYCLE_EXTENSION_TYPE);
-
-		listEntriesTypeEClass = createEClass(LIST_ENTRIES_TYPE);
-		createEReference(listEntriesTypeEClass, LIST_ENTRIES_TYPE__VALUE_CLASS);
-		createEReference(listEntriesTypeEClass, LIST_ENTRIES_TYPE__NULL_VALUE);
-		createEReference(listEntriesTypeEClass, LIST_ENTRIES_TYPE__VALUE);
-		createEAttribute(listEntriesTypeEClass, LIST_ENTRIES_TYPE__ID);
-
-		localeConfigTypeEClass = createEClass(LOCALE_CONFIG_TYPE);
-		createEReference(localeConfigTypeEClass, LOCALE_CONFIG_TYPE__DEFAULT_LOCALE);
-		createEReference(localeConfigTypeEClass, LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE);
-		createEAttribute(localeConfigTypeEClass, LOCALE_CONFIG_TYPE__ID);
-
-		managedBeanClassTypeEClass = createEClass(MANAGED_BEAN_CLASS_TYPE);
-		createEAttribute(managedBeanClassTypeEClass, MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(managedBeanClassTypeEClass, MANAGED_BEAN_CLASS_TYPE__ID);
-
-		managedBeanNameTypeEClass = createEClass(MANAGED_BEAN_NAME_TYPE);
-		createEAttribute(managedBeanNameTypeEClass, MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(managedBeanNameTypeEClass, MANAGED_BEAN_NAME_TYPE__ID);
-
-		managedBeanScopeTypeEClass = createEClass(MANAGED_BEAN_SCOPE_TYPE);
-		createEAttribute(managedBeanScopeTypeEClass, MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT);
-		createEAttribute(managedBeanScopeTypeEClass, MANAGED_BEAN_SCOPE_TYPE__ID);
-
-		managedBeanTypeEClass = createEClass(MANAGED_BEAN_TYPE);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__DESCRIPTION);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__DISPLAY_NAME);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__ICON);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_PROPERTY);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MAP_ENTRIES);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__LIST_ENTRIES);
-		createEReference(managedBeanTypeEClass, MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION);
-		createEAttribute(managedBeanTypeEClass, MANAGED_BEAN_TYPE__ID);
-		createEAttribute(managedBeanTypeEClass, MANAGED_BEAN_TYPE__EAGER);
-
-		managedBeanExtensionTypeEClass = createEClass(MANAGED_BEAN_EXTENSION_TYPE);
-
-		managedPropertyTypeEClass = createEClass(MANAGED_PROPERTY_TYPE);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__DESCRIPTION);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__DISPLAY_NAME);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__ICON);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__PROPERTY_NAME);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__PROPERTY_CLASS);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__MAP_ENTRIES);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__NULL_VALUE);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__VALUE);
-		createEReference(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__LIST_ENTRIES);
-		createEAttribute(managedPropertyTypeEClass, MANAGED_PROPERTY_TYPE__ID);
-
-		mapEntriesTypeEClass = createEClass(MAP_ENTRIES_TYPE);
-		createEReference(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__KEY_CLASS);
-		createEReference(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__VALUE_CLASS);
-		createEReference(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__MAP_ENTRY);
-		createEAttribute(mapEntriesTypeEClass, MAP_ENTRIES_TYPE__ID);
-
-		mapEntryTypeEClass = createEClass(MAP_ENTRY_TYPE);
-		createEReference(mapEntryTypeEClass, MAP_ENTRY_TYPE__KEY);
-		createEReference(mapEntryTypeEClass, MAP_ENTRY_TYPE__NULL_VALUE);
-		createEReference(mapEntryTypeEClass, MAP_ENTRY_TYPE__VALUE);
-		createEAttribute(mapEntryTypeEClass, MAP_ENTRY_TYPE__ID);
-
-		messageBundleTypeEClass = createEClass(MESSAGE_BUNDLE_TYPE);
-		createEAttribute(messageBundleTypeEClass, MESSAGE_BUNDLE_TYPE__TEXT_CONTENT);
-		createEAttribute(messageBundleTypeEClass, MESSAGE_BUNDLE_TYPE__ID);
-
-		nameTypeEClass = createEClass(NAME_TYPE);
-		createEAttribute(nameTypeEClass, NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(nameTypeEClass, NAME_TYPE__ID);
-
-		navigationCaseTypeEClass = createEClass(NAVIGATION_CASE_TYPE);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__DESCRIPTION);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__DISPLAY_NAME);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__ICON);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__FROM_ACTION);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__FROM_OUTCOME);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__IF);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__TO_VIEW_ID);
-		createEReference(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__REDIRECT);
-		createEAttribute(navigationCaseTypeEClass, NAVIGATION_CASE_TYPE__ID);
-
-		navigationHandlerTypeEClass = createEClass(NAVIGATION_HANDLER_TYPE);
-		createEAttribute(navigationHandlerTypeEClass, NAVIGATION_HANDLER_TYPE__TEXT_CONTENT);
-		createEAttribute(navigationHandlerTypeEClass, NAVIGATION_HANDLER_TYPE__ID);
-
-		navigationRuleTypeEClass = createEClass(NAVIGATION_RULE_TYPE);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__DESCRIPTION);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__DISPLAY_NAME);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__ICON);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__FROM_VIEW_ID);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__NAVIGATION_CASE);
-		createEReference(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION);
-		createEAttribute(navigationRuleTypeEClass, NAVIGATION_RULE_TYPE__ID);
-
-		navigationRuleExtensionTypeEClass = createEClass(NAVIGATION_RULE_EXTENSION_TYPE);
-
-		nullValueTypeEClass = createEClass(NULL_VALUE_TYPE);
-		createEAttribute(nullValueTypeEClass, NULL_VALUE_TYPE__ID);
-
-		orderingTypeEClass = createEClass(ORDERING_TYPE);
-		createEReference(orderingTypeEClass, ORDERING_TYPE__BEFORE);
-		createEReference(orderingTypeEClass, ORDERING_TYPE__AFTER);
-
-		orderingOrderingTypeEClass = createEClass(ORDERING_ORDERING_TYPE);
-		createEReference(orderingOrderingTypeEClass, ORDERING_ORDERING_TYPE__NAME);
-		createEReference(orderingOrderingTypeEClass, ORDERING_ORDERING_TYPE__OTHERS);
-
-		orderingOthersTypeEClass = createEClass(ORDERING_OTHERS_TYPE);
-		createEAttribute(orderingOthersTypeEClass, ORDERING_OTHERS_TYPE__ID);
-
-		partialViewContextFactoryTypeEClass = createEClass(PARTIAL_VIEW_CONTEXT_FACTORY_TYPE);
-		createEAttribute(partialViewContextFactoryTypeEClass, PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(partialViewContextFactoryTypeEClass, PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID);
-
-		phaseListenerTypeEClass = createEClass(PHASE_LISTENER_TYPE);
-		createEAttribute(phaseListenerTypeEClass, PHASE_LISTENER_TYPE__TEXT_CONTENT);
-		createEAttribute(phaseListenerTypeEClass, PHASE_LISTENER_TYPE__ID);
-
-		propertyClassTypeEClass = createEClass(PROPERTY_CLASS_TYPE);
-		createEAttribute(propertyClassTypeEClass, PROPERTY_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(propertyClassTypeEClass, PROPERTY_CLASS_TYPE__ID);
-
-		propertyExtensionTypeEClass = createEClass(PROPERTY_EXTENSION_TYPE);
-
-		propertyNameTypeEClass = createEClass(PROPERTY_NAME_TYPE);
-		createEAttribute(propertyNameTypeEClass, PROPERTY_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(propertyNameTypeEClass, PROPERTY_NAME_TYPE__ID);
-
-		propertyResolverTypeEClass = createEClass(PROPERTY_RESOLVER_TYPE);
-		createEAttribute(propertyResolverTypeEClass, PROPERTY_RESOLVER_TYPE__TEXT_CONTENT);
-		createEAttribute(propertyResolverTypeEClass, PROPERTY_RESOLVER_TYPE__ID);
-
-		propertyTypeEClass = createEClass(PROPERTY_TYPE);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__DESCRIPTION);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__DISPLAY_NAME);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__ICON);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__PROPERTY_NAME);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__PROPERTY_CLASS);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__DEFAULT_VALUE);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__SUGGESTED_VALUE);
-		createEReference(propertyTypeEClass, PROPERTY_TYPE__PROPERTY_EXTENSION);
-		createEAttribute(propertyTypeEClass, PROPERTY_TYPE__ID);
-
-		redirectTypeEClass = createEClass(REDIRECT_TYPE);
-		createEReference(redirectTypeEClass, REDIRECT_TYPE__VIEW_PARAM);
-		createEAttribute(redirectTypeEClass, REDIRECT_TYPE__ID);
-		createEAttribute(redirectTypeEClass, REDIRECT_TYPE__INCLUDE_VIEW_PARAMS);
-
-		redirectViewParamTypeEClass = createEClass(REDIRECT_VIEW_PARAM_TYPE);
-		createEReference(redirectViewParamTypeEClass, REDIRECT_VIEW_PARAM_TYPE__NAME);
-		createEReference(redirectViewParamTypeEClass, REDIRECT_VIEW_PARAM_TYPE__VALUE);
-		createEAttribute(redirectViewParamTypeEClass, REDIRECT_VIEW_PARAM_TYPE__ID);
-
-		referencedBeanClassTypeEClass = createEClass(REFERENCED_BEAN_CLASS_TYPE);
-		createEAttribute(referencedBeanClassTypeEClass, REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(referencedBeanClassTypeEClass, REFERENCED_BEAN_CLASS_TYPE__ID);
-
-		referencedBeanNameTypeEClass = createEClass(REFERENCED_BEAN_NAME_TYPE);
-		createEAttribute(referencedBeanNameTypeEClass, REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(referencedBeanNameTypeEClass, REFERENCED_BEAN_NAME_TYPE__ID);
-
-		referencedBeanTypeEClass = createEClass(REFERENCED_BEAN_TYPE);
-		createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__DESCRIPTION);
-		createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__DISPLAY_NAME);
-		createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__ICON);
-		createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME);
-		createEReference(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS);
-		createEAttribute(referencedBeanTypeEClass, REFERENCED_BEAN_TYPE__ID);
-
-		rendererClassTypeEClass = createEClass(RENDERER_CLASS_TYPE);
-		createEAttribute(rendererClassTypeEClass, RENDERER_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(rendererClassTypeEClass, RENDERER_CLASS_TYPE__ID);
-
-		rendererExtensionTypeEClass = createEClass(RENDERER_EXTENSION_TYPE);
-
-		rendererTypeEClass = createEClass(RENDERER_TYPE);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__DESCRIPTION);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__DISPLAY_NAME);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__ICON);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__COMPONENT_FAMILY);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__RENDERER_TYPE);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__RENDERER_CLASS);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__FACET);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__ATTRIBUTE);
-		createEReference(rendererTypeEClass, RENDERER_TYPE__RENDERER_EXTENSION);
-		createEAttribute(rendererTypeEClass, RENDERER_TYPE__ID);
-
-		rendererTypeTypeEClass = createEClass(RENDERER_TYPE_TYPE);
-		createEAttribute(rendererTypeTypeEClass, RENDERER_TYPE_TYPE__TEXT_CONTENT);
-		createEAttribute(rendererTypeTypeEClass, RENDERER_TYPE_TYPE__ID);
-
-		renderKitClassTypeEClass = createEClass(RENDER_KIT_CLASS_TYPE);
-		createEAttribute(renderKitClassTypeEClass, RENDER_KIT_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(renderKitClassTypeEClass, RENDER_KIT_CLASS_TYPE__ID);
-
-		renderKitFactoryTypeEClass = createEClass(RENDER_KIT_FACTORY_TYPE);
-		createEAttribute(renderKitFactoryTypeEClass, RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(renderKitFactoryTypeEClass, RENDER_KIT_FACTORY_TYPE__ID);
-
-		renderKitIdTypeEClass = createEClass(RENDER_KIT_ID_TYPE);
-		createEAttribute(renderKitIdTypeEClass, RENDER_KIT_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(renderKitIdTypeEClass, RENDER_KIT_ID_TYPE__ID);
-
-		renderKitTypeEClass = createEClass(RENDER_KIT_TYPE);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__DESCRIPTION);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__DISPLAY_NAME);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__ICON);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDER_KIT_ID);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDER_KIT_CLASS);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDERER);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER);
-		createEReference(renderKitTypeEClass, RENDER_KIT_TYPE__RENDER_KIT_EXTENSION);
-		createEAttribute(renderKitTypeEClass, RENDER_KIT_TYPE__ID);
-
-		renderKitExtensionTypeEClass = createEClass(RENDER_KIT_EXTENSION_TYPE);
-
-		resourceHandlerTypeEClass = createEClass(RESOURCE_HANDLER_TYPE);
-		createEAttribute(resourceHandlerTypeEClass, RESOURCE_HANDLER_TYPE__TEXT_CONTENT);
-		createEAttribute(resourceHandlerTypeEClass, RESOURCE_HANDLER_TYPE__ID);
-
-		smallIconTypeEClass = createEClass(SMALL_ICON_TYPE);
-		createEAttribute(smallIconTypeEClass, SMALL_ICON_TYPE__TEXT_CONTENT);
-		createEAttribute(smallIconTypeEClass, SMALL_ICON_TYPE__ID);
-
-		sourceClassTypeEClass = createEClass(SOURCE_CLASS_TYPE);
-		createEAttribute(sourceClassTypeEClass, SOURCE_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(sourceClassTypeEClass, SOURCE_CLASS_TYPE__ID);
-
-		stateManagerTypeEClass = createEClass(STATE_MANAGER_TYPE);
-		createEAttribute(stateManagerTypeEClass, STATE_MANAGER_TYPE__TEXT_CONTENT);
-		createEAttribute(stateManagerTypeEClass, STATE_MANAGER_TYPE__ID);
-
-		suggestedValueTypeEClass = createEClass(SUGGESTED_VALUE_TYPE);
-		createEAttribute(suggestedValueTypeEClass, SUGGESTED_VALUE_TYPE__TEXT_CONTENT);
-		createEAttribute(suggestedValueTypeEClass, SUGGESTED_VALUE_TYPE__ID);
-
-		supportedLocaleTypeEClass = createEClass(SUPPORTED_LOCALE_TYPE);
-		createEAttribute(supportedLocaleTypeEClass, SUPPORTED_LOCALE_TYPE__TEXT_CONTENT);
-		createEAttribute(supportedLocaleTypeEClass, SUPPORTED_LOCALE_TYPE__ID);
-
-		systemEventClassTypeEClass = createEClass(SYSTEM_EVENT_CLASS_TYPE);
-		createEAttribute(systemEventClassTypeEClass, SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(systemEventClassTypeEClass, SYSTEM_EVENT_CLASS_TYPE__ID);
-
-		systemEventListenerClassTypeEClass = createEClass(SYSTEM_EVENT_LISTENER_CLASS_TYPE);
-		createEAttribute(systemEventListenerClassTypeEClass, SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(systemEventListenerClassTypeEClass, SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID);
-
-		systemEventListenerTypeEClass = createEClass(SYSTEM_EVENT_LISTENER_TYPE);
-		createEReference(systemEventListenerTypeEClass, SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS);
-		createEReference(systemEventListenerTypeEClass, SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS);
-		createEReference(systemEventListenerTypeEClass, SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS);
-		createEAttribute(systemEventListenerTypeEClass, SYSTEM_EVENT_LISTENER_TYPE__ID);
-
-		tagHandlerDelegateFactoryTypeEClass = createEClass(TAG_HANDLER_DELEGATE_FACTORY_TYPE);
-		createEAttribute(tagHandlerDelegateFactoryTypeEClass, TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(tagHandlerDelegateFactoryTypeEClass, TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID);
-
-		toViewIdTypeEClass = createEClass(TO_VIEW_ID_TYPE);
-		createEAttribute(toViewIdTypeEClass, TO_VIEW_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(toViewIdTypeEClass, TO_VIEW_ID_TYPE__ID);
-
-		validatorClassTypeEClass = createEClass(VALIDATOR_CLASS_TYPE);
-		createEAttribute(validatorClassTypeEClass, VALIDATOR_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(validatorClassTypeEClass, VALIDATOR_CLASS_TYPE__ID);
-
-		validatorIdTypeEClass = createEClass(VALIDATOR_ID_TYPE);
-		createEAttribute(validatorIdTypeEClass, VALIDATOR_ID_TYPE__TEXT_CONTENT);
-		createEAttribute(validatorIdTypeEClass, VALIDATOR_ID_TYPE__ID);
-
-		validatorTypeEClass = createEClass(VALIDATOR_TYPE);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__DESCRIPTION);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__DISPLAY_NAME);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__ICON);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__VALIDATOR_ID);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__VALIDATOR_CLASS);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__ATTRIBUTE);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__PROPERTY);
-		createEReference(validatorTypeEClass, VALIDATOR_TYPE__VALIDATOR_EXTENSION);
-		createEAttribute(validatorTypeEClass, VALIDATOR_TYPE__ID);
-
-		validatorExtensionTypeEClass = createEClass(VALIDATOR_EXTENSION_TYPE);
-
-		valueClassTypeEClass = createEClass(VALUE_CLASS_TYPE);
-		createEAttribute(valueClassTypeEClass, VALUE_CLASS_TYPE__TEXT_CONTENT);
-		createEAttribute(valueClassTypeEClass, VALUE_CLASS_TYPE__ID);
-
-		valueTypeEClass = createEClass(VALUE_TYPE);
-		createEAttribute(valueTypeEClass, VALUE_TYPE__TEXT_CONTENT);
-		createEAttribute(valueTypeEClass, VALUE_TYPE__ID);
-
-		variableResolverTypeEClass = createEClass(VARIABLE_RESOLVER_TYPE);
-		createEAttribute(variableResolverTypeEClass, VARIABLE_RESOLVER_TYPE__TEXT_CONTENT);
-		createEAttribute(variableResolverTypeEClass, VARIABLE_RESOLVER_TYPE__ID);
-
-		viewHandlerTypeEClass = createEClass(VIEW_HANDLER_TYPE);
-		createEAttribute(viewHandlerTypeEClass, VIEW_HANDLER_TYPE__TEXT_CONTENT);
-		createEAttribute(viewHandlerTypeEClass, VIEW_HANDLER_TYPE__ID);
-
-		resourceBundleTypeEClass = createEClass(RESOURCE_BUNDLE_TYPE);
-		createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__DESCRIPTION);
-		createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__DISPLAY_NAME);
-		createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__ICON);
-		createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__BASE_NAME);
-		createEReference(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__VAR);
-		createEAttribute(resourceBundleTypeEClass, RESOURCE_BUNDLE_TYPE__ID);
-
-		baseNameTypeEClass = createEClass(BASE_NAME_TYPE);
-		createEAttribute(baseNameTypeEClass, BASE_NAME_TYPE__TEXT_CONTENT);
-		createEAttribute(baseNameTypeEClass, BASE_NAME_TYPE__ID);
-
-		varTypeEClass = createEClass(VAR_TYPE);
-		createEAttribute(varTypeEClass, VAR_TYPE__TEXT_CONTENT);
-		createEAttribute(varTypeEClass, VAR_TYPE__ID);
-
-		viewDeclarationLanguageFactoryTypeEClass = createEClass(VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE);
-		createEAttribute(viewDeclarationLanguageFactoryTypeEClass, VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(viewDeclarationLanguageFactoryTypeEClass, VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID);
-
-		visitContextFactoryTypeEClass = createEClass(VISIT_CONTEXT_FACTORY_TYPE);
-		createEAttribute(visitContextFactoryTypeEClass, VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT);
-		createEAttribute(visitContextFactoryTypeEClass, VISIT_CONTEXT_FACTORY_TYPE__ID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-    /**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Obtain other dependent packages
-		XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
-
-		// Add supertypes to classes
-		applicationExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		attributeExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		behaviorExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		componentExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		converterExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		facesConfigExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		facetExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		factoryExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		lifecycleExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		managedBeanExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		navigationRuleExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		propertyExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		rendererExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		renderKitExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-		validatorExtensionTypeEClass.getESuperTypes().add(this.getExtensionType());
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(absoluteOrderingTypeEClass, AbsoluteOrderingType.class, "AbsoluteOrderingType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getAbsoluteOrderingType_Name(), this.getNameType(), null, "name", null, 0, -1, AbsoluteOrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAbsoluteOrderingType_Others(), this.getOrderingOthersType(), null, "others", null, 0, 1, AbsoluteOrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(actionListenerTypeEClass, ActionListenerType.class, "ActionListenerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getActionListenerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ActionListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getActionListenerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ActionListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(applicationFactoryTypeEClass, ApplicationFactoryType.class, "ApplicationFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getApplicationFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ApplicationFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getApplicationFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ApplicationFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(applicationTypeEClass, ApplicationType.class, "ApplicationType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getApplicationType_ActionListener(), this.getActionListenerType(), null, "actionListener", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_DefaultRenderKitId(), this.getDefaultRenderKitIdType(), null, "defaultRenderKitId", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_MessageBundle(), this.getMessageBundleType(), null, "messageBundle", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_NavigationHandler(), this.getNavigationHandlerType(), null, "navigationHandler", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_ViewHandler(), this.getViewHandlerType(), null, "viewHandler", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_StateManager(), this.getStateManagerType(), null, "stateManager", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_ELResolver(), this.getELResolverType(), null, "eLResolver", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_PropertyResolver(), this.getPropertyResolverType(), null, "propertyResolver", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_VariableResolver(), this.getVariableResolverType(), null, "variableResolver", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_ResourceHandler(), this.getResourceHandlerType(), null, "resourceHandler", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_SystemEventListener(), this.getSystemEventListenerType(), null, "systemEventListener", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_LocaleConfig(), this.getLocaleConfigType(), null, "localeConfig", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_ResourceBundle(), this.getResourceBundleType(), null, "resourceBundle", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_ApplicationExtension(), this.getApplicationExtensionType(), null, "applicationExtension", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getApplicationType_DefaultValidators(), this.getDefaultValidatorsType(), null, "defaultValidators", null, 0, -1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getApplicationType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ApplicationType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(applicationExtensionTypeEClass, ApplicationExtensionType.class, "ApplicationExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(attributeClassTypeEClass, AttributeClassType.class, "AttributeClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getAttributeClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, AttributeClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getAttributeClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, AttributeClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(attributeExtensionTypeEClass, AttributeExtensionType.class, "AttributeExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(attributeNameTypeEClass, AttributeNameType.class, "AttributeNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getAttributeNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, AttributeNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getAttributeNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, AttributeNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(attributeTypeEClass, AttributeType.class, "AttributeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getAttributeType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_Icon(), this.getIconType(), null, "icon", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_AttributeName(), this.getAttributeNameType(), null, "attributeName", null, 1, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_AttributeClass(), this.getAttributeClassType(), null, "attributeClass", null, 1, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_DefaultValue(), this.getDefaultValueType(), null, "defaultValue", null, 0, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_SuggestedValue(), this.getSuggestedValueType(), null, "suggestedValue", null, 0, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getAttributeType_AttributeExtension(), this.getAttributeExtensionType(), null, "attributeExtension", null, 0, -1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getAttributeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, AttributeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(behaviorClassTypeEClass, BehaviorClassType.class, "BehaviorClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getBehaviorClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, BehaviorClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBehaviorClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, BehaviorClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(behaviorIdTypeEClass, BehaviorIdType.class, "BehaviorIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getBehaviorIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, BehaviorIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBehaviorIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, BehaviorIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(behaviorTypeEClass, BehaviorType.class, "BehaviorType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getBehaviorType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_Icon(), this.getIconType(), null, "icon", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_BehaviorId(), this.getBehaviorIdType(), null, "behaviorId", null, 1, 1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_BehaviorClass(), this.getBehaviorClassType(), null, "behaviorClass", null, 1, 1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_Property(), this.getPropertyType(), null, "property", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBehaviorType_BehaviorExtension(), this.getBehaviorExtensionType(), null, "behaviorExtension", null, 0, -1, BehaviorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(behaviorExtensionTypeEClass, BehaviorExtensionType.class, "BehaviorExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(clientBehaviorRendererClassTypeEClass, ClientBehaviorRendererClassType.class, "ClientBehaviorRendererClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getClientBehaviorRendererClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ClientBehaviorRendererClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getClientBehaviorRendererClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ClientBehaviorRendererClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(clientBehaviorRendererTypeEClass, ClientBehaviorRendererType.class, "ClientBehaviorRendererType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getClientBehaviorRendererType_ClientBehaviorRendererType(), this.getClientBehaviorRendererTypeType(), null, "clientBehaviorRendererType", null, 1, 1, ClientBehaviorRendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getClientBehaviorRendererType_ClientBehaviorRendererClass(), this.getClientBehaviorRendererClassType(), null, "clientBehaviorRendererClass", null, 1, 1, ClientBehaviorRendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(clientBehaviorRendererTypeTypeEClass, ClientBehaviorRendererTypeType.class, "ClientBehaviorRendererTypeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getClientBehaviorRendererTypeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ClientBehaviorRendererTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getClientBehaviorRendererTypeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ClientBehaviorRendererTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(componentClassTypeEClass, ComponentClassType.class, "ComponentClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getComponentClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ComponentClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(componentExtensionTypeEClass, ComponentExtensionType.class, "ComponentExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(componentFamilyTypeEClass, ComponentFamilyType.class, "ComponentFamilyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getComponentFamilyType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ComponentFamilyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentFamilyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentFamilyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(componentTypeEClass, ComponentType.class, "ComponentType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getComponentType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_ComponentType(), this.getComponentTypeType(), null, "componentType", null, 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_ComponentClass(), this.getComponentClassType(), null, "componentClass", null, 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_Facet(), this.getFacetType(), null, "facet", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_Property(), this.getPropertyType(), null, "property", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_ComponentExtension(), this.getComponentExtensionType(), null, "componentExtension", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(componentTypeTypeEClass, ComponentTypeType.class, "ComponentTypeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getComponentTypeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ComponentTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentTypeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ComponentTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(converterClassTypeEClass, ConverterClassType.class, "ConverterClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getConverterClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ConverterClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getConverterClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(converterForClassTypeEClass, ConverterForClassType.class, "ConverterForClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getConverterForClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ConverterForClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getConverterForClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterForClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(converterIdTypeEClass, ConverterIdType.class, "ConverterIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getConverterIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ConverterIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getConverterIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(converterTypeEClass, ConverterType.class, "ConverterType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getConverterType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_ConverterId(), this.getConverterIdType(), null, "converterId", null, 0, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_ConverterForClass(), this.getConverterForClassType(), null, "converterForClass", null, 0, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_ConverterClass(), this.getConverterClassType(), null, "converterClass", null, 1, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_Property(), this.getPropertyType(), null, "property", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getConverterType_ConverterExtension(), this.getConverterExtensionType(), null, "converterExtension", null, 0, -1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getConverterType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ConverterType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(converterExtensionTypeEClass, ConverterExtensionType.class, "ConverterExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(defaultLocaleTypeEClass, DefaultLocaleType.class, "DefaultLocaleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDefaultLocaleType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DefaultLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDefaultLocaleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(defaultRenderKitIdTypeEClass, DefaultRenderKitIdType.class, "DefaultRenderKitIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDefaultRenderKitIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DefaultRenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDefaultRenderKitIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultRenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(defaultValidatorsTypeEClass, DefaultValidatorsType.class, "DefaultValidatorsType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getDefaultValidatorsType_ValidatorId(), this.getValidatorIdType(), null, "validatorId", null, 0, -1, DefaultValidatorsType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDefaultValidatorsType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultValidatorsType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(defaultValueTypeEClass, DefaultValueType.class, "DefaultValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDefaultValueType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DefaultValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDefaultValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DefaultValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(descriptionTypeEClass, DescriptionType.class, "DescriptionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDescriptionType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DescriptionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDescriptionType_Lang(), theXMLTypePackage.getLanguage(), "lang", null, 0, 1, DescriptionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDescriptionType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DescriptionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(displayNameTypeEClass, DisplayNameType.class, "DisplayNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDisplayNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, DisplayNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDisplayNameType_Lang(), theXMLTypePackage.getLanguage(), "lang", null, 0, 1, DisplayNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDisplayNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, DisplayNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(documentRootEClass, DocumentRoot.class, "DocumentRoot", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDocumentRoot_Mixed(), ecorePackage.getEFeatureMapEntry(), "mixed", null, 0, -1, null, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_XMLNSPrefixMap(), ecorePackage.getEStringToStringMapEntry(), null, "xMLNSPrefixMap", null, 0, -1, null, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_XSISchemaLocation(), ecorePackage.getEStringToStringMapEntry(), null, "xSISchemaLocation", null, 0, -1, null, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_AbsoluteOrdering(), this.getAbsoluteOrderingType(), null, "absoluteOrdering", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ActionListener(), this.getActionListenerType(), null, "actionListener", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Application(), this.getApplicationType(), null, "application", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ApplicationFactory(), this.getApplicationFactoryType(), null, "applicationFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_AttributeClass(), this.getAttributeClassType(), null, "attributeClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_AttributeExtension(), this.getAttributeExtensionType(), null, "attributeExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_AttributeName(), this.getAttributeNameType(), null, "attributeName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Behavior(), this.getBehaviorType(), null, "behavior", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_BehaviorClass(), this.getBehaviorClassType(), null, "behaviorClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_BehaviorId(), this.getBehaviorIdType(), null, "behaviorId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_BehaviorExtension(), this.getBehaviorExtensionType(), null, "behaviorExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Component(), this.getComponentType(), null, "component", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ComponentClass(), this.getComponentClassType(), null, "componentClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ComponentExtension(), this.getComponentExtensionType(), null, "componentExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ComponentFamily(), this.getComponentFamilyType(), null, "componentFamily", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ComponentType(), this.getComponentTypeType(), null, "componentType", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Converter(), this.getConverterType(), null, "converter", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ConverterClass(), this.getConverterClassType(), null, "converterClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ConverterForClass(), this.getConverterForClassType(), null, "converterForClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ConverterId(), this.getConverterIdType(), null, "converterId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_DefaultLocale(), this.getDefaultLocaleType(), null, "defaultLocale", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_DefaultRenderKitId(), this.getDefaultRenderKitIdType(), null, "defaultRenderKitId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_DefaultValidators(), this.getDefaultValidatorsType(), null, "defaultValidators", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_DefaultValue(), this.getDefaultValueType(), null, "defaultValue", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Description(), this.getDescriptionType(), null, "description", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ExceptionHandlerFactory(), this.getExceptionHandlerFactoryType(), null, "exceptionHandlerFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ExternalContextFactory(), this.getExternalContextFactoryType(), null, "externalContextFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FacesConfig(), this.getFacesConfigType(), null, "facesConfig", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FacesContextFactory(), this.getFacesContextFactoryType(), null, "facesContextFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Facet(), this.getFacetType(), null, "facet", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FacetExtension(), this.getFacetExtensionType(), null, "facetExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FacetName(), this.getFacetNameType(), null, "facetName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Factory(), this.getFactoryType(), null, "factory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FromAction(), this.getFromActionType(), null, "fromAction", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FromOutcome(), this.getFromOutcomeType(), null, "fromOutcome", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_FromViewId(), this.getFromViewIdType(), null, "fromViewId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Icon(), this.getIconType(), null, "icon", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_If(), this.getIfType(), null, "if", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Key(), this.getKeyType(), null, "key", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_KeyClass(), this.getKeyClassType(), null, "keyClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_LargeIcon(), this.getLargeIconType(), null, "largeIcon", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Lifecycle(), this.getLifecycleType(), null, "lifecycle", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_LifecycleFactory(), this.getLifecycleFactoryType(), null, "lifecycleFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ListEntries(), this.getListEntriesType(), null, "listEntries", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_LocaleConfig(), this.getLocaleConfigType(), null, "localeConfig", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ManagedBean(), this.getManagedBeanType(), null, "managedBean", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ManagedBeanClass(), this.getManagedBeanClassType(), null, "managedBeanClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ManagedBeanName(), this.getManagedBeanNameType(), null, "managedBeanName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ManagedBeanScope(), this.getManagedBeanScopeType(), null, "managedBeanScope", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ManagedProperty(), this.getManagedPropertyType(), null, "managedProperty", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_MapEntries(), this.getMapEntriesType(), null, "mapEntries", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_MapEntry(), this.getMapEntryType(), null, "mapEntry", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_MessageBundle(), this.getMessageBundleType(), null, "messageBundle", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Name(), this.getNameType(), null, "name", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_NavigationCase(), this.getNavigationCaseType(), null, "navigationCase", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_NavigationHandler(), this.getNavigationHandlerType(), null, "navigationHandler", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_NavigationRule(), this.getNavigationRuleType(), null, "navigationRule", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Ordering(), this.getOrderingType(), null, "ordering", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_OrderingOrdering(), this.getOrderingOrderingType(), null, "orderingOrdering", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Others(), this.getOrderingOthersType(), null, "others", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PartialViewContextFactory(), this.getPartialViewContextFactoryType(), null, "partialViewContextFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PhaseListener(), this.getPhaseListenerType(), null, "phaseListener", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Property(), this.getPropertyType(), null, "property", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PropertyClass(), this.getPropertyClassType(), null, "propertyClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PropertyExtension(), this.getPropertyExtensionType(), null, "propertyExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PropertyName(), this.getPropertyNameType(), null, "propertyName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_PropertyResolver(), this.getPropertyResolverType(), null, "propertyResolver", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Redirect(), this.getRedirectType(), null, "redirect", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RedirectViewParam(), this.getRedirectViewParamType(), null, "redirectViewParam", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ReferencedBean(), this.getReferencedBeanType(), null, "referencedBean", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ReferencedBeanClass(), this.getReferencedBeanClassType(), null, "referencedBeanClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ReferencedBeanName(), this.getReferencedBeanNameType(), null, "referencedBeanName", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Renderer(), this.getRendererType(), null, "renderer", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RendererClass(), this.getRendererClassType(), null, "rendererClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RendererExtension(), this.getRendererExtensionType(), null, "rendererExtension", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RendererType(), this.getRendererTypeType(), null, "rendererType", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RenderKit(), this.getRenderKitType(), null, "renderKit", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RenderKitClass(), this.getRenderKitClassType(), null, "renderKitClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RenderKitFactory(), this.getRenderKitFactoryType(), null, "renderKitFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_RenderKitId(), this.getRenderKitIdType(), null, "renderKitId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ResourceHandler(), this.getResourceHandlerType(), null, "resourceHandler", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SmallIcon(), this.getSmallIconType(), null, "smallIcon", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SourceClass(), this.getSourceClassType(), null, "sourceClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_StateManager(), this.getStateManagerType(), null, "stateManager", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SuggestedValue(), this.getSuggestedValueType(), null, "suggestedValue", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SupportedLocale(), this.getSupportedLocaleType(), null, "supportedLocale", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SystemEventClass(), this.getSystemEventClassType(), null, "systemEventClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SystemEventListener(), this.getSystemEventListenerType(), null, "systemEventListener", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_SystemEventListenerClass(), this.getSystemEventListenerClassType(), null, "systemEventListenerClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_TagHandlerDelegateFactory(), this.getTagHandlerDelegateFactoryType(), null, "tagHandlerDelegateFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ToViewId(), this.getToViewIdType(), null, "toViewId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Validator(), this.getValidatorType(), null, "validator", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ValidatorClass(), this.getValidatorClassType(), null, "validatorClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ValidatorId(), this.getValidatorIdType(), null, "validatorId", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_Value(), this.getValueType(), null, "value", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ValueClass(), this.getValueClassType(), null, "valueClass", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_VariableResolver(), this.getVariableResolverType(), null, "variableResolver", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ViewDeclarationLanguageFactory(), this.getViewDeclarationLanguageFactoryType(), null, "viewDeclarationLanguageFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_ViewHandler(), this.getViewHandlerType(), null, "viewHandler", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-		initEReference(getDocumentRoot_VisitContextFactory(), this.getVisitContextFactoryType(), null, "visitContextFactory", null, 0, -2, null, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED);
-
-		initEClass(dynamicAttributeEClass, DynamicAttribute.class, "DynamicAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getDynamicAttribute_Name(), ecorePackage.getEString(), "name", null, 0, 1, DynamicAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDynamicAttribute_Value(), ecorePackage.getEString(), "value", null, 0, 1, DynamicAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(dynamicElementEClass, DynamicElement.class, "DynamicElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getDynamicElement_ChildNodes(), this.getDynamicElement(), null, "childNodes", null, 0, -1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDynamicElement_Name(), ecorePackage.getEString(), "name", null, 0, 1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDynamicElement_Attributes(), this.getDynamicAttribute(), null, "attributes", null, 0, -1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDynamicElement_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, DynamicElement.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(elResolverTypeEClass, ELResolverType.class, "ELResolverType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getELResolverType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ELResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getELResolverType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ELResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(exceptionHandlerFactoryTypeEClass, ExceptionHandlerFactoryType.class, "ExceptionHandlerFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getExceptionHandlerFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ExceptionHandlerFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getExceptionHandlerFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ExceptionHandlerFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(extensionTypeEClass, ExtensionType.class, "ExtensionType", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getExtensionType_ChildNodes(), this.getDynamicElement(), null, "childNodes", null, 0, -1, ExtensionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getExtensionType_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, ExtensionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getExtensionType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ExtensionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(externalContextFactoryTypeEClass, ExternalContextFactoryType.class, "ExternalContextFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getExternalContextFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ExternalContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getExternalContextFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ExternalContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(facesConfigTypeEClass, FacesConfigType.class, "FacesConfigType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getFacesConfigType_Application(), this.getApplicationType(), null, "application", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Ordering(), this.getOrderingType(), null, "ordering", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_AbsoluteOrdering(), this.getAbsoluteOrderingType(), null, "absoluteOrdering", null, 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Factory(), this.getFactoryType(), null, "factory", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Component(), this.getComponentType(), null, "component", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Converter(), this.getConverterType(), null, "converter", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_ManagedBean(), this.getManagedBeanType(), null, "managedBean", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Name(), this.getNameType(), null, "name", null, 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_NavigationRule(), this.getNavigationRuleType(), null, "navigationRule", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_ReferencedBean(), this.getReferencedBeanType(), null, "referencedBean", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_RenderKit(), this.getRenderKitType(), null, "renderKit", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Lifecycle(), this.getLifecycleType(), null, "lifecycle", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Validator(), this.getValidatorType(), null, "validator", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_Behavior(), this.getBehaviorType(), null, "behavior", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacesConfigType_FacesConfigExtension(), this.getFacesConfigExtensionType(), null, "facesConfigExtension", null, 0, -1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacesConfigType_Xmlns(), theXMLTypePackage.getString(), "xmlns", "http://java.sun.com/JSF/Configuration", 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacesConfigType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacesConfigType_MetadataComplete(), theXMLTypePackage.getBoolean(), "metadataComplete", null, 0, 1, FacesConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(facesConfigExtensionTypeEClass, FacesConfigExtensionType.class, "FacesConfigExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(facesContextFactoryTypeEClass, FacesContextFactoryType.class, "FacesContextFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFacesContextFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FacesContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacesContextFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacesContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(facetExtensionTypeEClass, FacetExtensionType.class, "FacetExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(facetNameTypeEClass, FacetNameType.class, "FacetNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFacetNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FacetNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacetNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacetNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(facetTypeEClass, FacetType.class, "FacetType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getFacetType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacetType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacetType_Icon(), this.getIconType(), null, "icon", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacetType_FacetName(), this.getFacetNameType(), null, "facetName", null, 1, 1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFacetType_FacetExtension(), this.getFacetExtensionType(), null, "facetExtension", null, 0, -1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFacetType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FacetType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(factoryTypeEClass, FactoryType.class, "FactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getFactoryType_ApplicationFactory(), this.getApplicationFactoryType(), null, "applicationFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_ExceptionHandlerFactory(), this.getExceptionHandlerFactoryType(), null, "exceptionHandlerFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_ExternalContextFactory(), this.getExternalContextFactoryType(), null, "externalContextFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_FacesContextFactory(), this.getFacesContextFactoryType(), null, "facesContextFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_PartialViewContextFactory(), this.getPartialViewContextFactoryType(), null, "partialViewContextFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_LifecycleFactory(), this.getLifecycleFactoryType(), null, "lifecycleFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_ViewDeclarationLanguageFactory(), this.getViewDeclarationLanguageFactoryType(), null, "viewDeclarationLanguageFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_TagHandlerDelegateFactory(), this.getTagHandlerDelegateFactoryType(), null, "tagHandlerDelegateFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_RenderKitFactory(), this.getRenderKitFactoryType(), null, "renderKitFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_VisitContextFactory(), this.getVisitContextFactoryType(), null, "visitContextFactory", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getFactoryType_FactoryExtension(), this.getFactoryExtensionType(), null, "factoryExtension", null, 0, -1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(factoryExtensionTypeEClass, FactoryExtensionType.class, "FactoryExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(fromActionTypeEClass, FromActionType.class, "FromActionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFromActionType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FromActionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFromActionType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FromActionType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(fromOutcomeTypeEClass, FromOutcomeType.class, "FromOutcomeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFromOutcomeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FromOutcomeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFromOutcomeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FromOutcomeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(fromViewIdTypeEClass, FromViewIdType.class, "FromViewIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getFromViewIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, FromViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getFromViewIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, FromViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(iconTypeEClass, IconType.class, "IconType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getIconType_SmallIcon(), this.getSmallIconType(), null, "smallIcon", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getIconType_LargeIcon(), this.getLargeIconType(), null, "largeIcon", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIconType_Lang(), theXMLTypePackage.getLanguage(), "lang", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIconType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, IconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(ifTypeEClass, IfType.class, "IfType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getIfType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, IfType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getIfType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, IfType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(keyClassTypeEClass, KeyClassType.class, "KeyClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getKeyClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, KeyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getKeyClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, KeyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(keyTypeEClass, KeyType.class, "KeyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getKeyType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, KeyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getKeyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, KeyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(largeIconTypeEClass, LargeIconType.class, "LargeIconType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getLargeIconType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, LargeIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getLargeIconType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LargeIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(lifecycleFactoryTypeEClass, LifecycleFactoryType.class, "LifecycleFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getLifecycleFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, LifecycleFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getLifecycleFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LifecycleFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(lifecycleTypeEClass, LifecycleType.class, "LifecycleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getLifecycleType_PhaseListener(), this.getPhaseListenerType(), null, "phaseListener", null, 0, -1, LifecycleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getLifecycleType_LifecycleExtension(), this.getLifecycleExtensionType(), null, "lifecycleExtension", null, 0, -1, LifecycleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getLifecycleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LifecycleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(lifecycleExtensionTypeEClass, LifecycleExtensionType.class, "LifecycleExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(listEntriesTypeEClass, ListEntriesType.class, "ListEntriesType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getListEntriesType_ValueClass(), this.getValueClassType(), null, "valueClass", null, 0, 1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getListEntriesType_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, -1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getListEntriesType_Value(), this.getValueType(), null, "value", null, 0, -1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getListEntriesType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ListEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(localeConfigTypeEClass, LocaleConfigType.class, "LocaleConfigType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getLocaleConfigType_DefaultLocale(), this.getDefaultLocaleType(), null, "defaultLocale", null, 0, 1, LocaleConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getLocaleConfigType_SupportedLocale(), this.getSupportedLocaleType(), null, "supportedLocale", null, 0, -1, LocaleConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getLocaleConfigType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, LocaleConfigType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(managedBeanClassTypeEClass, ManagedBeanClassType.class, "ManagedBeanClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getManagedBeanClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ManagedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedBeanClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(managedBeanNameTypeEClass, ManagedBeanNameType.class, "ManagedBeanNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getManagedBeanNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ManagedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedBeanNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(managedBeanScopeTypeEClass, ManagedBeanScopeType.class, "ManagedBeanScopeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getManagedBeanScopeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ManagedBeanScopeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedBeanScopeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanScopeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(managedBeanTypeEClass, ManagedBeanType.class, "ManagedBeanType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getManagedBeanType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ManagedBeanName(), this.getManagedBeanNameType(), null, "managedBeanName", null, 1, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ManagedBeanClass(), this.getManagedBeanClassType(), null, "managedBeanClass", null, 1, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ManagedBeanScope(), this.getManagedBeanScopeType(), null, "managedBeanScope", null, 1, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ManagedProperty(), this.getManagedPropertyType(), null, "managedProperty", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_MapEntries(), this.getMapEntriesType(), null, "mapEntries", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ListEntries(), this.getListEntriesType(), null, "listEntries", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedBeanType_ManagedBeanExtension(), this.getManagedBeanExtensionType(), null, "managedBeanExtension", null, 0, -1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedBeanType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedBeanType_Eager(), theXMLTypePackage.getBoolean(), "eager", null, 0, 1, ManagedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(managedBeanExtensionTypeEClass, ManagedBeanExtensionType.class, "ManagedBeanExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(managedPropertyTypeEClass, ManagedPropertyType.class, "ManagedPropertyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getManagedPropertyType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_PropertyName(), this.getPropertyNameType(), null, "propertyName", null, 1, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_PropertyClass(), this.getPropertyClassType(), null, "propertyClass", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_MapEntries(), this.getMapEntriesType(), null, "mapEntries", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_Value(), this.getValueType(), null, "value", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getManagedPropertyType_ListEntries(), this.getListEntriesType(), null, "listEntries", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getManagedPropertyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ManagedPropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(mapEntriesTypeEClass, MapEntriesType.class, "MapEntriesType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getMapEntriesType_KeyClass(), this.getKeyClassType(), null, "keyClass", null, 0, 1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMapEntriesType_ValueClass(), this.getValueClassType(), null, "valueClass", null, 0, 1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMapEntriesType_MapEntry(), this.getMapEntryType(), null, "mapEntry", null, 0, -1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMapEntriesType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, MapEntriesType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(mapEntryTypeEClass, MapEntryType.class, "MapEntryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getMapEntryType_Key(), this.getKeyType(), null, "key", null, 1, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMapEntryType_NullValue(), this.getNullValueType(), null, "nullValue", null, 0, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMapEntryType_Value(), this.getValueType(), null, "value", null, 0, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMapEntryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, MapEntryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(messageBundleTypeEClass, MessageBundleType.class, "MessageBundleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getMessageBundleType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, MessageBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMessageBundleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, MessageBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(nameTypeEClass, NameType.class, "NameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, NameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(navigationCaseTypeEClass, NavigationCaseType.class, "NavigationCaseType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getNavigationCaseType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_Icon(), this.getIconType(), null, "icon", null, 0, -1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_FromAction(), this.getFromActionType(), null, "fromAction", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_FromOutcome(), this.getFromOutcomeType(), null, "fromOutcome", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_If(), this.getIfType(), null, "if", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_ToViewId(), this.getToViewIdType(), null, "toViewId", null, 1, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationCaseType_Redirect(), this.getRedirectType(), null, "redirect", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getNavigationCaseType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NavigationCaseType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(navigationHandlerTypeEClass, NavigationHandlerType.class, "NavigationHandlerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getNavigationHandlerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, NavigationHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getNavigationHandlerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NavigationHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(navigationRuleTypeEClass, NavigationRuleType.class, "NavigationRuleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getNavigationRuleType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationRuleType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationRuleType_Icon(), this.getIconType(), null, "icon", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationRuleType_FromViewId(), this.getFromViewIdType(), null, "fromViewId", null, 0, 1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationRuleType_NavigationCase(), this.getNavigationCaseType(), null, "navigationCase", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getNavigationRuleType_NavigationRuleExtension(), this.getNavigationRuleExtensionType(), null, "navigationRuleExtension", null, 0, -1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getNavigationRuleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NavigationRuleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(navigationRuleExtensionTypeEClass, NavigationRuleExtensionType.class, "NavigationRuleExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(nullValueTypeEClass, NullValueType.class, "NullValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getNullValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, NullValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(orderingTypeEClass, OrderingType.class, "OrderingType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getOrderingType_Before(), this.getOrderingOrderingType(), null, "before", null, 0, 1, OrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getOrderingType_After(), this.getOrderingOrderingType(), null, "after", null, 0, 1, OrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(orderingOrderingTypeEClass, OrderingOrderingType.class, "OrderingOrderingType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getOrderingOrderingType_Name(), this.getNameType(), null, "name", null, 0, -1, OrderingOrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getOrderingOrderingType_Others(), this.getOrderingOthersType(), null, "others", null, 0, 1, OrderingOrderingType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(orderingOthersTypeEClass, OrderingOthersType.class, "OrderingOthersType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getOrderingOthersType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, OrderingOthersType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(partialViewContextFactoryTypeEClass, PartialViewContextFactoryType.class, "PartialViewContextFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPartialViewContextFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PartialViewContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPartialViewContextFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PartialViewContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(phaseListenerTypeEClass, PhaseListenerType.class, "PhaseListenerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPhaseListenerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PhaseListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPhaseListenerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PhaseListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(propertyClassTypeEClass, PropertyClassType.class, "PropertyClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPropertyClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PropertyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPropertyClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(propertyExtensionTypeEClass, PropertyExtensionType.class, "PropertyExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(propertyNameTypeEClass, PropertyNameType.class, "PropertyNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPropertyNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PropertyNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPropertyNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(propertyResolverTypeEClass, PropertyResolverType.class, "PropertyResolverType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPropertyResolverType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, PropertyResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPropertyResolverType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(propertyTypeEClass, PropertyType.class, "PropertyType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPropertyType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_Icon(), this.getIconType(), null, "icon", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_PropertyName(), this.getPropertyNameType(), null, "propertyName", null, 1, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_PropertyClass(), this.getPropertyClassType(), null, "propertyClass", null, 1, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_DefaultValue(), this.getDefaultValueType(), null, "defaultValue", null, 0, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_SuggestedValue(), this.getSuggestedValueType(), null, "suggestedValue", null, 0, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPropertyType_PropertyExtension(), this.getPropertyExtensionType(), null, "propertyExtension", null, 0, -1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPropertyType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, PropertyType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(redirectTypeEClass, RedirectType.class, "RedirectType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getRedirectType_ViewParam(), this.getRedirectViewParamType(), null, "viewParam", null, 0, -1, RedirectType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRedirectType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RedirectType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRedirectType_IncludeViewParams(), theXMLTypePackage.getBoolean(), "includeViewParams", null, 0, 1, RedirectType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(redirectViewParamTypeEClass, RedirectViewParamType.class, "RedirectViewParamType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getRedirectViewParamType_Name(), this.getNameType(), null, "name", null, 1, 1, RedirectViewParamType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRedirectViewParamType_Value(), this.getValueType(), null, "value", null, 1, 1, RedirectViewParamType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRedirectViewParamType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RedirectViewParamType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(referencedBeanClassTypeEClass, ReferencedBeanClassType.class, "ReferencedBeanClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getReferencedBeanClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ReferencedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedBeanClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ReferencedBeanClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(referencedBeanNameTypeEClass, ReferencedBeanNameType.class, "ReferencedBeanNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getReferencedBeanNameType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ReferencedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedBeanNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ReferencedBeanNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(referencedBeanTypeEClass, ReferencedBeanType.class, "ReferencedBeanType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getReferencedBeanType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getReferencedBeanType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getReferencedBeanType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getReferencedBeanType_ReferencedBeanName(), this.getReferencedBeanNameType(), null, "referencedBeanName", null, 1, 1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getReferencedBeanType_ReferencedBeanClass(), this.getReferencedBeanClassType(), null, "referencedBeanClass", null, 1, 1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedBeanType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ReferencedBeanType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(rendererClassTypeEClass, RendererClassType.class, "RendererClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRendererClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RendererClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRendererClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RendererClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(rendererExtensionTypeEClass, RendererExtensionType.class, "RendererExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(rendererTypeEClass, RendererType.class, "RendererType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getRendererType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_Icon(), this.getIconType(), null, "icon", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_ComponentFamily(), this.getComponentFamilyType(), null, "componentFamily", null, 1, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_RendererType(), this.getRendererTypeType(), null, "rendererType", null, 1, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_RendererClass(), this.getRendererClassType(), null, "rendererClass", null, 1, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_Facet(), this.getFacetType(), null, "facet", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRendererType_RendererExtension(), this.getRendererExtensionType(), null, "rendererExtension", null, 0, -1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRendererType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RendererType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(rendererTypeTypeEClass, RendererTypeType.class, "RendererTypeType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRendererTypeType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RendererTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRendererTypeType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RendererTypeType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(renderKitClassTypeEClass, RenderKitClassType.class, "RenderKitClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRenderKitClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RenderKitClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRenderKitClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(renderKitFactoryTypeEClass, RenderKitFactoryType.class, "RenderKitFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRenderKitFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RenderKitFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRenderKitFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(renderKitIdTypeEClass, RenderKitIdType.class, "RenderKitIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getRenderKitIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, RenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRenderKitIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(renderKitTypeEClass, RenderKitType.class, "RenderKitType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getRenderKitType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_Icon(), this.getIconType(), null, "icon", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_RenderKitId(), this.getRenderKitIdType(), null, "renderKitId", null, 0, 1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_RenderKitClass(), this.getRenderKitClassType(), null, "renderKitClass", null, 0, 1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_Renderer(), this.getRendererType(), null, "renderer", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_ClientBehaviorRenderer(), this.getClientBehaviorRendererType(), null, "clientBehaviorRenderer", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getRenderKitType_RenderKitExtension(), this.getRenderKitExtensionType(), null, "renderKitExtension", null, 0, -1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getRenderKitType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, RenderKitType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(renderKitExtensionTypeEClass, RenderKitExtensionType.class, "RenderKitExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(resourceHandlerTypeEClass, ResourceHandlerType.class, "ResourceHandlerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getResourceHandlerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ResourceHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getResourceHandlerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ResourceHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(smallIconTypeEClass, SmallIconType.class, "SmallIconType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSmallIconType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SmallIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSmallIconType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SmallIconType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(sourceClassTypeEClass, SourceClassType.class, "SourceClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSourceClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SourceClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSourceClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SourceClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(stateManagerTypeEClass, StateManagerType.class, "StateManagerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getStateManagerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, StateManagerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getStateManagerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, StateManagerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(suggestedValueTypeEClass, SuggestedValueType.class, "SuggestedValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSuggestedValueType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SuggestedValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSuggestedValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SuggestedValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(supportedLocaleTypeEClass, SupportedLocaleType.class, "SupportedLocaleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSupportedLocaleType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SupportedLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSupportedLocaleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SupportedLocaleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(systemEventClassTypeEClass, SystemEventClassType.class, "SystemEventClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSystemEventClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SystemEventClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSystemEventClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SystemEventClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(systemEventListenerClassTypeEClass, SystemEventListenerClassType.class, "SystemEventListenerClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSystemEventListenerClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, SystemEventListenerClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSystemEventListenerClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SystemEventListenerClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(systemEventListenerTypeEClass, SystemEventListenerType.class, "SystemEventListenerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getSystemEventListenerType_SystemEventListenerClass(), this.getSystemEventListenerClassType(), null, "systemEventListenerClass", null, 1, 1, SystemEventListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getSystemEventListenerType_SystemEventClass(), this.getSystemEventClassType(), null, "systemEventClass", null, 1, 1, SystemEventListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getSystemEventListenerType_SourceClass(), this.getSourceClassType(), null, "sourceClass", null, 0, 1, SystemEventListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSystemEventListenerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, SystemEventListenerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(tagHandlerDelegateFactoryTypeEClass, TagHandlerDelegateFactoryType.class, "TagHandlerDelegateFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTagHandlerDelegateFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, TagHandlerDelegateFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagHandlerDelegateFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, TagHandlerDelegateFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(toViewIdTypeEClass, ToViewIdType.class, "ToViewIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getToViewIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ToViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getToViewIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ToViewIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(validatorClassTypeEClass, ValidatorClassType.class, "ValidatorClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getValidatorClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValidatorClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getValidatorClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValidatorClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(validatorIdTypeEClass, ValidatorIdType.class, "ValidatorIdType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getValidatorIdType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValidatorIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getValidatorIdType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValidatorIdType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(validatorTypeEClass, ValidatorType.class, "ValidatorType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getValidatorType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_ValidatorId(), this.getValidatorIdType(), null, "validatorId", null, 1, 1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_ValidatorClass(), this.getValidatorClassType(), null, "validatorClass", null, 1, 1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_Attribute(), this.getAttributeType(), null, "attribute", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_Property(), this.getPropertyType(), null, "property", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getValidatorType_ValidatorExtension(), this.getValidatorExtensionType(), null, "validatorExtension", null, 0, -1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getValidatorType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValidatorType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(validatorExtensionTypeEClass, ValidatorExtensionType.class, "ValidatorExtensionType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(valueClassTypeEClass, ValueClassType.class, "ValueClassType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getValueClassType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValueClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getValueClassType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValueClassType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(valueTypeEClass, ValueType.class, "ValueType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getValueType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getValueType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ValueType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(variableResolverTypeEClass, VariableResolverType.class, "VariableResolverType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getVariableResolverType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, VariableResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getVariableResolverType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, VariableResolverType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(viewHandlerTypeEClass, ViewHandlerType.class, "ViewHandlerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getViewHandlerType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ViewHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getViewHandlerType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ViewHandlerType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(resourceBundleTypeEClass, ResourceBundleType.class, "ResourceBundleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getResourceBundleType_Description(), this.getDescriptionType(), null, "description", null, 0, -1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getResourceBundleType_DisplayName(), this.getDisplayNameType(), null, "displayName", null, 0, -1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getResourceBundleType_Icon(), this.getIconType(), null, "icon", null, 0, -1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getResourceBundleType_BaseName(), this.getBaseNameType(), null, "baseName", null, 0, 1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getResourceBundleType_Var(), this.getVarType(), null, "var", null, 0, 1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getResourceBundleType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ResourceBundleType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(baseNameTypeEClass, BaseNameType.class, "BaseNameType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getBaseNameType_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, BaseNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getBaseNameType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, BaseNameType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(varTypeEClass, VarType.class, "VarType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getVarType_TextContent(), ecorePackage.getEString(), "textContent", null, 0, 1, VarType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getVarType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, VarType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(viewDeclarationLanguageFactoryTypeEClass, ViewDeclarationLanguageFactoryType.class, "ViewDeclarationLanguageFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getViewDeclarationLanguageFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, ViewDeclarationLanguageFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getViewDeclarationLanguageFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, ViewDeclarationLanguageFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(visitContextFactoryTypeEClass, VisitContextFactoryType.class, "VisitContextFactoryType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getVisitContextFactoryType_TextContent(), theXMLTypePackage.getString(), "textContent", null, 0, 1, VisitContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getVisitContextFactoryType_Id(), theXMLTypePackage.getID(), "id", null, 0, 1, VisitContextFactoryType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-    /**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";			
-		addAnnotation
-		  (this, 
-		   source, 
-		   new String[] {
-			 "qualified", "false"
-		   });		
-		addAnnotation
-		  (absoluteOrderingTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "absolute-ordering_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getAbsoluteOrderingType_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAbsoluteOrderingType_Others(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "others",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (actionListenerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "action-listener_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getActionListenerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getActionListenerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (applicationFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "application-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getApplicationFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getApplicationFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (applicationTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "application_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getApplicationType_ActionListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "action-listener",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_DefaultRenderKitId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-render-kit-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_MessageBundle(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "message-bundle",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_NavigationHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-handler",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_ViewHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-handler",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_StateManager(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "state-manager",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_ELResolver(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "el-resolver",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_PropertyResolver(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-resolver",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_VariableResolver(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "variable-resolver",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_ResourceHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "resource-handler",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_SystemEventListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-listener",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_LocaleConfig(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "locale-config",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_ResourceBundle(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "resource-bundle",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_ApplicationExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "application-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_DefaultValidators(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-validators",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getApplicationType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (applicationExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "application-extension_._type"
-		   });		
-		addAnnotation
-		  (attributeClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "attribute-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getAttributeClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getAttributeClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (attributeExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "attribute-extension_._type"
-		   });		
-		addAnnotation
-		  (attributeNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "attribute-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getAttributeNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getAttributeNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (attributeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "attribute_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getAttributeType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_AttributeName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_AttributeClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_DefaultValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_SuggestedValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "suggested-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_AttributeExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getAttributeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (behaviorClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "behavior-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBehaviorClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBehaviorClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (behaviorIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "behavior-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBehaviorIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBehaviorIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (behaviorTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "behavior_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getBehaviorType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_BehaviorId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_BehaviorClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_Property(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getBehaviorType_BehaviorExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (behaviorExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "behavior-extension_._type"
-		   });		
-		addAnnotation
-		  (clientBehaviorRendererClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "client-behavior-renderer-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (clientBehaviorRendererTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "client-behavior-renderer_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererType_ClientBehaviorRendererType(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "client-behavior-renderer-type",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererType_ClientBehaviorRendererClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "client-behavior-renderer-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (clientBehaviorRendererTypeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "client-behavior-renderer-type_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererTypeType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getClientBehaviorRendererTypeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (componentClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "component-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (componentExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "component-extension_._type"
-		   });		
-		addAnnotation
-		  (componentFamilyTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "component-family_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentFamilyType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentFamilyType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (componentTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "component_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getComponentType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_ComponentType(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-type",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_ComponentClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_Facet(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_Property(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_ComponentExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getComponentType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (componentTypeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "component-type_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentTypeType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getComponentTypeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (converterClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "converter-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (converterForClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "converter-for-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterForClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterForClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (converterIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "converter-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getConverterIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (converterTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "converter_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getConverterType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_ConverterId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_ConverterForClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-for-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_ConverterClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_Property(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_ConverterExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getConverterType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (converterExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "converter-extension_._type"
-		   });		
-		addAnnotation
-		  (defaultLocaleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "default-locale_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultLocaleType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultLocaleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (defaultRenderKitIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "default-render-kit-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultRenderKitIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultRenderKitIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (defaultValidatorsTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "default-validators_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getDefaultValidatorsType_ValidatorId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getDefaultValidatorsType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (defaultValueTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "default-value_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultValueType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDefaultValueType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (descriptionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "description_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDescriptionType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDescriptionType_Lang(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "lang",
-			 "namespace", "http://www.w3.org/XML/1998/namespace"
-		   });		
-		addAnnotation
-		  (getDescriptionType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (displayNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "display-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDisplayNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getDisplayNameType_Lang(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "lang",
-			 "namespace", "http://www.w3.org/XML/1998/namespace"
-		   });		
-		addAnnotation
-		  (getDisplayNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (documentRootEClass, 
-		   source, 
-		   new String[] {
-			 "name", "",
-			 "kind", "mixed"
-		   });		
-		addAnnotation
-		  (getDocumentRoot_Mixed(), 
-		   source, 
-		   new String[] {
-			 "kind", "elementWildcard",
-			 "name", ":mixed"
-		   });		
-		addAnnotation
-		  (getDocumentRoot_XMLNSPrefixMap(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "xmlns:prefix"
-		   });		
-		addAnnotation
-		  (getDocumentRoot_XSISchemaLocation(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "xsi:schemaLocation"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_AbsoluteOrdering(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "absolute-ordering",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ActionListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "action-listener",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Application(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "application",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ApplicationFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "application-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_AttributeClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_AttributeExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_AttributeName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Behavior(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_BehaviorClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_BehaviorId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_BehaviorExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Component(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ComponentClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ComponentExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ComponentFamily(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-family",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ComponentType(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-type",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Converter(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ConverterClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ConverterForClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-for-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ConverterId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_DefaultLocale(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-locale",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_DefaultRenderKitId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-render-kit-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_DefaultValidators(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-validators",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_DefaultValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-value",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ExceptionHandlerFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "exception-handler-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ExternalContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "external-context-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FacesConfig(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "faces-config",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FacesContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "faces-context-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Facet(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FacetExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FacetName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Factory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FromAction(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-action",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FromOutcome(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-outcome",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_FromViewId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-view-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_If(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "if",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Key(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "key",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_KeyClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "key-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_LargeIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "large-icon",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Lifecycle(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "lifecycle",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_LifecycleFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "lifecycle-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ListEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "list-entries",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_LocaleConfig(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "locale-config",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ManagedBean(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ManagedBeanClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ManagedBeanName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ManagedBeanScope(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-scope",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ManagedProperty(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-property",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_MapEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "map-entries",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_MapEntry(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "map-entry",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_MessageBundle(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "message-bundle",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_NavigationCase(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-case",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_NavigationHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-handler",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_NavigationRule(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-rule",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_NullValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "null-value",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Ordering(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ordering",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_OrderingOrdering(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ordering-ordering",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Others(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "others",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PartialViewContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "partial-view-context-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PhaseListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "phase-listener",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Property(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PropertyClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PropertyExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PropertyName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_PropertyResolver(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-resolver",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Redirect(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "redirect",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RedirectViewParam(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-param",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ReferencedBean(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ReferencedBeanClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ReferencedBeanName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean-name",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Renderer(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RendererClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RendererExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-extension",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RendererType(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-type",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RenderKit(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RenderKitClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RenderKitFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_RenderKitId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ResourceHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "resource-handler",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SmallIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "small-icon",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SourceClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "source-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_StateManager(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "state-manager",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SuggestedValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "suggested-value",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SupportedLocale(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "supported-locale",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SystemEventClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SystemEventListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-listener",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_SystemEventListenerClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-listener-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_TagHandlerDelegateFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "tag-handler-delegate-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ToViewId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "to-view-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Validator(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ValidatorClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ValidatorId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-id",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ValueClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value-class",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_VariableResolver(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "variable-resolver",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ViewDeclarationLanguageFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-declaration-language-factory",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_ViewHandler(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-handler",
-			 "namespace", "##targetNamespace"
-		   });			
-		addAnnotation
-		  (getDocumentRoot_VisitContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "visit-context-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (elResolverTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "el-resolver_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getELResolverType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getELResolverType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (exceptionHandlerFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "exception-handler-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getExceptionHandlerFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getExceptionHandlerFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getExtensionType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getExtensionType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (externalContextFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "external-context-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getExternalContextFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getExternalContextFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (facesConfigTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "faces-config_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Application(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "application",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Ordering(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "ordering",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_AbsoluteOrdering(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "absolute-ordering",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Factory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Component(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Converter(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "converter",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_ManagedBean(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_NavigationRule(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-rule",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_ReferencedBean(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_RenderKit(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Lifecycle(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "lifecycle",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Validator(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Behavior(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "behavior",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_FacesConfigExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "faces-config-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Xmlns(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "xmlns",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacesConfigType_MetadataComplete(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "metadata-complete",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (facesConfigExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "faces-config-extension_._type"
-		   });		
-		addAnnotation
-		  (facesContextFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "faces-context-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFacesContextFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFacesContextFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (facetExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "facet-extension_._type"
-		   });		
-		addAnnotation
-		  (facetNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "facet-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFacetNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFacetNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (facetTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "facet_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getFacetType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacetType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacetType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacetType_FacetName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacetType_FacetExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFacetType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (factoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "factory_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getFactoryType_ApplicationFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "application-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_ExceptionHandlerFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "exception-handler-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_ExternalContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "external-context-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_FacesContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "faces-context-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_PartialViewContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "partial-view-context-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_LifecycleFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "lifecycle-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_ViewDeclarationLanguageFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-declaration-language-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_TagHandlerDelegateFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "tag-handler-delegate-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_RenderKitFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_VisitContextFactory(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "visit-context-factory",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_FactoryExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "factory-type",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (factoryExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "factory-extension_._type"
-		   });		
-		addAnnotation
-		  (fromActionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "from-action_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromActionType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromActionType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (fromOutcomeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "from-outcome_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromOutcomeType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromOutcomeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (fromViewIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "from-view-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromViewIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getFromViewIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (iconTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "icon_._type",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getIconType_SmallIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "small-icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getIconType_LargeIcon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "large-icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getIconType_Lang(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "lang",
-			 "namespace", "http://www.w3.org/XML/1998/namespace"
-		   });		
-		addAnnotation
-		  (getIconType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (ifTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "if_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getIfType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getIfType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (keyClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "key-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getKeyClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getKeyClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (keyTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "key_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getKeyType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getKeyType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (largeIconTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "large-icon_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getLargeIconType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getLargeIconType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (lifecycleFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "lifecycle-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getLifecycleFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getLifecycleFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (lifecycleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "lifecycle_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getLifecycleType_PhaseListener(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "phase-listener",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getLifecycleType_LifecycleExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "lifecycle-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getLifecycleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (lifecycleExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "lifecycle-extension_._type"
-		   });		
-		addAnnotation
-		  (listEntriesTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "list-entries_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getListEntriesType_ValueClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getListEntriesType_NullValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "null-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getListEntriesType_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getListEntriesType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (localeConfigTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "locale-config_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getLocaleConfigType_DefaultLocale(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-locale",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getLocaleConfigType_SupportedLocale(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "supported-locale",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getLocaleConfigType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (managedBeanClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-bean-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (managedBeanNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-bean-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (managedBeanScopeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-bean-scope_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanScopeType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getManagedBeanScopeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (managedBeanTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-bean_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ManagedBeanName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ManagedBeanClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ManagedBeanScope(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-scope",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ManagedProperty(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-property",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_MapEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "map-entries",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ListEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "list-entries",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_ManagedBeanExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "managed-bean-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedBeanType_Eager(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "eager",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (managedBeanExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-bean-extension_._type"
-		   });		
-		addAnnotation
-		  (managedPropertyTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "managed-property_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_PropertyName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_PropertyClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_MapEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "map-entries",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_NullValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "null-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_ListEntries(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "list-entries",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getManagedPropertyType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (mapEntriesTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "map-entries_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getMapEntriesType_KeyClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "key-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntriesType_ValueClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntriesType_MapEntry(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "map-entry",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntriesType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (mapEntryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "map-entry_._type",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getMapEntryType_Key(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "key",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntryType_NullValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "null-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntryType_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getMapEntryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (messageBundleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "message-bundle_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getMessageBundleType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getMessageBundleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (nameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (navigationCaseTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "navigation-case_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_FromAction(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-action",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_FromOutcome(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-outcome",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_If(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "if",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_ToViewId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "to-view-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_Redirect(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "redirect",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationCaseType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (navigationHandlerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "navigation-handler_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getNavigationHandlerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getNavigationHandlerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (navigationRuleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "navigation-rule_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_FromViewId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "from-view-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_NavigationCase(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-case",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_NavigationRuleExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "navigation-rule-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getNavigationRuleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (navigationRuleExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "navigation-rule-extension_._type"
-		   });		
-		addAnnotation
-		  (nullValueTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "null-value_._type",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getNullValueType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (orderingTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ordering_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getOrderingType_Before(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "before",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getOrderingType_After(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "after",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (orderingOrderingTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "ordering-ordering_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getOrderingOrderingType_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getOrderingOrderingType_Others(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "others",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (orderingOthersTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "others_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getOrderingOthersType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (partialViewContextFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "partial-view-context-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPartialViewContextFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPartialViewContextFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (phaseListenerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "phase-listener_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPhaseListenerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPhaseListenerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (propertyClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "property-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (propertyExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "property-extension_._type"
-		   });		
-		addAnnotation
-		  (propertyNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "property-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (propertyResolverTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "property-resolver_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyResolverType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getPropertyResolverType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (propertyTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "property_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getPropertyType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_PropertyName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_PropertyClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_DefaultValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "default-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_SuggestedValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "suggested-value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_PropertyExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getPropertyType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (redirectTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "redirect_._type",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getRedirectType_ViewParam(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "view-param",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRedirectType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRedirectType_IncludeViewParams(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "include-view-params",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (redirectViewParamTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "redirect-viewParam_._type",
-			 "kind", "empty"
-		   });		
-		addAnnotation
-		  (getRedirectViewParamType_Name(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRedirectViewParamType_Value(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "value",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRedirectViewParamType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (referencedBeanClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "referenced-bean-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getReferencedBeanClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getReferencedBeanClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (referencedBeanNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "referenced-bean-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getReferencedBeanNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getReferencedBeanNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (referencedBeanTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "referenced-bean_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_ReferencedBeanName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_ReferencedBeanClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "referenced-bean-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getReferencedBeanType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (rendererClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "renderer-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRendererClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRendererClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (rendererExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "renderer-extension_._type"
-		   });		
-		addAnnotation
-		  (rendererTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "renderer_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getRendererType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_ComponentFamily(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "component-family",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_RendererType(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-type",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_RendererClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_Facet(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "facet",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_RendererExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRendererType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (rendererTypeTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "renderer-type_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRendererTypeType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRendererTypeType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (renderKitClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "render-kit-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (renderKitFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "render-kit-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (renderKitIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "render-kit-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getRenderKitIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (renderKitTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "render-kit_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getRenderKitType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_RenderKitId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_RenderKitClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_Renderer(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "renderer",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_ClientBehaviorRenderer(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "client-behavior-renderer",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_RenderKitExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "render-kit-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getRenderKitType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (renderKitExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "render-kit-extension_._type"
-		   });		
-		addAnnotation
-		  (resourceHandlerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "resource-handler_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getResourceHandlerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getResourceHandlerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (smallIconTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "small-icon_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSmallIconType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSmallIconType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (sourceClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "source-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSourceClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSourceClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (stateManagerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "state-manager_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getStateManagerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getStateManagerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (suggestedValueTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "suggested-value_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSuggestedValueType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSuggestedValueType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (supportedLocaleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "supported-locale_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSupportedLocaleType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSupportedLocaleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (systemEventClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "system-event-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSystemEventClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSystemEventClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (systemEventListenerClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "system-event-listener-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (systemEventListenerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "system-event-listener_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerType_SystemEventListenerClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-listener-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerType_SystemEventClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "system-event-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerType_SourceClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "source-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getSystemEventListenerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (tagHandlerDelegateFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "tag-handler-delegate-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getTagHandlerDelegateFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getTagHandlerDelegateFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (toViewIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "to-view-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getToViewIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getToViewIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (validatorClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "validator-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValidatorClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValidatorClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (validatorIdTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "validator-id_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValidatorIdType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValidatorIdType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (validatorTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "validator_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getValidatorType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_ValidatorId(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_ValidatorClass(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-class",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_Attribute(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "attribute",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_Property(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "property",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_ValidatorExtension(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "validator-extension",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getValidatorType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (validatorExtensionTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "validator-extension_._type"
-		   });		
-		addAnnotation
-		  (valueClassTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "value-class_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValueClassType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValueClassType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (valueTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "value_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValueType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getValueType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (variableResolverTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "variable-resolver_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVariableResolverType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVariableResolverType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (viewHandlerTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "view-handler_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getViewHandlerType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getViewHandlerType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (resourceBundleTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "resourceBundle_._type",
-			 "kind", "elementOnly"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_Description(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "description",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_DisplayName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "display-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_Icon(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "icon",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_BaseName(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "base-name",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_Var(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "var",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (getResourceBundleType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (baseNameTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "base-name_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBaseNameType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getBaseNameType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (varTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "var_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVarType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVarType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (viewDeclarationLanguageFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "view-declaration-language-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getViewDeclarationLanguageFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getViewDeclarationLanguageFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });		
-		addAnnotation
-		  (visitContextFactoryTypeEClass, 
-		   source, 
-		   new String[] {
-			 "name", "visit-context-factory_._type",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVisitContextFactoryType_TextContent(), 
-		   source, 
-		   new String[] {
-			 "name", ":0",
-			 "kind", "simple"
-		   });		
-		addAnnotation
-		  (getVisitContextFactoryType_Id(), 
-		   source, 
-		   new String[] {
-			 "kind", "attribute",
-			 "name", "id",
-			 "namespace", "##targetNamespace"
-		   });
-	}
-
-} //FacesConfigPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigTypeImpl.java
deleted file mode 100644
index e658cf1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesConfigTypeImpl.java
+++ /dev/null
@@ -1,951 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationType;
-import org.eclipse.jst.jsf.facesconfig.emf.BehaviorType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getApplication <em>Application</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getOrdering <em>Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getAbsoluteOrdering <em>Absolute Ordering</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getFactory <em>Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getComponent <em>Component</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getConverter <em>Converter</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getManagedBean <em>Managed Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getNavigationRule <em>Navigation Rule</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getReferencedBean <em>Referenced Bean</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getRenderKit <em>Render Kit</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getLifecycle <em>Lifecycle</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getValidator <em>Validator</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getBehavior <em>Behavior</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getFacesConfigExtension <em>Faces Config Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getXmlns <em>Xmlns</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesConfigTypeImpl#isMetadataComplete <em>Metadata Complete</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacesConfigTypeImpl extends EObjectImpl implements FacesConfigType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getApplication() <em>Application</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getApplication()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList application;
-
-    /**
-	 * The cached value of the '{@link #getOrdering() <em>Ordering</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOrdering()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList ordering;
-
-				/**
-	 * The cached value of the '{@link #getAbsoluteOrdering() <em>Absolute Ordering</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAbsoluteOrdering()
-	 * @generated
-	 * @ordered
-	 */
-	protected AbsoluteOrderingType absoluteOrdering;
-
-				/**
-	 * The cached value of the '{@link #getFactory() <em>Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList factory;
-
-    /**
-	 * The cached value of the '{@link #getComponent() <em>Component</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponent()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList component;
-
-    /**
-	 * The cached value of the '{@link #getConverter() <em>Converter</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getConverter()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList converter;
-
-    /**
-	 * The cached value of the '{@link #getManagedBean() <em>Managed Bean</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManagedBean()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList managedBean;
-
-    /**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected NameType name;
-
-				/**
-	 * The cached value of the '{@link #getNavigationRule() <em>Navigation Rule</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNavigationRule()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList navigationRule;
-
-    /**
-	 * The cached value of the '{@link #getReferencedBean() <em>Referenced Bean</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferencedBean()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList referencedBean;
-
-    /**
-	 * The cached value of the '{@link #getRenderKit() <em>Render Kit</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRenderKit()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList renderKit;
-
-    /**
-	 * The cached value of the '{@link #getLifecycle() <em>Lifecycle</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLifecycle()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList lifecycle;
-
-    /**
-	 * The cached value of the '{@link #getValidator() <em>Validator</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValidator()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList validator;
-
-    /**
-	 * The cached value of the '{@link #getBehavior() <em>Behavior</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBehavior()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList behavior;
-
-				/**
-	 * The cached value of the '{@link #getFacesConfigExtension() <em>Faces Config Extension</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getFacesConfigExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList facesConfigExtension;
-
-    /**
-	 * The default value of the '{@link #getXmlns() <em>Xmlns</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXmlns()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String XMLNS_EDEFAULT = "http://java.sun.com/JSF/Configuration"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getXmlns() <em>Xmlns</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getXmlns()
-	 * @generated
-	 * @ordered
-	 */
-	protected String xmlns = XMLNS_EDEFAULT;
-
-    /**
-	 * This is true if the Xmlns attribute has been set.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean xmlnsESet;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #isMetadataComplete() <em>Metadata Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMetadataComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean METADATA_COMPLETE_EDEFAULT = false;
-
-				/**
-	 * The cached value of the '{@link #isMetadataComplete() <em>Metadata Complete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMetadataComplete()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean metadataComplete = METADATA_COMPLETE_EDEFAULT;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacesConfigTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACES_CONFIG_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getApplication() {
-		if (application == null) {
-			application = new EObjectContainmentEList(ApplicationType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION);
-		}
-		return application;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOrdering() {
-		if (ordering == null) {
-			ordering = new EObjectContainmentEList(OrderingType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING);
-		}
-		return ordering;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public AbsoluteOrderingType getAbsoluteOrdering() {
-		return absoluteOrdering;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newAbsoluteOrdering 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAbsoluteOrdering(AbsoluteOrderingType newAbsoluteOrdering, NotificationChain msgs) {
-		AbsoluteOrderingType oldAbsoluteOrdering = absoluteOrdering;
-		absoluteOrdering = newAbsoluteOrdering;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING, oldAbsoluteOrdering, newAbsoluteOrdering);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAbsoluteOrdering(AbsoluteOrderingType newAbsoluteOrdering) {
-		if (newAbsoluteOrdering != absoluteOrdering) {
-			NotificationChain msgs = null;
-			if (absoluteOrdering != null)
-				msgs = ((InternalEObject)absoluteOrdering).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING, null, msgs);
-			if (newAbsoluteOrdering != null)
-				msgs = ((InternalEObject)newAbsoluteOrdering).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING, null, msgs);
-			msgs = basicSetAbsoluteOrdering(newAbsoluteOrdering, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING, newAbsoluteOrdering, newAbsoluteOrdering));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getFactory() {
-		if (factory == null) {
-			factory = new EObjectContainmentEList(FactoryType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY);
-		}
-		return factory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getComponent() {
-		if (component == null) {
-			component = new EObjectContainmentEList(ComponentType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT);
-		}
-		return component;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getConverter() {
-		if (converter == null) {
-			converter = new EObjectContainmentEList(ConverterType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER);
-		}
-		return converter;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getManagedBean() {
-		if (managedBean == null) {
-			managedBean = new EObjectContainmentEList(ManagedBeanType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN);
-		}
-		return managedBean;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NameType getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newName 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetName(NameType newName, NotificationChain msgs) {
-		NameType oldName = name;
-		name = newName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__NAME, oldName, newName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(NameType newName) {
-		if (newName != name) {
-			NotificationChain msgs = null;
-			if (name != null)
-				msgs = ((InternalEObject)name).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACES_CONFIG_TYPE__NAME, null, msgs);
-			if (newName != null)
-				msgs = ((InternalEObject)newName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACES_CONFIG_TYPE__NAME, null, msgs);
-			msgs = basicSetName(newName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__NAME, newName, newName));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getNavigationRule() {
-		if (navigationRule == null) {
-			navigationRule = new EObjectContainmentEList(NavigationRuleType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE);
-		}
-		return navigationRule;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getReferencedBean() {
-		if (referencedBean == null) {
-			referencedBean = new EObjectContainmentEList(ReferencedBeanType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN);
-		}
-		return referencedBean;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRenderKit() {
-		if (renderKit == null) {
-			renderKit = new EObjectContainmentEList(RenderKitType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT);
-		}
-		return renderKit;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getLifecycle() {
-		if (lifecycle == null) {
-			lifecycle = new EObjectContainmentEList(LifecycleType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE);
-		}
-		return lifecycle;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getValidator() {
-		if (validator == null) {
-			validator = new EObjectContainmentEList(ValidatorType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR);
-		}
-		return validator;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getBehavior() {
-		if (behavior == null) {
-			behavior = new EObjectContainmentEList(BehaviorType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR);
-		}
-		return behavior;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getFacesConfigExtension() {
-		if (facesConfigExtension == null) {
-			facesConfigExtension = new EObjectResolvingEList(FacesConfigExtensionType.class, this, FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION);
-		}
-		return facesConfigExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getXmlns() {
-		return xmlns;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setXmlns(String newXmlns) {
-		String oldXmlns = xmlns;
-		xmlns = newXmlns;
-		boolean oldXmlnsESet = xmlnsESet;
-		xmlnsESet = true;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS, oldXmlns, xmlns, !oldXmlnsESet));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void unsetXmlns() {
-		String oldXmlns = xmlns;
-		boolean oldXmlnsESet = xmlnsESet;
-		xmlns = XMLNS_EDEFAULT;
-		xmlnsESet = false;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.UNSET, FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS, oldXmlns, XMLNS_EDEFAULT, oldXmlnsESet));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetXmlns() {
-		return xmlnsESet;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMetadataComplete() {
-		return metadataComplete;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMetadataComplete(boolean newMetadataComplete) {
-		boolean oldMetadataComplete = metadataComplete;
-		metadataComplete = newMetadataComplete;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE, oldMetadataComplete, metadataComplete));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-				return ((InternalEList)getApplication()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-				return ((InternalEList)getOrdering()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-				return basicSetAbsoluteOrdering(null, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-				return ((InternalEList)getFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-				return ((InternalEList)getComponent()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-				return ((InternalEList)getConverter()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-				return ((InternalEList)getManagedBean()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-				return basicSetName(null, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-				return ((InternalEList)getNavigationRule()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-				return ((InternalEList)getReferencedBean()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-				return ((InternalEList)getRenderKit()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-				return ((InternalEList)getLifecycle()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-				return ((InternalEList)getValidator()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				return ((InternalEList)getBehavior()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-				return getApplication();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-				return getOrdering();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-				return getAbsoluteOrdering();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-				return getFactory();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-				return getComponent();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-				return getConverter();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-				return getManagedBean();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-				return getName();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-				return getNavigationRule();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-				return getReferencedBean();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-				return getRenderKit();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-				return getLifecycle();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-				return getValidator();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				return getBehavior();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-				return getFacesConfigExtension();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-				return getXmlns();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-				return getId();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE:
-				return isMetadataComplete() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-				getApplication().clear();
-				getApplication().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-				getOrdering().clear();
-				getOrdering().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-				setAbsoluteOrdering((AbsoluteOrderingType)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-				getFactory().clear();
-				getFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-				getComponent().clear();
-				getComponent().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-				getConverter().clear();
-				getConverter().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-				getManagedBean().clear();
-				getManagedBean().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-				setName((NameType)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-				getNavigationRule().clear();
-				getNavigationRule().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-				getReferencedBean().clear();
-				getReferencedBean().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-				getRenderKit().clear();
-				getRenderKit().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-				getLifecycle().clear();
-				getLifecycle().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-				getValidator().clear();
-				getValidator().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				getBehavior().clear();
-				getBehavior().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-				getFacesConfigExtension().clear();
-				getFacesConfigExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-				setXmlns((String)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-				setId((String)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE:
-				setMetadataComplete(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-				getApplication().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-				getOrdering().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-				setAbsoluteOrdering((AbsoluteOrderingType)null);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-				getFactory().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-				getComponent().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-				getConverter().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-				getManagedBean().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-				setName((NameType)null);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-				getNavigationRule().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-				getReferencedBean().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-				getRenderKit().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-				getLifecycle().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-				getValidator().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				getBehavior().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-				getFacesConfigExtension().clear();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-				unsetXmlns();
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE:
-				setMetadataComplete(METADATA_COMPLETE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONFIG_TYPE__APPLICATION:
-				return application != null && !application.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ORDERING:
-				return ordering != null && !ordering.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ABSOLUTE_ORDERING:
-				return absoluteOrdering != null;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACTORY:
-				return factory != null && !factory.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__COMPONENT:
-				return component != null && !component.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__CONVERTER:
-				return converter != null && !converter.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__MANAGED_BEAN:
-				return managedBean != null && !managedBean.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAME:
-				return name != null;
-			case FacesConfigPackage.FACES_CONFIG_TYPE__NAVIGATION_RULE:
-				return navigationRule != null && !navigationRule.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__REFERENCED_BEAN:
-				return referencedBean != null && !referencedBean.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__RENDER_KIT:
-				return renderKit != null && !renderKit.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__LIFECYCLE:
-				return lifecycle != null && !lifecycle.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__VALIDATOR:
-				return validator != null && !validator.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__BEHAVIOR:
-				return behavior != null && !behavior.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__FACES_CONFIG_EXTENSION:
-				return facesConfigExtension != null && !facesConfigExtension.isEmpty();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__XMLNS:
-				return isSetXmlns();
-			case FacesConfigPackage.FACES_CONFIG_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case FacesConfigPackage.FACES_CONFIG_TYPE__METADATA_COMPLETE:
-				return metadataComplete != METADATA_COMPLETE_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (xmlns: "); //$NON-NLS-1$
-		if (xmlnsESet) result.append(xmlns); else result.append("<unset>"); //$NON-NLS-1$
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", metadataComplete: "); //$NON-NLS-1$
-		result.append(metadataComplete);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FacesConfigTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesContextFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesContextFactoryTypeImpl.java
deleted file mode 100644
index 4ab342a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacesContextFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Faces Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacesContextFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacesContextFactoryTypeImpl extends EObjectImpl implements FacesContextFactoryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacesContextFactoryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACES_CONTEXT_FACTORY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FacesContextFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetExtensionTypeImpl.java
deleted file mode 100644
index 6e99b46..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetExtensionTypeImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facet Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class FacetExtensionTypeImpl extends ExtensionTypeImpl implements FacetExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACET_EXTENSION_TYPE;
-	}
-
-} //FacetExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetNameTypeImpl.java
deleted file mode 100644
index cab6a24..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facet Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacetNameTypeImpl extends EObjectImpl implements FacetNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACET_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.FACET_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.FACET_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.FACET_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.FACET_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FacetNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetTypeImpl.java
deleted file mode 100644
index 5d5e586..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FacetTypeImpl.java
+++ /dev/null
@@ -1,407 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Facet Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getFacetName <em>Facet Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getFacetExtension <em>Facet Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FacetTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FacetTypeImpl extends EObjectImpl implements FacetType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getFacetName() <em>Facet Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFacetName()
-	 * @generated
-	 * @ordered
-	 */
-	protected FacetNameType facetName;
-
-    /**
-	 * The cached value of the '{@link #getFacetExtension() <em>Facet Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFacetExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList facetExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacetTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACET_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.FACET_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.FACET_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.FACET_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacetNameType getFacetName() {
-		return facetName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFacetName 
-     * @param msgs 
-     * @return NotificationChain
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFacetName(FacetNameType newFacetName, NotificationChain msgs) {
-		FacetNameType oldFacetName = facetName;
-		facetName = newFacetName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_TYPE__FACET_NAME, oldFacetName, newFacetName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFacetName(FacetNameType newFacetName) {
-		if (newFacetName != facetName) {
-			NotificationChain msgs = null;
-			if (facetName != null)
-				msgs = ((InternalEObject)facetName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACET_TYPE__FACET_NAME, null, msgs);
-			if (newFacetName != null)
-				msgs = ((InternalEObject)newFacetName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.FACET_TYPE__FACET_NAME, null, msgs);
-			msgs = basicSetFacetName(newFacetName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_TYPE__FACET_NAME, newFacetName, newFacetName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getFacetExtension() {
-		if (facetExtension == null) {
-			facetExtension = new EObjectContainmentEList(FacetExtensionType.class, this, FacesConfigPackage.FACET_TYPE__FACET_EXTENSION);
-		}
-		return facetExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACET_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACET_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-				return basicSetFacetName(null, msgs);
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				return ((InternalEList)getFacetExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.FACET_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-				return getFacetName();
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				return getFacetExtension();
-			case FacesConfigPackage.FACET_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACET_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-				setFacetName((FacetNameType)newValue);
-				return;
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				getFacetExtension().clear();
-				getFacetExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACET_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.FACET_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-				setFacetName((FacetNameType)null);
-				return;
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				getFacetExtension().clear();
-				return;
-			case FacesConfigPackage.FACET_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACET_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.FACET_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.FACET_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.FACET_TYPE__FACET_NAME:
-				return facetName != null;
-			case FacesConfigPackage.FACET_TYPE__FACET_EXTENSION:
-				return facetExtension != null && !facetExtension.isEmpty();
-			case FacesConfigPackage.FACET_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FacetTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryExtensionTypeImpl.java
deleted file mode 100644
index 6bec8fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Factory Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class FactoryExtensionTypeImpl extends ExtensionTypeImpl implements FactoryExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected FactoryExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACTORY_EXTENSION_TYPE;
-	}
-
-} //FactoryExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryTypeImpl.java
deleted file mode 100644
index e7b00cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FactoryTypeImpl.java
+++ /dev/null
@@ -1,595 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType;
-import org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getApplicationFactory <em>Application Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getExceptionHandlerFactory <em>Exception Handler Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getExternalContextFactory <em>External Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getFacesContextFactory <em>Faces Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getPartialViewContextFactory <em>Partial View Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getLifecycleFactory <em>Lifecycle Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getViewDeclarationLanguageFactory <em>View Declaration Language Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getTagHandlerDelegateFactory <em>Tag Handler Delegate Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getRenderKitFactory <em>Render Kit Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getVisitContextFactory <em>Visit Context Factory</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getFactoryExtension <em>Factory Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FactoryTypeImpl extends EObjectImpl implements FactoryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getApplicationFactory() <em>Application Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getApplicationFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList applicationFactory;
-
-    /**
-	 * The cached value of the '{@link #getExceptionHandlerFactory() <em>Exception Handler Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExceptionHandlerFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList exceptionHandlerFactory;
-
-				/**
-	 * The cached value of the '{@link #getExternalContextFactory() <em>External Context Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getExternalContextFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList externalContextFactory;
-
-				/**
-	 * The cached value of the '{@link #getFacesContextFactory() <em>Faces Context Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFacesContextFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList facesContextFactory;
-
-    /**
-	 * The cached value of the '{@link #getPartialViewContextFactory() <em>Partial View Context Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPartialViewContextFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList partialViewContextFactory;
-
-				/**
-	 * The cached value of the '{@link #getLifecycleFactory() <em>Lifecycle Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLifecycleFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList lifecycleFactory;
-
-    /**
-	 * The cached value of the '{@link #getViewDeclarationLanguageFactory() <em>View Declaration Language Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getViewDeclarationLanguageFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList viewDeclarationLanguageFactory;
-
-				/**
-	 * The cached value of the '{@link #getTagHandlerDelegateFactory() <em>Tag Handler Delegate Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagHandlerDelegateFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList tagHandlerDelegateFactory;
-
-				/**
-	 * The cached value of the '{@link #getRenderKitFactory() <em>Render Kit Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRenderKitFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList renderKitFactory;
-
-    /**
-	 * The cached value of the '{@link #getVisitContextFactory() <em>Visit Context Factory</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getVisitContextFactory()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList visitContextFactory;
-
-				/**
-	 * The cached value of the '{@link #getFactoryExtension() <em>Factory Extension</em>}' reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getFactoryExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList factoryExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FactoryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FACTORY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getApplicationFactory() {
-		if (applicationFactory == null) {
-			applicationFactory = new EObjectContainmentEList(ApplicationFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY);
-		}
-		return applicationFactory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExceptionHandlerFactory() {
-		if (exceptionHandlerFactory == null) {
-			exceptionHandlerFactory = new EObjectContainmentEList(ExceptionHandlerFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY);
-		}
-		return exceptionHandlerFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getExternalContextFactory() {
-		if (externalContextFactory == null) {
-			externalContextFactory = new EObjectContainmentEList(ExternalContextFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY);
-		}
-		return externalContextFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getFacesContextFactory() {
-		if (facesContextFactory == null) {
-			facesContextFactory = new EObjectContainmentEList(FacesContextFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY);
-		}
-		return facesContextFactory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPartialViewContextFactory() {
-		if (partialViewContextFactory == null) {
-			partialViewContextFactory = new EObjectContainmentEList(PartialViewContextFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY);
-		}
-		return partialViewContextFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getLifecycleFactory() {
-		if (lifecycleFactory == null) {
-			lifecycleFactory = new EObjectContainmentEList(LifecycleFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY);
-		}
-		return lifecycleFactory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getViewDeclarationLanguageFactory() {
-		if (viewDeclarationLanguageFactory == null) {
-			viewDeclarationLanguageFactory = new EObjectContainmentEList(ViewDeclarationLanguageFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY);
-		}
-		return viewDeclarationLanguageFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTagHandlerDelegateFactory() {
-		if (tagHandlerDelegateFactory == null) {
-			tagHandlerDelegateFactory = new EObjectContainmentEList(TagHandlerDelegateFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY);
-		}
-		return tagHandlerDelegateFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRenderKitFactory() {
-		if (renderKitFactory == null) {
-			renderKitFactory = new EObjectContainmentEList(RenderKitFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY);
-		}
-		return renderKitFactory;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getVisitContextFactory() {
-		if (visitContextFactory == null) {
-			visitContextFactory = new EObjectContainmentEList(VisitContextFactoryType.class, this, FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY);
-		}
-		return visitContextFactory;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getFactoryExtension() {
-		if (factoryExtension == null) {
-			factoryExtension = new EObjectResolvingEList(FactoryExtensionType.class, this, FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION);
-		}
-		return factoryExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FACTORY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-				return ((InternalEList)getApplicationFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-				return ((InternalEList)getExceptionHandlerFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-				return ((InternalEList)getExternalContextFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-				return ((InternalEList)getFacesContextFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return ((InternalEList)getPartialViewContextFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-				return ((InternalEList)getLifecycleFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return ((InternalEList)getViewDeclarationLanguageFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-				return ((InternalEList)getTagHandlerDelegateFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-				return ((InternalEList)getRenderKitFactory()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				return ((InternalEList)getVisitContextFactory()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-				return getApplicationFactory();
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-				return getExceptionHandlerFactory();
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-				return getExternalContextFactory();
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-				return getFacesContextFactory();
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return getPartialViewContextFactory();
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-				return getLifecycleFactory();
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return getViewDeclarationLanguageFactory();
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-				return getTagHandlerDelegateFactory();
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-				return getRenderKitFactory();
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				return getVisitContextFactory();
-			case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-				return getFactoryExtension();
-			case FacesConfigPackage.FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-				getApplicationFactory().clear();
-				getApplicationFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-				getExceptionHandlerFactory().clear();
-				getExceptionHandlerFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-				getExternalContextFactory().clear();
-				getExternalContextFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-				getFacesContextFactory().clear();
-				getFacesContextFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-				getPartialViewContextFactory().clear();
-				getPartialViewContextFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-				getLifecycleFactory().clear();
-				getLifecycleFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				getViewDeclarationLanguageFactory().clear();
-				getViewDeclarationLanguageFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-				getTagHandlerDelegateFactory().clear();
-				getTagHandlerDelegateFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-				getRenderKitFactory().clear();
-				getRenderKitFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				getVisitContextFactory().clear();
-				getVisitContextFactory().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-				getFactoryExtension().clear();
-				getFactoryExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-				getApplicationFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-				getExceptionHandlerFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-				getExternalContextFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-				getFacesContextFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-				getPartialViewContextFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-				getLifecycleFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				getViewDeclarationLanguageFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-				getTagHandlerDelegateFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-				getRenderKitFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				getVisitContextFactory().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-				getFactoryExtension().clear();
-				return;
-			case FacesConfigPackage.FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FACTORY_TYPE__APPLICATION_FACTORY:
-				return applicationFactory != null && !applicationFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__EXCEPTION_HANDLER_FACTORY:
-				return exceptionHandlerFactory != null && !exceptionHandlerFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__EXTERNAL_CONTEXT_FACTORY:
-				return externalContextFactory != null && !externalContextFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__FACES_CONTEXT_FACTORY:
-				return facesContextFactory != null && !facesContextFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__PARTIAL_VIEW_CONTEXT_FACTORY:
-				return partialViewContextFactory != null && !partialViewContextFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__LIFECYCLE_FACTORY:
-				return lifecycleFactory != null && !lifecycleFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__VIEW_DECLARATION_LANGUAGE_FACTORY:
-				return viewDeclarationLanguageFactory != null && !viewDeclarationLanguageFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__TAG_HANDLER_DELEGATE_FACTORY:
-				return tagHandlerDelegateFactory != null && !tagHandlerDelegateFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__RENDER_KIT_FACTORY:
-				return renderKitFactory != null && !renderKitFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__VISIT_CONTEXT_FACTORY:
-				return visitContextFactory != null && !visitContextFactory.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__FACTORY_EXTENSION:
-				return factoryExtension != null && !factoryExtension.isEmpty();
-			case FacesConfigPackage.FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromActionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromActionTypeImpl.java
deleted file mode 100644
index 92c0eca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromActionTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>From Action Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromActionTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FromActionTypeImpl extends EObjectImpl implements FromActionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromActionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FROM_ACTION_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_ACTION_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_ACTION_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.FROM_ACTION_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FromActionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromOutcomeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromOutcomeTypeImpl.java
deleted file mode 100644
index 85ebefb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromOutcomeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>From Outcome Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromOutcomeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FromOutcomeTypeImpl extends EObjectImpl implements FromOutcomeType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromOutcomeTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FROM_OUTCOME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_OUTCOME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.FROM_OUTCOME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FromOutcomeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromViewIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromViewIdTypeImpl.java
deleted file mode 100644
index 6205448..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/FromViewIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>From View Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.FromViewIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class FromViewIdTypeImpl extends EObjectImpl implements FromViewIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FromViewIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.FROM_VIEW_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.FROM_VIEW_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //FromViewIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IconTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IconTypeImpl.java
deleted file mode 100644
index c567901..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IconTypeImpl.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Icon Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getSmallIcon <em>Small Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getLargeIcon <em>Large Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getLang <em>Lang</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IconTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IconTypeImpl extends EObjectImpl implements IconType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getSmallIcon() <em>Small Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSmallIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected SmallIconType smallIcon;
-
-    /**
-	 * The cached value of the '{@link #getLargeIcon() <em>Large Icon</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLargeIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected LargeIconType largeIcon;
-
-    /**
-	 * The default value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String LANG_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getLang() <em>Lang</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getLang()
-	 * @generated
-	 * @ordered
-	 */
-	protected String lang = LANG_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IconTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ICON_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SmallIconType getSmallIcon() {
-		return smallIcon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSmallIcon 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSmallIcon(SmallIconType newSmallIcon, NotificationChain msgs) {
-		SmallIconType oldSmallIcon = smallIcon;
-		smallIcon = newSmallIcon;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__SMALL_ICON, oldSmallIcon, newSmallIcon);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSmallIcon(SmallIconType newSmallIcon) {
-		if (newSmallIcon != smallIcon) {
-			NotificationChain msgs = null;
-			if (smallIcon != null)
-				msgs = ((InternalEObject)smallIcon).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ICON_TYPE__SMALL_ICON, null, msgs);
-			if (newSmallIcon != null)
-				msgs = ((InternalEObject)newSmallIcon).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ICON_TYPE__SMALL_ICON, null, msgs);
-			msgs = basicSetSmallIcon(newSmallIcon, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__SMALL_ICON, newSmallIcon, newSmallIcon));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public LargeIconType getLargeIcon() {
-		return largeIcon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newLargeIcon 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetLargeIcon(LargeIconType newLargeIcon, NotificationChain msgs) {
-		LargeIconType oldLargeIcon = largeIcon;
-		largeIcon = newLargeIcon;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__LARGE_ICON, oldLargeIcon, newLargeIcon);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLargeIcon(LargeIconType newLargeIcon) {
-		if (newLargeIcon != largeIcon) {
-			NotificationChain msgs = null;
-			if (largeIcon != null)
-				msgs = ((InternalEObject)largeIcon).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ICON_TYPE__LARGE_ICON, null, msgs);
-			if (newLargeIcon != null)
-				msgs = ((InternalEObject)newLargeIcon).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ICON_TYPE__LARGE_ICON, null, msgs);
-			msgs = basicSetLargeIcon(newLargeIcon, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__LARGE_ICON, newLargeIcon, newLargeIcon));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLang() {
-		return lang;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setLang(String newLang) {
-		String oldLang = lang;
-		lang = newLang;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__LANG, oldLang, lang));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ICON_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-				return basicSetSmallIcon(null, msgs);
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				return basicSetLargeIcon(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-				return getSmallIcon();
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				return getLargeIcon();
-			case FacesConfigPackage.ICON_TYPE__LANG:
-				return getLang();
-			case FacesConfigPackage.ICON_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-				setSmallIcon((SmallIconType)newValue);
-				return;
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				setLargeIcon((LargeIconType)newValue);
-				return;
-			case FacesConfigPackage.ICON_TYPE__LANG:
-				setLang((String)newValue);
-				return;
-			case FacesConfigPackage.ICON_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-				setSmallIcon((SmallIconType)null);
-				return;
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				setLargeIcon((LargeIconType)null);
-				return;
-			case FacesConfigPackage.ICON_TYPE__LANG:
-				setLang(LANG_EDEFAULT);
-				return;
-			case FacesConfigPackage.ICON_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ICON_TYPE__SMALL_ICON:
-				return smallIcon != null;
-			case FacesConfigPackage.ICON_TYPE__LARGE_ICON:
-				return largeIcon != null;
-			case FacesConfigPackage.ICON_TYPE__LANG:
-				return LANG_EDEFAULT == null ? lang != null : !LANG_EDEFAULT.equals(lang);
-			case FacesConfigPackage.ICON_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (lang: "); //$NON-NLS-1$
-		result.append(lang);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //IconTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IfTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IfTypeImpl.java
deleted file mode 100644
index 8615aa0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/IfTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IfType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>If Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.IfTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class IfTypeImpl extends EObjectImpl implements IfType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected IfTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.IF_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.IF_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.IF_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.IF_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.IF_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.IF_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.IF_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.IF_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.IF_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.IF_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.IF_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //IfTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyClassTypeImpl.java
deleted file mode 100644
index 943a8ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Key Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class KeyClassTypeImpl extends EObjectImpl implements KeyClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected KeyClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.KEY_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.KEY_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //KeyClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyTypeImpl.java
deleted file mode 100644
index 3a58b50..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/KeyTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Key Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.KeyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class KeyTypeImpl extends EObjectImpl implements KeyType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected KeyTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.KEY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.KEY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.KEY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.KEY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.KEY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.KEY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.KEY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //KeyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LargeIconTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LargeIconTypeImpl.java
deleted file mode 100644
index 153fa49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LargeIconTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LargeIconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Large Icon Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LargeIconTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LargeIconTypeImpl extends EObjectImpl implements LargeIconType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LargeIconTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LARGE_ICON_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LARGE_ICON_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LARGE_ICON_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.LARGE_ICON_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //LargeIconTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleExtensionTypeImpl.java
deleted file mode 100644
index 19262a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Lifecycle Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class LifecycleExtensionTypeImpl extends ExtensionTypeImpl implements LifecycleExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected LifecycleExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LIFECYCLE_EXTENSION_TYPE;
-	}
-
-} //LifecycleExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleFactoryTypeImpl.java
deleted file mode 100644
index 562c38c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Lifecycle Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LifecycleFactoryTypeImpl extends EObjectImpl implements LifecycleFactoryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LifecycleFactoryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LIFECYCLE_FACTORY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //LifecycleFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleTypeImpl.java
deleted file mode 100644
index a01a5f6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LifecycleTypeImpl.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.LifecycleType;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Lifecycle Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl#getPhaseListener <em>Phase Listener</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl#getLifecycleExtension <em>Lifecycle Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LifecycleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LifecycleTypeImpl extends EObjectImpl implements LifecycleType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getPhaseListener() <em>Phase Listener</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPhaseListener()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList phaseListener;
-
-    /**
-	 * The cached value of the '{@link #getLifecycleExtension() <em>Lifecycle Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getLifecycleExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList lifecycleExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LifecycleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LIFECYCLE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPhaseListener() {
-		if (phaseListener == null) {
-			phaseListener = new EObjectContainmentEList(PhaseListenerType.class, this, FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER);
-		}
-		return phaseListener;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getLifecycleExtension() {
-		if (lifecycleExtension == null) {
-			lifecycleExtension = new EObjectContainmentEList(LifecycleExtensionType.class, this, FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION);
-		}
-		return lifecycleExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIFECYCLE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-				return ((InternalEList)getPhaseListener()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				return ((InternalEList)getLifecycleExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-				return getPhaseListener();
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				return getLifecycleExtension();
-			case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-				getPhaseListener().clear();
-				getPhaseListener().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				getLifecycleExtension().clear();
-				getLifecycleExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-				getPhaseListener().clear();
-				return;
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				getLifecycleExtension().clear();
-				return;
-			case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIFECYCLE_TYPE__PHASE_LISTENER:
-				return phaseListener != null && !phaseListener.isEmpty();
-			case FacesConfigPackage.LIFECYCLE_TYPE__LIFECYCLE_EXTENSION:
-				return lifecycleExtension != null && !lifecycleExtension.isEmpty();
-			case FacesConfigPackage.LIFECYCLE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //LifecycleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ListEntriesTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ListEntriesTypeImpl.java
deleted file mode 100644
index fd40f96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ListEntriesTypeImpl.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>List Entries Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ListEntriesTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ListEntriesTypeImpl extends EObjectImpl implements ListEntriesType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getValueClass() <em>Value Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueClassType valueClass;
-
-    /**
-	 * The cached value of the '{@link #getNullValue() <em>Null Value</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNullValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList nullValue;
-
-    /**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList value;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ListEntriesTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LIST_ENTRIES_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueClassType getValueClass() {
-		return valueClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValueClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValueClass(ValueClassType newValueClass, NotificationChain msgs) {
-		ValueClassType oldValueClass = valueClass;
-		valueClass = newValueClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, oldValueClass, newValueClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueClass(ValueClassType newValueClass) {
-		if (newValueClass != valueClass) {
-			NotificationChain msgs = null;
-			if (valueClass != null)
-				msgs = ((InternalEObject)valueClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-			if (newValueClass != null)
-				msgs = ((InternalEObject)newValueClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-			msgs = basicSetValueClass(newValueClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS, newValueClass, newValueClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getNullValue() {
-		if (nullValue == null) {
-			nullValue = new EObjectContainmentEList(NullValueType.class, this, FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE);
-		}
-		return nullValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getValue() {
-		if (value == null) {
-			value = new EObjectContainmentEList(ValueType.class, this, FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE);
-		}
-		return value;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LIST_ENTRIES_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-				return basicSetValueClass(null, msgs);
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-				return ((InternalEList)getNullValue()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				return ((InternalEList)getValue()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-				return getValueClass();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-				return getNullValue();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				return getValue();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-				setValueClass((ValueClassType)newValue);
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-				getNullValue().clear();
-				getNullValue().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				getValue().clear();
-				getValue().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-				setValueClass((ValueClassType)null);
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-				getNullValue().clear();
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				getValue().clear();
-				return;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE_CLASS:
-				return valueClass != null;
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__NULL_VALUE:
-				return nullValue != null && !nullValue.isEmpty();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__VALUE:
-				return value != null && !value.isEmpty();
-			case FacesConfigPackage.LIST_ENTRIES_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ListEntriesTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LocaleConfigTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LocaleConfigTypeImpl.java
deleted file mode 100644
index 9f17d16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/LocaleConfigTypeImpl.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Locale Config Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl#getDefaultLocale <em>Default Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl#getSupportedLocale <em>Supported Locale</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.LocaleConfigTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class LocaleConfigTypeImpl extends EObjectImpl implements LocaleConfigType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDefaultLocale() <em>Default Locale</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultLocale()
-	 * @generated
-	 * @ordered
-	 */
-	protected DefaultLocaleType defaultLocale;
-
-    /**
-	 * The cached value of the '{@link #getSupportedLocale() <em>Supported Locale</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSupportedLocale()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList supportedLocale;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected LocaleConfigTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.LOCALE_CONFIG_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultLocaleType getDefaultLocale() {
-		return defaultLocale;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultLocale 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultLocale(DefaultLocaleType newDefaultLocale, NotificationChain msgs) {
-		DefaultLocaleType oldDefaultLocale = defaultLocale;
-		defaultLocale = newDefaultLocale;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, oldDefaultLocale, newDefaultLocale);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultLocale(DefaultLocaleType newDefaultLocale) {
-		if (newDefaultLocale != defaultLocale) {
-			NotificationChain msgs = null;
-			if (defaultLocale != null)
-				msgs = ((InternalEObject)defaultLocale).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, null, msgs);
-			if (newDefaultLocale != null)
-				msgs = ((InternalEObject)newDefaultLocale).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, null, msgs);
-			msgs = basicSetDefaultLocale(newDefaultLocale, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE, newDefaultLocale, newDefaultLocale));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getSupportedLocale() {
-		if (supportedLocale == null) {
-			supportedLocale = new EObjectContainmentEList(SupportedLocaleType.class, this, FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE);
-		}
-		return supportedLocale;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.LOCALE_CONFIG_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-				return basicSetDefaultLocale(null, msgs);
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				return ((InternalEList)getSupportedLocale()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-				return getDefaultLocale();
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				return getSupportedLocale();
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-				setDefaultLocale((DefaultLocaleType)newValue);
-				return;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				getSupportedLocale().clear();
-				getSupportedLocale().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-				setDefaultLocale((DefaultLocaleType)null);
-				return;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				getSupportedLocale().clear();
-				return;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__DEFAULT_LOCALE:
-				return defaultLocale != null;
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__SUPPORTED_LOCALE:
-				return supportedLocale != null && !supportedLocale.isEmpty();
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //LocaleConfigTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanClassTypeImpl.java
deleted file mode 100644
index 0e48234..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanClassTypeImpl extends EObjectImpl implements ManagedBeanClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_BEAN_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ManagedBeanClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanExtensionTypeImpl.java
deleted file mode 100644
index e8f3be1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanExtensionTypeImpl extends ExtensionTypeImpl implements ManagedBeanExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ManagedBeanExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_BEAN_EXTENSION_TYPE;
-	}
-
-} //ManagedBeanExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanNameTypeImpl.java
deleted file mode 100644
index 202ab74..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanNameTypeImpl extends EObjectImpl implements ManagedBeanNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_BEAN_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ManagedBeanNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanScopeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanScopeTypeImpl.java
deleted file mode 100644
index 3091a77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanScopeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Scope Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanScopeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanScopeTypeImpl extends EObjectImpl implements ManagedBeanScopeType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanScopeTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_BEAN_SCOPE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ManagedBeanScopeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanTypeImpl.java
deleted file mode 100644
index 4a21aa8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedBeanTypeImpl.java
+++ /dev/null
@@ -1,778 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Bean Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanName <em>Managed Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanClass <em>Managed Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanScope <em>Managed Bean Scope</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedProperty <em>Managed Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getManagedBeanExtension <em>Managed Bean Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedBeanTypeImpl#isEager <em>Eager</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedBeanTypeImpl extends EObjectImpl implements ManagedBeanType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getManagedBeanName() <em>Managed Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManagedBeanName()
-	 * @generated
-	 * @ordered
-	 */
-	protected ManagedBeanNameType managedBeanName;
-
-    /**
-	 * The cached value of the '{@link #getManagedBeanClass() <em>Managed Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManagedBeanClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ManagedBeanClassType managedBeanClass;
-
-    /**
-	 * The cached value of the '{@link #getManagedBeanScope() <em>Managed Bean Scope</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManagedBeanScope()
-	 * @generated
-	 * @ordered
-	 */
-	protected ManagedBeanScopeType managedBeanScope;
-
-    /**
-	 * The cached value of the '{@link #getManagedProperty() <em>Managed Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getManagedProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList managedProperty;
-
-    /**
-	 * The cached value of the '{@link #getMapEntries() <em>Map Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMapEntries()
-	 * @generated
-	 * @ordered
-	 */
-	protected MapEntriesType mapEntries;
-
-    /**
-	 * The cached value of the '{@link #getListEntries() <em>List Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getListEntries()
-	 * @generated
-	 * @ordered
-	 */
-	protected ListEntriesType listEntries;
-
-    /**
-	 * The cached value of the '{@link #getManagedBeanExtension() <em>Managed Bean Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getManagedBeanExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList managedBeanExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #isEager() <em>Eager</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEager()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean EAGER_EDEFAULT = false;
-
-				/**
-	 * The cached value of the '{@link #isEager() <em>Eager</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isEager()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean eager = EAGER_EDEFAULT;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedBeanTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_BEAN_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanNameType getManagedBeanName() {
-		return managedBeanName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanName(ManagedBeanNameType newManagedBeanName, NotificationChain msgs) {
-		ManagedBeanNameType oldManagedBeanName = managedBeanName;
-		managedBeanName = newManagedBeanName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME, oldManagedBeanName, newManagedBeanName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanName(ManagedBeanNameType newManagedBeanName) {
-		if (newManagedBeanName != managedBeanName) {
-			NotificationChain msgs = null;
-			if (managedBeanName != null)
-				msgs = ((InternalEObject)managedBeanName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME, null, msgs);
-			if (newManagedBeanName != null)
-				msgs = ((InternalEObject)newManagedBeanName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME, null, msgs);
-			msgs = basicSetManagedBeanName(newManagedBeanName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME, newManagedBeanName, newManagedBeanName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanClassType getManagedBeanClass() {
-		return managedBeanClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanClass(ManagedBeanClassType newManagedBeanClass, NotificationChain msgs) {
-		ManagedBeanClassType oldManagedBeanClass = managedBeanClass;
-		managedBeanClass = newManagedBeanClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS, oldManagedBeanClass, newManagedBeanClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanClass(ManagedBeanClassType newManagedBeanClass) {
-		if (newManagedBeanClass != managedBeanClass) {
-			NotificationChain msgs = null;
-			if (managedBeanClass != null)
-				msgs = ((InternalEObject)managedBeanClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS, null, msgs);
-			if (newManagedBeanClass != null)
-				msgs = ((InternalEObject)newManagedBeanClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS, null, msgs);
-			msgs = basicSetManagedBeanClass(newManagedBeanClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS, newManagedBeanClass, newManagedBeanClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ManagedBeanScopeType getManagedBeanScope() {
-		return managedBeanScope;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newManagedBeanScope 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetManagedBeanScope(ManagedBeanScopeType newManagedBeanScope, NotificationChain msgs) {
-		ManagedBeanScopeType oldManagedBeanScope = managedBeanScope;
-		managedBeanScope = newManagedBeanScope;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE, oldManagedBeanScope, newManagedBeanScope);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setManagedBeanScope(ManagedBeanScopeType newManagedBeanScope) {
-		if (newManagedBeanScope != managedBeanScope) {
-			NotificationChain msgs = null;
-			if (managedBeanScope != null)
-				msgs = ((InternalEObject)managedBeanScope).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE, null, msgs);
-			if (newManagedBeanScope != null)
-				msgs = ((InternalEObject)newManagedBeanScope).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE, null, msgs);
-			msgs = basicSetManagedBeanScope(newManagedBeanScope, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE, newManagedBeanScope, newManagedBeanScope));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getManagedProperty() {
-		if (managedProperty == null) {
-			managedProperty = new EObjectContainmentEList(ManagedPropertyType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY);
-		}
-		return managedProperty;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntriesType getMapEntries() {
-		return mapEntries;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newMapEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMapEntries(MapEntriesType newMapEntries, NotificationChain msgs) {
-		MapEntriesType oldMapEntries = mapEntries;
-		mapEntries = newMapEntries;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES, oldMapEntries, newMapEntries);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMapEntries(MapEntriesType newMapEntries) {
-		if (newMapEntries != mapEntries) {
-			NotificationChain msgs = null;
-			if (mapEntries != null)
-				msgs = ((InternalEObject)mapEntries).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES, null, msgs);
-			if (newMapEntries != null)
-				msgs = ((InternalEObject)newMapEntries).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES, null, msgs);
-			msgs = basicSetMapEntries(newMapEntries, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES, newMapEntries, newMapEntries));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ListEntriesType getListEntries() {
-		return listEntries;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newListEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetListEntries(ListEntriesType newListEntries, NotificationChain msgs) {
-		ListEntriesType oldListEntries = listEntries;
-		listEntries = newListEntries;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, oldListEntries, newListEntries);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setListEntries(ListEntriesType newListEntries) {
-		if (newListEntries != listEntries) {
-			NotificationChain msgs = null;
-			if (listEntries != null)
-				msgs = ((InternalEObject)listEntries).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, null, msgs);
-			if (newListEntries != null)
-				msgs = ((InternalEObject)newListEntries).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, null, msgs);
-			msgs = basicSetListEntries(newListEntries, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES, newListEntries, newListEntries));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getManagedBeanExtension() {
-		if (managedBeanExtension == null) {
-			managedBeanExtension = new EObjectContainmentEList(ManagedBeanExtensionType.class, this, FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION);
-		}
-		return managedBeanExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isEager() {
-		return eager;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setEager(boolean newEager) {
-		boolean oldEager = eager;
-		eager = newEager;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER, oldEager, eager));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-				return basicSetManagedBeanName(null, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-				return basicSetManagedBeanClass(null, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-				return basicSetManagedBeanScope(null, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-				return ((InternalEList)getManagedProperty()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-				return basicSetMapEntries(null, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-				return basicSetListEntries(null, msgs);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				return ((InternalEList)getManagedBeanExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-				return getManagedBeanName();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-				return getManagedBeanClass();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-				return getManagedBeanScope();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-				return getManagedProperty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-				return getMapEntries();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-				return getListEntries();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				return getManagedBeanExtension();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-				return getId();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER:
-				return isEager() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-				setManagedBeanName((ManagedBeanNameType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-				setManagedBeanClass((ManagedBeanClassType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-				setManagedBeanScope((ManagedBeanScopeType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-				getManagedProperty().clear();
-				getManagedProperty().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-				setListEntries((ListEntriesType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				getManagedBeanExtension().clear();
-				getManagedBeanExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-				setId((String)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER:
-				setEager(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-				setManagedBeanName((ManagedBeanNameType)null);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-				setManagedBeanClass((ManagedBeanClassType)null);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-				setManagedBeanScope((ManagedBeanScopeType)null);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-				getManagedProperty().clear();
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)null);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-				setListEntries((ListEntriesType)null);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				getManagedBeanExtension().clear();
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER:
-				setEager(EAGER_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_NAME:
-				return managedBeanName != null;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_CLASS:
-				return managedBeanClass != null;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_SCOPE:
-				return managedBeanScope != null;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_PROPERTY:
-				return managedProperty != null && !managedProperty.isEmpty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MAP_ENTRIES:
-				return mapEntries != null;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__LIST_ENTRIES:
-				return listEntries != null;
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__MANAGED_BEAN_EXTENSION:
-				return managedBeanExtension != null && !managedBeanExtension.isEmpty();
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case FacesConfigPackage.MANAGED_BEAN_TYPE__EAGER:
-				return eager != EAGER_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", eager: "); //$NON-NLS-1$
-		result.append(eager);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ManagedBeanTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedPropertyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedPropertyTypeImpl.java
deleted file mode 100644
index 979e640..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ManagedPropertyTypeImpl.java
+++ /dev/null
@@ -1,720 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Managed Property Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getMapEntries <em>Map Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getListEntries <em>List Entries</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ManagedPropertyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ManagedPropertyTypeImpl extends EObjectImpl implements ManagedPropertyType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getPropertyName() <em>Property Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyName()
-	 * @generated
-	 * @ordered
-	 */
-	protected PropertyNameType propertyName;
-
-    /**
-	 * The cached value of the '{@link #getPropertyClass() <em>Property Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected PropertyClassType propertyClass;
-
-    /**
-	 * The cached value of the '{@link #getMapEntries() <em>Map Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMapEntries()
-	 * @generated
-	 * @ordered
-	 */
-	protected MapEntriesType mapEntries;
-
-    /**
-	 * The cached value of the '{@link #getNullValue() <em>Null Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNullValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected NullValueType nullValue;
-
-    /**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueType value;
-
-    /**
-	 * The cached value of the '{@link #getListEntries() <em>List Entries</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getListEntries()
-	 * @generated
-	 * @ordered
-	 */
-	protected ListEntriesType listEntries;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ManagedPropertyTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MANAGED_PROPERTY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyNameType getPropertyName() {
-		return propertyName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyName 
-     * @param msgs 
-     * @return  the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyName(PropertyNameType newPropertyName, NotificationChain msgs) {
-		PropertyNameType oldPropertyName = propertyName;
-		propertyName = newPropertyName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME, oldPropertyName, newPropertyName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyName(PropertyNameType newPropertyName) {
-		if (newPropertyName != propertyName) {
-			NotificationChain msgs = null;
-			if (propertyName != null)
-				msgs = ((InternalEObject)propertyName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME, null, msgs);
-			if (newPropertyName != null)
-				msgs = ((InternalEObject)newPropertyName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME, null, msgs);
-			msgs = basicSetPropertyName(newPropertyName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME, newPropertyName, newPropertyName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyClassType getPropertyClass() {
-		return propertyClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyClass(PropertyClassType newPropertyClass, NotificationChain msgs) {
-		PropertyClassType oldPropertyClass = propertyClass;
-		propertyClass = newPropertyClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS, oldPropertyClass, newPropertyClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyClass(PropertyClassType newPropertyClass) {
-		if (newPropertyClass != propertyClass) {
-			NotificationChain msgs = null;
-			if (propertyClass != null)
-				msgs = ((InternalEObject)propertyClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS, null, msgs);
-			if (newPropertyClass != null)
-				msgs = ((InternalEObject)newPropertyClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS, null, msgs);
-			msgs = basicSetPropertyClass(newPropertyClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS, newPropertyClass, newPropertyClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MapEntriesType getMapEntries() {
-		return mapEntries;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newMapEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMapEntries(MapEntriesType newMapEntries, NotificationChain msgs) {
-		MapEntriesType oldMapEntries = mapEntries;
-		mapEntries = newMapEntries;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES, oldMapEntries, newMapEntries);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMapEntries(MapEntriesType newMapEntries) {
-		if (newMapEntries != mapEntries) {
-			NotificationChain msgs = null;
-			if (mapEntries != null)
-				msgs = ((InternalEObject)mapEntries).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES, null, msgs);
-			if (newMapEntries != null)
-				msgs = ((InternalEObject)newMapEntries).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES, null, msgs);
-			msgs = basicSetMapEntries(newMapEntries, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES, newMapEntries, newMapEntries));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NullValueType getNullValue() {
-		return nullValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNullValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNullValue(NullValueType newNullValue, NotificationChain msgs) {
-		NullValueType oldNullValue = nullValue;
-		nullValue = newNullValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE, oldNullValue, newNullValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNullValue(NullValueType newNullValue) {
-		if (newNullValue != nullValue) {
-			NotificationChain msgs = null;
-			if (nullValue != null)
-				msgs = ((InternalEObject)nullValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE, null, msgs);
-			if (newNullValue != null)
-				msgs = ((InternalEObject)newNullValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE, null, msgs);
-			msgs = basicSetNullValue(newNullValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE, newNullValue, newNullValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueType getValue() {
-		return value;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValue(ValueType newValue, NotificationChain msgs) {
-		ValueType oldValue = value;
-		value = newValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE, oldValue, newValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(ValueType newValue) {
-		if (newValue != value) {
-			NotificationChain msgs = null;
-			if (value != null)
-				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE, null, msgs);
-			if (newValue != null)
-				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE, null, msgs);
-			msgs = basicSetValue(newValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE, newValue, newValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ListEntriesType getListEntries() {
-		return listEntries;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newListEntries 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetListEntries(ListEntriesType newListEntries, NotificationChain msgs) {
-		ListEntriesType oldListEntries = listEntries;
-		listEntries = newListEntries;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, oldListEntries, newListEntries);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setListEntries(ListEntriesType newListEntries) {
-		if (newListEntries != listEntries) {
-			NotificationChain msgs = null;
-			if (listEntries != null)
-				msgs = ((InternalEObject)listEntries).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, null, msgs);
-			if (newListEntries != null)
-				msgs = ((InternalEObject)newListEntries).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, null, msgs);
-			msgs = basicSetListEntries(newListEntries, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES, newListEntries, newListEntries));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-				return basicSetPropertyName(null, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-				return basicSetPropertyClass(null, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-				return basicSetMapEntries(null, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-				return basicSetNullValue(null, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-				return basicSetValue(null, msgs);
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				return basicSetListEntries(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-				return getPropertyName();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-				return getPropertyClass();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-				return getMapEntries();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-				return getNullValue();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-				return getValue();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				return getListEntries();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-				setNullValue((NullValueType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-				setValue((ValueType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				setListEntries((ListEntriesType)newValue);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-				setMapEntries((MapEntriesType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-				setNullValue((NullValueType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-				setValue((ValueType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				setListEntries((ListEntriesType)null);
-				return;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_NAME:
-				return propertyName != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__PROPERTY_CLASS:
-				return propertyClass != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__MAP_ENTRIES:
-				return mapEntries != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__NULL_VALUE:
-				return nullValue != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__VALUE:
-				return value != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__LIST_ENTRIES:
-				return listEntries != null;
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ManagedPropertyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntriesTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntriesTypeImpl.java
deleted file mode 100644
index 26efec3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntriesTypeImpl.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Map Entries Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getKeyClass <em>Key Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getValueClass <em>Value Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getMapEntry <em>Map Entry</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntriesTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MapEntriesTypeImpl extends EObjectImpl implements MapEntriesType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getKeyClass() <em>Key Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getKeyClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected KeyClassType keyClass;
-
-    /**
-	 * The cached value of the '{@link #getValueClass() <em>Value Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValueClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueClassType valueClass;
-
-    /**
-	 * The cached value of the '{@link #getMapEntry() <em>Map Entry</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMapEntry()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList mapEntry;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MapEntriesTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MAP_ENTRIES_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyClassType getKeyClass() {
-		return keyClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newKeyClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetKeyClass(KeyClassType newKeyClass, NotificationChain msgs) {
-		KeyClassType oldKeyClass = keyClass;
-		keyClass = newKeyClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS, oldKeyClass, newKeyClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKeyClass(KeyClassType newKeyClass) {
-		if (newKeyClass != keyClass) {
-			NotificationChain msgs = null;
-			if (keyClass != null)
-				msgs = ((InternalEObject)keyClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS, null, msgs);
-			if (newKeyClass != null)
-				msgs = ((InternalEObject)newKeyClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS, null, msgs);
-			msgs = basicSetKeyClass(newKeyClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS, newKeyClass, newKeyClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueClassType getValueClass() {
-		return valueClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValueClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValueClass(ValueClassType newValueClass, NotificationChain msgs) {
-		ValueClassType oldValueClass = valueClass;
-		valueClass = newValueClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, oldValueClass, newValueClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValueClass(ValueClassType newValueClass) {
-		if (newValueClass != valueClass) {
-			NotificationChain msgs = null;
-			if (valueClass != null)
-				msgs = ((InternalEObject)valueClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-			if (newValueClass != null)
-				msgs = ((InternalEObject)newValueClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, null, msgs);
-			msgs = basicSetValueClass(newValueClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS, newValueClass, newValueClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getMapEntry() {
-		if (mapEntry == null) {
-			mapEntry = new EObjectContainmentEList(MapEntryType.class, this, FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY);
-		}
-		return mapEntry;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRIES_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-				return basicSetKeyClass(null, msgs);
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-				return basicSetValueClass(null, msgs);
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				return ((InternalEList)getMapEntry()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-				return getKeyClass();
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-				return getValueClass();
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				return getMapEntry();
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-				setKeyClass((KeyClassType)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-				setValueClass((ValueClassType)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				getMapEntry().clear();
-				getMapEntry().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-				setKeyClass((KeyClassType)null);
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-				setValueClass((ValueClassType)null);
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				getMapEntry().clear();
-				return;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__KEY_CLASS:
-				return keyClass != null;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__VALUE_CLASS:
-				return valueClass != null;
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__MAP_ENTRY:
-				return mapEntry != null && !mapEntry.isEmpty();
-			case FacesConfigPackage.MAP_ENTRIES_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MapEntriesTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntryTypeImpl.java
deleted file mode 100644
index 74ceff0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MapEntryTypeImpl.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.KeyType;
-import org.eclipse.jst.jsf.facesconfig.emf.MapEntryType;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Map Entry Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getKey <em>Key</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getNullValue <em>Null Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MapEntryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MapEntryTypeImpl extends EObjectImpl implements MapEntryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getKey() <em>Key</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getKey()
-	 * @generated
-	 * @ordered
-	 */
-	protected KeyType key;
-
-    /**
-	 * The cached value of the '{@link #getNullValue() <em>Null Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNullValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected NullValueType nullValue;
-
-    /**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueType value;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MapEntryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MAP_ENTRY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public KeyType getKey() {
-		return key;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newKey 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetKey(KeyType newKey, NotificationChain msgs) {
-		KeyType oldKey = key;
-		key = newKey;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__KEY, oldKey, newKey);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setKey(KeyType newKey) {
-		if (newKey != key) {
-			NotificationChain msgs = null;
-			if (key != null)
-				msgs = ((InternalEObject)key).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__KEY, null, msgs);
-			if (newKey != null)
-				msgs = ((InternalEObject)newKey).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__KEY, null, msgs);
-			msgs = basicSetKey(newKey, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__KEY, newKey, newKey));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NullValueType getNullValue() {
-		return nullValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newNullValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetNullValue(NullValueType newNullValue, NotificationChain msgs) {
-		NullValueType oldNullValue = nullValue;
-		nullValue = newNullValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE, oldNullValue, newNullValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNullValue(NullValueType newNullValue) {
-		if (newNullValue != nullValue) {
-			NotificationChain msgs = null;
-			if (nullValue != null)
-				msgs = ((InternalEObject)nullValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE, null, msgs);
-			if (newNullValue != null)
-				msgs = ((InternalEObject)newNullValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE, null, msgs);
-			msgs = basicSetNullValue(newNullValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE, newNullValue, newNullValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueType getValue() {
-		return value;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValue(ValueType newValue, NotificationChain msgs) {
-		ValueType oldValue = value;
-		value = newValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, oldValue, newValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(ValueType newValue) {
-		if (newValue != value) {
-			NotificationChain msgs = null;
-			if (value != null)
-				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, null, msgs);
-			if (newValue != null)
-				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, null, msgs);
-			msgs = basicSetValue(newValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__VALUE, newValue, newValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MAP_ENTRY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-				return basicSetKey(null, msgs);
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-				return basicSetNullValue(null, msgs);
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				return basicSetValue(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-				return getKey();
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-				return getNullValue();
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				return getValue();
-			case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-				setKey((KeyType)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-				setNullValue((NullValueType)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				setValue((ValueType)newValue);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-				setKey((KeyType)null);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-				setNullValue((NullValueType)null);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				setValue((ValueType)null);
-				return;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MAP_ENTRY_TYPE__KEY:
-				return key != null;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__NULL_VALUE:
-				return nullValue != null;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__VALUE:
-				return value != null;
-			case FacesConfigPackage.MAP_ENTRY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MapEntryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MessageBundleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MessageBundleTypeImpl.java
deleted file mode 100644
index 92eda01..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/MessageBundleTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Message Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.MessageBundleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class MessageBundleTypeImpl extends EObjectImpl implements MessageBundleType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected MessageBundleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.MESSAGE_BUNDLE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //MessageBundleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NameTypeImpl.java
deleted file mode 100644
index 511b347..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NameTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NameTypeImpl extends EObjectImpl implements NameType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NameTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NAME_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAME_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationCaseTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationCaseTypeImpl.java
deleted file mode 100644
index ce9d461..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationCaseTypeImpl.java
+++ /dev/null
@@ -1,650 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromActionType;
-import org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.IfType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Case Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getFromAction <em>From Action</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getFromOutcome <em>From Outcome</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getIf <em>If</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getToViewId <em>To View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getRedirect <em>Redirect</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationCaseTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NavigationCaseTypeImpl extends EObjectImpl implements NavigationCaseType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getFromAction() <em>From Action</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFromAction()
-	 * @generated
-	 * @ordered
-	 */
-	protected FromActionType fromAction;
-
-    /**
-	 * The cached value of the '{@link #getFromOutcome() <em>From Outcome</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFromOutcome()
-	 * @generated
-	 * @ordered
-	 */
-	protected FromOutcomeType fromOutcome;
-
-    /**
-	 * The cached value of the '{@link #getIf() <em>If</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIf()
-	 * @generated
-	 * @ordered
-	 */
-	protected IfType if_;
-
-				/**
-	 * The cached value of the '{@link #getToViewId() <em>To View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getToViewId()
-	 * @generated
-	 * @ordered
-	 */
-	protected ToViewIdType toViewId;
-
-    /**
-	 * The cached value of the '{@link #getRedirect() <em>Redirect</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRedirect()
-	 * @generated
-	 * @ordered
-	 */
-	protected RedirectType redirect;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationCaseTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NAVIGATION_CASE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromActionType getFromAction() {
-		return fromAction;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromAction 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromAction(FromActionType newFromAction, NotificationChain msgs) {
-		FromActionType oldFromAction = fromAction;
-		fromAction = newFromAction;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION, oldFromAction, newFromAction);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromAction(FromActionType newFromAction) {
-		if (newFromAction != fromAction) {
-			NotificationChain msgs = null;
-			if (fromAction != null)
-				msgs = ((InternalEObject)fromAction).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION, null, msgs);
-			if (newFromAction != null)
-				msgs = ((InternalEObject)newFromAction).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION, null, msgs);
-			msgs = basicSetFromAction(newFromAction, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION, newFromAction, newFromAction));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromOutcomeType getFromOutcome() {
-		return fromOutcome;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromOutcome 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromOutcome(FromOutcomeType newFromOutcome, NotificationChain msgs) {
-		FromOutcomeType oldFromOutcome = fromOutcome;
-		fromOutcome = newFromOutcome;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, oldFromOutcome, newFromOutcome);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromOutcome(FromOutcomeType newFromOutcome) {
-		if (newFromOutcome != fromOutcome) {
-			NotificationChain msgs = null;
-			if (fromOutcome != null)
-				msgs = ((InternalEObject)fromOutcome).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, null, msgs);
-			if (newFromOutcome != null)
-				msgs = ((InternalEObject)newFromOutcome).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, null, msgs);
-			msgs = basicSetFromOutcome(newFromOutcome, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME, newFromOutcome, newFromOutcome));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public IfType getIf() {
-		return if_;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * @param newIf 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetIf(IfType newIf, NotificationChain msgs) {
-		IfType oldIf = if_;
-		if_ = newIf;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__IF, oldIf, newIf);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIf(IfType newIf) {
-		if (newIf != if_) {
-			NotificationChain msgs = null;
-			if (if_ != null)
-				msgs = ((InternalEObject)if_).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__IF, null, msgs);
-			if (newIf != null)
-				msgs = ((InternalEObject)newIf).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__IF, null, msgs);
-			msgs = basicSetIf(newIf, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__IF, newIf, newIf));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ToViewIdType getToViewId() {
-		return toViewId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newToViewId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetToViewId(ToViewIdType newToViewId, NotificationChain msgs) {
-		ToViewIdType oldToViewId = toViewId;
-		toViewId = newToViewId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID, oldToViewId, newToViewId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setToViewId(ToViewIdType newToViewId) {
-		if (newToViewId != toViewId) {
-			NotificationChain msgs = null;
-			if (toViewId != null)
-				msgs = ((InternalEObject)toViewId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID, null, msgs);
-			if (newToViewId != null)
-				msgs = ((InternalEObject)newToViewId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID, null, msgs);
-			msgs = basicSetToViewId(newToViewId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID, newToViewId, newToViewId));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RedirectType getRedirect() {
-		return redirect;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRedirect 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRedirect(RedirectType newRedirect, NotificationChain msgs) {
-		RedirectType oldRedirect = redirect;
-		redirect = newRedirect;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, oldRedirect, newRedirect);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRedirect(RedirectType newRedirect) {
-		if (newRedirect != redirect) {
-			NotificationChain msgs = null;
-			if (redirect != null)
-				msgs = ((InternalEObject)redirect).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, null, msgs);
-			if (newRedirect != null)
-				msgs = ((InternalEObject)newRedirect).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, null, msgs);
-			msgs = basicSetRedirect(newRedirect, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT, newRedirect, newRedirect));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_CASE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-				return basicSetFromAction(null, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-				return basicSetFromOutcome(null, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-				return basicSetIf(null, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-				return basicSetToViewId(null, msgs);
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				return basicSetRedirect(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-				return getFromAction();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-				return getFromOutcome();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-				return getIf();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-				return getToViewId();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				return getRedirect();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-				setFromAction((FromActionType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-				setFromOutcome((FromOutcomeType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-				setIf((IfType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-				setToViewId((ToViewIdType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				setRedirect((RedirectType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-				setFromAction((FromActionType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-				setFromOutcome((FromOutcomeType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-				setIf((IfType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-				setToViewId((ToViewIdType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				setRedirect((RedirectType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_ACTION:
-				return fromAction != null;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__FROM_OUTCOME:
-				return fromOutcome != null;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__IF:
-				return if_ != null;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__TO_VIEW_ID:
-				return toViewId != null;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__REDIRECT:
-				return redirect != null;
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NavigationCaseTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationHandlerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationHandlerTypeImpl.java
deleted file mode 100644
index 814a158..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationHandlerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Handler Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationHandlerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NavigationHandlerTypeImpl extends EObjectImpl implements NavigationHandlerType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationHandlerTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NAVIGATION_HANDLER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NavigationHandlerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleExtensionTypeImpl.java
deleted file mode 100644
index b05ec70..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Rule Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class NavigationRuleExtensionTypeImpl extends ExtensionTypeImpl implements NavigationRuleExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected NavigationRuleExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NAVIGATION_RULE_EXTENSION_TYPE;
-	}
-
-} //NavigationRuleExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleTypeImpl.java
deleted file mode 100644
index 3007f16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NavigationRuleTypeImpl.java
+++ /dev/null
@@ -1,444 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Navigation Rule Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getFromViewId <em>From View Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getNavigationCase <em>Navigation Case</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getNavigationRuleExtension <em>Navigation Rule Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NavigationRuleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NavigationRuleTypeImpl extends EObjectImpl implements NavigationRuleType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getFromViewId() <em>From View Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFromViewId()
-	 * @generated
-	 * @ordered
-	 */
-	protected FromViewIdType fromViewId;
-
-    /**
-	 * The cached value of the '{@link #getNavigationCase() <em>Navigation Case</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNavigationCase()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList navigationCase;
-
-    /**
-	 * The cached value of the '{@link #getNavigationRuleExtension() <em>Navigation Rule Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getNavigationRuleExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList navigationRuleExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NavigationRuleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NAVIGATION_RULE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FromViewIdType getFromViewId() {
-		return fromViewId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newFromViewId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetFromViewId(FromViewIdType newFromViewId, NotificationChain msgs) {
-		FromViewIdType oldFromViewId = fromViewId;
-		fromViewId = newFromViewId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, oldFromViewId, newFromViewId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setFromViewId(FromViewIdType newFromViewId) {
-		if (newFromViewId != fromViewId) {
-			NotificationChain msgs = null;
-			if (fromViewId != null)
-				msgs = ((InternalEObject)fromViewId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, null, msgs);
-			if (newFromViewId != null)
-				msgs = ((InternalEObject)newFromViewId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, null, msgs);
-			msgs = basicSetFromViewId(newFromViewId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID, newFromViewId, newFromViewId));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getNavigationCase() {
-		if (navigationCase == null) {
-			navigationCase = new EObjectContainmentEList(NavigationCaseType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE);
-		}
-		return navigationCase;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getNavigationRuleExtension() {
-		if (navigationRuleExtension == null) {
-			navigationRuleExtension = new EObjectContainmentEList(NavigationRuleExtensionType.class, this, FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION);
-		}
-		return navigationRuleExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NAVIGATION_RULE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-				return basicSetFromViewId(null, msgs);
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-				return ((InternalEList)getNavigationCase()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				return ((InternalEList)getNavigationRuleExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-				return getFromViewId();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-				return getNavigationCase();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				return getNavigationRuleExtension();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-				setFromViewId((FromViewIdType)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-				getNavigationCase().clear();
-				getNavigationCase().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				getNavigationRuleExtension().clear();
-				getNavigationRuleExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-				setFromViewId((FromViewIdType)null);
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-				getNavigationCase().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				getNavigationRuleExtension().clear();
-				return;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__FROM_VIEW_ID:
-				return fromViewId != null;
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_CASE:
-				return navigationCase != null && !navigationCase.isEmpty();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__NAVIGATION_RULE_EXTENSION:
-				return navigationRuleExtension != null && !navigationRuleExtension.isEmpty();
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NavigationRuleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NullValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NullValueTypeImpl.java
deleted file mode 100644
index e42c2b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/NullValueTypeImpl.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NullValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Null Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.NullValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class NullValueTypeImpl extends EObjectImpl implements NullValueType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected NullValueTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.NULL_VALUE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.NULL_VALUE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.NULL_VALUE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //NullValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOrderingTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOrderingTypeImpl.java
deleted file mode 100644
index 8e118cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOrderingTypeImpl.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Ordering Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOrderingTypeImpl#getOthers <em>Others</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OrderingOrderingTypeImpl extends EObjectImpl implements OrderingOrderingType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList name;
-
-	/**
-	 * The cached value of the '{@link #getOthers() <em>Others</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOthers()
-	 * @generated
-	 * @ordered
-	 */
-	protected OrderingOthersType others;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingOrderingTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ORDERING_ORDERING_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getName() {
-		if (name == null) {
-			name = new EObjectContainmentEList(NameType.class, this, FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME);
-		}
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOthersType getOthers() {
-		return others;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newOthers 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetOthers(OrderingOthersType newOthers, NotificationChain msgs) {
-		OrderingOthersType oldOthers = others;
-		others = newOthers;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS, oldOthers, newOthers);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setOthers(OrderingOthersType newOthers) {
-		if (newOthers != others) {
-			NotificationChain msgs = null;
-			if (others != null)
-				msgs = ((InternalEObject)others).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS, null, msgs);
-			if (newOthers != null)
-				msgs = ((InternalEObject)newOthers).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS, null, msgs);
-			msgs = basicSetOthers(newOthers, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS, newOthers, newOthers));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-				return ((InternalEList)getName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				return basicSetOthers(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-				return getName();
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				return getOthers();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-				getName().clear();
-				getName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				setOthers((OrderingOthersType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-				getName().clear();
-				return;
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				setOthers((OrderingOthersType)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__NAME:
-				return name != null && !name.isEmpty();
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE__OTHERS:
-				return others != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //OrderingOrderingTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOthersTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOthersTypeImpl.java
deleted file mode 100644
index fe8c019..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingOthersTypeImpl.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Ordering Others Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingOthersTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OrderingOthersTypeImpl extends EObjectImpl implements OrderingOthersType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingOthersTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ORDERING_OTHERS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_OTHERS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //OrderingOthersTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingTypeImpl.java
deleted file mode 100644
index a5402e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/OrderingTypeImpl.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType;
-import org.eclipse.jst.jsf.facesconfig.emf.OrderingType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Ordering Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl#getBefore <em>Before</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.OrderingTypeImpl#getAfter <em>After</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OrderingTypeImpl extends EObjectImpl implements OrderingType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getBefore() <em>Before</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBefore()
-	 * @generated
-	 * @ordered
-	 */
-	protected OrderingOrderingType before;
-
-	/**
-	 * The cached value of the '{@link #getAfter() <em>After</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAfter()
-	 * @generated
-	 * @ordered
-	 */
-	protected OrderingOrderingType after;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OrderingTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.ORDERING_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOrderingType getBefore() {
-		return before;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newBefore 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetBefore(OrderingOrderingType newBefore, NotificationChain msgs) {
-		OrderingOrderingType oldBefore = before;
-		before = newBefore;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_TYPE__BEFORE, oldBefore, newBefore);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setBefore(OrderingOrderingType newBefore) {
-		if (newBefore != before) {
-			NotificationChain msgs = null;
-			if (before != null)
-				msgs = ((InternalEObject)before).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_TYPE__BEFORE, null, msgs);
-			if (newBefore != null)
-				msgs = ((InternalEObject)newBefore).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_TYPE__BEFORE, null, msgs);
-			msgs = basicSetBefore(newBefore, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_TYPE__BEFORE, newBefore, newBefore));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public OrderingOrderingType getAfter() {
-		return after;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newAfter 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetAfter(OrderingOrderingType newAfter, NotificationChain msgs) {
-		OrderingOrderingType oldAfter = after;
-		after = newAfter;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_TYPE__AFTER, oldAfter, newAfter);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAfter(OrderingOrderingType newAfter) {
-		if (newAfter != after) {
-			NotificationChain msgs = null;
-			if (after != null)
-				msgs = ((InternalEObject)after).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_TYPE__AFTER, null, msgs);
-			if (newAfter != null)
-				msgs = ((InternalEObject)newAfter).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.ORDERING_TYPE__AFTER, null, msgs);
-			msgs = basicSetAfter(newAfter, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.ORDERING_TYPE__AFTER, newAfter, newAfter));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-				return basicSetBefore(null, msgs);
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				return basicSetAfter(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-				return getBefore();
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				return getAfter();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-				setBefore((OrderingOrderingType)newValue);
-				return;
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				setAfter((OrderingOrderingType)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-				setBefore((OrderingOrderingType)null);
-				return;
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				setAfter((OrderingOrderingType)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.ORDERING_TYPE__BEFORE:
-				return before != null;
-			case FacesConfigPackage.ORDERING_TYPE__AFTER:
-				return after != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //OrderingTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PartialViewContextFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PartialViewContextFactoryTypeImpl.java
deleted file mode 100644
index 7c77fd8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PartialViewContextFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Partial View Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PartialViewContextFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PartialViewContextFactoryTypeImpl extends EObjectImpl implements PartialViewContextFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PartialViewContextFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PartialViewContextFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PhaseListenerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PhaseListenerTypeImpl.java
deleted file mode 100644
index 18fe290..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PhaseListenerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Phase Listener Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PhaseListenerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PhaseListenerTypeImpl extends EObjectImpl implements PhaseListenerType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PhaseListenerTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PHASE_LISTENER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PHASE_LISTENER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.PHASE_LISTENER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PhaseListenerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyClassTypeImpl.java
deleted file mode 100644
index aa19cde..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyClassTypeImpl extends EObjectImpl implements PropertyClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PROPERTY_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PropertyClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyExtensionTypeImpl.java
deleted file mode 100644
index 1c6d84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyExtensionTypeImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class PropertyExtensionTypeImpl extends ExtensionTypeImpl implements PropertyExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PROPERTY_EXTENSION_TYPE;
-	}
-
-} //PropertyExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyNameTypeImpl.java
deleted file mode 100644
index 76ecad7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyNameTypeImpl extends EObjectImpl implements PropertyNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PROPERTY_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.PROPERTY_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PropertyNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyResolverTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyResolverTypeImpl.java
deleted file mode 100644
index 954da7d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyResolverTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyResolverTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyResolverTypeImpl extends EObjectImpl implements PropertyResolverType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyResolverTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PROPERTY_RESOLVER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PropertyResolverTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyTypeImpl.java
deleted file mode 100644
index a1ace9c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/PropertyTypeImpl.java
+++ /dev/null
@@ -1,617 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Property Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getPropertyName <em>Property Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getPropertyClass <em>Property Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getDefaultValue <em>Default Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getSuggestedValue <em>Suggested Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getPropertyExtension <em>Property Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.PropertyTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class PropertyTypeImpl extends EObjectImpl implements PropertyType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getPropertyName() <em>Property Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyName()
-	 * @generated
-	 * @ordered
-	 */
-	protected PropertyNameType propertyName;
-
-    /**
-	 * The cached value of the '{@link #getPropertyClass() <em>Property Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected PropertyClassType propertyClass;
-
-    /**
-	 * The cached value of the '{@link #getDefaultValue() <em>Default Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDefaultValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected DefaultValueType defaultValue;
-
-    /**
-	 * The cached value of the '{@link #getSuggestedValue() <em>Suggested Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSuggestedValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected SuggestedValueType suggestedValue;
-
-    /**
-	 * The cached value of the '{@link #getPropertyExtension() <em>Property Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getPropertyExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList propertyExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PropertyTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.PROPERTY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.PROPERTY_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyNameType getPropertyName() {
-		return propertyName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyName(PropertyNameType newPropertyName, NotificationChain msgs) {
-		PropertyNameType oldPropertyName = propertyName;
-		propertyName = newPropertyName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME, oldPropertyName, newPropertyName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyName(PropertyNameType newPropertyName) {
-		if (newPropertyName != propertyName) {
-			NotificationChain msgs = null;
-			if (propertyName != null)
-				msgs = ((InternalEObject)propertyName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME, null, msgs);
-			if (newPropertyName != null)
-				msgs = ((InternalEObject)newPropertyName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME, null, msgs);
-			msgs = basicSetPropertyName(newPropertyName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME, newPropertyName, newPropertyName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public PropertyClassType getPropertyClass() {
-		return propertyClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newPropertyClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetPropertyClass(PropertyClassType newPropertyClass, NotificationChain msgs) {
-		PropertyClassType oldPropertyClass = propertyClass;
-		propertyClass = newPropertyClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS, oldPropertyClass, newPropertyClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setPropertyClass(PropertyClassType newPropertyClass) {
-		if (newPropertyClass != propertyClass) {
-			NotificationChain msgs = null;
-			if (propertyClass != null)
-				msgs = ((InternalEObject)propertyClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS, null, msgs);
-			if (newPropertyClass != null)
-				msgs = ((InternalEObject)newPropertyClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS, null, msgs);
-			msgs = basicSetPropertyClass(newPropertyClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS, newPropertyClass, newPropertyClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DefaultValueType getDefaultValue() {
-		return defaultValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newDefaultValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetDefaultValue(DefaultValueType newDefaultValue, NotificationChain msgs) {
-		DefaultValueType oldDefaultValue = defaultValue;
-		defaultValue = newDefaultValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE, oldDefaultValue, newDefaultValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setDefaultValue(DefaultValueType newDefaultValue) {
-		if (newDefaultValue != defaultValue) {
-			NotificationChain msgs = null;
-			if (defaultValue != null)
-				msgs = ((InternalEObject)defaultValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE, null, msgs);
-			if (newDefaultValue != null)
-				msgs = ((InternalEObject)newDefaultValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE, null, msgs);
-			msgs = basicSetDefaultValue(newDefaultValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE, newDefaultValue, newDefaultValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SuggestedValueType getSuggestedValue() {
-		return suggestedValue;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newSuggestedValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSuggestedValue(SuggestedValueType newSuggestedValue, NotificationChain msgs) {
-		SuggestedValueType oldSuggestedValue = suggestedValue;
-		suggestedValue = newSuggestedValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, oldSuggestedValue, newSuggestedValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSuggestedValue(SuggestedValueType newSuggestedValue) {
-		if (newSuggestedValue != suggestedValue) {
-			NotificationChain msgs = null;
-			if (suggestedValue != null)
-				msgs = ((InternalEObject)suggestedValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, null, msgs);
-			if (newSuggestedValue != null)
-				msgs = ((InternalEObject)newSuggestedValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, null, msgs);
-			msgs = basicSetSuggestedValue(newSuggestedValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE, newSuggestedValue, newSuggestedValue));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getPropertyExtension() {
-		if (propertyExtension == null) {
-			propertyExtension = new EObjectContainmentEList(PropertyExtensionType.class, this, FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION);
-		}
-		return propertyExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.PROPERTY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-				return basicSetPropertyName(null, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-				return basicSetPropertyClass(null, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-				return basicSetDefaultValue(null, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-				return basicSetSuggestedValue(null, msgs);
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				return ((InternalEList)getPropertyExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-				return getPropertyName();
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-				return getPropertyClass();
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-				return getDefaultValue();
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-				return getSuggestedValue();
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				return getPropertyExtension();
-			case FacesConfigPackage.PROPERTY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				getPropertyExtension().clear();
-				getPropertyExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-				setPropertyName((PropertyNameType)null);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-				setPropertyClass((PropertyClassType)null);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-				setDefaultValue((DefaultValueType)null);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-				setSuggestedValue((SuggestedValueType)null);
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				getPropertyExtension().clear();
-				return;
-			case FacesConfigPackage.PROPERTY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.PROPERTY_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.PROPERTY_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.PROPERTY_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_NAME:
-				return propertyName != null;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_CLASS:
-				return propertyClass != null;
-			case FacesConfigPackage.PROPERTY_TYPE__DEFAULT_VALUE:
-				return defaultValue != null;
-			case FacesConfigPackage.PROPERTY_TYPE__SUGGESTED_VALUE:
-				return suggestedValue != null;
-			case FacesConfigPackage.PROPERTY_TYPE__PROPERTY_EXTENSION:
-				return propertyExtension != null && !propertyExtension.isEmpty();
-			case FacesConfigPackage.PROPERTY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PropertyTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectTypeImpl.java
deleted file mode 100644
index dc35c6f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectTypeImpl.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Redirect Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl#getViewParam <em>View Param</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectTypeImpl#isIncludeViewParams <em>Include View Params</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RedirectTypeImpl extends EObjectImpl implements RedirectType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getViewParam() <em>View Param</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getViewParam()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList viewParam;
-
-				/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #isIncludeViewParams() <em>Include View Params</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIncludeViewParams()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean INCLUDE_VIEW_PARAMS_EDEFAULT = false;
-
-				/**
-	 * The cached value of the '{@link #isIncludeViewParams() <em>Include View Params</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isIncludeViewParams()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean includeViewParams = INCLUDE_VIEW_PARAMS_EDEFAULT;
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RedirectTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.REDIRECT_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getViewParam() {
-		if (viewParam == null) {
-			viewParam = new EObjectContainmentEList(RedirectViewParamType.class, this, FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM);
-		}
-		return viewParam;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isIncludeViewParams() {
-		return includeViewParams;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setIncludeViewParams(boolean newIncludeViewParams) {
-		boolean oldIncludeViewParams = includeViewParams;
-		includeViewParams = newIncludeViewParams;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS, oldIncludeViewParams, includeViewParams));
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				return ((InternalEList)getViewParam()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				return getViewParam();
-			case FacesConfigPackage.REDIRECT_TYPE__ID:
-				return getId();
-			case FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS:
-				return isIncludeViewParams() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				getViewParam().clear();
-				getViewParam().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.REDIRECT_TYPE__ID:
-				setId((String)newValue);
-				return;
-			case FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS:
-				setIncludeViewParams(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				getViewParam().clear();
-				return;
-			case FacesConfigPackage.REDIRECT_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS:
-				setIncludeViewParams(INCLUDE_VIEW_PARAMS_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_TYPE__VIEW_PARAM:
-				return viewParam != null && !viewParam.isEmpty();
-			case FacesConfigPackage.REDIRECT_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case FacesConfigPackage.REDIRECT_TYPE__INCLUDE_VIEW_PARAMS:
-				return includeViewParams != INCLUDE_VIEW_PARAMS_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", includeViewParams: "); //$NON-NLS-1$
-		result.append(includeViewParams);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RedirectTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectViewParamTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectViewParamTypeImpl.java
deleted file mode 100644
index ac34d57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RedirectViewParamTypeImpl.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.NameType;
-import org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Redirect View Param Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl#getName <em>Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RedirectViewParamTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RedirectViewParamTypeImpl extends EObjectImpl implements RedirectViewParamType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getName() <em>Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getName()
-	 * @generated
-	 * @ordered
-	 */
-	protected NameType name;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValueType value;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RedirectViewParamTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.REDIRECT_VIEW_PARAM_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NameType getName() {
-		return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newName 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetName(NameType newName, NotificationChain msgs) {
-		NameType oldName = name;
-		name = newName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME, oldName, newName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setName(NameType newName) {
-		if (newName != name) {
-			NotificationChain msgs = null;
-			if (name != null)
-				msgs = ((InternalEObject)name).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME, null, msgs);
-			if (newName != null)
-				msgs = ((InternalEObject)newName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME, null, msgs);
-			msgs = basicSetName(newName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME, newName, newName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValueType getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newValue 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValue(ValueType newValue, NotificationChain msgs) {
-		ValueType oldValue = value;
-		value = newValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE, oldValue, newValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(ValueType newValue) {
-		if (newValue != value) {
-			NotificationChain msgs = null;
-			if (value != null)
-				msgs = ((InternalEObject)value).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE, null, msgs);
-			if (newValue != null)
-				msgs = ((InternalEObject)newValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE, null, msgs);
-			msgs = basicSetValue(newValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE, newValue, newValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-				return basicSetName(null, msgs);
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				return basicSetValue(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-				return getName();
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				return getValue();
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-				setName((NameType)newValue);
-				return;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				setValue((ValueType)newValue);
-				return;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-				setName((NameType)null);
-				return;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				setValue((ValueType)null);
-				return;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__NAME:
-				return name != null;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__VALUE:
-				return value != null;
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RedirectViewParamTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanClassTypeImpl.java
deleted file mode 100644
index 8689119..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Referenced Bean Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferencedBeanClassTypeImpl extends EObjectImpl implements ReferencedBeanClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.REFERENCED_BEAN_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ReferencedBeanClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanNameTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanNameTypeImpl.java
deleted file mode 100644
index d0b1911..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanNameTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Referenced Bean Name Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanNameTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferencedBeanNameTypeImpl extends EObjectImpl implements ReferencedBeanNameType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanNameTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.REFERENCED_BEAN_NAME_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ReferencedBeanNameTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanTypeImpl.java
deleted file mode 100644
index cb35f50..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ReferencedBeanTypeImpl.java
+++ /dev/null
@@ -1,440 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Referenced Bean Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getReferencedBeanName <em>Referenced Bean Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getReferencedBeanClass <em>Referenced Bean Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ReferencedBeanTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ReferencedBeanTypeImpl extends EObjectImpl implements ReferencedBeanType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getReferencedBeanName() <em>Referenced Bean Name</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferencedBeanName()
-	 * @generated
-	 * @ordered
-	 */
-	protected ReferencedBeanNameType referencedBeanName;
-
-    /**
-	 * The cached value of the '{@link #getReferencedBeanClass() <em>Referenced Bean Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getReferencedBeanClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ReferencedBeanClassType referencedBeanClass;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ReferencedBeanTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.REFERENCED_BEAN_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanNameType getReferencedBeanName() {
-		return referencedBeanName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newReferencedBeanName 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferencedBeanName(ReferencedBeanNameType newReferencedBeanName, NotificationChain msgs) {
-		ReferencedBeanNameType oldReferencedBeanName = referencedBeanName;
-		referencedBeanName = newReferencedBeanName;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME, oldReferencedBeanName, newReferencedBeanName);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferencedBeanName(ReferencedBeanNameType newReferencedBeanName) {
-		if (newReferencedBeanName != referencedBeanName) {
-			NotificationChain msgs = null;
-			if (referencedBeanName != null)
-				msgs = ((InternalEObject)referencedBeanName).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME, null, msgs);
-			if (newReferencedBeanName != null)
-				msgs = ((InternalEObject)newReferencedBeanName).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME, null, msgs);
-			msgs = basicSetReferencedBeanName(newReferencedBeanName, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME, newReferencedBeanName, newReferencedBeanName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ReferencedBeanClassType getReferencedBeanClass() {
-		return referencedBeanClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newReferencedBeanClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetReferencedBeanClass(ReferencedBeanClassType newReferencedBeanClass, NotificationChain msgs) {
-		ReferencedBeanClassType oldReferencedBeanClass = referencedBeanClass;
-		referencedBeanClass = newReferencedBeanClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, oldReferencedBeanClass, newReferencedBeanClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setReferencedBeanClass(ReferencedBeanClassType newReferencedBeanClass) {
-		if (newReferencedBeanClass != referencedBeanClass) {
-			NotificationChain msgs = null;
-			if (referencedBeanClass != null)
-				msgs = ((InternalEObject)referencedBeanClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, null, msgs);
-			if (newReferencedBeanClass != null)
-				msgs = ((InternalEObject)newReferencedBeanClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, null, msgs);
-			msgs = basicSetReferencedBeanClass(newReferencedBeanClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS, newReferencedBeanClass, newReferencedBeanClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.REFERENCED_BEAN_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-				return basicSetReferencedBeanName(null, msgs);
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				return basicSetReferencedBeanClass(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-				return getReferencedBeanName();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				return getReferencedBeanClass();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-				setReferencedBeanName((ReferencedBeanNameType)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				setReferencedBeanClass((ReferencedBeanClassType)newValue);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-				setReferencedBeanName((ReferencedBeanNameType)null);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				setReferencedBeanClass((ReferencedBeanClassType)null);
-				return;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_NAME:
-				return referencedBeanName != null;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__REFERENCED_BEAN_CLASS:
-				return referencedBeanClass != null;
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ReferencedBeanTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitClassTypeImpl.java
deleted file mode 100644
index d908748..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitClassTypeImpl extends EObjectImpl implements RenderKitClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDER_KIT_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RenderKitClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitExtensionTypeImpl.java
deleted file mode 100644
index e0fcbc3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class RenderKitExtensionTypeImpl extends ExtensionTypeImpl implements RenderKitExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected RenderKitExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDER_KIT_EXTENSION_TYPE;
-	}
-
-} //RenderKitExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitFactoryTypeImpl.java
deleted file mode 100644
index d2a2804..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitFactoryTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitFactoryTypeImpl extends EObjectImpl implements RenderKitFactoryType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitFactoryTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDER_KIT_FACTORY_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RenderKitFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitIdTypeImpl.java
deleted file mode 100644
index 5f9c6cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitIdTypeImpl extends EObjectImpl implements RenderKitIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDER_KIT_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RenderKitIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitTypeImpl.java
deleted file mode 100644
index 55d5742..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RenderKitTypeImpl.java
+++ /dev/null
@@ -1,551 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.RenderKitType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Render Kit Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderKitId <em>Render Kit Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderKitClass <em>Render Kit Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderer <em>Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getClientBehaviorRenderer <em>Client Behavior Renderer</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getRenderKitExtension <em>Render Kit Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RenderKitTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RenderKitTypeImpl extends EObjectImpl implements RenderKitType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getRenderKitId() <em>Render Kit Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRenderKitId()
-	 * @generated
-	 * @ordered
-	 */
-	protected RenderKitIdType renderKitId;
-
-    /**
-	 * The cached value of the '{@link #getRenderKitClass() <em>Render Kit Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRenderKitClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected RenderKitClassType renderKitClass;
-
-    /**
-	 * The cached value of the '{@link #getRenderer() <em>Renderer</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRenderer()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList renderer;
-
-    /**
-	 * The cached value of the '{@link #getClientBehaviorRenderer() <em>Client Behavior Renderer</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getClientBehaviorRenderer()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList clientBehaviorRenderer;
-
-				/**
-	 * The cached value of the '{@link #getRenderKitExtension() <em>Render Kit Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getRenderKitExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList renderKitExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RenderKitTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDER_KIT_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitIdType getRenderKitId() {
-		return renderKitId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKitId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKitId(RenderKitIdType newRenderKitId, NotificationChain msgs) {
-		RenderKitIdType oldRenderKitId = renderKitId;
-		renderKitId = newRenderKitId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID, oldRenderKitId, newRenderKitId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKitId(RenderKitIdType newRenderKitId) {
-		if (newRenderKitId != renderKitId) {
-			NotificationChain msgs = null;
-			if (renderKitId != null)
-				msgs = ((InternalEObject)renderKitId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID, null, msgs);
-			if (newRenderKitId != null)
-				msgs = ((InternalEObject)newRenderKitId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID, null, msgs);
-			msgs = basicSetRenderKitId(newRenderKitId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID, newRenderKitId, newRenderKitId));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RenderKitClassType getRenderKitClass() {
-		return renderKitClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRenderKitClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRenderKitClass(RenderKitClassType newRenderKitClass, NotificationChain msgs) {
-		RenderKitClassType oldRenderKitClass = renderKitClass;
-		renderKitClass = newRenderKitClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, oldRenderKitClass, newRenderKitClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRenderKitClass(RenderKitClassType newRenderKitClass) {
-		if (newRenderKitClass != renderKitClass) {
-			NotificationChain msgs = null;
-			if (renderKitClass != null)
-				msgs = ((InternalEObject)renderKitClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, null, msgs);
-			if (newRenderKitClass != null)
-				msgs = ((InternalEObject)newRenderKitClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, null, msgs);
-			msgs = basicSetRenderKitClass(newRenderKitClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS, newRenderKitClass, newRenderKitClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRenderer() {
-		if (renderer == null) {
-			renderer = new EObjectContainmentEList(RendererType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__RENDERER);
-		}
-		return renderer;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getClientBehaviorRenderer() {
-		if (clientBehaviorRenderer == null) {
-			clientBehaviorRenderer = new EObjectContainmentEList(ClientBehaviorRendererType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER);
-		}
-		return clientBehaviorRenderer;
-	}
-
-				/**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getRenderKitExtension() {
-		if (renderKitExtension == null) {
-			renderKitExtension = new EObjectContainmentEList(RenderKitExtensionType.class, this, FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION);
-		}
-		return renderKitExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDER_KIT_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-				return basicSetRenderKitId(null, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-				return basicSetRenderKitClass(null, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-				return ((InternalEList)getRenderer()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-				return ((InternalEList)getClientBehaviorRenderer()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				return ((InternalEList)getRenderKitExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-				return getRenderKitId();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-				return getRenderKitClass();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-				return getRenderer();
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-				return getClientBehaviorRenderer();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				return getRenderKitExtension();
-			case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-				setRenderKitId((RenderKitIdType)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-				setRenderKitClass((RenderKitClassType)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-				getRenderer().clear();
-				getRenderer().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-				getClientBehaviorRenderer().clear();
-				getClientBehaviorRenderer().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				getRenderKitExtension().clear();
-				getRenderKitExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-				setRenderKitId((RenderKitIdType)null);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-				setRenderKitClass((RenderKitClassType)null);
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-				getRenderer().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-				getClientBehaviorRenderer().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				getRenderKitExtension().clear();
-				return;
-			case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDER_KIT_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_ID:
-				return renderKitId != null;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_CLASS:
-				return renderKitClass != null;
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDERER:
-				return renderer != null && !renderer.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__CLIENT_BEHAVIOR_RENDERER:
-				return clientBehaviorRenderer != null && !clientBehaviorRenderer.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__RENDER_KIT_EXTENSION:
-				return renderKitExtension != null && !renderKitExtension.isEmpty();
-			case FacesConfigPackage.RENDER_KIT_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RenderKitTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererClassTypeImpl.java
deleted file mode 100644
index 817f53d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RendererClassTypeImpl extends EObjectImpl implements RendererClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDERER_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RENDERER_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RendererClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererExtensionTypeImpl.java
deleted file mode 100644
index f62d4ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererExtensionTypeImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class RendererExtensionTypeImpl extends ExtensionTypeImpl implements RendererExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDERER_EXTENSION_TYPE;
-	}
-
-} //RendererExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeImpl.java
deleted file mode 100644
index 60662d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeImpl.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.FacetType;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererType;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getComponentFamily <em>Component Family</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getRendererType <em>Renderer Type</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getRendererClass <em>Renderer Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getFacet <em>Facet</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getRendererExtension <em>Renderer Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RendererTypeImpl extends EObjectImpl implements RendererType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getComponentFamily() <em>Component Family</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getComponentFamily()
-	 * @generated
-	 * @ordered
-	 */
-	protected ComponentFamilyType componentFamily;
-
-    /**
-	 * The cached value of the '{@link #getRendererType() <em>Renderer Type</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRendererType()
-	 * @generated
-	 * @ordered
-	 */
-	protected RendererTypeType rendererType;
-
-    /**
-	 * The cached value of the '{@link #getRendererClass() <em>Renderer Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRendererClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected RendererClassType rendererClass;
-
-    /**
-	 * The cached value of the '{@link #getFacet() <em>Facet</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getFacet()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList facet;
-
-    /**
-	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attribute;
-
-    /**
-	 * The cached value of the '{@link #getRendererExtension() <em>Renderer Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getRendererExtension()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList rendererExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDERER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.RENDERER_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.RENDERER_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ComponentFamilyType getComponentFamily() {
-		return componentFamily;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newComponentFamily 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetComponentFamily(ComponentFamilyType newComponentFamily, NotificationChain msgs) {
-		ComponentFamilyType oldComponentFamily = componentFamily;
-		componentFamily = newComponentFamily;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY, oldComponentFamily, newComponentFamily);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setComponentFamily(ComponentFamilyType newComponentFamily) {
-		if (newComponentFamily != componentFamily) {
-			NotificationChain msgs = null;
-			if (componentFamily != null)
-				msgs = ((InternalEObject)componentFamily).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY, null, msgs);
-			if (newComponentFamily != null)
-				msgs = ((InternalEObject)newComponentFamily).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY, null, msgs);
-			msgs = basicSetComponentFamily(newComponentFamily, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY, newComponentFamily, newComponentFamily));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererTypeType getRendererType() {
-		return rendererType;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRendererType 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRendererType(RendererTypeType newRendererType, NotificationChain msgs) {
-		RendererTypeType oldRendererType = rendererType;
-		rendererType = newRendererType;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE, oldRendererType, newRendererType);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRendererType(RendererTypeType newRendererType) {
-		if (newRendererType != rendererType) {
-			NotificationChain msgs = null;
-			if (rendererType != null)
-				msgs = ((InternalEObject)rendererType).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE, null, msgs);
-			if (newRendererType != null)
-				msgs = ((InternalEObject)newRendererType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE, null, msgs);
-			msgs = basicSetRendererType(newRendererType, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE, newRendererType, newRendererType));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public RendererClassType getRendererClass() {
-		return rendererClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newRendererClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetRendererClass(RendererClassType newRendererClass, NotificationChain msgs) {
-		RendererClassType oldRendererClass = rendererClass;
-		rendererClass = newRendererClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, oldRendererClass, newRendererClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setRendererClass(RendererClassType newRendererClass) {
-		if (newRendererClass != rendererClass) {
-			NotificationChain msgs = null;
-			if (rendererClass != null)
-				msgs = ((InternalEObject)rendererClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, null, msgs);
-			if (newRendererClass != null)
-				msgs = ((InternalEObject)newRendererClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, null, msgs);
-			msgs = basicSetRendererClass(newRendererClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS, newRendererClass, newRendererClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getFacet() {
-		if (facet == null) {
-			facet = new EObjectContainmentEList(FacetType.class, this, FacesConfigPackage.RENDERER_TYPE__FACET);
-		}
-		return facet;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttribute() {
-		if (attribute == null) {
-			attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE);
-		}
-		return attribute;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getRendererExtension() {
-		if (rendererExtension == null) {
-			rendererExtension = new EObjectContainmentEList(RendererExtensionType.class, this, FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION);
-		}
-		return rendererExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-				return basicSetComponentFamily(null, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-				return basicSetRendererType(null, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-				return basicSetRendererClass(null, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-				return ((InternalEList)getFacet()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-				return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				return ((InternalEList)getRendererExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-				return getComponentFamily();
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-				return getRendererType();
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-				return getRendererClass();
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-				return getFacet();
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				return getRendererExtension();
-			case FacesConfigPackage.RENDERER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-				setComponentFamily((ComponentFamilyType)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-				setRendererType((RendererTypeType)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-				setRendererClass((RendererClassType)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-				getFacet().clear();
-				getFacet().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				getAttribute().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				getRendererExtension().clear();
-				getRendererExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-				setComponentFamily((ComponentFamilyType)null);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-				setRendererType((RendererTypeType)null);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-				setRendererClass((RendererClassType)null);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-				getFacet().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				getRendererExtension().clear();
-				return;
-			case FacesConfigPackage.RENDERER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__COMPONENT_FAMILY:
-				return componentFamily != null;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_TYPE:
-				return rendererType != null;
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_CLASS:
-				return rendererClass != null;
-			case FacesConfigPackage.RENDERER_TYPE__FACET:
-				return facet != null && !facet.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__ATTRIBUTE:
-				return attribute != null && !attribute.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__RENDERER_EXTENSION:
-				return rendererExtension != null && !rendererExtension.isEmpty();
-			case FacesConfigPackage.RENDERER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RendererTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeTypeImpl.java
deleted file mode 100644
index 115a166..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/RendererTypeTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Renderer Type Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.RendererTypeTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class RendererTypeTypeImpl extends EObjectImpl implements RendererTypeType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected RendererTypeTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RENDERER_TYPE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RENDERER_TYPE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RENDERER_TYPE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //RendererTypeTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceBundleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceBundleTypeImpl.java
deleted file mode 100644
index 78418e0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceBundleTypeImpl.java
+++ /dev/null
@@ -1,423 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.BaseNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType;
-import org.eclipse.jst.jsf.facesconfig.emf.VarType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resource Bundle Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getBaseName <em>Base Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getVar <em>Var</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceBundleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResourceBundleTypeImpl extends EObjectImpl implements ResourceBundleType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getBaseName() <em>Base Name</em>}' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getBaseName()
-	 * @generated
-	 * @ordered
-	 */
-    protected BaseNameType baseName;
-
-    /**
-	 * The cached value of the '{@link #getVar() <em>Var</em>}' reference.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getVar()
-	 * @generated
-	 * @ordered
-	 */
-    protected VarType var;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ResourceBundleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RESOURCE_BUNDLE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public BaseNameType getBaseName() {
-		if (baseName != null && baseName.eIsProxy()) {
-			InternalEObject oldBaseName = (InternalEObject)baseName;
-			baseName = (BaseNameType)eResolveProxy(oldBaseName);
-			if (baseName != oldBaseName) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME, oldBaseName, baseName));
-			}
-		}
-		return baseName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @return the base name 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public BaseNameType basicGetBaseName() {
-		return baseName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setBaseName(BaseNameType newBaseName) {
-		BaseNameType oldBaseName = baseName;
-		baseName = newBaseName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME, oldBaseName, baseName));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public VarType getVar() {
-		if (var != null && var.eIsProxy()) {
-			InternalEObject oldVar = (InternalEObject)var;
-			var = (VarType)eResolveProxy(oldVar);
-			if (var != oldVar) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR, oldVar, var));
-			}
-		}
-		return var;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @return the variable 
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public VarType basicGetVar() {
-		return var;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setVar(VarType newVar) {
-		VarType oldVar = var;
-		var = newVar;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR, oldVar, var));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-				if (resolve) return getBaseName();
-				return basicGetBaseName();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-				if (resolve) return getVar();
-				return basicGetVar();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-				setBaseName((BaseNameType)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-				setVar((VarType)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-				setBaseName((BaseNameType)null);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-				setVar((VarType)null);
-				return;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__BASE_NAME:
-				return baseName != null;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__VAR:
-				return var != null;
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ResourceBundleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceHandlerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceHandlerTypeImpl.java
deleted file mode 100644
index 19ea0f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ResourceHandlerTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resource Handler Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ResourceHandlerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResourceHandlerTypeImpl extends EObjectImpl implements ResourceHandlerType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResourceHandlerTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.RESOURCE_HANDLER_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ResourceHandlerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SmallIconTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SmallIconTypeImpl.java
deleted file mode 100644
index 8f3582f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SmallIconTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SmallIconType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Small Icon Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SmallIconTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SmallIconTypeImpl extends EObjectImpl implements SmallIconType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SmallIconTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SMALL_ICON_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SMALL_ICON_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SMALL_ICON_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SMALL_ICON_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SmallIconTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SourceClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SourceClassTypeImpl.java
deleted file mode 100644
index d10ce02..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SourceClassTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SourceClassType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Source Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SourceClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SourceClassTypeImpl extends EObjectImpl implements SourceClassType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SourceClassTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SOURCE_CLASS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SOURCE_CLASS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SOURCE_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SourceClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/StateManagerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/StateManagerTypeImpl.java
deleted file mode 100644
index fed3b97..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/StateManagerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.StateManagerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>State Manager Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.StateManagerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class StateManagerTypeImpl extends EObjectImpl implements StateManagerType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected StateManagerTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.STATE_MANAGER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.STATE_MANAGER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.STATE_MANAGER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.STATE_MANAGER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //StateManagerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SuggestedValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SuggestedValueTypeImpl.java
deleted file mode 100644
index 662fa42..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SuggestedValueTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Suggested Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SuggestedValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SuggestedValueTypeImpl extends EObjectImpl implements SuggestedValueType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SuggestedValueTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SUGGESTED_VALUE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SuggestedValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SupportedLocaleTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SupportedLocaleTypeImpl.java
deleted file mode 100644
index 4ae4aed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SupportedLocaleTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Supported Locale Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SupportedLocaleTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SupportedLocaleTypeImpl extends EObjectImpl implements SupportedLocaleType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SupportedLocaleTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SUPPORTED_LOCALE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SupportedLocaleTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventClassTypeImpl.java
deleted file mode 100644
index a32b0c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventClassTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>System Event Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SystemEventClassTypeImpl extends EObjectImpl implements SystemEventClassType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventClassTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SYSTEM_EVENT_CLASS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SystemEventClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerClassTypeImpl.java
deleted file mode 100644
index bfe4c2a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerClassTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>System Event Listener Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SystemEventListenerClassTypeImpl extends EObjectImpl implements SystemEventListenerClassType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventListenerClassTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_CLASS_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SystemEventListenerClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerTypeImpl.java
deleted file mode 100644
index 26d8c6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/SystemEventListenerTypeImpl.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.SourceClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>System Event Listener Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl#getSystemEventListenerClass <em>System Event Listener Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl#getSystemEventClass <em>System Event Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl#getSourceClass <em>Source Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.SystemEventListenerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SystemEventListenerTypeImpl extends EObjectImpl implements SystemEventListenerType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getSystemEventListenerClass() <em>System Event Listener Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSystemEventListenerClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected SystemEventListenerClassType systemEventListenerClass;
-
-	/**
-	 * The cached value of the '{@link #getSystemEventClass() <em>System Event Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSystemEventClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected SystemEventClassType systemEventClass;
-
-	/**
-	 * The cached value of the '{@link #getSourceClass() <em>Source Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSourceClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected SourceClassType sourceClass;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SystemEventListenerTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.SYSTEM_EVENT_LISTENER_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventListenerClassType getSystemEventListenerClass() {
-		return systemEventListenerClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newSystemEventListenerClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSystemEventListenerClass(SystemEventListenerClassType newSystemEventListenerClass, NotificationChain msgs) {
-		SystemEventListenerClassType oldSystemEventListenerClass = systemEventListenerClass;
-		systemEventListenerClass = newSystemEventListenerClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS, oldSystemEventListenerClass, newSystemEventListenerClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSystemEventListenerClass(SystemEventListenerClassType newSystemEventListenerClass) {
-		if (newSystemEventListenerClass != systemEventListenerClass) {
-			NotificationChain msgs = null;
-			if (systemEventListenerClass != null)
-				msgs = ((InternalEObject)systemEventListenerClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS, null, msgs);
-			if (newSystemEventListenerClass != null)
-				msgs = ((InternalEObject)newSystemEventListenerClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS, null, msgs);
-			msgs = basicSetSystemEventListenerClass(newSystemEventListenerClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS, newSystemEventListenerClass, newSystemEventListenerClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SystemEventClassType getSystemEventClass() {
-		return systemEventClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newSystemEventClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSystemEventClass(SystemEventClassType newSystemEventClass, NotificationChain msgs) {
-		SystemEventClassType oldSystemEventClass = systemEventClass;
-		systemEventClass = newSystemEventClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS, oldSystemEventClass, newSystemEventClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSystemEventClass(SystemEventClassType newSystemEventClass) {
-		if (newSystemEventClass != systemEventClass) {
-			NotificationChain msgs = null;
-			if (systemEventClass != null)
-				msgs = ((InternalEObject)systemEventClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS, null, msgs);
-			if (newSystemEventClass != null)
-				msgs = ((InternalEObject)newSystemEventClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS, null, msgs);
-			msgs = basicSetSystemEventClass(newSystemEventClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS, newSystemEventClass, newSystemEventClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SourceClassType getSourceClass() {
-		return sourceClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * @param newSourceClass 
-	 * @param msgs 
-	 * @return NotificationChain
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetSourceClass(SourceClassType newSourceClass, NotificationChain msgs) {
-		SourceClassType oldSourceClass = sourceClass;
-		sourceClass = newSourceClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS, oldSourceClass, newSourceClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSourceClass(SourceClassType newSourceClass) {
-		if (newSourceClass != sourceClass) {
-			NotificationChain msgs = null;
-			if (sourceClass != null)
-				msgs = ((InternalEObject)sourceClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS, null, msgs);
-			if (newSourceClass != null)
-				msgs = ((InternalEObject)newSourceClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS, null, msgs);
-			msgs = basicSetSourceClass(newSourceClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS, newSourceClass, newSourceClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-				return basicSetSystemEventListenerClass(null, msgs);
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-				return basicSetSystemEventClass(null, msgs);
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				return basicSetSourceClass(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-				return getSystemEventListenerClass();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-				return getSystemEventClass();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				return getSourceClass();
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-				setSystemEventListenerClass((SystemEventListenerClassType)newValue);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-				setSystemEventClass((SystemEventClassType)newValue);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				setSourceClass((SourceClassType)newValue);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-				setSystemEventListenerClass((SystemEventListenerClassType)null);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-				setSystemEventClass((SystemEventClassType)null);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				setSourceClass((SourceClassType)null);
-				return;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_LISTENER_CLASS:
-				return systemEventListenerClass != null;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SYSTEM_EVENT_CLASS:
-				return systemEventClass != null;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__SOURCE_CLASS:
-				return sourceClass != null;
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SystemEventListenerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/TagHandlerDelegateFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/TagHandlerDelegateFactoryTypeImpl.java
deleted file mode 100644
index b5a9c4f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/TagHandlerDelegateFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Handler Delegate Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.TagHandlerDelegateFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagHandlerDelegateFactoryTypeImpl extends EObjectImpl implements TagHandlerDelegateFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagHandlerDelegateFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.TAG_HANDLER_DELEGATE_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TagHandlerDelegateFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ToViewIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ToViewIdTypeImpl.java
deleted file mode 100644
index 891286a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ToViewIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>To View Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ToViewIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ToViewIdTypeImpl extends EObjectImpl implements ToViewIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ToViewIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.TO_VIEW_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.TO_VIEW_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.TO_VIEW_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ToViewIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorClassTypeImpl.java
deleted file mode 100644
index 7e7263f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorClassTypeImpl extends EObjectImpl implements ValidatorClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALIDATOR_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValidatorClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorExtensionTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorExtensionTypeImpl.java
deleted file mode 100644
index b3eede8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorExtensionTypeImpl.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Extension Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * </p>
- *
- * @generated
- */
-public class ValidatorExtensionTypeImpl extends ExtensionTypeImpl implements ValidatorExtensionType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected ValidatorExtensionTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALIDATOR_EXTENSION_TYPE;
-	}
-
-} //ValidatorExtensionTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorIdTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorIdTypeImpl.java
deleted file mode 100644
index e5f4431..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorIdTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Id Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorIdTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorIdTypeImpl extends EObjectImpl implements ValidatorIdType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorIdTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALIDATOR_ID_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_ID_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VALIDATOR_ID_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValidatorIdTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorTypeImpl.java
deleted file mode 100644
index 7a266c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValidatorTypeImpl.java
+++ /dev/null
@@ -1,551 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.jsf.facesconfig.emf.AttributeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.IconType;
-import org.eclipse.jst.jsf.facesconfig.emf.PropertyType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Validator Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getDescription <em>Description</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getDisplayName <em>Display Name</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getIcon <em>Icon</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getValidatorId <em>Validator Id</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getValidatorClass <em>Validator Class</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getAttribute <em>Attribute</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getProperty <em>Property</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getValidatorExtension <em>Validator Extension</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValidatorTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValidatorTypeImpl extends EObjectImpl implements ValidatorType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached value of the '{@link #getDescription() <em>Description</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDescription()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList description;
-
-    /**
-	 * The cached value of the '{@link #getDisplayName() <em>Display Name</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getDisplayName()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList displayName;
-
-    /**
-	 * The cached value of the '{@link #getIcon() <em>Icon</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getIcon()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList icon;
-
-    /**
-	 * The cached value of the '{@link #getValidatorId() <em>Validator Id</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValidatorId()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValidatorIdType validatorId;
-
-    /**
-	 * The cached value of the '{@link #getValidatorClass() <em>Validator Class</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValidatorClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected ValidatorClassType validatorClass;
-
-    /**
-	 * The cached value of the '{@link #getAttribute() <em>Attribute</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttribute()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList attribute;
-
-    /**
-	 * The cached value of the '{@link #getProperty() <em>Property</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getProperty()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList property;
-
-    /**
-	 * The cached value of the '{@link #getValidatorExtension() <em>Validator Extension</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getValidatorExtension()
-	 * @generated
-	 * @ordered
-	 */
-    protected EList validatorExtension;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValidatorTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALIDATOR_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDescription() {
-		if (description == null) {
-			description = new EObjectContainmentEList(DescriptionType.class, this, FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION);
-		}
-		return description;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getDisplayName() {
-		if (displayName == null) {
-			displayName = new EObjectContainmentEList(DisplayNameType.class, this, FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME);
-		}
-		return displayName;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getIcon() {
-		if (icon == null) {
-			icon = new EObjectContainmentEList(IconType.class, this, FacesConfigPackage.VALIDATOR_TYPE__ICON);
-		}
-		return icon;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorIdType getValidatorId() {
-		return validatorId;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValidatorId 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValidatorId(ValidatorIdType newValidatorId, NotificationChain msgs) {
-		ValidatorIdType oldValidatorId = validatorId;
-		validatorId = newValidatorId;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID, oldValidatorId, newValidatorId);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValidatorId(ValidatorIdType newValidatorId) {
-		if (newValidatorId != validatorId) {
-			NotificationChain msgs = null;
-			if (validatorId != null)
-				msgs = ((InternalEObject)validatorId).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID, null, msgs);
-			if (newValidatorId != null)
-				msgs = ((InternalEObject)newValidatorId).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID, null, msgs);
-			msgs = basicSetValidatorId(newValidatorId, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID, newValidatorId, newValidatorId));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ValidatorClassType getValidatorClass() {
-		return validatorClass;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * @param newValidatorClass 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetValidatorClass(ValidatorClassType newValidatorClass, NotificationChain msgs) {
-		ValidatorClassType oldValidatorClass = validatorClass;
-		validatorClass = newValidatorClass;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, oldValidatorClass, newValidatorClass);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValidatorClass(ValidatorClassType newValidatorClass) {
-		if (newValidatorClass != validatorClass) {
-			NotificationChain msgs = null;
-			if (validatorClass != null)
-				msgs = ((InternalEObject)validatorClass).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, null, msgs);
-			if (newValidatorClass != null)
-				msgs = ((InternalEObject)newValidatorClass).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, null, msgs);
-			msgs = basicSetValidatorClass(newValidatorClass, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS, newValidatorClass, newValidatorClass));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getAttribute() {
-		if (attribute == null) {
-			attribute = new EObjectContainmentEList(AttributeType.class, this, FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE);
-		}
-		return attribute;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getProperty() {
-		if (property == null) {
-			property = new EObjectContainmentEList(PropertyType.class, this, FacesConfigPackage.VALIDATOR_TYPE__PROPERTY);
-		}
-		return property;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public EList getValidatorExtension() {
-		if (validatorExtension == null) {
-			validatorExtension = new EObjectContainmentEList(ValidatorExtensionType.class, this, FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION);
-		}
-		return validatorExtension;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALIDATOR_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-				return ((InternalEList)getDescription()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-				return ((InternalEList)getDisplayName()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-				return ((InternalEList)getIcon()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-				return basicSetValidatorId(null, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-				return basicSetValidatorClass(null, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-				return ((InternalEList)getAttribute()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-				return ((InternalEList)getProperty()).basicRemove(otherEnd, msgs);
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				return ((InternalEList)getValidatorExtension()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-				return getDescription();
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-				return getDisplayName();
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-				return getIcon();
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-				return getValidatorId();
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-				return getValidatorClass();
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-				return getAttribute();
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-				return getProperty();
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				return getValidatorExtension();
-			case FacesConfigPackage.VALIDATOR_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-				getDescription().clear();
-				getDescription().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				getDisplayName().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-				getIcon().clear();
-				getIcon().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-				setValidatorId((ValidatorIdType)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-				setValidatorClass((ValidatorClassType)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				getAttribute().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-				getProperty().clear();
-				getProperty().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				getValidatorExtension().clear();
-				getValidatorExtension().addAll((Collection)newValue);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-				getDescription().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-				getDisplayName().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-				getIcon().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-				setValidatorId((ValidatorIdType)null);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-				setValidatorClass((ValidatorClassType)null);
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-				getAttribute().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-				getProperty().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				getValidatorExtension().clear();
-				return;
-			case FacesConfigPackage.VALIDATOR_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALIDATOR_TYPE__DESCRIPTION:
-				return description != null && !description.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__DISPLAY_NAME:
-				return displayName != null && !displayName.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__ICON:
-				return icon != null && !icon.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_ID:
-				return validatorId != null;
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_CLASS:
-				return validatorClass != null;
-			case FacesConfigPackage.VALIDATOR_TYPE__ATTRIBUTE:
-				return attribute != null && !attribute.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__PROPERTY:
-				return property != null && !property.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__VALIDATOR_EXTENSION:
-				return validatorExtension != null && !validatorExtension.isEmpty();
-			case FacesConfigPackage.VALIDATOR_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValidatorTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueClassTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueClassTypeImpl.java
deleted file mode 100644
index 451f90a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueClassTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueClassType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Value Class Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueClassTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValueClassTypeImpl extends EObjectImpl implements ValueClassType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValueClassTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALUE_CLASS_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_CLASS_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_CLASS_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VALUE_CLASS_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValueClassTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueTypeImpl.java
deleted file mode 100644
index ebd907b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ValueTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ValueType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Value Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ValueTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ValueTypeImpl extends EObjectImpl implements ValueType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ValueTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VALUE_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VALUE_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VALUE_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VALUE_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VALUE_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VALUE_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VALUE_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ValueTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VarTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VarTypeImpl.java
deleted file mode 100644
index fe14763..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VarTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VarType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Var Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VarTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class VarTypeImpl extends EObjectImpl implements VarType {
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-    protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-    protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected VarTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VAR_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VAR_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VAR_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VAR_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VAR_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VAR_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VAR_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VAR_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-    public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //VarTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VariableResolverTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VariableResolverTypeImpl.java
deleted file mode 100644
index 80ce3c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VariableResolverTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Variable Resolver Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VariableResolverTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class VariableResolverTypeImpl extends EObjectImpl implements VariableResolverType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VariableResolverTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VARIABLE_RESOLVER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //VariableResolverTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewDeclarationLanguageFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewDeclarationLanguageFactoryTypeImpl.java
deleted file mode 100644
index 561c7fc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewDeclarationLanguageFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>View Declaration Language Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewDeclarationLanguageFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ViewDeclarationLanguageFactoryTypeImpl extends EObjectImpl implements ViewDeclarationLanguageFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ViewDeclarationLanguageFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ViewDeclarationLanguageFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewHandlerTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewHandlerTypeImpl.java
deleted file mode 100644
index e6f1163..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/ViewHandlerTypeImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType;
-
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>View Handler Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.ViewHandlerTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ViewHandlerTypeImpl extends EObjectImpl implements ViewHandlerType {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-    /**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-    /**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ViewHandlerTypeImpl() {
-		super();
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VIEW_HANDLER_TYPE;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VIEW_HANDLER_TYPE__ID, oldId, id));
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-     * <!-- end-user-doc -->
-	 * @generated
-	 */
-    public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VIEW_HANDLER_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ViewHandlerTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VisitContextFactoryTypeImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VisitContextFactoryTypeImpl.java
deleted file mode 100644
index db7a358..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/VisitContextFactoryTypeImpl.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Visit Context Factory Type</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl#getTextContent <em>Text Content</em>}</li>
- *   <li>{@link org.eclipse.jst.jsf.facesconfig.emf.impl.VisitContextFactoryTypeImpl#getId <em>Id</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class VisitContextFactoryTypeImpl extends EObjectImpl implements VisitContextFactoryType {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEXT_CONTENT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTextContent() <em>Text Content</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTextContent()
-	 * @generated
-	 * @ordered
-	 */
-	protected String textContent = TEXT_CONTENT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected VisitContextFactoryTypeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return FacesConfigPackage.Literals.VISIT_CONTEXT_FACTORY_TYPE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getTextContent() {
-		return textContent;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTextContent(String newTextContent) {
-		String oldTextContent = textContent;
-		textContent = newTextContent;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT, oldTextContent, textContent));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return getTextContent();
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID:
-				return getId();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent((String)newValue);
-				return;
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID:
-				setId((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				setTextContent(TEXT_CONTENT_EDEFAULT);
-				return;
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID:
-				setId(ID_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__TEXT_CONTENT:
-				return TEXT_CONTENT_EDEFAULT == null ? textContent != null : !TEXT_CONTENT_EDEFAULT.equals(textContent);
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (textContent: "); //$NON-NLS-1$
-		result.append(textContent);
-		result.append(", id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //VisitContextFactoryTypeImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/package-info.java
deleted file mode 100644
index 13588b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/impl/package-info.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * EMF model implementations for JSF application configuration files (deprecated). 
- * <p>
- * Deprecated - should use interfaces in the org.eclipse.jst.jsf.facesconfig.emf package   
- * This package will be removed from the MANIFEST.MF as public API in a future release.
- */
-package org.eclipse.jst.jsf.facesconfig.emf.impl;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/package-info.java
deleted file mode 100644
index b56d56a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * EMF model for JSF application configuration files. 
- */
-package org.eclipse.jst.jsf.facesconfig.emf;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigAdapterFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigAdapterFactory.java
deleted file mode 100644
index 93d83a0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigAdapterFactory.java
+++ /dev/null
@@ -1,2204 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage
- * @generated
- */
-public class FacesConfigAdapterFactory extends AdapterFactoryImpl {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static FacesConfigPackage modelPackage;
-
-    /**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = FacesConfigPackage.eINSTANCE;
-		}
-	}
-
-    /**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-    /**
-	 * The switch that delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected FacesConfigSwitch modelSwitch =
-        new FacesConfigSwitch() {
-			public Object caseAbsoluteOrderingType(AbsoluteOrderingType object) {
-				return createAbsoluteOrderingTypeAdapter();
-			}
-			public Object caseActionListenerType(ActionListenerType object) {
-				return createActionListenerTypeAdapter();
-			}
-			public Object caseApplicationFactoryType(ApplicationFactoryType object) {
-				return createApplicationFactoryTypeAdapter();
-			}
-			public Object caseApplicationType(ApplicationType object) {
-				return createApplicationTypeAdapter();
-			}
-			public Object caseApplicationExtensionType(ApplicationExtensionType object) {
-				return createApplicationExtensionTypeAdapter();
-			}
-			public Object caseAttributeClassType(AttributeClassType object) {
-				return createAttributeClassTypeAdapter();
-			}
-			public Object caseAttributeExtensionType(AttributeExtensionType object) {
-				return createAttributeExtensionTypeAdapter();
-			}
-			public Object caseAttributeNameType(AttributeNameType object) {
-				return createAttributeNameTypeAdapter();
-			}
-			public Object caseAttributeType(AttributeType object) {
-				return createAttributeTypeAdapter();
-			}
-			public Object caseBehaviorClassType(BehaviorClassType object) {
-				return createBehaviorClassTypeAdapter();
-			}
-			public Object caseBehaviorIdType(BehaviorIdType object) {
-				return createBehaviorIdTypeAdapter();
-			}
-			public Object caseBehaviorType(BehaviorType object) {
-				return createBehaviorTypeAdapter();
-			}
-			public Object caseBehaviorExtensionType(BehaviorExtensionType object) {
-				return createBehaviorExtensionTypeAdapter();
-			}
-			public Object caseClientBehaviorRendererClassType(ClientBehaviorRendererClassType object) {
-				return createClientBehaviorRendererClassTypeAdapter();
-			}
-			public Object caseClientBehaviorRendererType(ClientBehaviorRendererType object) {
-				return createClientBehaviorRendererTypeAdapter();
-			}
-			public Object caseClientBehaviorRendererTypeType(ClientBehaviorRendererTypeType object) {
-				return createClientBehaviorRendererTypeTypeAdapter();
-			}
-			public Object caseComponentClassType(ComponentClassType object) {
-				return createComponentClassTypeAdapter();
-			}
-			public Object caseComponentExtensionType(ComponentExtensionType object) {
-				return createComponentExtensionTypeAdapter();
-			}
-			public Object caseComponentFamilyType(ComponentFamilyType object) {
-				return createComponentFamilyTypeAdapter();
-			}
-			public Object caseComponentType(ComponentType object) {
-				return createComponentTypeAdapter();
-			}
-			public Object caseComponentTypeType(ComponentTypeType object) {
-				return createComponentTypeTypeAdapter();
-			}
-			public Object caseConverterClassType(ConverterClassType object) {
-				return createConverterClassTypeAdapter();
-			}
-			public Object caseConverterForClassType(ConverterForClassType object) {
-				return createConverterForClassTypeAdapter();
-			}
-			public Object caseConverterIdType(ConverterIdType object) {
-				return createConverterIdTypeAdapter();
-			}
-			public Object caseConverterType(ConverterType object) {
-				return createConverterTypeAdapter();
-			}
-			public Object caseConverterExtensionType(ConverterExtensionType object) {
-				return createConverterExtensionTypeAdapter();
-			}
-			public Object caseDefaultLocaleType(DefaultLocaleType object) {
-				return createDefaultLocaleTypeAdapter();
-			}
-			public Object caseDefaultRenderKitIdType(DefaultRenderKitIdType object) {
-				return createDefaultRenderKitIdTypeAdapter();
-			}
-			public Object caseDefaultValidatorsType(DefaultValidatorsType object) {
-				return createDefaultValidatorsTypeAdapter();
-			}
-			public Object caseDefaultValueType(DefaultValueType object) {
-				return createDefaultValueTypeAdapter();
-			}
-			public Object caseDescriptionType(DescriptionType object) {
-				return createDescriptionTypeAdapter();
-			}
-			public Object caseDisplayNameType(DisplayNameType object) {
-				return createDisplayNameTypeAdapter();
-			}
-			public Object caseDocumentRoot(DocumentRoot object) {
-				return createDocumentRootAdapter();
-			}
-			public Object caseDynamicAttribute(DynamicAttribute object) {
-				return createDynamicAttributeAdapter();
-			}
-			public Object caseDynamicElement(DynamicElement object) {
-				return createDynamicElementAdapter();
-			}
-			public Object caseELResolverType(ELResolverType object) {
-				return createELResolverTypeAdapter();
-			}
-			public Object caseExceptionHandlerFactoryType(ExceptionHandlerFactoryType object) {
-				return createExceptionHandlerFactoryTypeAdapter();
-			}
-			public Object caseExtensionType(ExtensionType object) {
-				return createExtensionTypeAdapter();
-			}
-			public Object caseExternalContextFactoryType(ExternalContextFactoryType object) {
-				return createExternalContextFactoryTypeAdapter();
-			}
-			public Object caseFacesConfigType(FacesConfigType object) {
-				return createFacesConfigTypeAdapter();
-			}
-			public Object caseFacesConfigExtensionType(FacesConfigExtensionType object) {
-				return createFacesConfigExtensionTypeAdapter();
-			}
-			public Object caseFacesContextFactoryType(FacesContextFactoryType object) {
-				return createFacesContextFactoryTypeAdapter();
-			}
-			public Object caseFacetExtensionType(FacetExtensionType object) {
-				return createFacetExtensionTypeAdapter();
-			}
-			public Object caseFacetNameType(FacetNameType object) {
-				return createFacetNameTypeAdapter();
-			}
-			public Object caseFacetType(FacetType object) {
-				return createFacetTypeAdapter();
-			}
-			public Object caseFactoryType(FactoryType object) {
-				return createFactoryTypeAdapter();
-			}
-			public Object caseFactoryExtensionType(FactoryExtensionType object) {
-				return createFactoryExtensionTypeAdapter();
-			}
-			public Object caseFromActionType(FromActionType object) {
-				return createFromActionTypeAdapter();
-			}
-			public Object caseFromOutcomeType(FromOutcomeType object) {
-				return createFromOutcomeTypeAdapter();
-			}
-			public Object caseFromViewIdType(FromViewIdType object) {
-				return createFromViewIdTypeAdapter();
-			}
-			public Object caseIconType(IconType object) {
-				return createIconTypeAdapter();
-			}
-			public Object caseIfType(IfType object) {
-				return createIfTypeAdapter();
-			}
-			public Object caseKeyClassType(KeyClassType object) {
-				return createKeyClassTypeAdapter();
-			}
-			public Object caseKeyType(KeyType object) {
-				return createKeyTypeAdapter();
-			}
-			public Object caseLargeIconType(LargeIconType object) {
-				return createLargeIconTypeAdapter();
-			}
-			public Object caseLifecycleFactoryType(LifecycleFactoryType object) {
-				return createLifecycleFactoryTypeAdapter();
-			}
-			public Object caseLifecycleType(LifecycleType object) {
-				return createLifecycleTypeAdapter();
-			}
-			public Object caseLifecycleExtensionType(LifecycleExtensionType object) {
-				return createLifecycleExtensionTypeAdapter();
-			}
-			public Object caseListEntriesType(ListEntriesType object) {
-				return createListEntriesTypeAdapter();
-			}
-			public Object caseLocaleConfigType(LocaleConfigType object) {
-				return createLocaleConfigTypeAdapter();
-			}
-			public Object caseManagedBeanClassType(ManagedBeanClassType object) {
-				return createManagedBeanClassTypeAdapter();
-			}
-			public Object caseManagedBeanNameType(ManagedBeanNameType object) {
-				return createManagedBeanNameTypeAdapter();
-			}
-			public Object caseManagedBeanScopeType(ManagedBeanScopeType object) {
-				return createManagedBeanScopeTypeAdapter();
-			}
-			public Object caseManagedBeanType(ManagedBeanType object) {
-				return createManagedBeanTypeAdapter();
-			}
-			public Object caseManagedBeanExtensionType(ManagedBeanExtensionType object) {
-				return createManagedBeanExtensionTypeAdapter();
-			}
-			public Object caseManagedPropertyType(ManagedPropertyType object) {
-				return createManagedPropertyTypeAdapter();
-			}
-			public Object caseMapEntriesType(MapEntriesType object) {
-				return createMapEntriesTypeAdapter();
-			}
-			public Object caseMapEntryType(MapEntryType object) {
-				return createMapEntryTypeAdapter();
-			}
-			public Object caseMessageBundleType(MessageBundleType object) {
-				return createMessageBundleTypeAdapter();
-			}
-			public Object caseNameType(NameType object) {
-				return createNameTypeAdapter();
-			}
-			public Object caseNavigationCaseType(NavigationCaseType object) {
-				return createNavigationCaseTypeAdapter();
-			}
-			public Object caseNavigationHandlerType(NavigationHandlerType object) {
-				return createNavigationHandlerTypeAdapter();
-			}
-			public Object caseNavigationRuleType(NavigationRuleType object) {
-				return createNavigationRuleTypeAdapter();
-			}
-			public Object caseNavigationRuleExtensionType(NavigationRuleExtensionType object) {
-				return createNavigationRuleExtensionTypeAdapter();
-			}
-			public Object caseNullValueType(NullValueType object) {
-				return createNullValueTypeAdapter();
-			}
-			public Object caseOrderingType(OrderingType object) {
-				return createOrderingTypeAdapter();
-			}
-			public Object caseOrderingOrderingType(OrderingOrderingType object) {
-				return createOrderingOrderingTypeAdapter();
-			}
-			public Object caseOrderingOthersType(OrderingOthersType object) {
-				return createOrderingOthersTypeAdapter();
-			}
-			public Object casePartialViewContextFactoryType(PartialViewContextFactoryType object) {
-				return createPartialViewContextFactoryTypeAdapter();
-			}
-			public Object casePhaseListenerType(PhaseListenerType object) {
-				return createPhaseListenerTypeAdapter();
-			}
-			public Object casePropertyClassType(PropertyClassType object) {
-				return createPropertyClassTypeAdapter();
-			}
-			public Object casePropertyExtensionType(PropertyExtensionType object) {
-				return createPropertyExtensionTypeAdapter();
-			}
-			public Object casePropertyNameType(PropertyNameType object) {
-				return createPropertyNameTypeAdapter();
-			}
-			public Object casePropertyResolverType(PropertyResolverType object) {
-				return createPropertyResolverTypeAdapter();
-			}
-			public Object casePropertyType(PropertyType object) {
-				return createPropertyTypeAdapter();
-			}
-			public Object caseRedirectType(RedirectType object) {
-				return createRedirectTypeAdapter();
-			}
-			public Object caseRedirectViewParamType(RedirectViewParamType object) {
-				return createRedirectViewParamTypeAdapter();
-			}
-			public Object caseReferencedBeanClassType(ReferencedBeanClassType object) {
-				return createReferencedBeanClassTypeAdapter();
-			}
-			public Object caseReferencedBeanNameType(ReferencedBeanNameType object) {
-				return createReferencedBeanNameTypeAdapter();
-			}
-			public Object caseReferencedBeanType(ReferencedBeanType object) {
-				return createReferencedBeanTypeAdapter();
-			}
-			public Object caseRendererClassType(RendererClassType object) {
-				return createRendererClassTypeAdapter();
-			}
-			public Object caseRendererExtensionType(RendererExtensionType object) {
-				return createRendererExtensionTypeAdapter();
-			}
-			public Object caseRendererType(RendererType object) {
-				return createRendererTypeAdapter();
-			}
-			public Object caseRendererTypeType(RendererTypeType object) {
-				return createRendererTypeTypeAdapter();
-			}
-			public Object caseRenderKitClassType(RenderKitClassType object) {
-				return createRenderKitClassTypeAdapter();
-			}
-			public Object caseRenderKitFactoryType(RenderKitFactoryType object) {
-				return createRenderKitFactoryTypeAdapter();
-			}
-			public Object caseRenderKitIdType(RenderKitIdType object) {
-				return createRenderKitIdTypeAdapter();
-			}
-			public Object caseRenderKitType(RenderKitType object) {
-				return createRenderKitTypeAdapter();
-			}
-			public Object caseRenderKitExtensionType(RenderKitExtensionType object) {
-				return createRenderKitExtensionTypeAdapter();
-			}
-			public Object caseResourceHandlerType(ResourceHandlerType object) {
-				return createResourceHandlerTypeAdapter();
-			}
-			public Object caseSmallIconType(SmallIconType object) {
-				return createSmallIconTypeAdapter();
-			}
-			public Object caseSourceClassType(SourceClassType object) {
-				return createSourceClassTypeAdapter();
-			}
-			public Object caseStateManagerType(StateManagerType object) {
-				return createStateManagerTypeAdapter();
-			}
-			public Object caseSuggestedValueType(SuggestedValueType object) {
-				return createSuggestedValueTypeAdapter();
-			}
-			public Object caseSupportedLocaleType(SupportedLocaleType object) {
-				return createSupportedLocaleTypeAdapter();
-			}
-			public Object caseSystemEventClassType(SystemEventClassType object) {
-				return createSystemEventClassTypeAdapter();
-			}
-			public Object caseSystemEventListenerClassType(SystemEventListenerClassType object) {
-				return createSystemEventListenerClassTypeAdapter();
-			}
-			public Object caseSystemEventListenerType(SystemEventListenerType object) {
-				return createSystemEventListenerTypeAdapter();
-			}
-			public Object caseTagHandlerDelegateFactoryType(TagHandlerDelegateFactoryType object) {
-				return createTagHandlerDelegateFactoryTypeAdapter();
-			}
-			public Object caseToViewIdType(ToViewIdType object) {
-				return createToViewIdTypeAdapter();
-			}
-			public Object caseValidatorClassType(ValidatorClassType object) {
-				return createValidatorClassTypeAdapter();
-			}
-			public Object caseValidatorIdType(ValidatorIdType object) {
-				return createValidatorIdTypeAdapter();
-			}
-			public Object caseValidatorType(ValidatorType object) {
-				return createValidatorTypeAdapter();
-			}
-			public Object caseValidatorExtensionType(ValidatorExtensionType object) {
-				return createValidatorExtensionTypeAdapter();
-			}
-			public Object caseValueClassType(ValueClassType object) {
-				return createValueClassTypeAdapter();
-			}
-			public Object caseValueType(ValueType object) {
-				return createValueTypeAdapter();
-			}
-			public Object caseVariableResolverType(VariableResolverType object) {
-				return createVariableResolverTypeAdapter();
-			}
-			public Object caseViewHandlerType(ViewHandlerType object) {
-				return createViewHandlerTypeAdapter();
-			}
-			public Object caseResourceBundleType(ResourceBundleType object) {
-				return createResourceBundleTypeAdapter();
-			}
-			public Object caseBaseNameType(BaseNameType object) {
-				return createBaseNameTypeAdapter();
-			}
-			public Object caseVarType(VarType object) {
-				return createVarTypeAdapter();
-			}
-			public Object caseViewDeclarationLanguageFactoryType(ViewDeclarationLanguageFactoryType object) {
-				return createViewDeclarationLanguageFactoryTypeAdapter();
-			}
-			public Object caseVisitContextFactoryType(VisitContextFactoryType object) {
-				return createVisitContextFactoryTypeAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-    /**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType <em>Absolute Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AbsoluteOrderingType
-	 * @generated
-	 */
-	public Adapter createAbsoluteOrderingTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType <em>Action Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ActionListenerType
-	 * @generated
-	 */
-	public Adapter createActionListenerTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType <em>Application Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationFactoryType
-	 * @generated
-	 */
-	public Adapter createApplicationFactoryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationType <em>Application Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationType
-	 * @generated
-	 */
-	public Adapter createApplicationTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType <em>Attribute Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeClassType
-	 * @generated
-	 */
-	public Adapter createAttributeClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType <em>Attribute Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeExtensionType
-	 * @generated
-	 */
-	public Adapter createAttributeExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType <em>Attribute Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeNameType
-	 * @generated
-	 */
-	public Adapter createAttributeNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.AttributeType <em>Attribute Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.AttributeType
-	 * @generated
-	 */
-	public Adapter createAttributeTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType <em>Behavior Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorClassType
-	 * @generated
-	 */
-	public Adapter createBehaviorClassTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType <em>Behavior Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorIdType
-	 * @generated
-	 */
-	public Adapter createBehaviorIdTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorType <em>Behavior Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorType
-	 * @generated
-	 */
-	public Adapter createBehaviorTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType <em>Behavior Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BehaviorExtensionType
-	 * @generated
-	 */
-	public Adapter createBehaviorExtensionTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType <em>Client Behavior Renderer Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererClassType
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererClassTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType <em>Client Behavior Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererType
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType <em>Client Behavior Renderer Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ClientBehaviorRendererTypeType
-	 * @generated
-	 */
-	public Adapter createClientBehaviorRendererTypeTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType <em>Component Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType
-	 * @generated
-	 */
-	public Adapter createComponentClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType <em>Component Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentExtensionType
-	 * @generated
-	 */
-	public Adapter createComponentExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType <em>Component Family Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentFamilyType
-	 * @generated
-	 */
-	public Adapter createComponentFamilyTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentType <em>Component Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentType
-	 * @generated
-	 */
-	public Adapter createComponentTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType <em>Component Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType
-	 * @generated
-	 */
-	public Adapter createComponentTypeTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType <em>Converter Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterClassType
-	 * @generated
-	 */
-	public Adapter createConverterClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType <em>Converter For Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterForClassType
-	 * @generated
-	 */
-	public Adapter createConverterForClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType <em>Converter Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType
-	 * @generated
-	 */
-	public Adapter createConverterIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterType <em>Converter Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterType
-	 * @generated
-	 */
-	public Adapter createConverterTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType <em>Default Locale Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultLocaleType
-	 * @generated
-	 */
-	public Adapter createDefaultLocaleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType <em>Default Render Kit Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultRenderKitIdType
-	 * @generated
-	 */
-	public Adapter createDefaultRenderKitIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType <em>Default Validators Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValidatorsType
-	 * @generated
-	 */
-	public Adapter createDefaultValidatorsTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType <em>Default Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DefaultValueType
-	 * @generated
-	 */
-	public Adapter createDefaultValueTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DescriptionType <em>Description Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DescriptionType
-	 * @generated
-	 */
-	public Adapter createDescriptionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType <em>Display Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType
-	 * @generated
-	 */
-	public Adapter createDisplayNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot <em>Document Root</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DocumentRoot
-	 * @generated
-	 */
-	public Adapter createDocumentRootAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute <em>Dynamic Attribute</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute
-	 * @generated
-	 */
-    public Adapter createDynamicAttributeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.DynamicElement <em>Dynamic Element</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.DynamicElement
-	 * @generated
-	 */
-    public Adapter createDynamicElementAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ELResolverType <em>EL Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ELResolverType
-	 * @generated
-	 */
-    public Adapter createELResolverTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType <em>Exception Handler Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExceptionHandlerFactoryType
-	 * @generated
-	 */
-	public Adapter createExceptionHandlerFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType
-	 * @generated
-	 */
-	public Adapter createFacesConfigTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType <em>Faces Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesContextFactoryType
-	 * @generated
-	 */
-	public Adapter createFacesContextFactoryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType <em>Facet Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetExtensionType
-	 * @generated
-	 */
-	public Adapter createFacetExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetNameType <em>Facet Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetNameType
-	 * @generated
-	 */
-	public Adapter createFacetNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacetType <em>Facet Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacetType
-	 * @generated
-	 */
-	public Adapter createFacetTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryType <em>Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryType
-	 * @generated
-	 */
-	public Adapter createFactoryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromActionType <em>From Action Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromActionType
-	 * @generated
-	 */
-	public Adapter createFromActionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType <em>From Outcome Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromOutcomeType
-	 * @generated
-	 */
-	public Adapter createFromOutcomeTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType <em>From View Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FromViewIdType
-	 * @generated
-	 */
-	public Adapter createFromViewIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.IconType <em>Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IconType
-	 * @generated
-	 */
-	public Adapter createIconTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.IfType <em>If Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.IfType
-	 * @generated
-	 */
-	public Adapter createIfTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyClassType <em>Key Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyClassType
-	 * @generated
-	 */
-	public Adapter createKeyClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.KeyType <em>Key Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.KeyType
-	 * @generated
-	 */
-	public Adapter createKeyTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LargeIconType <em>Large Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LargeIconType
-	 * @generated
-	 */
-	public Adapter createLargeIconTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType <em>Lifecycle Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleFactoryType
-	 * @generated
-	 */
-	public Adapter createLifecycleFactoryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleType <em>Lifecycle Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleType
-	 * @generated
-	 */
-	public Adapter createLifecycleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType <em>List Entries Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType
-	 * @generated
-	 */
-	public Adapter createListEntriesTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType <em>Locale Config Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LocaleConfigType
-	 * @generated
-	 */
-	public Adapter createLocaleConfigTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType <em>Managed Bean Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanClassType
-	 * @generated
-	 */
-	public Adapter createManagedBeanClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType <em>Managed Bean Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanNameType
-	 * @generated
-	 */
-	public Adapter createManagedBeanNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType <em>Managed Bean Scope Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanScopeType
-	 * @generated
-	 */
-	public Adapter createManagedBeanScopeTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType <em>Managed Bean Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType
-	 * @generated
-	 */
-	public Adapter createManagedBeanTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType <em>Managed Property Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType
-	 * @generated
-	 */
-	public Adapter createManagedPropertyTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType <em>Map Entries Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType
-	 * @generated
-	 */
-	public Adapter createMapEntriesTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.MapEntryType <em>Map Entry Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MapEntryType
-	 * @generated
-	 */
-	public Adapter createMapEntryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType <em>Message Bundle Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.MessageBundleType
-	 * @generated
-	 */
-	public Adapter createMessageBundleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NameType <em>Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NameType
-	 * @generated
-	 */
-	public Adapter createNameTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType <em>Navigation Case Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationCaseType
-	 * @generated
-	 */
-	public Adapter createNavigationCaseTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType <em>Navigation Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationHandlerType
-	 * @generated
-	 */
-	public Adapter createNavigationHandlerTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType <em>Navigation Rule Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleType
-	 * @generated
-	 */
-	public Adapter createNavigationRuleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NullValueType <em>Null Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NullValueType
-	 * @generated
-	 */
-	public Adapter createNullValueTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingType <em>Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingType
-	 * @generated
-	 */
-	public Adapter createOrderingTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType <em>Ordering Ordering Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOrderingType
-	 * @generated
-	 */
-	public Adapter createOrderingOrderingTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType <em>Ordering Others Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.OrderingOthersType
-	 * @generated
-	 */
-	public Adapter createOrderingOthersTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType <em>Partial View Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PartialViewContextFactoryType
-	 * @generated
-	 */
-	public Adapter createPartialViewContextFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType <em>Phase Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PhaseListenerType
-	 * @generated
-	 */
-	public Adapter createPhaseListenerTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType <em>Property Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyClassType
-	 * @generated
-	 */
-	public Adapter createPropertyClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType <em>Property Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyExtensionType
-	 * @generated
-	 */
-	public Adapter createPropertyExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType <em>Property Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyNameType
-	 * @generated
-	 */
-	public Adapter createPropertyNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType <em>Property Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyResolverType
-	 * @generated
-	 */
-	public Adapter createPropertyResolverTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.PropertyType <em>Property Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.PropertyType
-	 * @generated
-	 */
-	public Adapter createPropertyTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectType <em>Redirect Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectType
-	 * @generated
-	 */
-	public Adapter createRedirectTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType <em>Redirect View Param Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RedirectViewParamType
-	 * @generated
-	 */
-	public Adapter createRedirectViewParamTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType <em>Referenced Bean Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanClassType
-	 * @generated
-	 */
-	public Adapter createReferencedBeanClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType <em>Referenced Bean Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanNameType
-	 * @generated
-	 */
-	public Adapter createReferencedBeanNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType <em>Referenced Bean Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ReferencedBeanType
-	 * @generated
-	 */
-	public Adapter createReferencedBeanTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererClassType <em>Renderer Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererClassType
-	 * @generated
-	 */
-	public Adapter createRendererClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType <em>Renderer Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererExtensionType
-	 * @generated
-	 */
-	public Adapter createRendererExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererType <em>Renderer Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererType
-	 * @generated
-	 */
-	public Adapter createRendererTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType <em>Renderer Type Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RendererTypeType
-	 * @generated
-	 */
-	public Adapter createRendererTypeTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType <em>Render Kit Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitClassType
-	 * @generated
-	 */
-	public Adapter createRenderKitClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType <em>Render Kit Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitFactoryType
-	 * @generated
-	 */
-	public Adapter createRenderKitFactoryTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType <em>Render Kit Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitIdType
-	 * @generated
-	 */
-	public Adapter createRenderKitIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitType <em>Render Kit Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitType
-	 * @generated
-	 */
-	public Adapter createRenderKitTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SmallIconType <em>Small Icon Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SmallIconType
-	 * @generated
-	 */
-	public Adapter createSmallIconTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SourceClassType <em>Source Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SourceClassType
-	 * @generated
-	 */
-	public Adapter createSourceClassTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.StateManagerType <em>State Manager Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.StateManagerType
-	 * @generated
-	 */
-	public Adapter createStateManagerTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType <em>Suggested Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SuggestedValueType
-	 * @generated
-	 */
-	public Adapter createSuggestedValueTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType <em>Supported Locale Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SupportedLocaleType
-	 * @generated
-	 */
-	public Adapter createSupportedLocaleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType <em>System Event Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventClassType
-	 * @generated
-	 */
-	public Adapter createSystemEventClassTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType <em>System Event Listener Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerClassType
-	 * @generated
-	 */
-	public Adapter createSystemEventListenerClassTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType <em>System Event Listener Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.SystemEventListenerType
-	 * @generated
-	 */
-	public Adapter createSystemEventListenerTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType <em>Tag Handler Delegate Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.TagHandlerDelegateFactoryType
-	 * @generated
-	 */
-	public Adapter createTagHandlerDelegateFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType <em>To View Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ToViewIdType
-	 * @generated
-	 */
-	public Adapter createToViewIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType <em>Validator Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorClassType
-	 * @generated
-	 */
-	public Adapter createValidatorClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType <em>Validator Id Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType
-	 * @generated
-	 */
-	public Adapter createValidatorIdTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorType <em>Validator Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorType
-	 * @generated
-	 */
-	public Adapter createValidatorTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueClassType <em>Value Class Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueClassType
-	 * @generated
-	 */
-	public Adapter createValueClassTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValueType <em>Value Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValueType
-	 * @generated
-	 */
-	public Adapter createValueTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType <em>Variable Resolver Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VariableResolverType
-	 * @generated
-	 */
-	public Adapter createVariableResolverTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType <em>View Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewHandlerType
-	 * @generated
-	 */
-	public Adapter createViewHandlerTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType <em>Resource Bundle Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceBundleType
-	 * @generated
-	 */
-    public Adapter createResourceBundleTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.BaseNameType <em>Base Name Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.BaseNameType
-	 * @generated
-	 */
-    public Adapter createBaseNameTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.VarType <em>Var Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VarType
-	 * @generated
-	 */
-    public Adapter createVarTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType <em>View Declaration Language Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ViewDeclarationLanguageFactoryType
-	 * @generated
-	 */
-	public Adapter createViewDeclarationLanguageFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType <em>Visit Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.VisitContextFactoryType
-	 * @generated
-	 */
-	public Adapter createVisitContextFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType <em>Render Kit Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.RenderKitExtensionType
-	 * @generated
-	 */
-    public Adapter createRenderKitExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType <em>Resource Handler Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ResourceHandlerType
-	 * @generated
-	 */
-	public Adapter createResourceHandlerTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType <em>Navigation Rule Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.NavigationRuleExtensionType
-	 * @generated
-	 */
-    public Adapter createNavigationRuleExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType <em>Validator Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ValidatorExtensionType
-	 * @generated
-	 */
-    public Adapter createValidatorExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType <em>Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigExtensionType
-	 * @generated
-	 */
-    public Adapter createFacesConfigExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType <em>Factory Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.FactoryExtensionType
-	 * @generated
-	 */
-    public Adapter createFactoryExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType <em>Lifecycle Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.LifecycleExtensionType
-	 * @generated
-	 */
-    public Adapter createLifecycleExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType <em>Managed Bean Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanExtensionType
-	 * @generated
-	 */
-    public Adapter createManagedBeanExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType <em>Converter Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ConverterExtensionType
-	 * @generated
-	 */
-    public Adapter createConverterExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExtensionType <em>Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExtensionType
-	 * @generated
-	 */
-    public Adapter createExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType <em>External Context Factory Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ExternalContextFactoryType
-	 * @generated
-	 */
-	public Adapter createExternalContextFactoryTypeAdapter() {
-		return null;
-	}
-
-				/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType <em>Application Extension Type</em>}'.
-	 * <!-- begin-user-doc -->
-     * This default implementation returns null so that we can easily ignore cases;
-     * it's useful to ignore a case when inheritance will catch all the cases anyway.
-     * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.jsf.facesconfig.emf.ApplicationExtensionType
-	 * @generated
-	 */
-    public Adapter createApplicationExtensionTypeAdapter() {
-		return null;
-	}
-
-    /**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //FacesConfigAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigSwitch.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigSwitch.java
deleted file mode 100644
index 1b258f5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/FacesConfigSwitch.java
+++ /dev/null
@@ -1,2722 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.emf.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.*;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage
- * @generated
- */
-public class FacesConfigSwitch {
-    /**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2005, 2006 IBM Corporation and others"; //$NON-NLS-1$
-
-    /**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static FacesConfigPackage modelPackage;
-
-    /**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public FacesConfigSwitch() {
-		if (modelPackage == null) {
-			modelPackage = FacesConfigPackage.eINSTANCE;
-		}
-	}
-
-    /**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-    /**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated NOT
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-		List eSuperTypes = theEClass.getESuperTypes();
-		return
-			eSuperTypes.isEmpty() ?
-				defaultCase(theEObject) :
-				doSwitch((EClass)eSuperTypes.get(0), theEObject);
-	}
-
-    /**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case FacesConfigPackage.ABSOLUTE_ORDERING_TYPE: {
-				AbsoluteOrderingType absoluteOrderingType = (AbsoluteOrderingType)theEObject;
-				Object result = caseAbsoluteOrderingType(absoluteOrderingType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ACTION_LISTENER_TYPE: {
-				ActionListenerType actionListenerType = (ActionListenerType)theEObject;
-				Object result = caseActionListenerType(actionListenerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.APPLICATION_FACTORY_TYPE: {
-				ApplicationFactoryType applicationFactoryType = (ApplicationFactoryType)theEObject;
-				Object result = caseApplicationFactoryType(applicationFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.APPLICATION_TYPE: {
-				ApplicationType applicationType = (ApplicationType)theEObject;
-				Object result = caseApplicationType(applicationType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.APPLICATION_EXTENSION_TYPE: {
-				ApplicationExtensionType applicationExtensionType = (ApplicationExtensionType)theEObject;
-				Object result = caseApplicationExtensionType(applicationExtensionType);
-				if (result == null) result = caseExtensionType(applicationExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ATTRIBUTE_CLASS_TYPE: {
-				AttributeClassType attributeClassType = (AttributeClassType)theEObject;
-				Object result = caseAttributeClassType(attributeClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ATTRIBUTE_EXTENSION_TYPE: {
-				AttributeExtensionType attributeExtensionType = (AttributeExtensionType)theEObject;
-				Object result = caseAttributeExtensionType(attributeExtensionType);
-				if (result == null) result = caseExtensionType(attributeExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ATTRIBUTE_NAME_TYPE: {
-				AttributeNameType attributeNameType = (AttributeNameType)theEObject;
-				Object result = caseAttributeNameType(attributeNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ATTRIBUTE_TYPE: {
-				AttributeType attributeType = (AttributeType)theEObject;
-				Object result = caseAttributeType(attributeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.BEHAVIOR_CLASS_TYPE: {
-				BehaviorClassType behaviorClassType = (BehaviorClassType)theEObject;
-				Object result = caseBehaviorClassType(behaviorClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.BEHAVIOR_ID_TYPE: {
-				BehaviorIdType behaviorIdType = (BehaviorIdType)theEObject;
-				Object result = caseBehaviorIdType(behaviorIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.BEHAVIOR_TYPE: {
-				BehaviorType behaviorType = (BehaviorType)theEObject;
-				Object result = caseBehaviorType(behaviorType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.BEHAVIOR_EXTENSION_TYPE: {
-				BehaviorExtensionType behaviorExtensionType = (BehaviorExtensionType)theEObject;
-				Object result = caseBehaviorExtensionType(behaviorExtensionType);
-				if (result == null) result = caseExtensionType(behaviorExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_CLASS_TYPE: {
-				ClientBehaviorRendererClassType clientBehaviorRendererClassType = (ClientBehaviorRendererClassType)theEObject;
-				Object result = caseClientBehaviorRendererClassType(clientBehaviorRendererClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE: {
-				ClientBehaviorRendererType clientBehaviorRendererType = (ClientBehaviorRendererType)theEObject;
-				Object result = caseClientBehaviorRendererType(clientBehaviorRendererType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CLIENT_BEHAVIOR_RENDERER_TYPE_TYPE: {
-				ClientBehaviorRendererTypeType clientBehaviorRendererTypeType = (ClientBehaviorRendererTypeType)theEObject;
-				Object result = caseClientBehaviorRendererTypeType(clientBehaviorRendererTypeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.COMPONENT_CLASS_TYPE: {
-				ComponentClassType componentClassType = (ComponentClassType)theEObject;
-				Object result = caseComponentClassType(componentClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.COMPONENT_EXTENSION_TYPE: {
-				ComponentExtensionType componentExtensionType = (ComponentExtensionType)theEObject;
-				Object result = caseComponentExtensionType(componentExtensionType);
-				if (result == null) result = caseExtensionType(componentExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.COMPONENT_FAMILY_TYPE: {
-				ComponentFamilyType componentFamilyType = (ComponentFamilyType)theEObject;
-				Object result = caseComponentFamilyType(componentFamilyType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.COMPONENT_TYPE: {
-				ComponentType componentType = (ComponentType)theEObject;
-				Object result = caseComponentType(componentType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.COMPONENT_TYPE_TYPE: {
-				ComponentTypeType componentTypeType = (ComponentTypeType)theEObject;
-				Object result = caseComponentTypeType(componentTypeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CONVERTER_CLASS_TYPE: {
-				ConverterClassType converterClassType = (ConverterClassType)theEObject;
-				Object result = caseConverterClassType(converterClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CONVERTER_FOR_CLASS_TYPE: {
-				ConverterForClassType converterForClassType = (ConverterForClassType)theEObject;
-				Object result = caseConverterForClassType(converterForClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CONVERTER_ID_TYPE: {
-				ConverterIdType converterIdType = (ConverterIdType)theEObject;
-				Object result = caseConverterIdType(converterIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CONVERTER_TYPE: {
-				ConverterType converterType = (ConverterType)theEObject;
-				Object result = caseConverterType(converterType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.CONVERTER_EXTENSION_TYPE: {
-				ConverterExtensionType converterExtensionType = (ConverterExtensionType)theEObject;
-				Object result = caseConverterExtensionType(converterExtensionType);
-				if (result == null) result = caseExtensionType(converterExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DEFAULT_LOCALE_TYPE: {
-				DefaultLocaleType defaultLocaleType = (DefaultLocaleType)theEObject;
-				Object result = caseDefaultLocaleType(defaultLocaleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DEFAULT_RENDER_KIT_ID_TYPE: {
-				DefaultRenderKitIdType defaultRenderKitIdType = (DefaultRenderKitIdType)theEObject;
-				Object result = caseDefaultRenderKitIdType(defaultRenderKitIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DEFAULT_VALIDATORS_TYPE: {
-				DefaultValidatorsType defaultValidatorsType = (DefaultValidatorsType)theEObject;
-				Object result = caseDefaultValidatorsType(defaultValidatorsType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DEFAULT_VALUE_TYPE: {
-				DefaultValueType defaultValueType = (DefaultValueType)theEObject;
-				Object result = caseDefaultValueType(defaultValueType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DESCRIPTION_TYPE: {
-				DescriptionType descriptionType = (DescriptionType)theEObject;
-				Object result = caseDescriptionType(descriptionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DISPLAY_NAME_TYPE: {
-				DisplayNameType displayNameType = (DisplayNameType)theEObject;
-				Object result = caseDisplayNameType(displayNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DOCUMENT_ROOT: {
-				DocumentRoot documentRoot = (DocumentRoot)theEObject;
-				Object result = caseDocumentRoot(documentRoot);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DYNAMIC_ATTRIBUTE: {
-				DynamicAttribute dynamicAttribute = (DynamicAttribute)theEObject;
-				Object result = caseDynamicAttribute(dynamicAttribute);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.DYNAMIC_ELEMENT: {
-				DynamicElement dynamicElement = (DynamicElement)theEObject;
-				Object result = caseDynamicElement(dynamicElement);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.EL_RESOLVER_TYPE: {
-				ELResolverType elResolverType = (ELResolverType)theEObject;
-				Object result = caseELResolverType(elResolverType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.EXCEPTION_HANDLER_FACTORY_TYPE: {
-				ExceptionHandlerFactoryType exceptionHandlerFactoryType = (ExceptionHandlerFactoryType)theEObject;
-				Object result = caseExceptionHandlerFactoryType(exceptionHandlerFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.EXTENSION_TYPE: {
-				ExtensionType extensionType = (ExtensionType)theEObject;
-				Object result = caseExtensionType(extensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.EXTERNAL_CONTEXT_FACTORY_TYPE: {
-				ExternalContextFactoryType externalContextFactoryType = (ExternalContextFactoryType)theEObject;
-				Object result = caseExternalContextFactoryType(externalContextFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACES_CONFIG_TYPE: {
-				FacesConfigType facesConfigType = (FacesConfigType)theEObject;
-				Object result = caseFacesConfigType(facesConfigType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACES_CONFIG_EXTENSION_TYPE: {
-				FacesConfigExtensionType facesConfigExtensionType = (FacesConfigExtensionType)theEObject;
-				Object result = caseFacesConfigExtensionType(facesConfigExtensionType);
-				if (result == null) result = caseExtensionType(facesConfigExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACES_CONTEXT_FACTORY_TYPE: {
-				FacesContextFactoryType facesContextFactoryType = (FacesContextFactoryType)theEObject;
-				Object result = caseFacesContextFactoryType(facesContextFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACET_EXTENSION_TYPE: {
-				FacetExtensionType facetExtensionType = (FacetExtensionType)theEObject;
-				Object result = caseFacetExtensionType(facetExtensionType);
-				if (result == null) result = caseExtensionType(facetExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACET_NAME_TYPE: {
-				FacetNameType facetNameType = (FacetNameType)theEObject;
-				Object result = caseFacetNameType(facetNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACET_TYPE: {
-				FacetType facetType = (FacetType)theEObject;
-				Object result = caseFacetType(facetType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACTORY_TYPE: {
-				FactoryType factoryType = (FactoryType)theEObject;
-				Object result = caseFactoryType(factoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FACTORY_EXTENSION_TYPE: {
-				FactoryExtensionType factoryExtensionType = (FactoryExtensionType)theEObject;
-				Object result = caseFactoryExtensionType(factoryExtensionType);
-				if (result == null) result = caseExtensionType(factoryExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FROM_ACTION_TYPE: {
-				FromActionType fromActionType = (FromActionType)theEObject;
-				Object result = caseFromActionType(fromActionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FROM_OUTCOME_TYPE: {
-				FromOutcomeType fromOutcomeType = (FromOutcomeType)theEObject;
-				Object result = caseFromOutcomeType(fromOutcomeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.FROM_VIEW_ID_TYPE: {
-				FromViewIdType fromViewIdType = (FromViewIdType)theEObject;
-				Object result = caseFromViewIdType(fromViewIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ICON_TYPE: {
-				IconType iconType = (IconType)theEObject;
-				Object result = caseIconType(iconType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.IF_TYPE: {
-				IfType ifType = (IfType)theEObject;
-				Object result = caseIfType(ifType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.KEY_CLASS_TYPE: {
-				KeyClassType keyClassType = (KeyClassType)theEObject;
-				Object result = caseKeyClassType(keyClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.KEY_TYPE: {
-				KeyType keyType = (KeyType)theEObject;
-				Object result = caseKeyType(keyType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LARGE_ICON_TYPE: {
-				LargeIconType largeIconType = (LargeIconType)theEObject;
-				Object result = caseLargeIconType(largeIconType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LIFECYCLE_FACTORY_TYPE: {
-				LifecycleFactoryType lifecycleFactoryType = (LifecycleFactoryType)theEObject;
-				Object result = caseLifecycleFactoryType(lifecycleFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LIFECYCLE_TYPE: {
-				LifecycleType lifecycleType = (LifecycleType)theEObject;
-				Object result = caseLifecycleType(lifecycleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LIFECYCLE_EXTENSION_TYPE: {
-				LifecycleExtensionType lifecycleExtensionType = (LifecycleExtensionType)theEObject;
-				Object result = caseLifecycleExtensionType(lifecycleExtensionType);
-				if (result == null) result = caseExtensionType(lifecycleExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LIST_ENTRIES_TYPE: {
-				ListEntriesType listEntriesType = (ListEntriesType)theEObject;
-				Object result = caseListEntriesType(listEntriesType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.LOCALE_CONFIG_TYPE: {
-				LocaleConfigType localeConfigType = (LocaleConfigType)theEObject;
-				Object result = caseLocaleConfigType(localeConfigType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_BEAN_CLASS_TYPE: {
-				ManagedBeanClassType managedBeanClassType = (ManagedBeanClassType)theEObject;
-				Object result = caseManagedBeanClassType(managedBeanClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_BEAN_NAME_TYPE: {
-				ManagedBeanNameType managedBeanNameType = (ManagedBeanNameType)theEObject;
-				Object result = caseManagedBeanNameType(managedBeanNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_BEAN_SCOPE_TYPE: {
-				ManagedBeanScopeType managedBeanScopeType = (ManagedBeanScopeType)theEObject;
-				Object result = caseManagedBeanScopeType(managedBeanScopeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_BEAN_TYPE: {
-				ManagedBeanType managedBeanType = (ManagedBeanType)theEObject;
-				Object result = caseManagedBeanType(managedBeanType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_BEAN_EXTENSION_TYPE: {
-				ManagedBeanExtensionType managedBeanExtensionType = (ManagedBeanExtensionType)theEObject;
-				Object result = caseManagedBeanExtensionType(managedBeanExtensionType);
-				if (result == null) result = caseExtensionType(managedBeanExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MANAGED_PROPERTY_TYPE: {
-				ManagedPropertyType managedPropertyType = (ManagedPropertyType)theEObject;
-				Object result = caseManagedPropertyType(managedPropertyType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MAP_ENTRIES_TYPE: {
-				MapEntriesType mapEntriesType = (MapEntriesType)theEObject;
-				Object result = caseMapEntriesType(mapEntriesType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MAP_ENTRY_TYPE: {
-				MapEntryType mapEntryType = (MapEntryType)theEObject;
-				Object result = caseMapEntryType(mapEntryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.MESSAGE_BUNDLE_TYPE: {
-				MessageBundleType messageBundleType = (MessageBundleType)theEObject;
-				Object result = caseMessageBundleType(messageBundleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NAME_TYPE: {
-				NameType nameType = (NameType)theEObject;
-				Object result = caseNameType(nameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NAVIGATION_CASE_TYPE: {
-				NavigationCaseType navigationCaseType = (NavigationCaseType)theEObject;
-				Object result = caseNavigationCaseType(navigationCaseType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NAVIGATION_HANDLER_TYPE: {
-				NavigationHandlerType navigationHandlerType = (NavigationHandlerType)theEObject;
-				Object result = caseNavigationHandlerType(navigationHandlerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NAVIGATION_RULE_TYPE: {
-				NavigationRuleType navigationRuleType = (NavigationRuleType)theEObject;
-				Object result = caseNavigationRuleType(navigationRuleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NAVIGATION_RULE_EXTENSION_TYPE: {
-				NavigationRuleExtensionType navigationRuleExtensionType = (NavigationRuleExtensionType)theEObject;
-				Object result = caseNavigationRuleExtensionType(navigationRuleExtensionType);
-				if (result == null) result = caseExtensionType(navigationRuleExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.NULL_VALUE_TYPE: {
-				NullValueType nullValueType = (NullValueType)theEObject;
-				Object result = caseNullValueType(nullValueType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ORDERING_TYPE: {
-				OrderingType orderingType = (OrderingType)theEObject;
-				Object result = caseOrderingType(orderingType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ORDERING_ORDERING_TYPE: {
-				OrderingOrderingType orderingOrderingType = (OrderingOrderingType)theEObject;
-				Object result = caseOrderingOrderingType(orderingOrderingType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.ORDERING_OTHERS_TYPE: {
-				OrderingOthersType orderingOthersType = (OrderingOthersType)theEObject;
-				Object result = caseOrderingOthersType(orderingOthersType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PARTIAL_VIEW_CONTEXT_FACTORY_TYPE: {
-				PartialViewContextFactoryType partialViewContextFactoryType = (PartialViewContextFactoryType)theEObject;
-				Object result = casePartialViewContextFactoryType(partialViewContextFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PHASE_LISTENER_TYPE: {
-				PhaseListenerType phaseListenerType = (PhaseListenerType)theEObject;
-				Object result = casePhaseListenerType(phaseListenerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PROPERTY_CLASS_TYPE: {
-				PropertyClassType propertyClassType = (PropertyClassType)theEObject;
-				Object result = casePropertyClassType(propertyClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PROPERTY_EXTENSION_TYPE: {
-				PropertyExtensionType propertyExtensionType = (PropertyExtensionType)theEObject;
-				Object result = casePropertyExtensionType(propertyExtensionType);
-				if (result == null) result = caseExtensionType(propertyExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PROPERTY_NAME_TYPE: {
-				PropertyNameType propertyNameType = (PropertyNameType)theEObject;
-				Object result = casePropertyNameType(propertyNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PROPERTY_RESOLVER_TYPE: {
-				PropertyResolverType propertyResolverType = (PropertyResolverType)theEObject;
-				Object result = casePropertyResolverType(propertyResolverType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.PROPERTY_TYPE: {
-				PropertyType propertyType = (PropertyType)theEObject;
-				Object result = casePropertyType(propertyType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.REDIRECT_TYPE: {
-				RedirectType redirectType = (RedirectType)theEObject;
-				Object result = caseRedirectType(redirectType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.REDIRECT_VIEW_PARAM_TYPE: {
-				RedirectViewParamType redirectViewParamType = (RedirectViewParamType)theEObject;
-				Object result = caseRedirectViewParamType(redirectViewParamType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.REFERENCED_BEAN_CLASS_TYPE: {
-				ReferencedBeanClassType referencedBeanClassType = (ReferencedBeanClassType)theEObject;
-				Object result = caseReferencedBeanClassType(referencedBeanClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.REFERENCED_BEAN_NAME_TYPE: {
-				ReferencedBeanNameType referencedBeanNameType = (ReferencedBeanNameType)theEObject;
-				Object result = caseReferencedBeanNameType(referencedBeanNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.REFERENCED_BEAN_TYPE: {
-				ReferencedBeanType referencedBeanType = (ReferencedBeanType)theEObject;
-				Object result = caseReferencedBeanType(referencedBeanType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDERER_CLASS_TYPE: {
-				RendererClassType rendererClassType = (RendererClassType)theEObject;
-				Object result = caseRendererClassType(rendererClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDERER_EXTENSION_TYPE: {
-				RendererExtensionType rendererExtensionType = (RendererExtensionType)theEObject;
-				Object result = caseRendererExtensionType(rendererExtensionType);
-				if (result == null) result = caseExtensionType(rendererExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDERER_TYPE: {
-				RendererType rendererType = (RendererType)theEObject;
-				Object result = caseRendererType(rendererType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDERER_TYPE_TYPE: {
-				RendererTypeType rendererTypeType = (RendererTypeType)theEObject;
-				Object result = caseRendererTypeType(rendererTypeType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDER_KIT_CLASS_TYPE: {
-				RenderKitClassType renderKitClassType = (RenderKitClassType)theEObject;
-				Object result = caseRenderKitClassType(renderKitClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDER_KIT_FACTORY_TYPE: {
-				RenderKitFactoryType renderKitFactoryType = (RenderKitFactoryType)theEObject;
-				Object result = caseRenderKitFactoryType(renderKitFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDER_KIT_ID_TYPE: {
-				RenderKitIdType renderKitIdType = (RenderKitIdType)theEObject;
-				Object result = caseRenderKitIdType(renderKitIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDER_KIT_TYPE: {
-				RenderKitType renderKitType = (RenderKitType)theEObject;
-				Object result = caseRenderKitType(renderKitType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RENDER_KIT_EXTENSION_TYPE: {
-				RenderKitExtensionType renderKitExtensionType = (RenderKitExtensionType)theEObject;
-				Object result = caseRenderKitExtensionType(renderKitExtensionType);
-				if (result == null) result = caseExtensionType(renderKitExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RESOURCE_HANDLER_TYPE: {
-				ResourceHandlerType resourceHandlerType = (ResourceHandlerType)theEObject;
-				Object result = caseResourceHandlerType(resourceHandlerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SMALL_ICON_TYPE: {
-				SmallIconType smallIconType = (SmallIconType)theEObject;
-				Object result = caseSmallIconType(smallIconType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SOURCE_CLASS_TYPE: {
-				SourceClassType sourceClassType = (SourceClassType)theEObject;
-				Object result = caseSourceClassType(sourceClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.STATE_MANAGER_TYPE: {
-				StateManagerType stateManagerType = (StateManagerType)theEObject;
-				Object result = caseStateManagerType(stateManagerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SUGGESTED_VALUE_TYPE: {
-				SuggestedValueType suggestedValueType = (SuggestedValueType)theEObject;
-				Object result = caseSuggestedValueType(suggestedValueType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SUPPORTED_LOCALE_TYPE: {
-				SupportedLocaleType supportedLocaleType = (SupportedLocaleType)theEObject;
-				Object result = caseSupportedLocaleType(supportedLocaleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SYSTEM_EVENT_CLASS_TYPE: {
-				SystemEventClassType systemEventClassType = (SystemEventClassType)theEObject;
-				Object result = caseSystemEventClassType(systemEventClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_CLASS_TYPE: {
-				SystemEventListenerClassType systemEventListenerClassType = (SystemEventListenerClassType)theEObject;
-				Object result = caseSystemEventListenerClassType(systemEventListenerClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.SYSTEM_EVENT_LISTENER_TYPE: {
-				SystemEventListenerType systemEventListenerType = (SystemEventListenerType)theEObject;
-				Object result = caseSystemEventListenerType(systemEventListenerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.TAG_HANDLER_DELEGATE_FACTORY_TYPE: {
-				TagHandlerDelegateFactoryType tagHandlerDelegateFactoryType = (TagHandlerDelegateFactoryType)theEObject;
-				Object result = caseTagHandlerDelegateFactoryType(tagHandlerDelegateFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.TO_VIEW_ID_TYPE: {
-				ToViewIdType toViewIdType = (ToViewIdType)theEObject;
-				Object result = caseToViewIdType(toViewIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALIDATOR_CLASS_TYPE: {
-				ValidatorClassType validatorClassType = (ValidatorClassType)theEObject;
-				Object result = caseValidatorClassType(validatorClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALIDATOR_ID_TYPE: {
-				ValidatorIdType validatorIdType = (ValidatorIdType)theEObject;
-				Object result = caseValidatorIdType(validatorIdType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALIDATOR_TYPE: {
-				ValidatorType validatorType = (ValidatorType)theEObject;
-				Object result = caseValidatorType(validatorType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALIDATOR_EXTENSION_TYPE: {
-				ValidatorExtensionType validatorExtensionType = (ValidatorExtensionType)theEObject;
-				Object result = caseValidatorExtensionType(validatorExtensionType);
-				if (result == null) result = caseExtensionType(validatorExtensionType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALUE_CLASS_TYPE: {
-				ValueClassType valueClassType = (ValueClassType)theEObject;
-				Object result = caseValueClassType(valueClassType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VALUE_TYPE: {
-				ValueType valueType = (ValueType)theEObject;
-				Object result = caseValueType(valueType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VARIABLE_RESOLVER_TYPE: {
-				VariableResolverType variableResolverType = (VariableResolverType)theEObject;
-				Object result = caseVariableResolverType(variableResolverType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VIEW_HANDLER_TYPE: {
-				ViewHandlerType viewHandlerType = (ViewHandlerType)theEObject;
-				Object result = caseViewHandlerType(viewHandlerType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.RESOURCE_BUNDLE_TYPE: {
-				ResourceBundleType resourceBundleType = (ResourceBundleType)theEObject;
-				Object result = caseResourceBundleType(resourceBundleType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.BASE_NAME_TYPE: {
-				BaseNameType baseNameType = (BaseNameType)theEObject;
-				Object result = caseBaseNameType(baseNameType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VAR_TYPE: {
-				VarType varType = (VarType)theEObject;
-				Object result = caseVarType(varType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VIEW_DECLARATION_LANGUAGE_FACTORY_TYPE: {
-				ViewDeclarationLanguageFactoryType viewDeclarationLanguageFactoryType = (ViewDeclarationLanguageFactoryType)theEObject;
-				Object result = caseViewDeclarationLanguageFactoryType(viewDeclarationLanguageFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case FacesConfigPackage.VISIT_CONTEXT_FACTORY_TYPE: {
-				VisitContextFactoryType visitContextFactoryType = (VisitContextFactoryType)theEObject;
-				Object result = caseVisitContextFactoryType(visitContextFactoryType);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Absolute Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Absolute Ordering Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAbsoluteOrderingType(AbsoluteOrderingType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Action Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Action Listener Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseActionListenerType(ActionListenerType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Application Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Application Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseApplicationFactoryType(ApplicationFactoryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Application Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Application Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseApplicationType(ApplicationType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Attribute Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Attribute Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAttributeClassType(AttributeClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Attribute Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Attribute Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAttributeExtensionType(AttributeExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Attribute Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Attribute Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAttributeNameType(AttributeNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Attribute Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Attribute Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseAttributeType(AttributeType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Behavior Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Behavior Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBehaviorClassType(BehaviorClassType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Behavior Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Behavior Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBehaviorIdType(BehaviorIdType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Behavior Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Behavior Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBehaviorType(BehaviorType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Behavior Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Behavior Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseBehaviorExtensionType(BehaviorExtensionType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Client Behavior Renderer Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Client Behavior Renderer Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseClientBehaviorRendererClassType(ClientBehaviorRendererClassType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Client Behavior Renderer Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Client Behavior Renderer Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseClientBehaviorRendererType(ClientBehaviorRendererType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Client Behavior Renderer Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Client Behavior Renderer Type Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseClientBehaviorRendererTypeType(ClientBehaviorRendererTypeType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Component Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Component Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentClassType(ComponentClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Component Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Component Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentExtensionType(ComponentExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Component Family Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Component Family Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentFamilyType(ComponentFamilyType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Component Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Component Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentType(ComponentType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Component Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Component Type Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseComponentTypeType(ComponentTypeType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Converter Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Converter Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConverterClassType(ConverterClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Converter For Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Converter For Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConverterForClassType(ConverterForClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Converter Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Converter Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConverterIdType(ConverterIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Converter Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Converter Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseConverterType(ConverterType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Default Locale Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Default Locale Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDefaultLocaleType(DefaultLocaleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Default Render Kit Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Default Render Kit Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDefaultRenderKitIdType(DefaultRenderKitIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Default Validators Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Default Validators Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDefaultValidatorsType(DefaultValidatorsType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Default Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Default Value Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDefaultValueType(DefaultValueType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Description Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Description Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDescriptionType(DescriptionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Display Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Display Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDisplayNameType(DisplayNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Document Root</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Document Root</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDocumentRoot(DocumentRoot object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Dynamic Attribute</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Dynamic Attribute</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseDynamicAttribute(DynamicAttribute object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Dynamic Element</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Dynamic Element</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseDynamicElement(DynamicElement object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>EL Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>EL Resolver Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseELResolverType(ELResolverType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Exception Handler Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Exception Handler Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExceptionHandlerFactoryType(ExceptionHandlerFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFacesConfigType(FacesConfigType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Faces Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Faces Context Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFacesContextFactoryType(FacesContextFactoryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Facet Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Facet Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFacetExtensionType(FacetExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Facet Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Facet Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFacetNameType(FacetNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Facet Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Facet Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFacetType(FacetType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFactoryType(FactoryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>From Action Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>From Action Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFromActionType(FromActionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>From Outcome Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>From Outcome Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFromOutcomeType(FromOutcomeType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>From View Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>From View Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseFromViewIdType(FromViewIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Icon Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseIconType(IconType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>If Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>If Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseIfType(IfType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Key Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Key Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseKeyClassType(KeyClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Key Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Key Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseKeyType(KeyType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Large Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Large Icon Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseLargeIconType(LargeIconType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Lifecycle Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Lifecycle Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseLifecycleFactoryType(LifecycleFactoryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Lifecycle Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Lifecycle Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseLifecycleType(LifecycleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>List Entries Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>List Entries Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseListEntriesType(ListEntriesType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Locale Config Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Locale Config Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseLocaleConfigType(LocaleConfigType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Bean Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Bean Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseManagedBeanClassType(ManagedBeanClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Bean Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Bean Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseManagedBeanNameType(ManagedBeanNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Bean Scope Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Bean Scope Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseManagedBeanScopeType(ManagedBeanScopeType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Bean Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Bean Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseManagedBeanType(ManagedBeanType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Property Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Property Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseManagedPropertyType(ManagedPropertyType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Map Entries Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Map Entries Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMapEntriesType(MapEntriesType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Map Entry Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Map Entry Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMapEntryType(MapEntryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Message Bundle Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Message Bundle Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseMessageBundleType(MessageBundleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNameType(NameType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Navigation Case Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Navigation Case Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNavigationCaseType(NavigationCaseType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Navigation Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Navigation Handler Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNavigationHandlerType(NavigationHandlerType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Navigation Rule Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Navigation Rule Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNavigationRuleType(NavigationRuleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Null Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Null Value Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseNullValueType(NullValueType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Ordering Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOrderingType(OrderingType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Ordering Ordering Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Ordering Ordering Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOrderingOrderingType(OrderingOrderingType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Ordering Others Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Ordering Others Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOrderingOthersType(OrderingOthersType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Partial View Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Partial View Context Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePartialViewContextFactoryType(PartialViewContextFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Phase Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Phase Listener Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePhaseListenerType(PhaseListenerType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Property Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Property Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePropertyClassType(PropertyClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Property Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Property Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePropertyExtensionType(PropertyExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Property Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Property Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePropertyNameType(PropertyNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Property Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Property Resolver Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePropertyResolverType(PropertyResolverType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Property Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Property Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object casePropertyType(PropertyType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Redirect Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Redirect Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRedirectType(RedirectType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Redirect View Param Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Redirect View Param Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRedirectViewParamType(RedirectViewParamType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Referenced Bean Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Referenced Bean Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReferencedBeanClassType(ReferencedBeanClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Referenced Bean Name Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Referenced Bean Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReferencedBeanNameType(ReferencedBeanNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Referenced Bean Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Referenced Bean Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseReferencedBeanType(ReferencedBeanType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Renderer Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Renderer Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRendererClassType(RendererClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Renderer Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Renderer Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRendererExtensionType(RendererExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Renderer Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Renderer Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRendererType(RendererType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Renderer Type Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Renderer Type Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRendererTypeType(RendererTypeType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Render Kit Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Render Kit Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRenderKitClassType(RenderKitClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Render Kit Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Render Kit Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRenderKitFactoryType(RenderKitFactoryType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Render Kit Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Render Kit Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRenderKitIdType(RenderKitIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Render Kit Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Render Kit Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseRenderKitType(RenderKitType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Small Icon Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Small Icon Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSmallIconType(SmallIconType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Source Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Source Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSourceClassType(SourceClassType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>State Manager Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>State Manager Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseStateManagerType(StateManagerType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Suggested Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Suggested Value Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSuggestedValueType(SuggestedValueType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Supported Locale Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Supported Locale Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSupportedLocaleType(SupportedLocaleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>System Event Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>System Event Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSystemEventClassType(SystemEventClassType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>System Event Listener Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>System Event Listener Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSystemEventListenerClassType(SystemEventListenerClassType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>System Event Listener Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>System Event Listener Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseSystemEventListenerType(SystemEventListenerType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Tag Handler Delegate Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Tag Handler Delegate Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagHandlerDelegateFactoryType(TagHandlerDelegateFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>To View Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>To View Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseToViewIdType(ToViewIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Validator Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Validator Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValidatorClassType(ValidatorClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Validator Id Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Validator Id Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValidatorIdType(ValidatorIdType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Validator Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Validator Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValidatorType(ValidatorType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Value Class Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Value Class Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValueClassType(ValueClassType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Value Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Value Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseValueType(ValueType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Variable Resolver Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Variable Resolver Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseVariableResolverType(VariableResolverType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>View Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>View Handler Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseViewHandlerType(ViewHandlerType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Resource Bundle Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Resource Bundle Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseResourceBundleType(ResourceBundleType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Base Name Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Base Name Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseBaseNameType(BaseNameType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Var Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Var Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseVarType(VarType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>View Declaration Language Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>View Declaration Language Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseViewDeclarationLanguageFactoryType(ViewDeclarationLanguageFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Visit Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Visit Context Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseVisitContextFactoryType(VisitContextFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Render Kit Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Render Kit Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseRenderKitExtensionType(RenderKitExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Resource Handler Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Resource Handler Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseResourceHandlerType(ResourceHandlerType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Navigation Rule Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Navigation Rule Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseNavigationRuleExtensionType(NavigationRuleExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Validator Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Validator Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseValidatorExtensionType(ValidatorExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseFacesConfigExtensionType(FacesConfigExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Factory Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Factory Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseFactoryExtensionType(FactoryExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Lifecycle Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Lifecycle Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseLifecycleExtensionType(LifecycleExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Managed Bean Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Managed Bean Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseManagedBeanExtensionType(ManagedBeanExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Converter Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Converter Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseConverterExtensionType(ConverterExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseExtensionType(ExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>External Context Factory Type</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>External Context Factory Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseExternalContextFactoryType(ExternalContextFactoryType object) {
-		return null;
-	}
-
-				/**
-	 * Returns the result of interpreting the object as an instance of '<em>Application Extension Type</em>'.
-	 * <!-- begin-user-doc -->
-     * This implementation returns null;
-     * returning a non-null result will terminate the switch.
-     * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Application Extension Type</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-    public Object caseApplicationExtensionType(ApplicationExtensionType object) {
-		return null;
-	}
-
-    /**
-	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //FacesConfigSwitch
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/package-info.java
deleted file mode 100644
index 629e163..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/emf/util/package-info.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * EMF generated utility classes for JSF application configuration files (deprecated).
- * <p>
- * Deprecated - should be using classes in org.eclipse.jst.jsf.facesconfig.edit.provider.   
- * This package will be removed from the MANIFEST.MF as public API in a future release.
- */
-package org.eclipse.jst.jsf.facesconfig.emf.util;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/Logger.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/Logger.java
deleted file mode 100644
index ab40d83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/Logger.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal;
-
-import java.io.PrintStream;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-
-
-/**
- * Small convenience class to log messages to plugin's log file and also, if desired,
- * the console. This class should only be used by classes in this plugin. Other
- * plugins should make their own copy, with appropriate ID.
- */
-public class Logger {
-	private static Plugin fPlugin;
-	private static String fPluginId;
-	
-	/**
-	 * Controls whether or not log/trace messages also go to the console.
-	 * Normally, leave this as false.  Change to true temporarily, if desired, for debugging.
-	 */
-	private static boolean displayToConsole = false;
-
-	private static final String TRACEFILTER_LOCATION = "/debug/tracefilter"; //$NON-NLS-1$
-
-	private static final int OK = IStatus.OK; // 0
-	private static final int INFO = IStatus.INFO; // 1
-	private static final int WARNING = IStatus.WARNING; // 2
-	private static final int ERROR = IStatus.ERROR; // 4
-
-	private static final int OK_DEBUG = 200 + OK;
-	private static final int INFO_DEBUG = 200 + INFO;
-	private static final int WARNING_DEBUG = 200 + WARNING;
-	private static final int ERROR_DEBUG = 200 + ERROR;
-
-	/**
-	 * Adds message to log.
-	 * @param level severity level of the message (OK, INFO, WARNING, ERROR, OK_DEBUG, INFO_DEBUG, WARNING_DEBUG, ERROR_DEBUG)
-	 * @param message text to add to the log
-	 * @param exception exception thrown
-	 */
-	protected static void _log(int level, String message, Throwable exception) {
-		if (level == OK_DEBUG || level == INFO_DEBUG || level == WARNING_DEBUG || level == ERROR_DEBUG) {
-			if (!isDebugging())
-				return;
-		}
-
-		int severity = IStatus.OK;
-		switch (level) {
-			case INFO_DEBUG :
-			case INFO :
-				severity = IStatus.INFO;
-				break;
-			case WARNING_DEBUG :
-			case WARNING :
-				severity = IStatus.WARNING;
-				break;
-			case ERROR_DEBUG :
-			case ERROR :
-				severity = IStatus.ERROR;
-		}
-		message = (message != null) ? message : "null"; //$NON-NLS-1$
-		Status statusObj = new Status(severity, getPluginId(), severity, message, exception);
-		getPlugin().getLog().log(statusObj);
-	}
-
-	/**
-	 * Prints message to log if category matches /debug/tracefilter option.
-	 * @param message text to print
-	 * @param category category of the message, to be compared with /debug/tracefilter
-	 * @param exception 
-	 */
-	protected static void _trace(String category, String message, Throwable exception) {
-		if (isTracing(category)) {
-			message = (message != null) ? message : "null"; //$NON-NLS-1$
-			Status statusObj = new Status(IStatus.OK, getPluginId(), IStatus.OK, message, exception);
-			getPlugin().getLog().log(statusObj);
-		}
-	}
-
-	/**
-	 * @return true if the plugin for this logger is debugging
-	 */
-	public static boolean isDebugging() {
-		return getPlugin().isDebugging();
-	}
-
-	/**
-	 * Determines if currently tracing a category
-	 * @param category
-	 * @return true if tracing category, false otherwise
-	 */
-	public static boolean isTracing(String category) {
-		if (!isDebugging())
-			return false;
-
-		String traceFilter = Platform.getDebugOption(getPluginId() + TRACEFILTER_LOCATION);
-		if (traceFilter != null) {
-			StringTokenizer tokenizer = new StringTokenizer(traceFilter, ","); //$NON-NLS-1$
-			while (tokenizer.hasMoreTokens()) {
-				String cat = tokenizer.nextToken().trim();
-				if (category.equals(cat)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param level
-	 * @param message
-	 */
-	public static void log(int level, String message) {
-		_log(level, message, null);
-	}
-
-	/**
-	 * @param level
-	 * @param message
-	 * @param exception
-	 */
-	public static void log(int level, String message, Throwable exception) {
-		_log(level, message, exception);
-	}
-	
-	/**
-	 * @param source
-	 * @param message
-	 */
-	public static void log(Object source, String message) {
-		doLog(source, message, null);
-	}
-
-	/**
-	 * @param source
-	 * @param message
-	 * @param throwable
-	 */
-	public static void log(Object source, String message, Throwable throwable) {
-		doLog(source, message, throwable);
-	}
-
-	/**
-	 * @param source
-	 * @param throwable
-	 */
-	public static void log(Object source, Throwable throwable) {
-		doLog(source, null, throwable);
-	}
-	
-	/**
-	 * @param message
-	 */
-	public static void log(String message) {
-		doLog(message, null);
-	}
-	
-	private static void doLog(String message, Throwable exception) {
-		_log(ERROR, message, exception);
-	}
-	
-	private static void doLog(Object source, String message, Throwable exception) {
-		_log(ERROR, getMessageFor(source, message), exception);
-	}
-	
-	private static final String getMessageFor(Object source, String message) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(source);
-		if (message != null) {
-			buffer.append(": "); //$NON-NLS-1$
-			buffer.append(message);
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * @param message
-	 * @param exception
-	 */
-	public static void logException(String message, Throwable exception) {
-		_log(ERROR, message, exception);
-	}
-
-	/**
-	 * @param exception
-	 */
-	public static void logException(Throwable exception) {
-		_log(ERROR, exception.getMessage(), exception);
-	}
-
-	/**
-	 * @param category
-	 * @param message
-	 * @param exception
-	 */
-	public static void traceException(String category, String message, Throwable exception) {
-		_trace(category, message, exception);
-	}
-
-	/**
-	 * @param category
-	 * @param exception
-	 */
-	public static void traceException(String category, Throwable exception) {
-		_trace(category, exception.getMessage(), exception);
-	}
-
-	/**
-	 * @param category
-	 * @param message
-	 */
-	public static void trace(String category, String message) {
-		_trace(category, message, null);
-	}
-
-	private static Plugin getFacesPlugin() {
-		return FacesConfigPlugin.getPlugin();
-	}
-
-	private static Plugin getPlugin() {
-
-		if (fPlugin == null) {
-			fPlugin = getFacesPlugin();
-		}
-		return fPlugin;
-	}
-
-	/**
-	 * @return the plugin id
-	 */
-	private static String getPluginId() {
-
-		if (fPluginId == null) {
-			fPluginId = ((Plugin) (FacesConfigPlugin.getPlugin())).getBundle().getSymbolicName() ;
-		}
-		return fPluginId;
-	}
-	
-	private static final void doConsole(String message, Throwable throwable) {
-		if (displayToConsole) {
-			PrintStream out = System.out;
-			out.println(message);
-			if (throwable != null)
-				throwable.printStackTrace(out);
-		}
-	}
-	
-	private static final void doTrace(String category, Object source, String message) {
-		message = getMessageFor(source, message);
-		try {
-			_trace(category, message, null);
-		} catch (Exception ignored) {
-			// Empty block intended.
-		} finally {
-			doConsole(message, null);
-		}
-	}
-	
-	/**
-	 * @param category
-	 * @param source
-	 * @param message
-	 */
-	public static void trace(String category, Object source, String message) {
-		doTrace(category, source, message);
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/Messages.java
deleted file mode 100644
index b5897e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/Messages.java
+++ /dev/null
@@ -1,1408 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.nls;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @author cbateman
- *
- */
-public final class Messages extends NLS {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.facesconfig.internal.nls.messages";//$NON-NLS-1$
-
-	private Messages() {
-		// Do not instantiate
-	}
-
-	/**
-	 * see messages.properties
-	 */
-	public static String Source_UI_;
-	/**
-	 * see messages.properties
-	 */
-	public static String FaceConfigEditor_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Overview_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Application_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Factory_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Component_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Converter_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String ManagedBean_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String NavigationRule_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String ReferencedBean_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String RenderKit_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Lifecycle_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String Validator_Page_Title;
-	/**
-	 * see messages.properties
-	 */
-	public static String MANAGEDBEAN_MAIN_SEC_TITLE;
-	/**
-	 * see messages.properties
-	 */
-	public static String MANAGEDBEAN_MAIN_SEC_DESC;
-	/**
-	 * see messages.properties
-	 */
-	public static String Invalid_Config_File;
-	/**
-	 * see messages.properties
-	 */
-	public static String OPEN_TO_FACESCONFIG_SOURCE_PAGE_MENU_LABEL;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_CreateChild_text;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_CreateChild_text2;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_CreateChild_tooltip;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_CreateChild_description;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_CreateSibling_description;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyDescriptor_description;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ActionListenerType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationFactoryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeExtensionType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeNameType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentClassType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentExtensionType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentTypeType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DefaultLocaleType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DescriptionType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DisplayNameType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesContextFactoryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_IconType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleFactoryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ListEntriesType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LocaleConfigType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntriesType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MessageBundleType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationHandlerType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NullValueType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PhaseListenerType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyExtensionType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyResolverType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RedirectType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_type;
-	/**
-	 * see messages.properties
-	 */
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererExtensionType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitFactoryType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_StateManagerType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentClassType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentTypeType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedLocaleType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValueType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_VariableResolverType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ViewHandlerType_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_Unknown_type;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ActionListenerType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ActionListenerType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationFactoryType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationFactoryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_actionListener_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_messageBundle_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_navigationHandler_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_viewHandler_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_stateManager_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_propertyResolver_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_variableResolver_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_localeConfig_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ApplicationType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeExtensionType_mixed_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeExtensionType_group_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeExtensionType_any_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeExtensionType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeNameType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeNameType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_attributeName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_attributeExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_attributeClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_defaultValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_AttributeType_suggestedValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentClassType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentClassType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentExtensionType_mixed_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentExtensionType_group_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentExtensionType_any_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentExtensionType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_componentType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_componentClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_attribute_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_property_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_componentExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentTypeType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ComponentTypeType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_attribute_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_property_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_converterClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_converterForClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_converterId_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ConverterType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DefaultLocaleType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DefaultLocaleType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DescriptionType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DescriptionType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DescriptionType_lang_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DisplayNameType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DisplayNameType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DisplayNameType_lang_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_mixed_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_xMLNSPrefixMap_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_xSISchemaLocation_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_actionListener_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_application_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_applicationFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_attribute_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_attributeExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_attributeName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_component_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_componentClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_componentExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_componentType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_converter_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_defaultLocale_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_facesConfig_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_facesContextFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_factory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_lifecycle_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_lifecycleFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_listEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_localeConfig_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_managedBean_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_managedProperty_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_mapEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_mapEntry_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_messageBundle_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_navigationCase_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_navigationHandler_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_navigationRule_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_nullValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_phaseListener_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_property_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_propertyExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_propertyResolver_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_redirect_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_referencedBean_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_renderer_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_rendererExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_renderKit_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_renderKitFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_stateManager_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_supportedComponentClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_supportedComponentType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_supportedLocale_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_validator_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_variableResolver_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_DocumentRoot_viewHandler_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_application_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_factory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_component_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_converter_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_managedBean_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_navigationRule_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_referencedBean_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_renderKit_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_lifecycle_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_validator_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesConfigType_xmlns00000_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesContextFactoryType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FacesContextFactoryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_applicationFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_facesContextFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_lifecycleFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_renderKitFactory_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_FactoryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_IconType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_IconType_lang_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_IconType_largeIcon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_IconType_smallIcon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleFactoryType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleFactoryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleType_phaseListener_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LifecycleType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ListEntriesType_nullValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ListEntriesType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ListEntriesType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ListEntriesType_valueClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LocaleConfigType_defaultLocale_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LocaleConfigType_supportedLocale_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_LocaleConfigType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_managedProperty_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_mapEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_listEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_managedBeanClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_managedBeanName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedBeanType_managedBeanScope_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_mapEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_listEntries_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_nullValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_propertyClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_propertyName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ManagedPropertyType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntriesType_mapEntry_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntriesType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntriesType_keyClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntriesType_valueClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntryType_key_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntryType_nullValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MapEntryType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MessageBundleType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_MessageBundleType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_redirect_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_fromAction_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_fromOutcome_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationCaseType_toViewId_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationHandlerType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationHandlerType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_navigationCase_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_fromViewId_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NavigationRuleType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_NullValueType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PhaseListenerType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PhaseListenerType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyExtensionType_mixed_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyExtensionType_group_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyExtensionType_any_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyExtensionType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyResolverType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyResolverType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_propertyExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_defaultValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_propertyClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_propertyName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_PropertyType_suggestedValue_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RedirectType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_referencedBeanClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ReferencedBeanType_referencedBeanName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererExtensionType_mixed_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererExtensionType_group_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererExtensionType_any_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererExtensionType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_attribute_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_supportedComponentType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_supportedComponentClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_rendererExtension_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_rendererClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RendererType_rendererType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitFactoryType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitFactoryType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_renderer_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_renderKitClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_RenderKitType_renderKitId_feature;
-	/**
-	 * see messages.properties
-	 */
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_StateManagerType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_StateManagerType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentClassType_componentClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentClassType_attributeName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentClassType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentTypeType_componentType_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentTypeType_attributeName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedComponentTypeType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedLocaleType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_SupportedLocaleType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_description_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_displayName_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_icon_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_attribute_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_property_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_validatorClass_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValidatorType_validatorId_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValueType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ValueType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_VariableResolverType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_VariableResolverType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ViewHandlerType_value_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_ViewHandlerType_id_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String _UI_Unknown_feature;
-	/**
-	 * see messages.properties
-	 */
-	public static String scValidation_duplicate_definition;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/messages.properties
deleted file mode 100644
index 7353707..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/nls/messages.properties
+++ /dev/null
@@ -1,369 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-#/***************************************************************************************************
-# * Copyright (c) 2005, 2006 IBM Corporation and others. 
-# * All rights reserved. This program and the accompanying materials 
-# * are made available under the terms of the Eclipse Public License v1.0
-# * which accompanies this distribution, and is available at
-# * http://www.eclipse.org/legal/epl-v10.html
-# * 
-# * Contributors: 
-# *   IBM Corporation - initial API and implementation
-# **************************************************************************************************/
-Source_UI_ = XML Source
-FaceConfigEditor_Title=Faces Configuration File Editor
-
-Overview_Page_Title=Overview
-Application_Page_Title=Application
-Factory_Page_Title=Factory
-Component_Page_Title=Components
-Converter_Page_Title=Converter
-ManagedBean_Page_Title=Managed Beans
-NavigationRule_Page_Title=Navigation Rules
-ReferencedBean_Page_Title=Referenced Beans
-RenderKit_Page_Title=RenderKits
-Lifecycle_Page_Title=Lifecycle
-Validator_Page_Title=Validator
-
-MANAGEDBEAN_MAIN_SEC_TITLE=Managed Beans
-MANAGEDBEAN_MAIN_SEC_DESC=The following Managed Beans are defined for this config file
-Invalid_Config_File = The Faces Configuration File editor cannot open the file because it is not a valid Faces configuration file.  The XML editor will be opened.
-OPEN_TO_FACESCONFIG_SOURCE_PAGE_MENU_LABEL=Faces Configuration File Editor Source Page
-
-_UI_CreateChild_text = {0}
-_UI_CreateChild_text2 = {1} {0}
-_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
-_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
-_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
-
-_UI_PropertyDescriptor_description = The {0} of the {1}
-
-_UI_ActionListenerType_type = Action Listener Type
-_UI_ApplicationFactoryType_type = Application Factory Type
-_UI_ApplicationType_type = Application Type
-_UI_AttributeExtensionType_type = Attribute Extension Type
-_UI_AttributeNameType_type = Attribute Name Type
-_UI_AttributeType_type = Attribute Type
-_UI_ComponentClassType_type = Component Class Type
-_UI_ComponentExtensionType_type = Component Extension Type
-_UI_ComponentType_type = Component Type
-_UI_ComponentTypeType_type = Component Type Type
-_UI_ConverterType_type = Converter Type
-_UI_DefaultLocaleType_type = Default Locale Type
-_UI_DescriptionType_type = Description Type
-_UI_DisplayNameType_type = Display Name Type
-_UI_DocumentRoot_type = Document Root
-_UI_FacesConfigType_type = Type
-_UI_FacesContextFactoryType_type = Faces Context Factory Type
-_UI_FactoryType_type = Factory Type
-_UI_IconType_type = Icon Type
-_UI_LifecycleFactoryType_type = Lifecycle Factory Type
-_UI_LifecycleType_type = Lifecycle Type
-_UI_ListEntriesType_type = List Entries Type
-_UI_LocaleConfigType_type = Locale Config Type
-_UI_ManagedBeanType_type = Managed Bean Type
-_UI_ManagedPropertyType_type = Managed Property Type
-_UI_MapEntriesType_type = Map Entries Type
-_UI_MapEntryType_type = Map Entry Type
-_UI_MessageBundleType_type = Message Bundle Type
-_UI_NavigationCaseType_type = Navigation Case Type
-_UI_NavigationHandlerType_type = Navigation Handler Type
-_UI_NavigationRuleType_type = Navigation Rule Type
-_UI_NullValueType_type = Null Value Type
-_UI_PhaseListenerType_type = Phase Listener Type
-_UI_PropertyExtensionType_type = Property Extension Type
-_UI_PropertyResolverType_type = Property Resolver Type
-_UI_PropertyType_type = Property Type
-_UI_RedirectType_type = Redirect Type
-_UI_ReferencedBeanType_type = Referenced Bean Type
-_UI_RendererExtensionType_type = Renderer Extension Type
-_UI_RendererType_type = Renderer Type
-_UI_RenderKitFactoryType_type = Render Kit Factory Type
-_UI_RenderKitType_type = Render Kit Type
-_UI_StateManagerType_type = State Manager Type
-_UI_SupportedComponentClassType_type = Supported Component Class Type
-_UI_SupportedComponentTypeType_type = Supported Component Type Type
-_UI_SupportedLocaleType_type = Supported Locale Type
-_UI_ValidatorType_type = Validator Type
-_UI_ValueType_type = Value Type
-_UI_VariableResolverType_type = Variable Resolver Type
-_UI_ViewHandlerType_type = View Handler Type
-_UI_Unknown_type = Object
-
-_UI_ActionListenerType_value_feature = Value
-_UI_ActionListenerType_id_feature = Id
-_UI_ApplicationFactoryType_value_feature = Value
-_UI_ApplicationFactoryType_id_feature = Id
-_UI_ApplicationType_actionListener_feature = Action Listener
-_UI_ApplicationType_messageBundle_feature = Message Bundle
-_UI_ApplicationType_navigationHandler_feature = Navigation Handler
-_UI_ApplicationType_viewHandler_feature = View Handler
-_UI_ApplicationType_stateManager_feature = State Manager
-_UI_ApplicationType_propertyResolver_feature = Property Resolver
-_UI_ApplicationType_variableResolver_feature = Variable Resolver
-_UI_ApplicationType_localeConfig_feature = Locale Config
-_UI_ApplicationType_id_feature = Id
-_UI_AttributeExtensionType_mixed_feature = Mixed
-_UI_AttributeExtensionType_group_feature = Group
-_UI_AttributeExtensionType_any_feature = Any
-_UI_AttributeExtensionType_id_feature = Id
-_UI_AttributeNameType_value_feature = Value
-_UI_AttributeNameType_id_feature = Id
-_UI_AttributeType_description_feature = Description
-_UI_AttributeType_displayName_feature = Display Name
-_UI_AttributeType_icon_feature = Icon
-_UI_AttributeType_attributeName_feature = Attribute Name
-_UI_AttributeType_attributeExtension_feature = Attribute Extension
-_UI_AttributeType_attributeClass_feature = Attribute Class
-_UI_AttributeType_defaultValue_feature = Default Value
-_UI_AttributeType_id_feature = Id
-_UI_AttributeType_suggestedValue_feature = Suggested Value
-_UI_ComponentClassType_value_feature = Value
-_UI_ComponentClassType_id_feature = Id
-_UI_ComponentExtensionType_mixed_feature = Mixed
-_UI_ComponentExtensionType_group_feature = Group
-_UI_ComponentExtensionType_any_feature = Any
-_UI_ComponentExtensionType_id_feature = Id
-_UI_ComponentType_description_feature = Description
-_UI_ComponentType_displayName_feature = Display Name
-_UI_ComponentType_icon_feature = Icon
-_UI_ComponentType_componentType_feature = Component Type
-_UI_ComponentType_componentClass_feature = Component Class
-_UI_ComponentType_attribute_feature = Attribute
-_UI_ComponentType_property_feature = Property
-_UI_ComponentType_componentExtension_feature = Component Extension
-_UI_ComponentType_id_feature = Id
-_UI_ComponentTypeType_value_feature = Value
-_UI_ComponentTypeType_id_feature = Id
-_UI_ConverterType_description_feature = Description
-_UI_ConverterType_displayName_feature = Display Name
-_UI_ConverterType_icon_feature = Icon
-_UI_ConverterType_attribute_feature = Attribute
-_UI_ConverterType_property_feature = Property
-_UI_ConverterType_converterClass_feature = Converter Class
-_UI_ConverterType_converterForClass_feature = Converter For Class
-_UI_ConverterType_converterId_feature = Converter Id
-_UI_ConverterType_id_feature = Id
-_UI_DefaultLocaleType_value_feature = Value
-_UI_DefaultLocaleType_id_feature = Id
-_UI_DescriptionType_value_feature = Value
-_UI_DescriptionType_id_feature = Id
-_UI_DescriptionType_lang_feature = Lang
-_UI_DisplayNameType_value_feature = Value
-_UI_DisplayNameType_id_feature = Id
-_UI_DisplayNameType_lang_feature = Lang
-_UI_DocumentRoot_mixed_feature = Mixed
-_UI_DocumentRoot_xMLNSPrefixMap_feature = XMLNS Prefix Map
-_UI_DocumentRoot_xSISchemaLocation_feature = XSI Schema Location
-_UI_DocumentRoot_actionListener_feature = Action Listener
-_UI_DocumentRoot_application_feature = Application
-_UI_DocumentRoot_applicationFactory_feature = Application Factory
-_UI_DocumentRoot_attribute_feature = Attribute
-_UI_DocumentRoot_attributeExtension_feature = Attribute Extension
-_UI_DocumentRoot_attributeName_feature = Attribute Name
-_UI_DocumentRoot_component_feature = Component
-_UI_DocumentRoot_componentClass_feature = Component Class
-_UI_DocumentRoot_componentExtension_feature = Component Extension
-_UI_DocumentRoot_componentType_feature = Component Type
-_UI_DocumentRoot_converter_feature = Converter
-_UI_DocumentRoot_defaultLocale_feature = Default Locale
-_UI_DocumentRoot_description_feature = Description
-_UI_DocumentRoot_displayName_feature = Display Name
-_UI_DocumentRoot_facesConfig_feature = Faces Config
-_UI_DocumentRoot_facesContextFactory_feature = Faces Context Factory
-_UI_DocumentRoot_factory_feature = Factory
-_UI_DocumentRoot_icon_feature = Icon
-_UI_DocumentRoot_lifecycle_feature = Lifecycle
-_UI_DocumentRoot_lifecycleFactory_feature = Lifecycle Factory
-_UI_DocumentRoot_listEntries_feature = List Entries
-_UI_DocumentRoot_localeConfig_feature = Locale Config
-_UI_DocumentRoot_managedBean_feature = Managed Bean
-_UI_DocumentRoot_managedProperty_feature = Managed Property
-_UI_DocumentRoot_mapEntries_feature = Map Entries
-_UI_DocumentRoot_mapEntry_feature = Map Entry
-_UI_DocumentRoot_messageBundle_feature = Message Bundle
-_UI_DocumentRoot_navigationCase_feature = Navigation Case
-_UI_DocumentRoot_navigationHandler_feature = Navigation Handler
-_UI_DocumentRoot_navigationRule_feature = Navigation Rule
-_UI_DocumentRoot_nullValue_feature = Null Value
-_UI_DocumentRoot_phaseListener_feature = Phase Listener
-_UI_DocumentRoot_property_feature = Property
-_UI_DocumentRoot_propertyExtension_feature = Property Extension
-_UI_DocumentRoot_propertyResolver_feature = Property Resolver
-_UI_DocumentRoot_redirect_feature = Redirect
-_UI_DocumentRoot_referencedBean_feature = Referenced Bean
-_UI_DocumentRoot_renderer_feature = Renderer
-_UI_DocumentRoot_rendererExtension_feature = Renderer Extension
-_UI_DocumentRoot_renderKit_feature = Render Kit
-_UI_DocumentRoot_renderKitFactory_feature = Render Kit Factory
-_UI_DocumentRoot_stateManager_feature = State Manager
-_UI_DocumentRoot_supportedComponentClass_feature = Supported Component Class
-_UI_DocumentRoot_supportedComponentType_feature = Supported Component Type
-_UI_DocumentRoot_supportedLocale_feature = Supported Locale
-_UI_DocumentRoot_validator_feature = Validator
-_UI_DocumentRoot_value_feature = Value
-_UI_DocumentRoot_variableResolver_feature = Variable Resolver
-_UI_DocumentRoot_viewHandler_feature = View Handler
-_UI_FacesConfigType_application_feature = Application
-_UI_FacesConfigType_factory_feature = Factory
-_UI_FacesConfigType_component_feature = Component
-_UI_FacesConfigType_converter_feature = Converter
-_UI_FacesConfigType_managedBean_feature = Managed Bean
-_UI_FacesConfigType_navigationRule_feature = Navigation Rule
-_UI_FacesConfigType_referencedBean_feature = Referenced Bean
-_UI_FacesConfigType_renderKit_feature = Render Kit
-_UI_FacesConfigType_lifecycle_feature = Lifecycle
-_UI_FacesConfigType_validator_feature = Validator
-_UI_FacesConfigType_id_feature = Id
-_UI_FacesConfigType_xmlns00000_feature = Xmlns00000
-_UI_FacesContextFactoryType_value_feature = Value
-_UI_FacesContextFactoryType_id_feature = Id
-_UI_FactoryType_applicationFactory_feature = Application Factory
-_UI_FactoryType_facesContextFactory_feature = Faces Context Factory
-_UI_FactoryType_lifecycleFactory_feature = Lifecycle Factory
-_UI_FactoryType_renderKitFactory_feature = Render Kit Factory
-_UI_FactoryType_id_feature = Id
-_UI_IconType_id_feature = Id
-_UI_IconType_lang_feature = Lang
-_UI_IconType_largeIcon_feature = Large Icon
-_UI_IconType_smallIcon_feature = Small Icon
-_UI_LifecycleFactoryType_value_feature = Value
-_UI_LifecycleFactoryType_id_feature = Id
-_UI_LifecycleType_phaseListener_feature = Phase Listener
-_UI_LifecycleType_id_feature = Id
-_UI_ListEntriesType_nullValue_feature = Null Value
-_UI_ListEntriesType_value_feature = Value
-_UI_ListEntriesType_id_feature = Id
-_UI_ListEntriesType_valueClass_feature = Value Class
-_UI_LocaleConfigType_defaultLocale_feature = Default Locale
-_UI_LocaleConfigType_supportedLocale_feature = Supported Locale
-_UI_LocaleConfigType_id_feature = Id
-_UI_ManagedBeanType_description_feature = Description
-_UI_ManagedBeanType_displayName_feature = Display Name
-_UI_ManagedBeanType_icon_feature = Icon
-_UI_ManagedBeanType_managedProperty_feature = Managed Property
-_UI_ManagedBeanType_mapEntries_feature = Map Entries
-_UI_ManagedBeanType_listEntries_feature = List Entries
-_UI_ManagedBeanType_id_feature = Id
-_UI_ManagedBeanType_managedBeanClass_feature = Managed Bean Class
-_UI_ManagedBeanType_managedBeanName_feature = Managed Bean Name
-_UI_ManagedBeanType_managedBeanScope_feature = Managed Bean Scope
-_UI_ManagedPropertyType_description_feature = Description
-_UI_ManagedPropertyType_displayName_feature = Display Name
-_UI_ManagedPropertyType_icon_feature = Icon
-_UI_ManagedPropertyType_mapEntries_feature = Map Entries
-_UI_ManagedPropertyType_listEntries_feature = List Entries
-_UI_ManagedPropertyType_id_feature = Id
-_UI_ManagedPropertyType_nullValue_feature = Null Value
-_UI_ManagedPropertyType_propertyClass_feature = Property Class
-_UI_ManagedPropertyType_propertyName_feature = Property Name
-_UI_ManagedPropertyType_value_feature = Value
-_UI_MapEntriesType_mapEntry_feature = Map Entry
-_UI_MapEntriesType_id_feature = Id
-_UI_MapEntriesType_keyClass_feature = Key Class
-_UI_MapEntriesType_valueClass_feature = Value Class
-_UI_MapEntryType_id_feature = Id
-_UI_MapEntryType_key_feature = Key
-_UI_MapEntryType_nullValue_feature = Null Value
-_UI_MapEntryType_value_feature = Value
-_UI_MessageBundleType_value_feature = Value
-_UI_MessageBundleType_id_feature = Id
-_UI_NavigationCaseType_description_feature = Description
-_UI_NavigationCaseType_displayName_feature = Display Name
-_UI_NavigationCaseType_icon_feature = Icon
-_UI_NavigationCaseType_redirect_feature = Redirect
-_UI_NavigationCaseType_fromAction_feature = From Action
-_UI_NavigationCaseType_fromOutcome_feature = From Outcome
-_UI_NavigationCaseType_id_feature = Id
-_UI_NavigationCaseType_toViewId_feature = To View Id
-_UI_NavigationHandlerType_value_feature = Value
-_UI_NavigationHandlerType_id_feature = Id
-_UI_NavigationRuleType_description_feature = Description
-_UI_NavigationRuleType_displayName_feature = Display Name
-_UI_NavigationRuleType_icon_feature = Icon
-_UI_NavigationRuleType_navigationCase_feature = Navigation Case
-_UI_NavigationRuleType_fromViewId_feature = From View Id
-_UI_NavigationRuleType_id_feature = Id
-_UI_NullValueType_id_feature = Id
-_UI_PhaseListenerType_value_feature = Value
-_UI_PhaseListenerType_id_feature = Id
-_UI_PropertyExtensionType_mixed_feature = Mixed
-_UI_PropertyExtensionType_group_feature = Group
-_UI_PropertyExtensionType_any_feature = Any
-_UI_PropertyExtensionType_id_feature = Id
-_UI_PropertyResolverType_value_feature = Value
-_UI_PropertyResolverType_id_feature = Id
-_UI_PropertyType_description_feature = Description
-_UI_PropertyType_displayName_feature = Display Name
-_UI_PropertyType_icon_feature = Icon
-_UI_PropertyType_propertyExtension_feature = Property Extension
-_UI_PropertyType_defaultValue_feature = Default Value
-_UI_PropertyType_id_feature = Id
-_UI_PropertyType_propertyClass_feature = Property Class
-_UI_PropertyType_propertyName_feature = Property Name
-_UI_PropertyType_suggestedValue_feature = Suggested Value
-_UI_RedirectType_id_feature = Id
-_UI_ReferencedBeanType_description_feature = Description
-_UI_ReferencedBeanType_displayName_feature = Display Name
-_UI_ReferencedBeanType_icon_feature = Icon
-_UI_ReferencedBeanType_id_feature = Id
-_UI_ReferencedBeanType_referencedBeanClass_feature = Referenced Bean Class
-_UI_ReferencedBeanType_referencedBeanName_feature = Referenced Bean Name
-_UI_RendererExtensionType_mixed_feature = Mixed
-_UI_RendererExtensionType_group_feature = Group
-_UI_RendererExtensionType_any_feature = Any
-_UI_RendererExtensionType_id_feature = Id
-_UI_RendererType_description_feature = Description
-_UI_RendererType_displayName_feature = Display Name
-_UI_RendererType_icon_feature = Icon
-_UI_RendererType_attribute_feature = Attribute
-_UI_RendererType_supportedComponentType_feature = Supported Component Type
-_UI_RendererType_supportedComponentClass_feature = Supported Component Class
-_UI_RendererType_rendererExtension_feature = Renderer Extension
-_UI_RendererType_id_feature = Id
-_UI_RendererType_rendererClass_feature = Renderer Class
-_UI_RendererType_rendererType_feature = Renderer Type
-_UI_RenderKitFactoryType_value_feature = Value
-_UI_RenderKitFactoryType_id_feature = Id
-_UI_RenderKitType_description_feature = Description
-_UI_RenderKitType_displayName_feature = Display Name
-_UI_RenderKitType_icon_feature = Icon
-_UI_RenderKitType_renderer_feature = Renderer
-_UI_RenderKitType_id_feature = Id
-_UI_RenderKitType_renderKitClass_feature = Render Kit Class
-_UI_RenderKitType_renderKitId_feature = Render Kit Id
-_UI_StateManagerType_value_feature = Value
-_UI_StateManagerType_id_feature = Id
-_UI_SupportedComponentClassType_componentClass_feature = Component Class
-_UI_SupportedComponentClassType_attributeName_feature = Attribute Name
-_UI_SupportedComponentClassType_id_feature = Id
-_UI_SupportedComponentTypeType_componentType_feature = Component Type
-_UI_SupportedComponentTypeType_attributeName_feature = Attribute Name
-_UI_SupportedComponentTypeType_id_feature = Id
-_UI_SupportedLocaleType_value_feature = Value
-_UI_SupportedLocaleType_id_feature = Id
-_UI_ValidatorType_description_feature = Description
-_UI_ValidatorType_displayName_feature = Display Name
-_UI_ValidatorType_icon_feature = Icon
-_UI_ValidatorType_attribute_feature = Attribute
-_UI_ValidatorType_property_feature = Property
-_UI_ValidatorType_id_feature = Id
-_UI_ValidatorType_validatorClass_feature = Validator Class
-_UI_ValidatorType_validatorId_feature = Validator Id
-_UI_ValueType_value_feature = Value
-_UI_ValueType_id_feature = Id
-_UI_VariableResolverType_value_feature = Value
-_UI_VariableResolverType_id_feature = Id
-_UI_ViewHandlerType_value_feature = Value
-_UI_ViewHandlerType_id_feature = Id
-_UI_Unknown_feature = Unspecified
-
-scValidation_duplicate_definition=Duplicate {0} {1}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AbsoluteOrderingTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AbsoluteOrderingTranslator.java
deleted file mode 100644
index 9b0475f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AbsoluteOrderingTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class AbsoluteOrderingTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public AbsoluteOrderingTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new NameTranslator("name", facesPackage.getAbsoluteOrderingType_Name()), //$NON-NLS-1$
-				new OrderingOthersTranslator("others", facesPackage.getAbsoluteOrderingType_Others()) //$NON-NLS-1$
-//				new Translator("id", facesPackage.getAbsoluteOrderingType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ActionListenerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ActionListenerTranslator.java
deleted file mode 100644
index a1e0617..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ActionListenerTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ActionListenerTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ActionListenerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getActionListenerType_TextContent()),
-			new Translator("id", facesPackage.getActionListenerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationExtensionTranslator.java
deleted file mode 100644
index 5fa3beb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationExtensionTranslator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Transtor for application extensions
- * 
- * @author cbateman
- *
- */
-public class ApplicationExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public ApplicationExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationFactoryTranslator.java
deleted file mode 100644
index 333ac00..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ApplicationFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath 
-	 * @param aFeature 
-	 */
-	public ApplicationFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getApplicationFactoryType_TextContent()),
-			new Translator("id", facesPackage.getApplicationFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationTranslator.java
deleted file mode 100644
index 5a396ac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ApplicationTranslator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class ApplicationTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ApplicationTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new ActionListenerTranslator("action-listener", facesPackage.getApplicationType_ActionListener()), //$NON-NLS-1$
-				new DefaultRenderKitIdTranslator("default-render-kit-id", facesPackage.getApplicationType_DefaultRenderKitId()), //$NON-NLS-1$
-				new MessageBundleTranslator("message-bundle", facesPackage.getApplicationType_MessageBundle()), //$NON-NLS-1$
-				new NavigationHandlerTranslator("navigation-handler", facesPackage.getApplicationType_NavigationHandler()), //$NON-NLS-1$
-//				new PartialTraversalTranslator("partial-traversal", facesPackage.getApplicationType_PartialTraversal()), //$NON-NLS-1$
-				new ViewHandlerTranslator("view-handler", facesPackage.getApplicationType_ViewHandler()), //$NON-NLS-1$
-				new StateManagerTranslator("state-manager", facesPackage.getApplicationType_StateManager()), //$NON-NLS-1$
-                new ELResolverTypeTranslator("el-resolver", facesPackage.getApplicationType_ELResolver()), //$NON-NLS-1$
-				new PropertyResolverTranslator("property-resolver", facesPackage.getApplicationType_PropertyResolver()), //$NON-NLS-1$
-				new VariableResolverTranslator("variable-resolver", facesPackage.getApplicationType_VariableResolver()), //$NON-NLS-1$
-				new ResourceHandlerTranslator("resource-handler", facesPackage.getApplicationType_ResourceHandler()), //$NON-NLS-1$
-				new SystemEventListenerTranslator("system-event-listener", facesPackage.getApplicationType_SystemEventListener()), //$NON-NLS-1$
-				new LocaleConfigTranslator("locale-config", facesPackage.getApplicationType_LocaleConfig()), //$NON-NLS-1$
-                new ResourceBundleTranslator("resource-bundle", facesPackage.getApplicationType_ResourceBundle()), //$NON-NLS-1$
-                new ApplicationExtensionTranslator("application-extension", facesPackage.getApplicationType_ApplicationExtension()), //$NON-NLS-1$
-				new DefaultValidatorsTranslator("default-validators", facesPackage.getApplicationType_DefaultValidators()), //$NON-NLS-1$
-				new Translator("id", facesPackage.getApplicationType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeClassTranslator.java
deleted file mode 100644
index fd9ca23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for attributes
- *
- */
-public class AttributeClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public AttributeClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getAttributeClassType_TextContent()),
-			new Translator("id", facesPackage.getAttributeClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeExtensionTranslator.java
deleted file mode 100644
index cc99005..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeExtensionTranslator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class AttributeExtensionTranslator extends ExtensionTypeTranslator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public AttributeExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeNameTranslator.java
deleted file mode 100644
index 71ee9f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeNameTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for attribute names
- * 
- * @author cbateman
- *
- */
-public class AttributeNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public AttributeNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getAttributeNameType_TextContent()),
-			new Translator("id", facesPackage.getAttributeNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeTranslator.java
deleted file mode 100644
index 3916ed1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/AttributeTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class AttributeTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public AttributeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getAttributeType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getAttributeType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getAttributeType_Icon()), //$NON-NLS-1$
-			new AttributeNameTranslator("attribute-name", facesPackage.getAttributeType_AttributeName()), //$NON-NLS-1$
-			new AttributeClassTranslator("attribute-class", facesPackage.getAttributeType_AttributeClass()), //$NON-NLS-1$
-			new DefaultValueTranslator("default-value", facesPackage.getAttributeType_DefaultValue()), //$NON-NLS-1$
-			new SuggestedValueTranslator("suggested-value", facesPackage.getAttributeType_SuggestedValue()), //$NON-NLS-1$
-			new AttributeExtensionTranslator("attribute-extension", facesPackage.getAttributeType_AttributeExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getAttributeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BaseNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BaseNameTranslator.java
deleted file mode 100644
index b5296cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BaseNameTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the base name on a message bundle
- * 
- * @author cbateman
- *
- */
-public class BaseNameTranslator extends Translator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public BaseNameTranslator(String domNameAndPath, EStructuralFeature feature) {
-        super(domNameAndPath, feature, END_TAG_NO_INDENT);
-    }
-
-    public Translator[] getChildren()
-    {
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-
-        return new Translator[] {
-            new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getBaseNameType_TextContent()),
-            new Translator("id", facesPackage.getBaseNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorClassTranslator.java
deleted file mode 100644
index 90bb48c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorClassTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class BehaviorClassTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public BehaviorClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getBehaviorClassType_TextContent()),
-			new Translator("id", facesPackage.getBehaviorClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorExtensionTranslator.java
deleted file mode 100644
index a7d452f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorExtensionTranslator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Transtor for application extensions
- * 
- * @author cbateman
- *
- */
-public class BehaviorExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public BehaviorExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorIdTranslator.java
deleted file mode 100644
index 8d45df5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the validator id
- *
- */
-public class BehaviorIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public BehaviorIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getBehaviorIdType_TextContent()),
-			new Translator("id", facesPackage.getBehaviorIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorTranslator.java
deleted file mode 100644
index c72342d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/BehaviorTranslator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class BehaviorTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public BehaviorTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new DescriptionTranslator("description", facesPackage.getBehaviorType_Description()), //$NON-NLS-1$
-				new DisplayNameTranslator("display-name", facesPackage.getBehaviorType_DisplayName()), //$NON-NLS-1$
-				new IconTranslator("icon", facesPackage.getBehaviorType_Icon()), //$NON-NLS-1$
-                new BehaviorIdTranslator("behavior-id", facesPackage.getBehaviorType_BehaviorId()), //$NON-NLS-1$
-                new BehaviorClassTranslator("behavior-class", facesPackage.getBehaviorType_BehaviorClass()), //$NON-NLS-1$
-                new AttributeTranslator("attribute", facesPackage.getBehaviorType_Attribute()), //$NON-NLS-1$
-                new PropertyTranslator("property", facesPackage.getBehaviorType_Property()), //$NON-NLS-1$
-                new BehaviorExtensionTranslator("behavior-extension", facesPackage.getBehaviorType_BehaviorExtension()) //$NON-NLS-1$
-				//new Translator("id", facesPackage.getBehaviorType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererClassTranslator.java
deleted file mode 100644
index 2c64b67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererClassTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ClientBehaviorRendererClassTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ClientBehaviorRendererClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getClientBehaviorRendererClassType_TextContent()),
-			new Translator("id", facesPackage.getClientBehaviorRendererClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTranslator.java
deleted file mode 100644
index ac3279c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ClientBehaviorRendererTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ClientBehaviorRendererTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-            new ClientBehaviorRendererTypeTranslator("client-behavior-renderer-type", facesPackage.getClientBehaviorRendererType_ClientBehaviorRendererType()), //$NON-NLS-1$
-            new ClientBehaviorRendererClassTranslator("client-behavior-renderer-class", facesPackage.getClientBehaviorRendererType_ClientBehaviorRendererClass()) //$NON-NLS-1$
-			//new Translator("id", facesPackage.getClientBehaviorRendererType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTypeTranslator.java
deleted file mode 100644
index 2ddd9ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ClientBehaviorRendererTypeTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ClientBehaviorRendererTypeTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ClientBehaviorRendererTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getClientBehaviorRendererTypeType_TextContent()),
-			new Translator("id", facesPackage.getClientBehaviorRendererTypeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentClassTranslator.java
deleted file mode 100644
index 1a10fd7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentClassTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Component class translator
- * 
- * @author cbateman
- *
- */
-public class ComponentClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ComponentClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getComponentClassType_TextContent()),
-			new Translator("id", facesPackage.getComponentClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentExtensionTranslator.java
deleted file mode 100644
index 759aa58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentExtensionTranslator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class ComponentExtensionTranslator extends ExtensionTypeTranslator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ComponentExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentFamilyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentFamilyTranslator.java
deleted file mode 100644
index ac615d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentFamilyTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the component family property
- * @author cbateman
- *
- */
-public class ComponentFamilyTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ComponentFamilyTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getComponentFamilyType_TextContent()),
-			new Translator("id", facesPackage.getComponentFamilyType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTranslator.java
deleted file mode 100644
index 437f644..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTranslator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ComponentTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ComponentTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getComponentType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getComponentType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getComponentType_Icon()), //$NON-NLS-1$
-			new ComponentTypeTranslator("component-type", facesPackage.getComponentType_ComponentType()), //$NON-NLS-1$
-			new ComponentClassTranslator("component-class", facesPackage.getComponentType_ComponentClass()), //$NON-NLS-1$
-			new FacetTranslator("facet", facesPackage.getComponentType_Facet()), //$NON-NLS-1$
-			new AttributeTranslator("attribute", facesPackage.getComponentType_Attribute()), //$NON-NLS-1$
-			new PropertyTranslator("property", facesPackage.getComponentType_Property()), //$NON-NLS-1$
-			new ComponentExtensionTranslator("component-extension", facesPackage.getComponentType_ComponentExtension()),//ComponentExtensionTranslator("component-extension", facesPackage.getComponentType_ComponentExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getComponentType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTypeTranslator.java
deleted file mode 100644
index e489cbf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ComponentTypeTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translater of components
- *
- */
-public class ComponentTypeTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ComponentTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getComponentTypeType_TextContent()),
-			new Translator("id", facesPackage.getComponentTypeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterClassTranslator.java
deleted file mode 100644
index c1f6221..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for converters
- *
- */
-public class ConverterClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ConverterClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getConverterClassType_TextContent()),
-			new Translator("id", facesPackage.getConverterClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterExtensionTranslator.java
deleted file mode 100644
index 66f8292..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterExtensionTranslator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for extension data on converters
- * 
- * @author cbateman
- *
- */
-public class ConverterExtensionTranslator extends ExtensionTypeTranslator 
-{
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public ConverterExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) 
-    {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterForClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterForClassTranslator.java
deleted file mode 100644
index 31f603c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterForClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * ConverterForClass translator
- *
- */
-public class ConverterForClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ConverterForClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getConverterForClassType_TextContent()),
-			new Translator("id", facesPackage.getConverterForClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterIdTranslator.java
deleted file mode 100644
index b0a8a19..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for converter id
- *
- */
-public class ConverterIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ConverterIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getConverterIdType_TextContent()),
-			new Translator("id", facesPackage.getConverterIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterTranslator.java
deleted file mode 100644
index 11a0c68..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ConverterTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ConverterTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ConverterTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getConverterType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getConverterType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getConverterType_Icon()), //$NON-NLS-1$
-			new ConverterIdTranslator("converter-id", facesPackage.getConverterType_ConverterId()), //$NON-NLS-1$
-			new ConverterForClassTranslator("converter-for-class", facesPackage.getConverterType_ConverterForClass()), //$NON-NLS-1$
-			new ConverterClassTranslator("converter-class", facesPackage.getConverterType_ConverterClass()), //$NON-NLS-1$
-			new AttributeTranslator("attribute", facesPackage.getConverterType_Attribute()), //$NON-NLS-1$
-			new PropertyTranslator("property", facesPackage.getConverterType_Property()), //$NON-NLS-1$
-            new ConverterExtensionTranslator("converter-extension", facesPackage.getConverterType_ConverterExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getConverterType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultLocaleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultLocaleTranslator.java
deleted file mode 100644
index bf74445..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultLocaleTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for default locale
- *
- */
-public class DefaultLocaleTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DefaultLocaleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDefaultLocaleType_TextContent()),
-			new Translator("id", facesPackage.getDefaultLocaleType_Id(), DOM_ATTRIBUTE)//$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultRenderKitIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultRenderKitIdTranslator.java
deleted file mode 100644
index bbd9307..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultRenderKitIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class DefaultRenderKitIdTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DefaultRenderKitIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDefaultRenderKitIdType_TextContent()),
-			new Translator("id", facesPackage.getDefaultRenderKitIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValidatorsTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValidatorsTranslator.java
deleted file mode 100644
index de93d93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValidatorsTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class DefaultValidatorsTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DefaultValidatorsTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new ValidatorIdTranslator("validator-id", facesPackage.getDefaultValidatorsType_ValidatorId()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getDefaultValidatorsType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValueTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValueTranslator.java
deleted file mode 100644
index cb23479..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DefaultValueTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for default values
- *
- */
-public class DefaultValueTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DefaultValueTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDefaultValueType_TextContent()),
-			new Translator("id", facesPackage.getDefaultValueType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DescriptionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DescriptionTranslator.java
deleted file mode 100644
index d6faf0d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DescriptionTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added text content and id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class DescriptionTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DescriptionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDescriptionType_TextContent()),
-			new Translator("xml:lang", facesPackage.getDescriptionType_Lang(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getDescriptionType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DisplayNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DisplayNameTranslator.java
deleted file mode 100644
index e48a3c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DisplayNameTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added text content and id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class DisplayNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public DisplayNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getDisplayNameType_TextContent()),
-			new Translator("xml:lang", facesPackage.getDisplayNameType_Lang(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getDisplayNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DynamicElementTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DynamicElementTranslator.java
deleted file mode 100644
index d6173a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/DynamicElementTranslator.java
+++ /dev/null
@@ -1,496 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicAttribute;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.ReadAheadHelper;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorPath;
-import org.eclipse.wst.common.internal.emf.resource.VariableTranslatorFactory;
-import org.w3c.dom.Attr;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-class DynamicElementTranslator extends Translator implements IAnyTranslator
-{
-    public boolean isManagedByParent() {
-        return false;
-    }
-
-    protected Translator[] getChildren() 
-    {
-        FacesConfigPackage facesConfigPackage = FacesConfigPackage.eINSTANCE;
-
-        return new Translator[]
-        {
-            new DynamicElementTranslator("*", facesConfigPackage.getDynamicElement_ChildNodes()), //$NON-NLS-1$
-            new Translator(TEXT_ATTRIBUTE_VALUE, facesConfigPackage.getDynamicElement_TextContent())
-            {
-                public Object getMOFValue(EObject object)
-                {
-                    // TODO: this is a bit of a hack.  The problem is
-                    // that for some reason, if this translator returns
-                    // null, then EMF2DOMAdapterImpl.updateDOMSubtree will
-                    // remove the containing DynamicElement node completely.
-                    // Returning an non-null empty value seems to work
-                    // around this for now.
-                    Object value = super.getMOFValue(object);
-                    return value != null ? value : ""; //$NON-NLS-1$
-                }
-            }
-        };
-    }
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public DynamicElementTranslator(String domNameAndPath,
-            EStructuralFeature feature) 
-    {
-        super(domNameAndPath, feature);
-    }
-    public boolean isMapFor(String domName) {
-        return true;
-    }
-    
-    public EObject createEMFObject(String nodeName, String readAheadName) {
-        // tag name is based on the name property
-        DynamicElement element = FacesConfigFactory.eINSTANCE.createDynamicElement();
-        element.setName(nodeName);
-        return element;
-    }
-
-    public String getDOMName(Object value) {
-        // tag name is based on the name property
-        if (value instanceof DynamicElement)
-        {
-            return ((DynamicElement)value).getName();
-        }
-        return ""; //$NON-NLS-1$
-    }
-
-    public Translator[] getDynamicAttributeTranslators(Node element) {
-        NamedNodeMap attributeMap = element.getAttributes();
-        List attributes = new ArrayList(attributeMap.getLength());
-        for (int i = 0; i < attributeMap.getLength(); i++)
-        {
-            Attr attr = (Attr) attributeMap.item(i);
-            attributes.add(
-                    new DynamicAttributeTranslator(attr.getNodeName(),
-                            FacesConfigPackage.eINSTANCE.getDynamicElement_Attributes()));
-        }
-        
-        return (Translator[]) attributes.toArray(new Translator[0]);
-    }
-    
-    public Translator[] getDynamicAttributeTranslators(DynamicElement element) {
-        List attributes = element.getAttributes();
-        Translator[] translators = new Translator[attributes.size()];
-        int i = 0;
-        for (Iterator it = attributes.iterator(); it.hasNext();)
-        {
-            DynamicAttribute attribute = (DynamicAttribute) it.next();
-            translators[i++] = new DynamicAttributeTranslator(attribute.getName(),
-                    FacesConfigPackage.eINSTANCE.getDynamicElement_Attributes());
-        }
-        return translators;
-    }
-
-    private static class DynamicAttributeTranslator extends Translator
-    {
-
-        /**
-         * @param domNameAndPath
-         * @param feature
-         */
-        public DynamicAttributeTranslator(String domNameAndPath, EStructuralFeature feature) 
-        {
-            // the "*" is a place holder.  The dom path gets ignored in
-            // this translator.  It's a handy one because it is invalid
-            // tag name data so if it gets transmitted to the model
-            // we will get an exception
-            super(domNameAndPath, feature, DOM_ATTRIBUTE);
-        }
-        
-        public boolean isMapFor(String domName) {
-            return super.isMapFor(domName);
-        }
-        
-        public EObject createEMFObject(String nodeName, String readAheadName) {
-            // attribute name is based on the name property
-            DynamicAttribute attribute = FacesConfigFactory.eINSTANCE.createDynamicAttribute();
-            attribute.setName(nodeName);
-            return attribute;
-        }
-        
-        protected Translator[] getChildren() {
-            return new Translator[0];
-        }
-
-        public void addReadAheadHelper(ReadAheadHelper helper) {
-            // TODO Auto-generated method stub
-            super.addReadAheadHelper(helper);
-        }
-
-        public EObject basicGetDependencyObject(EObject parent) {
-            // TODO Auto-generated method stub
-            return super.basicGetDependencyObject(parent);
-        }
-
-        public void clearList(EObject mofObject) {
-            // TODO Auto-generated method stub
-            super.clearList(mofObject);
-        }
-
-        public Object convertStringToValue(String strValue, EObject owner) {
-            // TODO Auto-generated method stub
-            return super.convertStringToValue(strValue, owner);
-        }
-
-        public Object convertStringToValue(String nodeName,
-                String readAheadName, String value, Notifier owner) {
-            // TODO Auto-generated method stub
-            return super.convertStringToValue(nodeName, readAheadName, value, owner);
-        }
-
-        public String convertValueToString(Object value, EObject owner) {
-            // TODO Auto-generated method stub
-            return super.convertValueToString(value, owner);
-        }
-
-        public boolean equals(Object object) {
-            // TODO Auto-generated method stub
-            return super.equals(object);
-        }
-
-        public String extractStringValue(EObject emfObject) {
-            // TODO Auto-generated method stub
-            return super.extractStringValue(emfObject);
-        }
-
-        public boolean featureExists(EObject emfObject) {
-            // TODO Auto-generated method stub
-            return super.featureExists(emfObject);
-        }
-
-        public Translator findChild(String tagName, Object target, int versionID) {
-            // TODO Auto-generated method stub
-            return super.findChild(tagName, target, versionID);
-        }
-
-        public Translator[] getChildren(Object target, int versionID) {
-            // TODO Auto-generated method stub
-            return super.getChildren(target, versionID);
-        }
-
-        public EStructuralFeature getDependencyFeature() {
-            // TODO Auto-generated method stub
-            return super.getDependencyFeature();
-        }
-
-        public String[] getDOMNames() {
-            // TODO Auto-generated method stub
-            return super.getDOMNames();
-        }
-
-        public String getDOMPath() {
-            // TODO Auto-generated method stub
-            return super.getDOMPath();
-        }
-
-        public EStructuralFeature getFeature() {
-            // TODO Auto-generated method stub
-            return super.getFeature();
-        }
-
-        public List getMOFChildren(EObject mofObject) {
-            // TODO Auto-generated method stub
-            return super.getMOFChildren(mofObject);
-        }
-
-        public Object getMOFValue(EObject mofObject) {
-            if (mofObject instanceof DynamicElement)
-            {
-                EList attributes = ((DynamicElement)mofObject).getAttributes();
-                
-                for (final Iterator it = attributes.iterator(); it.hasNext();)
-                {
-                    DynamicAttribute attribute = (DynamicAttribute) it.next();
-                    if (fDOMNames[0].equals(attribute.getName()))
-                    {
-                        return attribute.getValue();
-                    }
-                }
-            }
-            
-            return null;
-        }
-
-        public String getNameSpace() {
-            // TODO Auto-generated method stub
-            return super.getNameSpace();
-        }
-
-        public ReadAheadHelper getReadAheadHelper(String parentName) {
-            // TODO Auto-generated method stub
-            return super.getReadAheadHelper(parentName);
-        }
-
-        public TranslatorPath[] getTranslatorPaths() {
-            // TODO Auto-generated method stub
-            return super.getTranslatorPaths();
-        }
-
-        public Translator[] getVariableChildren(Notifier target, int version) {
-            // TODO Auto-generated method stub
-            return super.getVariableChildren(target, version);
-        }
-
-        public VariableTranslatorFactory getVariableTranslatorFactory() {
-            // TODO Auto-generated method stub
-            return super.getVariableTranslatorFactory();
-        }
-
-        public boolean hasDOMPath() {
-            // TODO Auto-generated method stub
-            return super.hasDOMPath();
-        }
-
-        public boolean hasReadAheadNames() {
-            // TODO Auto-generated method stub
-            return super.hasReadAheadNames();
-        }
-
-        protected void initializeDOMNameAndPath(String domNameAndPathArg) {
-            // TODO Auto-generated method stub
-            super.initializeDOMNameAndPath(domNameAndPathArg);
-        }
-
-        public boolean isBooleanFeature() {
-            // TODO Auto-generated method stub
-            return super.isBooleanFeature();
-        }
-
-        public boolean isBooleanUppercase() {
-            // TODO Auto-generated method stub
-            return super.isBooleanUppercase();
-        }
-
-        public boolean isCDATAContent() {
-            // TODO Auto-generated method stub
-            return super.isCDATAContent();
-        }
-
-        public boolean isComment() {
-            // TODO Auto-generated method stub
-            return super.isComment();
-        }
-
-        public boolean isDataType() {
-            // TODO Auto-generated method stub
-            return super.isDataType();
-        }
-
-        public boolean isDependencyChild() {
-            // TODO Auto-generated method stub
-            return super.isDependencyChild();
-        }
-
-        public boolean isDependencyParent() {
-            // TODO Auto-generated method stub
-            return super.isDependencyParent();
-        }
-
-        public boolean isDOMAttribute() {
-            // TODO Auto-generated method stub
-            return super.isDOMAttribute();
-        }
-
-        public boolean isDOMTextValue() {
-            // TODO Auto-generated method stub
-            return super.isDOMTextValue();
-        }
-
-        public boolean isEmptyContentSignificant() {
-            // TODO Auto-generated method stub
-            return super.isEmptyContentSignificant();
-        }
-
-        public boolean isEmptyTag() {
-            // TODO Auto-generated method stub
-            return super.isEmptyTag();
-        }
-
-        public boolean isEnumFeature() {
-            // TODO Auto-generated method stub
-            return super.isEnumFeature();
-        }
-
-        public boolean isEnumWithHyphens() {
-            // TODO Auto-generated method stub
-            return super.isEnumWithHyphens();
-        }
-
-        public boolean isIDMap() {
-            // TODO Auto-generated method stub
-            return super.isIDMap();
-        }
-
-        public boolean isLinkMap() {
-            // TODO Auto-generated method stub
-            return super.isLinkMap();
-        }
-
-        public boolean isManagedByParent() {
-            // TODO Auto-generated method stub
-            return super.isManagedByParent();
-        }
-
-        public boolean isMapFor(Object feature1, Object oldValue, Object newValue) {
-            return super.isMapFor(feature1, oldValue, newValue);
-        }
-
-        public boolean isMultiValued() {
-            // we want to treat each attribute as a single value
-            return false;
-        }
-
-        public boolean isObjectMap() {
-            // TODO Auto-generated method stub
-            return super.isObjectMap();
-        }
-
-        public boolean isSetMOFValue(EObject emfObject) {
-            // TODO Auto-generated method stub
-            return super.isSetMOFValue(emfObject);
-        }
-
-        public boolean isShared() {
-            // TODO Auto-generated method stub
-            return super.isShared();
-        }
-
-        public boolean isTargetLinkMap() {
-            // TODO Auto-generated method stub
-            return super.isTargetLinkMap();
-        }
-
-        public boolean isUnsettable() {
-            // TODO Auto-generated method stub
-            return super.isUnsettable();
-        }
-
-        protected String[] parseDOMNames(String domNamesString) {
-            // TODO Auto-generated method stub
-            return super.parseDOMNames(domNamesString);
-        }
-
-        public void removeMOFValue(Notifier owner, Object value) {
-            // TODO Auto-generated method stub
-            super.removeMOFValue(owner, value);
-        }
-
-        protected void setEMFClass(EClass anEClass) {
-            // TODO Auto-generated method stub
-            super.setEMFClass(anEClass);
-        }
-
-        protected void setFeature(EStructuralFeature feature) {
-            // TODO Auto-generated method stub
-            super.setFeature(feature);
-        }
-
-        public void setMOFValue(Notifier owner, Object value, int newIndex) {
-            if (owner instanceof DynamicElement)
-            {
-                DynamicAttribute attribute = FacesConfigFactory.eINSTANCE.createDynamicAttribute();
-                attribute.setName(fDOMNames[0]);
-                attribute.setValue(value.toString());
-
-                EList attributes = ((DynamicElement)owner).getAttributes();
-                if (newIndex < 0 || newIndex >= attributes.size())
-                {
-                    attributes.add(attribute);
-                }
-                else
-                {
-                    attributes.set(newIndex, attribute);
-                }
-            }
-            // otherwise do nothing
-        }
-
-        public void setMOFValue(Notifier owner, Object value) {
-            // TODO Auto-generated method stub
-            super.setMOFValue(owner, value);
-        }
-
-        public void setMOFValue(Resource res, Object value) {
-            // TODO Auto-generated method stub
-            super.setMOFValue(res, value);
-        }
-
-        public void setMOFValueFromEmptyDOMPath(EObject object) {
-            // TODO Auto-generated method stub
-            super.setMOFValueFromEmptyDOMPath(object);
-        }
-
-        public void setNameSpace(String string) {
-            // TODO Auto-generated method stub
-            super.setNameSpace(string);
-        }
-
-        public void setTextValueIfNecessary(String textValue, Notifier owner,
-                int versionId) {
-            // TODO Auto-generated method stub
-            super.setTextValueIfNecessary(textValue, owner, versionId);
-        }
-
-        public boolean shouldIndentEndTag() {
-            // TODO Auto-generated method stub
-            return super.shouldIndentEndTag();
-        }
-
-        public boolean shouldRenderEmptyDOMPath(EObject object) {
-            // TODO Auto-generated method stub
-            return super.shouldRenderEmptyDOMPath(object);
-        }
-
-        public String toString() {
-            // TODO Auto-generated method stub
-            return super.toString();
-        }
-
-        public void unSetMOFValue(EObject emfObject) {
-            // TODO Auto-generated method stub
-            super.unSetMOFValue(emfObject);
-        }
-        
-        
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ELResolverTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ELResolverTypeTranslator.java
deleted file mode 100644
index 9aabe6e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ELResolverTypeTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * The el-resolver translator
- *
- */
-public class ELResolverTypeTranslator extends Translator {
-    /**
-     * @param domNameAndPath
-     * @param aFeature
-     */
-    public ELResolverTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-        super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-     */
-    public Translator[] getChildren() {
-        
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-        return new Translator[] {
-            new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPropertyResolverType_TextContent()),
-            new Translator("id", facesPackage.getPropertyResolverType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExceptionHandlerFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExceptionHandlerFactoryTranslator.java
deleted file mode 100644
index 41a24fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExceptionHandlerFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ExceptionHandlerFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ExceptionHandlerFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getExceptionHandlerFactoryType_TextContent()),
-			new Translator("id", facesPackage.getExceptionHandlerFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExtensionTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExtensionTypeTranslator.java
deleted file mode 100644
index eca0e57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExtensionTypeTranslator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for extension types
- *
- */
-public abstract class ExtensionTypeTranslator extends Translator 
-{
-    /**
-     * @param domNameAndPath
-     * @param aFeature
-     */
-    public ExtensionTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) 
-    {
-        super(domNameAndPath, aFeature);
-    }
-    
-    public Translator[] getChildren() {
-        
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-        return new Translator[] {
-              new Translator("id", facesPackage.getExtensionType_Id(), DOM_ATTRIBUTE), //$NON-NLS-1$
-              new DynamicElementTranslator("*", facesPackage.getExtensionType_ChildNodes()) //$NON-NLS-1$
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExternalContextFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExternalContextFactoryTranslator.java
deleted file mode 100644
index 7103916..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ExternalContextFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ExternalContextFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ExternalContextFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getExternalContextFactoryType_TextContent()),
-			new Translator("id", facesPackage.getExternalContextFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigExtensionTranslator.java
deleted file mode 100644
index b5819cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for FacesConfig extension data
- *
- */
-public class FacesConfigExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public FacesConfigExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigTranslator.java
deleted file mode 100644
index 599927e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesConfigTranslator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.RootTranslator;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class FacesConfigTranslator extends RootTranslator {
-	
-	/**
-	 * Instance of translator
-	 */
-	public static FacesConfigTranslator INSTANCE = new FacesConfigTranslator();
-
-    /**
-     * Default constructor
-     */
-    public FacesConfigTranslator() {
-		super("faces-config", FacesConfigPackage.eINSTANCE.getFacesConfigType()); //$NON-NLS-1$
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new ApplicationTranslator("application", facesPackage.getFacesConfigType_Application()), //$NON-NLS-1$
-				new OrderingTranslator("ordering", facesPackage.getFacesConfigType_Ordering()), //$NON-NLS-1$
-				new AbsoluteOrderingTranslator("absolute-ordering", facesPackage.getFacesConfigType_AbsoluteOrdering()), //$NON-NLS-1$
-				new FactoryTranslator("factory", facesPackage.getFacesConfigType_Factory()), //$NON-NLS-1$
-				new ComponentTranslator("component", facesPackage.getFacesConfigType_Component()), //$NON-NLS-1$
-				new ConverterTranslator("converter", facesPackage.getFacesConfigType_Converter()), //$NON-NLS-1$
-				new ManagedBeanTranslator("managed-bean", facesPackage.getFacesConfigType_ManagedBean()), //$NON-NLS-1$
-				new NameTranslator("name", facesPackage.getFacesConfigType_Name()), //$NON-NLS-1$
-				new NavigationRuleTranslator("navigation-rule", facesPackage.getFacesConfigType_NavigationRule()), //$NON-NLS-1$
-				new ReferencedBeanTranslator("referenced-bean", facesPackage.getFacesConfigType_ReferencedBean()), //$NON-NLS-1$
-				new RenderKitTranslator("render-kit", facesPackage.getFacesConfigType_RenderKit()), //$NON-NLS-1$
-				new LifecycleTranslator("lifecycle", facesPackage.getFacesConfigType_Lifecycle()), //$NON-NLS-1$
-				new ValidatorTranslator("validator", facesPackage.getFacesConfigType_Validator()), //$NON-NLS-1$
-				new BehaviorTranslator("behavior", facesPackage.getFacesConfigType_Behavior()), //$NON-NLS-1$
-				new FacesConfigExtensionTranslator("faces-config-extension", facesPackage.getFacesConfigType_FacesConfigExtension()), //$NON_NLS-1$ //$NON-NLS-1$
-				new Translator("xmlns", facesPackage.getFacesConfigType_Xmlns(), DOM_ATTRIBUTE), //$NON-NLS-1$
-				new Translator("metadata-complete", facesPackage.getFacesConfigType_MetadataComplete(), DOM_ATTRIBUTE), //$NON-NLS-1$
-				new Translator("id", facesPackage.getFacesConfigType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesContextFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesContextFactoryTranslator.java
deleted file mode 100644
index 8ad0eda..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacesContextFactoryTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class FacesContextFactoryTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FacesContextFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getFacesContextFactoryType_TextContent()),
-			new Translator("id", facesPackage.getFacesContextFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetExtensionTranslator.java
deleted file mode 100644
index 3cffc06..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetExtensionTranslator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Orcale Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class FacetExtensionTranslator extends ExtensionTypeTranslator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FacetExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetNameTranslator.java
deleted file mode 100644
index 81e5023..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetNameTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for facet name
- *
- */
-public class FacetNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FacetNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getFacetNameType_TextContent()),
-			new Translator("id", facesPackage.getFacetNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetTranslator.java
deleted file mode 100644
index 52f7b1f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FacetTranslator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class FacetTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FacetTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getFacetType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getFacetType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getFacetType_Icon()), //$NON-NLS-1$
-			new FacetNameTranslator("facet-name", facesPackage.getFacetType_FacetName()), //$NON-NLS-1$
-			new FacetExtensionTranslator("facet-extension", facesPackage.getFacetType_FacetExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getFacetType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryExtensionTranslator.java
deleted file mode 100644
index 0bdd623..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * The factory extension translator
- *
- */
-public class FactoryExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public FactoryExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryTranslator.java
deleted file mode 100644
index c49a70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FactoryTranslator.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author Eric Bordeau, itrimble
- */
-public class FactoryTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new ApplicationFactoryTranslator("application-factory", facesPackage.getFactoryType_ApplicationFactory()), //$NON-NLS-1$
-			new ExceptionHandlerFactoryTranslator("exception-handler-factory", facesPackage.getFactoryType_ExceptionHandlerFactory()), //$NON-NLS-1$
-			new ExternalContextFactoryTranslator("external-context-factory", facesPackage.getFactoryType_ExternalContextFactory()), //$NON-NLS-1$
-			new FacesContextFactoryTranslator("faces-context-factory", facesPackage.getFactoryType_FacesContextFactory()), //$NON-NLS-1$
-			new PartialViewContextFactoryTranslator("partial-view-context-factory", facesPackage.getFactoryType_PartialViewContextFactory()), //$NON-NLS-1$
-			new LifecycleFactoryTranslator("lifecycle-factory", facesPackage.getFactoryType_LifecycleFactory()), //$NON-NLS-1$
-			new ViewDeclarationLanguageFactoryTranslator("view-declaration-language-factory", facesPackage.getFactoryType_ViewDeclarationLanguageFactory()), //$NON-NLS-1$
-			new TagHandlerDelegateFactoryTranslator("tag-handler-delegate-factory", facesPackage.getFactoryType_TagHandlerDelegateFactory()), //$NON-NLS-1$
-			new RenderKitFactoryTranslator("render-kit-factory", facesPackage.getFactoryType_RenderKitFactory()), //$NON-NLS-1$
-			new VisitContextFactoryTranslator("visit-context-factory", facesPackage.getFactoryType_VisitContextFactory()), //$NON-NLS-1$
-            new FactoryExtensionTranslator("factory-extension", facesPackage.getFactoryType_FactoryExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromActionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromActionTranslator.java
deleted file mode 100644
index b792ce8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromActionTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for FromAction
- *
- */
-public class FromActionTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FromActionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getFromActionType_TextContent()),
-			new Translator("id", facesPackage.getFromActionType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromOutcomeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromOutcomeTranslator.java
deleted file mode 100644
index 9779b41..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromOutcomeTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for FromOutcome
- *
- */
-public class FromOutcomeTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FromOutcomeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getFromOutcomeType_TextContent()),
-			new Translator("id", facesPackage.getFromOutcomeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromViewIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromViewIdTranslator.java
deleted file mode 100644
index 2616e4a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/FromViewIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for FromViewId
- *
- */
-public class FromViewIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public FromViewIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getFromViewIdType_TextContent()),
-			new Translator("id", facesPackage.getFromViewIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IAnyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IAnyTranslator.java
deleted file mode 100644
index 06d0757..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IAnyTranslator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.w3c.dom.Node;
-
-/**
- * A translator that can handle the DTD ANY and XSD anyType XML
- * 
- * @author cbateman
- *
- */
-public interface IAnyTranslator {
-    /**
-     * Allows an ANY translator for elements to 
-     * dynamically inject attribute translators
-     * based on the contents of the Element node's
-     * runtime attribute values
-     * 
-     * @param element 
-     * @return a list of translators for attributes
-     * of dynamic elements
-     */
-    Translator[]  getDynamicAttributeTranslators(Node element);
-    
-    /**
-     * Allows an ANY translator for elements to
-     * dynamically inject attribute translators
-     * based on the contents of an DynamicElement that
-     * may not already be in the corresponding DOM element
-     * 
-     * @param element
-     * @return a list of translators for attributes of dynamic elements
-     */
-    Translator[]  getDynamicAttributeTranslators(DynamicElement element);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IconTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IconTranslator.java
deleted file mode 100644
index 9f33f6a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IconTranslator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class IconTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public IconTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new SmallIconTranslator("small-icon", facesPackage.getIconType_SmallIcon()), //$NON-NLS-1$
-			new LargeIconTranslator("large-icon", facesPackage.getIconType_LargeIcon()), //$NON-NLS-1$
-			new Translator("xml:lang", facesPackage.getIconType_Lang(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getIconType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IfTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IfTranslator.java
deleted file mode 100644
index 3016a6b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/IfTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class IfTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public IfTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getIfType_TextContent()),
-			new Translator("id", facesPackage.getIfType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyClassTranslator.java
deleted file mode 100644
index 1c8f904..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyClassTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for key class property
- * 
- * @author cbateman
- *
- */
-public class KeyClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public KeyClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getKeyClassType_TextContent()),
-			new Translator("id", facesPackage.getKeyClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyTranslator.java
deleted file mode 100644
index 6d7f354..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/KeyTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for key property
- *
- */
-public class KeyTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public KeyTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getKeyType_TextContent()),
-			new Translator("id", facesPackage.getKeyType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LargeIconTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LargeIconTranslator.java
deleted file mode 100644
index 0c7e44c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LargeIconTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for large icon property
- *
- */
-public class LargeIconTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public LargeIconTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getLargeIconType_TextContent()),
-			new Translator("id", facesPackage.getLargeIconType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleExtensionTranslator.java
deleted file mode 100644
index c5c9f2d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for lifecycle extensions
- *
- */
-public class LifecycleExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public LifecycleExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleFactoryTranslator.java
deleted file mode 100644
index 0d06154..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleFactoryTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class LifecycleFactoryTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public LifecycleFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getLifecycleFactoryType_TextContent()),
-			new Translator("id", facesPackage.getLifecycleFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleTranslator.java
deleted file mode 100644
index c36905e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LifecycleTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author Eric Bordeau, itrimble
- */
-public class LifecycleTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public LifecycleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new PhaseListenerTranslator("phase-listener", facesPackage.getLifecycleType_PhaseListener()), //$NON-NLS-1$
-            new LifecycleExtensionTranslator("lifecycle-extension",facesPackage.getLifecycleType_LifecycleExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getLifecycleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ListEntriesTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ListEntriesTranslator.java
deleted file mode 100644
index c2093a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ListEntriesTranslator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ListEntriesTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ListEntriesTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new ValueClassTranslator("value-class", facesPackage.getListEntriesType_ValueClass()), //$NON-NLS-1$
-			new NullValueTranslator("null-value", facesPackage.getListEntriesType_NullValue()), //$NON-NLS-1$
-			new ValueTranslator("value", facesPackage.getListEntriesType_Value()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getListEntriesType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LocaleConfigTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LocaleConfigTranslator.java
deleted file mode 100644
index caed4ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/LocaleConfigTranslator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class LocaleConfigTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public LocaleConfigTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DefaultLocaleTranslator("default-locale", facesPackage.getLocaleConfigType_DefaultLocale()), //$NON-NLS-1$
-			new SupportedLocaleTranslator("supported-locale", facesPackage.getLocaleConfigType_SupportedLocale()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getLocaleConfigType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanClassTranslator.java
deleted file mode 100644
index 2317987..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the managed bean class
- *
- */
-public class ManagedBeanClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ManagedBeanClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getManagedBeanClassType_TextContent()),
-			new Translator("id", facesPackage.getManagedBeanClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanExtensionTranslator.java
deleted file mode 100644
index e3d967a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for managed bean extensions
- *
- */
-public class ManagedBeanExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public ManagedBeanExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanNameTranslator.java
deleted file mode 100644
index d2ded7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanNameTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for managed bean name
- *
- */
-public class ManagedBeanNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ManagedBeanNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getManagedBeanNameType_TextContent()),
-			new Translator("id", facesPackage.getManagedBeanNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanScopeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanScopeTranslator.java
deleted file mode 100644
index 7138a6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanScopeTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for managed bean scope
- *
- */
-public class ManagedBeanScopeTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ManagedBeanScopeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getManagedBeanScopeType_TextContent()),
-			new Translator("id", facesPackage.getManagedBeanScopeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanTranslator.java
deleted file mode 100644
index c306f6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedBeanTranslator.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ManagedBeanTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ManagedBeanTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getManagedBeanType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getManagedBeanType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getManagedBeanType_Icon()), //$NON-NLS-1$
-			new ManagedBeanNameTranslator("managed-bean-name", facesPackage.getManagedBeanType_ManagedBeanName()), //$NON-NLS-1$
-			new ManagedBeanClassTranslator("managed-bean-class", facesPackage.getManagedBeanType_ManagedBeanClass()), //$NON-NLS-1$
-			new ManagedBeanScopeTranslator("managed-bean-scope", facesPackage.getManagedBeanType_ManagedBeanScope()), //$NON-NLS-1$
-			new ManagedPropertyTranslator("managed-property", facesPackage.getManagedBeanType_ManagedProperty()), //$NON-NLS-1$
-			new MapEntriesTranslator("map-entries", facesPackage.getManagedBeanType_MapEntries()), //$NON-NLS-1$
-			new ListEntriesTranslator("list-entries", facesPackage.getManagedBeanType_ListEntries()), //$NON-NLS-1$
-            new ManagedBeanExtensionTranslator("managed-bean-extension", facesPackage.getManagedBeanType_ManagedBeanExtension()), //$NON-NLS-1$
-			new Translator("eager", facesPackage.getManagedBeanType_Eager(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getManagedBeanType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedPropertyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedPropertyTranslator.java
deleted file mode 100644
index 49198cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ManagedPropertyTranslator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ManagedPropertyTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ManagedPropertyTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getManagedPropertyType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getManagedPropertyType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getManagedPropertyType_Icon()), //$NON-NLS-1$
-			new PropertyNameTranslator("property-name", facesPackage.getManagedPropertyType_PropertyName()), //$NON-NLS-1$
-			new PropertyClassTranslator("property-class", facesPackage.getManagedPropertyType_PropertyClass()), //$NON-NLS-1$
-			new MapEntriesTranslator("map-entries", facesPackage.getManagedPropertyType_MapEntries()), //$NON-NLS-1$
-			new NullValueTranslator("null-value", facesPackage.getManagedPropertyType_NullValue()), //$NON-NLS-1$
-			new ValueTranslator("value", facesPackage.getManagedPropertyType_Value()), //$NON-NLS-1$
-			new ListEntriesTranslator("list-entries", facesPackage.getManagedPropertyType_ListEntries()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getManagedPropertyType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntriesTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntriesTranslator.java
deleted file mode 100644
index 40faec1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntriesTranslator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class MapEntriesTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public MapEntriesTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new KeyClassTranslator("key-class", facesPackage.getMapEntriesType_KeyClass()), //$NON-NLS-1$
-			new ValueClassTranslator("value-class", facesPackage.getMapEntriesType_ValueClass()), //$NON-NLS-1$
-			new MapEntryTranslator("map-entry", facesPackage.getMapEntriesType_MapEntry()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getMapEntriesType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntryTranslator.java
deleted file mode 100644
index d571502..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MapEntryTranslator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class MapEntryTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public MapEntryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new KeyTranslator("key", facesPackage.getMapEntryType_Key()), //$NON-NLS-1$
-			new NullValueTranslator("null-value", facesPackage.getMapEntryType_NullValue()), //$NON-NLS-1$
-			new ValueTranslator("value", facesPackage.getMapEntryType_Value()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getMapEntryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MessageBundleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MessageBundleTranslator.java
deleted file mode 100644
index d052df6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/MessageBundleTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class MessageBundleTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public MessageBundleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getMessageBundleType_TextContent()),
-			new Translator("id", facesPackage.getMessageBundleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NameTranslator.java
deleted file mode 100644
index 96bf3ba..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NameTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class NameTranslator extends Translator {
-	/**
-	 * @param domNameAndPath 
-	 * @param aFeature 
-	 */
-	public NameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getNameType_TextContent()),
-			new Translator("id", facesPackage.getNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationCaseTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationCaseTranslator.java
deleted file mode 100644
index 4d14702..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationCaseTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class NavigationCaseTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public NavigationCaseTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getNavigationCaseType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getNavigationCaseType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getNavigationCaseType_Icon()), //$NON-NLS-1$
-			new FromActionTranslator("from-action", facesPackage.getNavigationCaseType_FromAction()), //$NON-NLS-1$
-			new FromOutcomeTranslator("from-outcome", facesPackage.getNavigationCaseType_FromOutcome()), //$NON-NLS-1$
-			new IfTranslator("if", facesPackage.getNavigationCaseType_If()), //$NON-NLS-1$
-			new ToViewIdTranslator("to-view-id", facesPackage.getNavigationCaseType_ToViewId()), //$NON-NLS-1$
-			new RedirectTranslator("redirect", facesPackage.getNavigationCaseType_Redirect()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getNavigationCaseType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationHandlerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationHandlerTranslator.java
deleted file mode 100644
index 694a009..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationHandlerTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class NavigationHandlerTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public NavigationHandlerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getNavigationHandlerType_TextContent()),
-			new Translator("id", facesPackage.getNavigationHandlerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleExtensionTranslator.java
deleted file mode 100644
index f1c02f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleExtensionTranslator.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for navigation rule extensions
- *
- */
-public class NavigationRuleExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public NavigationRuleExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleTranslator.java
deleted file mode 100644
index f808698..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NavigationRuleTranslator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class NavigationRuleTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public NavigationRuleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getNavigationRuleType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getNavigationRuleType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getNavigationRuleType_Icon()), //$NON-NLS-1$
-			new FromViewIdTranslator("from-view-id", facesPackage.getNavigationRuleType_FromViewId()), //$NON-NLS-1$
-			new NavigationCaseTranslator("navigation-case", facesPackage.getNavigationRuleType_NavigationCase()), //$NON-NLS-1$
-            new NavigationRuleExtensionTranslator("navigation-rule-extension", facesPackage.getNavigationRuleType_NavigationRuleExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getNavigationRuleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NullValueTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NullValueTranslator.java
deleted file mode 100644
index e4507cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/NullValueTranslator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class NullValueTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public NullValueTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, EMPTY_TAG|END_TAG_NO_INDENT);
-	}
-
-	public boolean isSetMOFValue(EObject emfObject) {
-		return feature != null && emfObject.eIsSet(feature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator("id", facesPackage.getNullValueType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOrderingTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOrderingTranslator.java
deleted file mode 100644
index 3fd4531..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOrderingTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class OrderingOrderingTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public OrderingOrderingTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new NameTranslator("name", facesPackage.getOrderingOrderingType_Name()), //$NON-NLS-1$
-				new OrderingOthersTranslator("others", facesPackage.getOrderingOrderingType_Others()) //$NON-NLS-1$
-//				new Translator("id", facesPackage.getOrderingOrderingType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOthersTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOthersTranslator.java
deleted file mode 100644
index f7ab410..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingOthersTranslator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class OrderingOthersTranslator extends Translator {
-	/**
-	 * @param domNameAndPath 
-	 * @param aFeature 
-	 */
-	public OrderingOthersTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator("id", facesPackage.getOrderingOthersType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingTranslator.java
deleted file mode 100644
index 2aedd02..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/OrderingTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class OrderingTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public OrderingTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new OrderingOrderingTranslator("after", facesPackage.getOrderingType_After()), //$NON-NLS-1$
-				new OrderingOrderingTranslator("before", facesPackage.getOrderingType_Before()) //$NON-NLS-1$
-//				new Translator("id", facesPackage.getOrderingType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialTraversalTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialTraversalTranslator.java
deleted file mode 100644
index 02a8cef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialTraversalTranslator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class PartialTraversalTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PartialTraversalTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		return new Translator[]{};
-//		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-//		return new Translator[] {
-//			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPartialTraversalType_TextContent()),
-//			new Translator("id", facesPackage.getPartialTraversalType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-//		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialViewContextFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialViewContextFactoryTranslator.java
deleted file mode 100644
index 0d1dc27..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PartialViewContextFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class PartialViewContextFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PartialViewContextFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPartialViewContextFactoryType_TextContent()),
-			new Translator("id", facesPackage.getPartialViewContextFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PhaseListenerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PhaseListenerTranslator.java
deleted file mode 100644
index 61bf6d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PhaseListenerTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class PhaseListenerTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PhaseListenerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPhaseListenerType_TextContent()),
-			new Translator("id", facesPackage.getPhaseListenerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyClassTranslator.java
deleted file mode 100644
index 460d1dd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the property class
- *
- */
-public class PropertyClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PropertyClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPropertyClassType_TextContent()),
-			new Translator("id", facesPackage.getPropertyClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyExtensionTranslator.java
deleted file mode 100644
index 8889939..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class PropertyExtensionTranslator extends ExtensionTypeTranslator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PropertyExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyNameTranslator.java
deleted file mode 100644
index d07de28..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyNameTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the property name
- *
- */
-public class PropertyNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PropertyNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPropertyNameType_TextContent()),
-			new Translator("id", facesPackage.getPropertyNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyResolverTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyResolverTranslator.java
deleted file mode 100644
index 5f5482d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyResolverTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class PropertyResolverTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PropertyResolverTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getPropertyResolverType_TextContent()),
-			new Translator("id", facesPackage.getPropertyResolverType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyTranslator.java
deleted file mode 100644
index e01af4d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/PropertyTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class PropertyTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public PropertyTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getPropertyType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getPropertyType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getPropertyType_Icon()), //$NON-NLS-1$
-			new PropertyNameTranslator("property-name", facesPackage.getPropertyType_PropertyName()), //$NON-NLS-1$
-			new PropertyClassTranslator("property-class", facesPackage.getPropertyType_PropertyClass()), //$NON-NLS-1$
-			new DefaultValueTranslator("default-value", facesPackage.getPropertyType_DefaultValue()), //$NON-NLS-1$
-			new SuggestedValueTranslator("suggested-value", facesPackage.getPropertyType_SuggestedValue()), //$NON-NLS-1$
-			new PropertyExtensionTranslator("property-extension", facesPackage.getPropertyType_PropertyExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getPropertyType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectTranslator.java
deleted file mode 100644
index d86d9c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectTranslator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the redirect
- *
- */
-public class RedirectTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RedirectTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, EMPTY_TAG|END_TAG_NO_INDENT);
-	}
-
-	public boolean isSetMOFValue(EObject emfObject) {
-		return feature != null && emfObject.eIsSet(feature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new RedirectViewParamTranslator("view-param", facesPackage.getRedirectType_ViewParam()), //$NON-NLS-1$
-			new Translator("include-view-params", facesPackage.getRedirectType_IncludeViewParams(), DOM_ATTRIBUTE), //$NON-NLS-1$
-			new Translator("id", facesPackage.getRedirectType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectViewParamTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectViewParamTranslator.java
deleted file mode 100644
index 3ebe617..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RedirectViewParamTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class RedirectViewParamTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RedirectViewParamTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new NameTranslator("name", facesPackage.getRedirectViewParamType_Name()), //$NON-NLS-1$
-				new ValueTranslator("value", facesPackage.getRedirectViewParamType_Value()), //$NON-NLS-1$
-				new Translator("id", facesPackage.getRedirectViewParamType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanClassTranslator.java
deleted file mode 100644
index 2e265d7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the reference bean class
- *
- */
-public class ReferencedBeanClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ReferencedBeanClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getReferencedBeanClassType_TextContent()),
-			new Translator("id", facesPackage.getReferencedBeanClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanNameTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanNameTranslator.java
deleted file mode 100644
index b830b2e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanNameTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the referenced bean name
- *
- */
-public class ReferencedBeanNameTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ReferencedBeanNameTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getReferencedBeanNameType_TextContent()),
-			new Translator("id", facesPackage.getReferencedBeanNameType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanTranslator.java
deleted file mode 100644
index 4b985c6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ReferencedBeanTranslator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ReferencedBeanTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ReferencedBeanTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getReferencedBeanType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getReferencedBeanType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getReferencedBeanType_Icon()), //$NON-NLS-1$
-			new ReferencedBeanNameTranslator("referenced-bean-name", facesPackage.getReferencedBeanType_ReferencedBeanName()), //$NON-NLS-1$
-			new ReferencedBeanClassTranslator("referenced-bean-class", facesPackage.getReferencedBeanType_ReferencedBeanClass()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getReferencedBeanType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitClassTranslator.java
deleted file mode 100644
index a44e046..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the render kit class property
- *
- */
-public class RenderKitClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RenderKitClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getRenderKitClassType_TextContent()),
-			new Translator("id", facesPackage.getRenderKitClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitExtensionTranslator.java
deleted file mode 100644
index 54b021e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitExtensionTranslator.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for the extension to renderkit property
- *
- */
-public class RenderKitExtensionTranslator extends ExtensionTypeTranslator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public RenderKitExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitFactoryTranslator.java
deleted file mode 100644
index 478e8b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitFactoryTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class RenderKitFactoryTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RenderKitFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getRenderKitFactoryType_TextContent()),
-			new Translator("id", facesPackage.getRenderKitFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitIdTranslator.java
deleted file mode 100644
index 80132e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the renderkit id
- *
- */
-public class RenderKitIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RenderKitIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getRenderKitIdType_TextContent()),
-			new Translator("id", facesPackage.getRenderKitIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitTranslator.java
deleted file mode 100644
index 9c182d3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RenderKitTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class RenderKitTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RenderKitTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new DescriptionTranslator("description", facesPackage.getRenderKitType_Description()), //$NON-NLS-1$
-				new DisplayNameTranslator("display-name", facesPackage.getRenderKitType_DisplayName()), //$NON-NLS-1$
-				new IconTranslator("icon", facesPackage.getRenderKitType_Icon()), //$NON-NLS-1$
-				new RenderKitIdTranslator("render-kit-id", facesPackage.getRenderKitType_RenderKitId()), //$NON-NLS-1$
-				new RenderKitClassTranslator("render-kit-class", facesPackage.getRenderKitType_RenderKitClass()), //$NON-NLS-1$
-				new RendererTranslator("renderer", facesPackage.getRenderKitType_Renderer()), //$NON-NLS-1$
-				new ClientBehaviorRendererTranslator("client-behavior-renderer", facesPackage.getRenderKitType_ClientBehaviorRenderer()), //$NON-NLS-1$
-                new RenderKitExtensionTranslator("render-kit-extension", facesPackage.getRenderKitType_RenderKitExtension()), //$NON-NLS-1$
-				new Translator("id", facesPackage.getRenderKitType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererClassTranslator.java
deleted file mode 100644
index c870bb1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for renderer class
- *
- */
-public class RendererClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RendererClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getRendererClassType_TextContent()),
-			new Translator("id", facesPackage.getRendererClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererExtensionTranslator.java
deleted file mode 100644
index 24d900f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class RendererExtensionTranslator extends ExtensionTypeTranslator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RendererExtensionTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTranslator.java
deleted file mode 100644
index 9175d48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTranslator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class RendererTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RendererTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-				new DescriptionTranslator("description", facesPackage.getRendererType_Description()), //$NON-NLS-1$
-				new DisplayNameTranslator("display-name", facesPackage.getRendererType_DisplayName()), //$NON-NLS-1$
-				new IconTranslator("icon", facesPackage.getRendererType_Icon()), //$NON-NLS-1$
-				new ComponentFamilyTranslator("component-family", facesPackage.getRendererType_ComponentFamily()), //$NON-NLS-1$
-				new RendererTypeTranslator("renderer-type", facesPackage.getRendererType_RendererType()), //$NON-NLS-1$
-				new RendererClassTranslator("renderer-class", facesPackage.getRendererType_RendererClass()), //$NON-NLS-1$
-				new FacetTranslator("facet", facesPackage.getRendererType_Facet()), //$NON-NLS-1$
-				new AttributeTranslator("attribute", facesPackage.getRendererType_Attribute()), //$NON-NLS-1$
-				new RendererExtensionTranslator("renderer-extension", facesPackage.getRendererType_RendererExtension()), //$NON-NLS-1$
-				new Translator("id", facesPackage.getRendererType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTypeTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTypeTranslator.java
deleted file mode 100644
index c2a0880..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/RendererTypeTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the renderer type
- *
- */
-public class RendererTypeTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public RendererTypeTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getRendererTypeType_TextContent()),
-			new Translator("id", facesPackage.getRendererTypeType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceBundleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceBundleTranslator.java
deleted file mode 100644
index 39b3937..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceBundleTranslator.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for resource bundle element 
- *
- */
-public class ResourceBundleTranslator extends Translator {
-
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public ResourceBundleTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-
-    protected Translator[] getChildren() {
-        
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-        return new Translator[] {
-            new DescriptionTranslator("description", facesPackage.getResourceBundleType_Description()), //$NON-NLS-1$
-            new DisplayNameTranslator("display-name", facesPackage.getResourceBundleType_DisplayName()), //$NON-NLS-1$
-            new IconTranslator("icon", facesPackage.getResourceBundleType_Icon()), //$NON-NLS-1$
-            new BaseNameTranslator("base-name", facesPackage.getResourceBundleType_BaseName()), //$NON-NLS-1$
-            new VarTranslator("var", facesPackage.getResourceBundleType_Var()), //$NON-NLS-1$
-            new Translator("id", facesPackage.getResourceBundleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceHandlerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceHandlerTranslator.java
deleted file mode 100644
index a6db8cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ResourceHandlerTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ResourceHandlerTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ResourceHandlerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getResourceHandlerType_TextContent()),
-			new Translator("id", facesPackage.getResourceHandlerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SkipUnknownChildrenTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SkipUnknownChildrenTranslator.java
deleted file mode 100644
index 79c4b6e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SkipUnknownChildrenTranslator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * SkipUnknownChildrenTranslator has been implemented to temporarily allow
- * processing of application configuration resource files containing extension
- * elements (those defined with a content type of "ANY"); it essentially skips
- * all processing of child elements for which no child Translator has been
- * defined. This is not intended as a long-term solution.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SkipUnknownChildrenTranslator extends Translator {
-
-	/**
-	 * Creates an instance.
-	 * 
-	 * @param domNameAndPath DOM name and path for which this Translator is
-	 * to be used.
-	 * @param aFeature EStructuralFeature instance for which this Translator is
-	 * to be used (may be null).
-	 */
-	public SkipUnknownChildrenTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#findChild(java.lang.String, java.lang.Object, int)
-	 */
-	public Translator findChild(String tagName, Object target, int versionID) {
-		Translator childTranslator = super.findChild(tagName, target, versionID);
-		if (childTranslator == null) {
-			childTranslator = new SkipUnknownChildrenTranslator(tagName, (EStructuralFeature)null);
-		}
-		return childTranslator;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SmallIconTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SmallIconTranslator.java
deleted file mode 100644
index f0d1859..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SmallIconTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the small icon property
- *
- */
-public class SmallIconTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SmallIconTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSmallIconType_TextContent()),
-			new Translator("id", facesPackage.getSmallIconType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SourceClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SourceClassTranslator.java
deleted file mode 100644
index 62ca65b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SourceClassTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class SourceClassTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SourceClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSourceClassType_TextContent()),
-			new Translator("id", facesPackage.getSourceClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/StateManagerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/StateManagerTranslator.java
deleted file mode 100644
index 01bd027..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/StateManagerTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class StateManagerTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public StateManagerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getStateManagerType_TextContent()),
-			new Translator("id", facesPackage.getStateManagerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SuggestedValueTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SuggestedValueTranslator.java
deleted file mode 100644
index ffa16fa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SuggestedValueTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the suggested value property
- *
- */
-public class SuggestedValueTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SuggestedValueTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSuggestedValueType_TextContent()),
-			new Translator("id", facesPackage.getSuggestedValueType_Id(), DOM_ATTRIBUTE)//$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SupportedLocaleTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SupportedLocaleTranslator.java
deleted file mode 100644
index 5d4183c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SupportedLocaleTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class SupportedLocaleTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SupportedLocaleTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSupportedLocaleType_TextContent()),
-			new Translator("id", facesPackage.getSupportedLocaleType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventClassTranslator.java
deleted file mode 100644
index ada4185..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventClassTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class SystemEventClassTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SystemEventClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSystemEventClassType_TextContent()),
-			new Translator("id", facesPackage.getSystemEventClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerClassTranslator.java
deleted file mode 100644
index 055ca64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerClassTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class SystemEventListenerClassTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SystemEventListenerClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getSystemEventListenerClassType_TextContent()),
-			new Translator("id", facesPackage.getSystemEventListenerClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerTranslator.java
deleted file mode 100644
index bf25c60..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/SystemEventListenerTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class SystemEventListenerTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public SystemEventListenerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new SystemEventListenerClassTranslator("system-event-listener-class", facesPackage.getSystemEventListenerType_SystemEventListenerClass()), //$NON-NLS-1$
-			new SystemEventClassTranslator("system-event-class", facesPackage.getSystemEventListenerType_SystemEventClass()), //$NON-NLS-1$
-			new SourceClassTranslator("source-class", facesPackage.getSystemEventListenerType_SourceClass()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getSystemEventListenerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/TagHandlerDelegateFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/TagHandlerDelegateFactoryTranslator.java
deleted file mode 100644
index 1d55b43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/TagHandlerDelegateFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class TagHandlerDelegateFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public TagHandlerDelegateFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getTagHandlerDelegateFactoryType_TextContent()),
-			new Translator("id", facesPackage.getTagHandlerDelegateFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ToViewIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ToViewIdTranslator.java
deleted file mode 100644
index 2eb3084..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ToViewIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the toviewid property
- *
- */
-public class ToViewIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ToViewIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getToViewIdType_TextContent()),
-			new Translator("id", facesPackage.getToViewIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorClassTranslator.java
deleted file mode 100644
index 5c74f34..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the validator class property
- *
- */
-public class ValidatorClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ValidatorClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getValidatorClassType_TextContent()),
-			new Translator("id", facesPackage.getValidatorClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorExtensionTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorExtensionTranslator.java
deleted file mode 100644
index 7e668e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorExtensionTranslator.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * Translator for the validator extension
- *
- */
-public class ValidatorExtensionTranslator extends ExtensionTypeTranslator 
-{
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public ValidatorExtensionTranslator(String domNameAndPath,
-            EStructuralFeature feature) {
-        super(domNameAndPath, feature);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorIdTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorIdTranslator.java
deleted file mode 100644
index 34a07fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorIdTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the validator id
- *
- */
-public class ValidatorIdTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ValidatorIdTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getValidatorIdType_TextContent()),
-			new Translator("id", facesPackage.getValidatorIdType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorTranslator.java
deleted file mode 100644
index 13ec22e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValidatorTranslator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - fixed getChildren()
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ValidatorTranslator extends Translator {
-	
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ValidatorTranslator(String domNameAndPath,EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new DescriptionTranslator("description", facesPackage.getValidatorType_Description()), //$NON-NLS-1$
-			new DisplayNameTranslator("display-name", facesPackage.getValidatorType_DisplayName()), //$NON-NLS-1$
-			new IconTranslator("icon", facesPackage.getValidatorType_Icon()), //$NON-NLS-1$
-			new ValidatorIdTranslator("validator-id", facesPackage.getValidatorType_ValidatorId()), //$NON-NLS-1$
-			new ValidatorClassTranslator("validator-class", facesPackage.getValidatorType_ValidatorClass()), //$NON-NLS-1$
-			new AttributeTranslator("attribute", facesPackage.getValidatorType_Attribute()), //$NON-NLS-1$
-			new PropertyTranslator("property", facesPackage.getValidatorType_Property()), //$NON-NLS-1$
-            new ValidatorExtensionTranslator("validator-extension", facesPackage.getValidatorType_ValidatorExtension()), //$NON-NLS-1$
-			new Translator("id", facesPackage.getValidatorType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueClassTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueClassTranslator.java
deleted file mode 100644
index 9bed430..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueClassTranslator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the value class
- *
- */
-public class ValueClassTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ValueClassTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getValueClassType_TextContent()),
-			new Translator("id", facesPackage.getValueClassType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueTranslator.java
deleted file mode 100644
index dfca7ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ValueTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added is attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang, itrimble
- *
- */
-public class ValueTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ValueTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getValueType_TextContent()),
-			new Translator("id", facesPackage.getValueType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VarTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VarTranslator.java
deleted file mode 100644
index 0062415..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VarTranslator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * Translator for the var
- *
- */
-public class VarTranslator extends Translator {
-    /**
-     * @param domNameAndPath
-     * @param feature
-     */
-    public VarTranslator(String domNameAndPath, EStructuralFeature feature) {
-        super(domNameAndPath, feature, END_TAG_NO_INDENT);
-    }
-
-    public Translator[] getChildren()
-    {
-        FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-
-        return new Translator[] {
-            new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getVarType_TextContent()),
-            new Translator("id", facesPackage.getVarType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-        };
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VariableResolverTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VariableResolverTranslator.java
deleted file mode 100644
index 96c1eef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VariableResolverTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class VariableResolverTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public VariableResolverTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getVariableResolverType_TextContent()),
-			new Translator("id", facesPackage.getVariableResolverType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewDeclarationLanguageFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewDeclarationLanguageFactoryTranslator.java
deleted file mode 100644
index c6558dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewDeclarationLanguageFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class ViewDeclarationLanguageFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ViewDeclarationLanguageFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getViewDeclarationLanguageFactoryType_TextContent()),
-			new Translator("id", facesPackage.getViewDeclarationLanguageFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewHandlerTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewHandlerTranslator.java
deleted file mode 100644
index 655c548..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/ViewHandlerTranslator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - added id attribute
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xjiang, itrimble
- *
- */
-public class ViewHandlerTranslator extends Translator {
-
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public ViewHandlerTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getViewHandlerType_TextContent()),
-			new Translator("id", facesPackage.getViewHandlerType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VisitContextFactoryTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VisitContextFactoryTranslator.java
deleted file mode 100644
index e3fb8ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/internal/translator/VisitContextFactoryTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.internal.translator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-
-/**
- * @author xnjiang
- *
- */
-public class VisitContextFactoryTranslator extends Translator {
-	/**
-	 * @param domNameAndPath
-	 * @param aFeature
-	 */
-	public VisitContextFactoryTranslator(String domNameAndPath, EStructuralFeature aFeature) {
-		super(domNameAndPath, aFeature, END_TAG_NO_INDENT);
-	}
-
-	/*  (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.Translator#getChildren()
-	 */
-	public Translator[] getChildren() {
-		
-		FacesConfigPackage facesPackage = FacesConfigPackage.eINSTANCE;
-		return new Translator[] {
-			new Translator(TEXT_ATTRIBUTE_VALUE, facesPackage.getVisitContextFactoryType_TextContent()),
-			new Translator("id", facesPackage.getVisitContextFactoryType_Id(), DOM_ATTRIBUTE) //$NON-NLS-1$
-		};
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/package-info.java
deleted file mode 100644
index f5d82ab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/package-info.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Not considered an API package and will be made internal in the MANIFEST in some future release
- */
-package org.eclipse.jst.jsf.facesconfig;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigArtifactEdit.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigArtifactEdit.java
deleted file mode 100644
index 9cafba1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigArtifactEdit.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.wst.common.componentcore.ArtifactEdit;
-import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-
-/**
- * The artifact edit for the JSF Application Configuration (faces-config) model - may be used but not extended by clients.
- * 
- * This class maybe refactored to a different package in the future.
- */
-public final class FacesConfigArtifactEdit extends ArtifactEdit {
-
-	private static final String EDIT_MODEL_ID = "jsf.facesconfig"; //$NON-NLS-1$
-
-	private String sFileName = null;
-	private FacesConfigType facesConfig = null;
-	private URI facesConfigURI = URI.createURI(IFacesConfigConstants.FACES_CONFIG_URI);
-	private boolean bRegistered = false;
-
-	/**
-	 * @param aProject
-	 * @param toAccessAsReadOnly
-	 * @throws IllegalArgumentException
-	 */
-	public FacesConfigArtifactEdit(IProject aProject, boolean toAccessAsReadOnly) throws IllegalArgumentException {
-		super(aProject, toAccessAsReadOnly, false, EDIT_MODEL_ID);
-	}
-
-	/**
-	 * @param aProject
-	 * @param sConfigFile
-	 * @return the faces config artifact for the file config file sConfig in project aProject.
-	 * Opened only for read access (no write)
-	 */
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForRead(IProject aProject, String sConfigFile) {
-		FacesConfigArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = new FacesConfigArtifactEdit(aProject, true);
-			if (artifactEdit != null) {
-				artifactEdit.setFilename(sConfigFile);
-			}
-		} catch (IllegalArgumentException iae) {
-            // suppress illegal argument exception
-            FacesConfigPlugin.write(iae);
-		}
-		return artifactEdit;
-	}
-	/**
-	 * @param aProject
-	 * @return the default artifact edit
-     * @deprecated Use getFacesConfigArtifactEditForRead(IProject, String) instead. This
-     * method is dangerous because the caller is assuming that the "default"
-     * model exists and knows nothing about where it is coming from.
-	 */
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForRead(IProject aProject) {
-		return getFacesConfigArtifactEditForRead(aProject, null);
-	}
-
-    /**
-     * @param aProject
-     * @param sConfigFile
-     * @return the faces config artifact for the file config file sConfig in project aProject.
-     * Opened for both write and read access
-     */	
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForWrite(IProject aProject, String sConfigFile) {
-		FacesConfigArtifactEdit artifactEdit = null;
-		try {
-			artifactEdit = new FacesConfigArtifactEdit(aProject, false);
-			if (artifactEdit != null) {
-				artifactEdit.setFilename(sConfigFile);
-			}
-		} catch (IllegalArgumentException iae) {
-            // suppress illegal argument exception
-            FacesConfigPlugin.write(iae);
-		}
-		return artifactEdit;
-	}
-
-	/**
-	 * @param aProject
-	 * @return the default artifact edit for read
-     * @deprecated Use getFacesConfigArtifactEditForWrite(IProject, String) 
-     * instead. This method is dangerous because the caller is assuming that
-     * the "default" model exists and knows nothing about where it is coming
-     * from.
-	 */
-	public static FacesConfigArtifactEdit getFacesConfigArtifactEditForWrite(IProject aProject) {
-		return getFacesConfigArtifactEditForWrite(aProject, null);
-	}
-
-	/**
-	 * @return the root model object for this artifact edit model
-	 */
-	public FacesConfigType getFacesConfig() {
-		if (facesConfig == null) {
-			// TODO: XN - does not seem a good way to check whether the resource has been registered each time.
-			// The following comment is from StrutsArchfactEdit:
-			// This is a hack to ensure that our Resource.Factory is used to
-			// create
-			// the Resource. It's the same hack used by JaxRPCMapArtifactEdit.
-			// The problem is that there is no way to register a Resource.Factory
-			// by, say, content type.
-			// The best we can do is register by last file segment, which isn't
-			// strictly correct.
-			// Plus, there's no way to deregister.
-			if (sFileName != null) {
-				if (!bRegistered) {
-				//if (FacesConfigResourceFactory.getRegisteredFactory(URI.createURI(sFileName)) == null) {
-					FacesConfigResourceFactory.register(sFileName);
-					bRegistered = true;
-				}
-			}
-			facesConfig = (FacesConfigType)getDeploymentDescriptorRoot(); 
-		}
-		return facesConfig;
-	}
-	
-	/**
-	 * @return the uri pointing to the source of this faces config artifact
-	 */
-	public URI getFacesConfigURI() {
-		return facesConfigURI;
-	}
-
-    /**
-     * @return the model root
-     */
-    public EObject getDeploymentDescriptorRoot()
-    {
-        Resource deploymentDescriptorResource = getDeploymentDescriptorResource();
-        if (deploymentDescriptorResource != null)
-        {
-            List contents = deploymentDescriptorResource.getContents();
-            if (contents.size() > 0)
-            {
-                return (EObject) contents.get(0);
-            }
-        }
-        return null;
-        // TODO: XN
-        // addFacesConfigIfNecessary((IFacesConfigResource)getDeploymentDescriptorResource());
-        // return (EObject) contents.get(0);
-    }
-
-	/**
-	 * @return the EMF resource retrieved for this artifact's uri or null if
-	 * this descriptor has not resource.
-	 */
-	public Resource getDeploymentDescriptorResource() {
-		if (sFileName != null) {
-			facesConfigURI = URI.createURI(sFileName);
-		} else {// default is "WEB-INF/faces-config.xml"
-			facesConfigURI = URI.createURI(IFacesConfigConstants.FACES_CONFIG_URI);
-		}
-		final ArtifactEditModel artifactEditModel = getArtifactEditModel();
-		if (artifactEditModel != null)
-		{
-		    return artifactEditModel.getResource(facesConfigURI);
-		}
-		return null;
-	}
-
-	/**
-	 * Sets an instance's filename, used to create a URI and load a model.
-	 * 
-	 * @param filename This instance's filename.
-	 */
-	public void setFilename(String filename) {
-		sFileName = filename;
-		if (filename != null && filename.length() > 0) {
-			facesConfigURI = URI.createURI(filename);
-		}
-	}
-
-	// TODO: appears to be dead
-//	protected void addFacesConfigIfNecessary(TranslatorResource aResource) {
-//		//TO: XN - See how to create one if the config file does not exist
-//		/*if (aResource != null) {
-//		    if(aResource.getContents() == null || aResource.getContents().isEmpty()) {
-//		        FacesConfigType facesConfigNew = WebapplicationFactory.eINSTANCE.createWebApp();
-//				aResource.getContents().add(facesConfigNew);
-//				aResource.setModified(true);
-//		    } 
-//		    FacesConfigType facesConfig = (FacesConfigType)aResource.getContents().get(0);
-//			URI moduleURI = getArtifactEditModel().getModuleURI();
-//			try {
-//				facesConfig.setDisplayName(StructureEdit.getDeployedName(moduleURI));
-//			} catch (UnresolveableURIException e) {
-//				//Ignore
-//			}
-//			aResource.setID(facesConfig, J2EEConstants.WEBAPP_ID);
-//	
-//			try{
-//				aResource.saveIfNecessary();
-//			}catch(Exception e){
-//				e.printStackTrace();
-//			}
-//		}*/
-//	}
-
-	/**
-	 * @return the DOM model for the Struts config. file.
-	 */
-	public IDOMModel getIDOMModel() {
-		// Modeled after SourceNestedEditorPage.getXMLModelFromResource().
-		// TODO - XN This is a little hackish because it depends on the resource's
-		// renderer being an EMF2DOMSedRenderer (which it is, but that could
-		// change).
-		Resource resource = getDeploymentDescriptorResource();
-		if (resource instanceof IFacesConfigResource) {
-			EMF2DOMSSERenderer renderer = (EMF2DOMSSERenderer) 
-			    ((IFacesConfigResource)resource).getRenderer();
-			return renderer.getXMLModel();
-		}
-		return null;
-	}
-
-	/**
-	 * @return the IFile used to load the model or null if none.
-	 */
-	public IFile getFile() {
-		IVirtualResource resource = getComponent().getRootFolder().findMember(facesConfigURI.toString());
-		if ((resource != null) && (resource.getType() == IVirtualResource.FILE))
-			return ((IVirtualFile) resource).getUnderlyingFile();
-		return null;
-	}
-    
-    /**
-     * @return true if the underlying model has been disposed
-     */
-    public boolean isDisposed()
-    {
-        return getArtifactEditModel().isDisposed();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigChangeEvent.java
deleted file mode 100644
index ecbc42e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigChangeEvent.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * This class should NOT be referenced or extended by clients.
- * 
- * @author xnjiang
- *
- */
-final class FacesConfigChangeEvent implements IFacesConfigChangeEvent {
-
-	private boolean bManagedBeandChanged = true;
-	private boolean bNavigationRuleChanged = true;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.IFacesConfigChangeEvent#isManagedBeanChanged()
-	 */
-	public boolean isManagedBeanChanged() {
-		return bManagedBeandChanged;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.jsf.facesconfig.IFacesConfigChangeEvent#isNavigationRuleChanged()
-	 */
-	public boolean isNavigationRuleChanged() {
-		return bNavigationRuleChanged;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceFactory.java
deleted file mode 100644
index d8ba4c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceFactory.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry;
-import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRendererFactory;
-import org.eclipse.wst.common.internal.emf.resource.Renderer;
-import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory;
-
-/**
- * May be referenced but should NOT be extended by clients
- * 
- * @author xjiang
- *
- */
-public final class FacesConfigResourceFactory extends TranslatorResourceFactory 
-{
-    /**
-     * @return a faces config resource factory for use with faces-config
-     * files contained in JARs
-     */
-    public static FacesConfigResourceFactory createResourceFactoryForJar()
-    {
-        return new FacesConfigResourceFactory(EMF2DOMRendererFactory.INSTANCE);
-    }
-    
-	/**
-	 * Construct a faces resource factory.
-	 * 
-	 * @param rendererFactory 
-	 */
-	protected FacesConfigResourceFactory(RendererFactory rendererFactory) {
-		super(rendererFactory);
-	}
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceFactory#createResource(org.eclipse.emf.common.util.URI)
-	 */
-	protected TranslatorResource createResource(URI uri, Renderer aRenderer) {
-		return new FacesConfigResourceImpl(uri, aRenderer);
-	}
-	
-	/**
-	 * Method registerDtds.
-	 */
-	public static void registerDtds() {
-	    // TODO: should we be registering dtd/xsd here?
-	    // how does MyEntityResolver in the resource affect this (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=154439)
-	}
-
-	/**
-	 * register using the default renderer factory.
-	 * @see #registerWith(String, FacesRendererFactory)
-	 */
-	public static void register() {
-		register((String)null);
-	}
-
-	/**
-	 * Register the sFileName with the default renderer factory
-	 * @param sFileName
-	 */
-	public static void register(String sFileName) {
-		registerWith(sFileName, FacesRendererFactory.INSTANCE);
-	}
-
-	/**
-	 * Register myself with the Resource.Factory.Registry
-	 * @param sFileName 
-	 * @param aRendererFactory 
-	 */
-	private static void registerWith(String sFileName, FacesRendererFactory aRendererFactory) {
-		if (sFileName != null) {
-			WTPResourceFactoryRegistry.INSTANCE.registerLastFileSegment(sFileName, new FacesConfigResourceFactory(FacesRendererFactory.INSTANCE));
-		} else {
-			WTPResourceFactoryRegistry.INSTANCE.registerLastFileSegment("faces-config.xml", new FacesConfigResourceFactory(FacesRendererFactory.INSTANCE)); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceImpl.java
deleted file mode 100644
index 2fc096b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigResourceImpl.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.io.IOException;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.jst.jsf.facesconfig.internal.translator.FacesConfigTranslator;
-import org.eclipse.wst.common.internal.emf.resource.Renderer;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver;
-import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Resource </b> associated with the package - NOT intended for external use.
- * Should not be used or implemented by external clients
- * 
- * <!-- end-user-doc -->
- * @see FacesConfigResourceFactory
- * @generated
- */
-public class FacesConfigResourceImpl extends TranslatorResourceImpl implements IFacesConfigResource {
-
-	/**
-	 * Local entity resolver used to help loading entities - NOT intended for external use.
-	 * Should not be used or implemented by external clients
-	 */
-	public static class MyEntityResolver implements EntityResolver {
-
-		private final String baseLocation;
-		private URIResolver uriResolver = null;
-		
-		/**
-		 * @param baseLocation
-		 */
-		public MyEntityResolver(String baseLocation) {
-			super();
-			this.baseLocation = baseLocation;
-		}
-
-		public InputSource resolveEntity(String publicId, String systemId)
-				throws SAXException, IOException {
-			if (uriResolver == null) {
-				uriResolver = URIResolverPlugin.createResolver();
-			}
-			String logicalLocation = uriResolver.resolve(baseLocation, publicId, systemId);
-			String physicalLocation= uriResolver.resolvePhysicalLocation(baseLocation, publicId, logicalLocation);
-			return new InputSource(physicalLocation);		
-		}
-
-	}
-	
-	private EntityResolver entityResolver = null;
-	
-	/**
-	 * @param aRenderer
-	 */
-	public FacesConfigResourceImpl(Renderer aRenderer) {
-		super(aRenderer);
-	}
-	/**
-	 * @param uri
-	 * @param aRenderer
-	 */
-	public FacesConfigResourceImpl(URI uri, Renderer aRenderer) {
-		super(uri, aRenderer);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResource#getDoctype()
-	 */
-	public String getDoctype() {
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResource#getRootTranslator()
-	 */
-	public Translator getRootTranslator() {
-		return FacesConfigTranslator.INSTANCE; 
-
-	}
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.emf.facesconfig.xml.FacesConfigResource#getFacesConfig()
-     */
-    public FacesConfigType getFacesConfig() {
-		return (FacesConfigType) getRootObject();
-    }
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultPublicId()
-	 */
-	protected String getDefaultPublicId() {
-		return "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"; //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultSystemId()
-	 */
-	protected String getDefaultSystemId() {
-		return "http://java.sun.com/dtd/web-facesconfig_1_0.dtd"; //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.internal.emf.resource.TranslatorResourceImpl#getDefaultVersionID()
-	 */
-	protected int getDefaultVersionID() {
-		return 0;
-	}
-	public EntityResolver getEntityResolver() {
-		if (entityResolver == null) {
-			String baseLocation = getURI().toString();
-			entityResolver = new MyEntityResolver(baseLocation);
-		}
-		return entityResolver;
-	}
-	public void setURI(URI arg0) {
-		super.setURI(arg0);
-		entityResolver = null;
-	}
-} //FacesConfigResourceFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigRestartServerResourceDeltaVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigRestartServerResourceDeltaVisitor.java
deleted file mode 100644
index 73d46bb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigRestartServerResourceDeltaVisitor.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-/**
- * This class is NOT intended for external use.
- * 
- * @version $Id$
- */
-final class FacesConfigRestartServerResourceDeltaVisitor implements IResourceDeltaVisitor {
-
-	/** Set of IProjects. */
-	private Set components = new HashSet();
-
-	/**
-	 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-	 */
-	public boolean visit(IResourceDelta delta) throws CoreException {
-
-		if (shouldCheckForRestartProject()) {
-			int kind = delta.getKind();
-			if ((kind == IResourceDelta.ADDED)
-					|| (kind == IResourceDelta.REMOVED)
-					|| ((kind == IResourceDelta.CHANGED) && ((delta.getFlags() & (IResourceDelta.CONTENT
-							| IResourceDelta.TYPE | IResourceDelta.SYNC | IResourceDelta.REPLACED)) != 0))) {
-				primCheckForRestartComponent(delta.getResource());
-			}
-		}
-
-		// Done.
-		return true;
-	}
-
-	private boolean shouldCheckForRestartProject() {
-		//TODO: XN: we don't have preference page for this?
-		//return FacesconfigPlugin.getPlugin().getFacesPreferences().getRestart();
-		return true;
-	}
-
-	private void primCheckForRestartComponent(IResource resource) {
-		if (resource.getType() == IResource.FILE) {
-			IFile file = (IFile) resource;
-			if (FacesConfigUtil.isFacesConfigFile(file)) {
-				IVirtualComponent component = ComponentUtilities.findComponent(file);
-				if (component != null) {
-					components.add(component);
-				}
-			}
-				
-		}
-	}
-
-	/**
-	 * @return the components
-	 */
-	public Collection getComponents() {
-		return components;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigUtil.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigUtil.java
deleted file mode 100644
index 515ec06..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesConfigUtil.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-
-/**
- * Utility class for faces-config model management
- * 
- * This class is NOT intended for external use.
- * 
- */
-final class FacesConfigUtil {
-
-	/** Must match the id specified in plugin.xml. */
-	public static final String FACES_CONFIG_CONTENT_TYPE_ID = "org.eclipse.jst.jsf.facesconfig.facesConfigFile"; //$NON-NLS-1$
-
-	/**
-	 * Returns true iff the specified file seems to be a Faces configuration
-	 * file. Always returns false if the file is in a non-Faces project.
-	 * 
-	 * @param file
-	 *            the IFile to check
-	 * @return true iff the specified file seems to be a Faces configuration
-	 *         file.
-	 */
-	public static boolean isFacesConfigFile(IFile file) {
-		return isFacesConfigFile(file, true);
-	}
-
-	/**
-	 * Returns true iff the specified file seems to be a Faces configuration
-	 * file. If ignoreNonFacesProject is true, always returns false if the file
-	 * is in a non-Faces project.
-	 * 
-	 * @param file
-	 *            the IFile to check
-	 * @param ignoreNonFacesProject
-	 * @return true iff the specified file seems to be a Faces configuration
-	 *         file.
-	 */
-	public static boolean isFacesConfigFile(IFile file, boolean ignoreNonFacesProject) {
-		
-		// Bail if it's not a .xml file.
-		if (!"xml".equalsIgnoreCase(file.getFileExtension())) //$NON-NLS-1$
-			return false;
-
-		// Bail if we can't determine the project. This shouldn't be possible
-		// here, but...
-		IProject project = file.getProject();
-		if (project == null)
-			return false;
-
-		// If requested, bail if the project isn't a Faces project.
-		// TODO: XN - temporarily disabled the following two lines to get rid 
-		// of the dependency on jsf.util
-		//if (ignoreNonFacesProject && !JsfProjectUtil.isJsfProject(project))
-			//return false;
-
-		try {
-			IContentDescription contentDescription = file.getContentDescription();
-			if (contentDescription != null) {
-				IContentType contentType = contentDescription.getContentType();
-				if (contentType != null)
-					return FACES_CONFIG_CONTENT_TYPE_ID.equals(contentType.getId());
-			}
-		} catch (CoreException ignored) {
-			// Empty block intended.
-		}
-
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesRendererFactory.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesRendererFactory.java
deleted file mode 100644
index db93581..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesRendererFactory.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jst.jsf.facesconfig.emf.DynamicElement;
-import org.eclipse.jst.jsf.facesconfig.internal.translator.IAnyTranslator;
-import org.eclipse.wst.common.internal.emf.resource.EMF2DOMAdapter;
-import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRenderer;
-import org.eclipse.wst.common.internal.emf.resource.Renderer;
-import org.eclipse.wst.common.internal.emf.resource.Translator;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSEAdapter;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERenderer;
-import org.eclipse.wst.xml.core.internal.emf2xml.EMF2DOMSSERendererFactory;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This class should not be referenced or sub-classed externally.
- * 
- * The custom render factory for the Faces Config model EMF2DOM translations.
- * A singleton factory.
- */
-final class FacesRendererFactory extends EMF2DOMSSERendererFactory 
-{
-    /**
-     * The singleton factory instance.
-     */
-    @SuppressWarnings("hiding")
-    public static  FacesRendererFactory INSTANCE = new FacesRendererFactory();
-    
-    private FacesRendererFactory() {
-        super();
-    }
-
-    /**
-     * @see org.eclipse.wst.common.internal.emf.resource.RendererFactory#createRenderer()
-     */
-    public Renderer createRenderer() {
-        return new MyRenderer();
-    }
-
-    private static class MyRenderer extends EMF2DOMSSERenderer
-    {
-
-        protected EMF2DOMAdapter createRootDOMAdapter() 
-        {
-            return new MyEMF2DOMAdapterRoot(getResource(), document, this, getResource().getRootTranslator());
-        }
-    }
-    
-    /**
-     * Customized adapter that lets us inject arbitrary DOM children
-     * into for ANY elements
-     */
-    private static class MyEMF2DOMAdapterRoot extends EMF2DOMSSEAdapter
-    {
-
-        /**
-         * @param object
-         * @param node
-         * @param renderer
-         * @param translator
-         */
-        public MyEMF2DOMAdapterRoot(org.eclipse.emf.common.notify.Notifier object, Node node,
-                EMF2DOMRenderer renderer, Translator translator) {
-            super(object, node, renderer, translator);
-        }
-
-        /**
-         * @param node
-         * @param renderer
-         * @param translator
-         */
-        public MyEMF2DOMAdapterRoot(Node node, EMF2DOMRenderer renderer,
-                Translator translator) {
-            super(node, renderer, translator);
-        }
-
-        /**
-         * @param resource
-         * @param document
-         * @param renderer
-         * @param translator
-         */
-        public MyEMF2DOMAdapterRoot(TranslatorResource resource, Document document,
-                EMF2DOMRenderer renderer, Translator translator) {
-            super(resource, document, renderer, translator);
-        }
-
-        protected void initChildTranslators() {
-            // if this is an ANY translator, then we have prepend the list after
-            // initialization with any dynamic attribute translators
-            super.initChildTranslators();
-            
-            if (fTranslator instanceof IAnyTranslator)
-            {
-                final Translator[] dynamicAttrs =
-                    ((IAnyTranslator)fTranslator)
-                         .getDynamicAttributeTranslators(fNode);
-                
-                // avoid an array copy if not necessary
-                if (dynamicAttrs.length > 0)
-                {
-                    final Translator[] allTranslators =
-                        new Translator[childTranslators.length+dynamicAttrs.length];
-                    // prepend the dynamic attributes so they are queried first
-                    System.arraycopy(dynamicAttrs, 0, allTranslators, 0, dynamicAttrs.length);
-                    System.arraycopy(childTranslators, 0, allTranslators, dynamicAttrs.length, childTranslators.length);
-                    childTranslators = allTranslators;
-                }
-            }
-        }
-
-        protected Translator[] getChildTranslators() 
-        {
-            Translator[] translators = super.getChildTranslators();
-            // TODO: I'm thinking there must be a more efficient way to do this
-            if (fTranslator instanceof  IAnyTranslator)
-            {
-               EObject eObj = getEObject();
-               
-               if (eObj instanceof DynamicElement)
-               {
-                   List newArrayList = new ArrayList();
-                   Translator[] dynamicTranslators = 
-                       ((IAnyTranslator)fTranslator).getDynamicAttributeTranslators((DynamicElement)eObj);
-                   
-                   // loop through the dynamic translators and add any to the list
-                   // that aren't already there
-                   for (int i = 0; i < dynamicTranslators.length; i++)
-                   {
-                       Translator translator = dynamicTranslators[i];
-                       
-                       for (int j = 0; j < translators.length; j++)
-                       {
-                           final Translator testTranslator = translators[j];
-                           
-                           if (testTranslator.isDOMAttribute()
-                               // TODO: not fond of passing null, but the arg is ignored anyway (for now)
-                               && testTranslator.getDOMName(null).equals(translator.getDOMName(null)))
-                           {
-                               // null indicates found
-                               translator = null;
-                               break;
-                           }
-                        }
-                       
-                        // if not found, add to list
-                        if (translator != null)
-                        {
-                            newArrayList.add(translator);
-                        }
-                    }
-                   
-                    if (newArrayList.size() > 0)
-                    {
-                        newArrayList.addAll(Arrays.asList(translators));
-                        translators = (Translator[]) newArrayList.toArray(translators);
-                    }
-                }
-            }
-            
-            return translators;
-        }
-
-        protected List getDOMChildren(Node node, Translator map) 
-        {
-            if (map instanceof IAnyTranslator)
-            {
-                List children = new ArrayList();
-                
-                for (int i = 0; i < node.getChildNodes().getLength(); i++)
-                {
-                    Node child = node.getChildNodes().item(i);
-                    if (child.getNodeType() == Node.ELEMENT_NODE)
-                    {
-                        children.add(child);
-                    }
-                }
-                return children;
-            }
-            return super.getDOMChildren(node, map);
-        }
-        /**
-         * Create an adapter for a child DOM node
-         * 
-         * @param mofObject
-         *            org.w3c.dom.Node The node to create the adapter for.
-         */
-        protected EMF2DOMAdapter primCreateAdapter(EObject mofObject, Translator childMap) {
-            // TODO: this may only be necessary when childMap is an IAnyTranslator...
-            Element newNode = createNewNode(mofObject, childMap);
-            return new MyEMF2DOMAdapterRoot(mofObject, newNode, fRenderer, childMap);
-        }
-
-        /**
-         * Create an adapter for a child DOM node
-         * 
-         * @param node
-         *            org.w3c.dom.Node The node to create the adapter for.
-         */
-        protected EMF2DOMAdapter primCreateAdapter(Node node, Translator childMap) {
-            return new MyEMF2DOMAdapterRoot(node, fRenderer, childMap);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesResourceChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesResourceChangeListener.java
deleted file mode 100644
index c328f25..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/FacesResourceChangeListener.java
+++ /dev/null
@@ -1,361 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IResourceVisitor;
-import org.eclipse.core.resources.ISaveContext;
-import org.eclipse.core.resources.ISaveParticipant;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin;
-import org.eclipse.jst.jsf.facesconfig.internal.Logger;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.componentcore.internal.util.ComponentUtilities;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-
-/**
- * This class is responsible for the following:
- * <ol>
- * <li>Ensure that the Struts nature is added to any project to which a Struts
- * config. file is added.</li>
- * <li>Ensure that the Struts nature is added to any project to which a diagram
- * file is added.</li>
- * <li>Restart project(s) if/as apporopriate when a Struts config. file is
- * modified.
- * </ol>
- * It arguably should be multiple classes, but the things it does are closely
- * related and splitting it up would result in duplicate work as well as
- * multiple delta traversals.
- * 
- * This class is not intended for external use. 
- * Should NOT be referenced or extended externally.
- */
-final class FacesResourceChangeListener implements IResourceChangeListener,
-		IResourceDeltaVisitor, ISaveParticipant, IResourceVisitor {
-
-	/** The singleton instance. */
-	private static FacesResourceChangeListener listener;
-	private static boolean restartInProgress = false;
-	private LinkedList facesConfigChangeListeners = new LinkedList();
-	
-	private static IPreferenceStore preferenceStore = null;
-
-	private static final QualifiedName EDITOR_KEY = new QualifiedName(
-			"org.eclipse.ui.internal.registry.ResourceEditorRegistry", "EditorProperty");//$NON-NLS-2$//$NON-NLS-1$
-
-	/** Start up the singleton instance. */
-	public static void startup() {
-
-		// Bail if we're already started.
-		if (listener != null)
-			return;
-
-		// Create the singleton instance.
-		listener = new FacesResourceChangeListener();
-
-		// Register as resource change listener.
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(
-				listener,
-				IResourceChangeEvent.PRE_BUILD + IResourceChangeEvent.POST_BUILD);
-	}
-
-	/** Shutdown the singleton instance. */
-	public static void shutdown() {
-
-		// Bail if we're not started.
-		if (listener == null)
-			return;
-
-		// Deregister as save participant.
-		ResourcesPlugin.getWorkspace().removeSaveParticipant(FacesConfigPlugin.getPlugin().getBundle().getSymbolicName());
-
-		// Deregister as resource change listener.
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener);
-
-		// Dereference the singleton instance.
-		listener = null;
-	}
-
-	/**
-	 * Only this class can create instances.
-	 */
-	private FacesResourceChangeListener() {
-        // no local instantiation
-	}
-
-	/**
-	 * Process a resource change event. This should be invoked only from the
-	 * workbench.
-	 * 
-	 * @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
-	 */
-	public void resourceChanged(IResourceChangeEvent event) {
-
-		IResourceDelta delta = event.getDelta();
-		if (delta != null) {
-			FacesConfigChangeEvent facesConfigChangeEvent = new FacesConfigChangeEvent();
-			fireFacesConfigChangeEvent(facesConfigChangeEvent);
-
-			try {
-				delta.accept(this);
-			} catch (CoreException ignored) {
-				Logger.log(this, ignored);
-			}
-		}
-
-		// Restart projects, if necessary.
-		if ((delta != null) && (event.getType() == IResourceChangeEvent.POST_BUILD)) {
-			FacesConfigRestartServerResourceDeltaVisitor visitor = new FacesConfigRestartServerResourceDeltaVisitor();
-			try {
-				delta.accept(visitor);
-			} catch (CoreException ignored) {
-				Logger.log(this, ignored);
-			}
-			//restartComponents(visitor.getComponents());
-		}
-	}
-
-	/**
-	 * Visit a resource delta. This should be invoked only from the
-	 * IResourceDelta.accept() method invoked above.
-	 * 
-	 * @see IResourceDeltaVisitor#visit(IResourceDelta)
-	 */
-	public boolean visit(IResourceDelta delta) throws CoreException {
-
-		// Check for and handle it if it's a Struts config. file.
-		checkForFacesConfigFile(delta);
-
-		// Done.
-		return true;
-	}
-
-	private void checkForFacesConfigFile(IResourceDelta delta) {
-		boolean isAdded = delta.getKind() == IResourceDelta.ADDED;
-		if (isAdded
-				|| ((delta.getKind() == IResourceDelta.CHANGED) && ((delta.getFlags() & (IResourceDelta.CONTENT
-						| IResourceDelta.TYPE | IResourceDelta.SYNC | IResourceDelta.REPLACED)) != 0))) {
-			checkForFacesConfigFile(delta.getResource(), !isAdded);
-		}
-	}
-
-	private void checkForFacesConfigFile(IResource resource, boolean ignoreNonFacesProjects) {
-		if (resource.getType() == IResource.FILE) {
-
-			// See if the file is a Struts config. file.
-			// If the file was just added, we check the file regardless of
-			// whether or not it is in a Struts project.
-			// Otherwise, a file in a non-Struts project is considered to not be
-			// a Struts config. file.
-			IFile file = (IFile) resource;
-			if (FacesConfigUtil.isFacesConfigFile(file, ignoreNonFacesProjects)) {
-
-				// Ensure that the project has the Struts nature.
-				// TODO:
-				// StrutsNatureRuntime.ensureProjectHasStrutsNature(file.getProject());
-				IVirtualComponent component = ComponentUtilities.findComponent(file);
-				if (component != null) {
-					restartServerIfNecessary(component);
-					// Try to register the SCFE as the default editor.
-					setRegistration(file);
-				}
-			} else {
-				// Try to unregister the SCFE as the default editor.
-				unsetRegistration(file);
-			}
-		}
-	}
-
-	/**
-	 * Look to see if the persisted resource level property keyed by EDITOR_KEY
-	 * has ben set yet. If not then set it to the SCFE.
-	 * 
-	 * @param file
-	 *            The FCF
-	 */
-	private void setRegistration(IFile file) {
-		String editorID = null;
-		try {
-			editorID = file.getPersistentProperty(EDITOR_KEY);
-		} catch (CoreException e) {
-            // suppress core exception
-		}
-		if (editorID == null) {
-			try {
-				file.setPersistentProperty(EDITOR_KEY, FacesConfigPlugin.FACES_CONFIG_EDITOR_ID);
-			} catch (CoreException e) {
-				Logger.log(file, "Failed to set the vcurrent editor to SCFE", e); //$NON-NLS-1$
-			}
-		}
-	}
-
-	private void unsetRegistration(IFile file) {
-		// If the default editor for this file is not the Struts config. editor,
-		// then we're done.
-		IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
-		IEditorDescriptor userEditor = registry.getDefaultEditor(file.getFullPath().toString());
-		if ((userEditor == null)
-				|| !FacesConfigPlugin.FACES_CONFIG_EDITOR_ID.equals(userEditor.getId())) {
-			traceFiner(file, "Not unsetting: Default already not Faces config. editor"); //$NON-NLS-1$
-			return;
-		}
-
-		// Make the Struts config. editor the default.
-		traceFiner(file, "Unsetting."); //$NON-NLS-1$
-		IEditorDescriptor[] editors = registry.getEditors(file.getFullPath().toString());
-		if (editors.length > 1) {
-			registry.setDefaultEditor(file.getFullPath().toString(), editors[1].getId());
-		}
-	}
-
-	//private boolean isRestarting = false;
-	//private Collection restartableComponents = new HashSet();
-
-/*	private void restartComponents(Collection components) {
-		restartableComponents.addAll(components);
-		if (!isRestarting) {
-			isRestarting = true;
-			try {
-				while (!restartableComponents.isEmpty()) {
-					IVirtualComponent component = (IVirtualComponent) restartableComponents.iterator().next();
-					try {
-						ServerRestartUtil.restartComponent(component, true);
-					} finally {
-						restartableComponents.remove(component);
-					}
-				}
-			} finally {
-				isRestarting = false;
-			}
-
-		}
-	}
-
-*/	private void traceFiner(IFile file, String message) {
-		String fileName = file.getProjectRelativePath().toString();
-		Logger.trace("FacesconfigPlugin", this, fileName + ": " + message); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	/** @see ISaveParticipant#doneSaving(ISaveContext) */
-	public void doneSaving(ISaveContext context) {
-        // nothing to do
-	}
-
-	/** @see ISaveParticipant#prepareToSave(ISaveContext) */
-	public void prepareToSave(ISaveContext context) throws CoreException {
-        // nothing to do
-	}
-
-	/** @see ISaveParticipant#rollback(ISaveContext) */
-	public void rollback(ISaveContext context) {
-	    // nothing to do
-	}
-
-	/** @see ISaveParticipant#saving(ISaveContext) */
-	public void saving(ISaveContext context) throws CoreException {
-		context.needDelta();
-	}
-
-	/**
-	 * Visit a resource. This should be invoked only from the
-	 * IResource.accept(IResourceVisitor) invocation, above.
-	 * 
-	 * @see IResourceVisitor#visit(IResource)
-	 */
-	public boolean visit(IResource resource) {
-
-		// Check for and handle a Struts config. file.
-		checkForFacesConfigFile(resource, true);
-
-		// Continue.
-		return true;
-	}
-
-	private void restartServerIfNecessary(IVirtualComponent component) {
-		if(!restartInProgress) {
-			// check against preference about whether to automatically restart
-			boolean restart = false;
-			if (FacesResourceChangeListener.preferenceStore != null) {
-				restart = FacesResourceChangeListener.preferenceStore.getBoolean(IFacesconfigPreferences.PREFSKEY_SERVER_RESTART);
-			}
-			if(restart) {
-				restartInProgress = true;
-				// we'll ask that just the containing EAR is restarted, but it may cycle the whole server if running on Portal
-
-				//ServerRestartUtil.restartComponent(component, true);
-				restartInProgress = false;
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the listener.
-	 */
-	public static FacesResourceChangeListener getFacesResourceChangeListener() {
-		if (listener == null) {
-			listener = new FacesResourceChangeListener();
-			// Register as resource change listener.
-			ResourcesPlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.PRE_BUILD);
-		}
-		return listener;
-	}
-	
-	/**
-	 * Adds a change listener to the list of listeners that will be notified
-	 * when a change is fired.
-	 * 
-	 * @param facesConfigChangeListener
-	 */
-	public void addFacesConfigChangeListener(IFacesConfigChangeListener facesConfigChangeListener) {
-		facesConfigChangeListeners.add(facesConfigChangeListener);
-	}
-	/**
-	 * Removes the listener from the list.
-	 * 
-	 * @param facesConfigChangeListener
-	 */
-	public void removeFacesConfigChangeListener(IFacesConfigChangeListener facesConfigChangeListener) {
-		facesConfigChangeListeners.remove(facesConfigChangeListener);
-	}
-	
-	private void fireFacesConfigChangeEvent(IFacesConfigChangeEvent event) {
-		LinkedList localCopy;
-		synchronized( this ) {
-			localCopy = (LinkedList)facesConfigChangeListeners.clone();
-		}
-		for ( ListIterator iter = localCopy.listIterator(); iter.hasNext(); ) {
-			IFacesConfigChangeListener facesConfigChangeListener = (IFacesConfigChangeListener)iter.next();
-			facesConfigChangeListener.resourceChanged(event);
-		}
-	}
-
-	/** 
-	 * Set the internally used preference store to preferenceStore
-	 * 
-	 * @param preferenceStore
-	 */
-	public static void setPreferenceStore(IPreferenceStore preferenceStore) {
-		FacesResourceChangeListener.preferenceStore = preferenceStore;
-	}
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeEvent.java
deleted file mode 100644
index 5764ee8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeEvent.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * Not intended for external use.
- * 
- * @author xnjiang
- *
- */
-/*package*/ interface IFacesConfigChangeEvent {
-
-	/**
-	 * @return true if a managed bean has changed
-	 */
-	public boolean isManagedBeanChanged();
-	/**
-	 * @return true if a navigation rule has changed
-	 */
-	public boolean isNavigationRuleChanged();
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeListener.java
deleted file mode 100644
index 393e61b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigChangeListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-
-/**
- * Not intended for external use.
- * 
- * @author xnjiang
- *
- */
-/*package*/interface IFacesConfigChangeListener {
-
-	/**
-	 * @param event
-	 */
-	public void resourceChanged(IFacesConfigChangeEvent event);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigConstants.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigConstants.java
deleted file mode 100644
index 017bd29..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigConstants.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * Not intended for external use.
- * 
- * Common constants
- */
-/*package*/ interface IFacesConfigConstants {
-	/**
-	 * the relative URI for the default faces config file.
-	 */
-	final String FACES_CONFIG_URI		= 	"WEB-INF/faces-config.xml"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigResource.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigResource.java
deleted file mode 100644
index f2f1cce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesConfigResource.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigType;
-import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
-
-
-/**
- * Should not be used or extended by clients.
- * 
- * @author gjohnsto
- * @version $Id$
- */
-/*package*/ interface IFacesConfigResource extends TranslatorResource {
-	
-	/**
-	 * @return the root faces config object
-	 */
-	public FacesConfigType getFacesConfig();
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesconfigPreferences.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesconfigPreferences.java
deleted file mode 100644
index 78c4222..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/IFacesconfigPreferences.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- **************************************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.util;
-
-/**
- * Should NOT be used or extended by clients.
- * 
- * constants for JSF preferences pages
- *
- * @author spaxton
- */
-/*package*/ interface IFacesconfigPreferences {
-	
-	/**
-	 * Preference for whether or not to restart the server
-	 */
-	String PREFSKEY_SERVER_RESTART = "jsf.project.restart"; //$NON-NLS-1$
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/package-info.java
deleted file mode 100644
index 5308b76..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/util/package-info.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Utility classes for JSF application configuration files.
- * <p>
- * Contents of this package maybe refactored in the future to other packages.  
- * Users must be prepared to refactor in the future. 
- */
-package org.eclipse.jst.jsf.facesconfig.util;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_name_NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_name_NameType.gif
deleted file mode 100644
index 33422e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_name_NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_others_OrderingOthersType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_others_OrderingOthersType.gif
deleted file mode 100644
index 60a9ea3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAbsoluteOrderingType_others_OrderingOthersType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_actionListener_ActionListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_actionListener_ActionListenerType.gif
deleted file mode 100644
index decea7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_actionListener_ActionListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_defaultRenderKitId_DefaultRenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_defaultRenderKitId_DefaultRenderKitIdType.gif
deleted file mode 100644
index b806b6d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_defaultRenderKitId_DefaultRenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_localeConfig_LocaleConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_localeConfig_LocaleConfigType.gif
deleted file mode 100644
index 9b0e092..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_localeConfig_LocaleConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_messageBundle_MessageBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_messageBundle_MessageBundleType.gif
deleted file mode 100644
index 65e5a9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_messageBundle_MessageBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_navigationHandler_NavigationHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_navigationHandler_NavigationHandlerType.gif
deleted file mode 100644
index 5bbeb62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_navigationHandler_NavigationHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_partialTraversal_PartialTraversalType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_partialTraversal_PartialTraversalType.gif
deleted file mode 100644
index 82914f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_partialTraversal_PartialTraversalType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_propertyResolver_PropertyResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_propertyResolver_PropertyResolverType.gif
deleted file mode 100644
index 0b5f0b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_propertyResolver_PropertyResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_resourceHandler_ResourceHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_resourceHandler_ResourceHandlerType.gif
deleted file mode 100644
index a9b580a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_resourceHandler_ResourceHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_stateManager_StateManagerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_stateManager_StateManagerType.gif
deleted file mode 100644
index 9ef55d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_stateManager_StateManagerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_variableResolver_VariableResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_variableResolver_VariableResolverType.gif
deleted file mode 100644
index d7dcab4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_variableResolver_VariableResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_viewHandler_ViewHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_viewHandler_ViewHandlerType.gif
deleted file mode 100644
index 89171a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateApplicationType_viewHandler_ViewHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeClass_AttributeClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeClass_AttributeClassType.gif
deleted file mode 100644
index e30458a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeClass_AttributeClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeExtension_AttributeExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeExtension_AttributeExtensionType.gif
deleted file mode 100644
index b067e51..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeExtension_AttributeExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeName_AttributeNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeName_AttributeNameType.gif
deleted file mode 100644
index f420604..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_attributeName_AttributeNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_defaultValue_DefaultValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_defaultValue_DefaultValueType.gif
deleted file mode 100644
index 4792e17..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_defaultValue_DefaultValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_description_DescriptionType.gif
deleted file mode 100644
index 92d407e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_displayName_DisplayNameType.gif
deleted file mode 100644
index 09b5568..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_icon_IconType.gif
deleted file mode 100644
index de6e628..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_suggestedValue_SuggestedValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_suggestedValue_SuggestedValueType.gif
deleted file mode 100644
index 3dfc8ee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateAttributeType_suggestedValue_SuggestedValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_attribute_AttributeType.gif
deleted file mode 100644
index 282803a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorClass_BehaviorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorClass_BehaviorClassType.gif
deleted file mode 100644
index 61ec24a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorClass_BehaviorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorExtension_BehaviorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorExtension_BehaviorExtensionType.gif
deleted file mode 100644
index 736cfc2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorExtension_BehaviorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorId_BehaviorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorId_BehaviorIdType.gif
deleted file mode 100644
index 138909e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_behaviorId_BehaviorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_description_DescriptionType.gif
deleted file mode 100644
index 9bf9328..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_displayName_DisplayNameType.gif
deleted file mode 100644
index bb4722e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_icon_IconType.gif
deleted file mode 100644
index c46fd65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_property_PropertyType.gif
deleted file mode 100644
index ec93a66..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateBehaviorType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererClass_ClientBehaviorRendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererClass_ClientBehaviorRendererClassType.gif
deleted file mode 100644
index e27a4de..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererClass_ClientBehaviorRendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererType_ClientBehaviorRendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererType_ClientBehaviorRendererTypeType.gif
deleted file mode 100644
index 4d8faab..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateClientBehaviorRendererType_clientBehaviorRendererType_ClientBehaviorRendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_attribute_AttributeType.gif
deleted file mode 100644
index 086cf80..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentClass_ComponentClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentClass_ComponentClassType.gif
deleted file mode 100644
index 4bbe527..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentClass_ComponentClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentExtension_ComponentExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentExtension_ComponentExtensionType.gif
deleted file mode 100644
index 1b6026a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentExtension_ComponentExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentType_ComponentTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentType_ComponentTypeType.gif
deleted file mode 100644
index 803d12d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_componentType_ComponentTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_description_DescriptionType.gif
deleted file mode 100644
index 4154e57..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_displayName_DisplayNameType.gif
deleted file mode 100644
index 6cb8e23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_facet_FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_facet_FacetType.gif
deleted file mode 100644
index f91a995..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_facet_FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_icon_IconType.gif
deleted file mode 100644
index b24124a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_property_PropertyType.gif
deleted file mode 100644
index 3a05916..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateComponentType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_attribute_AttributeType.gif
deleted file mode 100644
index f4fa5b5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterClass_ConverterClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterClass_ConverterClassType.gif
deleted file mode 100644
index d886763..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterClass_ConverterClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterExtension_ConverterExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterExtension_ConverterExtensionType.gif
deleted file mode 100644
index d544289..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterExtension_ConverterExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterForClass_ConverterForClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterForClass_ConverterForClassType.gif
deleted file mode 100644
index e01c9cf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterForClass_ConverterForClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterId_ConverterIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterId_ConverterIdType.gif
deleted file mode 100644
index b95bc38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_converterId_ConverterIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_description_DescriptionType.gif
deleted file mode 100644
index 43703db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_displayName_DisplayNameType.gif
deleted file mode 100644
index e7c430b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_icon_IconType.gif
deleted file mode 100644
index 265ce22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_property_PropertyType.gif
deleted file mode 100644
index 3fbe2cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateConverterType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDefaultValidatorsType_validatorId_ValidatorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDefaultValidatorsType_validatorId_ValidatorIdType.gif
deleted file mode 100644
index af09eb6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDefaultValidatorsType_validatorId_ValidatorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_absoluteOrdering_AbsoluteOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_absoluteOrdering_AbsoluteOrderingType.gif
deleted file mode 100644
index d757ea0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_absoluteOrdering_AbsoluteOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_actionListener_ActionListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_actionListener_ActionListenerType.gif
deleted file mode 100644
index 9dd025a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_actionListener_ActionListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_applicationFactory_ApplicationFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_applicationFactory_ApplicationFactoryType.gif
deleted file mode 100644
index 1c7362a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_applicationFactory_ApplicationFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_application_ApplicationType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_application_ApplicationType.gif
deleted file mode 100644
index 29e698e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_application_ApplicationType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeClass_AttributeClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeClass_AttributeClassType.gif
deleted file mode 100644
index 784f9df..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeClass_AttributeClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeExtension_AttributeExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeExtension_AttributeExtensionType.gif
deleted file mode 100644
index af07ba1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeExtension_AttributeExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeName_AttributeNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeName_AttributeNameType.gif
deleted file mode 100644
index 5d5000a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attributeName_AttributeNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attribute_AttributeType.gif
deleted file mode 100644
index 5d9762d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorClass_BehaviorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorClass_BehaviorClassType.gif
deleted file mode 100644
index 98bbe95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorClass_BehaviorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorExtension_BehaviorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorExtension_BehaviorExtensionType.gif
deleted file mode 100644
index f8b3c3d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorExtension_BehaviorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorId_BehaviorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorId_BehaviorIdType.gif
deleted file mode 100644
index ed6d815..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behaviorId_BehaviorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behavior_BehaviorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behavior_BehaviorType.gif
deleted file mode 100644
index 0c17af8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_behavior_BehaviorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentClass_ComponentClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentClass_ComponentClassType.gif
deleted file mode 100644
index 0a7b807..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentClass_ComponentClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentExtension_ComponentExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentExtension_ComponentExtensionType.gif
deleted file mode 100644
index 62bda1f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentExtension_ComponentExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentFamily_ComponentFamilyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentFamily_ComponentFamilyType.gif
deleted file mode 100644
index b76c403..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentFamily_ComponentFamilyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentType_ComponentTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentType_ComponentTypeType.gif
deleted file mode 100644
index b25c629..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_componentType_ComponentTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_component_ComponentType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_component_ComponentType.gif
deleted file mode 100644
index d70b2d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_component_ComponentType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterClass_ConverterClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterClass_ConverterClassType.gif
deleted file mode 100644
index ced57c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterClass_ConverterClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterForClass_ConverterForClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterForClass_ConverterForClassType.gif
deleted file mode 100644
index 5ac5ee0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterForClass_ConverterForClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterId_ConverterIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterId_ConverterIdType.gif
deleted file mode 100644
index c2aa3b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converterId_ConverterIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converter_ConverterType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converter_ConverterType.gif
deleted file mode 100644
index 0855183..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_converter_ConverterType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultLocale_DefaultLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultLocale_DefaultLocaleType.gif
deleted file mode 100644
index a1fa94e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultLocale_DefaultLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultRenderKitId_DefaultRenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultRenderKitId_DefaultRenderKitIdType.gif
deleted file mode 100644
index db9e527..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultRenderKitId_DefaultRenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValidators_DefaultValidatorsType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValidators_DefaultValidatorsType.gif
deleted file mode 100644
index d218932..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValidators_DefaultValidatorsType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValue_DefaultValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValue_DefaultValueType.gif
deleted file mode 100644
index c2aa3b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_defaultValue_DefaultValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_description_DescriptionType.gif
deleted file mode 100644
index 1c7362a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_displayName_DisplayNameType.gif
deleted file mode 100644
index 1d2f734..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif
deleted file mode 100644
index db9e527..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_externalContextFactory_ExternalContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_externalContextFactory_ExternalContextFactoryType.gif
deleted file mode 100644
index c3c2a8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_externalContextFactory_ExternalContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesConfig_FacesConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesConfig_FacesConfigType.gif
deleted file mode 100644
index 61b0302..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesConfig_FacesConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesContextFactory_FacesContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesContextFactory_FacesContextFactoryType.gif
deleted file mode 100644
index 182638d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facesContextFactory_FacesContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetExtension_FacetExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetExtension_FacetExtensionType.gif
deleted file mode 100644
index 7983736..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetExtension_FacetExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetName_FacetNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetName_FacetNameType.gif
deleted file mode 100644
index 42372e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facetName_FacetNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facet_FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facet_FacetType.gif
deleted file mode 100644
index c5e260e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_facet_FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_factory_FactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_factory_FactoryType.gif
deleted file mode 100644
index 983575c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_factory_FactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromAction_FromActionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromAction_FromActionType.gif
deleted file mode 100644
index 43794a2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromAction_FromActionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromOutcome_FromOutcomeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromOutcome_FromOutcomeType.gif
deleted file mode 100644
index 86c2eb4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromOutcome_FromOutcomeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromViewId_FromViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromViewId_FromViewIdType.gif
deleted file mode 100644
index 52c7ec0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_fromViewId_FromViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_icon_IconType.gif
deleted file mode 100644
index c05a418..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_if_IfType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_if_IfType.gif
deleted file mode 100644
index e85f5d0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_if_IfType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_keyClass_KeyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_keyClass_KeyClassType.gif
deleted file mode 100644
index d218932..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_keyClass_KeyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_key_KeyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_key_KeyType.gif
deleted file mode 100644
index c5e260e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_key_KeyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_largeIcon_LargeIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_largeIcon_LargeIconType.gif
deleted file mode 100644
index d757ea0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_largeIcon_LargeIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycleFactory_LifecycleFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycleFactory_LifecycleFactoryType.gif
deleted file mode 100644
index 5599390..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycleFactory_LifecycleFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycle_LifecycleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycle_LifecycleType.gif
deleted file mode 100644
index 908375c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_lifecycle_LifecycleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_listEntries_ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_listEntries_ListEntriesType.gif
deleted file mode 100644
index d9a9d8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_listEntries_ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_localeConfig_LocaleConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_localeConfig_LocaleConfigType.gif
deleted file mode 100644
index 55f49ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_localeConfig_LocaleConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanClass_ManagedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanClass_ManagedBeanClassType.gif
deleted file mode 100644
index 0091fd6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanClass_ManagedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanName_ManagedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanName_ManagedBeanNameType.gif
deleted file mode 100644
index 5e4d339..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanName_ManagedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanScope_ManagedBeanScopeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanScope_ManagedBeanScopeType.gif
deleted file mode 100644
index 7983736..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBeanScope_ManagedBeanScopeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBean_ManagedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBean_ManagedBeanType.gif
deleted file mode 100644
index fc34e45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedBean_ManagedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedProperty_ManagedPropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedProperty_ManagedPropertyType.gif
deleted file mode 100644
index 963a72b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_managedProperty_ManagedPropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntries_MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntries_MapEntriesType.gif
deleted file mode 100644
index 0a7b807..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntries_MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntry_MapEntryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntry_MapEntryType.gif
deleted file mode 100644
index 1c7362a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_mapEntry_MapEntryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_messageBundle_MessageBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_messageBundle_MessageBundleType.gif
deleted file mode 100644
index 4ce1821..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_messageBundle_MessageBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_name_NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_name_NameType.gif
deleted file mode 100644
index 31de68f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_name_NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationCase_NavigationCaseType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationCase_NavigationCaseType.gif
deleted file mode 100644
index 61b0302..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationCase_NavigationCaseType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationHandler_NavigationHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationHandler_NavigationHandlerType.gif
deleted file mode 100644
index 0996300..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationHandler_NavigationHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationRule_NavigationRuleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationRule_NavigationRuleType.gif
deleted file mode 100644
index 64cd1b0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_navigationRule_NavigationRuleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_nullValue_NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_nullValue_NullValueType.gif
deleted file mode 100644
index 3d308aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_nullValue_NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_orderingOrdering_OrderingOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_orderingOrdering_OrderingOrderingType.gif
deleted file mode 100644
index 4a972b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_orderingOrdering_OrderingOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_ordering_OrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_ordering_OrderingType.gif
deleted file mode 100644
index c0890af..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_ordering_OrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_others_OrderingOthersType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_others_OrderingOthersType.gif
deleted file mode 100644
index 42372e5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_others_OrderingOthersType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialTraversal_PartialTraversalType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialTraversal_PartialTraversalType.gif
deleted file mode 100644
index d218932..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialTraversal_PartialTraversalType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialViewContextFactory_PartialViewContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialViewContextFactory_PartialViewContextFactoryType.gif
deleted file mode 100644
index ed5f660..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_partialViewContextFactory_PartialViewContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_phaseListener_PhaseListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_phaseListener_PhaseListenerType.gif
deleted file mode 100644
index 464e623..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_phaseListener_PhaseListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyClass_PropertyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyClass_PropertyClassType.gif
deleted file mode 100644
index b76c403..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyClass_PropertyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyExtension_PropertyExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyExtension_PropertyExtensionType.gif
deleted file mode 100644
index 182638d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyExtension_PropertyExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyName_PropertyNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyName_PropertyNameType.gif
deleted file mode 100644
index 7983736..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyName_PropertyNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyResolver_PropertyResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyResolver_PropertyResolverType.gif
deleted file mode 100644
index af07ba1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_propertyResolver_PropertyResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_property_PropertyType.gif
deleted file mode 100644
index 448138d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirectViewParam_RedirectViewParamType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirectViewParam_RedirectViewParamType.gif
deleted file mode 100644
index 9a093da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirectViewParam_RedirectViewParamType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirect_RedirectType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirect_RedirectType.gif
deleted file mode 100644
index 55f49ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_redirect_RedirectType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanClass_ReferencedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanClass_ReferencedBeanClassType.gif
deleted file mode 100644
index ed6d815..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanClass_ReferencedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanName_ReferencedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanName_ReferencedBeanNameType.gif
deleted file mode 100644
index 96c0245..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBeanName_ReferencedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBean_ReferencedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBean_ReferencedBeanType.gif
deleted file mode 100644
index 3d308aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_referencedBean_ReferencedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitClass_RenderKitClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitClass_RenderKitClassType.gif
deleted file mode 100644
index 3f3e603..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitClass_RenderKitClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitFactory_RenderKitFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitFactory_RenderKitFactoryType.gif
deleted file mode 100644
index 3d308aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitFactory_RenderKitFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitId_RenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitId_RenderKitIdType.gif
deleted file mode 100644
index 7fa1f08..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKitId_RenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKit_RenderKitType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKit_RenderKitType.gif
deleted file mode 100644
index 75a50e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderKit_RenderKitType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererClass_RendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererClass_RendererClassType.gif
deleted file mode 100644
index d218932..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererClass_RendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererExtension_RendererExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererExtension_RendererExtensionType.gif
deleted file mode 100644
index 983575c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererExtension_RendererExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererType_RendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererType_RendererTypeType.gif
deleted file mode 100644
index c882b04..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_rendererType_RendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderer_RendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderer_RendererType.gif
deleted file mode 100644
index e178517..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_renderer_RendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_resourceHandler_ResourceHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_resourceHandler_ResourceHandlerType.gif
deleted file mode 100644
index 5106f50..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_resourceHandler_ResourceHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_smallIcon_SmallIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_smallIcon_SmallIconType.gif
deleted file mode 100644
index 76b41e3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_smallIcon_SmallIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_sourceClass_SourceClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_sourceClass_SourceClassType.gif
deleted file mode 100644
index 3f3e603..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_sourceClass_SourceClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_stateManager_StateManagerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_stateManager_StateManagerType.gif
deleted file mode 100644
index eef1935..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_stateManager_StateManagerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_suggestedValue_SuggestedValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_suggestedValue_SuggestedValueType.gif
deleted file mode 100644
index d49c17d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_suggestedValue_SuggestedValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_supportedLocale_SupportedLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_supportedLocale_SupportedLocaleType.gif
deleted file mode 100644
index 4ce1821..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_supportedLocale_SupportedLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventClass_SystemEventClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventClass_SystemEventClassType.gif
deleted file mode 100644
index db9e527..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventClass_SystemEventClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListenerClass_SystemEventListenerClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListenerClass_SystemEventListenerClassType.gif
deleted file mode 100644
index 9a093da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListenerClass_SystemEventListenerClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListener_SystemEventListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListener_SystemEventListenerType.gif
deleted file mode 100644
index d757ea0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_systemEventListener_SystemEventListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif
deleted file mode 100644
index 9932a4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_toViewId_ToViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_toViewId_ToViewIdType.gif
deleted file mode 100644
index 96c0245..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_toViewId_ToViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorClass_ValidatorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorClass_ValidatorClassType.gif
deleted file mode 100644
index 0091fd6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorClass_ValidatorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorId_ValidatorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorId_ValidatorIdType.gif
deleted file mode 100644
index 9a093da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validatorId_ValidatorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validator_ValidatorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validator_ValidatorType.gif
deleted file mode 100644
index fc34e45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_validator_ValidatorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_valueClass_ValueClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_valueClass_ValueClassType.gif
deleted file mode 100644
index 48b9e69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_valueClass_ValueClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_value_ValueType.gif
deleted file mode 100644
index 411e41c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_variableResolver_VariableResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_variableResolver_VariableResolverType.gif
deleted file mode 100644
index 210e156..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_variableResolver_VariableResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif
deleted file mode 100644
index 96c0245..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewHandler_ViewHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewHandler_ViewHandlerType.gif
deleted file mode 100644
index 84df4c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_viewHandler_ViewHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_visitContextFactory_VisitContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_visitContextFactory_VisitContextFactoryType.gif
deleted file mode 100644
index 5ac5ee0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDocumentRoot_visitContextFactory_VisitContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDynamicElement_childNodes_DynamicElement.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDynamicElement_childNodes_DynamicElement.gif
deleted file mode 100644
index 3744cee..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateDynamicElement_childNodes_DynamicElement.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_absoluteOrdering_AbsoluteOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_absoluteOrdering_AbsoluteOrderingType.gif
deleted file mode 100644
index a85a8b8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_absoluteOrdering_AbsoluteOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_application_ApplicationType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_application_ApplicationType.gif
deleted file mode 100644
index 28ed761..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_application_ApplicationType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_behavior_BehaviorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_behavior_BehaviorType.gif
deleted file mode 100644
index 65fff8e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_behavior_BehaviorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_component_ComponentType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_component_ComponentType.gif
deleted file mode 100644
index 07b82ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_component_ComponentType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_converter_ConverterType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_converter_ConverterType.gif
deleted file mode 100644
index b4db3ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_converter_ConverterType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_factory_FactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_factory_FactoryType.gif
deleted file mode 100644
index ca61c9e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_factory_FactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_lifecycle_LifecycleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_lifecycle_LifecycleType.gif
deleted file mode 100644
index b93b3d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_lifecycle_LifecycleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_managedBean_ManagedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_managedBean_ManagedBeanType.gif
deleted file mode 100644
index f2b0a1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_managedBean_ManagedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_name_NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_name_NameType.gif
deleted file mode 100644
index c7c2185..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_name_NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_navigationRule_NavigationRuleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_navigationRule_NavigationRuleType.gif
deleted file mode 100644
index 7431442..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_navigationRule_NavigationRuleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_ordering_OrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_ordering_OrderingType.gif
deleted file mode 100644
index 2bf84ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_ordering_OrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_referencedBean_ReferencedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_referencedBean_ReferencedBeanType.gif
deleted file mode 100644
index 149a215..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_referencedBean_ReferencedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_renderKit_RenderKitType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_renderKit_RenderKitType.gif
deleted file mode 100644
index 8cd9cfa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_renderKit_RenderKitType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_validator_ValidatorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_validator_ValidatorType.gif
deleted file mode 100644
index f2b0a1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacesConfigType_validator_ValidatorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_description_DescriptionType.gif
deleted file mode 100644
index 66a097b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_displayName_DisplayNameType.gif
deleted file mode 100644
index dd919f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetExtension_FacetExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetExtension_FacetExtensionType.gif
deleted file mode 100644
index b021070..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetExtension_FacetExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetName_FacetNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetName_FacetNameType.gif
deleted file mode 100644
index ff4cc72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_facetName_FacetNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_icon_IconType.gif
deleted file mode 100644
index df2b32d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFacetType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_applicationFactory_ApplicationFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_applicationFactory_ApplicationFactoryType.gif
deleted file mode 100644
index d4a978d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_applicationFactory_ApplicationFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif
deleted file mode 100644
index a32a163..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_exceptionHandlerFactory_ExceptionHandlerFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_externalContextFactory_ExternalContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_externalContextFactory_ExternalContextFactoryType.gif
deleted file mode 100644
index 247d202..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_externalContextFactory_ExternalContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_facesContextFactory_FacesContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_facesContextFactory_FacesContextFactoryType.gif
deleted file mode 100644
index 5173b2d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_facesContextFactory_FacesContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_lifecycleFactory_LifecycleFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_lifecycleFactory_LifecycleFactoryType.gif
deleted file mode 100644
index 7cc18f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_lifecycleFactory_LifecycleFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_partialViewContextFactory_PartialViewContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_partialViewContextFactory_PartialViewContextFactoryType.gif
deleted file mode 100644
index 13f7679..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_partialViewContextFactory_PartialViewContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_renderKitFactory_RenderKitFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_renderKitFactory_RenderKitFactoryType.gif
deleted file mode 100644
index 3dac10e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_renderKitFactory_RenderKitFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif
deleted file mode 100644
index ca50a38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_tagHandlerDelegateFactory_TagHandlerDelegateFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif
deleted file mode 100644
index 31a4b78..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_viewDeclarationLanguageFactory_ViewDeclarationLanguageFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_visitContextFactory_VisitContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_visitContextFactory_VisitContextFactoryType.gif
deleted file mode 100644
index 9ea4eeb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateFactoryType_visitContextFactory_VisitContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_largeIcon_LargeIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_largeIcon_LargeIconType.gif
deleted file mode 100644
index 6a782d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_largeIcon_LargeIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_smallIcon_SmallIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_smallIcon_SmallIconType.gif
deleted file mode 100644
index 0640cac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateIconType_smallIcon_SmallIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_lifecycleExtension_LifecycleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_lifecycleExtension_LifecycleExtensionType.gif
deleted file mode 100644
index 79a0b58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_lifecycleExtension_LifecycleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_phaseListener_PhaseListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_phaseListener_PhaseListenerType.gif
deleted file mode 100644
index f11ad89..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLifecycleType_phaseListener_PhaseListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_nullValue_NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_nullValue_NullValueType.gif
deleted file mode 100644
index 205071f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_nullValue_NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_valueClass_ValueClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_valueClass_ValueClassType.gif
deleted file mode 100644
index de5107d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_valueClass_ValueClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_value_ValueType.gif
deleted file mode 100644
index a9aaa51..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateListEntriesType_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_defaultLocale_DefaultLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_defaultLocale_DefaultLocaleType.gif
deleted file mode 100644
index d5f8c8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_defaultLocale_DefaultLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_supportedLocale_SupportedLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_supportedLocale_SupportedLocaleType.gif
deleted file mode 100644
index 3e4fc3f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateLocaleConfigType_supportedLocale_SupportedLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_description_DescriptionType.gif
deleted file mode 100644
index b913037..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_displayName_DisplayNameType.gif
deleted file mode 100644
index 23c1e15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_icon_IconType.gif
deleted file mode 100644
index 46c6860..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_listEntries_ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_listEntries_ListEntriesType.gif
deleted file mode 100644
index 3a9f24e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_listEntries_ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanClass_ManagedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanClass_ManagedBeanClassType.gif
deleted file mode 100644
index d5d9efe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanClass_ManagedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanExtension_ManagedBeanExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanExtension_ManagedBeanExtensionType.gif
deleted file mode 100644
index 10a1ab5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanExtension_ManagedBeanExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanName_ManagedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanName_ManagedBeanNameType.gif
deleted file mode 100644
index 5df01fb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanName_ManagedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanScope_ManagedBeanScopeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanScope_ManagedBeanScopeType.gif
deleted file mode 100644
index 615b448..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedBeanScope_ManagedBeanScopeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedProperty_ManagedPropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedProperty_ManagedPropertyType.gif
deleted file mode 100644
index f11830c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_managedProperty_ManagedPropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_mapEntries_MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_mapEntries_MapEntriesType.gif
deleted file mode 100644
index 5e689e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedBeanType_mapEntries_MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_description_DescriptionType.gif
deleted file mode 100644
index e66386f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_displayName_DisplayNameType.gif
deleted file mode 100644
index c2b071b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_icon_IconType.gif
deleted file mode 100644
index 60aa17e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_listEntries_ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_listEntries_ListEntriesType.gif
deleted file mode 100644
index 223e215..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_listEntries_ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_mapEntries_MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_mapEntries_MapEntriesType.gif
deleted file mode 100644
index db04142..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_mapEntries_MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_nullValue_NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_nullValue_NullValueType.gif
deleted file mode 100644
index 0bf86ce..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_nullValue_NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyClass_PropertyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyClass_PropertyClassType.gif
deleted file mode 100644
index c0ace1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyClass_PropertyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyName_PropertyNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyName_PropertyNameType.gif
deleted file mode 100644
index 377956d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_propertyName_PropertyNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_value_ValueType.gif
deleted file mode 100644
index 0ca5aa8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateManagedPropertyType_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_keyClass_KeyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_keyClass_KeyClassType.gif
deleted file mode 100644
index 30e0107..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_keyClass_KeyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_mapEntry_MapEntryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_mapEntry_MapEntryType.gif
deleted file mode 100644
index 2a3bcb3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_mapEntry_MapEntryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_valueClass_ValueClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_valueClass_ValueClassType.gif
deleted file mode 100644
index 5303d3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntriesType_valueClass_ValueClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_key_KeyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_key_KeyType.gif
deleted file mode 100644
index cd28dd3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_key_KeyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_nullValue_NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_nullValue_NullValueType.gif
deleted file mode 100644
index 799bbbb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_nullValue_NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_value_ValueType.gif
deleted file mode 100644
index 8d3cc41..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateMapEntryType_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_description_DescriptionType.gif
deleted file mode 100644
index 1dd58e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_displayName_DisplayNameType.gif
deleted file mode 100644
index 424142e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromAction_FromActionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromAction_FromActionType.gif
deleted file mode 100644
index d628611..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromAction_FromActionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromOutcome_FromOutcomeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromOutcome_FromOutcomeType.gif
deleted file mode 100644
index 0ca3dc5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_fromOutcome_FromOutcomeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_icon_IconType.gif
deleted file mode 100644
index 0f107c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_if_IfType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_if_IfType.gif
deleted file mode 100644
index 9987e74..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_if_IfType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_redirect_RedirectType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_redirect_RedirectType.gif
deleted file mode 100644
index a46fda5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_redirect_RedirectType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_toViewId_ToViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_toViewId_ToViewIdType.gif
deleted file mode 100644
index d3569a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationCaseType_toViewId_ToViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_description_DescriptionType.gif
deleted file mode 100644
index fbba57a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_displayName_DisplayNameType.gif
deleted file mode 100644
index ae6f7b7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_fromViewId_FromViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_fromViewId_FromViewIdType.gif
deleted file mode 100644
index 95b0b4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_fromViewId_FromViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_icon_IconType.gif
deleted file mode 100644
index fbae759..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationCase_NavigationCaseType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationCase_NavigationCaseType.gif
deleted file mode 100644
index 34611db..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationCase_NavigationCaseType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationRuleExtension_NavigationRuleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationRuleExtension_NavigationRuleExtensionType.gif
deleted file mode 100644
index b0e719a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateNavigationRuleType_navigationRuleExtension_NavigationRuleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_name_NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_name_NameType.gif
deleted file mode 100644
index 9641c51..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_name_NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_others_OrderingOthersType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_others_OrderingOthersType.gif
deleted file mode 100644
index 6ec7dad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingOrderingType_others_OrderingOthersType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_after_OrderingOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_after_OrderingOrderingType.gif
deleted file mode 100644
index efd089b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_after_OrderingOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_before_OrderingOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_before_OrderingOrderingType.gif
deleted file mode 100644
index efd089b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateOrderingType_before_OrderingOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_defaultValue_DefaultValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_defaultValue_DefaultValueType.gif
deleted file mode 100644
index ae8f059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_defaultValue_DefaultValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_description_DescriptionType.gif
deleted file mode 100644
index 527759b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_displayName_DisplayNameType.gif
deleted file mode 100644
index c7bd777..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_icon_IconType.gif
deleted file mode 100644
index ee73faa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyClass_PropertyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyClass_PropertyClassType.gif
deleted file mode 100644
index 2ebeed2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyClass_PropertyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyExtension_PropertyExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyExtension_PropertyExtensionType.gif
deleted file mode 100644
index f9f81a4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyExtension_PropertyExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyName_PropertyNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyName_PropertyNameType.gif
deleted file mode 100644
index af55e8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_propertyName_PropertyNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_suggestedValue_SuggestedValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_suggestedValue_SuggestedValueType.gif
deleted file mode 100644
index 8875a43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreatePropertyType_suggestedValue_SuggestedValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectType_viewParam_RedirectViewParamType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectType_viewParam_RedirectViewParamType.gif
deleted file mode 100644
index 7d6e6bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectType_viewParam_RedirectViewParamType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_name_NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_name_NameType.gif
deleted file mode 100644
index 2f44cc3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_name_NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_value_ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_value_ValueType.gif
deleted file mode 100644
index ab37de2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRedirectViewParamType_value_ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_description_DescriptionType.gif
deleted file mode 100644
index fe734c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_displayName_DisplayNameType.gif
deleted file mode 100644
index 8d3a8e0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_icon_IconType.gif
deleted file mode 100644
index b1bf686..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanClass_ReferencedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanClass_ReferencedBeanClassType.gif
deleted file mode 100644
index 5915315..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanClass_ReferencedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanName_ReferencedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanName_ReferencedBeanNameType.gif
deleted file mode 100644
index ccfe115..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateReferencedBeanType_referencedBeanName_ReferencedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_clientBehaviorRenderer_ClientBehaviorRendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_clientBehaviorRenderer_ClientBehaviorRendererType.gif
deleted file mode 100644
index 1d747da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_clientBehaviorRenderer_ClientBehaviorRendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_description_DescriptionType.gif
deleted file mode 100644
index 2b77e50..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_displayName_DisplayNameType.gif
deleted file mode 100644
index 9f85940..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_icon_IconType.gif
deleted file mode 100644
index fe7b106..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitClass_RenderKitClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitClass_RenderKitClassType.gif
deleted file mode 100644
index e4abad2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitClass_RenderKitClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitExtension_RenderKitExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitExtension_RenderKitExtensionType.gif
deleted file mode 100644
index dbd19ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitExtension_RenderKitExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitId_RenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitId_RenderKitIdType.gif
deleted file mode 100644
index 1bf7437..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderKitId_RenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderer_RendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderer_RendererType.gif
deleted file mode 100644
index d749f03..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRenderKitType_renderer_RendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_attribute_AttributeType.gif
deleted file mode 100644
index 3be3f93..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_componentFamily_ComponentFamilyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_componentFamily_ComponentFamilyType.gif
deleted file mode 100644
index fa2e11c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_componentFamily_ComponentFamilyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_description_DescriptionType.gif
deleted file mode 100644
index 66a097b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_displayName_DisplayNameType.gif
deleted file mode 100644
index dd919f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_facet_FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_facet_FacetType.gif
deleted file mode 100644
index 0091f17..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_facet_FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_icon_IconType.gif
deleted file mode 100644
index df2b32d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererClass_RendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererClass_RendererClassType.gif
deleted file mode 100644
index 30dc32e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererClass_RendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererExtension_RendererExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererExtension_RendererExtensionType.gif
deleted file mode 100644
index b021070..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererExtension_RendererExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererType_RendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererType_RendererTypeType.gif
deleted file mode 100644
index 6beaa5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateRendererType_rendererType_RendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_description_DescriptionType.gif
deleted file mode 100644
index 66a097b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_displayName_DisplayNameType.gif
deleted file mode 100644
index dd919f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_icon_IconType.gif
deleted file mode 100644
index df2b32d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateResourceBundleType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_sourceClass_SourceClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_sourceClass_SourceClassType.gif
deleted file mode 100644
index a9efa38..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_sourceClass_SourceClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventClass_SystemEventClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventClass_SystemEventClassType.gif
deleted file mode 100644
index dd4294c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventClass_SystemEventClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventListenerClass_SystemEventListenerClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventListenerClass_SystemEventListenerClassType.gif
deleted file mode 100644
index 0818bec..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateSystemEventListenerType_systemEventListenerClass_SystemEventListenerClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_attribute_AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_attribute_AttributeType.gif
deleted file mode 100644
index 647a6ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_attribute_AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_description_DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_description_DescriptionType.gif
deleted file mode 100644
index b913037..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_description_DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_displayName_DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_displayName_DisplayNameType.gif
deleted file mode 100644
index 23c1e15..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_displayName_DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_icon_IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_icon_IconType.gif
deleted file mode 100644
index 46c6860..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_icon_IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_property_PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_property_PropertyType.gif
deleted file mode 100644
index 1808567..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_property_PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorClass_ValidatorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorClass_ValidatorClassType.gif
deleted file mode 100644
index d5d9efe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorClass_ValidatorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorExtension_ValidatorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorExtension_ValidatorExtensionType.gif
deleted file mode 100644
index 10a1ab5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorExtension_ValidatorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorId_ValidatorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorId_ValidatorIdType.gif
deleted file mode 100644
index 378c786..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/ctool16/CreateValidatorType_validatorId_ValidatorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AbsoluteOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AbsoluteOrderingType.gif
deleted file mode 100644
index b2f5929..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AbsoluteOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ActionListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ActionListenerType.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ActionListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationExtensionType.gif
deleted file mode 100644
index 7c2aaac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationFactoryType.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationType.gif
deleted file mode 100644
index ed87474..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ApplicationType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeClassType.gif
deleted file mode 100644
index 498364f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeExtensionType.gif
deleted file mode 100644
index c00aedf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeNameType.gif
deleted file mode 100644
index cb1755a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeType.gif
deleted file mode 100644
index 338fb8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/AttributeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BaseNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BaseNameType.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BaseNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorClassType.gif
deleted file mode 100644
index 8f36206..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorExtensionType.gif
deleted file mode 100644
index d51e409..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorIdType.gif
deleted file mode 100644
index 5b40c4e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorType.gif
deleted file mode 100644
index e74485f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/BehaviorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererClassType.gif
deleted file mode 100644
index ed1cbaf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererType.gif
deleted file mode 100644
index ab31737..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererTypeType.gif
deleted file mode 100644
index cf289c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ClientBehaviorRendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentClassType.gif
deleted file mode 100644
index afb82ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentExtensionType.gif
deleted file mode 100644
index 33a997a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentFamilyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentFamilyType.gif
deleted file mode 100644
index caf2804..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentFamilyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentType.gif
deleted file mode 100644
index 5a9bc75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentTypeType.gif
deleted file mode 100644
index 8a5c70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ComponentTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterClassType.gif
deleted file mode 100644
index 7bac4fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterExtensionType.gif
deleted file mode 100644
index a26660e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterForClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterForClassType.gif
deleted file mode 100644
index a3908bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterForClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterIdType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterType.gif
deleted file mode 100644
index 7c2aaac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ConverterType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultLocaleType.gif
deleted file mode 100644
index 98b351f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultRenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultRenderKitIdType.gif
deleted file mode 100644
index cdd3b76..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultRenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValidatorsType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValidatorsType.gif
deleted file mode 100644
index c66ca45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValidatorsType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValueType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DefaultValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DescriptionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DescriptionType.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DescriptionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DisplayNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DisplayNameType.gif
deleted file mode 100644
index ea58a65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DisplayNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DocumentRoot.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DocumentRoot.gif
deleted file mode 100644
index 739ebbf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DocumentRoot.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicAttribute.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicAttribute.gif
deleted file mode 100644
index 420eee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicAttribute.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicElement.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicElement.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/DynamicElement.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ELResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ELResolverType.gif
deleted file mode 100644
index 7b7c428..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ELResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExceptionHandlerFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExceptionHandlerFactoryType.gif
deleted file mode 100644
index 4532576..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExceptionHandlerFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExternalContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExternalContextFactoryType.gif
deleted file mode 100644
index 20f542c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ExternalContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigExtensionType.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigType.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ActionListener.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ActionListener.gif
deleted file mode 100644
index 67b2d33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ActionListener.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Application.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Application.gif
deleted file mode 100644
index 57e5b1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Application.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Component.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Component.gif
deleted file mode 100644
index 347a8ff..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Component.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Converter.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Converter.gif
deleted file mode 100644
index 16466ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Converter.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Factory.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Factory.gif
deleted file mode 100644
index 955d5e8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Factory.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LifeCycle.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LifeCycle.gif
deleted file mode 100644
index 2c15d64..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LifeCycle.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LocaleConfig.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LocaleConfig.gif
deleted file mode 100644
index 596f68b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_LocaleConfig.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ManagedBean.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ManagedBean.gif
deleted file mode 100644
index 6cdef7b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ManagedBean.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_MessageBundle.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_MessageBundle.gif
deleted file mode 100644
index 8f40ee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_MessageBundle.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_NavigationHandler.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_NavigationHandler.gif
deleted file mode 100644
index 0e242c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_NavigationHandler.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Pageflow16.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Pageflow16.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Pageflow16.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PhaseListener.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PhaseListener.gif
deleted file mode 100644
index e9e7238..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PhaseListener.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Plugin.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Plugin.gif
deleted file mode 100644
index 5ea67da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Plugin.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PropertyResolver.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PropertyResolver.gif
deleted file mode 100644
index 39064d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_PropertyResolver.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_RenderKit.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_RenderKit.gif
deleted file mode 100644
index 30ba00d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_RenderKit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_StateManager.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_StateManager.gif
deleted file mode 100644
index bf3102c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_StateManager.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Validator.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Validator.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_Validator.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_VariableResolver.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_VariableResolver.gif
deleted file mode 100644
index 642b874..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_VariableResolver.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ViewHandler.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ViewHandler.gif
deleted file mode 100644
index 4834c83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesConfig_ViewHandler.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesContextFactoryType.gif
deleted file mode 100644
index 420eee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacesContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetExtensionType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetNameType.gif
deleted file mode 100644
index 98b351f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FacetType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryExtensionType.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromActionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromActionType.gif
deleted file mode 100644
index b3643da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromActionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromOutcomeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromOutcomeType.gif
deleted file mode 100644
index a26660e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromOutcomeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromViewIdType.gif
deleted file mode 100644
index 48e3cf2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/FromViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IconType.gif
deleted file mode 100644
index 106881e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IfType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IfType.gif
deleted file mode 100644
index fd14cea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/IfType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyClassType.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/KeyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LargeIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LargeIconType.gif
deleted file mode 100644
index 33a997a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LargeIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleExtensionType.gif
deleted file mode 100644
index 05dc74a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleFactoryType.gif
deleted file mode 100644
index 7bac4fd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleType.gif
deleted file mode 100644
index 90d10f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LifecycleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ListEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ListEntriesType.gif
deleted file mode 100644
index 48e3cf2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ListEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LocaleConfigType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LocaleConfigType.gif
deleted file mode 100644
index 30f0c48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/LocaleConfigType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanClassType.gif
deleted file mode 100644
index 05dc74a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanExtensionType.gif
deleted file mode 100644
index 8a5c70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanNameType.gif
deleted file mode 100644
index 5a9bc75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanScopeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanScopeType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanScopeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanType.gif
deleted file mode 100644
index 5915591..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedPropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedPropertyType.gif
deleted file mode 100644
index 14af8aa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ManagedPropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntriesType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntriesType.gif
deleted file mode 100644
index afb82ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntriesType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntryType.gif
deleted file mode 100644
index 53500da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MapEntryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MessageBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MessageBundleType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/MessageBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NameType.gif
deleted file mode 100644
index e565a0b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationCaseType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationCaseType.gif
deleted file mode 100644
index c4a8af4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationCaseType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationHandlerType.gif
deleted file mode 100644
index 94c953e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleExtensionType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleType.gif
deleted file mode 100644
index db7414e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NavigationRuleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NullValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NullValueType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/NullValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOrderingType.gif
deleted file mode 100644
index bc30f71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOthersType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOthersType.gif
deleted file mode 100644
index c3a5769..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingOthersType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingType.gif
deleted file mode 100644
index 0a8a1a6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/OrderingType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialTraversalType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialTraversalType.gif
deleted file mode 100644
index c66ca45..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialTraversalType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialViewContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialViewContextFactoryType.gif
deleted file mode 100644
index cb04c3e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PartialViewContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PhaseListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PhaseListenerType.gif
deleted file mode 100644
index 7b7c428..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PhaseListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyClassType.gif
deleted file mode 100644
index caf2804..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyExtensionType.gif
deleted file mode 100644
index 420eee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyNameType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyResolverType.gif
deleted file mode 100644
index c00aedf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyType.gif
deleted file mode 100644
index e4b530e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/PropertyType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectType.gif
deleted file mode 100644
index 30f0c48..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectViewParamType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectViewParamType.gif
deleted file mode 100644
index d972a2b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RedirectViewParamType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanClassType.gif
deleted file mode 100644
index 45731fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanNameType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanNameType.gif
deleted file mode 100644
index e4bc22d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanNameType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ReferencedBeanType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitClassType.gif
deleted file mode 100644
index 2124f3e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitExtensionType.gif
deleted file mode 100644
index 7b7c428..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitFactoryType.gif
deleted file mode 100644
index c673a52..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitIdType.gif
deleted file mode 100644
index 7c2aaac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitType.gif
deleted file mode 100644
index 9041598..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RenderKitType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererClassType.gif
deleted file mode 100644
index 35ef84e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererExtensionType.gif
deleted file mode 100644
index 83afb9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererTypeType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererTypeType.gif
deleted file mode 100644
index e4b530e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/RendererTypeType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceBundleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceBundleType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceBundleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceHandlerType.gif
deleted file mode 100644
index cc16827..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ResourceHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SmallIconType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SmallIconType.gif
deleted file mode 100644
index b1f8afa..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SmallIconType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SourceClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SourceClassType.gif
deleted file mode 100644
index 841f225..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SourceClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/StateManagerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/StateManagerType.gif
deleted file mode 100644
index e4bc22d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/StateManagerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SuggestedValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SuggestedValueType.gif
deleted file mode 100644
index db7414e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SuggestedValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SupportedLocaleType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SupportedLocaleType.gif
deleted file mode 100644
index 89ad5da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SupportedLocaleType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventClassType.gif
deleted file mode 100644
index 4532576..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerClassType.gif
deleted file mode 100644
index d972a2b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerType.gif
deleted file mode 100644
index b2f5929..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/SystemEventListenerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/TagHandlerDelegateFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/TagHandlerDelegateFactoryType.gif
deleted file mode 100644
index eb42c23..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/TagHandlerDelegateFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ToViewIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ToViewIdType.gif
deleted file mode 100644
index e4bc22d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ToViewIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorClassType.gif
deleted file mode 100644
index 05dc74a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorExtensionType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorExtensionType.gif
deleted file mode 100644
index 8a5c70c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorExtensionType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorIdType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorIdType.gif
deleted file mode 100644
index d92f34c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorIdType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorType.gif
deleted file mode 100644
index 5915591..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValidatorType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueClassType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueClassType.gif
deleted file mode 100644
index d3dc5a9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueClassType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueType.gif
deleted file mode 100644
index badaab0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ValueType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VarType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VarType.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VarType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VariableResolverType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VariableResolverType.gif
deleted file mode 100644
index a3908bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VariableResolverType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewDeclarationLanguageFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewDeclarationLanguageFactoryType.gif
deleted file mode 100644
index 12208c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewDeclarationLanguageFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewHandlerType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewHandlerType.gif
deleted file mode 100644
index 2b69256..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/ViewHandlerType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VisitContextFactoryType.gif b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VisitContextFactoryType.gif
deleted file mode 100644
index e277e7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/icons/full/obj16/VisitContextFactoryType.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore
deleted file mode 100644
index dda6b72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/FacesConfig.ecore
+++ /dev/null
@@ -1,4828 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="facesconfig"
-    nsURI="http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd" nsPrefix="facesconfig">
-  <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-    <details key="documentation" value="&#xD;&#xA;   See http://www.w3.org/XML/1998/namespace.html and&#xD;&#xA;   http://www.w3.org/TR/REC-xml for information about this namespace.&#xD;&#xA;&#xD;&#xA;    This schema document describes the XML namespace, in a form&#xD;&#xA;    suitable for import by other schema documents.  &#xD;&#xA;&#xD;&#xA;    Note that local names in this namespace are intended to be defined&#xD;&#xA;    only by the World Wide Web Consortium or its subgroups.  The&#xD;&#xA;    following names are currently defined in this namespace and should&#xD;&#xA;    not be used with conflicting semantics by any Working Group,&#xD;&#xA;    specification, or document instance:&#xD;&#xA;&#xD;&#xA;    base (as an attribute name): denotes an attribute whose value&#xD;&#xA;         provides a URI to be used as the base for interpreting any&#xD;&#xA;         relative URIs in the scope of the element on which it&#xD;&#xA;         appears; its value is inherited.  This name is reserved&#xD;&#xA;         by virtue of its definition in the XML Base specification.&#xD;&#xA;&#xD;&#xA;    id   (as an attribute name): denotes an attribute whose value&#xD;&#xA;         should be interpreted as if declared to be of type ID.&#xD;&#xA;         The xml:id specification is not yet a W3C Recommendation,&#xD;&#xA;         but this attribute is included here to facilitate experimentation&#xD;&#xA;         with the mechanisms it proposes.  Note that it is _not_ included&#xD;&#xA;         in the specialAttrs attribute group.&#xD;&#xA;&#xD;&#xA;    lang (as an attribute name): denotes an attribute whose value&#xD;&#xA;         is a language code for the natural language of the content of&#xD;&#xA;         any element; its value is inherited.  This name is reserved&#xD;&#xA;         by virtue of its definition in the XML specification.&#xD;&#xA;  &#xD;&#xA;    space (as an attribute name): denotes an attribute whose&#xD;&#xA;         value is a keyword indicating what whitespace processing&#xD;&#xA;         discipline is intended for the content of the element; its&#xD;&#xA;         value is inherited.  This name is reserved by virtue of its&#xD;&#xA;         definition in the XML specification.&#xD;&#xA;&#xD;&#xA;    Father (in any context at all): denotes Jon Bosak, the chair of &#xD;&#xA;         the original XML Working Group.  This name is reserved by &#xD;&#xA;         the following decision of the W3C XML Plenary and &#xD;&#xA;         XML Coordination groups:&#xD;&#xA;&#xD;&#xA;             In appreciation for his vision, leadership and dedication&#xD;&#xA;             the W3C XML Plenary on this 10th day of February, 2000&#xD;&#xA;             reserves for Jon Bosak in perpetuity the XML name&#xD;&#xA;             xml:Father&#xD;&#xA;  &#xD;&#xA;This schema defines attributes and an attribute group&#xD;&#xA;        suitable for use by&#xD;&#xA;        schemas wishing to allow xml:base, xml:lang, xml:space or xml:id&#xD;&#xA;        attributes on elements they define.&#xD;&#xA;&#xD;&#xA;        To enable this, such a schema must import this schema&#xD;&#xA;        for the XML namespace, e.g. as follows:&#xD;&#xA;        &amp;lt;schema . . .&amp;gt;&#xD;&#xA;         . . .&#xD;&#xA;         &amp;lt;import namespace=&quot;http://www.w3.org/XML/1998/namespace&quot;&#xD;&#xA;                    schemaLocation=&quot;http://www.w3.org/2001/xml.xsd&quot;/&amp;gt;&#xD;&#xA;&#xD;&#xA;        Subsequently, qualified reference to any of the attributes&#xD;&#xA;        or the group defined below will have the desired effect, e.g.&#xD;&#xA;&#xD;&#xA;        &amp;lt;type . . .&amp;gt;&#xD;&#xA;         . . .&#xD;&#xA;         &amp;lt;attributeGroup ref=&quot;xml:specialAttrs&quot;/&amp;gt;&#xD;&#xA; &#xD;&#xA;         will define a type which will schema-validate an instance&#xD;&#xA;         element with any of those attributes&#xD;&#xA;In keeping with the XML Schema WG's standard versioning&#xD;&#xA;   policy, this schema document will persist at&#xD;&#xA;   http://www.w3.org/2005/08/xml.xsd.&#xD;&#xA;   At the date of issue it can also be found at&#xD;&#xA;   http://www.w3.org/2001/xml.xsd.&#xD;&#xA;   The schema document at that URI may however change in the future,&#xD;&#xA;   in order to remain compatible with the latest version of XML Schema&#xD;&#xA;   itself, or with the XML namespace itself.  In other words, if the XML&#xD;&#xA;   Schema or XML namespaces change, the version of this document at&#xD;&#xA;   http://www.w3.org/2001/xml.xsd will change&#xD;&#xA;   accordingly; the version at&#xD;&#xA;   http://www.w3.org/2005/08/xml.xsd will not change.&#xD;&#xA;  "/>
-  </eAnnotations>
-  <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-    <details key="qualified" value="false"/>
-  </eAnnotations>
-  <eClassifiers xsi:type="ecore:EClass" name="AbsoluteOrderingType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="absolute-ordering_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="name" upperBound="-1" eType="#//NameType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="others" eType="#//OrderingOthersType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="others"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ActionListenerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="action-listener_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ApplicationFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="application-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ApplicationType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="application_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="actionListener" upperBound="-1"
-        eType="#//ActionListenerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="action-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultRenderKitId" upperBound="-1"
-        eType="#//DefaultRenderKitIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="messageBundle" upperBound="-1"
-        eType="#//MessageBundleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="message-bundle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationHandler" upperBound="-1"
-        eType="#//NavigationHandlerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewHandler" upperBound="-1"
-        eType="#//ViewHandlerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="stateManager" upperBound="-1"
-        eType="#//StateManagerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="state-manager"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="eLResolver" upperBound="-1"
-        eType="#//ELResolverType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="el-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyResolver" upperBound="-1"
-        eType="#//PropertyResolverType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="variableResolver" upperBound="-1"
-        eType="#//VariableResolverType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="variable-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resourceHandler" upperBound="-1"
-        eType="#//ResourceHandlerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="resource-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventListener" upperBound="-1"
-        eType="#//SystemEventListenerType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="localeConfig" upperBound="-1"
-        eType="#//LocaleConfigType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="locale-config"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resourceBundle" upperBound="-1"
-        eType="#//ResourceBundleType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="resource-bundle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="applicationExtension" upperBound="-1"
-        eType="#//ApplicationExtensionType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValidators" upperBound="-1"
-        eType="#//DefaultValidatorsType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-validators"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ApplicationExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="application-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="AttributeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="attribute_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeName" lowerBound="1"
-        eType="#//AttributeNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeClass" lowerBound="1"
-        eType="#//AttributeClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" eType="#//DefaultValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="suggestedValue" eType="#//SuggestedValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="suggested-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeExtension" upperBound="-1"
-        eType="#//AttributeExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BehaviorClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="behavior-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BehaviorIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="behavior-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BehaviorType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="behavior_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorId" lowerBound="1"
-        eType="#//BehaviorIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorClass" lowerBound="1"
-        eType="#//BehaviorClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorExtension" upperBound="-1"
-        eType="#//BehaviorExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BehaviorExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="behavior-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ClientBehaviorRendererClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="client-behavior-renderer-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ClientBehaviorRendererType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="client-behavior-renderer_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="clientBehaviorRendererType"
-        lowerBound="1" eType="#//ClientBehaviorRendererTypeType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="client-behavior-renderer-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="clientBehaviorRendererClass"
-        lowerBound="1" eType="#//ClientBehaviorRendererClassType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="client-behavior-renderer-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ClientBehaviorRendererTypeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="client-behavior-renderer-type_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentFamilyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-family_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentType" lowerBound="1"
-        eType="#//ComponentTypeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentClass" lowerBound="1"
-        eType="#//ComponentClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facet" upperBound="-1"
-        eType="#//FacetType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentExtension" upperBound="-1"
-        eType="#//ComponentExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ComponentTypeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="component-type_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterForClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-for-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterId" eType="#//ConverterIdType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterForClass" eType="#//ConverterForClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-for-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterClass" lowerBound="1"
-        eType="#//ConverterClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterExtension" upperBound="-1"
-        eType="#//ConverterExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ConverterExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="converter-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultLocaleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-locale_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultRenderKitIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-render-kit-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultValidatorsType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-validators_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorId" upperBound="-1"
-        eType="#//ValidatorIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DefaultValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="default-value_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DescriptionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="description_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Language">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DisplayNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="display-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Language">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DocumentRoot">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value=""/>
-      <details key="kind" value="mixed"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="mixed" unique="false" upperBound="-1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFeatureMapEntry">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="elementWildcard"/>
-        <details key="name" value=":mixed"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xMLNSPrefixMap" unique="false"
-        upperBound="-1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xmlns:prefix"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="xSISchemaLocation" unique="false"
-        upperBound="-1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStringToStringMapEntry"
-        transient="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xsi:schemaLocation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="absoluteOrdering" upperBound="-2"
-        eType="#//AbsoluteOrderingType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="absolute-ordering"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="actionListener" upperBound="-2"
-        eType="#//ActionListenerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" ==================== Subordinate&#xD;&#xA;                Elements ============================       The&#xD;&#xA;                &quot;action-listener&quot; element contains the fully&#xD;&#xA;                qualified class name     of the concrete ActionListener&#xD;&#xA;                implementation class that will be called     during the&#xD;&#xA;                Invoke Application phase of the request processing&#xD;&#xA;                lifecycle.     It must be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="action-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="application" upperBound="-2"
-        eType="#//ApplicationType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" ==================== Definition Elements&#xD;&#xA;                =============================       The&#xD;&#xA;                &quot;application&quot; element provides a mechanism to&#xD;&#xA;                define the various     per-application-singleton&#xD;&#xA;                implementation classes for a particular web&#xD;&#xA;                application that is utilizing JavaServer Faces.  For&#xD;&#xA;                nested elements     that are not specified, the JSF&#xD;&#xA;                implementation must provide a suitable     default. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="applicationFactory" upperBound="-2"
-        eType="#//ApplicationFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;application-factory&quot;&#xD;&#xA;                element contains the fully qualified class     name of&#xD;&#xA;                the concrete ApplicationFactory implementation class&#xD;&#xA;                that     will be called when&#xD;&#xA;                FactoryFinder.getFactory(APPLICATION_FACTORY) is&#xD;&#xA;                called. It must be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-2"
-        eType="#//AttributeType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;attribute&quot; element&#xD;&#xA;                represents a named, typed, value associated with     the&#xD;&#xA;                parent UIComponent via the generic attributes mechanism.&#xD;&#xA;                Attribute names must be unique within the scope of the&#xD;&#xA;                parent (or related)     component. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeClass" upperBound="-2"
-        eType="#//AttributeClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;attribute-class&quot; element represents the Java type of the value&#xA;    associated with this attribute name.  It must be of type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeExtension" upperBound="-2"
-        eType="#//AttributeExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for attribute.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributeName" upperBound="-2"
-        eType="#//AttributeNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;attribute-name&quot;&#xD;&#xA;                element represents the name under which the&#xD;&#xA;                corresponding value will be stored, in the generic&#xD;&#xA;                attributes of the     UIComponent we are related to. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behavior" upperBound="-2"
-        eType="#//BehaviorType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorClass" upperBound="-2"
-        eType="#//BehaviorClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorId" upperBound="-2"
-        eType="#//BehaviorIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behaviorExtension" upperBound="-2"
-        eType="#//BehaviorExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="component" upperBound="-2"
-        eType="#//ComponentType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;component&quot; element&#xD;&#xA;                represents a concrete UIComponent implementation&#xD;&#xA;                class that should be registered under the specified type&#xD;&#xA;                identifier,     along with its associated properties and&#xD;&#xA;                attributes.  Component types must     be unique within&#xD;&#xA;                the entire web application.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                attributes that are recognized     by the implementation&#xD;&#xA;                logic of this component.  Nested &quot;property&quot;&#xD;&#xA;                elements     identify JavaBeans properties of the&#xD;&#xA;                component class that may be exposed     for manipulation&#xD;&#xA;                via tools. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentClass" upperBound="-2"
-        eType="#//ComponentClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;component-class&quot;&#xD;&#xA;                element represents the fully qualified class name     of&#xD;&#xA;                a concrete UIComponent implementation class.  It must be&#xD;&#xA;                of     type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentExtension" upperBound="-2"
-        eType="#//ComponentExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for component.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentFamily" upperBound="-2"
-        eType="#//ComponentFamilyType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;component-family&quot; element represents the component family for&#xA;    which the Renderer represented by the parent &quot;renderer&quot; element will be&#xA;    used."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-family"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentType" upperBound="-2"
-        eType="#//ComponentTypeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;component-type&quot;&#xD;&#xA;                element represents the name under which the&#xD;&#xA;                corresponding UIComponent class should be registered. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converter" upperBound="-2"
-        eType="#//ConverterType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;converter&quot; element&#xD;&#xA;                represents a concrete Converter implementation     class&#xD;&#xA;                that should be registered under the specified converter&#xD;&#xA;                identifier.     Converter identifiers must be unique&#xD;&#xA;                within the entire web application.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                attributes that may be     configured on the&#xD;&#xA;                corresponding UIComponent in order to affect the&#xD;&#xA;                operation of the Converter.  Nested &quot;property&quot;&#xD;&#xA;                elements identify JavaBeans     properties of the&#xD;&#xA;                Converter implementation class that may be configured&#xD;&#xA;                to affect the operation of the Converter. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterClass" upperBound="-2"
-        eType="#//ConverterClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;converter-class&quot; element represents the fully qualified class name&#xA;    of a concrete Converter implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterForClass" upperBound="-2"
-        eType="#//ConverterForClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;converter-for-class&quot; element represents the fully qualified class name&#xA;    for which a Converter class will be registered.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-for-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converterId" upperBound="-2"
-        eType="#//ConverterIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;converter-id&quot; element represents the identifier under which the&#xA;    corresponding Converter class should be registered."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultLocale" upperBound="-2"
-        eType="#//DefaultLocaleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;default-locale&quot;&#xD;&#xA;                element declares the default locale for this&#xD;&#xA;                application instance.  It must be specified as&#xD;&#xA;                :language:[_:country:[_:variant:]] without the colons,&#xD;&#xA;                for example      &quot;ja_JP_SJIS&quot;.  The separators&#xD;&#xA;                between the segments may be '-' or&#xD;&#xA;                '_'. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultRenderKitId" upperBound="-2"
-        eType="#//DefaultRenderKitIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;default-render-kit-id&quot; element allows the application to define&#xA;    a renderkit to be used other than the standard one. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValidators" upperBound="-2"
-        eType="#//DefaultValidatorsType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-validators"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" upperBound="-2"
-        eType="#//DefaultValueType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;default-value&quot; contains the value for the property or attribute&#xA;    in which this element resides.  This value differs from the&#xA;    &quot;suggested-value&quot; in that the property or attribute must take the&#xA;    value, whereas in &quot;suggested-value&quot; taking the value is optional."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-2"
-        eType="#//DescriptionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;description&quot; element&#xD;&#xA;                contains a textual description of the element     it is&#xD;&#xA;                nested in, optionally flagged with a language code using&#xD;&#xA;                the     &quot;xml:lang&quot; attribute. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-2"
-        eType="#//DisplayNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;display-name&quot; element&#xD;&#xA;                is a short descriptive name describing the     entity&#xD;&#xA;                associated with the element it is nested in, intended to&#xD;&#xA;                be     displayed by tools, and optionally flagged with a&#xD;&#xA;                language code using     the &quot;xml:lang&quot;&#xD;&#xA;                attribute. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="exceptionHandlerFactory"
-        upperBound="-2" eType="#//ExceptionHandlerFactoryType" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="exception-handler-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="externalContextFactory"
-        upperBound="-2" eType="#//ExternalContextFactoryType" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="external-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesConfig" upperBound="-2"
-        eType="#//FacesConfigType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" ==================== Top Level Elements&#xD;&#xA;                ==============================       The&#xD;&#xA;                &quot;faces-config&quot; element is the root of the&#xD;&#xA;                configuration information     hierarchy, and contains&#xD;&#xA;                nested elements for all of the other configuration&#xD;&#xA;                settings. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-config"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesContextFactory" upperBound="-2"
-        eType="#//FacesContextFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The&#xD;&#xA;                &quot;faces-context-factory&quot; element contains the&#xD;&#xA;                fully qualified     class name of the concrete&#xD;&#xA;                FacesContextFactory implementation class     that will&#xD;&#xA;                be called when&#xD;&#xA;                FactoryFinder.getFactory(FACES_CONTEXT_FACTORY) is&#xD;&#xA;                called. It must     be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facet" upperBound="-2"
-        eType="#//FacetType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="   Define the name and other design-time information for a facet that is&#xA;   associated with a renderer or a component."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetExtension" upperBound="-2"
-        eType="#//FacetExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    Extension element for facet.  May contain implementation&#xA;    specific content."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetName" upperBound="-2"
-        eType="#//FacetNameType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;facet-name&quot; element represents the facet name under which a&#xA;    UIComponent will be added to its parent.  It must be of type&#xA;    &quot;Identifier&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="factory" upperBound="-2"
-        eType="#//FactoryType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;factory&quot; element&#xD;&#xA;                provides a mechanism to define the various     Factories&#xD;&#xA;                that comprise parts of the implementation of JavaServer&#xD;&#xA;                Faces.  For nested elements that are not specified, the&#xD;&#xA;                JSF     implementation must provide a suitable default. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromAction" upperBound="-2"
-        eType="#//FromActionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;from-action&quot; element contains an action reference expression&#xA;    that must have been executed (by the default ActionListener for handling&#xA;    application level events) in order to select this navigation rule.  If&#xA;    not specified, this rule will be relevant no matter which action reference&#xA;    was executed (or if no action reference was executed).&#xA;&#xA;    This value must be of type &quot;Action&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-action"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromOutcome" upperBound="-2"
-        eType="#//FromOutcomeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;from-outcome&quot; element contains a logical outcome string returned&#xA;    by the execution of an application action method selected via an&#xA;    &quot;actionRef&quot; property (or a literal value specified by an &quot;action&quot;&#xA;    property) of a UICommand component.  If specified, this rule will be&#xA;    relevant only if the outcome value matches this element's value.  If&#xA;    not specified, this rule will be relevant no matter what the outcome&#xA;    value was."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-outcome"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromViewId" upperBound="-2"
-        eType="#//FromViewIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;from-view-id&quot; element contains the view identifier of the view&#xA;    for which the containing navigation rule is relevant.  If no&#xA;    &quot;from-view&quot; element is specified, this rule applies to navigation&#xA;    decisions on all views.  If this element is not specified, a value&#xA;    of &quot;*&quot; is assumed, meaning that this navigation rule applies to all&#xA;    views.&#xA;&#xA;    This value must be of type &quot;ViewIdPattern&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-2" eType="#//IconType"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;icon&quot; element&#xD;&#xA;                contains &quot;small-icon&quot; and&#xD;&#xA;                &quot;large-icon&quot; elements that     specify the&#xD;&#xA;                resoruce paths for small and large GIF or JPG icon&#xD;&#xA;                images     used to represent the parent element in a GUI&#xD;&#xA;                tool. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="if" upperBound="-2" eType="#//IfType"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="if"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="key" upperBound="-2" eType="#//KeyType"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;key&quot; element is the String representation of a map key that&#xA;    will be stored in a managed property of type java.util.Map.  "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="keyClass" upperBound="-2"
-        eType="#//KeyClassType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;key-class&quot; element defines the Java type to which each &quot;key&quot;&#xA;    element in a set of &quot;map-entry&quot; elements will be converted to.  It&#xA;    must be of type &quot;ClassName&quot;.  If omitted, &quot;java.lang.String&quot;&#xA;    is assumed."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="largeIcon" upperBound="-2"
-        eType="#//LargeIconType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;large-icon&quot; element contains the resource path to a large (32x32)&#xA;    icon image.  The image may be in either GIF or JPG format."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="large-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycle" upperBound="-2"
-        eType="#//LifecycleType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;lifecycle&quot; element&#xD;&#xA;                provides a mechanism to specify     modifications to the&#xD;&#xA;                behaviour of the default Lifecycle     implementation&#xD;&#xA;                for this web application. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycleFactory" upperBound="-2"
-        eType="#//LifecycleFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;lifecycle-factory&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete LifecycleFactory implementation class that&#xD;&#xA;                will be called     when&#xD;&#xA;                FactoryFinder.getFactory(LIFECYCLE_FACTORY) is called.&#xD;&#xA;                It must be      of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="listEntries" upperBound="-2"
-        eType="#//ListEntriesType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;list-entries&quot; element&#xD;&#xA;                represents a set of initialization     elements for a&#xD;&#xA;                managed property that is a java.util.List or an&#xD;&#xA;                array.  In the former case, the &quot;value-class&quot;&#xD;&#xA;                element can optionally     be used to declare the Java&#xD;&#xA;                type to which each value should be     converted before&#xD;&#xA;                adding it to the Collection. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="list-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="localeConfig" upperBound="-2"
-        eType="#//LocaleConfigType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;locale-config&quot;&#xD;&#xA;                element allows the app developer to declare the&#xD;&#xA;                supported locales for this application.   "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="locale-config"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBean" upperBound="-2"
-        eType="#//ManagedBeanType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;managed-bean&quot; element&#xD;&#xA;                represents a JavaBean, of a particular class,     that&#xD;&#xA;                will be dynamically instantiated at runtime (by the&#xD;&#xA;                default     VariableResolver implementation) if it is&#xD;&#xA;                referenced as the first element     of a value reference&#xD;&#xA;                expression, and no corresponding bean can be&#xD;&#xA;                identified in any scope.  In addition to the creation of&#xD;&#xA;                the managed bean,     and the optional storing of it&#xD;&#xA;                into the specified scope, the nested&#xD;&#xA;                managed-property elements can be used to initialize the&#xD;&#xA;                contents of     settable JavaBeans properties of the&#xD;&#xA;                created instance. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanClass" upperBound="-2"
-        eType="#//ManagedBeanClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;managed-bean-class&quot; element represents the fully qualified class&#xA;    name of the Java class that will be used to instantiate a new instance&#xA;    if creation of the specified managed bean is requested.  It must be of&#xA;    type &quot;ClassName&quot;.&#xA;&#xA;    The specified class must conform to standard JavaBeans conventions.&#xA;    In particular, it must have a public zero-arguments constructor, and&#xA;    zero or more public property setters."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanName" upperBound="-2"
-        eType="#//ManagedBeanNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;managed-bean-name&quot; element represents the attribute name under&#xA;    which a managed bean will be searched for, as well as stored (unless&#xA;    the &quot;managed-bean-scope&quot; value is &quot;none&quot;).  It must be of type&#xA;    &quot;Identifier&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanScope" upperBound="-2"
-        eType="#//ManagedBeanScopeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;managed-bean-scope&quot; element represents the scope into which a newly&#xA;    created instance of the specified managed bean will be stored (unless&#xA;    the value is &quot;none&quot;).  It must be of type &quot;ScopeOrNone&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-scope"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedProperty" upperBound="-2"
-        eType="#//ManagedPropertyType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;managed-property&quot;&#xD;&#xA;                element represents an individual property of a&#xD;&#xA;                managed bean that will be configured to the specified&#xD;&#xA;                value (or value set)     if the corresponding managed&#xD;&#xA;                bean is automatically created. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntries" upperBound="-2"
-        eType="#//MapEntriesType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;map-entries' element&#xD;&#xA;                represents a set of key-entry pairs that     will be&#xD;&#xA;                added to the computed value of a managed property of&#xD;&#xA;                type     java.util.Map.  In addition, the Java class&#xD;&#xA;                types of the key and entry     values may be optionally&#xD;&#xA;                declared. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntry" upperBound="-2"
-        eType="#//MapEntryType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;map-entry&quot; element&#xD;&#xA;                reprsents a single key-entry pair that     will be added&#xD;&#xA;                to the computed value of a managed property of type&#xD;&#xA;                java.util.Map. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entry"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="messageBundle" upperBound="-2"
-        eType="#//MessageBundleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The base name of a resource bundle&#xD;&#xA;                representing the message resources     for this&#xD;&#xA;                application.  See the JavaDocs for the&#xD;&#xA;                &quot;java.util.ResourceBundle&quot;     class for more&#xD;&#xA;                information on the syntax of resource bundle names. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="message-bundle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="name" upperBound="-2" eType="#//NameType"
-        volatile="true" transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationCase" upperBound="-2"
-        eType="#//NavigationCaseType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;navigation-case&quot;&#xD;&#xA;                element describes a particular combination of&#xD;&#xA;                conditions that must match for this case to be executed,&#xD;&#xA;                and the     view id of the component tree that should be&#xD;&#xA;                selected next. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-case"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationHandler" upperBound="-2"
-        eType="#//NavigationHandlerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;navigation-handler&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete NavigationHandler implementation class that&#xD;&#xA;                will be called     during the Invoke Application phase&#xD;&#xA;                of the request processing lifecycle,     if the default&#xD;&#xA;                ActionListener (provided by the JSF implementation) is&#xD;&#xA;                used.     It must be of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationRule" upperBound="-2"
-        eType="#//NavigationRuleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;navigation-rule&quot;&#xD;&#xA;                element represents an individual decision rule     that&#xD;&#xA;                will be utilized by the default NavigationHandler&#xD;&#xA;                implementation to make decisions on what view should be&#xD;&#xA;                displayed     next, based on the view id being&#xD;&#xA;                processed. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-rule"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" upperBound="-2"
-        eType="#//NullValueType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;null-value&quot; element&#xD;&#xA;                indicates that the managed property in which we     are&#xD;&#xA;                nested will be explicitly set to null if our managed&#xD;&#xA;                bean is     automatically created.  This is different&#xD;&#xA;                from omitting the managed     property element entirely,&#xD;&#xA;                which will cause no property setter to be     called for&#xD;&#xA;                this property.      The &quot;null-value&quot; element&#xD;&#xA;                can only be used when the associated&#xD;&#xA;                &quot;property-class&quot; identifies a Java class, not&#xD;&#xA;                a Java primitive. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ordering" upperBound="-2"
-        eType="#//OrderingType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ordering"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="orderingOrdering" upperBound="-2"
-        eType="#//OrderingOrderingType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ordering-ordering"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="others" upperBound="-2"
-        eType="#//OrderingOthersType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="others"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="partialViewContextFactory"
-        upperBound="-2" eType="#//PartialViewContextFactoryType" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="partial-view-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="phaseListener" upperBound="-2"
-        eType="#//PhaseListenerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=" The &quot;phase-listener&quot; element&#xD;&#xA;                contains the fully qualified class name of the concrete&#xD;&#xA;                PhaseListener implementation class that will be&#xD;&#xA;                registered on the Lifecycle. It must be of type&#xD;&#xA;                &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="phase-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-2"
-        eType="#//PropertyType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;property&quot; element&#xD;&#xA;                represents a JavaBean property of the Java class&#xD;&#xA;                represented by our parent element.      Property names&#xD;&#xA;                must be unique within the scope of the Java class&#xD;&#xA;                that is represented by the parent element, and must&#xD;&#xA;                correspond to     property names that will be recognized&#xD;&#xA;                when performing introspection     against that class via&#xD;&#xA;                java.beans.Introspector. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyClass" upperBound="-2"
-        eType="#//PropertyClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;property-class&quot; element represents the Java type of the value&#xA;    associated with this property name.  It must be of type &quot;JavaType&quot;.&#xA;    If not specified, it can be inferred from existing classes; however,&#xA;    this element should be specified if the configuration file is going&#xA;    to be the source for generating the corresponding classes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyExtension" upperBound="-2"
-        eType="#//PropertyExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for property.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyName" upperBound="-2"
-        eType="#//PropertyNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;property-name&quot; element represents the JavaBeans property name&#xA;    under which the corresponding value may be stored."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyResolver" upperBound="-2"
-        eType="#//PropertyResolverType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;property-resolver&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete PropertyResolver implementation class that&#xD;&#xA;                will be used     during the processing of value&#xD;&#xA;                reference expressions.     It must be of type&#xD;&#xA;                &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="redirect" upperBound="-2"
-        eType="#//RedirectType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;redirect&quot; element&#xD;&#xA;                indicates that navigation to the specified&#xD;&#xA;                &quot;to-view-id&quot; should be accomplished by&#xD;&#xA;                performing an HTTP redirect     rather than the usual&#xD;&#xA;                ViewHandler mechanisms. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="redirect"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="redirectViewParam" upperBound="-2"
-        eType="#//RedirectViewParamType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-param"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBean" upperBound="-2"
-        eType="#//ReferencedBeanType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;referenced-bean&quot;&#xD;&#xA;                element represents at design time the promise     that a&#xD;&#xA;                Java object of the specified type will exist at runtime&#xD;&#xA;                in some     scope, under the specified key.  This can be&#xD;&#xA;                used by design time tools     to construct user&#xD;&#xA;                interface dialogs based on the properties of the&#xD;&#xA;                specified class.  The presence or absence of a&#xD;&#xA;                referenced bean     element has no impact on the&#xD;&#xA;                JavaServer Faces runtime environment     inside a web&#xD;&#xA;                application. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanClass" upperBound="-2"
-        eType="#//ReferencedBeanClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;referenced-bean-class&quot; element represents the fully qualified class&#xA;    name of the Java class (either abstract or concrete) or Java interface&#xA;    implemented by the corresponding referenced bean.  It must be of type&#xA;    &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanName" upperBound="-2"
-        eType="#//ReferencedBeanNameType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;referenced-bean-name&quot; element represents the attribute name under&#xA;    which the corresponding referenced bean may be assumed to be stored,&#xA;    in one of the scopes defined by the &quot;Scope&quot; type.  It must be of type&#xA;    &quot;Identifier&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderer" upperBound="-2"
-        eType="#//RendererType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;renderer&quot; element&#xD;&#xA;                represents a concrete Renderer implementation     class&#xD;&#xA;                that should be registered under the specified type&#xD;&#xA;                identifier,     in the RenderKit associated with the&#xD;&#xA;                parent render-kit element.  Renderer     types must be&#xD;&#xA;                unique within the RenderKit associated with the parent&#xD;&#xA;                &quot;render-kit&quot; element.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                component attributes that     are recognized by this&#xD;&#xA;                renderer.  Nested &quot;supported-component-type&quot;&#xD;&#xA;                and     &quot;supported-component-class&quot; elements&#xD;&#xA;                identify supported component classes,     by their type&#xD;&#xA;                identifiers or the implementation class name,&#xD;&#xA;                respectively,     that are supported by this Renderer. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererClass" upperBound="-2"
-        eType="#//RendererClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;renderer-class&quot; element represents the fully qualified class name&#xA;    of a concrete Renderer implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererExtension" upperBound="-2"
-        eType="#//RendererExtensionType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      Extension element for renderer.&#xD;&#xA;                May contain implementation     specific content. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererType" upperBound="-2"
-        eType="#//RendererTypeType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;renderer-type&quot; element represents a renderer type identifier for the&#xA;    Renderer represented by the parent &quot;renderer&quot; element."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKit" upperBound="-2"
-        eType="#//RenderKitType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;render-kit&quot; element&#xD;&#xA;                represents a concrete RenderKit implementation     that&#xD;&#xA;                should be registered under the specified render-kit-id.&#xD;&#xA;                If no     render-kit-id is specified, the identifier of&#xD;&#xA;                the default RenderKit&#xD;&#xA;                (RenderKitFactory.DEFAULT_RENDER_KIT) is assumed. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitClass" upperBound="-2"
-        eType="#//RenderKitClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;render-kit-class&quot; element represents the fully qualified class name&#xA;    of a concrete RenderKit implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitFactory" upperBound="-2"
-        eType="#//RenderKitFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;render-kit-factory&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete RenderKitFactory implementation class that&#xD;&#xA;                will be called     when&#xD;&#xA;                FactoryFinder.getFactory(RENDER_KIT_FACTORY) is called.&#xD;&#xA;                It must be      of type &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitId" upperBound="-2"
-        eType="#//RenderKitIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;render-kit-id&quot; element represents an identifier for the&#xA;    RenderKit represented by the parent &quot;render-kit&quot; element."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resourceHandler" upperBound="-2"
-        eType="#//ResourceHandlerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="resource-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="smallIcon" upperBound="-2"
-        eType="#//SmallIconType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;small-icon&quot; element contains the resource path to a small (16x16)&#xA;    icon image.  The image may be in either GIF or JPG format."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="small-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="sourceClass" upperBound="-2"
-        eType="#//SourceClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="source-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="stateManager" upperBound="-2"
-        eType="#//StateManagerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;state-manager&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete StateManager implementation class that will&#xD;&#xA;                be called     during the Restore View and Render&#xD;&#xA;                Response phases of the request     processing lifecycle.&#xD;&#xA;                The faces implementation must provide a     default&#xD;&#xA;                implementation of this class "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="state-manager"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="suggestedValue" upperBound="-2"
-        eType="#//SuggestedValueType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;suggested-value&quot; contains the value for the property or&#xA;    attribute in which this element resides.  This value is advisory&#xA;    only and is intended for tools to use when populating pallettes."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="suggested-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportedLocale" upperBound="-2"
-        eType="#//SupportedLocaleType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;supported-locale&quot;&#xD;&#xA;                element allows authors to declare which      locales are&#xD;&#xA;                supported in this application instance.       It must be&#xD;&#xA;                specified as :language:[_:country:[_:variant:]] without&#xD;&#xA;                the colons, for example &quot;ja_JP_SJIS&quot;.  The&#xD;&#xA;                separators between the      segments may be&#xD;&#xA;                '-' or '_'. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="supported-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventClass" upperBound="-2"
-        eType="#//SystemEventClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventListener" upperBound="-2"
-        eType="#//SystemEventListenerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventListenerClass"
-        upperBound="-2" eType="#//SystemEventListenerClassType" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-listener-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagHandlerDelegateFactory"
-        upperBound="-2" eType="#//TagHandlerDelegateFactoryType" volatile="true" transient="true"
-        derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-handler-delegate-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toViewId" upperBound="-2"
-        eType="#//ToViewIdType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;to-view&quot; element contains the view identifier of the next view&#xA;    that should be displayed if this navigation rule is matched.  It&#xA;    must be of type &quot;ViewId&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="to-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validator" upperBound="-2"
-        eType="#//ValidatorType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;validator&quot; element&#xD;&#xA;                represents a concrete Validator implementation     class&#xD;&#xA;                that should be registered under the specified validator&#xD;&#xA;                identifier.     Validator identifiers must be unique&#xD;&#xA;                within the entire web application.      Nested&#xD;&#xA;                &quot;attribute&quot; elements identify generic&#xD;&#xA;                attributes that may be     configured on the&#xD;&#xA;                corresponding UIComponent in order to affect the&#xD;&#xA;                operation of the Validator.  Nested &quot;property&quot;&#xD;&#xA;                elements identify JavaBeans     properties of the&#xD;&#xA;                Validator implementation class that may be configured&#xD;&#xA;                to affect the operation of the Validator. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorClass" upperBound="-2"
-        eType="#//ValidatorClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;validator-class&quot; element represents the fully qualified class name&#xA;    of a concrete Validator implementation class.  It must be of&#xA;    type &quot;ClassName&quot;."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorId" upperBound="-2"
-        eType="#//ValidatorIdType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;validator-id&quot; element represents the identifier under which the&#xA;    corresponding Validator class should be registered."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-2"
-        eType="#//ValueType" volatile="true" transient="true" derived="true" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;value&quot; element is the&#xD;&#xA;                String representation of a literal     value to which a&#xD;&#xA;                scalar managed property will be set, or a value&#xD;&#xA;                reference expression (&quot;#{...}&quot;) that will be&#xD;&#xA;                used to calculate the     required value.  It will be&#xD;&#xA;                converted as specified for the actual     property type. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueClass" upperBound="-2"
-        eType="#//ValueClassType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="    The &quot;value-class&quot; element defines the Java type to which each&#xA;    &quot;value&quot; element's value will be converted to, prior to adding it to&#xA;    the &quot;list-entries&quot; list for a managed property that is a&#xA;    java.util.List, or a &quot;map-entries&quot; map for a managed property that&#xA;    is a java.util.Map.  It must be of type &quot;ClassName&quot;.  If omitted,&#xA;    &quot;java.lang.String&quot; is assumed."/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="variableResolver" upperBound="-2"
-        eType="#//VariableResolverType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="     The &quot;variable-resolver&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete VariableResolver implementation class that&#xD;&#xA;                will be used     during the processing of value&#xD;&#xA;                reference expressions.     It must be of type&#xD;&#xA;                &quot;ClassName&quot;. "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="variable-resolver"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewDeclarationLanguageFactory"
-        upperBound="-2" eType="#//ViewDeclarationLanguageFactoryType" volatile="true"
-        transient="true" derived="true" containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-declaration-language-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewHandler" upperBound="-2"
-        eType="#//ViewHandlerType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="      The &quot;view-handler&quot;&#xD;&#xA;                element contains the fully qualified class name     of&#xD;&#xA;                the concrete ViewHandler implementation class that will&#xD;&#xA;                be called     during the Restore View and Render&#xD;&#xA;                Response phases of the request     processing lifecycle.&#xD;&#xA;                The faces implementation must provide a     default&#xD;&#xA;                implementation of this class "/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-handler"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="visitContextFactory" upperBound="-2"
-        eType="#//VisitContextFactoryType" volatile="true" transient="true" derived="true"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value=""/>
-      </eAnnotations>
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="visit-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DynamicAttribute">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DynamicElement">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childNodes" upperBound="-1"
-        eType="#//DynamicElement" containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attributes" upperBound="-1"
-        eType="#//DynamicAttribute"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ELResolverType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="el-resolver_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExceptionHandlerFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="exception-handler-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExtensionType" abstract="true">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="childNodes" upperBound="-1"
-        eType="#//DynamicElement"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ExternalContextFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="external-context-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacesConfigType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="faces-config_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="application" upperBound="-1"
-        eType="#//ApplicationType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ordering" upperBound="-1"
-        eType="#//OrderingType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="ordering"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="absoluteOrdering" eType="#//AbsoluteOrderingType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="absolute-ordering"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="factory" upperBound="-1"
-        eType="#//FactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="component" upperBound="-1"
-        eType="#//ComponentType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="converter" upperBound="-1"
-        eType="#//ConverterType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="converter"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBean" upperBound="-1"
-        eType="#//ManagedBeanType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="name" eType="#//NameType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationRule" upperBound="-1"
-        eType="#//NavigationRuleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-rule"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBean" upperBound="-1"
-        eType="#//ReferencedBeanType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKit" upperBound="-1"
-        eType="#//RenderKitType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycle" upperBound="-1"
-        eType="#//LifecycleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validator" upperBound="-1"
-        eType="#//ValidatorType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="behavior" upperBound="-1"
-        eType="#//BehaviorType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="behavior"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesConfigExtension" upperBound="-1"
-        eType="#//FacesConfigExtensionType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-config-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="xmlns" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"
-        defaultValueLiteral="http://java.sun.com/JSF/Configuration" unsettable="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="xmlns"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="metadataComplete" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="metadata-complete"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacesConfigExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="faces-config-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacesContextFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="faces-context-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacetExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facet-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacetNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facet-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FacetType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="facet_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetName" lowerBound="1"
-        eType="#//FacetNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facetExtension" upperBound="-1"
-        eType="#//FacetExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="factory_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="applicationFactory" upperBound="-1"
-        eType="#//ApplicationFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="application-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="exceptionHandlerFactory"
-        upperBound="-1" eType="#//ExceptionHandlerFactoryType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="exception-handler-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="externalContextFactory"
-        upperBound="-1" eType="#//ExternalContextFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="external-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facesContextFactory" upperBound="-1"
-        eType="#//FacesContextFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="faces-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="partialViewContextFactory"
-        upperBound="-1" eType="#//PartialViewContextFactoryType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="partial-view-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycleFactory" upperBound="-1"
-        eType="#//LifecycleFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewDeclarationLanguageFactory"
-        upperBound="-1" eType="#//ViewDeclarationLanguageFactoryType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-declaration-language-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagHandlerDelegateFactory"
-        upperBound="-1" eType="#//TagHandlerDelegateFactoryType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-handler-delegate-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitFactory" upperBound="-1"
-        eType="#//RenderKitFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="visitContextFactory" upperBound="-1"
-        eType="#//VisitContextFactoryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="visit-context-factory"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="factoryExtension" upperBound="-1"
-        eType="#//FactoryExtensionType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="factory-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FactoryExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="factory-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FromActionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="from-action_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FromOutcomeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="from-outcome_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="FromViewIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="from-view-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IconType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="icon_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="smallIcon" eType="#//SmallIconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="small-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="largeIcon" eType="#//LargeIconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="large-icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lang" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Language">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="lang"/>
-        <details key="namespace" value="http://www.w3.org/XML/1998/namespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="IfType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="if_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="KeyClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="key-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="KeyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="key_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LargeIconType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="large-icon_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LifecycleFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="lifecycle-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LifecycleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="lifecycle_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="phaseListener" upperBound="-1"
-        eType="#//PhaseListenerType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="phase-listener"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="lifecycleExtension" upperBound="-1"
-        eType="#//LifecycleExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="lifecycle-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LifecycleExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="lifecycle-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ListEntriesType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="list-entries_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueClass" eType="#//ValueClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" upperBound="-1"
-        eType="#//NullValueType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" upperBound="-1"
-        eType="#//ValueType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="LocaleConfigType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="locale-config_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultLocale" eType="#//DefaultLocaleType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="supportedLocale" upperBound="-1"
-        eType="#//SupportedLocaleType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="supported-locale"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanScopeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-scope_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanName" lowerBound="1"
-        eType="#//ManagedBeanNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanClass" lowerBound="1"
-        eType="#//ManagedBeanClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanScope" lowerBound="1"
-        eType="#//ManagedBeanScopeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-scope"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedProperty" upperBound="-1"
-        eType="#//ManagedPropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntries" eType="#//MapEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="listEntries" eType="#//ListEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="list-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="managedBeanExtension" upperBound="-1"
-        eType="#//ManagedBeanExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="managed-bean-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="eager" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="eager"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedBeanExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-bean-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ManagedPropertyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="managed-property_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyName" lowerBound="1"
-        eType="#//PropertyNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyClass" eType="#//PropertyClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntries" eType="#//MapEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" eType="#//NullValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//ValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="listEntries" eType="#//ListEntriesType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="list-entries"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MapEntriesType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="map-entries_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="keyClass" eType="#//KeyClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="valueClass" eType="#//ValueClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mapEntry" upperBound="-1"
-        eType="#//MapEntryType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="map-entry"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MapEntryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="map-entry_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="key" lowerBound="1" eType="#//KeyType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="key"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="nullValue" eType="#//NullValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="null-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" eType="#//ValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MessageBundleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="message-bundle_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationCaseType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-case_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromAction" eType="#//FromActionType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-action"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromOutcome" eType="#//FromOutcomeType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-outcome"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="if" eType="#//IfType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="if"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="toViewId" lowerBound="1"
-        eType="#//ToViewIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="to-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="redirect" eType="#//RedirectType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="redirect"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationHandlerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-handler_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationRuleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-rule_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="fromViewId" eType="#//FromViewIdType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="from-view-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationCase" upperBound="-1"
-        eType="#//NavigationCaseType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-case"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="navigationRuleExtension"
-        upperBound="-1" eType="#//NavigationRuleExtensionType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="navigation-rule-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NavigationRuleExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="navigation-rule-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="NullValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="null-value_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OrderingType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ordering_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="before" eType="#//OrderingOrderingType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="before"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="after" eType="#//OrderingOrderingType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="after"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OrderingOrderingType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="ordering-ordering_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="name" upperBound="-1" eType="#//NameType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="others" eType="#//OrderingOthersType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="others"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="OrderingOthersType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="others_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PartialViewContextFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="partial-view-context-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PhaseListenerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="phase-listener_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyResolverType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property-resolver_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="PropertyType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="property_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyName" lowerBound="1"
-        eType="#//PropertyNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyClass" lowerBound="1"
-        eType="#//PropertyClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="defaultValue" eType="#//DefaultValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="default-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="suggestedValue" eType="#//SuggestedValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="suggested-value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="propertyExtension" upperBound="-1"
-        eType="#//PropertyExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RedirectType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="redirect_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="viewParam" upperBound="-1"
-        eType="#//RedirectViewParamType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="view-param"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="includeViewParams" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="include-view-params"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RedirectViewParamType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="redirect-viewParam_._type"/>
-      <details key="kind" value="empty"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="name" lowerBound="1" eType="#//NameType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" eType="#//ValueType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="value"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReferencedBeanClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="referenced-bean-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReferencedBeanNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="referenced-bean-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ReferencedBeanType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="referenced-bean_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanName" lowerBound="1"
-        eType="#//ReferencedBeanNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="referencedBeanClass" lowerBound="1"
-        eType="#//ReferencedBeanClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="referenced-bean-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="componentFamily" lowerBound="1"
-        eType="#//ComponentFamilyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="component-family"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererType" lowerBound="1"
-        eType="#//RendererTypeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-type"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererClass" lowerBound="1"
-        eType="#//RendererClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="facet" upperBound="-1"
-        eType="#//FacetType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="facet"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rendererExtension" upperBound="-1"
-        eType="#//RendererExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RendererTypeType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="renderer-type_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitId" eType="#//RenderKitIdType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitClass" eType="#//RenderKitClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderer" upperBound="-1"
-        eType="#//RendererType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="renderer"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="clientBehaviorRenderer"
-        upperBound="-1" eType="#//ClientBehaviorRendererType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="client-behavior-renderer"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="renderKitExtension" upperBound="-1"
-        eType="#//RenderKitExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="render-kit-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="RenderKitExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="render-kit-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ResourceHandlerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="resource-handler_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SmallIconType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="small-icon_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SourceClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="source-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="StateManagerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="state-manager_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SuggestedValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="suggested-value_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SupportedLocaleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="supported-locale_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SystemEventClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="system-event-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SystemEventListenerClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="system-event-listener-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SystemEventListenerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="system-event-listener_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventListenerClass"
-        lowerBound="1" eType="#//SystemEventListenerClassType" containment="true"
-        resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-listener-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="systemEventClass" lowerBound="1"
-        eType="#//SystemEventClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="system-event-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="sourceClass" eType="#//SourceClassType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="source-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagHandlerDelegateFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="tag-handler-delegate-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ToViewIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="to-view-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorIdType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator-id_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorId" lowerBound="1"
-        eType="#//ValidatorIdType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorClass" lowerBound="1"
-        eType="#//ValidatorClassType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-class"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="attribute" upperBound="-1"
-        eType="#//AttributeType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="attribute"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="property" upperBound="-1"
-        eType="#//PropertyType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="property"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="validatorExtension" upperBound="-1"
-        eType="#//ValidatorExtensionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="validator-extension"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValidatorExtensionType" eSuperTypes="#//ExtensionType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="validator-extension_._type"/>
-    </eAnnotations>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValueClassType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="value-class_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ValueType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="value_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VariableResolverType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="variable-resolver_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ViewHandlerType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="view-handler_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ResourceBundleType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="resourceBundle_._type"/>
-      <details key="kind" value="elementOnly"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="description" upperBound="-1"
-        eType="#//DescriptionType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="description"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="displayName" upperBound="-1"
-        eType="#//DisplayNameType" containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="display-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="icon" upperBound="-1" eType="#//IconType"
-        containment="true" resolveProxies="false">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="icon"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="baseName" eType="#//BaseNameType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="base-name"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="var" eType="#//VarType">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="var"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="BaseNameType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="base-name_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VarType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="var_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ViewDeclarationLanguageFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="view-declaration-language-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="VisitContextFactoryType">
-    <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-      <details key="name" value="visit-context-factory_._type"/>
-      <details key="kind" value="simple"/>
-    </eAnnotations>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="textContent" unique="false"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="name" value=":0"/>
-        <details key="kind" value="simple"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//ID"
-        iD="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="attribute"/>
-        <details key="name" value="id"/>
-        <details key="namespace" value="##targetNamespace"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/facesConfig.genmodel b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/facesConfig.genmodel
deleted file mode 100644
index 8ed8544..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/facesConfig.genmodel
+++ /dev/null
@@ -1,738 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2005, 2006 IBM Corporation and others"
-    modelDirectory="/org.eclipse.jst.jsf.facesconfig/facesconfig" editDirectory="/org.eclipse.jst.jsf.facesconfig/facesconfig"
-    editorDirectory="/org.eclipse.jst.jsf.facesconfig.editor/src" modelPluginID="org.eclipse.jst.jsf.facesconfig"
-    templateDirectory="org.eclipse.jst.jsf.facesconfig/model/templates" dynamicTemplates="true"
-    redirection="" modelName="FacesConfig" modelPluginClass="" editPluginClass="org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin"
-    editorPluginClass="org.eclipse.jst.jsf.facesconfig.emf.presentation.FacesConfigEditorPlugin"
-    rootImplementsInterface="" featureMapWrapperInterface="" featureMapWrapperInternalInterface=""
-    featureMapWrapperClass="" testSuiteClass="org.eclipse.jst.jsf.facesconfig.emf.tests.FacesConfigAllTests"
-    booleanFlagsField="">
-  <foreignModel>../../../com.ibm.etools.jsf/facesConfig.xsd</foreignModel>
-  <genPackages prefix="FacesConfig" basePackage="org.eclipse.jst.jsf" disposableProviderFactory="true"
-      interfacePackageSuffix="emf" metaDataPackageSuffix="emf" classPackageSuffix="emf.impl"
-      utilityPackageSuffix="emf.util" providerPackageSuffix="edit.provider" presentationPackageSuffix="emf.presentation"
-      testsPackageSuffix="emf.tests" ecorePackage="FacesConfig.ecore#/">
-    <genClasses ecoreClass="FacesConfig.ecore#//AbsoluteOrderingType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AbsoluteOrderingType/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AbsoluteOrderingType/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AbsoluteOrderingType/others"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ActionListenerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ActionListenerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ActionListenerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ApplicationFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ApplicationFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ApplicationFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ApplicationType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/actionListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/defaultRenderKitId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/messageBundle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/navigationHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/partialTraversal"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/viewHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/stateManager"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/eLResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/propertyResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/variableResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/resourceHandler"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/systemEventListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/localeConfig"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/resourceBundle"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/applicationExtension"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ApplicationType/defaultValidators"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ApplicationType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ApplicationExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//AttributeType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/attributeName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/attributeClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/defaultValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/suggestedValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//AttributeType/attributeExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//AttributeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BehaviorClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BehaviorClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BehaviorClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BehaviorIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BehaviorIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BehaviorIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BehaviorType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/behaviorId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/behaviorClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//BehaviorType/behaviorExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BehaviorType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BehaviorExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ClientBehaviorRendererClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ClientBehaviorRendererClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ClientBehaviorRendererClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ClientBehaviorRendererType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ClientBehaviorRendererType/clientBehaviorRendererType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ClientBehaviorRendererType/clientBehaviorRendererClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ClientBehaviorRendererType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ClientBehaviorRendererTypeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ClientBehaviorRendererTypeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ClientBehaviorRendererTypeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentFamilyType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentFamilyType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentFamilyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/componentType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/componentClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/facet"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ComponentType/componentExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ComponentTypeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentTypeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ComponentTypeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterForClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterForClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterForClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterForClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ConverterType/converterExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ConverterType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ConverterExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultLocaleType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultLocaleType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultLocaleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultRenderKitIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultRenderKitIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultRenderKitIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultValidatorsType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DefaultValidatorsType/validatorId"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultValidatorsType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DefaultValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultValueType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DefaultValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DescriptionType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DescriptionType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DescriptionType/lang"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DescriptionType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DisplayNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DisplayNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DisplayNameType/lang"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DisplayNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DocumentRoot">
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DocumentRoot/mixed"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/xMLNSPrefixMap"/>
-      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/xSISchemaLocation"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/absoluteOrdering"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/actionListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/application"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/applicationFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/attributeName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/behavior"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/behaviorClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/behaviorId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/behaviorExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/component"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentFamily"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/componentType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converter"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterForClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/converterId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultLocale"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultRenderKitId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultValidators"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/defaultValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/exceptionHandlerFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/externalContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facesConfig"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facesContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facet"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facetExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/facetName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/factory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromAction"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromOutcome"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/fromViewId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/if"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/key"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/keyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/largeIcon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/lifecycle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/lifecycleFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/listEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/localeConfig"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBean"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedBeanScope"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/managedProperty"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/mapEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/mapEntry"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/messageBundle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationCase"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/navigationRule"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/nullValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/ordering"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/orderingOrdering"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/others"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/partialTraversal"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/partialViewContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/phaseListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/propertyResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/redirect"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/redirectViewParam"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBean"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBeanClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/referencedBeanName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderer"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererExtension"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/rendererType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKit"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/renderKitId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/resourceHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/smallIcon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/sourceClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/stateManager"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/suggestedValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/supportedLocale"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/systemEventClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/systemEventListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/systemEventListenerClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/tagHandlerDelegateFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/toViewId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validator"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validatorClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/validatorId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/value"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/valueClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/variableResolver"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/viewDeclarationLanguageFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/viewHandler"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DocumentRoot/visitContextFactory"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DynamicAttribute">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicAttribute/name"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicAttribute/value"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//DynamicElement">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DynamicElement/childNodes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicElement/name"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//DynamicElement/attributes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//DynamicElement/textContent"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ELResolverType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ELResolverType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ELResolverType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ExceptionHandlerFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExceptionHandlerFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExceptionHandlerFactoryType/id"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="FacesConfig.ecore#//ExtensionType">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ExtensionType/childNodes"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExtensionType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExtensionType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ExternalContextFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExternalContextFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ExternalContextFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacesConfigType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/application"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/ordering"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/absoluteOrdering"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/factory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/component"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/converter"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/managedBean"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/navigationRule"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/referencedBean"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/renderKit"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/lifecycle"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/validator"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/behavior"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacesConfigType/facesConfigExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesConfigType/xmlns"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesConfigType/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesConfigType/metadataComplete"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacesConfigExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacesContextFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesContextFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacesContextFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacetExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacetNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacetNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacetNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FacetType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/facetName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FacetType/facetExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FacetType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FactoryType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/applicationFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/exceptionHandlerFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/externalContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/facesContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/partialViewContextFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/lifecycleFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/viewDeclarationLanguageFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/tagHandlerDelegateFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/renderKitFactory"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/visitContextFactory"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//FactoryType/factoryExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FactoryExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//FromActionType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromActionType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromActionType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FromOutcomeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromOutcomeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromOutcomeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//FromViewIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromViewIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//FromViewIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//IconType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//IconType/smallIcon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//IconType/largeIcon"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//IconType/lang"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//IconType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//IfType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//IfType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//IfType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//KeyClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//KeyType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//KeyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LargeIconType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LargeIconType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LargeIconType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LifecycleFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LifecycleFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LifecycleFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LifecycleType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LifecycleType/phaseListener"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LifecycleType/lifecycleExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LifecycleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LifecycleExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ListEntriesType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ListEntriesType/valueClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ListEntriesType/nullValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ListEntriesType/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ListEntriesType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//LocaleConfigType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LocaleConfigType/defaultLocale"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//LocaleConfigType/supportedLocale"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//LocaleConfigType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanScopeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanScopeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanScopeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanScope"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedProperty"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/mapEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/listEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedBeanType/managedBeanExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanType/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedBeanType/eager"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedBeanExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ManagedPropertyType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/propertyName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/propertyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/mapEntries"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/nullValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/value"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ManagedPropertyType/listEntries"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ManagedPropertyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//MapEntriesType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntriesType/keyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntriesType/valueClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntriesType/mapEntry"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MapEntriesType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//MapEntryType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/key"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/nullValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//MapEntryType/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MapEntryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//MessageBundleType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MessageBundleType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//MessageBundleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationCaseType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/fromAction"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/fromOutcome"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/if"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/toViewId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationCaseType/redirect"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationCaseType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationHandlerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationHandlerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationHandlerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationRuleType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/fromViewId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/navigationCase"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//NavigationRuleType/navigationRuleExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NavigationRuleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//NavigationRuleExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//NullValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//NullValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//OrderingType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//OrderingType/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//OrderingType/before"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//OrderingType/after"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//OrderingOrderingType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//OrderingOrderingType/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//OrderingOrderingType/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//OrderingOrderingType/others"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//OrderingOthersType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//OrderingOthersType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PartialTraversalType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PartialTraversalType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PartialTraversalType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PartialViewContextFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PartialViewContextFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PartialViewContextFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PhaseListenerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PhaseListenerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PhaseListenerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyResolverType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyResolverType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyResolverType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//PropertyType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/defaultValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/suggestedValue"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//PropertyType/propertyExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//PropertyType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RedirectType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RedirectType/viewParam"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RedirectType/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RedirectType/includeViewParams"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RedirectViewParamType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RedirectViewParamType/name"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RedirectViewParamType/value"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RedirectViewParamType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ReferencedBeanClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ReferencedBeanNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ReferencedBeanType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/referencedBeanName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ReferencedBeanType/referencedBeanClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ReferencedBeanType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/componentFamily"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/rendererType"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/rendererClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/facet"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RendererType/rendererExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RendererTypeType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererTypeType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RendererTypeType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderKitId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderKitClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderer"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/clientBehaviorRenderer"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//RenderKitType/renderKitExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//RenderKitType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//RenderKitExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ResourceHandlerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ResourceHandlerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ResourceHandlerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SmallIconType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SmallIconType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SmallIconType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SourceClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SourceClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SourceClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//StateManagerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//StateManagerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//StateManagerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SuggestedValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SuggestedValueType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SuggestedValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SupportedLocaleType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SupportedLocaleType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SupportedLocaleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SystemEventClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SystemEventClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SystemEventClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SystemEventListenerClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SystemEventListenerClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SystemEventListenerClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//SystemEventListenerType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//SystemEventListenerType/systemEventListenerClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//SystemEventListenerType/systemEventClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//SystemEventListenerType/sourceClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//SystemEventListenerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//TagHandlerDelegateFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//TagHandlerDelegateFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//TagHandlerDelegateFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ToViewIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ToViewIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ToViewIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorIdType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorIdType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorIdType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/icon"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/validatorId"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/validatorClass"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/attribute"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/property"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ValidatorType/validatorExtension"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValidatorType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValidatorExtensionType"/>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValueClassType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueClassType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueClassType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ValueType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ValueType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//VariableResolverType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VariableResolverType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VariableResolverType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ViewHandlerType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ViewHandlerType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ViewHandlerType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ResourceBundleType">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/description"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/displayName"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/icon"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/baseName"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference FacesConfig.ecore#//ResourceBundleType/var"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ResourceBundleType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//BaseNameType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BaseNameType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//BaseNameType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//VarType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VarType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VarType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//ViewDeclarationLanguageFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ViewDeclarationLanguageFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//ViewDeclarationLanguageFactoryType/id"/>
-    </genClasses>
-    <genClasses ecoreClass="FacesConfig.ecore#//VisitContextFactoryType">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VisitContextFactoryType/textContent"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute FacesConfig.ecore#//VisitContextFactoryType/id"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/templates/Header.javajetinc b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/templates/Header.javajetinc
deleted file mode 100644
index 8612b81..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/model/templates/Header.javajetinc
+++ /dev/null
@@ -1,11 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: 
- *   IBM Corporation - initial API and implementation
- *   Oracle Corporation - revision
- **************************************************************************************************/
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.properties
deleted file mode 100644
index 3bf0208..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.properties
+++ /dev/null
@@ -1,691 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-plugin.name = JavaServer Faces Tools - FacesConfig Model
-plugin.provider=Eclipse.org
-
-################
-# Content Type #
-################
-
-facesconfig.name = Faces Configuration File
-
-###########
-# Editors #
-###########
-
-facesconfig.editor.name = Faces Configuration File Editor
-OVERVIEW_PAGE_NAME = Overview
-APPLICATION_PAGE_NAME = Application
-FACTORY_PAGE_NAME = Factory
-COMPONENT_PAGE_NAME = Component
-CONVERTER_PAGE_NAME = Converter
-MANAGEDBEAN_PAGE_NAME = Managed Bean
-NAVIGATIONRULE_PAGE_NAME = Navigation Rule
-REFERENCEDBEAN_PAGE_NAME = Referenced Bean
-RENDERKIT_PAGE_NAME = RederKit
-LIFECYCLE_PAGE_NAME = Lifecycle
-VALIDATOR_PAGE_NAME = Validator
-SOURCE_PAGE_NAME = Source
-
-
-facesValidation.name = Faces Configuration File Validator
-# ====================================================================
-
-_UI_CreateChild_text = {0}
-_UI_CreateChild_text2 = {1} {0}
-_UI_CreateChild_text3 = {1}
-_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
-_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
-_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
-
-_UI_PropertyDescriptor_description = The {0} of the {1}
-
-_UI_ActionListenerType_type = Action Listener Type
-_UI_ApplicationFactoryType_type = Application Factory Type
-_UI_ApplicationType_type = Application Type
-_UI_AttributeClassType_type = Attribute Class Type
-_UI_AttributeExtensionType_type = Attribute Extension Type
-_UI_AttributeNameType_type = Attribute Name Type
-_UI_AttributeType_type = Attribute Type
-_UI_ComponentClassType_type = Component Class Type
-_UI_ComponentExtensionType_type = Component Extension Type
-_UI_ComponentFamilyType_type = Component Family Type
-_UI_ComponentType_type = Component
-_UI_ComponentTypeType_type = Component Type Type
-_UI_ConverterClassType_type = Converter Class Type
-_UI_ConverterForClassType_type = Converter For Class Type
-_UI_ConverterIdType_type = Converter Id Type
-_UI_ConverterType_type = Converter
-_UI_DefaultLocaleType_type = Default Locale Type
-_UI_DefaultRenderKitIdType_type = Default Render Kit Id Type
-_UI_DefaultValueType_type = Default Value Type
-_UI_DescriptionType_type = Description Type
-_UI_DisplayNameType_type = Display Name Type
-_UI_DocumentRoot_type = Document Root
-_UI_FacesConfigType_type = Type
-_UI_FacesContextFactoryType_type = Faces Context Factory Type
-_UI_FacetExtensionType_type = Facet Extension Type
-_UI_FacetNameType_type = Facet Name Type
-_UI_FacetType_type = Facet Type
-_UI_FactoryType_type = Factory Type
-_UI_FromActionType_type = From Action Type
-_UI_FromOutcomeType_type = From Outcome Type
-_UI_FromViewIdType_type = From View Id Type
-_UI_IconType_type = Icon Type
-_UI_KeyClassType_type = Key Class Type
-_UI_KeyType_type = Key Type
-_UI_LargeIconType_type = Large Icon Type
-_UI_LifecycleFactoryType_type = Lifecycle Factory Type
-_UI_LifecycleType_type = Lifecycle Type
-_UI_ListEntriesType_type = List Entries Type
-_UI_LocaleConfigType_type = Locale Config Type
-_UI_ManagedBeanClassType_type = Managed Bean Class Type
-_UI_ManagedBeanNameType_type = Managed Bean Name Type
-_UI_ManagedBeanScopeType_type = Managed Bean Scope Type
-_UI_ManagedBeanType_type = Managed Bean Type
-_UI_ManagedPropertyType_type = Managed Property Type
-_UI_MapEntriesType_type = Map Entries Type
-_UI_MapEntryType_type = Map Entry Type
-_UI_MessageBundleType_type = Message Bundle Type
-_UI_NavigationCaseType_type = Navigation Case Type
-_UI_NavigationHandlerType_type = Navigation Handler Type
-_UI_NavigationRuleType_type = Navigation Rule Type
-_UI_NullValueType_type = Null Value Type
-_UI_PhaseListenerType_type = Phase Listener Type
-_UI_PropertyClassType_type = Property Class Type
-_UI_PropertyExtensionType_type = Property Extension Type
-_UI_PropertyNameType_type = Property Name Type
-_UI_PropertyResolverType_type = Property Resolver Type
-_UI_PropertyType_type = Property Type
-_UI_RedirectType_type = Redirect Type
-_UI_ReferencedBeanClassType_type = Referenced Bean Class Type
-_UI_ReferencedBeanNameType_type = Referenced Bean Name Type
-_UI_ReferencedBeanType_type = Referenced Bean Type
-_UI_RendererClassType_type = Renderer Class Type
-_UI_RendererExtensionType_type = Renderer Extension Type
-_UI_RendererType_type = Renderer Type
-_UI_RendererTypeType_type = Renderer Type Type
-_UI_RenderKitClassType_type = Render Kit Class Type
-_UI_RenderKitFactoryType_type = Render Kit Factory Type
-_UI_RenderKitIdType_type = Render Kit Id Type
-_UI_RenderKitType_type = Render Kit
-_UI_SmallIconType_type = Small Icon Type
-_UI_StateManagerType_type = State Manager Type
-_UI_SuggestedValueType_type = Suggested Value Type
-_UI_SupportedLocaleType_type = Supported Locale Type
-_UI_ToViewIdType_type = To View Id Type
-_UI_ValidatorClassType_type = Validator Class Type
-_UI_ValidatorIdType_type = Validator Id Type
-_UI_ValidatorType_type = Validator
-_UI_ValueClassType_type = Value Class Type
-_UI_ValueType_type = Value Type
-_UI_VariableResolverType_type = Variable Resolver Type
-_UI_ViewHandlerType_type = View Handler Type
-_UI_Unknown_type = Object
-
-_UI_Unknown_datatype= Value
-
-_UI_ActionListenerType_textContent_feature = Text Content
-_UI_ActionListenerType_id_feature = Id
-_UI_ApplicationFactoryType_textContent_feature = Text Content
-_UI_ApplicationFactoryType_id_feature = Id
-_UI_ApplicationType_actionListener_feature = Action Listener
-_UI_ApplicationType_defaultRenderKitId_feature = Default Render Kit Id
-_UI_ApplicationType_messageBundle_feature = Message Bundle
-_UI_ApplicationType_navigationHandler_feature = Navigation Handler
-_UI_ApplicationType_viewHandler_feature = View Handler
-_UI_ApplicationType_stateManager_feature = State Manager
-_UI_ApplicationType_propertyResolver_feature = Property Resolver
-_UI_ApplicationType_variableResolver_feature = Variable Resolver
-_UI_ApplicationType_localeConfig_feature = Locale Config
-_UI_ApplicationType_id_feature = Id
-_UI_AttributeClassType_textContent_feature = Text Content
-_UI_AttributeClassType_id_feature = Id
-_UI_AttributeExtensionType_mixed_feature = Mixed
-_UI_AttributeExtensionType_group_feature = Group
-_UI_AttributeExtensionType_any_feature = Any
-_UI_AttributeExtensionType_id_feature = Id
-_UI_AttributeNameType_textContent_feature = Text Content
-_UI_AttributeNameType_id_feature = Id
-_UI_AttributeType_description_feature = Description
-_UI_AttributeType_displayName_feature = Display Name
-_UI_AttributeType_icon_feature = Icon
-_UI_AttributeType_attributeName_feature = Attribute Name
-_UI_AttributeType_attributeClass_feature = Attribute Class
-_UI_AttributeType_defaultValue_feature = Default Value
-_UI_AttributeType_suggestedValue_feature = Suggested Value
-_UI_AttributeType_attributeExtension_feature = Attribute Extension
-_UI_AttributeType_id_feature = Id
-_UI_ComponentClassType_textContent_feature = Text Content
-_UI_ComponentClassType_id_feature = Id
-_UI_ComponentExtensionType_mixed_feature = Mixed
-_UI_ComponentExtensionType_group_feature = Group
-_UI_ComponentExtensionType_any_feature = Any
-_UI_ComponentExtensionType_id_feature = Id
-_UI_ComponentFamilyType_textContent_feature = Text Content
-_UI_ComponentFamilyType_id_feature = Id
-_UI_ComponentType_description_feature = Description
-_UI_ComponentType_displayName_feature = Display Name
-_UI_ComponentType_icon_feature = Icon
-_UI_ComponentType_componentType_feature = Component Type
-_UI_ComponentType_componentClass_feature = Component Class
-_UI_ComponentType_facet_feature = Facet
-_UI_ComponentType_attribute_feature = Attribute
-_UI_ComponentType_property_feature = Property
-_UI_ComponentType_componentExtension_feature = Component Extension
-_UI_ComponentType_id_feature = Id
-_UI_ComponentTypeType_textContent_feature = Text Content
-_UI_ComponentTypeType_id_feature = Id
-_UI_ConverterClassType_textContent_feature = Text Content
-_UI_ConverterClassType_id_feature = Id
-_UI_ConverterForClassType_textContent_feature = Text Content
-_UI_ConverterForClassType_id_feature = Id
-_UI_ConverterIdType_textContent_feature = Text Content
-_UI_ConverterIdType_id_feature = Id
-_UI_ConverterType_description_feature = Description
-_UI_ConverterType_displayName_feature = Display Name
-_UI_ConverterType_icon_feature = Icon
-_UI_ConverterType_converterId_feature = Converter Id
-_UI_ConverterType_converterForClass_feature = Converter For Class
-_UI_ConverterType_converterClass_feature = Converter Class
-_UI_ConverterType_attribute_feature = Attribute
-_UI_ConverterType_property_feature = Property
-_UI_ConverterType_id_feature = Id
-_UI_DefaultLocaleType_textContent_feature = Text Content
-_UI_DefaultLocaleType_id_feature = Id
-_UI_DefaultRenderKitIdType_textContent_feature = Text Content
-_UI_DefaultRenderKitIdType_id_feature = Id
-_UI_DefaultValueType_textContent_feature = Text Content
-_UI_DefaultValueType_id_feature = Id
-_UI_DescriptionType_textContent_feature = Text Content
-_UI_DescriptionType_lang_feature = Lang
-_UI_DescriptionType_id_feature = Id
-_UI_DisplayNameType_textContent_feature = Text Content
-_UI_DisplayNameType_lang_feature = Lang
-_UI_DisplayNameType_id_feature = Id
-_UI_DocumentRoot_mixed_feature = Mixed
-_UI_DocumentRoot_xMLNSPrefixMap_feature = XMLNS Prefix Map
-_UI_DocumentRoot_xSISchemaLocation_feature = XSI Schema Location
-_UI_DocumentRoot_actionListener_feature = Action Listener
-_UI_DocumentRoot_application_feature = Application
-_UI_DocumentRoot_applicationFactory_feature = Application Factory
-_UI_DocumentRoot_attribute_feature = Attribute
-_UI_DocumentRoot_attributeClass_feature = Attribute Class
-_UI_DocumentRoot_attributeExtension_feature = Attribute Extension
-_UI_DocumentRoot_attributeName_feature = Attribute Name
-_UI_DocumentRoot_component_feature = Component
-_UI_DocumentRoot_componentClass_feature = Component Class
-_UI_DocumentRoot_componentExtension_feature = Component Extension
-_UI_DocumentRoot_componentFamily_feature = Component Family
-_UI_DocumentRoot_componentType_feature = Component Type
-_UI_DocumentRoot_converter_feature = Converter
-_UI_DocumentRoot_converterClass_feature = Converter Class
-_UI_DocumentRoot_converterForClass_feature = Converter For Class
-_UI_DocumentRoot_converterId_feature = Converter Id
-_UI_DocumentRoot_defaultLocale_feature = Default Locale
-_UI_DocumentRoot_defaultRenderKitId_feature = Default Render Kit Id
-_UI_DocumentRoot_defaultValue_feature = Default Value
-_UI_DocumentRoot_description_feature = Description
-_UI_DocumentRoot_displayName_feature = Display Name
-_UI_DocumentRoot_facesConfig_feature = Faces Config
-_UI_DocumentRoot_facesContextFactory_feature = Faces Context Factory
-_UI_DocumentRoot_facet_feature = Facet
-_UI_DocumentRoot_facetExtension_feature = Facet Extension
-_UI_DocumentRoot_facetName_feature = Facet Name
-_UI_DocumentRoot_factory_feature = Factory
-_UI_DocumentRoot_fromAction_feature = From Action
-_UI_DocumentRoot_fromOutcome_feature = From Outcome
-_UI_DocumentRoot_fromViewId_feature = From View Id
-_UI_DocumentRoot_icon_feature = Icon
-_UI_DocumentRoot_key_feature = Key
-_UI_DocumentRoot_keyClass_feature = Key Class
-_UI_DocumentRoot_largeIcon_feature = Large Icon
-_UI_DocumentRoot_lifecycle_feature = Lifecycle
-_UI_DocumentRoot_lifecycleFactory_feature = Lifecycle Factory
-_UI_DocumentRoot_listEntries_feature = List Entries
-_UI_DocumentRoot_localeConfig_feature = Locale Config
-_UI_DocumentRoot_managedBean_feature = Managed Bean
-_UI_DocumentRoot_managedBeanClass_feature = Managed Bean Class
-_UI_DocumentRoot_managedBeanName_feature = Managed Bean Name
-_UI_DocumentRoot_managedBeanScope_feature = Managed Bean Scope
-_UI_DocumentRoot_managedProperty_feature = Managed Property
-_UI_DocumentRoot_mapEntries_feature = Map Entries
-_UI_DocumentRoot_mapEntry_feature = Map Entry
-_UI_DocumentRoot_messageBundle_feature = Message Bundle
-_UI_DocumentRoot_navigationCase_feature = Navigation Case
-_UI_DocumentRoot_navigationHandler_feature = Navigation Handler
-_UI_DocumentRoot_navigationRule_feature = Navigation Rule
-_UI_DocumentRoot_nullValue_feature = Null Value
-_UI_DocumentRoot_phaseListener_feature = Phase Listener
-_UI_DocumentRoot_property_feature = Property
-_UI_DocumentRoot_propertyClass_feature = Property Class
-_UI_DocumentRoot_propertyExtension_feature = Property Extension
-_UI_DocumentRoot_propertyName_feature = Property Name
-_UI_DocumentRoot_propertyResolver_feature = Property Resolver
-_UI_DocumentRoot_redirect_feature = Redirect
-_UI_DocumentRoot_referencedBean_feature = Referenced Bean
-_UI_DocumentRoot_referencedBeanClass_feature = Referenced Bean Class
-_UI_DocumentRoot_referencedBeanName_feature = Referenced Bean Name
-_UI_DocumentRoot_renderer_feature = Renderer
-_UI_DocumentRoot_rendererClass_feature = Renderer Class
-_UI_DocumentRoot_rendererExtension_feature = Renderer Extension
-_UI_DocumentRoot_rendererType_feature = Renderer Type
-_UI_DocumentRoot_renderKit_feature = Render Kit
-_UI_DocumentRoot_renderKitClass_feature = Render Kit Class
-_UI_DocumentRoot_renderKitFactory_feature = Render Kit Factory
-_UI_DocumentRoot_renderKitId_feature = Render Kit Id
-_UI_DocumentRoot_smallIcon_feature = Small Icon
-_UI_DocumentRoot_stateManager_feature = State Manager
-_UI_DocumentRoot_suggestedValue_feature = Suggested Value
-_UI_DocumentRoot_supportedLocale_feature = Supported Locale
-_UI_DocumentRoot_toViewId_feature = To View Id
-_UI_DocumentRoot_validator_feature = Validator
-_UI_DocumentRoot_validatorClass_feature = Validator Class
-_UI_DocumentRoot_validatorId_feature = Validator Id
-_UI_DocumentRoot_value_feature = Value
-_UI_DocumentRoot_valueClass_feature = Value Class
-_UI_DocumentRoot_variableResolver_feature = Variable Resolver
-_UI_DocumentRoot_viewHandler_feature = View Handler
-_UI_FacesConfigType_application_feature = Application
-_UI_FacesConfigType_factory_feature = Factory
-_UI_FacesConfigType_component_feature = Component
-_UI_FacesConfigType_converter_feature = Converter
-_UI_FacesConfigType_managedBean_feature = Managed Bean
-_UI_FacesConfigType_navigationRule_feature = Navigation Rule
-_UI_FacesConfigType_referencedBean_feature = Referenced Bean
-_UI_FacesConfigType_renderKit_feature = Render Kit
-_UI_FacesConfigType_lifecycle_feature = Lifecycle
-_UI_FacesConfigType_validator_feature = Validator
-_UI_FacesConfigType_xmlns_feature = Xmlns
-_UI_FacesConfigType_id_feature = Id
-_UI_FacesContextFactoryType_textContent_feature = Text Content
-_UI_FacesContextFactoryType_id_feature = Id
-_UI_FacetExtensionType_mixed_feature = Mixed
-_UI_FacetExtensionType_group_feature = Group
-_UI_FacetExtensionType_any_feature = Any
-_UI_FacetExtensionType_id_feature = Id
-_UI_FacetNameType_textContent_feature = Text Content
-_UI_FacetNameType_id_feature = Id
-_UI_FacetType_description_feature = Description
-_UI_FacetType_displayName_feature = Display Name
-_UI_FacetType_icon_feature = Icon
-_UI_FacetType_facetName_feature = Facet Name
-_UI_FacetType_facetExtension_feature = Facet Extension
-_UI_FacetType_id_feature = Id
-_UI_FactoryType_applicationFactory_feature = Application Factory
-_UI_FactoryType_facesContextFactory_feature = Faces Context Factory
-_UI_FactoryType_lifecycleFactory_feature = Lifecycle Factory
-_UI_FactoryType_renderKitFactory_feature = Render Kit Factory
-_UI_FactoryType_id_feature = Id
-_UI_FromActionType_textContent_feature = Text Content
-_UI_FromActionType_id_feature = Id
-_UI_FromOutcomeType_textContent_feature = Text Content
-_UI_FromOutcomeType_id_feature = Id
-_UI_FromViewIdType_textContent_feature = Text Content
-_UI_FromViewIdType_id_feature = Id
-_UI_IconType_smallIcon_feature = Small Icon
-_UI_IconType_largeIcon_feature = Large Icon
-_UI_IconType_lang_feature = Lang
-_UI_IconType_id_feature = Id
-_UI_KeyClassType_textContent_feature = Text Content
-_UI_KeyClassType_id_feature = Id
-_UI_KeyType_textContent_feature = Text Content
-_UI_KeyType_id_feature = Id
-_UI_LargeIconType_textContent_feature = Text Content
-_UI_LargeIconType_id_feature = Id
-_UI_LifecycleFactoryType_textContent_feature = Text Content
-_UI_LifecycleFactoryType_id_feature = Id
-_UI_LifecycleType_phaseListener_feature = Phase Listener
-_UI_LifecycleType_id_feature = Id
-_UI_ListEntriesType_valueClass_feature = Value Class
-_UI_ListEntriesType_nullValue_feature = Null Value
-_UI_ListEntriesType_value_feature = Value
-_UI_ListEntriesType_id_feature = Id
-_UI_LocaleConfigType_defaultLocale_feature = Default Locale
-_UI_LocaleConfigType_supportedLocale_feature = Supported Locale
-_UI_LocaleConfigType_id_feature = Id
-_UI_ManagedBeanClassType_textContent_feature = Text Content
-_UI_ManagedBeanClassType_id_feature = Id
-_UI_ManagedBeanNameType_textContent_feature = Text Content
-_UI_ManagedBeanNameType_id_feature = Id
-_UI_ManagedBeanScopeType_textContent_feature = Text Content
-_UI_ManagedBeanScopeType_id_feature = Id
-_UI_ManagedBeanType_description_feature = Description
-_UI_ManagedBeanType_displayName_feature = Display Name
-_UI_ManagedBeanType_icon_feature = Icon
-_UI_ManagedBeanType_managedBeanName_feature = Managed Bean Name
-_UI_ManagedBeanType_managedBeanClass_feature = Managed Bean Class
-_UI_ManagedBeanType_managedBeanScope_feature = Managed Bean Scope
-_UI_ManagedBeanType_managedProperty_feature = Managed Property
-_UI_ManagedBeanType_mapEntries_feature = Map Entries
-_UI_ManagedBeanType_listEntries_feature = List Entries
-_UI_ManagedBeanType_id_feature = Id
-_UI_ManagedPropertyType_description_feature = Description
-_UI_ManagedPropertyType_displayName_feature = Display Name
-_UI_ManagedPropertyType_icon_feature = Icon
-_UI_ManagedPropertyType_propertyName_feature = Property Name
-_UI_ManagedPropertyType_propertyClass_feature = Property Class
-_UI_ManagedPropertyType_mapEntries_feature = Map Entries
-_UI_ManagedPropertyType_nullValue_feature = Null Value
-_UI_ManagedPropertyType_value_feature = Value
-_UI_ManagedPropertyType_listEntries_feature = List Entries
-_UI_ManagedPropertyType_id_feature = Id
-_UI_MapEntriesType_keyClass_feature = Key Class
-_UI_MapEntriesType_valueClass_feature = Value Class
-_UI_MapEntriesType_mapEntry_feature = Map Entry
-_UI_MapEntriesType_id_feature = Id
-_UI_MapEntryType_key_feature = Key
-_UI_MapEntryType_nullValue_feature = Null Value
-_UI_MapEntryType_value_feature = Value
-_UI_MapEntryType_id_feature = Id
-_UI_MessageBundleType_textContent_feature = Text Content
-_UI_MessageBundleType_id_feature = Id
-_UI_NavigationCaseType_description_feature = Description
-_UI_NavigationCaseType_displayName_feature = Display Name
-_UI_NavigationCaseType_icon_feature = Icon
-_UI_NavigationCaseType_fromAction_feature = From Action
-_UI_NavigationCaseType_fromOutcome_feature = From Outcome
-_UI_NavigationCaseType_toViewId_feature = To View Id
-_UI_NavigationCaseType_redirect_feature = Redirect
-_UI_NavigationCaseType_id_feature = Id
-_UI_NavigationHandlerType_textContent_feature = Text Content
-_UI_NavigationHandlerType_id_feature = Id
-_UI_NavigationRuleType_description_feature = Description
-_UI_NavigationRuleType_displayName_feature = Display Name
-_UI_NavigationRuleType_icon_feature = Icon
-_UI_NavigationRuleType_fromViewId_feature = From View Id
-_UI_NavigationRuleType_navigationCase_feature = Navigation Case
-_UI_NavigationRuleType_id_feature = Id
-_UI_NullValueType_id_feature = Id
-_UI_PhaseListenerType_textContent_feature = Text Content
-_UI_PhaseListenerType_id_feature = Id
-_UI_PropertyClassType_textContent_feature = Text Content
-_UI_PropertyClassType_id_feature = Id
-_UI_PropertyExtensionType_mixed_feature = Mixed
-_UI_PropertyExtensionType_group_feature = Group
-_UI_PropertyExtensionType_any_feature = Any
-_UI_PropertyExtensionType_id_feature = Id
-_UI_PropertyNameType_textContent_feature = Text Content
-_UI_PropertyNameType_id_feature = Id
-_UI_PropertyResolverType_textContent_feature = Text Content
-_UI_PropertyResolverType_id_feature = Id
-_UI_PropertyType_description_feature = Description
-_UI_PropertyType_displayName_feature = Display Name
-_UI_PropertyType_icon_feature = Icon
-_UI_PropertyType_propertyName_feature = Property Name
-_UI_PropertyType_propertyClass_feature = Property Class
-_UI_PropertyType_defaultValue_feature = Default Value
-_UI_PropertyType_suggestedValue_feature = Suggested Value
-_UI_PropertyType_propertyExtension_feature = Property Extension
-_UI_PropertyType_id_feature = Id
-_UI_RedirectType_id_feature = Id
-_UI_ReferencedBeanClassType_textContent_feature = Text Content
-_UI_ReferencedBeanClassType_id_feature = Id
-_UI_ReferencedBeanNameType_textContent_feature = Text Content
-_UI_ReferencedBeanNameType_id_feature = Id
-_UI_ReferencedBeanType_description_feature = Description
-_UI_ReferencedBeanType_displayName_feature = Display Name
-_UI_ReferencedBeanType_icon_feature = Icon
-_UI_ReferencedBeanType_referencedBeanName_feature = Referenced Bean Name
-_UI_ReferencedBeanType_referencedBeanClass_feature = Referenced Bean Class
-_UI_ReferencedBeanType_id_feature = Id
-_UI_RendererClassType_textContent_feature = Text Content
-_UI_RendererClassType_id_feature = Id
-_UI_RendererExtensionType_mixed_feature = Mixed
-_UI_RendererExtensionType_group_feature = Group
-_UI_RendererExtensionType_any_feature = Any
-_UI_RendererExtensionType_id_feature = Id
-_UI_RendererType_description_feature = Description
-_UI_RendererType_displayName_feature = Display Name
-_UI_RendererType_icon_feature = Icon
-_UI_RendererType_componentFamily_feature = Component Family
-_UI_RendererType_rendererType_feature = Renderer Type
-_UI_RendererType_rendererClass_feature = Renderer Class
-_UI_RendererType_facet_feature = Facet
-_UI_RendererType_attribute_feature = Attribute
-_UI_RendererType_rendererExtension_feature = Renderer Extension
-_UI_RendererType_id_feature = Id
-_UI_RendererTypeType_textContent_feature = Text Content
-_UI_RendererTypeType_id_feature = Id
-_UI_RenderKitClassType_textContent_feature = Text Content
-_UI_RenderKitClassType_id_feature = Id
-_UI_RenderKitFactoryType_textContent_feature = Text Content
-_UI_RenderKitFactoryType_id_feature = Id
-_UI_RenderKitIdType_textContent_feature = Text Content
-_UI_RenderKitIdType_id_feature = Id
-_UI_RenderKitType_description_feature = Description
-_UI_RenderKitType_displayName_feature = Display Name
-_UI_RenderKitType_icon_feature = Icon
-_UI_RenderKitType_renderKitId_feature = Render Kit Id
-_UI_RenderKitType_renderKitClass_feature = Render Kit Class
-_UI_RenderKitType_renderer_feature = Renderer
-_UI_RenderKitType_id_feature = Id
-_UI_SmallIconType_textContent_feature = Text Content
-_UI_SmallIconType_id_feature = Id
-_UI_StateManagerType_textContent_feature = Text Content
-_UI_StateManagerType_id_feature = Id
-_UI_SuggestedValueType_textContent_feature = Text Content
-_UI_SuggestedValueType_id_feature = Id
-_UI_SupportedLocaleType_textContent_feature = Text Content
-_UI_SupportedLocaleType_id_feature = Id
-_UI_ToViewIdType_textContent_feature = Text Content
-_UI_ToViewIdType_id_feature = Id
-_UI_ValidatorClassType_textContent_feature = Text Content
-_UI_ValidatorClassType_id_feature = Id
-pluginName = FacesConfig Model
-providerName = www.example.org
-_UI_DynamicElement_type = Dynamic Element
-_UI_ExtensionType_type = Extension Type
-_UI_DynamicElement_childNodes_feature = Child Nodes
-_UI_DynamicElement_attributes_feature = Attributes
-_UI_DynamicElement_name_feature = Name
-_UI_ValidatorIdType_textContent_feature = Text Content
-_UI_ValidatorIdType_id_feature = Id
-_UI_ValidatorType_description_feature = Description
-_UI_ValidatorType_displayName_feature = Display Name
-_UI_ValidatorType_icon_feature = Icon
-_UI_ValidatorType_validatorId_feature = Validator Id
-_UI_ValidatorType_validatorClass_feature = Validator Class
-_UI_ValidatorType_attribute_feature = Attribute
-_UI_ValidatorType_property_feature = Property
-_UI_ValidatorType_id_feature = Id
-_UI_ValueClassType_textContent_feature = Text Content
-_UI_ValueClassType_id_feature = Id
-_UI_ValueType_textContent_feature = Text Content
-_UI_ValueType_id_feature = Id
-_UI_VariableResolverType_textContent_feature = Text Content
-_UI_VariableResolverType_id_feature = Id
-_UI_ViewHandlerType_textContent_feature = Text Content
-_UI_ViewHandlerType_id_feature = Id
-_UI_ExtensionType_childNodes_feature = Child Nodes
-_UI_ExtensionType_textContent_feature = Text Content
-_UI_XMLTypeDocumentRoot_comment_feature = Comment
-_UI_XMLTypeDocumentRoot_text_feature = Text
-_UI_XMLTypeDocumentRoot_cDATA_feature = CDATA
-_UI_Unknown_feature = Unspecified
-
-_UI_DynamicAttribute_type = Dynamic Attribute
-_UI_DynamicAttribute_name_feature = Name
-_UI_DynamicAttribute_value_feature = Value
-_UI_DynamicElement_textContent_feature = Text Content
-_UI_ExtensionType_id_feature = Id
-_UI_ELResolverType_type = EL Resolver Type
-_UI_ResourceBundleType_type = Resource Bundle Type
-_UI_BaseNameType_type = Base Name Type
-_UI_VarType_type = Var Type
-_UI_ApplicationType_elResolver_feature = El Resolver
-_UI_ApplicationType_resourceBundle_feature = Resource Bundle
-_UI_ELResolverType_textContent_feature = Text Content
-_UI_ELResolverType_id_feature = Id
-_UI_ResourceBundleType_description_feature = Description
-_UI_ResourceBundleType_displayName_feature = Display Name
-_UI_ResourceBundleType_icon_feature = Icon
-_UI_ResourceBundleType_baseName_feature = Base Name
-_UI_ResourceBundleType_var_feature = Var
-_UI_ResourceBundleType_id_feature = Id
-_UI_BaseNameType_textContent_feature = Text Content
-_UI_BaseNameType_id_feature = Id
-_UI_VarType_textContent_feature = Text Content
-_UI_VarType_id_feature = Id
-_UI_ApplicationType_eLResolver_feature = EL Resolver
-_UI_ApplicationExtensionType_type = Application Extension Type
-_UI_ApplicationType_applicationExtension_feature = Application Extension
-_UI_ConverterExtensionType_type = Converter Extension Type
-_UI_FacesConfigExtensionType_type = Extension Type
-_UI_FactoryExtensionType_type = Factory Extension Type
-_UI_LifecycleExtensionType_type = Lifecycle Extension Type
-_UI_ManagedBeanExtensionType_type = Managed Bean Extension Type
-_UI_NavigationRuleExtensionType_type = Navigation Rule Extension Type
-_UI_ValidatorExtensionType_type = Validator Extension Type
-_UI_ConverterType_converterExtension_feature = Converter Extension
-_UI_FacesConfigType_facesConfigExtension_feature = Faces Config Extension
-_UI_FactoryType_factoryExtension_feature = Factory Extension
-_UI_LifecycleType_lifecycleExtension_feature = Lifecycle Extension
-_UI_ManagedBeanType_managedBeanExtension_feature = Managed Bean Extension
-_UI_NavigationRuleType_navigationRuleExtension_feature = Navigation Rule Extension
-_UI_ValidatorType_validatorExtension_feature = Validator Extension
-_UI_RenderKitExtensionType_type = Render Kit Extension Type
-_UI_RenderKitType_renderKitExtension_feature = Render Kit Extension
-_UI_XMLTypeDocumentRoot_processingInstruction_feature = Processing Instruction
-_UI_AbsoluteOrderingType_type = Absolute Ordering Type
-_UI_BehaviorClassType_type = Behavior Class Type
-_UI_BehaviorIdType_type = Behavior Id Type
-_UI_BehaviorType_type = Behavior Type
-_UI_BehaviorExtensionType_type = Behavior Extension Type
-_UI_ClientBehaviorRendererClassType_type = Client Behavior Renderer Class Type
-_UI_ClientBehaviorRendererType_type = Client Behavior Renderer Type
-_UI_ClientBehaviorRendererTypeType_type = Client Behavior Renderer Type Type
-_UI_DefaultValidatorsType_type = Default Validators Type
-_UI_ExceptionHandlerFactoryType_type = Exception Handler Factory Type
-_UI_ExternalContextFactoryType_type = External Context Factory Type
-_UI_IfType_type = If Type
-_UI_NameType_type = Name Type
-_UI_OrderingType_type = Ordering Type
-_UI_OrderingOrderingType_type = Ordering Ordering Type
-_UI_OrderingOthersType_type = Ordering Others Type
-_UI_PartialTraversalType_type = Partial Traversal Type
-_UI_PartialViewContextFactoryType_type = Partial View Context Factory Type
-_UI_RedirectViewParamType_type = Redirect View Param Type
-_UI_ResourceHandlerType_type = Resource Handler Type
-_UI_SourceClassType_type = Source Class Type
-_UI_SystemEventClassType_type = System Event Class Type
-_UI_SystemEventListenerClassType_type = System Event Listener Class Type
-_UI_SystemEventListenerType_type = System Event Listener Type
-_UI_TagHandlerDelegateFactoryType_type = Tag Handler Delegate Factory Type
-_UI_ViewDeclarationLanguageFactoryType_type = View Declaration Language Factory Type
-_UI_VisitContextFactoryType_type = Visit Context Factory Type
-_UI_AbsoluteOrderingType_id_feature = Id
-_UI_AbsoluteOrderingType_name_feature = Name
-_UI_AbsoluteOrderingType_others_feature = Others
-_UI_ApplicationType_partialTraversal_feature = Partial Traversal
-_UI_ApplicationType_resourceHandler_feature = Resource Handler
-_UI_ApplicationType_systemEventListener_feature = System Event Listener
-_UI_ApplicationType_defaultValidators_feature = Default Validators
-_UI_BehaviorClassType_textContent_feature = Text Content
-_UI_BehaviorClassType_id_feature = Id
-_UI_BehaviorIdType_textContent_feature = Text Content
-_UI_BehaviorIdType_id_feature = Id
-_UI_BehaviorType_description_feature = Description
-_UI_BehaviorType_displayName_feature = Display Name
-_UI_BehaviorType_icon_feature = Icon
-_UI_BehaviorType_behaviorId_feature = Behavior Id
-_UI_BehaviorType_behaviorClass_feature = Behavior Class
-_UI_BehaviorType_attribute_feature = Attribute
-_UI_BehaviorType_property_feature = Property
-_UI_BehaviorType_behaviorExtension_feature = Behavior Extension
-_UI_BehaviorType_id_feature = Id
-_UI_ClientBehaviorRendererClassType_textContent_feature = Text Content
-_UI_ClientBehaviorRendererClassType_id_feature = Id
-_UI_ClientBehaviorRendererType_clientBehaviorRendererType_feature = Client Behavior Renderer Type
-_UI_ClientBehaviorRendererType_clientBehaviorRendererClass_feature = Client Behavior Renderer Class
-_UI_ClientBehaviorRendererType_id_feature = Id
-_UI_ClientBehaviorRendererTypeType_textContent_feature = Text Content
-_UI_ClientBehaviorRendererTypeType_id_feature = Id
-_UI_DefaultValidatorsType_validatorId_feature = Validator Id
-_UI_DefaultValidatorsType_id_feature = Id
-_UI_DocumentRoot_absoluteOrdering_feature = Absolute Ordering
-_UI_DocumentRoot_behavior_feature = Behavior
-_UI_DocumentRoot_behaviorClass_feature = Behavior Class
-_UI_DocumentRoot_behaviorId_feature = Behavior Id
-_UI_DocumentRoot_behaviorExtension_feature = Behavior Extension
-_UI_DocumentRoot_defaultValidators_feature = Default Validators
-_UI_DocumentRoot_exceptionHandlerFactory_feature = Exception Handler Factory
-_UI_DocumentRoot_externalContextFactory_feature = External Context Factory
-_UI_DocumentRoot_if_feature = If
-_UI_DocumentRoot_name_feature = Name
-_UI_DocumentRoot_ordering_feature = Ordering
-_UI_DocumentRoot_orderingOrdering_feature = Ordering Ordering
-_UI_DocumentRoot_others_feature = Others
-_UI_DocumentRoot_partialTraversal_feature = Partial Traversal
-_UI_DocumentRoot_partialViewContextFactory_feature = Partial View Context Factory
-_UI_DocumentRoot_redirectViewParam_feature = Redirect View Param
-_UI_DocumentRoot_resourceHandler_feature = Resource Handler
-_UI_DocumentRoot_sourceClass_feature = Source Class
-_UI_DocumentRoot_systemEventClass_feature = System Event Class
-_UI_DocumentRoot_systemEventListener_feature = System Event Listener
-_UI_DocumentRoot_systemEventListenerClass_feature = System Event Listener Class
-_UI_DocumentRoot_tagHandlerDelegateFactory_feature = Tag Handler Delegate Factory
-_UI_DocumentRoot_viewDeclarationLanguageFactory_feature = View Declaration Language Factory
-_UI_DocumentRoot_visitContextFactory_feature = Visit Context Factory
-_UI_ExceptionHandlerFactoryType_textContent_feature = Text Content
-_UI_ExceptionHandlerFactoryType_id_feature = Id
-_UI_ExternalContextFactoryType_textContent_feature = Text Content
-_UI_ExternalContextFactoryType_id_feature = Id
-_UI_FacesConfigType_ordering_feature = Ordering
-_UI_FacesConfigType_absoluteOrdering_feature = Absolute Ordering
-_UI_FacesConfigType_name_feature = Name
-_UI_FacesConfigType_behavior_feature = Behavior
-_UI_FacesConfigType_metadataComplete_feature = Metadata Complete
-_UI_FactoryType_exceptionHandlerFactory_feature = Exception Handler Factory
-_UI_FactoryType_externalContextFactory_feature = External Context Factory
-_UI_FactoryType_partialViewContextFactory_feature = Partial View Context Factory
-_UI_FactoryType_viewDeclarationLanguageFactory_feature = View Declaration Language Factory
-_UI_FactoryType_tagHandlerDelegateFactory_feature = Tag Handler Delegate Factory
-_UI_FactoryType_visitContextFactory_feature = Visit Context Factory
-_UI_IfType_textContent_feature = Text Content
-_UI_IfType_id_feature = Id
-_UI_ManagedBeanType_eager_feature = Eager
-_UI_NameType_textContent_feature = Text Content
-_UI_NameType_id_feature = Id
-_UI_NavigationCaseType_if_feature = If
-_UI_OrderingType_id_feature = Id
-_UI_OrderingType_before_feature = Before
-_UI_OrderingType_after_feature = After
-_UI_OrderingOrderingType_id_feature = Id
-_UI_OrderingOrderingType_name_feature = Name
-_UI_OrderingOrderingType_others_feature = Others
-_UI_OrderingOthersType_id_feature = Id
-_UI_PartialTraversalType_textContent_feature = Text Content
-_UI_PartialTraversalType_id_feature = Id
-_UI_PartialViewContextFactoryType_textContent_feature = Text Content
-_UI_PartialViewContextFactoryType_id_feature = Id
-_UI_RedirectType_viewParam_feature = View Param
-_UI_RedirectType_includeViewParams_feature = Include View Params
-_UI_RedirectViewParamType_name_feature = Name
-_UI_RedirectViewParamType_value_feature = Value
-_UI_RedirectViewParamType_id_feature = Id
-_UI_RenderKitType_clientBehaviorRenderer_feature = Client Behavior Renderer
-_UI_ResourceHandlerType_textContent_feature = Text Content
-_UI_ResourceHandlerType_id_feature = Id
-_UI_SourceClassType_textContent_feature = Text Content
-_UI_SourceClassType_id_feature = Id
-_UI_SystemEventClassType_textContent_feature = Text Content
-_UI_SystemEventClassType_id_feature = Id
-_UI_SystemEventListenerClassType_textContent_feature = Text Content
-_UI_SystemEventListenerClassType_id_feature = Id
-_UI_SystemEventListenerType_systemEventListenerClass_feature = System Event Listener Class
-_UI_SystemEventListenerType_systemEventClass_feature = System Event Class
-_UI_SystemEventListenerType_sourceClass_feature = Source Class
-_UI_SystemEventListenerType_id_feature = Id
-_UI_TagHandlerDelegateFactoryType_textContent_feature = Text Content
-_UI_TagHandlerDelegateFactoryType_id_feature = Id
-_UI_ViewDeclarationLanguageFactoryType_textContent_feature = Text Content
-_UI_ViewDeclarationLanguageFactoryType_id_feature = Id
-_UI_VisitContextFactoryType_textContent_feature = Text Content
-_UI_VisitContextFactoryType_id_feature = Id
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.xml
deleted file mode 100644
index 41304d2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/plugin.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension 
-      point="org.eclipse.core.contenttype.contentTypes"> 
-      <content-type  
-         id="org.eclipse.jst.jsf.facesconfig.facesConfigFile" 
-         name="%facesconfig.name" 
-         base-type="org.eclipse.core.runtime.xml" 
-         file-extensions="xml"
-         priority="high"> 
-         <describer 
-            class="org.eclipse.core.runtime.content.XMLRootElementContentDescriber"> 
-            <parameter name="element" value="faces-config" /> 
-         </describer> 
-      </content-type> 
-   </extension>
-  <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
-    <factory 
-       uri = "http://www.eclipse.org/webtools/jsf/schema/facesconfig.xsd" 
-       class = "org.eclipse.jst.jsf.facesconfig.edit.provider.FacesConfigItemProviderAdapterFactory" 
-       supportedTypes = 
-         "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
-          org.eclipse.emf.edit.provider.IStructuredItemContentProvider
-          org.eclipse.emf.edit.provider.ITreeItemContentProvider
-          org.eclipse.emf.edit.provider.IItemLabelProvider
-          org.eclipse.emf.edit.provider.IItemPropertySource" />
-  </extension>
-  <extension
-        point="org.eclipse.wst.common.emfworkbench.integration.editModel">
-     <editModel
-           editModelID="jsf.facesconfig"
-           factoryClass="org.eclipse.jst.common.jdt.internal.integration.JavaArtifactEditModelFactory">
-     </editModel>
-  </extension>
-
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.classpath b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.cvsignore
deleted file mode 100644
index 3d95935..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-build.xml
-javaCompiler...args
-temp.folder
-@dot
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.project b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.project
deleted file mode 100644
index 4246d9b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.standard.tagsupport</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index ecfb123..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:04:06 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8f6d800..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,65 +0,0 @@
-#Mon Jun 30 15:56:32 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 78bb525..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:56:44 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/META-INF/MANIFEST.MF
deleted file mode 100644
index fc5d322..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,15 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.jsf.standard.tagsupport;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Localization: plugin
-Bundle-Activator: org.eclipse.jst.jsf.standard.tagsupport.StandardTagSupportPlugin
-Require-Bundle: org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.jst.jsf.standard.tagsupport;x-internal:=true
-Bundle-Vendor: %pluginProvider
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/about.html b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/build.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/build.properties
deleted file mode 100644
index aa99bac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               metadata/,\
-               plugin.properties,\
-               about.html,\
-               icons/
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ACTIONSOURCE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ACTIONSOURCE.gif
deleted file mode 100644
index 633e543..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ACTIONSOURCE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ATTRIBUTE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ATTRIBUTE.gif
deleted file mode 100644
index e4fee22..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/ATTRIBUTE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EDITABLEVALUEHOLDER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EDITABLEVALUEHOLDER.gif
deleted file mode 100644
index da6bf2a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EDITABLEVALUEHOLDER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EXTENSION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EXTENSION.gif
deleted file mode 100644
index cb4aa6c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/EXTENSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/FACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/FACET.gif
deleted file mode 100644
index 6424c7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/FACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/IMPLEMENTATION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/IMPLEMENTATION.gif
deleted file mode 100644
index 9a1f263..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/IMPLEMENTATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTCHILDREN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTCHILDREN.gif
deleted file mode 100644
index e56a1c4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTCHILDREN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTFACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTFACET.gif
deleted file mode 100644
index d513bbd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INSERTFACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INTERFACE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INTERFACE.gif
deleted file mode 100644
index e684d92..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/INTERFACE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/RENDERFACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/RENDERFACET.gif
deleted file mode 100644
index 6424c7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/RENDERFACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/VALUEHOLDER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/VALUEHOLDER.gif
deleted file mode 100644
index 74aec16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/large/VALUEHOLDER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ACTIONSOURCE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ACTIONSOURCE.gif
deleted file mode 100644
index 193df83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ACTIONSOURCE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ATTRIBUTE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ATTRIBUTE.gif
deleted file mode 100644
index ad88267..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/ATTRIBUTE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EDITABLEVALUEHOLDER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EDITABLEVALUEHOLDER.gif
deleted file mode 100644
index 06af10d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EDITABLEVALUEHOLDER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EXTENSION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EXTENSION.gif
deleted file mode 100644
index b84636f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/EXTENSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/FACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/FACET.gif
deleted file mode 100644
index b9cb148..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/FACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/IMPLEMENTATION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/IMPLEMENTATION.gif
deleted file mode 100644
index f007dd0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/IMPLEMENTATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTCHILDREN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTCHILDREN.gif
deleted file mode 100644
index 9acef67..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTCHILDREN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTFACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTFACET.gif
deleted file mode 100644
index 6b6b6f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INSERTFACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INTERFACE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INTERFACE.gif
deleted file mode 100644
index c11b08f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/INTERFACE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/RENDERFACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/RENDERFACET.gif
deleted file mode 100644
index b9cb148..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/RENDERFACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/VALUEHOLDER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/VALUEHOLDER.gif
deleted file mode 100644
index 228dc2f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/Composite/small/VALUEHOLDER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_A.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_A.gif
deleted file mode 100644
index 4c57d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_A.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_BR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_BR.gif
deleted file mode 100644
index b468685..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_BR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_DIV.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_DIV.gif
deleted file mode 100644
index a8e5ddf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_DIV.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_FORM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_FORM.gif
deleted file mode 100644
index cc27deb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HEAD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HEAD.gif
deleted file mode 100644
index 4bdc052..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HEAD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HR.gif
deleted file mode 100644
index 44e283d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_HR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_IMG.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_IMG.gif
deleted file mode 100644
index 776fc8f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_IMG.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_BUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_BUTTON.gif
deleted file mode 100644
index 9ead4e4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_BUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_CHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_CHECKBOX.gif
deleted file mode 100644
index 4a02dde..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_CHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_HIDDEN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_HIDDEN.gif
deleted file mode 100644
index d14d09f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_HIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_IMAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_IMAGE.gif
deleted file mode 100644
index b12850f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_IMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_PASSWORD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_PASSWORD.gif
deleted file mode 100644
index 05d5fe5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_PASSWORD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_RADIO.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_RADIO.gif
deleted file mode 100644
index f6aeac0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_RADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_TEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_TEXT.gif
deleted file mode 100644
index 1c8fa1e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_INPUT_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_LINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_LINK.gif
deleted file mode 100644
index 4c57d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_LINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_OBJECT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_OBJECT.gif
deleted file mode 100644
index cba93bf..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_OBJECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_SELECT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_SELECT.gif
deleted file mode 100644
index 3831d95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_SELECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TABLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TABLE.gif
deleted file mode 100644
index 9873b09..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TEXTAREA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TEXTAREA.gif
deleted file mode 100644
index 25f22d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/large/HTML_TEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_A.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_A.gif
deleted file mode 100644
index 5fd9c94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_A.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_BR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_BR.gif
deleted file mode 100644
index b468685..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_BR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_DIV.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_DIV.gif
deleted file mode 100644
index 3a5674a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_DIV.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_FORM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_FORM.gif
deleted file mode 100644
index 3081f32..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HEAD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HEAD.gif
deleted file mode 100644
index 4bdc052..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HEAD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HR.gif
deleted file mode 100644
index 19ab614..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_HR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_IMG.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_IMG.gif
deleted file mode 100644
index 115cbc6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_IMG.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_BUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_BUTTON.gif
deleted file mode 100644
index 8e721c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_BUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_CHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_CHECKBOX.gif
deleted file mode 100644
index 00da14e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_CHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_HIDDEN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_HIDDEN.gif
deleted file mode 100644
index f18865b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_HIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_IMAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_IMAGE.gif
deleted file mode 100644
index 2a75963..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_IMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_PASSWORD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_PASSWORD.gif
deleted file mode 100644
index 25c2e26..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_PASSWORD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_RADIO.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_RADIO.gif
deleted file mode 100644
index 2598367..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_RADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_TEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_TEXT.gif
deleted file mode 100644
index 7f506d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_INPUT_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_LINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_LINK.gif
deleted file mode 100644
index 5fd9c94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_LINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_OBJECT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_OBJECT.gif
deleted file mode 100644
index 745f6d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_OBJECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_SELECT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_SELECT.gif
deleted file mode 100644
index 247efe0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_SELECT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TABLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TABLE.gif
deleted file mode 100644
index d11c996..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TEXTAREA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TEXTAREA.gif
deleted file mode 100644
index a2fa616..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/HTML/small/HTML_TEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ACTIONLISTENER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ACTIONLISTENER.gif
deleted file mode 100644
index 5dc1abc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ACTIONLISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_AJAX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_AJAX.gif
deleted file mode 100644
index 6b7c266..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_AJAX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ATTRIBUTE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ATTRIBUTE.gif
deleted file mode 100644
index d99d2eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_ATTRIBUTE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTDATETIME.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTDATETIME.gif
deleted file mode 100644
index f9f3409..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTDATETIME.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTER.gif
deleted file mode 100644
index a8f5d3a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTNUMBER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTNUMBER.gif
deleted file mode 100644
index 21b24f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_CONVERTNUMBER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_EVENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_EVENT.gif
deleted file mode 100644
index 6f8ad69..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_EVENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_FACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_FACET.gif
deleted file mode 100644
index 6424c7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_FACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_LOADBUNDLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_LOADBUNDLE.gif
deleted file mode 100644
index e1cd4e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_LOADBUNDLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_METADATA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_METADATA.gif
deleted file mode 100644
index 5f095ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_METADATA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_PARAM.gif
deleted file mode 100644
index 79e07c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEM.gif
deleted file mode 100644
index 3831d95..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEMS.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEMS.gif
deleted file mode 100644
index b2a1c43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SELECTITEMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SUBVIEW.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SUBVIEW.gif
deleted file mode 100644
index f37f412..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_SUBVIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEBEAN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEBEAN.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEDOUBLERANGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEDOUBLERANGE.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEDOUBLERANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELENGTH.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELENGTH.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELENGTH.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELONGRANGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELONGRANGE.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATELONGRANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREGEX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREGEX.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREGEX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREQUIRED.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREQUIRED.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATEREQUIRED.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATOR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATOR.gif
deleted file mode 100644
index afee57b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALIDATOR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALUECHANGELISTENER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALUECHANGELISTENER.gif
deleted file mode 100644
index 2fafdeb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VALUECHANGELISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VERBATIM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VERBATIM.gif
deleted file mode 100644
index d284eb9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VERBATIM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEW.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEW.gif
deleted file mode 100644
index 98294c1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEWPARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEWPARAM.gif
deleted file mode 100644
index 79e07c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/large/JSF_VIEWPARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif
deleted file mode 100644
index 67b2d33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_AJAX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_AJAX.gif
deleted file mode 100644
index 1524bed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_AJAX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif
deleted file mode 100644
index b77c750..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif
deleted file mode 100644
index 779d820..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTER.gif
deleted file mode 100644
index 16466ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif
deleted file mode 100644
index 938f364..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_EVENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_EVENT.gif
deleted file mode 100644
index acd5411..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_EVENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_FACET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_FACET.gif
deleted file mode 100644
index b9cb148..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_FACET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif
deleted file mode 100644
index 8f40ee1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_METADATA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_METADATA.gif
deleted file mode 100644
index 51218dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_METADATA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_PARAM.gif
deleted file mode 100644
index b3e0727..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEM.gif
deleted file mode 100644
index 247efe0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif
deleted file mode 100644
index 7fb0974..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SUBVIEW.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SUBVIEW.gif
deleted file mode 100644
index 9748015..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_SUBVIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEBEAN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEBEAN.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREGEX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREGEX.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREGEX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREQUIRED.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREQUIRED.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATEREQUIRED.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATOR.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATOR.gif
deleted file mode 100644
index 86196e9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALIDATOR.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif
deleted file mode 100644
index a1cd624..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VERBATIM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VERBATIM.gif
deleted file mode 100644
index f12c9df..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VERBATIM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEW.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEW.gif
deleted file mode 100644
index c81630a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEW.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEWPARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEWPARAM.gif
deleted file mode 100644
index b3e0727..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFCORE/small/JSF_VIEWPARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BODY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BODY.gif
deleted file mode 100644
index 25e2da4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BODY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BUTTON.gif
deleted file mode 100644
index 9ead4e4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_BUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COLUMN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COLUMN.gif
deleted file mode 100644
index 381154d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COLUMN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDBUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDBUTTON.gif
deleted file mode 100644
index 9ead4e4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDBUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDLINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDLINK.gif
deleted file mode 100644
index 4c57d0e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_COMMANDLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_DATATABLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_DATATABLE.gif
deleted file mode 100644
index 9873b09..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_DATATABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_FORM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_FORM.gif
deleted file mode 100644
index cc27deb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_GRAPHICIMAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_GRAPHICIMAGE.gif
deleted file mode 100644
index ad341a5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_GRAPHICIMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_HEAD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_HEAD.gif
deleted file mode 100644
index c4dc6a1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_HEAD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTHIDDEN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTHIDDEN.gif
deleted file mode 100644
index d14d09f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTHIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTSECRET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTSECRET.gif
deleted file mode 100644
index 60c0a5d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTSECRET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXT.gif
deleted file mode 100644
index 4cc147e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXTAREA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXTAREA.gif
deleted file mode 100644
index 25f22d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_INPUTTEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_LINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_LINK.gif
deleted file mode 100644
index 03b2bf9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_LINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGE.gif
deleted file mode 100644
index fb737eb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGES.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGES.gif
deleted file mode 100644
index ca050e6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_MESSAGES.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTFORMAT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTFORMAT.gif
deleted file mode 100644
index ac5920d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTFORMAT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLABEL.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLABEL.gif
deleted file mode 100644
index 348aa17..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLABEL.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLINK.gif
deleted file mode 100644
index 03b2bf9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSCRIPT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSCRIPT.gif
deleted file mode 100644
index b0444b2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSCRIPT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSTYLESHEET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSTYLESHEET.gif
deleted file mode 100644
index c4d3be8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTSTYLESHEET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTTEXT.gif
deleted file mode 100644
index 295ecc4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_OUTPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGRID.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGRID.gif
deleted file mode 100644
index a31479c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGRID.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGROUP.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGROUP.gif
deleted file mode 100644
index da85fe9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_PANELGROUP.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTBOOLEANCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTBOOLEANCHECKBOX.gif
deleted file mode 100644
index 4a02dde..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTBOOLEANCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYCHECKBOX.gif
deleted file mode 100644
index 31b1f37..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYLISTBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYLISTBOX.gif
deleted file mode 100644
index 0ed9443..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYLISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYMENU.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYMENU.gif
deleted file mode 100644
index dc1dbbc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTMANYMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONELISTBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONELISTBOX.gif
deleted file mode 100644
index a1c257e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONELISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONEMENU.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONEMENU.gif
deleted file mode 100644
index 3686b5c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONEMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONERADIO.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONERADIO.gif
deleted file mode 100644
index f6aeac0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/large/JSF_SELECTONERADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BODY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BODY.gif
deleted file mode 100644
index 85d3938..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BODY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BUTTON.gif
deleted file mode 100644
index 8e721c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_BUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COLUMN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COLUMN.gif
deleted file mode 100644
index 5a3db49..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COLUMN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDBUTTON.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDBUTTON.gif
deleted file mode 100644
index 8e721c5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDBUTTON.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDLINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDLINK.gif
deleted file mode 100644
index 5fd9c94..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_COMMANDLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_DATATABLE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_DATATABLE.gif
deleted file mode 100644
index d11c996..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_DATATABLE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_FORM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_FORM.gif
deleted file mode 100644
index 3081f32..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_FORM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_GRAPHICIMAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_GRAPHICIMAGE.gif
deleted file mode 100644
index a988c1d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_GRAPHICIMAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_HEAD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_HEAD.gif
deleted file mode 100644
index 41230ca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_HEAD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif
deleted file mode 100644
index f18865b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTSECRET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTSECRET.gif
deleted file mode 100644
index 13dbf62..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTSECRET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXT.gif
deleted file mode 100644
index 7f506d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXTAREA.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXTAREA.gif
deleted file mode 100644
index a2fa616..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_INPUTTEXTAREA.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_LINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_LINK.gif
deleted file mode 100644
index 5216956..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_LINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGE.gif
deleted file mode 100644
index 7d0c261..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGES.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGES.gif
deleted file mode 100644
index 6f43980..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_MESSAGES.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTFORMAT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTFORMAT.gif
deleted file mode 100644
index 29dcd77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTFORMAT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLABEL.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLABEL.gif
deleted file mode 100644
index b957bca..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLABEL.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLINK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLINK.gif
deleted file mode 100644
index 5216956..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTLINK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSCRIPT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSCRIPT.gif
deleted file mode 100644
index 6a3ed20..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSCRIPT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSTYLESHEET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSTYLESHEET.gif
deleted file mode 100644
index 77d14c3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTSTYLESHEET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTTEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTTEXT.gif
deleted file mode 100644
index 0845145..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_OUTPUTTEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGRID.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGRID.gif
deleted file mode 100644
index dd22a99..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGRID.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGROUP.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGROUP.gif
deleted file mode 100644
index 0a13d8c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_PANELGROUP.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTBOOLEANCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTBOOLEANCHECKBOX.gif
deleted file mode 100644
index 00da14e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTBOOLEANCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYCHECKBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYCHECKBOX.gif
deleted file mode 100644
index 2e2370d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYCHECKBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYLISTBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYLISTBOX.gif
deleted file mode 100644
index a20aed5..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYLISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYMENU.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYMENU.gif
deleted file mode 100644
index 4cfeaa8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTMANYMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONELISTBOX.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONELISTBOX.gif
deleted file mode 100644
index f6445ed..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONELISTBOX.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONEMENU.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONEMENU.gif
deleted file mode 100644
index 04a0d43..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONEMENU.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONERADIO.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONERADIO.gif
deleted file mode 100644
index 2598367..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSFHTML/small/JSF_SELECTONERADIO.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DECLARATION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DECLARATION.gif
deleted file mode 100644
index 5403f72..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DECLARATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif
deleted file mode 100644
index 5926670..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif
deleted file mode 100644
index e21e763..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.PAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif
deleted file mode 100644
index 723a10d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_DIRECTIVE.TAGLIB.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_EXPRESSION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_EXPRESSION.gif
deleted file mode 100644
index 53a23e1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_EXPRESSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FALLBACK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FALLBACK.gif
deleted file mode 100644
index 2507aac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FALLBACK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FORWARD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FORWARD.gif
deleted file mode 100644
index 7747595..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_FORWARD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_GETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_GETPROPERTY.gif
deleted file mode 100644
index 4d11f8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_GETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_INCLUDE.gif
deleted file mode 100644
index 88e62b4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAM.gif
deleted file mode 100644
index 79e07c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAMS.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAMS.gif
deleted file mode 100644
index 9f517ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PARAMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PLUGIN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PLUGIN.gif
deleted file mode 100644
index 2ba7b4b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_PLUGIN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_ROOT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_ROOT.gif
deleted file mode 100644
index 922b61d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_ROOT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SCRIPTLET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SCRIPTLET.gif
deleted file mode 100644
index a1d2e61..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SCRIPTLET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SETPROPERTY.gif
deleted file mode 100644
index 4d11f8d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_SETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_TEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_TEXT.gif
deleted file mode 100644
index 4cc147e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_USEBEAN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_USEBEAN.gif
deleted file mode 100644
index 9d54e8b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/large/JSP_USEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DECLARATION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DECLARATION.gif
deleted file mode 100644
index 35f48ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DECLARATION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif
deleted file mode 100644
index 1ef9c8f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif
deleted file mode 100644
index 37c1e7c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.PAGE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif
deleted file mode 100644
index 33ef3d8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_DIRECTIVE.TAGLIB.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_EXPRESSION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_EXPRESSION.gif
deleted file mode 100644
index 66fd649..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_EXPRESSION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FALLBACK.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FALLBACK.gif
deleted file mode 100644
index 4fb4150..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FALLBACK.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FORWARD.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FORWARD.gif
deleted file mode 100644
index 1d3bafb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_FORWARD.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_GETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_GETPROPERTY.gif
deleted file mode 100644
index af4450a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_GETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_INCLUDE.gif
deleted file mode 100644
index 2584c31..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAM.gif
deleted file mode 100644
index b3e0727..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAMS.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAMS.gif
deleted file mode 100644
index 4075922..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PARAMS.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PLUGIN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PLUGIN.gif
deleted file mode 100644
index 04bab8e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_PLUGIN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_ROOT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_ROOT.gif
deleted file mode 100644
index f6d19d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_ROOT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SCRIPTLET.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SCRIPTLET.gif
deleted file mode 100644
index 1753b96..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SCRIPTLET.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SETPROPERTY.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SETPROPERTY.gif
deleted file mode 100644
index af4450a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_SETPROPERTY.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_TEXT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_TEXT.gif
deleted file mode 100644
index 7f506d9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_TEXT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_USEBEAN.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_USEBEAN.gif
deleted file mode 100644
index ba33db7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/JSP/small/JSP_USEBEAN.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPONENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPONENT.gif
deleted file mode 100644
index a2bad20..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPONENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPOSITION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPOSITION.gif
deleted file mode 100644
index 754776a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_COMPOSITION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEBUG.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEBUG.gif
deleted file mode 100644
index 5d42393..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEBUG.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DECORATE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DECORATE.gif
deleted file mode 100644
index 3258914..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DECORATE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEFINE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEFINE.gif
deleted file mode 100644
index bb97502..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_DEFINE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_FRAGMENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_FRAGMENT.gif
deleted file mode 100644
index b5318ea..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_FRAGMENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INCLUDE.gif
deleted file mode 100644
index 236b6dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INSERT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INSERT.gif
deleted file mode 100644
index 7616305..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_INSERT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_PARAM.gif
deleted file mode 100644
index 64c3b5d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REMOVE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REMOVE.gif
deleted file mode 100644
index ac9e7a6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REMOVE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REPEAT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REPEAT.gif
deleted file mode 100644
index 3e9b63a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/large/UI_REPEAT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPONENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPONENT.gif
deleted file mode 100644
index 1fd5777..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPONENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPOSITION.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPOSITION.gif
deleted file mode 100644
index 2a74310..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_COMPOSITION.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEBUG.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEBUG.gif
deleted file mode 100644
index 3364b0b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEBUG.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DECORATE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DECORATE.gif
deleted file mode 100644
index 80aa539..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DECORATE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEFINE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEFINE.gif
deleted file mode 100644
index aee16f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_DEFINE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_FRAGMENT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_FRAGMENT.gif
deleted file mode 100644
index 5bb766b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_FRAGMENT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INCLUDE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INCLUDE.gif
deleted file mode 100644
index f52b3c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INCLUDE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INSERT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INSERT.gif
deleted file mode 100644
index 292cc11..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_INSERT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_PARAM.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_PARAM.gif
deleted file mode 100644
index 618fa1c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_PARAM.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REMOVE.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REMOVE.gif
deleted file mode 100644
index 23eef71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REMOVE.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REPEAT.gif b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REPEAT.gif
deleted file mode 100644
index 8124eac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/UI/small/UI_REPEAT.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.properties
deleted file mode 100644
index faaac2a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.properties
+++ /dev/null
@@ -1,98 +0,0 @@
-FaceletComposite.display-label=Facelet Composite
-FaceletComposite.description=This tag library allows composite facelet components to be defined
-
-actionSource.display-label=actionSource
-actionSource.description=Declares that the composite component whose contract is declared by the \
- &lt;composite:interface&gt;  \
-in which this element is nested exposes an implementation of \
-ActionSource2 \
-suitable for use as the target of attached objects in the using page.
-
-attribute.display-label=attribute
-attribute.description=Declares an attribute that may be given to an instance of the composite component tag for this composite component
-
-editableValueHolder.display-label=editableValueHolder
-editableValueHolder.description=Declares that the composite component whose contract is declared by the \
- &lt;composite:interface&gt;  \
-in which this element is nested exposes an implementation of \
-EditableValueHolder \
-suitable for use as the target of attached objects in the using page. 
-
-extension.display-label=extension
-extension.description=Used within a \
-&lt;composite:interface&gt; \
-section, within any sub-element of that section, to include XML content not defined by this specification.
-
-facet.display-label=facet
-facet.description=Declares that this composite component supports a facet with the name given by the value of the "name" attribute. 
-
-implementation.display-label=implementation
-implementation.description=Defines the implementation of the composite component. \
-There must be zero or one of these in a composite component markup file. If a \
- &lt;composite:interface&gt;  \
-element appears, there must be a corresponding \
-&lt;composite-implementation&gt; element.   
-If no  &lt;composite:interface&gt;  element appears, \
-the &lt;composite-implementation&gt; element is optional. 
-
-insertChildren.display-label=insertChildren
-insertChildren.description=This element is used in the composite-implementation section. \
-Any child components or template text within the composite component tag \
-in the using page will be re-parented into the composite component \
-at the point indicated by this tag's placement within the \
- &lt;composite-implementation&gt;  section.
-
-insertFacet.display-label=insertFacet
-insertFacet.description=The presence of this tag in a \
- &lt;composite-implementation&gt; section \
-must cause the named facet to be taken from the facet map of the top level component \
-and inserted as a facet child of the component in which this element is nested.
-
-interface.display-label=interface
-interface.description=This element declares the usage contract for a composite component. 
-
-renderFacet.display-label=renderFacet
-renderFacet.description=This element is used in the \
-&lt;composite:implementation&gt; section. \
-The facet with the name equal to the value of the name attribute, given by the page author in the using page,\
-will be rendered at this point in the composite component PDL page. 
-<p>
-The implementation of this tag handler must insert a component \
-with component-type javax.faces.Output \ 
-and renderer-type javax.faces.CompositeFacet \
-as a child at this point in the component tree.
-<p>
-The implementation of this tag handler must store an attribute \
-into the created component's attribute map under the key \
-given by the value of the symbolic constant UIComponent.FACETS_KEY. \
-The value for this key must be the evaluated value of the "name" attribute.
-
-valueHolder.display-label=valueHolder
-valueHolder.description=Declares that the composite component whose contract is declared by the \
-&lt;composite:interface&gt; \
-in which this element is nested exposes an implementation of \
-ValueHolder \
-suitable for use as the target of attached objects in the using page. 
-
-
-interface_name.description=The name of this composite component. Advisory only. The real name is taken from the filename.
-componentType.description=The component-type of the UIComponent that will serve as the composite component root for this composite component. The declared component-family for this component must be javax.faces.NamingContainer.
-displayName.description=The name to display in a tool palette containing this component. 
-preferred.description=Is this a "preferred" component.
-expert.description=Is this component only for expert users.
-shortDescription.description=A short description of the purpose of this component. 
-
-name.description=The name of the attribute as it must appear on the composite component tag in the using page.
-attribute_targets.description=If this element has a method-signature attribute, the value of the targets attribute must be interpreted as a space (not tab) separated list of client ids (relative to the top level component) of components within the &lt;composite:implementation&gt; section. Space is used as the delimiter for compatibility with the IDREFS and NMTOKENS data types from the XML Schema. Each entry in the list must be interpreted as the id of an inner component to which the MethodExpression from the composite component tag in the using page must be applied. If this element has a method-signature attribute, but no targets attribute, the value of the name attribute is used as the single entry in the list. If the value of the name attribute is not one of the special values listed in the description of the name attribute, targets (or its derived value) need not correspond to the id of an inner component.
-default.description=If this attribute is not required, and a value is not supplied by the page author, use this as the default value.
-required.description=True if the page author must supply a value for this attribute.
-method-signature.description=Declares that this attribute must be a MethodExpression whose method signature is described by the value of this attribute. The signature must be described using fully qualified class names wherever a type is required. This attribute is mutually exclusive with the "type" attribute. If both attributes are present, the "method-signature" attribute is ignored.
-type.description=Declares that this attribute must be a ValueExpression whose expected type is given by the value of this attribute. If not specified, and no "method-signature" attribute is present, java.lang.Object is assumed. This attribute is mutually exclusive with the "type" attribute. If both attributes are present, the "method-signature" attribute is ignored. 
-
-insertFacet_name.description=The name of the facet child on the top level component which must be inserted as a facet child of the component in which this element is nested.
-actionSource_name.description=The value of this attribute maps back to the "for" attribute on an attachable object nested within a composite component. If the "targets" attribute is not specified, this value also represents the component ID of the target component within the that the <composite:implementation> ActionListener should be mapped to. 
-targets.description=If present, this must be a space (not tab) separated list of client ids (relative to the top level component) of components within the <composite:implementation> section. Space is used as the delimiter for compatibility with the IDREFS and NMTOKENS data types from the XML Schema.
-
-valueHolder_name.description=The value of this attribute maps back to the "for" attribute on an attachable object nested within a composite component. If the "targets" attribute is not specified, this value also represents the component ID of the target component within the that the <composite:implementation> ActionListener should be mapped to. 
-
- 
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.xml
deleted file mode 100644
index 48a9c9f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_composite.xml
+++ /dev/null
@@ -1,469 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/quickEditTabSections.ecore"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:addTagMD="http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore"
-	id="http://java.sun.com/jsf/composite" type="tagFile">
-
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">$nl$/icons/palette/Composite</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">%FaceletComposite.display-label</value>
-	</trait>
-
-	<trait id="description">
-		<value xsi:type="mdt:StringValue">%FaceletComposite.description</value>
-	</trait>
-
-	<trait id="default-prefix">
-		<value xsi:type="mdt:StringValue">composite</value>
-	</trait>
-
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="actionSource">
-				<display-label>%actionSource.display-label</display-label>
-				<description>%actionSource.description</description>
-				<small-icon>small/ACTIONSOURCE.gif</small-icon>
-				<large-icon>large/ACTIONSOURCE.gif</large-icon>				
-			</item>
-			<item id="attribute">
-				<display-label>%attribute.display-label</display-label>
-				<description>%attribute.description</description>
-				<small-icon>small/ATTRIBUTE.gif</small-icon>
-				<large-icon>large/ATTRIBUTE.gif</large-icon>				
-			</item>
-			<item id="editableValueHolder">
-				<display-label>%editableValueHolder.display-label</display-label>
-				<description>%editableValueHolder.description</description>
-				<small-icon>small/EDITABLEVALUEHOLDER.gif</small-icon>
-				<large-icon>large/EDITABLEVALUEHOLDER.gif</large-icon>				
-			</item>
-			<item id="extension">
-				<display-label>%extension.display-label</display-label>
-				<description>%extension.description</description>
-				<small-icon>small/EXTENSION.gif</small-icon>
-				<large-icon>large/EXTENSION.gif</large-icon>				
-			</item>
-			<item id="facet">
-				<display-label>%facet.display-label</display-label>
-				<description>%facet.description</description>
-				<small-icon>small/FACET.gif</small-icon>
-				<large-icon>large/FACET.gif</large-icon>				
-			</item>
-			<item id="implementation">
-				<display-label>%implementation.display-label</display-label>
-				<description>%implementation.description</description>
-				<small-icon>small/IMPLEMENTATION.gif</small-icon>
-				<large-icon>large/IMPLEMENTATION.gif</large-icon>				
-			</item>
-			<item id="insertChildren">
-				<display-label>%insertChildren.display-label</display-label>
-				<description>%insertChildren.description</description>
-				<small-icon>small/INSERTCHILDREN.gif</small-icon>
-				<large-icon>large/INSERTCHILDREN.gif</large-icon>				
-			</item>
-			<item id="insertFacet">
-				<display-label>%insertFacet.display-label</display-label>
-				<description>%insertFacet.description</description>
-				<small-icon>small/INSERTFACET.gif</small-icon>
-				<large-icon>large/INSERTFACET.gif</large-icon>				
-			</item>
-			<item id="interface">
-				<display-label>%interface.display-label</display-label>
-				<description>%interface.description</description>
-				<small-icon>small/INTERFACE.gif</small-icon>
-				<large-icon>large/INTERFACE.gif</large-icon>				
-			</item>
-			<item id="renderFacet">
-				<display-label>%renderFacet.display-label</display-label>
-				<description>%renderFacet.description</description>
-				<small-icon>small/RENDERFACET.gif</small-icon>
-				<large-icon>large/RENDERFACET.gif</large-icon>				
-			</item>
-			<item id="valueHolder">
-				<display-label>%valueHolder.display-label</display-label>
-				<description>%valueHolder.description</description>
-				<small-icon>small/VALUEHOLDER.gif</small-icon>
-				<large-icon>large/VALUEHOLDER.gif</large-icon>				
-			</item>
-		</value>
-	</trait>
-
-	<entity id="interface">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>interface</name>
-				<attribute>
-					<name>name</name>
-					<usage>OPTIONAL</usage>
-					<description>%interface_name.description</description>
-				</attribute>
-				<attribute>
-					<name>componentType</name>
-					<usage>OPTIONAL</usage>
-					<description>%componentType.description</description>
-				</attribute>
-				<attribute>
-					<name>displayName</name>
-					<usage>OPTIONAL</usage>
-					<description>%displayName.description</description>
-				</attribute>
-				<attribute>
-					<name>preferred</name>
-					<usage>OPTIONAL</usage>
-					<description>%preferred.description</description>
-				</attribute>
-				<attribute>
-					<name>expert</name>
-					<usage>OPTIONAL</usage>
-					<description>%expert.description</description>
-				</attribute>
-				<attribute>
-					<name>shortDescription</name>
-					<usage>OPTIONAL</usage>
-					<description>%shortDescription.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>
-		<entity id="componentType">
-
-		</entity>
-		<entity id="displayName">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringTpe
-				</value>
-			</trait>
-		</entity>
-		<entity id="preferred">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-		<entity id="expert">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-		<entity id="shortDescription">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="implementation">
-
-	</entity>
-
-	<entity id="attribute">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>attribute</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%name.description</description>
-				</attribute>
-				<attribute>
-					<name>targets</name>
-					<usage>REQUIRED</usage>
-					<description>%attribute_targets.description</description>
-				</attribute>
-				<attribute>
-					<name>default</name>
-					<usage>OPTIONAL</usage>
-					<description>%default.description</description>
-				</attribute>
-				<attribute>
-					<name>displayName</name>
-					<usage>OPTIONAL</usage>
-					<description>%displayName.description</description>
-				</attribute>
-				<attribute>
-					<name>required</name>
-					<usage>OPTIONAL</usage>
-					<description>%required.description</description>
-				</attribute>
-				<attribute>
-					<name>preferred</name>
-					<usage>OPTIONAL</usage>
-					<description>%preferred.description</description>
-				</attribute>
-				<attribute>
-					<name>expert</name>
-					<usage>OPTIONAL</usage>
-					<description>%expert.description</description>
-				</attribute>
-				<attribute>
-					<name>type</name>
-					<usage>OPTIONAL</usage>
-					<description>%type.description</description>
-				</attribute>
-				<attribute>
-					<name>method-signature</name>
-					<usage>OPTIONAL</usage>
-					<description>%method-signature.description</description>
-				</attribute>
-				<attribute>
-					<name>shortDescription</name>
-					<usage>OPTIONAL</usage>
-					<description>%shortDescription.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="targets">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-
-		</entity>
-
-		<entity id="default">
-
-		</entity>
-
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-
-		<entity id="preferred">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-
-		<entity id="expert">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-
-		<entity id="shortDescription">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>
-
-		<entity id="method-signature">
-
-		</entity>
-
-		<entity id="type">
-
-		</entity>
-	</entity>
-	<entity id="facet">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>facet</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%name.description</description>
-				</attribute>
-				<attribute>
-					<name>displayName</name>
-					<usage>OPTIONAL</usage>
-					<description>%displayName.description</description>
-				</attribute>
-				<attribute>
-					<name>required</name>
-					<usage>OPTIONAL</usage>
-					<description>%required.description</description>
-				</attribute>
-				<attribute>
-					<name>preferred</name>
-					<usage>OPTIONAL</usage>
-					<description>%preferred.description</description>
-				</attribute>
-				<attribute>
-					<name>expert</name>
-					<usage>OPTIONAL</usage>
-					<description>%expert.description</description>
-				</attribute>
-				<attribute>
-					<name>shortDescription</name>
-					<usage>OPTIONAL</usage>
-					<description>%shortDescription.description</description>
-				</attribute>
-				
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="renderFacet">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>renderFacet</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%name.description</description>
-				</attribute>
-				<attribute>
-					<name>required</name>
-					<usage>OPTIONAL</usage>
-					<description>%required.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="insertChildren">
-
-	</entity>
-
-	<entity id="valueHolder">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>valueHolder</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%actionSource_name.description</description>
-				</attribute>
-				<attribute>
-					<name>targets</name>
-					<usage>OPTIONAL</usage>
-					<description>%targets.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="targets">
-
-		</entity>
-	</entity>
-
-	<entity id="editableValueHolder">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>editableValueHolder</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%name.description</description>
-				</attribute>
-				<attribute>
-					<name>targets</name>
-					<usage>OPTIONAL</usage>
-					<description>%targets.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="targets">
-
-		</entity>
-	</entity>
-
-	<entity id="actionSource">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>actionSource</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%actionSource_name.description</description>
-				</attribute>
-				<attribute>
-					<name>targets</name>
-					<usage>OPTIONAL</usage>
-					<description>%targets.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="targets">
-
-		</entity>
-	</entity>
-
-	<entity id="extension">
-
-	</entity>
-
-	<entity id="insertFacet">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>insertFacet</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%insertFacet_name.description</description>
-				</attribute>
-				<attribute>
-					<name>required</name>
-					<usage>OPTIONAL</usage>
-					<description>%required.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.properties
deleted file mode 100644
index 4318744..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.properties
+++ /dev/null
@@ -1,68 +0,0 @@
-FaceletUI.display-label=Facelet Core
-FaceletUI.description=The tags in this library add templating
-
-component.display-label=component
-component.description=Adds a new UIComponent into the view's component tree.  The new component will be the parent of the tag's component children.  Text outside the tag is removed before view rendering similar to composition.
-
-composition.display-label=composition
-composition.description=<p><em>Inserts a composite component that ignores content around it:</em></p> \
-<br><p><i>This text will be removed</i><br>  \
-<b>&lt;ui:composition&gt;</b><br> \
-#{el.text}<br> \
-&lt;h:inputText &nbsp;value="\#{some.value}"/&gt;<br> \
-<b>&lt;/ui:composition&gt;</b><br> \
-<i>This text will be removed</i></p>
-
-debug.display-label=debug
-debug.description=Saves the component tree and EL variables in a view.  Accessible by hitting the hotkey (CTRL-SHIFT-D by default).
-
-decorate.display-label=decorate
-decorate.description=<p><em>Inserts a composite component that keeps the content around it:</em></p> \
-<br><p><i>This text will NOT be removed</i><br> \
-<b>&lt;ui:composition&gt;</b><br> \
-#{el.text}<br> \
-&lt;h:inputText &nbsp;value="\#{some.value}"/&gt;<br> \
-<b>&lt;/ui:composition&gt;</b><br> \
-<i>This text will NOT be removed</i></p>
-
-define.display-label=define
-define.description=Defines a template area that can be used instances using insert.
-
-fragment.display-label=fragment
-fragment.description=Adds a new UIComponent into the view's component tree.  The new component will be the parent of the tag's component children.  Text outside the tag is kept, similar to decorate.
-
-include.display-label=include
-include.description=Includes another facelet.
-
-insert.display-label=insert
-insert.description=Insert a named template area created using the define tag.
-
-param.display-label=param
-param.description=Declares a new EL variable on the facelet page.
-
-remove.display-label=remove
-remove.description=Removes its content from the rendered view.
-
-repeat.display-label=repeat
-repeat.description=Repeatedly renders its content by iterating through the List returned from the value attribute.  Intended as a JSF-safe replacement for c:forEach.
-
-binding.description=A method binding of the form of the form \#{bean.binding} where 'binding' has the signature <b>UIComponent binding()</b>, that returns the component instance to use. If not present, Facelets will automatically instantiate one.
-define_name.description=The name of a template area.  This name is referenced in instance documents using the insert tag
-hotkey.description=The key in combination with CTRL-SHIFT to use to launch the debug viewer
-id.description=Assign a unique idea to generated component.  If not present, Facelets will automatically generate one.
-insert_name.description=The name of a template area to insert (defined in the template using the define tag).  If not specified, the entire template will be inserted.
-param_name.description=The name of the new EL variable to declare
-param_value.description=The literal or EL value to assign to the new variable
-
-repeat_value.description=The EL expression used to derive the list of items to repeat over
-repeat_var.description=The name of the EL variable to use as the iterator
-repeat_varStatus.description=The name of the exported request scoped variable for the status of the iteration.
-repeat_offset.description=The offset from the beginning of the collection from which to start the iteration.
-repeat_size.description=Starting from first, the iteration will process every other by step value.
-repeat_step.description=The name of the exported request scoped variable for the status of the iteration.
-
-src.description=The path, absolute or relative to the original request, to another Facelet to include.  May be EL.  e.g. 'headerPage.xhtml'
-template.description=A uri that points to the template to use.  e.g. /WEB-INF/templates/mytemplate.xhtml
-name.description=The name of the component
-
-rendered.description=Flag indicating whether or not the component should be rendered
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.xml
deleted file mode 100644
index 6d6606d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/facelet_ui.xml
+++ /dev/null
@@ -1,393 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore"
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore"
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/quickEditTabSections.ecore"
-	xmlns:addTagMD="http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore"
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="http://java.sun.com/jsf/facelets"
-	type="tagFile">
-
-	<trait id="is-jsf-component-library">
-		<value xsi:type="mdt:StringValue">true</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">$nl$/icons/palette/UI</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">%FaceletUI.display-label</value>
-	</trait>
-
-	<trait id="description">
-		<value xsi:type="mdt:StringValue">%FaceletUI.description</value>
-	</trait>
-
-	<trait id="default-prefix">
-		<value xsi:type="mdt:StringValue">ui</value>
-	</trait>
-	
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="component" tag="component">
-				<display-label>%component.display-label</display-label>
-				<description>%component.description</description>
-				<small-icon>small/UI_COMPONENT.gif</small-icon>
-				<large-icon>large/UI_COMPONENT.gif</large-icon>
-			</item>
-			<item id="composition">
-				<display-label>%composition.display-label</display-label>
-				<description>%composition.description</description>
-				<small-icon>small/UI_COMPOSITION.gif</small-icon>
-				<large-icon>large/UI_COMPOSITION.gif</large-icon>
-			</item>
-			<item id="debug">
-				<display-label>%debug.display-label</display-label>
-				<description>%debug.description</description>
-				<small-icon>small/UI_DEBUG.gif</small-icon>
-				<large-icon>large/UI_DEBUG.gif</large-icon>				
-			</item>
-			<item id="decorate">
-				<display-label>%decorate.display-label</display-label>
-				<description>%decorate.description</description>
-				<small-icon>small/UI_DECORATE.gif</small-icon>
-				<large-icon>large/UI_DECORATE.gif</large-icon>				
-			</item>
-			<item id="define">
-				<display-label>%define.display-label</display-label>
-				<description>%define.description</description>
-				<small-icon>small/UI_DEFINE.gif</small-icon>
-				<large-icon>large/UI_DEFINE.gif</large-icon>				
-			</item>
-			<item id="fragment">
-				<display-label>%fragment.display-label</display-label>
-				<description>%fragment.description</description>
-				<small-icon>small/UI_FRAGMENT.gif</small-icon>
-				<large-icon>large/UI_FRAGMENT.gif</large-icon>	
-			</item>
-			<item id="include">
-				<display-label>%include.display-label</display-label>
-				<description>%include.description</description>
-				<small-icon>small/UI_INCLUDE.gif</small-icon>
-				<large-icon>large/UI_INCLUDE.gif</large-icon>					
-			</item>
-			<item id="insert">
-				<display-label>%insert.display-label</display-label>
-				<description>%insert.description</description>
-				<small-icon>small/UI_INSERT.gif</small-icon>
-				<large-icon>large/UI_INSERT.gif</large-icon>					
-			</item>
-			<item id="param">
-				<display-label>%param.display-label</display-label>
-				<description>%param.description</description>
-				<small-icon>small/UI_PARAM.gif</small-icon>
-				<large-icon>large/UI_PARAM.gif</large-icon>					
-			</item>
-			<item id="remove">
-				<display-label>%remove.display-label</display-label>
-				<description>%remove.description</description>
-				<small-icon>small/UI_REMOVE.gif</small-icon>
-				<large-icon>large/UI_REMOVE.gif</large-icon>					
-			</item>
-			<item id="repeat">
-				<display-label>%repeat.display-label</display-label>
-				<description>%repeat.description</description>
-				<small-icon>small/UI_REPEAT.gif</small-icon>
-				<large-icon>large/UI_REPEAT.gif</large-icon>					
-			</item>
-		</value>
-	</trait>
-	<entity id="component">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>component</name>
-				<attribute>
-					<name>id</name>
-					<usage>OPTIONAL</usage>
-					<description>%id.description</description>
-				</attribute>
-				<attribute>
-					<name>binding</name>
-					<usage>OPTIONAL</usage>
-					<description>%binding.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="id">
-
-		</entity>
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.component.UIComponent</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="composition">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>composition</name>
-				<attribute>
-					<name>template</name>
-					<usage>OPTIONAL</usage>
-					<description>%template.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="template">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.facelet.core.attributevalues.TemplateWebPathType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="debug">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>debug</name>
-				<attribute>
-					<name>hotkey</name>
-					<usage>OPTIONAL</usage>
-					<description>%hotkey.description</description>
-				</attribute>
-				<attribute>
-					<name>rendered</name>
-					<usage>OPTIONAL</usage>
-					<description>%rendered.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="hotkey">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>
-		<entity id="rendered">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="decorate" type="tag">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>decorate</name>
-				<attribute>
-					<name>template</name>
-					<usage>REQUIRED</usage>
-					<description>%template.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="template">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.facelet.core.attributevalues.TemplateWebPathType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="define">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>define</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%define_name.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-
-		</entity>
-	</entity>
-
-	<entity id="fragment">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>fragment</name>
-				<attribute>
-					<name>id</name>
-					<usage>OPTIONAL</usage>
-					<description>%id.description</description>
-				</attribute>
-				<attribute>
-					<name>binding</name>
-					<usage>OPTIONAL</usage>
-					<description>%binding.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="id">
-
-		</entity>
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.component.UIComponent</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="include">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>include</name>
-				<attribute>
-					<name>src</name>
-					<usage>REQUIRED</usage>
-					<description>%src.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="src">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.facelet.core.attributevalues.TemplateWebPathType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-
-	<entity id="insert">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>insert</name>
-				<attribute>
-					<name>name</name>
-					<usage>OPTIONAL</usage>
-					<description>%insert_name.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-
-		</entity>
-	</entity>
-
-	<entity id="param">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>param</name>
-				<attribute>
-					<name>name</name>
-					<usage>REQUIRED</usage>
-					<description>%param_name.description</description>
-				</attribute>
-				<attribute>
-					<name>value</name>
-					<usage>REQUIRED</usage>
-					<description>%param_value.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="name">
-
-		</entity>
-		<entity id="value">
-
-		</entity>
-	</entity>
-
-	<entity id="repeat">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>repeat</name>
-				<attribute>
-					<name>value</name>
-					<usage>REQUIRED</usage>
-					<description>%repeat_value.description</description>
-				</attribute>
-				<attribute>
-					<name>var</name>
-					<usage>REQUIRED</usage>
-					<description>%repeat_var.description</description>
-				</attribute>
-				<attribute>
-					<name>varStatus</name>
-					<usage>OPTIONAL</usage>
-					<description>%repeat_varStatus.description</description>
-				</attribute>
-				<attribute>
-					<name>offset</name>
-					<usage>OPTIONAL</usage>
-					<description>%repeat_offset.description</description>
-				</attribute>
-				<attribute>
-					<name>size</name>
-					<usage>OPTIONAL</usage>
-					<description>%repeat_size.description</description>
-				</attribute>
-				<attribute>
-					<name>step</name>
-					<usage>OPTIONAL</usage>
-					<description>%repeat_step.description</description>
-				</attribute>
-			</value>
-		</trait>
-		<entity id="offset">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-		</entity>
-		<entity id="size">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-		</entity>
-		<entity id="step">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-		</entity>
-		<entity id="value">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-
-		</entity>
-		<entity id="var">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-		</entity>
-		<entity id="varStatus">
-			<trait id="required" xsi:type="mdt:BooleanType">true</trait>
-
-		</entity>
-	</entity>
-	<entity id="remove">
-		<trait id="additionalElementData">
-			<value xsi:type="addTagMD:ElementData">
-				<name>remove</name>
-				<attribute>
-					<name>name</name>
-					<usage>OPTIONAL</usage>
-					<description>%name.description</description>
-				</attribute>
-			</value>
-		</trait>
-	</entity>
-	<entity id="name">
-
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.properties
deleted file mode 100644
index a7562b3..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.properties
+++ /dev/null
@@ -1,101 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-A.display-label=Link
-A.description=This element allows the user to navigate the content of the document
-
-BR.display-label=Line Break
-BR.description=This element is used to enforce a line break
-
-INPUT.BUTTON.display-label=Button
-INPUT.BUTTON.description=An INPUT element with TYPE=SUBMIT represents an input option, typically a button, that instructs the user agent to submit the form
-
-INPUT.CHECKBOX.display-label=Checkbox
-INPUT.CHECKBOX.description=An INPUT element with TYPE=CHECKBOX represents a boolean choice. A set of such elements with the same name represents an n-of-many choice field
-
-INPUT.HIDDEN.display-label=Hidden Field
-INPUT.HIDDEN.description=An INPUT element with TYPE=HIDDEN represents a hidden field.The user does not interact with this field; instead, the VALUE attribute specifies the value of the field
-
-INPUT.IMAGE.display-label=Image Button
-INPUT.IMAGE.description=An INPUT element with TYPE=IMAGE specifies an image resource to display, and allows input of two form fields: the x and y coordinate of a pixel chosen from the image
-
-INPUT.PASSWORD.display-label=Password Field
-INPUT.PASSWORD.description=An INPUT element with TYPE=PASSWORD is a text field as above, except that the value is obscured as it is entered
-
-INPUT.RADIO.display-label=Radio Button
-INPUT.RADIO.description=An INPUT element with TYPE=RADIO represents a boolean choice. A set of such elements with the same name represents a 1-of-many choice field
-
-INPUT.TEXT.display-label=Text Field 
-INPUT.TEXT.description=The default vaule of the TYPE attribute is TEXT, indicating a single line text entry field
-
-FORM.display-label=Form
-FORM.description=The FORM element contains a sequence of input elements, along with document structuring elements
-
-HR.display-label=Horizontal Rule
-HR.description=The HR element is a divider between sections of text; typically a full width horizontal rule or equivalent graphic
-
-IMG.display-label=Image
-IMG.description=The IMG element refers to an image or icon via a hyperlink
-
-LINK.display-label=Stylesheet Link
-LINK.description=This element will import a stylesheet into the page
-
-SELECT.display-label=Select
-SELECT.description=The SELECT element constrains the form field to an enumerated list of values
-
-TABLE.display-label=Table
-TABLE.description=HTML Tables are contained within a TABLE element. The TABLE element denotes the range of the table, and uses attribute to define properties of it
-
-TEXTAREA.display-label=Text Area
-TEXTAREA.description=The TEXTAREA element represents a multi-line text field
-
-DIV.display-label=Div
-DIV.description=The DIV tag defines a section or division that is often used to group and format block-elements
-
-any.dir.displayed-values.ltr=ltr (left-to-right)
-any.dir.displayed-values.rtl=rtl (right-to-left)
-
-any.frame.displayed-values.none=none (no sides, default value)
-any.frame.displayed-values.above=above (top side only)
-any.frame.displayed-values.below=below (bottom side only)
-any.frame.displayed-values.hsides=hsides (top and bottom sides only)
-any.frame.displayed-values.vsides=vsides (right and left sides only)
-any.frame.displayed-values.lhs=lhs (left hand side only)
-any.frame.displayed-values.rhs=rhs (right hand side only)
-any.frame.displayed-values.box=box (all four sides)
-any.frame.displayed-values.border=border (all four sides)
-
-any.rules.displayed-values.none=none (no rules, default value)
-any.rules.displayed-values.groups=groups (between row groups)
-any.rules.displayed-values.rows=rows (between rows only)
-any.rules.displayed-values.cols=cols (between columns only)
-any.rules.displayed-values.all=all (between all rows and columns)
-
-any.shape.displayed-values.default=default (entire region)
-any.shape.displayed-values.rect=rect (rectangular region)
-any.shape.displayed-values.circle=circle (circular region)
-any.shape.displayed-values.poly=poly (polygonal region)
-
-#categories
-property.category.event=Event
-property.category.language=Language
-property.category.html=HTML
-property.category.css=CSS
-property.category.general=General
-property.category.accessibility=Accessibility
-property.category.visualProperty=VisualProperty
-property.category.browser.specific=Browser Specific
-property.category.core=Core
-property.category.content=Content
-property.category.data.binding=Data Binding
-property.category.dynamic=Dynamic
-property.category.file=File
-property.category.image=Image
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.xml
deleted file mode 100644
index 8074033..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/html.xml
+++ /dev/null
@@ -1,786 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" 
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/quickEditTabSections.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="HTML" 
-	type="tagFile">
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="BR"/>
-			<item id="INPUT.TEXT" tag="INPUT"/>
-			<item id="INPUT.BUTTON" tag="INPUT">
-				<display-label>%INPUT.BUTTON.display-label</display-label>
-				<description>%INPUT.BUTTON.description</description>
-				<small-icon>small/HTML_INPUT_BUTTON.gif</small-icon>
-				<large-icon>large/HTML_INPUT_BUTTON.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="submit"/>
-				</tag-create>
-			</item>
-			<item id="INPUT.CHECKBOX" tag="INPUT">
-				<display-label>%INPUT.CHECKBOX.display-label</display-label>
-				<description>%INPUT.CHECKBOX.description</description>
-				<small-icon>small/HTML_INPUT_CHECKBOX.gif</small-icon>
-				<large-icon>large/HTML_INPUT_CHECKBOX.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="checkbox"/>
-				</tag-create>				
-			</item>
-			<item id="FORM"/>		
-			<item id="INPUT.HIDDEN" tag="INPUT">
-				<display-label>%INPUT.HIDDEN.display-label</display-label>
-				<description>%INPUT.HIDDEN.description</description>
-				<small-icon>small/HTML_INPUT_HIDDEN.gif</small-icon>
-				<large-icon>large/HTML_INPUT_HIDDEN.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="hidden"/>
-				</tag-create>	
-			</item>
-			<item id="HR"/>
-			<item id="IMG"/>
-			<item id="INPUT.IMAGE" tag="INPUT">
-				<display-label>%INPUT.IMAGE.display-label</display-label>
-				<description>%INPUT.IMAGE.description</description>
-				<small-icon>small/HTML_INPUT_IMAGE.gif</small-icon>
-				<large-icon>large/HTML_INPUT_IMAGE.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="image"/>
-				</tag-create>					
-			</item>
-			<item id="A"/>			
-			<item id="INPUT.PASSWORD" tag="INPUT">
-				<display-label>%INPUT.PASSWORD.display-label</display-label>
-				<description>%INPUT.PASSWORD.description</description>
-				<small-icon>small/HTML_INPUT_PASSWORD.gif</small-icon>
-				<large-icon>large/HTML_INPUT_PASSWORD.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="password"/>
-				</tag-create>					
-			</item>
-			<item id="INPUT.RADIO" tag="INPUT">
-				<display-label>%INPUT.RADIO.display-label</display-label>
-				<description>%INPUT.RADIO.description</description>
-				<small-icon>small/HTML_INPUT_RADIO.gif</small-icon>
-				<large-icon>large/HTML_INPUT_RADIO.gif</large-icon>
-				<tag-create>
-					<attribute id="type" value="radio"/>
-				</tag-create>					
-			</item>			
-			<item id="SELECT"/>
-			<item id="TABLE"/>
-			<item id="TEXTAREA"/>
-			<item id="DIV"/>
-			<item id="LINK">							
-				<tag-create>
-					<attribute id="href" value=""/>
-					<attribute id="rel" value="Stylesheet"/>
-					<attribute id="type" value="text/css"/>
-				</tag-create>
-			</item>
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">$nl$/icons/palette/HTML</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">HTML 4.0</value>
-	</trait>
-	
-	<entity id="A">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%A.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%A.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_A.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_A.gif</value>
-		</trait>
-	</entity>
-	<entity id="BODY">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<include-entity-group id="common-html-attributes"/>	
-	</entity>		
-	<entity id="BR">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%BR.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%BR.description</value>
-		</trait>		
-		<trait id="expert">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_BR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_BR.gif</value>
-		</trait>
-	</entity>
-	<entity id="INPUT">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%INPUT.TEXT.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%INPUT.TEXT.description</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_INPUT_TEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_INPUT_TEXT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>			
-	</entity>
-	<entity id="FORM">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<include-entity-group id="form-event-attributes"/>
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%FORM.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%FORM.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_FORM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_FORM.gif</value>
-		</trait>
-	</entity>
-	<entity id="HEAD">
-		<include-entity-group id="common-language-attributes"/>
-	</entity>	
-	<entity id="HR">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%HR.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%HR.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_HR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_HR.gif</value>
-		</trait>
-	</entity>	
-	<entity id="HTML">
-		<include-entity-group id="common-language-attributes"/>
-	</entity>	
-	<entity id="IMG">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%IMG.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%IMG.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_IMG.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_IMG.gif</value>
-		</trait>
-	</entity>	
-	<entity id="LINK">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-html-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">	
-			<value xsi:type="mdt:StringValue">%LINK.display-label</value>
-		</trait>	
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%LINK.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_LINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_LINK.gif</value>
-		</trait>	
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LinkType</value>
-			</trait>
-		</entity>
-
-	</entity>
-	<entity id="META">
-		<include-entity-group id="common-language-attributes"/>
-		<entity id="content">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ContentType</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="OBJECT">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_OBJECT.gif</value>
-		</trait>
-	</entity>			
-	<entity id="SELECT">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%SELECT.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%SELECT.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_SELECT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_SELECT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>			
-	</entity>		
-	<entity id="TABLE">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%TABLE.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%TABLE.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_TABLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_TABLE.gif</value>
-		</trait>
-	</entity>
-	<entity id="TEXTAREA">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%TEXTAREA.display-label</value>
-		</trait>					
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%TEXTAREA.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_TEXTAREA.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_TEXTAREA.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>	
-	<entity id="TITLE">
-		<include-entity-group id="common-language-attributes"/>
-	</entity>		
-	<entity id="DIV">
-		<include-entity-group id="common-core-attributes"/>
-		<include-entity-group id="common-language-attributes"/>
-		<include-entity-group id="common-event-attributes"/>
-		<entity id="align">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>char</item>
-					<item>left</item>
-					<item>center</item>
-					<item>justify</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>
-		</entity>
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%DIV.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%DIV.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/HTML_DIV.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/HTML_DIV.gif</value>
-		</trait>		
-	</entity>	
-	<entityGroup id="common-html-attributes">
-		<entity id="align">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>right</item>
-					<item>char</item>
-					<item>left</item>
-					<item>center</item>
-					<item>justify</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>
-		</entity>
-	
-		<entity id="alt">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="src">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="accesskey">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CharacterType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="accept">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="accept-charset">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="border">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="height">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>		
-		<entity id="ismap">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="longdesc">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.URIType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>	
-		<entity id="maxlength">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="readonly">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-		</entity>
-		<entity id="rel">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LinkType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="rev">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LinkType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>	
-		<entity id="rows">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="shape">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>rect</item>
-					<item>circle</item>
-					<item>poly</item>	
-				</value>			
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.shape.displayed-values.default</item>
-					<item>%any.shape.displayed-values.rect</item>
-					<item>%any.shape.displayed-values.circle</item>
-					<item>%any.shape.displayed-values.poly</item>		
-				</value>		
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">default</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="size">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="tabindex">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="valid-maximum"><value xsi:type="mdt:StringValue">32767</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="target">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>_self</item>
-					<item>_blank</item>
-					<item>_parent</item>
-					<item>_top</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>	
-		<entity id="usemap">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>		
-		<entity id="valign">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>middle</item>
-					<item>top</item>
-					<item>baseline</item>
-					<item>bottom</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>
-		</entity>			
-		<entity id="width">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LengthType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.html</value>
-			</trait>			
-		</entity>
-							
-	</entityGroup>
-	<entityGroup id="common-core-attributes">
-		<entity id="id">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.core</value>
-			</trait>			
-		</entity>
-		<entity id="class">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.core</value>
-			</trait>			
-		</entity>
-		<entity id="style">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSStyleType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.core</value>
-			</trait>			
-		</entity>
-		<entity id="title">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.core</value>
-			</trait>			
-		</entity>		
-	</entityGroup>
-	<entityGroup id="common-event-attributes"> 
-		<entity id="onclick">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="ondblclick">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmousedown">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseup">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseover">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmousemove">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onmouseout">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeypress">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeydown">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onkeyup">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<!--almost common events - should be refactored-->
-		<entity id="onblur">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onchange">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onfocus">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>
-		<entity id="onselect">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>					
-	</entityGroup>
-	<entityGroup id="form-event-attributes">
-		<entity id="onsubmit">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>	
-		<entity id="onreset">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ScriptType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.event</value>
-			</trait>			
-		</entity>			
-	</entityGroup>
-	<entityGroup id="common-language-attributes">
-		<entity id="dir">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>ltr</item>
-					<item>rtl</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.dir.displayed-values.ltr</item>
-					<item>%any.dir.displayed-values.rtl</item>
-				</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.language</value>
-			</trait>					
-		</entity>
-		<entity id="lang">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LanguageCodeType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.language</value>
-			</trait>					
-		</entity>		
-	</entityGroup>	
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.properties
deleted file mode 100644
index fb784d4..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.properties
+++ /dev/null
@@ -1 +0,0 @@
-property.category.jsf=JSF
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml
deleted file mode 100644
index 091fc91..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml
+++ /dev/null
@@ -1,961 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="http://java.sun.com/jsf/core" 
-	type="tagFile">
-
-	<entity id="actionListener" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-	    <trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="type"/>
-			</value>
-		</trait>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.JavaClassType
-				</value>
-			</trait>
-			<trait id="valid-interfaces">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ActionListener</value>
-			</trait>		
-		</entity>
-	</entity>
-	<entity id="ajax" type="tag">
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-		<entity id="event">
-	
-		</entity>
-		<entity id="execute">
-		
-		</entity>
-		<entity id="immediate">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>
-		<entity id="listener">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:StringValue">javax.faces.event.AjaxBehaviorEvent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="onevent">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>	
-		</entity>
-		<entity id="onerror">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>			
-		</entity>
-		<entity id="render">
-		
-		</entity>
-		
-	</entity>	
-	<entity id="attribute" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-				<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="name"/>
-				<section id="value"/>
-			</value>
-		</trait>
-	</entity>	
-	<entity id="convertDateTime" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="section.general.convertDateTime" type="SECTION"/>
-			</value>
-		</trait>	
-		<entity id="dateStyle">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>short</item>
-					<item>medium</item>
-					<item>long</item>
-					<item>full</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">default</value>
-			</trait>
-		</entity>
-		<entity id="timeStyle">			
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>default</item>
-					<item>short</item>
-					<item>medium</item>
-					<item>long</item>
-					<item>full</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">default</value>
-			</trait>
-		</entity>
-		<entity id="type">			
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>date</item>
-					<item>time</item>
-					<item>both</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">both</value>
-			</trait>
-		</entity>
-		<entity id="pattern">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.DateTimePatternType
-				</value>
-			</trait>
-		</entity>
-		<entity id="locale">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.LocaleType
-				</value>
-			</trait>
-		</entity>		
-	</entity>
-	<entity id="convertNumber" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="section.general.convertNumber" type="SECTION"/>
-			</value>
-		</trait>		
-		<entity id="groupingUsed">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="integerOnly">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>
-		</entity>
-		<entity id="maxFractionDigits">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-		</entity>
-		<entity id="maxIntegerDigits">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-		</entity>
-		<entity id="minFractionDigits">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-		</entity>
-		<entity id="minIntegerDigits">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-		</entity>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>number</item>
-					<item>currency</item>
-					<item>percent</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">number</value>
-			</trait>
-		</entity>
-		<entity id="locale">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.LocaleType
-				</value>
-			</trait>
-		</entity>
-		<entity id="pattern">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.NumberPatternType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="currencyCode">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.CurrencyCodeType
-				</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="converter" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="converterId"/>
-			</value>
-		</trait>		
-		<entity id="converterId">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value xsi:type="mdt:StringValue">javax.faces.convert.Converter</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="event" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="name"/>
-				<section id="listener"/>
-			</value>
-		</trait>
-		<entity id="name">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-		<entity id="listener">
-			<trait id="required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ComponentSystemEvent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>		
-		</entity>
-	</entity>
-	<entity id="facet" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="name"/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="loadBundle" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="basename"/>
-				<section id="var"/>
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="var">
-			<trait id="contributes-value-binding">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-			<trait id="value-binding-scope">
-				<value xsi:type="mdt:StringValue">request</value>
-			</trait>
-			<trait id="value-binding-symbol-factory">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.designtime.core.loadBundle</value>
-			</trait>
-		</entity>
-		<entity id="basename">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ResourceBundleType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="metadata" type="tag">
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>head</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>	
-	</entity>
-	<entity id="param" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="name"/>
-				<section id="value"/>
-				<section id="binding"/>
-			</value>
-		</trait>	
-	</entity>
-	<entity id="selectItem" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="itemLabel"/>
-				<section id="itemValue"/>
-			</value>
-		</trait>
-		<entity id="itemDescription">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>		
-		<entity id="itemDisabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>
-		</entity>
-		<entity id="itemLabel">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>
-		<entity id="escape">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>			
-		</entity>
-		<entity id="itemValue">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">java.lang.Object</value>
-			</trait>				
-		</entity>				
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.model.SelectItem</value>
-			</trait>				
-		</entity>
-		<entity id="noSelectionOption">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>				
-		</entity>		
-	</entity>
-	<entity id="selectItems" type="tag">	
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="binding"/>
-			</value>
-		</trait>	
-		<entity id="var">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="itemValue">
-		</entity>
-		<entity id="itemLabel">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>		
-		</entity>	
-		<entity id="itemDescription">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>		
-		</entity>	
-		<entity id="itemDisabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>		
-		</entity>	
-		<entity id="itemLabelEscaped">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>		
-		</entity>			
-	</entity>
-	<entity id="subview" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-			</value>
-		</trait>			
-		<entity id="rendered">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="validateBean" type="tag">
-		<entity id="validationGroups">
-
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.BeanValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>					
-	</entity>
-	<entity id="validateDoubleRange" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="minimum"/>
-				<section id="maximum"/>
-			</value>
-		</trait>			
-		<entity id="maximum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.DoubleType
-				</value>
-			</trait>
-		</entity>
-		<entity id="minimum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.DoubleType
-				</value>
-			</trait>
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.DoubleRangeValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>			
-	</entity>
-	<entity id="validateLength" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="minimum"/>
-				<section id="maximum"/>
-			</value>
-		</trait>			
-		<entity id="maximum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>			
-		</entity>
-		<entity id="minimum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.IntegerType
-				</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>	
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.LengthValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>				
-	</entity>
-	<entity id="validateLongRange" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="minimum"/>
-				<section id="maximum"/>
-			</value>
-		</trait>		
-		<entity id="maximum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.LongType
-				</value>
-			</trait>
-		</entity>
-		<entity id="minimum">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.LongType
-				</value>
-			</trait>
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.LongRangeValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>		
-	</entity>
-	<entity id="validateRegex" type="tag">
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">				
-				<section id="pattern"/>
-			</value>
-		</trait>
-		<entity id="pattern">
-
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.RegexValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>					
-	</entity>	
-	<entity id="validateRequired" type="tag">
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.RequiredValidator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>					
-	</entity>		
-	<entity id="validator" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="validatorId"/>
-			</value>
-		</trait>		
-		<entity id="validatorId">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigValidatorIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.Validator</value>
-			</trait>
-		</entity>
-		<entity id="disabled">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-		</entity>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.validator.Validator</value>
-			</trait>				
-		</entity>
-		<entity id="for">
-
-		</entity>		
-	</entity>
-	<entity id="valueChangeListener" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="type"/>
-			</value>
-		</trait>		
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.JavaClassType
-				</value>
-			</trait>
-			<trait id="valid-interfaces">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ValueChangeListener</value>
-			</trait>			
-		</entity>
-	</entity>
-	<entity id="verbatim" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="escape"/>
-			</value>
-		</trait>		
-		<entity id="escape">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="view" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="locale"/>
-			</value>
-		</trait>		
-		<entity id="locale">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LocaleType	</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="viewParam" type="tag">
-		<include-entity-group id="common-core-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="for"/>
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>metadata</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="converter">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value xsi:type="mdt:StringValue">javax.faces.convert.Converter</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="converterMessage">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>		
-		</entity>
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.BooleanType
-				</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>
-		<entity id="requiredMessage">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="validator">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.FacesConfigValidatorIDType
-				</value>
-			</trait>
-			<trait id="config-type">
-				<value xsi:type="mdt:StringValue">javax.faces.convert.Validator</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>		
-		</entity>
-		<entity id="validatorMessage">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.StringType
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="valueChangeListener">					
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ValueChangeEvent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="maxLength">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>	
-		</entity>	
-		<entity id="for">
-		
-		</entity>	
-	</entity>
-	<entityGroup id="common-core-attributes" type="tag">
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType
-				</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.component.UIComponent</value>
-			</trait>				
-		</entity>			
-		<entity id="id">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ComponentIDType
-				</value>
-			</trait>
-		</entity>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">
-					org.eclipse.jst.jsf.core.attributevalues.ValueBindingType
-				</value>
-			</trait>
-		</entity>
-	</entityGroup>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_dti.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_dti.xml
deleted file mode 100644
index 6aaca7f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_dti.xml
+++ /dev/null
@@ -1,417 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:dti="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"
-	id="http://java.sun.com/jsf/core"
-	type="tagFile">
-
-	<entity id="actionListener" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_ACTIONLISTENER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="ajax" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_AJAX.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-	<entity id="attribute" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_ATTRIBUTE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="convertDateTime" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_CONVERTDATETIME.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="converter" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_CONVERTER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="convertNumber" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_CONVERTNUMBER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="event" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_EVENT.gif"
-					widget="true"					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-	<entity id="facet" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					minHeight="10"
-					minWidth="10"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="loadBundle" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.LoadBundleOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_LOADBUNDLE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-	
-	<entity id="metadata" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_METADATA.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>	
-
-	<entity id="param" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_PARAM.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectItem" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_SELECTITEM.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectItems" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_SELECTITEMS.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="subview" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateBean" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATEBEAN.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-	<entity id="validateDoubleRange" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATEDOUBLERANGE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateLength" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATELENGTH.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateLongRange" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATELONGRANGE.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="validateRegex" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATEREGEX.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-	<entity id="validateRequired" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATEREQUIRED.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-	<entity id="validator" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALIDATOR.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="valueChangeListener" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VALUECHANGELISTENER.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="verbatim" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					minHeight="10"
-					minWidth="10"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="view" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="viewParam" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFCORE/small/JSF_VIEWPARAM.gif"
-					widget="true"
-					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>	
-	</entity>
-
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.properties
deleted file mode 100644
index 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 8436c86..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core_pi.xml
+++ /dev/null
@@ -1,253 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="http://java.sun.com/jsf/core" 
-	type="tagFile">
-	
-	<trait id="is-jsf-component-library">
-		<value xsi:type="mdt:BooleanValue">true</value>
-	</trait>
-	
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">						
-			<item id="view"/>
-			<item id="validator"/>
-			<item id="valueChangeListener"/>			
-			<item id="actionListener"/>
-			<item id="convertDateTime"/>
-			<item id="converter"/>
-			<item id="convertNumber"/>			
-			<item id="facet"/>
-			<item id="attribute"/>
-			<item id="loadBundle"/>
-			<item id="param"/>
-			<item id="selectItem"/>
-			<item id="selectItems"/>
-			<item id="subview"/>
-			<item id="validateDoubleRange"/>
-			<item id="validateLength"/>
-			<item id="validateLongRange"/>
-			<item id="verbatim"/>			
-			<item id="ajax"/>
-			<item id="event"/>
-			<item id="metadata"/>
-			<item id="validateBean"/>
-			<item id="validateRegex"/>
-			<item id="validateRequired"/>
-			<item id="viewParam"/>
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">icons/palette/JSFCORE</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">%JSFCORE.display-label</value>
-	</trait>
-	
-	<entity id="actionListener" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_ACTIONLISTENER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_ACTIONLISTENER.gif</value>
-		</trait>
-	</entity>
-	<entity id="ajax" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_AJAX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_AJAX.gif</value>
-		</trait>
-	</entity>
-	<entity id="attribute" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_ATTRIBUTE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_ATTRIBUTE.gif</value>
-		</trait>
-	</entity>	
-	<entity id="convertDateTime" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_CONVERTDATETIME.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_CONVERTDATETIME.gif</value>
-		</trait>
-	</entity>
-	<entity id="convertNumber" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_CONVERTNUMBER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_CONVERTNUMBER.gif</value>
-		</trait>
-	</entity>
-	<entity id="converter" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_CONVERTER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_CONVERTER.gif</value>
-		</trait>
-	</entity>
-	<entity id="event" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_EVENT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_EVENT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="facet" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_FACET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_FACET.gif</value>
-		</trait>
-	</entity>
-	<entity id="loadBundle" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_LOADBUNDLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_LOADBUNDLE.gif</value>
-		</trait>
-	</entity>
-	<entity id="metadata" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_METADATA.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_METADATA.gif</value>
-		</trait>
-	</entity>	
-	<entity id="param" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_PARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_PARAM.gif</value>
-		</trait>
-	</entity>
-	<entity id="selectItem" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTITEM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTITEM.gif</value>
-		</trait>
-	</entity>
-	<entity id="selectItems" type="tag">	
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTITEMS.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTITEMS.gif</value>
-		</trait>
-	</entity>
-	<entity id="subview" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SUBVIEW.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SUBVIEW.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateBean" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATEBEAN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATEBEAN.gif</value>
-		</trait>
-	</entity>	
-	<entity id="validateDoubleRange" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATEDOUBLERANGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATEDOUBLERANGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateLength" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATELENGTH.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATELENGTH.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateLongRange" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATELONGRANGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATELONGRANGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateRegex" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATEREGEX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATEREGEX.gif</value>
-		</trait>
-	</entity>
-	<entity id="validateRequired" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATEREQUIRED.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATEREQUIRED.gif</value>
-		</trait>
-	</entity>
-	<entity id="validator" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALIDATOR.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALIDATOR.gif</value>
-		</trait>
-	</entity>
-	<entity id="valueChangeListener" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VALUECHANGELISTENER.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VALUECHANGELISTENER.gif</value>
-		</trait>
-	</entity>
-	<entity id="verbatim" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VERBATIM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VERBATIM.gif</value>
-		</trait>
-	</entity>
-	<entity id="view" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VIEW.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VIEW.gif</value>
-		</trait>	
-	</entity>
-	<entity id="viewParam" type="tag">
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_VIEWPARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_VIEWPARAM.gif</value>
-		</trait>	
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.properties
deleted file mode 100644
index 7279b8b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.properties
+++ /dev/null
@@ -1,50 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-messages.layout.displayed-values.list=list (an HTML list)
-messages.layout.displayed-values.table=table (an HTML table)
-
-selectManyCheckbox.layout.displayed-values.pageDirection=pageDirection (list is laid out vertically)
-selectManyCheckbox.layout.displayed-values.lineDirection=lineDirection (list is laid out horizontally)
-
-selectOneRadio.layout.displayed-values.pageDirection=pageDirection (list is laid out vertically)
-selectOneRadio.layout.displayed-values.lineDirection=lineDirection (list is laid out horizontally)
-
-any.frame.displayed-values.none=none (no sides, default value)
-any.frame.displayed-values.above=above (top side only)
-any.frame.displayed-values.below=below (bottom side only)
-any.frame.displayed-values.hsides=hsides (top and bottom sides only)
-any.frame.displayed-values.vsides=vsides (right and left sides only)
-any.frame.displayed-values.lhs=lhs (left hand side only)
-any.frame.displayed-values.rhs=rhs (right hand side only)
-any.frame.displayed-values.box=box (all four sides)
-any.frame.displayed-values.border=border (all four sides)
-
-any.rules.displayed-values.none=none (no rules, default value)
-any.rules.displayed-values.groups=groups (between row groups)
-any.rules.displayed-values.rows=rows (between rows only)
-any.rules.displayed-values.cols=cols (between columns only)
-any.rules.displayed-values.all=all (between all rows and columns)
-
-property.category.event=Event
-property.category.language=Language
-property.category.html=HTML
-property.category.css=CSS
-property.category.jsf=JSF
-property.category.general=General
-property.category.accessibility=Accessibility
-property.category.visualProperty=VisualProperty
-property.category.browser.specific=Browser Specific
-property.category.core=Core
-property.category.content=Content
-property.category.data.binding=Data Binding
-property.category.dynamic=Dynamic
-property.category.file=File
-property.category.image=Image
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.xml
deleted file mode 100644
index a50dc56..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html.xml
+++ /dev/null
@@ -1,1418 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:cnst="http://org.eclipse.jst.jsf.core/constraints.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:qe="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="http://java.sun.com/jsf/html" 
-	type="tagFile">
-
-	<entity id="body" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>		
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="style"/>			
-			</value>
-		</trait>	
-	</entity>	
-	<entity id="button" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="outcome"/>
-				<section id="includeViewParams"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-		<entity id="fragment">					
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="includeViewParams">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="image">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.WebPathType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="outcome">	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-	</entity>
-	<entity id="column" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-			</value>
-		</trait>		
-	</entity>
-	<entity id="commandButton" type="tag">	
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="action"/>				
-				<section id="type"/>
-				<section id="style"/>
-				<section id="section.general.commandButton.listener" type="SECTION"/>
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-						<tagId>
-							<uri>http://java.sun.com/jsf/html</uri>
-							<name>form</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="type">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>		
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>button</item>
-					<item>reset</item>
-					<item>submit</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">submit</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="image">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.WebPathType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="label">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="commandLink" type="tag">		
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="action"/>				
-				<section id="style"/>	
-				<section id="section.general.commandLink.listener" type="SECTION"/>			
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-						<tagId>
-							<uri>http://java.sun.com/jsf/html</uri>
-							<name>form</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-	</entity>
-	<entity id="dataTable" type="tag">
-		<include-entity-group id="jsf-table-attributes"/>
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="var"/>
-				<section id="width"/>
-				<section id="border"/>
-				<section id="bgcolor"/>
-				<section id="style"/>	
-				<section id="section.general.dataTable.columns" type="SECTION"/>		
-			</value>
-		</trait>
-		<entity id="bgcolor">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ColorType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="var">
-			<trait id="contributes-value-binding">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-			<trait id="value-binding-scope">
-				<value xsi:type="mdt:StringValue">request</value>
-			</trait>
-			<trait id="value-binding-symbol-factory">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.designtime.core.loadBundle</value>
-			</trait>
-			<trait id="category"><value xsi:type="mdt:StringValue">%property.category.jsf</value></trait>			
-		</entity>
-	</entity>
-	<entity id="form" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<include-entity-group id="form-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="style"/>			
-			</value>
-		</trait>	
-	</entity>
-	<entity id="head" type="tag">
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="binding"/>	
-				<section id="lang"/>
-				<section id="dir"/>		
-			</value>
-		</trait>	
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.component.UIComponent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>					
-		</entity>	
-	</entity>
-	<entity id="graphicImage" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="url"/>
-				<section id="binding"/>
-				<section id="style"/>			
-			</value>
-		</trait>
-	</entity>
-	<entity id="inputHidden" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>	
-				<!--  <section id="section.general.inputHidden.type" type="SECTION"/>	-->
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>			
-		</entity>
-	</entity>
-	<entity id="inputSecret" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>	
-				<!-- <section id="section.general.inputSecret.type" type="SECTION"/> -->
-				<section id="section.general.inputText.others" type="SECTION"/>				
-			</value>
-		</trait>		
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="inputText" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>	
-				<!--  <section id="section.general.inputText.type" type="SECTION"/> -->
-				<section id="section.general.inputText.others" type="SECTION"/>							
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="inputTextarea" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>		
-				<!-- <section id="section.general.inputTextarea.type" type="SECTION"/> -->
-				<section id="section.general.inputTextarea.others" type="SECTION"/>	
-			</value>
-		</trait>		
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>	
-	</entity>
-	<entity id="link" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="outcome"/>
-				<section id="includeViewParams"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-		<entity id="fragment">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="includeViewParams">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="image">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.WebPathType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="outcome">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-	</entity>	
-	<entity id="message" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="for-entity"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="for"/>			
-			</value>
-		</trait>
-	</entity>
-	<entity id="messages" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="layout"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-		<entity id="layout">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>list</item>
-					<item>table</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">	
-				<value xsi:type="mdt:ListOfValues">							
-					<item>%messages.layout.displayed-values.list</item>		
-					<item>%messages.layout.displayed-values.table</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">list</value>
-			</trait>				
-		</entity>	
-	</entity>
-	<entity id="outputFormat" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>		
-				<section id="section.general.outputFormat.params" type="SECTION"/>	
-			</value>
-		</trait>		
-	</entity>
-	<entity id="outputLabel" type="tag">		
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<include-entity-group id="for-entity"/>		
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="for"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-	</entity>
-	<entity id="outputLink" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-	</entity>
-	<entity id="outputScript" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>		
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="binding"/>
-				<section id="section.general.outputText.converter" type="SECTION"/>	
-			</value>
-		</trait>
-		<entity id="target">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-		</entity>	
-		<entity id="library">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-		</entity>	
-		<entity id="name">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-		</entity>	
-	</entity>
-		<entity id="outputStylesheet" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="binding"/>
-				<section id="section.general.outputText.converter" type="SECTION"/>	
-			</value>
-		</trait>
-		<entity id="library">
-		
-		</entity>	
-		<entity id="name">
-
-		</entity>	
-	</entity>
-	<entity id="outputText" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="binding"/>
-				<section id="style"/>	
-				<section id="section.general.outputText.converter" type="SECTION"/>	
-			</value>
-		</trait>		
-	</entity>
-	<entity id="panelGrid" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="jsf-table-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="columns"/>
-				<section id="border"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-	</entity>
-	<entity id="panelGroup" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>		
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-	</entity>
-	<entity id="selectBooleanCheckbox" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>			
-			</value>
-		</trait>		
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="selectManyCheckbox" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="layout"/>
-				<section id="style"/>	
-				<section id="section.general.selectManyCheckbox.choices" type="SECTION"/>			
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="layout">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>pageDirection</item>
-					<item>lineDirection</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">				
-				<value xsi:type="mdt:ListOfValues">
-					<item>%selectManyCheckbox.layout.displayed-values.pageDirection</item>		
-					<item>%selectManyCheckbox.layout.displayed-values.lineDirection</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">lineDirection</value>
-			</trait>
-		</entity>
-		<entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-            </trait>
-            <trait id="runtime-type-setter-required">
-                <value xsi:type="mdt:BooleanValue">true</value>
-            </trait>
-        </entity>
-    </entity>
-	<entity id="selectManyListbox" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="size"/>
-				<section id="style"/>	
-				<section id="section.general.selectManyListbox.choices" type="SECTION"/>		
-			</value>
-		</trait>		
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-	    <entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-            </trait>
-            <trait id="runtime-type-setter-required">
-                <value xsi:type="mdt:BooleanValue">true</value>
-            </trait>
-        </entity>
-	</entity>
-	<entity id="selectManyMenu" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>		
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>	
-				<section id="section.general.selectManyMenu.choices" type="SECTION"/>		
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-            <trait id="attribute-value-runtime-type">
-                <value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-            </trait>
-            <trait id="runtime-type-setter-required">
-                <value xsi:type="mdt:BooleanValue">true</value>
-            </trait>
-        </entity>
-	</entity>
-	<entity id="selectOneListbox" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="size"/>
-				<section id="style"/>			
-				<section id="section.general.selectOneListbox.choices" type="SECTION"/>
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="selectOneMenu" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="style"/>	
-				<section id="section.general.selectOneMenu.choices" type="SECTION"/>		
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-	</entity>
-	<entity id="selectOneRadio" type="tag">
-		<include-entity-group id="basic-jsf-html-attributes"/>
-		<include-entity-group id="common-jsf-html-attributes"/>
-		<include-entity-group id="common-html-attributes" uri="HTML"/>
-		<include-entity-group id="common-language-attributes" uri="HTML"/>
-		<include-entity-group id="common-core-attributes" uri="HTML"/>
-		<include-entity-group id="common-event-attributes" uri="HTML"/>
-		<trait id="quick-edit-tab">
-			<value xsi:type="qe:QuickEditTabSections">
-				<section id="id"/>
-				<section id="value"/>
-				<section id="layout"/>
-				<section id="style"/>
-				<section id="section.general.selectOneRadio.choices" type="SECTION"/>			
-			</value>
-		</trait>
-		<trait id="containment-constraint">
-			<value xsi:type="cnst:ContainsTagConstraint">
-				<set-generator>
-					<algorithm>xpath</algorithm>
-					<expression>ancestor::*</expression>
-				</set-generator>
-				<satisfies-set>
-						<tagId>
-							<uri>http://java.sun.com/jsf/core</uri>
-							<name>view</name>
-						</tagId>
-				</satisfies-set>
-			</value>
-		</trait>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueType</value>
-			</trait>
-			<trait id="runtime-type-setter-required">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>	
-		<entity id="layout">
-			<include-entity-group>common-attributes</include-entity-group>
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>pageDirection</item>
-					<item>lineDirection</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">		
-				<value xsi:type="mdt:ListOfValues">		
-					<item>%selectOneRadio.layout.displayed-values.pageDirection</item>		
-					<item>%selectOneRadio.layout.displayed-values.lineDirection</item>
-				</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">lineDirection</value>
-			</trait>				
-		</entity>			
-	</entity>
-	<entityGroup id="basic-jsf-html-attributes">
-		<entity id="id">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ComponentIDType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="binding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ComponentBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">javax.faces.component.UIComponent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>					
-		</entity>	
-		<entity id="converter">			
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.FacesConfigConverterIDType</value>
-			</trait>			
-			<trait id="config-type">
-				<value xsi:type="mdt:StringValue">javax.faces.convert.Converter</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="rendered">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>	
-		<entity id="required">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="styleClass">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>
-		<entity id="value">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ValueBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">java.lang.String</value>
-			</trait>			
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>	
-		</entity>
-		<entity id="valueChangeListener">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ValueChangeEvent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>	
-		</entity>	
-		<entity id="validator">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>	
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:ListOfValues">
-					<item>javax.faces.context.FacesContext</item>
-					<item>javax.faces.component.UIComponent</item>
-					<item>java.lang.Object</item>		
-				</value>						
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>	
-	</entityGroup>
-	<entityGroup id="common-jsf-html-attributes">
-		<!-- This group will be refactored -->
-		<entity id="action">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.ActionType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">java.lang.String</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>							
-		</entity>
-		<entity id="actionListener">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.MethodBindingType</value>
-			</trait>
-			<trait id="runtime-return-type">
-				<value xsi:type="mdt:StringValue">void</value>
-			</trait>			
-			<trait id="runtime-param-types">
-				<value xsi:type="mdt:StringValue">javax.faces.event.ActionEvent</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="cols">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="escape">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>			
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="globalOnly">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>		
-		<entity id="immediate">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>	
-		<entity id="readonly">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>			
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>		
-		<entity id="redisplay">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>				
-		</entity>
-
-		<entity id="showDetail">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>		
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>
-		<entity id="dalign">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>right</item>					
-					<item>left</item>
-					<item>center</item>
-					<item>justify</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>	
-		<entity id="ialign">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>bottom</item>
-					<item>middle</item>
-					<item>top</item>
-					<item>right</item>
-					<item>left</item>					
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>			
-		<entity id="linktype">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.LinkType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>index</item>
-					<item>subsection</item>
-					<item>bookmark</item>
-					<item>start</item>
-					<item>next</item>					
-					<item>stylesheet</item>
-					<item>chapter</item>
-					<item>help</item>
-					<item>alternate</item>
-					<item>appendix</item>	
-					<item>contents</item>
-					<item>section</item>					
-					<item>prev</item>
-					<item>previous</item>
-					<item>glossary</item>
-					<item>copyright</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="media">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>tv</item>
-					<item>braille</item>
-					<item>tty</item>
-					<item>print</item>
-					<item>all</item>					
-					<item>projection</item>
-					<item>handheld</item>
-					<item>screen</item>
-					<item>aural</item>
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>	
-		<entity id="scope">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>row</item>
-					<item>col</item>
-					<item>rowgroup</item>
-					<item>colgroup</item>				
-				</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>	
-	</entityGroup>
-	<entityGroup id="jsf-table-attributes">
-		<entity id="bgcolor">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>	
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>		
-		</entity>	
-		<entity id="border">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="cellpadding">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="cellspacing">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum"><value xsi:type="mdt:StringValue">0</value></trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="columns">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum">
-				<value xsi:type="mdt:StringValue">0</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="columnClasses">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>		
-		<entity id="first">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.IntegerType</value>
-			</trait>
-			<trait id="valid-minimum">
-				<value xsi:type="mdt:StringValue">0</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="footerClass">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>	
-		<entity id="frame">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>above</item>
-					<item>below</item>
-					<item>hsides</item>
-					<item>vsides</item>
-					<item>lhs</item>
-					<item>rhs</item>			
-					<item>box</item>
-					<item>border</item>	
-				</value>
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.frame.displayed-values.none</item>
-					<item>%any.frame.displayed-values.above</item>
-					<item>%any.frame.displayed-values.below</item>
-					<item>%any.frame.displayed-values.hsides</item>
-					<item>%any.frame.displayed-values.vsides</item>
-					<item>%any.frame.displayed-values.lhs</item>
-					<item>%any.frame.displayed-values.rhs</item>			
-					<item>%any.frame.displayed-values.box</item>
-					<item>%any.frame.displayed-values.border</item>		
-				</value>	
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">none</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>			
-		</entity>			
-		<entity id="headerClass">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="rowClasses">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.CSSClassType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="rules">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="valid-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>none</item>
-					<item>groups</item>
-					<item>rows</item>
-					<item>cols</item>
-					<item>all</item>
-				</value>
-			</trait>
-			<trait id="displayed-values">
-				<value xsi:type="mdt:ListOfValues">
-					<item>%any.rules.displayed-values.none</item>
-					<item>%any.rules.displayed-values.groups</item>
-					<item>%any.rules.displayed-values.rows</item>
-					<item>%any.rules.displayed-values.cols</item>
-					<item>%any.rules.displayed-values.all</item>	
-				</value>	
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:StringValue">none</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>							
-		</entity>
-		<entity id="showSummary">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.BooleanType</value>
-			</trait>
-			<trait id="default-value">
-				<value xsi:type="mdt:BooleanValue">false</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-		<entity id="summary">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-	</entityGroup>
-	<entityGroup id="for-entity">
-		<entity id="for">
-			<trait id="attribute-value-runtime-type">
-				<value xsi:type="mdt:StringValue">org.eclipse.jst.jsf.core.attributevalues.StringType</value>
-			</trait>
-			<trait id="category">
-				<value xsi:type="mdt:StringValue">%property.category.jsf</value>
-			</trait>
-		</entity>
-	</entityGroup>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_dti.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_dti.xml
deleted file mode 100644
index 2fbf8e7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_dti.xml
+++ /dev/null
@@ -1,1026 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore"
-	xmlns:dti="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"
-	id="http://java.sun.com/jsf/html"
-	type="tagFile">
-
-	<entity id="body" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="button" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<!-- if image attribute exists -->
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@image"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="type"/>
-							<parameter value="image"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="image"/>
-							<parameter value="src"/>
-						</operation>
-					</operation>
-					<!-- if image attribute does not exist -->
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@image"/>
-						<!-- create default type attribute (submit) -->
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="type"/>
-							<parameter value="submit"/>
-						</operation>
-						<!-- override default if type attribute is set (e.g. reset) -->
-						<!--
-							<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-								<parameter value="type"/>
-							</operation>
-						-->
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true">
-				    <resolve-attribute-value attributeName="value"/>
-				    <resolve-attribute-value attributeName="image"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-					<resolve-attribute-value attributeName="image"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-	<entity id="column" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.ColumnOperation"/>										
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandButton" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<!-- if image attribute exists -->
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="@image"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="type"/>
-							<parameter value="image"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="image"/>
-							<parameter value="src"/>
-						</operation>
-					</operation>
-					<!-- if image attribute does not exist -->
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@image"/>
-						<!-- create default type attribute (submit) -->
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="type"/>
-							<parameter value="submit"/>
-						</operation>
-						<!-- override default if type attribute is set (e.g. reset) -->
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-							<parameter value="type"/>
-						</operation>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true">
-				    <resolve-attribute-value attributeName="value"/>
-				    <resolve-attribute-value attributeName="image"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-					<resolve-attribute-value attributeName="image"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="commandLink" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="dataTable" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.DataTableOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-					needTableDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="form" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="form"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="graphicImage" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="img"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="url"/>
-						<parameter value="src"/>
-					</operation>
-					<!--
-						if both "value" and "url" source attributes exist,
-						"value" overrides "url" as destination "src" attribute
-					-->
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="value"/>
-						<parameter value="src"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true">
-					<resolve-attribute-value attributeName="src"/>
-					<resolve-attribute-value attributeName="value"/>
-					<resolve-attribute-value attributeName="url"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="src"/>
-					<resolve-attribute-value attributeName="value"/>
-					<resolve-attribute-value attributeName="url"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-	<entity id="head" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="inputHidden" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_INPUTHIDDEN.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputSecret" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="password"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-				
-				<tag-decorate-info id="vpd-decorate-design">
-                    <resolve-attribute-value attributeName="value"/>
-                </tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputText" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="text"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview">
-					<resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-				
-				<tag-decorate-info id="vpd-decorate-design">
-                    <resolve-attribute-value attributeName="value"/>
-                </tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="inputTextarea" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="textarea"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-				    <resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				>
-				    <resolve-attribute-value attributeName="value"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-	
-	<entity id="link" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="outcome"/>
-						<parameter value="href"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-						<parameter value="true"/>
-					</operation>					
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true">
-					<resolve-attribute-value attributeName="value"/> 	
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-	
-	<entity id="message" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_MESSAGE.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="messages" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_MESSAGES.gif"
-					widget="true"
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputFormat" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true">
-					<resolve-attribute-value attributeName="value"/> 
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true">
-					<resolve-attribute-value attributeName="value"/> 	
-				</tag-decorate-info>
-				
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputLabel" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="label"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true">
-                    <resolve-attribute-value attributeName="./text()/"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true">
-				    <resolve-attribute-value attributeName="./text()/"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="outputLink" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="a"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="href"/>
-						<parameter value="#"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="value"/>
-						<parameter value="href"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true">
-					<resolve-attribute-value attributeName="value"/> 
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-	<entity id="outputScript">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_OUTPUTSCRIPT.gif"
-					widget="true"					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="outputStylesheet">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-decorate-info id="vpd-decorate-design"
-					nonVisual="true"
-					nonVisualImagePath="icons/palette/JSFHTML/small/JSF_OUTPUTSTYLESHEET.gif"
-					widget="true"					
-				/>
-				<tag-decorate-info id="vpd-decorate-preview"
-					nonVisual="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="outputText" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="span"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.ConvertAttributeToTextOperation">
-						<parameter value="value"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					needBorderDecorator="true"
-					multiLevel="true"
-					widget="true"
-					setNonVisualChildElements="true"
-				>
-				    <resolve-attribute-value attributeName="./text()/"/>
-				</tag-decorate-info>
-				<tag-decorate-info id="vpd-decorate-preview"
-					resolveChildText="true"
-				>
-				    <resolve-attribute-value attributeName="./text()/"/>
-				</tag-decorate-info>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelGrid" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.PanelGridOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-					needTableDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="panelGroup" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="div"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyChildrenOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectBooleanCheckbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="input"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="type"/>
-						<parameter value="checkbox"/>
-					</operation>
-					<!-- if value attribute exists and is "true" -->
-					<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-						<parameter value="self::node()[@value='true']"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-							<parameter value="checked"/>
-							<parameter value="checked"/>
-						</operation>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyCheckbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.SelectManyCheckboxOperation"/>						
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyListbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- multiple select allowed -->
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="multiple"/>
-						<parameter value="multiple"/>
-					</operation>
-					<!-- if no "size" attribute -->
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@size"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeFromXPathOperation">
-							<parameter value="size"/>
-							<parameter value="count(selectItem)"/>
-							<parameter value="http://java.sun.com/jsf/core"/>
-							<parameter value="selectItem"/>
-						</operation>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="org.eclipse.jst.pagedesigner.IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<parameter value="http://java.sun.com/jsf/core"/>
-						<parameter value="selectItem"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectManyMenu" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- multiple select allowed -->
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="multiple"/>
-						<parameter value="multiple"/>
-					</operation>
-					<!-- size fixed at 1 -->
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="size"/>
-						<parameter value="1"/>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="org.eclipse.jst.pagedesigner.IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<parameter value="http://java.sun.com/jsf/core"/>
-						<parameter value="selectItem"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneListbox" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- if no "size" attribute -->
-					<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-						<parameter value="@size"/>
-						<operation id="org.eclipse.jst.pagedesigner.CreateAttributeFromXPathOperation">
-							<parameter value="size"/>
-							<parameter value="count(selectItem)"/>
-							<parameter value="http://java.sun.com/jsf/core"/>
-							<parameter value="selectItem"/>
-						</operation>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="org.eclipse.jst.pagedesigner.IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<parameter value="http://java.sun.com/jsf/core"/>
-						<parameter value="selectItem"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneMenu" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.CreateElementOperation">
-						<parameter value="select"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.CopyAllAttributesOperation"/>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="styleClass"/>
-						<parameter value="class"/>
-					</operation>
-					<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-						<parameter value="id"/>
-						<parameter value="name"/>
-					</operation>
-					<!-- size fixed at 1 -->
-					<operation id="org.eclipse.jst.pagedesigner.CreateAttributeOperation">
-						<parameter value="size"/>
-						<parameter value="1"/>
-					</operation>
-					<!-- iterate over "selectItem" children -->
-					<operation id="org.eclipse.jst.pagedesigner.IterateOverElementsOperation">
-						<parameter value="selectItem"/>
-						<parameter value="http://java.sun.com/jsf/core"/>
-						<parameter value="selectItem"/>
-						<operation id="org.eclipse.jst.pagedesigner.AppendChildElementOperation">
-							<parameter value="option"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.CopyAttributeOperation">
-							<parameter value="itemValue"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.RenameAttributeOperation">
-							<parameter value="itemValue"/>
-							<parameter value="value"/>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-								<parameter value="@itemLabel"/>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-							<parameter value="@itemLabel"/>
-							<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-									<parameter value="@value"/>
-								</operation>
-							</operation>
-							<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-								<parameter value="@value"/>
-								<operation id="org.eclipse.jst.pagedesigner.IfOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextFromXPathOperation">
-										<parameter value="@itemValue"/>
-									</operation>
-								</operation>
-								<operation id="org.eclipse.jst.pagedesigner.IfNotOperation">
-									<parameter value="@itemValue"/>
-									<operation id="org.eclipse.jst.pagedesigner.AppendChildTextOperation">
-										<parameter value="selectItem"/>
-									</operation>
-								</operation>
-							</operation>
-						</operation>
-						<operation id="org.eclipse.jst.pagedesigner.MakeParentElementCurrentOperation"/>
-					</operation>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					widget="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-	<entity id="selectOneRadio" type="tag">
-		<trait id="dt-info">
-			<value xsi:type="dti:DTInfo">
-				<tag-convert-info>
-					<operation id="org.eclipse.jst.pagedesigner.jsf.ui.SelectOneRadioOperation"/>
-				</tag-convert-info>
-				<tag-decorate-info id="vpd-decorate-design"
-					multiLevel="true"
-					needBorderDecorator="true"
-				/>
-			</value>
-		</trait>
-	</entity>
-
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.properties
deleted file mode 100644
index e47787e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.properties
+++ /dev/null
@@ -1,42 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-JSFHTML.display-label=JSF HTML
-body.display-label=Body
-button.display-label=Button
-commandButton.display-label=Command Button
-commandLink.display-label=Command Link
-dataTable.display-label=Data Table
-form.display-label=Form
-graphicImage.display-label=Graphic Image
-head.display-label=Head
-inputHidden.display-label=Hidden Input
-inputSecret.display-label=Secret Input
-inputText.display-label=Text Input
-inputTextarea.display-label=Textarea Input
-link.display-label=Link
-message.display-label=Message
-messages.display-label=Messages
-outputFormat.display-label=Output Format
-outputLabel.display-label=Output Label
-outputLink.display-label=Output Link
-outputScript.display-label=Output Script
-outputStylesheet.display-label=Output Stylesheet
-outputText.display-label=Output Text
-panelGrid.display-label=Panel Grid
-panelGroup.display-label=Panel Group
-selectBooleanCheckbox.display-label=Select Boolean Checkbox
-selectManyCheckbox.display-label=Select Many Checkbox
-selectManyListbox.display-label=Select Many Listbox
-selectManyMenu.display-label=Select Many Menu
-selectOneListbox.display-label=Select One Listbox
-selectOneMenu.display-label=Select One Menu
-selectOneRadio.display-label=Select One Radio
-column.display-label=Column
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.xml
deleted file mode 100644
index 24fe3a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_html_pi.xml
+++ /dev/null
@@ -1,527 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="http://java.sun.com/jsf/html" 
-	type="tagFile">
-	
-	<trait id="is-jsf-component-library">
-		<value xsi:type="mdt:BooleanValue">true</value>
-	</trait>
-	
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="outputLabel"/>
-			<item id="inputText"/>
-			<item id="commandButton"/>
-			<item id="button"/>
-			<item id="inputTextarea"/>
-			<item id="outputText"/>
-			<item id="form"/>
-			<item id="head"/>
-			<item id="body"/>
-			<item id="inputHidden"/>
-			<item id="inputSecret"/>
-			<item id="column"/>
-			<item id="commandLink"/>
-			<item id="link"/>
-			<item id="message"/>			
-			<item id="messages"/>
-			<item id="outputFormat"/>
-			<item id="outputScript"/>
-			<item id="outputStylesheet"/>
-			<item id="panelGrid"/>
-			<item id="panelGroup"/>
-			<item id="selectBooleanCheckbox"/>
-			<item id="selectManyCheckbox"/>
-			<item id="selectManyListbox"/>
-			<item id="selectManyMenu"/>
-			<item id="selectOneListbox"/>
-			<item id="selectOneMenu"/>
-			<item id="selectOneRadio"/>
-			<item id="dataTable"/>
-			<item id="graphicImage"/>
-		</value>
-	</trait>
-	
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">/icons/palette/JSFHTML/</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">%JSFHTML.display-label</value>
-	</trait>
-	
-	<entity id="button" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%button.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_BUTTON.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_BUTTON.gif</value>
-		</trait>
-	</entity>	
-	<entity id="body" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%body.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_BODY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_BODY.gif</value>
-		</trait>
-	</entity>
-		
-	<entity id="commandButton" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%commandButton.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_COMMANDBUTTON.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_COMMANDBUTTON.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>	
-	</entity>
-	<entity id="commandLink" type="tag">		
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%commandLink.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_COMMANDLINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_COMMANDLINK.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>	
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-					<outputText value="CommandLink"
-					_uri_="http://java.sun.com/jsf/html" />
-				]]></template>
-			</value>
-		</trait>		
-	</entity>
-	<entity id="dataTable" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%dataTable.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_DATATABLE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_DATATABLE.gif</value>
-		</trait>	
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[ 
-				<column id="column1"
-					_uri_="http://java.sun.com/jsf/html">
-					<facet name="header"
-						_uri_="http://java.sun.com/jsf/core">
-						<outputText value="column1"
-							_uri_="http://java.sun.com/jsf/html" />
-					</facet>
-				</column>
-				<column id="column2"
-					_uri_="http://java.sun.com/jsf/html">
-					<facet name="header"
-						_uri_="http://java.sun.com/jsf/core">
-						<outputText value="column2"
-							_uri_="http://java.sun.com/jsf/html" />
-					</facet>
-				</column>
-				]]></template>
-				<attribute id="border" value="1"/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="form" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%form.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_FORM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_FORM.gif</value>
-		</trait>	
-	</entity>
-
-	<entity id="graphicImage" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%graphicImage.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_GRAPHICIMAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_GRAPHICIMAGE.gif</value>
-		</trait>		
-	</entity>
-	<entity id="head" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%head.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_HEAD.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_HEAD.gif</value>
-		</trait>
-	</entity>	
-	<entity id="inputHidden" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%inputHidden.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_INPUTHIDDEN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_INPUTHIDDEN.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>	
-	</entity>
-	<entity id="inputSecret" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%inputSecret.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_INPUTSECRET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_INPUTSECRET.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="inputText" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%inputText.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_INPUTTEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_INPUTTEXT.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="inputTextarea" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%inputTextarea.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_INPUTTEXTAREA.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_INPUTTEXTAREA.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="link" type="tag">		
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%link.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_LINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_LINK.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>	
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-					<outputText value="Link"
-					_uri_="http://java.sun.com/jsf/html" />
-				]]></template>
-			</value>
-		</trait>		
-	</entity>	
-	<entity id="message" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%message.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_MESSAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_MESSAGE.gif</value>
-		</trait>
-	</entity>
-	<entity id="messages" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%messages.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_MESSAGES.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_MESSAGES.gif</value>
-		</trait>	
-	</entity>
-	<entity id="outputFormat" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputFormat.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTFORMAT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTFORMAT.gif</value>
-		</trait>	
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-					<param value=""
-						_uri_="http://java.sun.com/jsf/core" />
-					]]>
-				</template>
-				<attribute id="value" value="outputFormat"/>
-			</value>			
-		</trait>
-	</entity>
-	<entity id="outputLabel" type="tag">		
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputLabel.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTLABEL.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTLABEL.gif</value>
-		</trait>		
- 		<trait id="tag-create">
- 			<value xsi:type="pi:TagCreationInfo">
-				<attribute id="value" value="outputLabel"/>
- 			</value>
- 		</trait>
-	</entity>
-	<entity id="outputLink" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputLink.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTLINK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTLINK.gif</value>
-		</trait>
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-				<outputText value="outputLink"
-					_$uri$="http://java.sun.com/jsf/html" />
-				]]></template>
-
-			</value>
-		</trait>			
-	</entity>
-	<entity id="outputScript" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputScript.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTSCRIPT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTSCRIPT.gif</value>
-		</trait>
-	</entity>
-	<entity id="outputStylesheet" type="tag">	
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputStylesheet.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTSTYLESHEET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTSTYLESHEET.gif</value>
-		</trait>
-	</entity>	
-	<entity id="outputText" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%outputText.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_OUTPUTTEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_OUTPUTTEXT.gif</value>
-		</trait>			
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<attribute id="value" value="outputText"/>
-			</value>
-		</trait>
-	</entity>
-	<entity id="panelGrid" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%panelGrid.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_PANELGRID.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_PANELGRID.gif</value>
-		</trait>
-		<trait id="tag-create">
-			<value xsi:type="pi:TagCreationInfo">
-				<template><![CDATA[
-				<outputText value="item1"
-					_uri_="http://java.sun.com/jsf/html" />
-				<outputText value="item2"
-					_uri_="http://java.sun.com/jsf/html" />
-				<outputText value="item3"
-					_uri_="http://java.sun.com/jsf/html" />
-				<outputText value="item4"
-					_uri_="http://java.sun.com/jsf/html" />
-				]]></template>
-				<attribute id="border" value="1"/>
-				<attribute id="columns" value="2"/>
-			</value>
-		</trait>					
-	</entity>
-	<entity id="panelGroup" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%panelGroup.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_PANELGROUP.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_PANELGROUP.gif</value>
-		</trait>	
-	</entity>
-	<entity id="selectBooleanCheckbox" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectBooleanCheckbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTBOOLEANCHECKBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTBOOLEANCHECKBOX.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyCheckbox" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectManyCheckbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTMANYCHECKBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTMANYCHECKBOX.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyListbox" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectManyListbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTMANYLISTBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTMANYLISTBOX.gif</value>
-		</trait>	
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectManyMenu" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectManyMenu.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTMANYMENU.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTMANYMENU.gif</value>
-		</trait>		
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneListbox" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectOneListbox.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTONELISTBOX.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTONELISTBOX.gif</value>
-		</trait>		
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneMenu" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectOneMenu.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTONEMENU.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTONEMENU.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="selectOneRadio" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%selectOneRadio.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_SELECTONERADIO.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_SELECTONERADIO.gif</value>
-		</trait>
-		<trait id="requires-html-form">
-			<value xsi:type="mdt:BooleanValue">true</value>
-		</trait>
-	</entity>
-	<entity id="column" type="tag">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%column.display-label</value>
-		</trait>
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSF_COLUMN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSF_COLUMN.gif</value>
-		</trait>		
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.properties
deleted file mode 100644
index 33b2269..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.properties
+++ /dev/null
@@ -1,60 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-plugin.display-label=Plugin
-plugin.description=Causes the execution of an applet or bean. The applet or bean executes in the specified plugin. If the plugin is not available, displays a dialog to initiate the download of the plugin software
-
-fallback.display-label=Fallback
-fallback.description=The element provides a message for the user if the plugin does not start
-
-root.display-label=Root
-root.description=Defines standard elements and namespace attributes of tag libraries
-
-text.display-label=Text
-text.description=Encloses template data
-
-expression.display-label=Expression
-expression.description=Contains an expression valid in the scripting language used in the page
-
-scriptlet.display-label=Scriptlet
-scriptlet.description=Contains a code fragment valid in the scripting language used in the page
-
-declaration.display-label=Declaration
-declaration.description=Declares a variable or method valid in the scripting language used in the page
-
-forward.display-label=Forward
-forward.description=Forwards a request to an HTML file, JSP page, or servlet
-
-param.display-label=Param
-param.description=The element passes the name and value of a parameter to the resource
-
-params.display-label=Params
-params.description=The element sends parameter names and values to an applet or Bean at startup
-
-include.display-label=Include
-include.description=Includes a static resource or the result from another web component
-
-useBean.display-label=UseBean
-useBean.description=Instantiates or references a bean with a specific name and scope
-
-getProperty.display-label=GetProperty
-getProperty.description=Inserts the value of a bean property into the response
-
-setProperty.display-label=SetProperty
-setProperty.description=Sets a bean property value or values
-
-directive.include.display-label=Directive.Include
-directive.include.description=Includes a resource of text or code when the JSP page is translated
-
-directive.page.display-label=Directive.Page
-directive.page.description=Defines attributes that apply to an entire JSP page
-
-directive.taglib.display-label=Directive.Taglib
-directive.taglib.description=Defines a tag library and prefix for the custom tags used in the JSP page
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.xml
deleted file mode 100644
index 307888b..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsp11.xml
+++ /dev/null
@@ -1,284 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:pi="http://org.eclipse.jsf.pagedesigner/paletteInfos.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="jsp11" 
-	type="tagFile">
-	
-	<trait id="paletteInfos">
-		<value xsi:type="pi:PaletteInfos">
-			<item id="jsp:directive.include"/>
-			<item id="jsp:directive.taglib"/>
-			<item id="jsp:expression"/>
-			<item id="jsp:declaration"/>
-			<item id="jsp:useBean"/>
-			<item id="jsp:getProperty"/>
-			<item id="jsp:setProperty"/>
-			<item id="jsp:include"/>
-			<item id="jsp:text"/>
-			<item id="jsp:root"/>
-			<item id="jsp:forward"/>
-			<item id="jsp:param"/>
-			<item id="jsp:params"/>
-			<item id="jsp:plugin"/>
-			<item id="jsp:fallback"/>
-			<item id="jsp:scriptlet"/>
-			<item id="jsp:directive.page"/>			
-		</value>
-	</trait>
-
-	<trait id="images-base-path">
-		<value xsi:type="mdt:StringValue">$nl$/icons/palette/JSP</value>
-	</trait>
-
-	<trait id="display-label">
-		<value xsi:type="mdt:StringValue">JSP</value>
-	</trait>
-	
-	<entity id="jsp:directive.include">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%directive.include.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%directive.include.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_DIRECTIVE.INCLUDE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_DIRECTIVE.INCLUDE.gif</value>
-		</trait>
-	</entity>
-	<entity id="jsp:directive.page">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%directive.page.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%directive.page.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_DIRECTIVE.PAGE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_DIRECTIVE.PAGE.gif</value>
-		</trait>
-	</entity>	
-
-	<entity id="jsp:directive.taglib">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%directive.taglib.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%directive.taglib.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_DIRECTIVE.TAGLIB.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_DIRECTIVE.TAGLIB.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:expression">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%expression.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%expression.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_EXPRESSION.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_EXPRESSION.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:declaration">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%declaration.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%declaration.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_DECLARATION.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_DECLARATION.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:useBean">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%useBean.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%useBean.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_USEBEAN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_USEBEAN.gif</value>
-		</trait>
-	</entity>	
-		
-	<entity id="jsp:getProperty">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%getProperty.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%getProperty.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_GETPROPERTY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_GETPROPERTY.gif</value>
-		</trait>
-	</entity>	
-
-	<entity id="jsp:setProperty">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%setProperty.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%setProperty.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_SETPROPERTY.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_SETPROPERTY.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:include">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%include.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%include.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_INCLUDE.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_INCLUDE.gif</value>
-		</trait>
-	</entity>	
-	
-	<entity id="jsp:text">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%text.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%text.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_TEXT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_TEXT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:root">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%root.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%root.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_ROOT.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_ROOT.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:forward">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%forward.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%forward.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_FORWARD.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_FORWARD.gif</value>
-		</trait>
-	</entity>	
-	
-	<entity id="jsp:param">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%param.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%param.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_PARAM.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_PARAM.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:params">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%params.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%params.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_PARAMS.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_PARAMS.gif</value>
-		</trait>
-	</entity>		
-	<entity id="jsp:plugin">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%plugin.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%plugin.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_PLUGIN.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_PLUGIN.gif</value>
-		</trait>
-	</entity>	
-	<entity id="jsp:fallback">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%fallback.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%fallback.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_FALLBACK.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_FALLBACK.gif</value>
-		</trait>
-	</entity>
-	<entity id="jsp:scriptlet">
-		<trait id="display-label">
-			<value xsi:type="mdt:StringValue">%scriptlet.display-label</value>
-		</trait>
-		<trait id="description">
-			<value xsi:type="mdt:StringValue">%scriptlet.description</value>
-		</trait>		
-		<trait id="small-icon">
-			<value xsi:type="mdt:StringValue">small/JSP_SCRIPTLET.gif</value>
-		</trait>
-		<trait id="large-icon">
-			<value xsi:type="mdt:StringValue">large/JSP_SCRIPTLET.gif</value>
-		</trait>
-	</entity>	
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/symbolInfoMetadata.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/symbolInfoMetadata.xml
deleted file mode 100644
index b23af83..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/symbolInfoMetadata.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<md:metadatamodel 
-	xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" 
-	xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" 
-	xmlns:mdt="http://org.eclipse.jst.jsf.common.metadata/metadataTraitTypes.ecore" 
-	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-	id="http://java.sun.com/jsf/core" 
-	type="tagFile">
-	
-
-	<entity id="view" type="tag">
-		<entity id="locale">
-			<trait id="sets-locale">
-				<value xsi:type="mdt:BooleanValue">true</value>
-			</trait>
-		</entity>
-	</entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_core.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_core.xml
deleted file mode 100644
index d85f9c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_core.xml
+++ /dev/null
@@ -1,236 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:viewMap="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xsi:noNamespaceSchemaLocation="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" id="http://java.sun.com/jsf/core" type="tagFile">
-  <entity id="view" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UIViewRoot</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.ViewRoot</componentType>
-            <componentFamily>javax.faces.ViewRoot</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateBean" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.BeanValidator</className>
-            <validatorId>javax.faces.Bean</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateDoubleRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.DoubleRangeValidator</className>
-            <validatorId>javax.faces.DoubleRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateLongRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.LongRangeValidator</className>
-            <validatorId>javax.faces.LongRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateRegex" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.RegexValidator</className>
-            <validatorId>javax.faces.RegularExpression</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity> 
-  <entity id="validateRequired" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.RequiredValidator</className>
-            <validatorId>javax.faces.Required</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>     
-  <entity id="subview" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UINamingContainer</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <componentType>javax.faces.NamingContainer</componentType>
-            <componentFamily>javax.faces.NamingContainer</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="converter" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_"/>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="convertNumber" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_">
-            <className>javax.faces.convert.NumberConverter</className>
-            <converterId>javax.faces.Number</converterId>
-            <forClass>java.lang.Number</forClass>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateLongRange" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.LongRangeValidator</className>
-            <validatorId>javax.faces.LongRange</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validateLength" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_">
-            <className>javax.faces.validator.LengthValidator</className>
-            <validatorId>javax.faces.Length</validatorId>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="convertDateTime" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ConverterTypeInfo_">
-            <className>javax.faces.convert.DateTimeConverter</className>
-            <converterId>javax.faces.DateTime</converterId>
-            <forClass>java.util.Date</forClass>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="validator" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ValidatorTypeInfo_"/>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="verbatim" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UIOutput</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <componentType>javax.faces.Output</componentType>
-            <componentFamily>javax.faces.Output</componentFamily>
-            <renderType>javax.faces.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectItem" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UISelectItem</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.SelectItem</componentType>
-            <componentFamily>javax.faces.SelectItem</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectItems" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UISelectItems</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.SelectItems</componentType>
-            <componentFamily>javax.faces.SelectItems</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="param" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UIParameter</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.Parameter</componentType>
-            <componentFamily>javax.faces.Parameter</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-</md:metadatamodel>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_html.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_html.xml
deleted file mode 100644
index 9c94c71..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/viewMappings_html.xml
+++ /dev/null
@@ -1,558 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<md:metadatamodel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:viewMap="http://org.eclipse.jst.jsf.core/componentMapping.ecore" xmlns:md="http://org.eclipse.jst.jsf.common.metadata/metadata.ecore" xsi:noNamespaceSchemaLocation="http://org.eclipse.jst.jsf.core/componentMapping.ecore" id="http://java.sun.com/jsf/html" type="tagFile">
-  <entity id="selectOneMenu" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectOneMenu</className>
-            <superClasses>javax.faces.component.UISelectOne</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectOneMenu</componentType>
-            <componentFamily>javax.faces.SelectOne</componentFamily>
-            <renderType>javax.faces.Menu</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyListbox" type="tag">
-      <include-entity-group id="common-valueholder-attributes"/>
-      <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectManyListbox</className>
-            <superClasses>javax.faces.component.UISelectMany</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectManyListbox</componentType>
-            <componentFamily>javax.faces.SelectMany</componentFamily>
-            <renderType>javax.faces.Listbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="form" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlForm</className>
-            <superClasses>javax.faces.component.UIForm</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlForm</componentType>
-            <componentFamily>javax.faces.Form</componentFamily>
-            <renderType>javax.faces.Form</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="message" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlMessage</className>
-            <superClasses>javax.faces.component.UIMessage</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlMessage</componentType>
-            <componentFamily>javax.faces.Message</componentFamily>
-            <renderType>javax.faces.Message</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="graphicImage" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlGraphicImage</className>
-            <superClasses>javax.faces.component.UIGraphic</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlGraphicImage</componentType>
-            <componentFamily>javax.faces.Graphic</componentFamily>
-            <renderType>javax.faces.Image</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="column" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.UIColumn</className>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.Column</componentType>
-            <componentFamily>javax.faces.Column</componentFamily>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputFormat" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <beanMappedProperties>value</beanMappedProperties>
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlOutputFormat</className>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlOutputFormat</componentType>
-            <componentFamily>javax.faces.Output</componentFamily>
-            <renderType>javax.faces.Format</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyMenu" type="tag">
-   <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectManyMenu</className>
-            <superClasses>javax.faces.component.UISelectMany</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectManyMenu</componentType>
-            <componentFamily>javax.faces.SelectMany</componentFamily>
-            <renderType>javax.faces.Menu</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOneRadio" type="tag">
-      <include-entity-group id="common-valueholder-attributes"/>
-      <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectOneRadio</className>
-            <superClasses>javax.faces.component.UISelectOne</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectOneRadio</componentType>
-            <componentFamily>javax.faces.SelectOne</componentFamily>
-            <renderType>javax.faces.Radio</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelGroup" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlPanelGroup</className>
-            <superClasses>javax.faces.component.UIPanel</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlPanelGroup</componentType>
-            <componentFamily>javax.faces.Panel</componentFamily>
-            <renderType>javax.faces.Group</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectOneListbox" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-      <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectOneListbox</className>
-            <superClasses>javax.faces.component.UISelectOne</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectOneListbox</componentType>
-            <componentFamily>javax.faces.SelectOne</componentFamily>
-            <renderType>javax.faces.Listbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="commandButton" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlCommandButton</className>
-            <superClasses>javax.faces.component.UICommand</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlCommandButton</componentType>
-            <componentFamily>javax.faces.Command</componentFamily>
-            <renderType>javax.faces.Button</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputText" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlInputText</className>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlInputText</componentType>
-            <componentFamily>javax.faces.Input</componentFamily>
-            <renderType>javax.faces.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="dataTable" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlDataTable</className>
-            <superClasses>javax.faces.component.UIData</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.NamingContainer</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlDataTable</componentType>
-            <componentFamily>javax.faces.Data</componentFamily>
-            <renderType>javax.faces.Table</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectBooleanCheckbox" type="tag">
-      <include-entity-group id="common-valueholder-attributes"/>
-      <trait id="viewElementMapping">
-       <md:value xsi:type="viewMap:TagMapping">
-         <versionedTagToViewMappings>
-           <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-             <className>javax.faces.component.html.HtmlSelectBooleanCheckbox</className>
-             <superClasses>javax.faces.component.UISelectBoolean</superClasses>
-             <superClasses>javax.faces.component.UIInput</superClasses>
-             <superClasses>javax.faces.component.UIOutput</superClasses>
-             <superClasses>javax.faces.component.UIComponentBase</superClasses>
-             <superClasses>javax.faces.component.UIComponent</superClasses>
-             <superClasses>java.lang.Object</superClasses>
-             <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-             <interfaces>javax.faces.component.ValueHolder</interfaces>
-             <interfaces>javax.faces.component.StateHolder</interfaces>
-             <componentType>javax.faces.HtmlSelectBooleanCheckbox</componentType>
-             <componentFamily>javax.faces.SelectBoolean</componentFamily>
-             <renderType>javax.faces.Checkbox</renderType>
-           </typeInfo>
-         </versionedTagToViewMappings>
-       </md:value>
-    </trait>
-  </entity>
-  <entity id="outputText" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlOutputText</className>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlOutputText</componentType>
-            <componentFamily>javax.faces.Output</componentFamily>
-            <renderType>javax.faces.Text</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="selectManyCheckbox" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlSelectManyCheckbox</className>
-            <superClasses>javax.faces.component.UISelectMany</superClasses>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlSelectManyCheckbox</componentType>
-            <componentFamily>javax.faces.SelectMany</componentFamily>
-            <renderType>javax.faces.Checkbox</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputSecret" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlInputSecret</className>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlInputSecret</componentType>
-            <componentFamily>javax.faces.Input</componentFamily>
-            <renderType>javax.faces.Secret</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="panelGrid" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlPanelGrid</className>
-            <superClasses>javax.faces.component.UIPanel</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlPanelGrid</componentType>
-            <componentFamily>javax.faces.Panel</componentFamily>
-            <renderType>javax.faces.Grid</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="commandLink" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlCommandLink</className>
-            <superClasses>javax.faces.component.UICommand</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ActionSource</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlCommandLink</componentType>
-            <componentFamily>javax.faces.Command</componentFamily>
-            <renderType>javax.faces.Link</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputHidden" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlInputHidden</className>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlInputHidden</componentType>
-            <componentFamily>javax.faces.Input</componentFamily>
-            <renderType>javax.faces.Hidden</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="inputTextarea" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlInputTextarea</className>
-            <superClasses>javax.faces.component.UIInput</superClasses>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.EditableValueHolder</interfaces>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlInputTextarea</componentType>
-            <componentFamily>javax.faces.Input</componentFamily>
-            <renderType>javax.faces.Textarea</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputLabel" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlOutputLabel</className>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlOutputLabel</componentType>
-            <componentFamily>javax.faces.Output</componentFamily>
-            <renderType>javax.faces.Label</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="outputLink" type="tag">
-    <include-entity-group id="common-valueholder-attributes"/>
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlOutputLink</className>
-            <superClasses>javax.faces.component.UIOutput</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.ValueHolder</interfaces>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlOutputLink</componentType>
-            <componentFamily>javax.faces.Output</componentFamily>
-            <renderType>javax.faces.Link</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entity id="messages" type="tag">
-    <trait id="viewElementMapping">
-      <md:value xsi:type="viewMap:TagMapping">
-        <versionedTagToViewMappings>
-          <typeInfo xsi:type="viewMap:ComponentTypeInfo_">
-            <className>javax.faces.component.html.HtmlMessages</className>
-            <superClasses>javax.faces.component.UIMessages</superClasses>
-            <superClasses>javax.faces.component.UIComponentBase</superClasses>
-            <superClasses>javax.faces.component.UIComponent</superClasses>
-            <superClasses>java.lang.Object</superClasses>
-            <interfaces>javax.faces.component.StateHolder</interfaces>
-            <componentType>javax.faces.HtmlMessages</componentType>
-            <componentFamily>javax.faces.Messages</componentFamily>
-            <renderType>javax.faces.Messages</renderType>
-          </typeInfo>
-        </versionedTagToViewMappings>
-      </md:value>
-    </trait>
-  </entity>
-  <entityGroup id="common-valueholder-attributes">
-      <entity id="value">
-        <trait id="attributeMapping">
-            <md:value xsi:type="viewMap:AttributeToPropertyMapping">
-                <propertyName>value</propertyName>
-                <elAllowed>true</elAllowed>
-            </md:value>
-        </trait>
-      </entity>
-      <entity id="converter">
-        <trait id="attributeMapping">
-            <md:value xsi:type="viewMap:AttributeToPropertyMapping">
-                <customConversionFactoryId>org.eclipse.jst.jsf.core.valueHolderAttributeMapper</customConversionFactoryId>
-                <elAllowed>true</elAllowed>
-            </md:value>
-        </trait>
-      </entity>
-  </entityGroup>
-</md:metadatamodel>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.properties
deleted file mode 100644
index 4ab821a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-
-# ====================================================================
-# To code developer:
-#   Do NOT change the properties between this line and the
-#   "%%% END OF TRANSLATED PROPERTIES %%%" line.
-#   Make a new property name, append to the end of the file and change
-#   the code to use the new property.
-# ====================================================================
-
-# ====================================================================
-# %%% END OF TRANSLATED PROPERTIES %%%
-# ====================================================================
-
-pluginName = JavaServer Faces Tools - Taglibrary Metadata
-pluginProvider = Eclipse.org
-
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.xml
deleted file mode 100644
index cebf482..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/plugin.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-   <extension
-         point="org.eclipse.jst.jsf.common.standardMetaDataFiles">
-      <standardMetaDataFile
-          location="$nl$/metadata/html.xml"
-          uri="HTML"/>            
-      <standardMetaDataFile
-          location="$nl$/metadata/jsp11.xml"
-          uri="JSP11"/>         
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_html.xml"
-            uri="http://java.sun.com/jsf/html"/>
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_html_pi.xml"
-            uri="http://java.sun.com/jsf/html"/>  
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_html_dti.xml"
-            uri="http://java.sun.com/jsf/html"/>
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_core.xml"
-            uri="http://java.sun.com/jsf/core"/>
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_core_pi.xml"
-            uri="http://java.sun.com/jsf/core"/>      
-      <standardMetaDataFile
-            location="$nl$/metadata/jsf_core_dti.xml"
-            uri="http://java.sun.com/jsf/core"/>
-      <standardMetaDataFile
-            location="$nl$/metadata/symbolInfoMetadata.xml"
-            uri="http://java.sun.com/jsf/core"/>
-      <standardMetaDataFile
-            location="$nl$/metadata/viewMappings_core.xml"
-            uri="http://java.sun.com/jsf/core">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/viewMappings_html.xml"
-            uri="http://java.sun.com/jsf/html">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/facelet_composite.xml"
-            uri="http://java.sun.com/jsf/composite">
-      </standardMetaDataFile>
-      <standardMetaDataFile
-            location="$nl$/metadata/facelet_ui.xml"
-            uri="http://java.sun.com/jsf/facelets">
-      </standardMetaDataFile>            
-   </extension>
-   <!--    <extension point="org.eclipse.emf.ecore.generated_package">
-        <package 
-            uri = "http://org.eclipse.jst.jsf.facelet.core/additionalTagMetadata.ecore" 
-            class = "org.eclipse.jst.jsf.facelet.core.internal.cm.addtagmd.AddTagMDPackage"
-            genModel = "model/additionalTagMetadata.genmodel" />  
-     </extension> -->
-   
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/src/org/eclipse/jst/jsf/standard/tagsupport/StandardTagSupportPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/src/org/eclipse/jst/jsf/standard/tagsupport/StandardTagSupportPlugin.java
deleted file mode 100644
index ed631da..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/src/org/eclipse/jst/jsf/standard/tagsupport/StandardTagSupportPlugin.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.standard.tagsupport;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class StandardTagSupportPlugin extends AbstractUIPlugin {
-
-	/**
-	 * the plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.standard.tagsupport"; //$NON-NLS-1$
-
-	// The shared instance
-	private static StandardTagSupportPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public StandardTagSupportPlugin() {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static StandardTagSupportPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.classpath b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.cvsignore b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.cvsignore
deleted file mode 100644
index f9eb27a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-@dot
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.project b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.project
deleted file mode 100644
index 2cf9838..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.pagedesigner.jsf.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 8fcb2c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:05:18 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 16e5442..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Mon Jun 30 15:58:09 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 753d576..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:59:54 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index eedcce2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,41 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner.jsf.ui;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Activator: org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.jst.jsf.facesconfig;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.pagedesigner;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.pagedesigner.jsp.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.views.properties.tabbed;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.ecore;bundle-version="[2.5.0,3.0.0)",
- org.eclipse.jface.text;bundle-version="[3.5.0,4.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-ManifestVersion: 2
-Export-Package: org.eclipse.jst.pagedesigner.jsf.core.dom;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.actions;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.sections;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsf.ui.util;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/about.html b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/about.html
deleted file mode 100644
index 90bd74d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/build.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/build.properties
deleted file mode 100644
index d277d8f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-			   plugin.xml,\
-               META-INF/,\
-               plugin.properties,\
-               about.html,\
-               icons/
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/column_select.gif b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/column_select.gif
deleted file mode 100644
index f9dc006..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/icons/column_select.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.properties
deleted file mode 100644
index 5f40d6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Plugin XML information.
-####################################################
-pluginName=JavaServer Faces Tools - Pagedesigner UI
-providerName=Eclipse.org
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.xml
deleted file mode 100644
index cb0ccd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/plugin.xml
+++ /dev/null
@@ -1,173 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-
-	<!-- page variables -->
-	<extension point="org.eclipse.jst.pagedesigner.jsp.core.pageVar">
-		<taglib uri="http://java.sun.com/jsf/html">
-
-			<tag varTypeStringIsAttr="true" varNameIsAttr="true"
-				varTypeMode="EXPRESSION_COLLECTION_ITEM" varTypeString="value"
-				varName="var" tagName="dataTable" />
-		</taglib>
-		<taglib uri="http://java.sun.com/jsf/core">
-			<tag varTypeStringIsAttr="true" varNameIsAttr="true"
-				varTypeMode="BUNDLE" varTypeString="basename" varName="var"
-				tagName="loadBundle" />
-		</taglib>
-	</extension>
-	<extension
-		point="org.eclipse.ui.views.properties.tabbed.propertySections">
-		<propertySections
-			contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor">
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreConvertDateTimeGroup"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.convertDateTime">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFCoreConvertNumberGroup"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.convertNumber">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlActionListenerSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.commandButton.listener">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlActionListenerSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.commandLink.listener">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlDataTableColumnsSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.dataTable.columns">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputHiddenTypeSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputHidden.type">
-			</propertySection>
-
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputSecretTypeSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputSecret.type">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputOthersSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputText.others">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputTextTypeSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputText.type">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputOthersSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputText.others">
-			</propertySection>
-			<propertySection
-				afterSection="section.general.inputTextarea"
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputTextareaTypeSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputTextarea.type">
-			</propertySection>
-			<propertySection
-				afterSection="section.general.inputTextarea.type"
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlInputOthersSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.inputTextarea.others">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlOutputFormatParamsSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.outputFormat.params">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlOutputTextConverterSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.outputText.converter">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectManyCheckbox.choices">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectManyListbox.choices">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectManyMenu.choices">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectOneListbox.choices">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectOneMenu.choices">
-			</propertySection>
-			<propertySection
-				class="org.eclipse.jst.pagedesigner.jsf.ui.sections.JSFHtmlSelectChoicesSection"
-				tab="org.eclipse.jst.pagedesigner.tabQuickEdit"
-				id="section.general.selectOneRadio.choices">
-			</propertySection>
-		</propertySections>
-	</extension>
-
-	<extension
-		point="org.eclipse.jst.pagedesigner.pageDesignerExtension">
-		<elementEditFactory
-			class="org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml.JSFHTMLElementEditFactory" />
-		<elementEditFactory
-			class="org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore.JSFCoreElementEditFactory" />
-		<linkCreator
-			class="org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFCommandLinkCreator"
-			linkIdentifier="JSF CommandLink" />
-		<linkCreator
-			class="org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFOutputLinkCreator"
-			linkIdentifier="JSF OutputLink" />
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.ColumnOperation"
-			id="ColumnOperation">
-		</tagTransformOperation>
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.DataTableOperation"
-			id="DataTableOperation">
-		</tagTransformOperation>
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.PanelGridOperation"
-			id="PanelGridOperation">
-		</tagTransformOperation>
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.SelectManyCheckboxOperation"
-			id="SelectManyCheckboxOperation">
-		</tagTransformOperation>
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.SelectOneRadioOperation"
-			id="SelectOneRadioOperation">
-		</tagTransformOperation>
-		<tagTransformOperation
-			class="org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.LoadBundleOperation"
-			id="LoadBundleOperation">
-		</tagTransformOperation>
-	</extension>
-
-	<extension
-		point="org.eclipse.jst.pagedesigner.popupMenuContributor">
-		<menuItemContributor
-			class="org.eclipse.jst.pagedesigner.jsf.ui.actions.PageFlowContributor"
-			URI="http://java.sun.com/jsf/core" />
-	</extension>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/core/dom/JSFDOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/core/dom/JSFDOMUtil.java
deleted file mode 100644
index 99fa2a9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/core/dom/JSFDOMUtil.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.core.dom;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFDOMUtil
-{
-
-    /**
-     * @param parentEle 
-     * @param name 
-     * @return the facet element or null if not found
-     */
-    public static Element findFacet(Element parentEle, String name)
-    {
-        NodeList childnodes = parentEle.getChildNodes();
-        for (int i=0, size=childnodes.getLength(); i<size; i++)
-        {
-            Node node = childnodes.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE && JSFDOMUtil.isFacet((Element)node))
-            {
-                Element ele = (Element) node;
-                if (name.equals(ele.getAttribute("name"))) //$NON-NLS-1$
-                {
-                    return ele;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * @param node
-     * @return true if node is a JSF column
-     */
-    public static boolean isHColumn(Node node)
-    {
-        if (node instanceof Element)
-        {
-            Element ele = (Element) node;
-            if ("column".equalsIgnoreCase(ele.getLocalName()) && ITLDConstants.URI_JSF_HTML.equals(CMUtil.getElementNamespaceURI(ele))) //$NON-NLS-1$
-            {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * @param panelGridEle
-     * @return the list of UI component children
-     */
-    public static List getUIComponentChildren(Element panelGridEle)
-    {
-        // XXX: temp implementation. Later may move this out to be shared.
-        // currently just returning all children Element. Need to filter out things like non JSF UI component
-        List list = new ArrayList();
-        NodeList childnodes = panelGridEle.getChildNodes();
-        for (int i=0, size=childnodes.getLength(); i<size; i++)
-        {
-            Node node = childnodes.item(i);
-            if (node.getNodeType() == Node.ELEMENT_NODE)
-            {
-                if (JSFDOMUtil.isFacet((Element) node))
-                {
-                    continue;
-                }
-                list.add(node);
-            }
-        }
-        return list;
-    }
-
-    /**
-     * @param ele
-     * @return true if ele is a facet
-     */
-    public static boolean isFacet(Element ele)
-    {
-        // XXX: here we are not checking namespace! for error tolerant.
-        return "facet".equals(ele.getLocalName()); //$NON-NLS-1$
-    }
-
-    /**
-     * @param ele 
-     * @return true if the local name of ele is "param"
-     */
-    public static boolean isUIParameter(Element ele)
-    {
-        return "param".equals(ele.getLocalName()); //$NON-NLS-1$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPlugin.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPlugin.java
deleted file mode 100644
index f67d22e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPlugin.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class JSFUIPlugin extends AbstractUIPlugin
-{
-    //The shared instance.
-    private static JSFUIPlugin _plugin;
-    //Resource bundle.
-    private ResourceBundle     _resourceBundle;
-    private URL                _pluginBase;
-
-    private static Logger      _logger;
-    private static Alerts      _alerts;
-
-    /**
-     * The constructor.
-     */
-    public JSFUIPlugin()
-    {
-        super();
-        _plugin = this;
-        try
-        {
-            _resourceBundle = ResourceBundle.getBundle("org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPluginResources"); //$NON-NLS-1$
-        }
-        catch (MissingResourceException x)
-        {
-            _resourceBundle = null;
-        }
-    }
-
-    /**
-     * This method is called upon plug-in activation
-     */
-    public void start(BundleContext context) throws Exception
-    {
-        super.start(context);
-        _alerts = new Alerts(this, _resourceBundle);
-        _logger = JSFUICommonPlugin.getLogger(JSFUIPlugin.class);
-//        _logger.setResourceBundle(_resourceBundle);
-        _pluginBase = getBundle().getEntry("/"); //$NON-NLS-1$
-    }
-
-    /**
-     * get the alerts objects associated with this plugin for alerting the user.
-     * @return the alerts
-     */
-    public static Alerts getAlerts()
-    {
-        return _alerts;
-    }
-
-    /**
-     * This method is called when the plug-in is stopped
-     */
-    public void stop(BundleContext context) throws Exception
-    {
-        super.stop(context);
-    }
-
-    /**
-     * Returns the shared instance.
-     * @return the default plugin
-     */
-    public static JSFUIPlugin getDefault()
-    {
-        return _plugin;
-    }
-
-    /**
-     * Returns the string from the plugin's resource bundle,
-     * or 'key' if not found.
-     * @param key 
-     * @return the resource string for key or 'key' if not found
-     */
-    public static String getResourceString(String key)
-    {
-        ResourceBundle bundle = JSFUIPlugin.getDefault().getResourceBundle();
-        try
-        {
-            return (bundle != null) ? bundle.getString(key) : key;
-        }
-        catch (MissingResourceException e)
-        {
-            return key;
-        }
-    }
-
-    /**
-     * Returns the plugin's resource bundle,
-     * @return the resource bundle
-     */
-    public ResourceBundle getResourceBundle()
-    {
-        return _resourceBundle;
-    }
-
-    /**
-     * Return an image from the path
-     * @param name
-     * @return Image
-     */
-    public Image getImage(String name)
-    {
-        if (name == null)
-        {
-            return null;
-        }
-
-        ImageRegistry images = getImageRegistry();
-        Image image = images.get(name);
-        if (image == null)
-        {
-            try
-            {
-                ImageDescriptor id = ImageDescriptor.createFromURL(new URL(_pluginBase,
-                        IFileFolderConstants.FOLDER_ICONS + "/" + name)); //$NON-NLS-1$
-                images.put(name, id);
-
-                image = images.get(name);
-            }
-            catch (MalformedURLException ee)
-            {
-                _logger.error("Error.JSFUIPlugin", name, ee); //$NON-NLS-1$
-            }
-        }
-        return image;
-    }
-
-    /**
-     * Log message and Throwable by severity.
-     * 
-     * @param severity Severity (use appropriate IStatus constant).
-     * @param message Message to be logged.
-     * @param exception Throwable instance to be logged.
-     */
-    public static void log(int severity, String message, Throwable exception) {
-    	ILog log = getDefault().getLog();
-    	IStatus status = new Status(
-    			severity,
-    			"org.eclipse.jst.pagedesigner.jsf.ui", //$NON-NLS-1$
-    			message,
-    			exception);
-    	log.log(status);
-    }
-
-    /**
-     * Log message by severity.
-     * 
-     * @param severity Severity (use an IStatus constant).
-     * @param message Message to be logged.
-     */
-    public static void log(int severity, String message) {
-    	ILog log = getDefault().getLog();
-    	IStatus status = new Status(
-    			severity,
-    			"org.eclipse.jst.pagedesigner.jsf.ui", //$NON-NLS-1$
-    			message);
-    	log.log(status);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPluginResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPluginResources.properties
deleted file mode 100644
index b628dc5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIPluginResources.properties
+++ /dev/null
@@ -1,50 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-#DataTable
-ElementEdit.Submenu.DataTable=DataTable
-ElementEdit.Submenu.DataTable.SelectTable=Select Table
-ElementEdit.Submenu.DataTable.InsertColumnBefore=Insert Column Before
-ElementEdit.Submenu.DataTable.InsertColumnAfter=Insert Column After
-ElementEdit.Submenu.DataTable.DeleteColumn=Delete Column
-ElementEdit.Submenu.InsertTableHeader=Insert Table Header
-ElementEdit.Submenu.InsertTableFooter=Insert Table Footer
-ElementEdit.Submenu.DeleteTableHeader=Delete Table Header
-ElementEdit.Submenu.DeleteTableFooter=Delete Table Footer
-ElementEdit.Submenu.InsertColumnHeader=Insert Column Header
-ElementEdit.Submenu.InsertColumnFooter=Insert Column Footer
-ElementEdit.Submenu.DeleteColumnHeader=Delete Column Header
-ElementEdit.Submenu.DeleteColumnFooter=Delete Column Footer
-
-#PanelGrid
-ElementEdit.Submenu.PanelGrid=PanelGrid
-ElementEdit.Submenu.PanelGrid.SelectTable=Select Table
-ElementEdit.Submenu.PanelGrid.InsertRowBefore=Insert Row Before
-ElementEdit.Submenu.PanelGrid.InsertRowAfter=Insert Row After
-ElementEdit.Submenu.PanelGrid.InsertColumnBefore=Insert Column Before
-ElementEdit.Submenu.PanelGrid.InsertColumnAfter=Insert Column After
-ElementEdit.Submenu.PanelGrid.DeleteRow=Delete Row
-ElementEdit.Submenu.PanelGrid.DeleteColumn=Delete Column
-ElementEdit.Submenu.PanelGrid.InsertHeader=Insert Header
-ElementEdit.Submenu.PanelGrid.InsertFooter=Insert Footer
-ElementEdit.Submenu.PanelGird.DeleteHeader=Delete Header
-ElementEdit.Submenu.PanelGrid.DeleteFooter=Delete Footer
-
-ElementEdit.Submenu.JavaNavigation=Java
-ElementEdit.Submenu.JavaNavigation.Binding=Binding
-ElementEdit.Submenu.JavaNavigation.Value=Value
-ElementEdit.Submenu.JavaNavigation.Action=Action
-ElementEdit.Submenu.LoadBundle=Open Properties File
-
-#Warning messages
-Message.Warning.Title=Warning
-Message.Warning.InvalidateExpression=The value is either an invalid Expression or the definition is missing.
-
-Error.JSFUIPlugin=Error in jsf.ui plugin
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIResources.properties
deleted file mode 100644
index 0a4ec8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/JSFUIResources.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-MessageTagConverter.defaultValue=Message
-MessageTagConverter.defaultTooltip=Summary
-
-TableBasedOperation.NoSelectItem.style=color:silver;font-family:Arial,Helvetica,Geneva,sans-serif;font-size:8pt;
-TableBasedOperation.NoSelectItem.text=Add child selectItem or selectItems tags
-TableBasedOperation.OnlySelectItems.text=Child selectItems tag(s) cannot be resolved at design-time
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.java
deleted file mode 100644
index 77ee60b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ActionsResources
-{
-    private static final String         BUNDLE_NAME     = "org.eclipse.jst.pagedesigner.jsf.ui.actions.ActionsResources"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-    private ActionsResources()
-    {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the res bundle string for key or !key! if not found
-     */
-    public static String getString(String key)
-    {
-        try
-        {
-            return RESOURCE_BUNDLE.getString(key);
-        }
-        catch (MissingResourceException e)
-        {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.properties
deleted file mode 100644
index 0f46733..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ActionsResources.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-AddValueChangeListenerAction.ActionLabel.ValueChangeListener=ValueChangeListener
-AddValidateDoubleRangeAction.ActionLabel.DoubleRange=Double Range
-AddValidateLengthAction.ActionLabel.Length=Length
-AddValidateLongRangeAction.ActionLabel.LongRange=Long Range
-AddConvertDateTimeAction.ActionLabel.DateTime=Date Time
-AddConvertNumberAction.ActionLabel.Number=Number
-AddAttributeAction.Wizard.NewAttribute=New Attribute
-AddAttributeAction.ActionLabel.Attribute=Attribute
-AddSelectItemAction.ActionLabel.SelectItem=Select Item
-AddSelectItemsAction.ActionLabel.SelectItems=Select Items
-AddAttributeAction.Wizard.Description=Enter a name and value for the attribute.
-AddParamAction.ActionLabel.Param=Param
-
-Submenu.JSFAdd=JSF Add
-Submenu.JSFAdd.Converter=Converter
-Submenu.JSFAdd.Validators=Validators
-
-PageFlowContributor.Menu.PageFlow=PageFlow
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddActionListenerAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddActionListenerAction.java
deleted file mode 100644
index 11148ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddActionListenerAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddActionListenerAction extends JSFAddChildAction
-{
-    /**
-     * @param parentEle 
-     * 
-     */
-    public AddActionListenerAction(IDOMElement parentEle)
-    {
-        super("ActionListener", parentEle); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_ACTIONLISTENER, new String[]{"type"}); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddAttributeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddAttributeAction.java
deleted file mode 100644
index 85fa345..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddAttributeAction.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddAttributeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddAttributeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddAttributeAction.ActionLabel.Attribute"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE, "attribute", new String[]{"name", "value"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-//        CommonDialogFieldGroup group = new CommonDialogFieldGroup();
-//
-//        AttributeData[] data = createAttributeData();
-//        group.setAttributeData(data);
-//
-//        DialogFieldGroupPage page = new DialogFieldGroupPage("Attribute", group); //$NON-NLS-1$
-//        page.setTitle(ActionsResources.getString("AddAttributeAction.Wizard.NewAttribute")); //$NON-NLS-1$
-//        page.setDescription(ActionsResources.getString("AddAttributeAction.Wizard.Description")); //$NON-NLS-1$
-//        CommonDialogFieldWizard wizard = new CommonDialogFieldWizard(page);
-//        wizard.setWindowTitle(ActionsResources.getString("AddAttributeAction.Wizard.NewAttribute")); //$NON-NLS-1$
-//        WizardDialog dialog = new WizardDialog(getShell(), wizard);
-//        dialog.create();
-//        if (dialog.open() == WizardDialog.OK)
-//        {
-//            group.prepareData();
-//            Map attributesMap = new HashMap();
-//            for (int i = 0; i < data.length; i++)
-//            {
-//                attributesMap.put(data[i].attributeName, data[i].value);
-//            }
-//            AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-//                IJSFConstants.TAG_ATTRIBUTE, attributesMap);
-//            command.execute();
-//        }
-    }
-
-//    private AttributeData[] createAttributeData()
-//    {
-//        return new AttributeData[] 
-//        {
-//            new AttributeData(IJMTConstants.URI_JSF_CORE, IJSFConstants.TAG_ATTRIBUTE, IJSFConstants.ATTR_NAME),
-//                new AttributeData(IJMTConstants.URI_JSF_CORE, IJSFConstants.TAG_ATTRIBUTE, IJSFConstants.ATTR_VALUE)
-//        }
-//        ;
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertDateTimeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertDateTimeAction.java
deleted file mode 100644
index 6172669..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertDateTimeAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddConvertDateTimeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddConvertDateTimeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddConvertDateTimeAction.ActionLabel.DateTime"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_CONVERTDATETIME, null);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertNumberAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertNumberAction.java
deleted file mode 100644
index af33b52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConvertNumberAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddConvertNumberAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddConvertNumberAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddConvertNumberAction.ActionLabel.Number"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_CONVERTNUMBER, null);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConverterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConverterAction.java
deleted file mode 100644
index fb6d378..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddConverterAction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddConverterAction extends JSFAddChildAction
-{
-    String	_converterId;
-
-    /**
-     * @param converterId 
-     * @param parentNode
-     */
-    public AddConverterAction(String converterId, IDOMElement parentNode)
-    {
-        super(converterId, parentNode);
-        this._converterId = converterId;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        Map attributes = new HashMap();
-        attributes.put("converterId", _converterId); //$NON-NLS-1$
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_CONVERTER, attributes);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddParamAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddParamAction.java
deleted file mode 100644
index 8cb1a74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddParamAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddParamAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddParamAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddParamAction.ActionLabel.Param"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_PARAM, new String[] { IJSFConstants.ATTR_NAME, IJSFConstants.ATTR_VALUE});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemAction.java
deleted file mode 100644
index c725801..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddSelectItemAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddSelectItemAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddSelectItemAction.ActionLabel.SelectItem"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_SELECTITEM, new String[] { IJSFConstants.ATTR_ITEMLABEL, IJSFConstants.ATTR_ITEMVALUE});
-    }
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemsAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemsAction.java
deleted file mode 100644
index 5598887..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddSelectItemsAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddSelectItemsAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddSelectItemsAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddSelectItemsAction.ActionLabel.SelectItems"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    { 
-//        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-//            IJSFConstants.TAG_SELECTITEMS, attributes);
-//        command.execute();
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_SELECTITEMS, new String[] { IJSFConstants.ATTR_ID, IJSFConstants.ATTR_BINDING, IJSFConstants.ATTR_VALUE});
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateDoubleRangeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateDoubleRangeAction.java
deleted file mode 100644
index c6c7855..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateDoubleRangeAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidateDoubleRangeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValidateDoubleRangeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValidateDoubleRangeAction.ActionLabel.DoubleRange"), parentNode);  //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALIDATEDOUBLERANGE, new String[] { IJSFConstants.ATTR_MINIMUM,
-                        IJSFConstants.ATTR_MAXIMUM});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLengthAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLengthAction.java
deleted file mode 100644
index b89cf1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLengthAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidateLengthAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValidateLengthAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValidateLengthAction.ActionLabel.Length"), parentNode);  //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALIDATELENGTH, new String[] { IJSFConstants.ATTR_MINIMUM,
-                        IJSFConstants.ATTR_MAXIMUM});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLongRangeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLongRangeAction.java
deleted file mode 100644
index a12ce56..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidateLongRangeAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidateLongRangeAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValidateLongRangeAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValidateLongRangeAction.ActionLabel.LongRange"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALIDATELONGRANGE, new String[] { IJSFConstants.ATTR_MINIMUM,
-                        IJSFConstants.ATTR_MAXIMUM});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidatorAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidatorAction.java
deleted file mode 100644
index 2e65fef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValidatorAction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.AddJSFCoreChildCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValidatorAction extends JSFAddChildAction
-{
-    String	_validatorId;
-
-    /**
-     * @param validatorId
-     * @param parentNode
-     */
-    public AddValidatorAction(String validatorId, IDOMElement parentNode)
-    {
-        super(validatorId, parentNode);
-        this._validatorId = validatorId;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        Map attributes = new HashMap();
-        attributes.put("validatorId", _validatorId); //$NON-NLS-1$
-        AddJSFCoreChildCommand command = new AddJSFCoreChildCommand(this.getParentElement(),
-            IJSFConstants.TAG_VALIDATOR, attributes);
-        command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValueChangeListenerAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValueChangeListenerAction.java
deleted file mode 100644
index cb76f44..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/AddValueChangeListenerAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.DialogUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddValueChangeListenerAction extends JSFAddChildAction
-{
-
-    /**
-     * @param parentNode
-     */
-    public AddValueChangeListenerAction(IDOMElement parentNode)
-    {
-        super(ActionsResources.getString("AddValueChangeListenerAction.ActionLabel.ValueChangeListener"), parentNode); //$NON-NLS-1$
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        DialogUtil.createSubElement(getShell(), getParentElement(), ITLDConstants.URI_JSF_CORE,
-                IJSFConstants.TAG_VALUECHANGELISTENER, new String[] { IJSFConstants.ATTR_TYPE});
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHColumnHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHColumnHeaderFooterAction.java
deleted file mode 100644
index 8d6fa01..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHColumnHeaderFooterAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHColumnHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHColumnHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public DeleteHColumnHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-        DeleteHColumnHeaderFooterRequest req = new DeleteHColumnHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHeaderFooterAction.java
deleted file mode 100644
index 7df470c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/DeleteHeaderFooterAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public DeleteHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-        DeleteHeaderFooterRequest req = new DeleteHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java
deleted file mode 100644
index 2f91a13..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExpressionAction extends Action
-{
-    /**
-     * enumerates a method-binding expression
-     */
-    public static final int METHOD   = 0;
-    /**
-     * enumerates a value-binding expression
-     */
-    public static final int VARIABLE = 1;
-
-    private String          _action;
-    private IProject        _project;
-    private IFile           _file;
-
-
-    /**
-     * @param attribute
-     */
-    public void setActionValue(String attribute)
-    {
-        _action = attribute;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#isEnabled()
-     */
-    public boolean isEnabled()
-    {
-        return _project != null && isExpression();
-    }
-
-    private boolean isExpression()
-    {
-        boolean flag = false;
-        if (_action != null)
-        {
-            flag = _action.startsWith("#{") && _action.endsWith("}");//$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
-        }
-        return flag;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run()
-    {
-        IPageVariablesProvider pageVarProvider = (IPageVariablesProvider) getPage().getActiveEditor().getAdapter(
-                IPageVariablesProvider.class);
-        pageVarProvider.refresh();
-
-        JSFUIPlugin.getAlerts().warning("Message.Warning.Title", "Message.Warning.InvalidateExpression");//$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
-    }
-
-    /**
-     * @param projectFor
-     */
-    public void setProject(IProject projectFor)
-    {
-        this._project = projectFor;
-    }
-
-    private IWorkbenchPage getPage()
-    {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        return window.getActivePage();
-    }
-
-    /**
-     * @param fileFor
-     */
-    public void setFile(IFile fileFor)
-    {
-        _file = fileFor;
-    }
-
-    /**
-     * @return the file
-     */
-    public IFile getFile()
-    {
-        return _file;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/IJSFCoreSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/IJSFCoreSupport.java
deleted file mode 100644
index 70285ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/IJSFCoreSupport.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-/**
- * This interface is to provide information of how to enable/disable add
- * jsf core sub element.
- * 
- * As other JSF taglibs that we don't know today may also use jsf core tags inside
- * them, so we may also enable the actions for adding jsf core tags to them. But
- * we need check whether individual JSF core tags are supported.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IJSFCoreSupport
-{
-    /**
-     * actionListener can only be added to those ActionSource component.
-     * @return if is an action source
-     */
-    public boolean isActionSource();
-
-    /**
-     * 
-     * @return true if is a UI component
-     */
-    public boolean isUIComponent();
-
-    /**
-     * converter (convertXXX) can only be added to those ValueHolder
-     * @return true if is a value holder
-     */
-    public boolean isValueHolder();
-
-    /**
-     * validator can only be added to EditableValueHolder
-     * @return true if is an editable value holder
-     */
-    public boolean isEditableValueHolder();
-
-    /**
-     * whether support selectItem and selectItems
-     * @return true if supports the UISelectItem(s) contract
-     */
-    public boolean supportSelectItems();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHColumnHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHColumnHeaderFooterAction.java
deleted file mode 100644
index e177212..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHColumnHeaderFooterAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHColumnHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHColumnHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public InsertHColumnHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-
-        InsertHColumnHeaderFooterRequest req = new InsertHColumnHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHeaderFooterAction.java
deleted file mode 100644
index f2ac6b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/InsertHeaderFooterAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHeaderFooterRequest;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterAction extends Action
-{
-    private Command _command;
-
-    /**
-     * @param text
-     * @param editPart 
-     * @param isHeader 
-     */
-    public InsertHeaderFooterAction(String text, EditPart editPart, boolean isHeader)
-    {
-        super(text);
-
-        InsertHeaderFooterRequest req = new InsertHeaderFooterRequest(text, isHeader);
-        this._command = editPart.getCommand(req);
-        this.setEnabled(this._command != null && this._command.canExecute());
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.Action#run()
-     */
-    public void run()
-    {
-        _command.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.java
deleted file mode 100644
index 8deaeaf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.IJSFAppConfigManager;
-import org.eclipse.jst.jsf.core.jsfappconfig.internal.JSFAppConfigManagerFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ConverterType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorIdType;
-import org.eclipse.jst.jsf.facesconfig.emf.ValidatorType;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFAddActionGroup {
-
-	private final static Action EMPTY_ACTION = new Action() {
-        // TODO: why?
-	};
-
-
-	/**
-	 * @param menu
-	 * @param element
-	 * @param support
-	 */
-	public void fillContextMenu(IMenuManager menu, final IDOMElement element,
-			final IJSFCoreSupport support) {
-        IContributionItem item = menu.find(PageDesignerActionConstants.INSERT_SUBMENU_ID);
-        
-        if (item instanceof IMenuManager)
-        {
-    		final IMenuManager submenu = (IMenuManager) item;
-    		submenu.add(EMPTY_ACTION);
-    		submenu.addMenuListener(new IMenuListener() {
-    			public void menuAboutToShow(IMenuManager manager) {
-    				submenu.removeAll();
-    				addJSFAddItems(submenu, element, support);
-    			}
-    		});
-        }
-		//menu.appendToGroup(PageDesignerActionConstants.GROUP_SPECIAL, submenu);
-	}
-
-	/**
-	 * @param submenu
-	 * @param element
-	 */
-	private void addJSFAddItems(IMenuManager submenu, IDOMElement element,
-			IJSFCoreSupport support) {
-		AddActionListenerAction actionListenerAction = new AddActionListenerAction(
-				element);
-		actionListenerAction.setEnabled(support.isActionSource());
-		submenu.add(actionListenerAction);
-
-		AddAttributeAction attrAction = new AddAttributeAction(element);
-		attrAction.setEnabled(support.isUIComponent());
-		submenu.add(attrAction);
-
-		IProject prj = null;
-		IFile file = StructuredModelUtil.getFileFor(element.getModel());
-		if (file != null) {
-			prj = file.getProject();
-		}
-
-		IMenuManager converterMenu = new MenuManager(ActionsResources
-				.getString("Submenu.JSFAdd.Converter"));//$NON-NLS-1$
-		boolean supportConverter = support.isValueHolder();
-		String[] converterIds = getRegisteredConverterIds(prj);
-		if (converterIds != null && converterIds.length > 0) {
-			for (int i = 0; i < converterIds.length; i++) {
-				AddConverterAction action = new AddConverterAction(
-						converterIds[i], element);
-				action.setEnabled(supportConverter);
-				converterMenu.add(action);
-			}
-			converterMenu.add(new Separator());
-		}
-		AddConvertDateTimeAction dateTimeAction = new AddConvertDateTimeAction(
-				element);
-		dateTimeAction.setEnabled(supportConverter);
-		converterMenu.add(dateTimeAction);
-		AddConvertNumberAction numberAction = new AddConvertNumberAction(
-				element);
-		numberAction.setEnabled(supportConverter);
-		converterMenu.add(numberAction);
-		submenu.add(converterMenu);
-
-		AddParamAction addParamAction = new AddParamAction(element);
-		addParamAction.setEnabled(support.isUIComponent());
-		submenu.add(addParamAction);
-
-		AddSelectItemAction selectItemAction = new AddSelectItemAction(element);
-		selectItemAction.setEnabled(support.supportSelectItems());
-		submenu.add(selectItemAction);
-
-		AddSelectItemsAction selectItemsAction = new AddSelectItemsAction(
-				element);
-		selectItemsAction.setEnabled(support.supportSelectItems());
-		submenu.add(selectItemsAction);
-
-		IMenuManager validatorMenu = new MenuManager(ActionsResources
-				.getString("Submenu.JSFAdd.Validators"));//$NON-NLS-1$
-		boolean supportValidator = support.isEditableValueHolder();
-		String[] validatorIds = getRegisteredValidatorIds(prj);
-		if (validatorIds != null && validatorIds.length > 0) {
-			for (int i = 0; i < validatorIds.length; i++) {
-				AddValidatorAction action = new AddValidatorAction(
-						validatorIds[i], element);
-				action.setEnabled(supportValidator);
-				validatorMenu.add(action);
-			}
-			validatorMenu.add(new Separator());
-		}
-		AddValidateDoubleRangeAction doubleRangeAction = new AddValidateDoubleRangeAction(
-				element);
-		doubleRangeAction.setEnabled(supportValidator);
-		validatorMenu.add(doubleRangeAction);
-		AddValidateLengthAction lengthAction = new AddValidateLengthAction(
-				element);
-		lengthAction.setEnabled(supportValidator);
-		validatorMenu.add(lengthAction);
-		AddValidateLongRangeAction longRangeAction = new AddValidateLongRangeAction(
-				element);
-		longRangeAction.setEnabled(supportValidator);
-		validatorMenu.add(longRangeAction);
-		submenu.add(validatorMenu);
-
-		AddValueChangeListenerAction valueChangeAction = new AddValueChangeListenerAction(
-				element);
-		valueChangeAction.setEnabled(support.isEditableValueHolder());
-		submenu.add(valueChangeAction);
-	}
-
-	/**
-	 * @return
-	 */
-	private String[] getRegisteredValidatorIds(IProject project) 
-    {
-        String[] result = null;
-        
-        IJSFAppConfigManager appConfigMgr = 
-            JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(project);
-
-        // getInstance may return null if there is a problem
-        if (appConfigMgr != null)
-        {
-            final List<ValidatorType> list = appConfigMgr.getValidators();
-            result = new String[list.size()];
-            int i = 0;
-            for (final ValidatorType validator : list) 
-            {
-            	ValidatorIdType validatorId = validator.getValidatorId();
-                if (validatorId != null)
-                {
-                    result[i++] = validatorId.getTextContent() != null ?
-                            validatorId.getTextContent().trim() : ""; //$NON-NLS-1$
-                }
-            }
-        }
-        return result;
-	}
-
-	/**
-	 * @return
-	 */
-	private String[] getRegisteredConverterIds(IProject project) 
-    {
-        String[] result = null;
-        
-        IJSFAppConfigManager appConfigMgr = 
-            JSFAppConfigManagerFactory.getJSFAppConfigManagerInstance(project);
-
-        // getInstance may return null if there is a problem
-        if (appConfigMgr != null)
-        {
-            final List<ConverterType> list = appConfigMgr.getConverters();
-            //prune out converters for classes, they're not valid here
-            final List<String> converterIdList = new ArrayList();
-            for (final ConverterType converter : list)
-            {
-                ConverterIdType converterId = converter.getConverterId();
-                if (converterId != null)
-                {
-                    converterIdList.add(converterId.getTextContent() != null ? 
-                            converterId.getTextContent().trim() : ""); //$NON-NLS-1$
-                }
-            }
-            result = new String[converterIdList.size()];
-            result = converterIdList.toArray(result);
-        }
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddChildAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddChildAction.java
deleted file mode 100644
index 058f67e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddChildAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * Classes in this package are related to JSF operation. 
- * 
- * @author mengbo
- * @version 1.5
- */
-public class JSFAddChildAction extends Action
-{
-    private IDOMElement _parentEle;
-
-    /**
-     * @param text 
-     * @param parentNode 
-     */
-    public JSFAddChildAction(String text, IDOMElement parentNode)
-    {
-        super(text);
-        this._parentEle = parentNode;
-    }
-
-    /**
-     * @return the parent element
-     */
-    public IDOMElement getParentElement()
-    {
-        return _parentEle;
-    }
-
-    /**
-     * @return the active shell
-     */
-    public Shell getShell()
-    {
-        IWorkbench bench = PlatformUI.getWorkbench();
-        if (bench != null)
-        {
-            IWorkbenchWindow window = bench.getActiveWorkbenchWindow();
-            if (window == null)
-            {
-                IWorkbenchWindow[] windows = bench.getWorkbenchWindows();
-                if (windows != null && windows.length > 0)
-                {
-                    window = windows[0];
-                }
-            }
-            if (window != null)
-            {
-                return window.getShell();
-            }
-        }
-
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFCommandLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFCommandLinkCreator.java
deleted file mode 100644
index 36dd0e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFCommandLinkCreator.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.actions.link.AbstractLinkCreator;
-import org.eclipse.jst.pagedesigner.actions.link.LinkUtil;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFCommandLinkCreator extends AbstractLinkCreator
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#makeLinkElement(org.eclipse.gef.EditPart, org.eclipse.jst.pagedesigner.viewer.DesignRange)
-     */
-    public Element makeLinkElement(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            Text middleNode = LinkUtil.splitDomText(part, range);
-            EditPart parent = part.getParent();
-            Node parentNode = (Node) parent.getModel();
-            Document doc = (parentNode instanceof Document) ? (Document) parentNode : (parentNode.getOwnerDocument());
-
-            IDOMModel model = ((IDOMNode) parentNode).getModel();
-            String prefix = JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-            JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-
-            Element commandLink = doc.createElement(IJSFConstants.TAG_COMMANDLINK);
-            commandLink.setPrefix(prefix);
-            Element outputText = doc.createElement(IJSFConstants.TAG_OUTPUTTEXT);
-            outputText.setPrefix(prefix);
-            outputText.setAttribute(IJSFConstants.ATTR_VALUE, middleNode.getNodeValue());
-            commandLink.appendChild(outputText);
-
-            parentNode.replaceChild(commandLink, middleNode);
-            return commandLink;
-        }
-
-        return null;
-
-    }
-
-
-    /**
-     * @param range
-     * @return true if can execute
-     */
-    public boolean canExecute(DesignRange range)
-    {
-        DesignPosition startPosition = range.getStartPosition();
-        EditPart part = startPosition.getContainerPart();
-        IDOMNode node = (IDOMNode) part.getModel();
-        IDOMModel model = node.getModel();
-        return model.getDocument().getElementsByTagNameNS(ITLDConstants.URI_JSF_HTML, "view") != null; //$NON-NLS-1$
-
-    }
-
-    public String getSourcePreview(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            TextEditPart textPart = (TextEditPart) part;
-            int[] offsets = textPart.getSelectedRange();
-
-            String displayData = textPart.getTextData();
-            String linkExp = displayData.substring(offsets[0], offsets[1]);
-
-            StringBuffer sb = new StringBuffer();
-            sb.append("<h:commandLink>\n<h:outputText value=\""); //$NON-NLS-1$
-            sb.append(linkExp);
-            sb.append("\">"); //$NON-NLS-1$
-            sb.append("</h:outputText>\n</h:commandLink>"); //$NON-NLS-1$
-            return sb.toString();
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java
deleted file mode 100644
index 4d593e3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFNavigationGroup
-{
-    private final static Action EMPTY_ACTION = new Action()
-    {
-        // TODO: why?
-    };
-
-
-    /**
-     * @param menu
-     * @param element
-     * @param support
-     */
-    public void fillContextMenu(IMenuManager menu, final IDOMElement element, final IJSFCoreSupport support)
-    {
-        final IContributionItem item = 
-            menu.find(PageDesignerActionConstants.NAVIGATE_SUBMENU_ID);
-        
-        if (item instanceof IMenuManager)
-        {
-            final IMenuManager submenu = (IMenuManager) item; 
-            final IMenuManager javaMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation"));//$NON-NLS-1$
-            javaMenu.add(EMPTY_ACTION);
-            javaMenu.addMenuListener(new IMenuListener()
-            {
-                public void menuAboutToShow(IMenuManager manager)
-                {
-                    javaMenu.removeAll();
-                    addNavigationItems(javaMenu, element, support);
-                }
-            }
-            );
-            
-            submenu.appendToGroup(PageDesignerActionConstants.GROUP_NAVIGATE, javaMenu);
-        }
-    }
-
-    private void addNavigationItems(IMenuManager submenu, IDOMElement ele, IJSFCoreSupport support)
-    {
-        if (support.isActionSource())
-        {
-            ExpressionAction action = new ExpressionAction();
-            action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Action"));//$NON-NLS-1$
-            if (ele != null)
-            {
-                action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_ACTION));
-                IDOMModel model = ele.getModel();
-                action.setProject(StructuredModelUtil.getProjectFor(model));
-                action.setFile(StructuredModelUtil.getFileFor(model));
-            }
-            submenu.add(action);
-        }
-        if (support.isValueHolder())
-        {
-            ExpressionAction action = new ExpressionAction();
-            action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Value"));//$NON-NLS-1$
-            if (ele != null)
-            {
-                action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_VALUE));
-                IDOMModel model = ele.getModel();
-                action.setProject(StructuredModelUtil.getProjectFor(model));
-                action.setFile(StructuredModelUtil.getFileFor(model));
-            }
-            submenu.add(action);
-        }
-
-        {
-            ExpressionAction action = new ExpressionAction();
-            action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Binding"));//$NON-NLS-1$
-            if (ele != null)
-            {
-                action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_BINDING));
-                IDOMModel model = ele.getModel();
-                action.setProject(StructuredModelUtil.getProjectFor(model));
-                action.setFile(StructuredModelUtil.getFileFor(model));
-            }
-            submenu.add(action);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFOutputLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFOutputLinkCreator.java
deleted file mode 100644
index 4edf62c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFOutputLinkCreator.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.actions.link.AbstractLinkCreator;
-import org.eclipse.jst.pagedesigner.actions.link.LinkUtil;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFOutputLinkCreator extends AbstractLinkCreator
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#makeLinkElement(org.eclipse.gef.EditPart, org.eclipse.jst.pagedesigner.viewer.DesignRange)
-     */
-    public Element makeLinkElement(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            Text middleNode = LinkUtil.splitDomText(part, range);
-            EditPart parent = part.getParent();
-            Node parentNode = (Node) parent.getModel();
-            Document doc = (parentNode instanceof Document) ? (Document) parentNode : (parentNode.getOwnerDocument());
-
-            IDOMModel model = ((IDOMNode) parentNode).getModel();
-            String prefix = JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-            String fPrefix = JSPUtil.getOrCreatePrefix(model, ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-
-            Element outputLink = doc.createElement(IJSFConstants.TAG_OUTPUTLINK);
-            outputLink.setPrefix(prefix);
-            Element verbatim = doc.createElement(IJSFConstants.TAG_VERBATIM);
-            verbatim.setPrefix(fPrefix);
-            Text value = doc.createTextNode(middleNode.getNodeValue());
-            verbatim.appendChild(value);
-            outputLink.appendChild(verbatim);
-
-            parentNode.replaceChild(outputLink, middleNode);
-            return outputLink;
-        }
-
-        return null;
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.link.AbstractLinkCreator#canExecute(org.eclipse.jst.pagedesigner.viewer.DesignRange)
-     */
-    public boolean canExecute(DesignRange range)
-    {
-        DesignPosition startPosition = range.getStartPosition();
-        EditPart part = startPosition.getContainerPart();
-        IDOMNode node = (IDOMNode) part.getModel();
-        IDOMModel model = node.getModel();
-        return model.getDocument().getElementsByTagNameNS(ITLDConstants.URI_JSF_HTML, "view") != null; //$NON-NLS-1$
-    
-    }
-
-    public String getSourcePreview(EditPart part, DesignRange range)
-    {
-        if (part instanceof TextEditPart)
-        {
-            TextEditPart textPart = (TextEditPart) part;
-            int[] offsets = textPart.getSelectedRange();
-            String displayData = textPart.getTextData();
-            String linkExp = displayData.substring(offsets[0], offsets[1]);
-
-            StringBuffer sb = new StringBuffer();
-            sb.append("<h:outputLink>\n<f:verbatim>"); //$NON-NLS-1$
-            sb.append(linkExp);
-            sb.append("</f:verbatim>\n</h:outputLink>"); //$NON-NLS-1$
-            return sb.toString();
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java
deleted file mode 100644
index 293965d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageFlowContributor implements IContextMenuItemContributor
-{
-    private String _uri;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor#setURI(java.lang.String)
-     */
-    public void setURI(String uri)
-    {
-        this._uri = uri;
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor#getURI()
-     */
-    public String getURI()
-    {
-        return _uri;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor#setModel(org.eclipse.wst.sse.core.internal.provisional.IStructuredModel)
-     */
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-     */
-    public void fillContextMenu(IMenuManager manager, ISelection selection, IStructuredModel model, Control parentUI)
-    {
-        PageFlowAction action = new PageFlowAction();
-        action.setId(PageFlowAction.ID);
-        action.setModel(model);
-        IMenuManager viewMgr = manager.findMenuUsingPath(PageDesignerActionConstants.SHOWVIEW_SUBMENU_ID);
-        if (viewMgr != null)
-        {
-            viewMgr.add(action);
-        }
-        else
-        {
-            manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, action);
-        }
-    }
-
-    private static class PageFlowAction extends Action
-    {
-        /**
-         * this action's id
-         */
-        public final static String ID = "org.eclipse.jst.pagedesigner.jsf.ui.actions.PageFlowAction"; //$NON-NLS-1$
-        private IStructuredModel   model;
-
-        /**
-         * construct the action
-         */
-        public PageFlowAction()
-        {
-            setText(ActionsResources.getString("PageFlowContributor.Menu.PageFlow"));//$NON-NLS-1$
-        }
-
-        /**
-         * @param model
-         */
-        public void setModel(IStructuredModel model)
-        {
-            this.model = model;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.action.IAction#run()
-         */
-        public void run()
-        {
-            IFile file = StructuredModelUtil.getFileFor(model);
-            if (file != null)
-            {
-                try
-                {
-                   // FacesConfigUtil.locateJSPFile(file);
-                }
-                catch (IllegalArgumentException e)
-                {
-                    JSFUIPlugin.getAlerts().warning("Message.Warning.Title", e.getLocalizedMessage());//$NON-NLS-1$
-                }
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/AttributeData.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/AttributeData.java
deleted file mode 100644
index 798da67..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/AttributeData.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;
-
-import java.util.HashMap;
-
-/**
- * Information and value about a tag attribute
- * @author mengbo
- * @version 1.5
- */
-class AttributeData
-{
-    /**
-     * possible key in the param map
-     */
-    static final String SuperType = "superTyle"; //$NON-NLS-1$
-    /**
-     * possible key in the param map
-     */
-    static final String Project = "project"; //$NON-NLS-1$
-
-    private final String uri;
-    private final String elementName;
-    private final String attributeName;
-    private Object value;
-    private HashMap paramMap; // null; lazy initialized
-
-    /**
-     * @param uri
-     * @param elementName
-     * @param name
-     */
-    public AttributeData(String uri,String elementName,String name)
-    {
-        this.uri = uri;
-        this.attributeName = name;
-        this.elementName = elementName;
-    }
-
-    /**
-     * @return the uri
-     */
-    public String getUri() {
-        return uri;
-    }
-
-    /**
-     * @return the element name
-     */
-    public String getElementName() {
-        return elementName;
-    }
-
-    /**
-     * @return the attribute name
-     */
-    public String getAttributeName() {
-        return attributeName;
-    }
-
-    /**
-     * @return the value
-     */
-    public Object getValue() {
-        return value;
-    }
-
-    /**
-     * @param value
-     */
-    public void setValue(Object value) {
-        this.value = value;
-    }
-
-    /**
-     * @return the param map
-     */
-    public HashMap getParamMap() 
-    {
-        if (paramMap == null)
-        {
-            paramMap = new HashMap();
-        }
-        return paramMap;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldGroup.java
deleted file mode 100644
index 7959d70..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldGroup.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;
-
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-
-/**
- * @author mengbo
- * @version 1.5
- * @TODO - unused now?
- */
-public class CommonDialogFieldGroup extends DialogFieldGroup
-{
-    private HashMap         map           = new HashMap();
-    private AttributeData[] attributeData = null;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#initialize()
-     */
-    public void initialize()
-    {
-        if (attributeData != null)
-        {
-            for (int i = 0; i < attributeData.length; i++)
-            {
-                DialogField filed = DialogFieldFactory.getDialogField(attributeData[i]);
-                filed.setDialogFieldChangeListener(getDefaultChangeListener());
-                map.put(attributeData[i], filed);
-            }
-        }
-    }
-
-    /**
-     * prepare the dialog field data
-     */
-    public void prepareData()
-    {
-        if (attributeData != null)
-        {
-            for (int i = 0; i < attributeData.length; i++)
-            {
-                DialogField field = (DialogField) map.get(attributeData[i]);
-                DialogFieldFactory.prepareDialogFieldValue(field, attributeData[i]);
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#refreshData()
-     */
-    public void refreshData()
-    {
-        if (attributeData != null)
-        {
-            for (int i = 0; i < attributeData.length; i++)
-            {
-                DialogField field = (DialogField) map.get(attributeData[i]);
-                DialogFieldFactory.setDialogFieldValue(field, attributeData[i].getValue());
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#layoutDialogFields(org.eclipse.ui.forms.widgets.FormToolkit, org.eclipse.swt.widgets.Composite)
-     */
-    public void layoutDialogFields(FormToolkit toolkit, Composite parent)
-    {
-        GridData data = new GridData(GridData.FILL_BOTH);
-        parent.setLayoutData(data);
-
-        GridLayout gl = new GridLayout();
-        gl.numColumns = getMaxColumnNum();
-        parent.setLayout(gl);
-
-        if (attributeData != null)
-        {
-            for (int i = 0; i < attributeData.length; i++)
-            {
-                DialogField field = (DialogField) map.get(attributeData[i]);
-                Control[] controls = field.doFillIntoGrid(toolkit, parent, gl.numColumns);
-                if (controls.length > 1)
-                {
-                    GridData gridData = (GridData) controls[1].getLayoutData();
-                    if(field.getNumberOfControls() == gl.numColumns)
-                    {
-                        gridData.grabExcessHorizontalSpace = true;
-                    }
-                    gridData.horizontalAlignment = GridData.FILL;
-                }
-                field.setLabelText(DialogFieldFactory.getDialogFieldLabel(attributeData[i]));
-            }
-        }
-    }
-
-    private int getMaxColumnNum()
-    {
-        int cols = 0;
-        if (attributeData != null)
-        {
-            for (int i = 0; i < attributeData.length; i++)
-            {
-                DialogField field = (DialogField) map.get(attributeData[i]);
-                int fieldCols = field.getNumberOfControls();
-                if (fieldCols > cols)
-                {
-                    cols = fieldCols;
-                }
-            }
-        }
-        return cols;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#validateDialogFields()
-     */
-    public IStatus[] validateDialogFields()
-    {
-        // TODO Now we let it be.
-        return null;
-    }
-
-    /**
-     * @return Returns the attributePairs.
-     */
-    public AttributeData[] getAttributeData()
-    {
-        return attributeData;
-    }
-
-    /**
-     * @param attributePairs The attributePairs to set.
-     */
-    public void setAttributeData(AttributeData[] attributePairs)
-    {
-        this.attributeData = attributePairs;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldWizard.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldWizard.java
deleted file mode 100644
index 03dcb90..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/CommonDialogFieldWizard.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroupPage;
-import org.eclipse.ui.internal.dialogs.NewWizard;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommonDialogFieldWizard extends NewWizard
-{
-    DialogFieldGroupPage mainPage;
-    /**
-     * Constructg a new wizard using page as the wizard mage
-     * 
-     * @param page
-     */
-    public CommonDialogFieldWizard(DialogFieldGroupPage page)
-    {
-        this.mainPage = page;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.wizard.IWizard#performFinish()
-     */
-    public boolean performFinish()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.wizard.IWizard#addPages()
-     */
-    public void addPages()
-    {
-        addPage(mainPage);        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/DialogFieldFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/DialogFieldFactory.java
deleted file mode 100644
index 3a98d39..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/attributegroup/DialogFieldFactory.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.attributegroup;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeRuntimeValueType;
-
-/**
- * @author mengbo
- * @version 1.5
- * @TODO - unused now
- */
-public class DialogFieldFactory
-{
-    /**
-     * @param data
-     * @return the dialog field for data
-     */
-    public static DialogField getDialogField(AttributeData data)
-    {
-    	Object project = data.getParamMap().get(AttributeData.Project);
-    	Entity attrEntity = null;
-    	if (project instanceof IProject){
-    		attrEntity = TaglibDomainMetaDataQueryHelper.getEntity(TaglibDomainMetaDataQueryHelper.createMetaDataModelContext((IProject)project, data.getUri()), data.getElementName()+"/"+data.getAttributeName()); //$NON-NLS-1$
-    	}
-
-        if(attrEntity != null)
-        {
-        	Trait t = TaglibDomainMetaDataQueryHelper.getTrait(attrEntity, MetaDataEnabledProcessingFactory.ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME);
-            String type = TraitValueHelper.getValueAsString(t);
-            if (IAttributeRuntimeValueType.JAVACLASS.equals(type)) 
-            {
-                ClassButtonDialogField field = new ClassButtonDialogField(null);
-//                Object project = data.getParamMap().get(AttributeData.Project);
-                if (project instanceof IProject)
-                {
-                    field.setProject((IProject) project);
-                }
-                Object superType = data.getParamMap().get(AttributeData.SuperType);
-                field.setSuperClassName((String) superType);
-                return field;
-            }
-        }
-        return new StringDialogField();
-    }   
-    
-    /**
-     * Sets the initial value of dialog field
-     * @param field
-     * @param value
-     */
-    public static void setDialogFieldValue(DialogField field, Object value){
-        if (field instanceof StringDialogField)
-        {
-            ((StringDialogField) field).setTextWithoutUpdate(value == null ? "" : value.toString());//$NON-NLS-1$
-        }
-        else if (field instanceof ComboDialogField)
-        {
-            ((ComboDialogField) field).setTextWithoutUpdate(value == null ? "" : value.toString());//$NON-NLS-1$
-        }
-        else if (field instanceof RadiosDialogField)
-        {
-            if (value instanceof Integer)
-            {
-                ((RadiosDialogField) field).setSelectedIndex(((Integer) value).intValue());
-            }
-        }
-    }
-    
-    /**
-     * @param field
-     * @param value
-     * @deprecated - use setDialogField method
-     */
-    public static void setDialogFiledValue(DialogField field, Object value)
-    {
-    	setDialogFieldValue(field, value);
-    }
-
-    /**
-     * Sets value of field into AttributeData if it was a StringDialogField
-     * @param field
-     * @param pair
-     */
-    public static void prepareDialogFieldValue(DialogField field, AttributeData pair)
-    {
-        if (field instanceof StringDialogField)
-        {
-            pair.setValue(((StringDialogField) field).getText());
-        }
-    }
-
-    /**
-     * @param field
-     * @param pair
-     * @deprecated - use prepareDialogFieldValue
-     */
-    public static void prepareDialogFiledValue(DialogField field, AttributeData pair)
-    {
-    	prepareDialogFieldValue(field, pair);
-    }
-    /**
-     * @param data
-     * @return the dialog field label for data
-     */
-    public static String getDialogFieldLabel(AttributeData data)
-    {
-        String name = data.getAttributeName();
-        int gap = 'a' - 'A';
-        if(name != null)
-        {
-            char[] chars = name.toCharArray();
-            char[] newChars = new char[chars.length*2];
-            if(chars.length > 0)
-            {
-                newChars[0] = chars[0] >= 'a' ? (char)(chars[0] - gap) : chars[0];
-            }
-            int newPos = 1;
-            for(int i=1; i<chars.length; i++,newPos++)
-            {
-                if(chars[i] >= 'A' && chars[i] <= 'Z')
-                {
-                    newChars[newPos++] = ' ';
-                }
-                newChars[newPos] = chars[i];
-            }
-            char[] labelChars = new char[newPos + 1];
-            System.arraycopy(newChars,0,labelChars,0,newPos);
-            labelChars[newPos] = ':';
-            return new String(labelChars);
-        }
-        return "";//$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/AddJSFCoreChildCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/AddJSFCoreChildCommand.java
deleted file mode 100644
index 70eec64..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/AddJSFCoreChildCommand.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddJSFCoreChildCommand extends DesignerCommand
-{
-    // either use single name/value pair
-    private String     _attrName;
-    private String     _attrValue;
-    // or use a map.
-    private Map        _attrMap;
-
-    private String     _coreChildLocalName;
-    private IDOMElement _parent;
-
-    /**
-     * @param parent 
-     * @param coreChildLocalName 
-     * @param attributes 
-     */
-    public AddJSFCoreChildCommand(IDOMElement parent, String coreChildLocalName, Map attributes)
-    {
-        super("", parent); //$NON-NLS-1$
-        StringBuffer buffer = new StringBuffer(CommandResources.getString("AddJSFCoreChildCommand.Label.Add")); //$NON-NLS-1$
-        if(coreChildLocalName != null && coreChildLocalName.length() > 0)
-        {
-            buffer.append(coreChildLocalName.substring(0,1).toUpperCase());
-            buffer.append(coreChildLocalName.substring(1));
-        }
-        setLabel(buffer.toString());
-        this._parent = parent;
-        this._coreChildLocalName = coreChildLocalName;
-        this._attrMap = attributes;
-    }
-
-    /**
-     * @param parent 
-     * @param coreChildLocalName 
-     * @param aname 
-     * @param avalue 
-     */
-    public AddJSFCoreChildCommand(IDOMElement parent, String coreChildLocalName, String aname, String avalue)
-    {
-        super("", parent); //$NON-NLS-1$
-        StringBuffer buffer = new StringBuffer(CommandResources.getString("AddJSFCoreChildCommand.Label.Add")); //$NON-NLS-1$
-        if(coreChildLocalName != null && coreChildLocalName.length() > 0)
-        {
-            buffer.append(coreChildLocalName.substring(0,1).toUpperCase());
-            buffer.append(coreChildLocalName.substring(1));
-        }
-        setLabel(buffer.toString());
-        this._parent = parent;
-        this._coreChildLocalName = coreChildLocalName;
-        this._attrName = aname;
-        this._attrValue = avalue;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(this.getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        String tag = _coreChildLocalName;
-        Element child = _parent.getOwnerDocument().createElement(tag);
-        child.setPrefix(prefix);
-        if (_attrMap != null)
-        {
-            for (Iterator iter = _attrMap.keySet().iterator(); iter.hasNext();)
-            {
-                String key = (String) iter.next();
-                String value = (String) _attrMap.get(key);
-
-                child.setAttribute(key, value);
-            }
-        }
-        if (_attrName != null)
-        {
-            child.setAttribute(_attrName, _attrValue);
-        }
-
-        _parent.appendChild(child);
-        formatNode(child);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_parent);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.java
deleted file mode 100644
index 11e8976..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class CommandResources
-{
-    private static final String         BUNDLE_NAME     = "org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.CommandResources"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-    private CommandResources()
-    {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the resource for key or !key! if not found
-     */
-    public static String getString(String key)
-    {
-        try
-        {
-            return RESOURCE_BUNDLE.getString(key);
-        }
-        catch (MissingResourceException e)
-        {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.properties
deleted file mode 100644
index fc1ff34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/CommandResources.properties
+++ /dev/null
@@ -1,27 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-AddJSFCoreChildCommand.Label.Add=Add
-DataTableDeleteColumnCommand.Label.DeleteColumn=Delete Column
-DataTableDeleteHeaderCommand.Label.DeleteHeader=Delete Header
-DataTableDeleteHeaderCommand.Label.DeleteFooter=Delete Footer
-DataTableInsertColumnCommand.Label.InsertColumn=Insert Column
-DataTableInsertHeaderCommand.Label.InsertHeader=Insert Header
-DataTableInsertHeaderCommand.Label.InsertFooter=Insert Footer
-DataTableInsertColumnHeaderCommand.Label.InsertHeader=Insert Header
-DataTableInsertColumnHeaderCommand.Label.InsertFooter=Insert Footer
-DataTableDeleteColumnHeaderCommand.Label.DeleteColumnHeader=Delete Column Header
-DataTableDeleteColumnHeaderCommand.Label.DeleteColumnFooter=Delete Column Footer
-PanelGridDeleteColumnCommand.Label.DeleteColumn=Delete Column
-PanelGridInsertColumnCommand.Label.InsertColumn=Insert Column
-PanelGridInsertFooterCommand.Label.InsertFooter=Insert Footer
-PanelGridInsertHeaderCommand.Label.InsertHeader=Insert Header
-PanelGridDeleteRowCommand.Label.DeleteRow=Delete Row
-PanelGridInsertRowCommand.Label.InsertRow=Insert Row
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnCommand.java
deleted file mode 100644
index 12dce24..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnCommand.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * Delete a column from dataTable.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DataTableDeleteColumnCommand extends DesignerCommand
-{
-
-    private Element _dataTable;
-    private int     _index;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param columnIndex 
-     */
-    public DataTableDeleteColumnCommand(IHTMLGraphicalViewer viewer, Element dataTable, int columnIndex)
-    {
-        super(CommandResources.getString("DataTableDeleteColumnCommand.Label.DeleteColumn"), viewer); //$NON-NLS-1$
-        this._dataTable = dataTable;
-        this._index = columnIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._index < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        NodeList children = _dataTable.getChildNodes();
-        int index = 0;
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                if (index++ == this._index)
-                {
-                    _dataTable.removeChild(node);
-                    return;
-                }
-            }
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnHeaderCommand.java
deleted file mode 100644
index c16d4eb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteColumnHeaderCommand.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableDeleteColumnHeaderCommand extends DesignerCommand
-{
-    boolean         _header;   // true means header, false means footer.
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param header 
-     */
-    public DataTableDeleteColumnHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean header)
-    {
-        super(header ? CommandResources.getString("DataTableDeleteColumnHeaderCommand.Label.DeleteColumnHeader") : //$NON-NLS-1$
-        CommandResources.getString("DataTableDeleteColumnHeaderCommand.Label.DeleteColumnFooter"), viewer); //$NON-NLS-1$ 
-        this._header = header;
-        this._dataTable = dataTable;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        int num = 0;
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (hasHeader(column))
-                {
-                    num++;
-                    break;
-                }
-            }
-        }
-        if (num == 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (hasHeader(column))
-                {
-                    Element hf = JSFDOMUtil.findFacet(column, _header ? "header" : "footer"); //$NON-NLS-1$ //$NON-NLS-2$
-                    column.removeChild(hf);
-                }
-            }
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    /**
-     * @param column
-     * @param _header2
-     * @return
-     */
-    private boolean hasHeader(Element column)
-    {
-        return JSFDOMUtil.findFacet(column, _header ? "header" : "footer") != null; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteHeaderCommand.java
deleted file mode 100644
index 44dfff2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableDeleteHeaderCommand.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableDeleteHeaderCommand extends DesignerCommand
-{
-    /**
-     * true means header,false means footer
-     */
-    boolean         _isHeader;
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable
-     * @param isHeader
-     */
-    public DataTableDeleteHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean isHeader)
-    {
-        super(isHeader ? CommandResources.getString("DataTableDeleteHeaderCommand.Label.DeleteHeader") : //$NON-NLS-1$
-        CommandResources.getString("DataTableDeleteHeaderCommand.Label.DeleteFooter"), viewer); //$NON-NLS-1$ 
-        this._isHeader = isHeader;
-        this._dataTable = dataTable;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._isHeader)
-        {
-            boolean hasHeader = (JSFDOMUtil.findFacet(this._dataTable, "header") != null); //$NON-NLS-1$
-            if (!hasHeader)
-            {
-                return false;
-            }
-        }
-        else
-        {
-            boolean hasFooter = (JSFDOMUtil.findFacet(this._dataTable, "footer") != null); //$NON-NLS-1$
-            if (!hasFooter)
-            {
-                return false;
-            }
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String type = (this._isHeader) ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-        Element ele = JSFDOMUtil.findFacet(this._dataTable, type);
-        if (ele != null)
-        {
-            this._dataTable.removeChild(ele);
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnCommand.java
deleted file mode 100644
index b5c7d0c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnCommand.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Insert a column into dataTable.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DataTableInsertColumnCommand extends DesignerCommand
-{
-    Element _dataTable;
-    Element _child;
-    int     _index;
-
-    /**
-     * 
-     * @param viewer
-     * @param dataTable
-     * @param index 0 means before the first column.
-     */
-    public DataTableInsertColumnCommand(IHTMLGraphicalViewer viewer, Element dataTable, int index)
-    {
-        super(CommandResources.getString("DataTableInsertColumnCommand.Label.InsertColumn"), viewer); //$NON-NLS-1$
-        this._dataTable = dataTable;
-        this._index = index;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._index < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        _child = _dataTable.getOwnerDocument().createElement(prefix + ":column"); //$NON-NLS-1$
-
-        createHeaderFooter(_child);
-        NodeList children = _dataTable.getChildNodes();
-        int count = 0;
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                if (_index == count)
-                {
-                    _dataTable.insertBefore(_child, node);
-                    return;
-                }
-                count++;
-            }
-        }
-        _dataTable.insertBefore(_child, null);
-        formatNode(this._child);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    /**
-     * check whether the datatable already have header and footer, if yes,
-     * then also create for this column
-     * 
-     * @param column
-     */
-    private void createHeaderFooter(Element column)
-    {
-        boolean hasHeader = false;
-        boolean hasFooter = false;
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                if (!hasHeader && JSFDOMUtil.findFacet((Element) node, "header") != null) //$NON-NLS-1$
-                {
-                    hasHeader = true;
-                }
-                if (!hasFooter && JSFDOMUtil.findFacet((Element) node, "footer") != null) //$NON-NLS-1$
-                {
-                    hasFooter = true;
-                }
-            }
-        }
-        if (hasHeader)
-        {
-            Element facet = createFacet();
-            facet.setAttribute("name", "header"); //$NON-NLS-1$ //$NON-NLS-2$
-            Element ele = createDefaultElement();
-            facet.appendChild(ele);
-            column.appendChild(facet);
-        }
-        if (hasFooter)
-        {
-            Element facet = createFacet();
-            facet.setAttribute("name", "footer"); //$NON-NLS-1$ //$NON-NLS-2$
-            Element ele = createDefaultElement();
-            facet.appendChild(ele);
-            column.appendChild(facet);
-        }
-    }
-
-    /**
-     * @return
-     */
-    private Element createFacet()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_FACET);
-        ele.setPrefix(prefix);
-        return ele;
-    }
-
-    private Element createDefaultElement()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        ele.setPrefix(prefix);
-        ele.setAttribute(IJSFConstants.ATTR_VALUE, "Column"); //$NON-NLS-1$
-        return ele;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnHeaderCommand.java
deleted file mode 100644
index f69707f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertColumnHeaderCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableInsertColumnHeaderCommand extends DesignerCommand
-{
-    boolean         _header;   // true means header, false means footer.
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param header 
-     */
-    public DataTableInsertColumnHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean header)
-    {
-        super(header ? CommandResources.getString("DataTableInsertColumnHeaderCommand.Label.InsertHeader") : CommandResources.getString("DataTableInsertColumnHeaderCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-        this._header = header;
-        this._dataTable = dataTable;
-    }
-
-    public boolean canExecute()
-    {
-        int num = 0;
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (!hasHeader(column))
-                {
-                    num++;
-                    break;
-                }
-            }
-        }
-        if (num == 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String type = (this._header) ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-
-        NodeList children = _dataTable.getChildNodes();
-        for (int i = 0, size = children.getLength(); i < size; i++)
-        {
-            Node node = children.item(i);
-            if (JSFDOMUtil.isHColumn(node))
-            {
-                Element column = (Element) node;
-                if (!hasHeader(column))
-                {
-                    Element headerOrFooter = createHeaderOrFooter(type);
-                    column.appendChild(headerOrFooter);
-                }
-            }
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    /**
-     * @param column
-     * @param _header2
-     * @return
-     */
-    private boolean hasHeader(Element column)
-    {
-        return JSFDOMUtil.findFacet(column, _header ? "header" : "footer") != null; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    private Element createHeaderOrFooter(String type)
-    {
-        Element facet = createFacet();
-        Element def = createDefaultElement();
-        facet.appendChild(def);
-        facet.setAttribute(IJSFConstants.ATTR_NAME, type);
-        return facet;
-    }
-
-    private Element createFacet()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_FACET);
-        ele.setPrefix(prefix);
-        return ele;
-    }
-
-    private Element createDefaultElement()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        ele.setPrefix(prefix);
-        if (this._header)
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Column Header"); //$NON-NLS-1$
-        }
-        else
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Column Footer"); //$NON-NLS-1$
-        }
-
-        return ele;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertHeaderCommand.java
deleted file mode 100644
index 4231efc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/DataTableInsertHeaderCommand.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * This command is used to insert a header row or footer row.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DataTableInsertHeaderCommand extends DesignerCommand
-{
-    boolean         _header;   // true means header, false means footer.
-    private Element _dataTable;
-
-    /**
-     * @param viewer
-     * @param dataTable 
-     * @param header 
-     */
-    public DataTableInsertHeaderCommand(IHTMLGraphicalViewer viewer, Element dataTable, boolean header)
-    {
-        super(header ? CommandResources.getString("DataTableInsertHeaderCommand.Label.InsertHeader") : CommandResources.getString("DataTableInsertHeaderCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-        this._header = header;
-        this._dataTable = dataTable;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._header)
-        {
-            boolean hasHeader = (JSFDOMUtil.findFacet(this._dataTable, "header") != null); //$NON-NLS-1$
-            if (hasHeader)
-            {
-                return false;
-            }
-        }
-        else
-        {
-            boolean hasFooter = (JSFDOMUtil.findFacet(this._dataTable, "footer") != null); //$NON-NLS-1$
-            if (hasFooter)
-            {
-                return false;
-            }
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        String type = (this._header) ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-        Element headerOrFooter = createHeaderOrFooter(type);
-        if (this._header)
-        {
-            this._dataTable.insertBefore(headerOrFooter, this._dataTable.getFirstChild());
-        }
-        else
-        {
-            this._dataTable.appendChild(headerOrFooter);
-        }
-        formatNode(this._dataTable);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(_dataTable);
-    }
-
-    private Element createHeaderOrFooter(String type)
-    {
-        Element facet = createFacet();
-        Element def = createDefaultElement();
-        facet.appendChild(def);
-        facet.setAttribute(IJSFConstants.ATTR_NAME, type);
-        return facet;
-    }
-
-    private Element createFacet()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_CORE, "f"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_FACET);
-        ele.setPrefix(prefix);
-        return ele;
-    }
-
-    private Element createDefaultElement()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element ele = _dataTable.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        ele.setPrefix(prefix);
-        if (this._header)
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Table Header"); //$NON-NLS-1$
-        }
-        else
-        {
-            ele.setAttribute(IJSFConstants.ATTR_VALUE, "Table Footer"); //$NON-NLS-1$
-        }
-        return ele;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteColumnCommand.java
deleted file mode 100644
index 38d9451..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteColumnCommand.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * This is for delete a column in panelGrid
- * 
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridDeleteColumnCommand extends DesignerCommand
-{
-
-    private int     _columnIndex;
-    private Element _panelGridEle;
-
-    /**
-     * @param viewer
-     * @param panelGrid 
-     * @param columnIndex 
-     */
-    public PanelGridDeleteColumnCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int columnIndex)
-    {
-        super(CommandResources.getString("PanelGridDeleteColumnCommand.Label.DeleteColumn"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._columnIndex = columnIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        //if user chose header or footer,then disable the delete column action
-        if (this._columnIndex < 0)
-        {
-            return false;
-        }
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, "columns", 1); //$NON-NLS-1$
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        return columns > 1;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, "columns", 1); //$NON-NLS-1$
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        if (_columnIndex >= columns)
-        {
-            JSFUIPlugin.log(IStatus.ERROR, "Should not happen", new Throwable()); //$NON-NLS-1$
-            return;
-        }
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        List toRemove = new ArrayList();
-        for (int i = _columnIndex; i < children.size(); i += columns)
-        {
-            toRemove.add(children.get(i));
-        }
-        for (int i = 0, size = toRemove.size(); i < size; i++)
-        {
-            _panelGridEle.removeChild((Node) toRemove.get(i));
-        }
-
-        _panelGridEle.setAttribute("columns", String.valueOf(columns - 1)); //$NON-NLS-1$
-        formatNode(_panelGridEle);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGridEle);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteRowCommand.java
deleted file mode 100644
index e0a2795..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridDeleteRowCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * Remove a row from panel grid
- * 
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridDeleteRowCommand extends DesignerCommand
-{
-    Element _panelGridEle;
-    int     _rowIndex;
-
-    /**
-     * @param viewer
-     * @param panelGrid 
-     * @param index 
-     */
-    public PanelGridDeleteRowCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int index)
-    {
-        super(CommandResources.getString("PanelGridDeleteRowCommand.Label.DeleteRow"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._rowIndex = index;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        // Remove the row from panelGrid is a little complex. Since this row could
-        // be header or footer.
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(_panelGridEle, "header") != null); //$NON-NLS-1$
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, "columns", 1); //$NON-NLS-1$
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        int numRows = (children.size() + columns - 1) / columns;
-
-        int removeRow = _rowIndex;
-
-        if (hasHeaderRow)
-        {
-            if (removeRow == 0)
-            {
-                // remove the header row.
-                removeHeader();
-                formatNode(_panelGridEle);
-                return;
-            }
-            removeRow--;
-        }
-        if (removeRow < numRows)
-        {
-            List toRemove = new ArrayList();
-            int max = columns * (removeRow + 1);
-            max = Math.min(max, children.size());
-            for (int i = (columns * removeRow); i < max; i++)
-            {
-                toRemove.add(children.get(i));
-            }
-            for (int i = 0, size = toRemove.size(); i < size; i++)
-            {
-                _panelGridEle.removeChild((Node) toRemove.get(i));
-            }
-            formatNode(_panelGridEle);
-        }
-        else
-        {
-            // must be footer.
-            removeFooter();
-            formatNode(_panelGridEle);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._rowIndex < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /**
-     * 
-     */
-    private void removeFooter()
-    {
-        Element ele = JSFDOMUtil.findFacet(_panelGridEle, "footer"); //$NON-NLS-1$
-        if (ele != null)
-        {
-            _panelGridEle.removeChild(ele);
-        }
-    }
-
-    /**
-     * 
-     */
-    private void removeHeader()
-    {
-        Element ele = JSFDOMUtil.findFacet(_panelGridEle, "header"); //$NON-NLS-1$
-        if (ele != null)
-        {
-            _panelGridEle.removeChild(ele);
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return this.toDesignSelection(this._panelGridEle);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertColumnCommand.java
deleted file mode 100644
index 3c68d26..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertColumnCommand.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util.PanelGridUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertColumnCommand extends DesignerCommand
-{
-    private int     _columnIndex;
-    private Element _panelGridEle;
-
-    /**
-     * construction
-     * @param viewer
-     * @param panelGrid
-     * @param columnIndex
-     */
-    public PanelGridInsertColumnCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int columnIndex)
-    {
-        super(CommandResources.getString("PanelGridInsertColumnCommand.Label.InsertColumn"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._columnIndex = columnIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._columnIndex < 0)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        int startPoint = 0;
-        if (_columnIndex > columns)
-        {
-            return;
-        }
-        else if (_columnIndex == columns)
-        {
-            startPoint = _columnIndex - 1;
-        }
-        else
-        {
-            startPoint = _columnIndex;
-        }
-
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-
-        List toMove = new ArrayList();
-        for (int i = startPoint; i < children.size(); i += columns)
-        {
-            if (_columnIndex < columns)
-            {
-                toMove.add(children.get(i));
-            }
-            else
-            {
-                int tmp = i + 1;
-                if (tmp == children.size())
-                {
-                    toMove.add(null);
-                }
-                else
-                {
-                    toMove.add(children.get(i + 1));
-                }
-            }
-        }
-        //        for (int i = 0, size = toMove.size(); i < size; i++)
-        int lastRowCells = (children.size() % columns == 0) ? columns : (children.size() % columns);
-        PanelGridUtil util = new PanelGridUtil(this._panelGridEle);
-        int uiRows = util.getUIRowCount();
-        int adds = uiRows;
-        if (this._columnIndex > lastRowCells)
-        {
-            adds += this._columnIndex - lastRowCells;
-        }
-        for (int i = 0, size = adds; i < size; i++)
-        {
-            Node child = createDefaultNode();
-            int toMoveSize = toMove.size();
-            Node node = null;
-            if (i < toMoveSize)
-            {
-                node = (Node) toMove.get(i);
-            }
-            _panelGridEle.insertBefore(child, node);
-        }
-
-        _panelGridEle.setAttribute(IJSFConstants.ATTR_COLUMNS, String.valueOf(columns + 1));
-        formatNode(_panelGridEle);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGridEle);
-    }
-
-    private Node createDefaultNode()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element child = _panelGridEle.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        child.setPrefix(prefix);
-        return child;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertFooterCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertFooterCommand.java
deleted file mode 100644
index d3cb109..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertFooterCommand.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertFooterCommand extends DesignerCommand
-{
-    private Element _panelGrid;
-
-    /**
-     * @param viewer
-     * @param panelGrid
-     */
-    public PanelGridInsertFooterCommand(IHTMLGraphicalViewer viewer, Element panelGrid)
-    {
-        super(CommandResources.getString("PanelGridInsertFooterCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$
-        this._panelGrid = panelGrid;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        boolean hasHeader = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null); //$NON-NLS-1$
-        if (hasHeader)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        Document doc = this._panelGrid.getOwnerDocument();
-        Element facet = doc.createElement(IJSFConstants.TAG_FACET);
-        facet.setPrefix("f"); //$NON-NLS-1$
-        facet.setAttribute(IJSFConstants.ATTR_NAME, "footer"); //$NON-NLS-1$
-        Element outputText = doc.createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        outputText.setPrefix("h"); //$NON-NLS-1$
-        outputText.setAttribute(IJSFConstants.ATTR_VALUE, "Footer"); //$NON-NLS-1$
-        facet.appendChild(outputText);
-        List list = JSFDOMUtil.getUIComponentChildren(this._panelGrid);
-        if (list != null && list.size() > 0)
-        {
-            this._panelGrid.insertBefore(facet, (Element) list.get(0));
-        }
-        else
-        {
-            this._panelGrid.insertBefore(facet, null);
-        }
-        formatNode(this._panelGrid);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGrid);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertHeaderCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertHeaderCommand.java
deleted file mode 100644
index 6a9753d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertHeaderCommand.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertHeaderCommand extends DesignerCommand
-{
-    private Element _panelGrid;
-
-    /**
-     * @param viewer
-     * @param panelGrid
-     */
-    public PanelGridInsertHeaderCommand(IHTMLGraphicalViewer viewer, Element panelGrid)
-    {
-        super(CommandResources.getString("PanelGridInsertHeaderCommand.Label.InsertHeader"), viewer); //$NON-NLS-1$
-        this._panelGrid = panelGrid;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        boolean hasHeader = (JSFDOMUtil.findFacet(this._panelGrid, "header") != null); //$NON-NLS-1$
-        if (hasHeader)
-        {
-            return false;
-        }
-        return super.canExecute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        Document doc = this._panelGrid.getOwnerDocument();
-        Element facet = doc.createElement(IJSFConstants.TAG_FACET);
-        facet.setPrefix("f"); //$NON-NLS-1$
-        facet.setAttribute(IJSFConstants.ATTR_NAME, "header"); //$NON-NLS-1$
-        Element outputText = doc.createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        outputText.setPrefix("h"); //$NON-NLS-1$
-        outputText.setAttribute(IJSFConstants.ATTR_VALUE, "Header"); //$NON-NLS-1$
-        facet.appendChild(outputText);
-        this._panelGrid.insertBefore(facet, this._panelGrid.getFirstChild());
-        formatNode(this._panelGrid);
-    }
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGrid);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertRowCommand.java
deleted file mode 100644
index 8971b2c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/commands/jsfhtml/PanelGridInsertRowCommand.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridInsertRowCommand extends DesignerCommand
-{
-    private int     _rowIndex;
-    private Element _panelGridEle;
-
-    /**
-     * consturctor
-     * @param viewer
-     * @param panelGrid
-     * @param rowIndex
-     */
-    public PanelGridInsertRowCommand(IHTMLGraphicalViewer viewer, Element panelGrid, int rowIndex)
-    {
-        super(CommandResources.getString("PanelGridInsertRowCommand.Label.InsertRow"), viewer); //$NON-NLS-1$
-        this._panelGridEle = panelGrid;
-        this._rowIndex = rowIndex;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.gef.commands.Command#canExecute()
-     */
-    public boolean canExecute()
-    {
-        if (this._rowIndex < 0)
-        {
-            return false;
-        }
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(_panelGridEle, "header") != null); //$NON-NLS-1$
-        //forbid insert row before header
-        if (hasHeaderRow && _rowIndex == 0)
-        {
-            return false;
-        }
-
-        int offIndex = this._rowIndex;
-        if (hasHeaderRow)
-        {
-            offIndex--;
-        }
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        int numRows = (children.size() + columns - 1) / columns;
-        //        //if the last element row is not full,then forbid insert row after the row
-        //        if ((children.size() % columns != 0) && (offIndex == numRows))
-        //        {
-        //            return false;
-        //        }
-        //forbid insert row after the footer row
-        if (offIndex > numRows)
-        {
-            return false;
-        }
-
-        return super.canExecute();
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute()
-    {
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(_panelGridEle, "header") != null); //$NON-NLS-1$
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(_panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        List children = JSFDOMUtil.getUIComponentChildren(_panelGridEle);
-        int numRows = (children.size() + columns - 1) / columns;
-
-        int insertRow = _rowIndex;
-
-        if (hasHeaderRow)
-        {
-            if (insertRow == 0)
-            {
-                return;
-            }
-            insertRow--;
-        }
-        //if (insertRow < numRows || ((insertRow == numRows) && (children.size() % columns == 0)))
-
-        {
-            int insertPoint = insertRow * columns;
-            Node node = null;
-            if (insertPoint < children.size())
-            {
-                node = (Node) children.get(insertPoint);
-            }
-
-            int adds = 0;
-            //if insert after the last ui row
-            if (insertRow >= numRows)
-            {
-                adds = columns * (numRows + 1) - children.size();
-            }
-            else
-            {
-                adds = columns;
-            }
-
-            for (int i = 0; i < adds; i++)
-            {
-                Node child = createDefaultNode();
-                _panelGridEle.insertBefore(child, node);
-            }
-            formatNode(_panelGridEle);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection()
-    {
-        return toDesignSelection(this._panelGridEle);
-    }
-    
-    private Node createDefaultNode()
-    {
-        String prefix = JSPUtil.getOrCreatePrefix(getModel(), ITLDConstants.URI_JSF_HTML, "h"); //$NON-NLS-1$
-        Element child = _panelGridEle.getOwnerDocument().createElement(IJSFConstants.TAG_OUTPUTTEXT);
-        child.setPrefix(prefix);
-        return child;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/JSFCoreConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/JSFCoreConverterFactory.java
deleted file mode 100644
index bb218e5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/JSFCoreConverterFactory.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.converter.TagConverterToInlineBlock;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.DTTagConverter;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class JSFCoreConverterFactory implements IConverterFactory
-{
-
-    private final ILabelProvider        _labelProvider;
-   
-    // TODO C.B: this is a transitional step so that we can incrementally add
-    // new meta-data driven tag converter one-by-one without breaking other existing
-    // if a tag name is in this set, the new DTTagConverter will be created for it,
-    // else, revert to original one
-    private final static Set                   _dtConversionSupported;
-    
-    static
-    {
-        _dtConversionSupported = new HashSet();
-        /*
-        _dtConversionSupported.add(IJSFConstants.TAG_VIEW);
-        _dtConversionSupported.add(IJSFConstants.TAG_FACET);
-        _dtConversionSupported.add(IJSFConstants.TAG_VERBATIM);
-        */
-    }
-    
-    /**
-     * 
-     */
-    public JSFCoreConverterFactory()
-    {
-        super();
-        _labelProvider = new MyLabelProvider();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-     */
-    public ITagConverter createConverter(Element element, int mode)
-    {
-        String tagName = element.getLocalName();
-        ITagConverter converter;
-        
-        if (_dtConversionSupported.contains(tagName))
-        {
-            converter = createDTTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_VIEW.equalsIgnoreCase(tagName) || IJSFConstants.TAG_SUBVIEW.equalsIgnoreCase(tagName))
-        {
-            converter = new ViewTagConverter(element);
-            ((ViewTagConverter) converter).setNeedBorderDecorator(true);
-        }
-        else if (IJSFConstants.TAG_FACET.equalsIgnoreCase(tagName)
-                || IJSFConstants.TAG_VERBATIM.equalsIgnoreCase(tagName))
-        {
-            AbstractTagConverter toSpan = new TagConverterToInlineBlock(element, mode);
-            toSpan.setMinWidth(10);
-            toSpan.setMinHeight(10);
-            toSpan.setNeedBorderDecorator(true);
-            converter = toSpan;
-        }
-        else if (IJSFConstants.TAG_LOADBUNDLE.equalsIgnoreCase(tagName))
-        {
-            converter = new LoadBundleTagConverter(element, _labelProvider);
-        }
-        else
-        {
-            converter = new HiddenTagConverter(element, _labelProvider);
-        }
-        converter.setMode(mode);
-        return converter;
-    }
-
-    private static class MyLabelProvider extends org.eclipse.jface.viewers.LabelProvider
-    {
-
-        public Image getImage(Object element) 
-        {
-            if (element instanceof ITagConverter)
-            {
-                final Element hostElement = ((ITagConverter)element).getHostElement();
-                IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(hostElement);
-                if (context != null){   
-                	IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-                	if (wsResolver != null){
-                		return TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),ITLDConstants.URI_JSF_CORE, hostElement.getLocalName());
-                	}
-                }
-            }
-            
-            return null;
-        }
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_CORE;
-    }
-    
-    private ITagConverter createDTTagConverter(Element element)
-    {
-        return new DTTagConverter(element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java
deleted file mode 100644
index a5f0fa9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.util.HashMap;
-import java.util.PropertyResourceBundle;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class LoadBundleTagConverter extends HiddenTagConverter
-{
-    private static Logger _log = PDPlugin.getLogger(LoadBundleTagConverter.class);
-
-    /**
-     * @param host
-     * @param labelProvider 
-     */
-    public LoadBundleTagConverter(Element host, ILabelProvider labelProvider)
-    {
-        super(host, labelProvider);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#convertRefresh(java.lang.Object)
-     */
-    public void convertRefresh(Object context)
-    {
-        Element hostEle = getHostElement();
-        String varString = hostEle.getAttribute(IJSFConstants.ATTR_VAR);
-        String baseName = hostEle.getAttribute(IJSFConstants.ATTR_BASENAME);
-        if (baseName == null || varString == null)
-        {
-            return;
-        }
-        baseName = baseName.replace('.', '/') + IFileFolderConstants.DOT + IFileFolderConstants.EXT_PROPERTIES;
-        IProject project = null;
-        
-        if (hostEle instanceof IDOMNode)
-        {
-            IDOMModel model = ((IDOMNode) hostEle).getModel();
-            if (model != null)
-            {
-                project = StructuredModelUtil.getProjectFor(model);
-            }
-        }
-        if (project == null)
-        {
-            return;
-        }
-        String prop = (new StringBuffer("webroot") //$NON-NLS-1$
-            .append(IFileFolderConstants.PATH_SEPARATOR).append(IFileFolderConstants.FOLDER_WEBINF).append(
-            IFileFolderConstants.PATH_SEPARATOR).append(IFileFolderConstants.FOLDER_CLASS).append(
-            IFileFolderConstants.PATH_SEPARATOR).append(baseName)).toString();
-        IResource res = project.findMember(prop);
-        if (res == null)
-        {
-            prop = IFileFolderConstants.FOLDER_SOURCE + IFileFolderConstants.PATH_SEPARATOR + baseName;
-            res = project.findMember(prop);
-            if (res == null)
-            {
-                return;
-            }
-        }
-        InputStream ins = null;
-        try
-        {
-            File f = new File(res.getLocation().toString());
-            ins = new FileInputStream(f);
-            if (ins != null)
-            {
-                ins = new BufferedInputStream(ins);
-                PropertyResourceBundle bundle = new PropertyResourceBundle(ins);
-                if (bundle != null)
-                {
-                    if (PreviewUtil.getBUNDLE_MAP() == null)
-                    {
-                        PreviewUtil.setBUNDLE_MAP(new HashMap());
-                    }
-                    else
-                    {
-                        PreviewUtil.getBUNDLE_MAP().clear();
-                    }
-                    PreviewUtil.getBUNDLE_MAP().put(varString, bundle);
-                    PreviewUtil.setBUNDLE(bundle);
-                    PreviewUtil.setVAR(varString);
-                }
-            }
-        }
-        catch (MalformedURLException e)
-        {
-            _log.error("LoadBundleTagConverter.convertRefresh.MalformedURLException", e); //$NON-NLS-1$
-            return;
-        }
-        catch (IOException e)
-        {
-            _log.error("LoadBundleTagConverter.convertRefresh.IOException", e); //$NON-NLS-1$
-            return;
-        }
-        finally
-        {
-            ResourceUtils.ensureClosed(ins);
-        }
-
-        return;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/ViewTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/ViewTagConverter.java
deleted file mode 100644
index 7c40521..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/ViewTagConverter.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfcore;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class ViewTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public ViewTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element result = createElement(IHTMLConstants.TAG_DIV);
-        copyChildren(getHostElement(), result);
-//        if(!isPreviewMode())
-//        {
-//            result.setAttribute(IHTMLConstants.ATTR_STYLE,"margin:10px;");
-//        }
-        if(!isPreviewMode() && ConverterUtil.isEmptyContainer(getHostElement()))
-        {
-            result.appendChild(ConverterUtil.createDescriptionElement(getDestDocument(),null));
-        }
-        return result;
-    }
-    	
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/ColumnTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/ColumnTagConverter.java
deleted file mode 100644
index 6990df4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/ColumnTagConverter.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class ColumnTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public ColumnTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // we render all non-facet (header, footer) sub elements of this element
-        Element resultEle = createElement(IHTMLConstants.TAG_TD);
-        // --- create column's td in column tag converter, this should not be final solution, we might need to use
-        // referece column figure in td later.
-
-        Node parent = hostEle.getParentNode();
-        int offset;
-        if (parent != null && parent.getLocalName().equals(IJSFConstants.TAG_DATATABLE))
-        {
-            String columnClassesAttr = ((Element) parent).getAttribute(IJSFConstants.ATTR_COLUMNCLASSES);
-            List columnClasses = new ArrayList();
-            if (columnClassesAttr != null)
-            {
-                StringTokenizer tokenizer = new StringTokenizer(columnClassesAttr, ", "); //$NON-NLS-1$
-                while (tokenizer.hasMoreTokens())
-                {
-                    columnClasses.add(tokenizer.nextToken());
-                }
-            }
-            offset = EditModelQuery.getInstance().getSameTypeNodeIndex(hostEle);
-            if (offset < columnClasses.size())
-            {
-                resultEle.setAttribute(ICSSPropertyID.ATTR_CLASS, (String) columnClasses.get(offset));
-            }
-        }
-        if (EditModelQuery.getInstance().hasNonTransparentChild(hostEle, new String[] 
-        {
-                IJSFConstants.TAG_FACET
-        }
-        ))
-        {
-            Node child = hostEle.getFirstChild();
-            int index = 0;
-            while (child != null)
-            {
-                if (!(child instanceof Element)
-                        || !JSFDOMUtil.isFacet((Element) child))
-                {
-                    addChild(child, new ConvertPosition(resultEle, index++));
-                }
-                child = child.getNextSibling();
-            }
-        }
-        else
-        {
-            Node child = createText(" "); //$NON-NLS-1$
-            resultEle.appendChild(child);
-        }
-        return resultEle;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        Element hostEle = getHostElement();
-        Node parent = hostEle.getParentNode();
-        if (parent != null && parent.getLocalName().equals(IJSFConstants.TAG_DATATABLE))
-        {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandButtonTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandButtonTagConverter.java
deleted file mode 100644
index 6a286aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandButtonTagConverter.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class CommandButtonTagConverter extends AbstractTagConverter
-{
-    private List   _nonVisualChildren = Collections.EMPTY_LIST;
-    
-    /**
-     * @param host
-     */
-    public CommandButtonTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Renders an HTML "input" element.
-        Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-
-        // pass throught attributes
-        JSFConverterUtil.copyAllAttributes(hostEle, inputEle, null);
-        
-//      If the "styleClass" attribute is specified, render its 
-        // value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, inputEle, IHTMLConstants.ATTR_CLASS);
-        
-        inputEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // next handles input type
-        // "image" attribute:  Absolute or relative URL of the image to be 
-        // displayed for this button. If specified, this "input" element will be 
-        // of type "image". Otherwise, it will be of the type specified by the 
-        // "type" property with a label specified by the "value" property.
-
-        String imageAttr = hostEle.getAttribute(IJSFConstants.ATTR_IMAGE);
-        String type;
-        if (imageAttr == null || imageAttr.length() == 0)
-        {
-            type = hostEle.getAttribute(IJSFConstants.ATTR_TYPE);
-            if (type == null || type.length() == 0)
-            {
-                type = "submit";	// default type //$NON-NLS-1$
-            }
-        }
-        else
-        {
-            type = "image"; //$NON-NLS-1$
-            // copy the image attribute as the src attribute
-            String src = mapURL(imageAttr);
-            inputEle.setAttribute(IHTMLConstants.ATTR_SRC, src);
-        }
-        // overwrite the "type" attribute
-        inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, type);       
-
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value != null && value.length() > 0)
-        {
-            value = mapValue(value);
-            inputEle.setAttribute(IHTMLConstants.ATTR_VALUE, value);
-        }
-
-        // get non-visual children
-        // a button only has non-visual children, so
-        // all Element child nodes are considered such
-        if (hostEle.hasChildNodes())
-        {
-            _nonVisualChildren = new ArrayList();
-            
-            NodeList list = hostEle.getChildNodes();
-            
-            for (int i = 0; i < list.getLength(); i++)
-            {
-                Node node = list.item(i);
-                
-                if (node.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    _nonVisualChildren.add(node);
-                }
-            }
-        }
-        
-        // Render the clientId of the component as the value of the "name" attribute. 
-        // Render the current value of the component as the value of the "value" attribute. 
-
-        return inputEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    public List getNonVisualChildren() {
-        return _nonVisualChildren;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandLinkTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandLinkTagConverter.java
deleted file mode 100644
index a027bc4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/CommandLinkTagConverter.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class CommandLinkTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public CommandLinkTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Render an HTML "a" anchor element that acts like a form submit button when clicked.
-        Element aEle = createElement(IHTMLConstants.TAG_A);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, aEle, null);
-
-        // If the "styleClass" attribute is specified, render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, aEle, IHTMLConstants.ATTR_CLASS);
-
-        aEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // Render "#" as the value of the "href" attribute.
-        aEle.setAttribute(IHTMLConstants.ATTR_HREF, "#"); //$NON-NLS-1$
-        // Extend the container border a little to make it selectable
-        if (!isPreviewMode())
-        {
-            String style = aEle.getAttribute(IHTMLConstants.ATTR_STYLE);
-            style = "padding:0.3em;" + style; //$NON-NLS-1$
-            aEle.setAttribute(IHTMLConstants.ATTR_STYLE, style);
-        }
-
-        int childNodeIndex = 0;
-        // Render the current value of the component as the link text if it
-        // is specified.
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value != null && value.length() > 0)
-        {
-            value = mapValue(value);
-            aEle.appendChild(createText(value));
-            childNodeIndex = 1;
-        }
-        // generate children
-        // Render any non-UIParameter children as normal inside of the "a" element.
-        // These will appear as the link text.
-
-        if (hostEle.hasChildNodes())
-        {
-            Node child = hostEle.getFirstChild();
-            for (; child != null; child = child.getNextSibling())
-            {
-                if (!shouldIgnore(child))
-                {
-                    if (child instanceof Element
-                            && (JSFDOMUtil.isUIParameter((Element) child) || isActionListener((Element) child)))
-                    {
-                        // skip
-                    }
-                    else
-                    {
-                        addChild(child, new ConvertPosition(aEle, childNodeIndex++));
-                    }
-                }
-            }
-        }
-        if (ConverterUtil.isEmptyContainer(hostEle) && !hostEle.hasAttribute(IJSFConstants.ATTR_VALUE))
-        {
-            aEle.appendChild(getDestDocument().createTextNode(IJSFConstants.TAG_COMMANDLINK));
-        }
-
-        return aEle;
-    }
-    
-    private boolean isActionListener(Element element)
-    {
-        if(element != null && IJSFConstants.TAG_ACTIONLISTENER.equalsIgnoreCase(element.getLocalName()))
-        {
-            return true;
-        }
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/DataTableTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/DataTableTagConverter.java
deleted file mode 100644
index 7dc052a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/DataTableTagConverter.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class DataTableTagConverter extends AbstractTagConverter
-{
-    private static final String FACET_NAME_HEADER = "header"; //$NON-NLS-1$
-
-    /**
-     * @param host
-     */
-    public DataTableTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Renders an HTML "table" element compliant with the HTML 401 specification.
-        Element tableEle = createElement(IHTMLConstants.TAG_TABLE);
-
-        // Any pass-through attributes are also rendered on the "table" element.
-        JSFConverterUtil.copyAllAttributes(hostEle, tableEle, null);
-
-        // Please consult the javadoc for UIData to supplement this specification.
-        // If the "styleClass" attribute is specified, render its value as the value
-        // of the "class" attribute on the "table" element.
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);
-        tableEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        List columns = findUIColumns(hostEle);
-
-        // rendering the thead
-        convertTHeader(hostEle, tableEle, columns, true);
-
-        convertTBody(hostEle, tableEle, columns);
-        // rendering the tfoot
-        // Follow the same process as for the header, except replace "header" with
-        // "footer", "th" with "td", "thead" with "tfoot", and "headerClass" with
-        // "footerClass". Do not render any "scope" attribute for the footer.
-        convertTHeader(hostEle, tableEle, columns, false);
-
-        return tableEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private List findUIColumns(Element hostEle)
-    {
-        List result = new ArrayList();
-        Node child = hostEle.getFirstChild();
-        if (child != null)
-        {
-
-            while (child != null)
-            {
-                if (child instanceof Element)
-                {
-                    Element ele = (Element) child;
-                    TagIdentifier  tagId = TagIdentifierFactory.createDocumentTagWrapper(ele);
-                    if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId))
-                    {
-                        result.add(ele);
-                    }
-                }
-                child = child.getNextSibling();
-            }
-        }
-        return result;
-    }
-
-    /**
-     * @param hostEle
-     * @param tableEle
-     * @param columns
-     */
-    protected void convertTBody(Element hostEle, Element tableEle, List columns)
-    {
-        // Rendering the table body
-        Element tbodyEle = createElement(IHTMLConstants.TAG_TBODY);
-        tableEle.appendChild(tbodyEle);
-        // Render a "tbody" element. Keep track of the result of the "rows" property
-        // on the UIData component. Keep track of the number of rows we have rendered
-        // so far.
-        // Iterate through the rows. Set the "rowIndex" property of the UIDatacomponent
-        // to be correct as we iterate through the rows.
-        // Stop rendering children and close out the "tbody" element if the "rowAvailable"
-        // property of the UIData returned false.
-
-        // XXX: we are only rendering one row.
-        // Output a "tr" element.
-        Element trEle = createElement(IHTMLConstants.TAG_TR);
-        tbodyEle.appendChild(trEle);
-
-        // Output the value of the "rowClasses" per the attribute description below.
-        String rowClasses = tableEle.getAttribute(IJSFConstants.ATTR_ROWCLASSES);
-        if (rowClasses != null)
-        {
-            // as we are only rendering one row, so we only get the first rowclass
-            StringTokenizer tokenizer = new StringTokenizer(rowClasses, ", "); //$NON-NLS-1$
-            if (tokenizer.hasMoreTokens())
-            {
-                trEle.setAttribute(IHTMLConstants.ATTR_CLASS, tokenizer.nextToken());
-            }
-        }
-
-        // --------------------------------- move this part into ColumnsTagConverter. ------------------------------
-        String columnClassesAttr = hostEle.getAttribute(IJSFConstants.ATTR_COLUMNCLASSES);
-        List columnClasses = new ArrayList();
-        if (columnClassesAttr != null)
-        {
-            StringTokenizer tokenizer = new StringTokenizer(columnClassesAttr, ", "); //$NON-NLS-1$
-            while (tokenizer.hasMoreTokens())
-            {
-                columnClasses.add(tokenizer.nextToken());
-            }
-        }
-        // --- create column's td in column tag converter, here
-        // For each UIColumn child, output a "td" element, attaching the value of the
-        // "columnClasses" attribute of the UIData component per the attribute description below.
-        // Recursively encode each child of each UIColumn child. Close out the "td" element.
-        // When done with the row, close out the "tr" element. When done with all the rows,
-        // close out the "tbody" element.
-        for (int i = 0, size = columns.size(); i < size; i++)
-        {
-            Element column = (Element) columns.get(i);
-            addChild(column, new ConvertPosition(trEle, i));
-            //            Element tdEle = createElement("td");
-            //            if (i < columnClasses.size())
-            //            {
-            //                tdEle.setAttribute("class", (String) columnClasses.get(i));
-            //            }
-            //
-            //            trEle.appendChild(tdEle);
-            //            // put the "h:column" under td.
-            //            addChild(column, new ConvertPosition(tdEle, 0));
-        }
-    }
-
-    /**
-     * @param hostEle
-     * @param tableEle
-     * @param columns 
-     * @param header true means header, false means footer
-     */
-    protected void convertTHeader(Element hostEle, Element tableEle, List columns, boolean header)
-    {
-        // If the UIData component has a "header" facet, or any of the child UIColumn
-        // components has a "header" facet, render a "thead" element.
-        Element facetEle = JSFDOMUtil.findFacet(hostEle, header ? FACET_NAME_HEADER : "footer"); //$NON-NLS-1$
-        boolean hasColHeader = false;
-        for (int i = 0, size = columns.size(); i < size; i++)
-        {
-            Element uicolumnEle = (Element) columns.get(i);
-            Element columnFacet = JSFDOMUtil.findFacet(uicolumnEle, header ? FACET_NAME_HEADER : "footer"); //$NON-NLS-1$
-            if (columnFacet != null)
-            {
-                hasColHeader = true;
-                break;
-            }
-        }
-
-        if (facetEle == null && !hasColHeader)
-        {
-            return;
-        }
-        Element theadEle = createElement(header ? IHTMLConstants.TAG_THEAD : IHTMLConstants.TAG_TFOOT);
-        tableEle.appendChild(theadEle);
-
-        // If the UIData component has a "header" facet, encode its contents inside of
-        // "tr" and "th" elements, respectively.
-        if (facetEle != null)
-        {
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-            Element thEle = createElement(header ? IHTMLConstants.TAG_TH : IHTMLConstants.TAG_TD);
-            trEle.appendChild(thEle);
-            // Output the value of the "headerClass" attribute of the UIData component,
-            // if present, as the value of the "class" attribute on the "th".
-            ConverterUtil.copyAttribute(hostEle, header ? IJSFConstants.ATTR_HEADERCLASS
-                    : IJSFConstants.ATTR_FOOTERCLASS, thEle, IHTMLConstants.ATTR_CLASS);
-            // Output the number of child UIColumn components of theUIData component as
-            // the value of the "colspan" attribute on the "th".
-            if (columns.size() > 0)
-            {
-                thEle.setAttribute(IHTMLConstants.ATTR_COLSPAN, String.valueOf(columns.size()));
-            }
-
-            addChild(facetEle, new ConvertPosition(thEle, 0));
-        }
-        // Output "colgroup" as the value of the "scope" attribute on the "th" element.
-
-        // If any of the child UIColumn components has a "header" facet render a "tr"
-        // element.
-        if (hasColHeader)
-        {
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-
-            for (int i = 0, size = columns.size(); i < size; i++)
-            {
-                Element uicolumnEle = (Element) columns.get(i);
-                Element columnFacet = JSFDOMUtil.findFacet(uicolumnEle, header ? FACET_NAME_HEADER : "footer"); //$NON-NLS-1$
-                Element thEle = createElement(header ? IHTMLConstants.TAG_TH : IHTMLConstants.TAG_TD);
-                trEle.appendChild(thEle);
-                if (columnFacet != null)
-                {
-                    // For eachUIColumn that actually has a "header" facet, render it inside of
-                    // a "th" element.
-                    addChild(columnFacet, new ConvertPosition(thEle, 0));
-                }
-                else
-                {
-                    // Columns that don't have a "header" facet cause an empty "th" element to be
-                    // rendered.
-                }
-
-                // Output the value of the "headerClass" attribute of the UIData component,
-                // if present, as the value of the "class" attribute on the "th".
-                ConverterUtil.copyAttribute(hostEle, header ? IJSFConstants.ATTR_HEADERCLASS
-                        : IJSFConstants.ATTR_FOOTERCLASS, thEle, IHTMLConstants.ATTR_CLASS);
-
-                // Output "col" as the value of the "colgroup" attribute on the "th" element.
-            }
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needTableDecorator()
-     */
-    public boolean needTableDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/GraphicImageTagConveter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/GraphicImageTagConveter.java
deleted file mode 100644
index bc39f32..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/GraphicImageTagConveter.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class GraphicImageTagConveter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public GraphicImageTagConveter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "img" element. 
-        Element imgEle = createElement(IHTMLConstants.TAG_IMG);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, imgEle, null);
-
-        // If the "styleClass" attribute is specified, render its value as 
-        // the value of the "class" attribute. 
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, imgEle, IHTMLConstants.ATTR_CLASS);
-        imgEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // Render the clientId as the value of the "id" attribute. 
-        // Render the value of the component as the value of the "src" 
-        // attribute, after passing it to the getResourceUR() method 
-        // of the ViewHandler  for this application, and passing the 
-        // result through the encodeResourceURL() method of the 
-        // ExternalContext. 
-        String src = getSrc(hostEle);
-        if (src != null)
-        {
-            imgEle.setAttribute(IHTMLConstants.ATTR_SRC, src);
-        }
-        return imgEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getSrc(Element hostEle)
-    {
-        // TODO: need revisit the spec for special URL converting
-        // for this element
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value == null)
-        {
-            // Context-relative URL to retrieve the resource associated 
-            // with this component. This is an alias for the "value" 
-            // property.
-            value = hostEle.getAttribute(IJSFConstants.ATTR_URL);
-        }
-        if (value != null)
-        {
-            value = mapValue(value);
-            value = mapURL(value);
-        }
-        return value;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTagConverter.java
deleted file mode 100644
index bb774a3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTagConverter.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * This is for inputHidden, inputSecret, inputText.
- * 
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class InputTagConverter extends AbstractTagConverter
-{
-
-    private String _inputType;
-
-    /**
-     * @param host
-     * @param inputType 
-     */
-    public InputTagConverter(Element host, String inputType)
-    {
-        super(host);
-        _inputType = inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "input" element of "type" "text".
-        Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-        JSFConverterUtil.copyAllAttributes(hostEle, inputEle, null);
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, inputEle, IHTMLConstants.ATTR_CLASS);
-        inputEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, getInputType());
-
-        inputEle.removeAttribute(IJSFConstants.ATTR_VALUE);
-        inputEle.setAttribute(IJSFConstants.ATTR_VALUE, getValue(hostEle));
-
-        return inputEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getValue(Element hostEle)
-    {
-        String valueAttr = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (valueAttr == null)
-        {
-            String name = hostEle.getLocalName();
-            return name.substring(0, 1).toUpperCase() + name.substring(1);
-        }
-        return mapValue(valueAttr);
-    }
-
-    /**
-     * @return
-     */
-    private String getInputType()
-    {
-        return _inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTextAreaTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTextAreaTagConverter.java
deleted file mode 100644
index b43d613..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/InputTextAreaTagConverter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class InputTextAreaTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public InputTextAreaTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "textarea" element.
-        Element textareaEle = createElement(IHTMLConstants.TAG_TEXTAREA);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, textareaEle, null);
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, textareaEle, IHTMLConstants.ATTR_CLASS);
-        textareaEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        String value = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (value != null && value.length() > 0)
-        {
-            value = mapValue(value);
-            textareaEle.appendChild(createText(value));
-        }
-
-        return textareaEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFFormTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFFormTagConverter.java
deleted file mode 100644
index 9db6c14..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFFormTagConverter.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class JSFFormTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public JSFFormTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        // The value of the "method" attribute must be "post". The value of the 
-        // "action" attribute must be the result of passing the view identifier 
-        // of the current view to the getActionURL()  method of the ViewHandler for 
-        // this application, then passing that String to the encodeActionURL()  
-        // method on the ExternalContext. 
-        // XXX: as our tag converter only serve designer and preview, so we only
-        // deal with attributes relating to visual effect. Ignoring "method", "action",
-        // etc.
-        Element hostEle = getHostElement();
-
-        Element formEle = createElement(IHTMLConstants.TAG_FORM);
-
-        // If the "styleClass" attribute is specified, render its value as the 
-        // value of the "class" attribute. 
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, formEle, IHTMLConstants.ATTR_CLASS);
-        formEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // pass through other attributes
-        // XXX: handle ignored attributes here.
-        JSFConverterUtil.copyAllAttributes(hostEle, formEle, null);
-
-        // Render all the necessary hidden fields for all commandLink instances 
-        // in the page just before the close of the "form" element.
-        // XXX: ignored for these hidden fields.
-
-        // children of old <h:form> should still be children.
-        this.copyChildren(hostEle, formEle);
-
-        return formEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFHTMLConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFHTMLConverterFactory.java
deleted file mode 100644
index 29a48e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/JSFHTMLConverterFactory.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.DTTagConverter;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class JSFHTMLConverterFactory implements IConverterFactory
-{
-    private final MyLabelProvider  _labelProvider;
-    
-    // TODO C.B: this is a transitional step so that we can incrementally add
-    // new meta-data driven tag converter one-by-one without breaking other existing
-    // if a tag name is in this set, the new DTTagConverter will be created for it,
-    // else, revert to original one
-    private final static Set                   _dtConversionSupported;
-    
-    static
-    {
-        _dtConversionSupported = new HashSet();
-        /*
-        _dtConversionSupported.add(IJSFConstants.TAG_FORM);
-        _dtConversionSupported.add(IJSFConstants.TAG_INPUTTEXT);
-        _dtConversionSupported.add(IJSFConstants.TAG_INPUTSECRET);
-        _dtConversionSupported.add(IJSFConstants.TAG_INPUTTEXTAREA);
-        _dtConversionSupported.add(IJSFConstants.TAG_OUTPUTTEXT);
-        _dtConversionSupported.add(IJSFConstants.TAG_OUTPUTLABEL);
-        _dtConversionSupported.add(IJSFConstants.TAG_GRAPHICIMAGE);
-        _dtConversionSupported.add(IJSFConstants.TAG_PANELGRID);
-        */
-    }
-    
-    /**
-     * 
-     */
-    public JSFHTMLConverterFactory()
-    {
-        super();
-        _labelProvider = new MyLabelProvider();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-     */
-    public ITagConverter createConverter(Element element, int mode)
-    {
-        ITagConverter converter;
-        String tagName = element.getLocalName();
-        
-        if (_dtConversionSupported.contains(tagName))
-        {
-            converter = createDTTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_COLUMN.equalsIgnoreCase(tagName))
-        {
-            converter = new ColumnTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_COMMANDBUTTON.equalsIgnoreCase(tagName))
-        {
-            converter = new CommandButtonTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_COMMANDLINK.equalsIgnoreCase(tagName))
-        {
-            converter = new CommandLinkTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_DATATABLE.equalsIgnoreCase(tagName))
-        {
-            converter = new DataTableTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_FORM.equalsIgnoreCase(tagName))
-        {
-            converter = new JSFFormTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_GRAPHICIMAGE.equalsIgnoreCase(tagName))
-        {
-            converter = new GraphicImageTagConveter(element);
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equalsIgnoreCase(tagName))
-        {
-            return new HiddenTagConverter(element, _labelProvider);
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equalsIgnoreCase(tagName))
-        {
-            converter = new InputTagConverter(element, "password"); //$NON-NLS-1$
-        }
-        else if (IJSFConstants.TAG_INPUTTEXT.equalsIgnoreCase(tagName))
-        {
-            converter = new InputTagConverter(element, "text"); //$NON-NLS-1$
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equalsIgnoreCase(tagName))
-        {
-            converter = new InputTextAreaTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_MESSAGE.equalsIgnoreCase(tagName)
-        || IJSFConstants.TAG_MESSAGES.equalsIgnoreCase(tagName))
-        {
-            converter = new HiddenTagConverter(element, _labelProvider);
-        }
-        else if (IJSFConstants.TAG_OUTPUTTEXT.equalsIgnoreCase(tagName)
-        || IJSFConstants.TAG_OUTPUTFORMAT.equalsIgnoreCase(tagName))
-        {
-            converter = new OutputTextTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_OUTPUTLABEL.equalsIgnoreCase(tagName))
-        {
-            converter = new OutputLabelTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_OUTPUTLINK.equalsIgnoreCase(tagName))
-        {
-            converter = new OutputLinkTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_PANELGRID.equalsIgnoreCase(tagName))
-        {
-            converter = new PanelGridTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_PANELGROUP.equalsIgnoreCase(tagName))
-        {
-            converter = new PanelGroupTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTBOOLEANCHECKBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectBooleanCheckboxTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTMANYCHECKBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new TableBasedSelectTagConverter(element, "checkbox"); //$NON-NLS-1$
-        }
-        else if (IJSFConstants.TAG_SELECTMANYLISTBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectManyListboxTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTMANYMENU.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectManyMenuTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTONELISTBOX.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectOneListboxTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTONEMENU.equalsIgnoreCase(tagName))
-        {
-            converter = new SelectOneMenuTagConverter(element);
-        }
-        else if (IJSFConstants.TAG_SELECTONERADIO.equalsIgnoreCase(tagName))
-        {
-            converter = new TableBasedSelectTagConverter(element, "radio"); //$NON-NLS-1$
-        }
-        else
-        {
-            return null;
-        }
-        converter.setMode(mode);
-        return converter;
-    }
-
-    private static class MyLabelProvider extends LabelProvider
-    {
-        public Image getImage(Object element) 
-        {
-            if (element instanceof ITagConverter)
-            {
-                final Element hostElement = ((ITagConverter)element).getHostElement();
-                IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(hostElement);
-                if (context != null){   
-                	IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-                	if (wsResolver != null){
-                		return TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),ITLDConstants.URI_JSF_HTML, hostElement.getLocalName());
-                	}
-                }
-            }
-            
-            return null;
-        }
-    }
-
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_HTML;
-    }
-    
-    private ITagConverter createDTTagConverter(Element element)
-    {
-        return new DTTagConverter(element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessageTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessageTagConverter.java
deleted file mode 100644
index 47a995d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessageTagConverter.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.util.JSFUIPluginResourcesUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class MessageTagConverter extends AbstractTagConverter
-{
-    private static final String MESSAGE_CONTENT = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultValue"); //$NON-NLS-1$
-    private static final String MESSAGE_TOOLTIP = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultTooltip"); //$NON-NLS-1$
-
-    /**
-     * @param host
-     */
-    public MessageTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present, 
-        // render a "span" element. 
-        // XXX: to make things simpler, we always create a span
-        Element spanEle = createElement(IHTMLConstants.TAG_SPAN);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-
-        // If the "styleClass" attribute is present, 
-        // output the value of the "styleClass" attribute as the value of the "class" attribute on the "span" element
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        String fatalStyle = hostEle.getAttribute(IJSFConstants.ATTR_FATALSTYLE);
-        String errorStyle = hostEle.getAttribute(IJSFConstants.ATTR_ERRORSTYLE);
-        String warnStyle = hostEle.getAttribute(IJSFConstants.ATTR_WARNSTYLE);
-        String infoStyle = hostEle.getAttribute(IJSFConstants.ATTR_INFOSTYLE);
-        String fatalClass = hostEle.getAttribute(IJSFConstants.ATTR_FATALCLASS);
-        String errorClass = hostEle.getAttribute(IJSFConstants.ATTR_ERRORCLASS);
-        String warnClass = hostEle.getAttribute(IJSFConstants.ATTR_WARNCLASS);
-        String infoClass = hostEle.getAttribute(IJSFConstants.ATTR_INFOCLASS);
-
-        if ((!"".equals(fatalStyle)) && (fatalStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, fatalStyle);
-        }
-        else if ((!"".equals(errorStyle)) && (errorStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, errorStyle);
-        }
-        else if ((!"".equals(warnStyle)) && (warnStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, warnStyle);
-        }
-        else if ((!"".equals(infoStyle)) && (infoStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, infoStyle);
-        }
-
-        if ((!"".equals(fatalClass)) && (fatalClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, fatalClass);
-        }
-        else if ((!"".equals(errorClass)) && (errorClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, errorClass);
-        }
-        else if ((!"".equals(warnClass)) && (warnClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, warnClass);
-        }
-        else if ((!"".equals(infoClass)) && (infoClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, infoClass);
-        }
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        //If the "tooltip" attribute is present with the value of "true", and so does 
-        //the "showSummary",then output the "summary" as the value of the "title" attribute on the "span". 
-        String hasToolTip = hostEle.getAttribute(IJSFConstants.ATTR_TOOLTIP);
-        String showSummary = hostEle.getAttribute(IJSFConstants.ATTR_SHOWSUMMARY);
-        if ("true".equalsIgnoreCase(hasToolTip)) //$NON-NLS-1$
-        {
-            if ("true".equalsIgnoreCase(showSummary)) //$NON-NLS-1$
-            {
-                spanEle.setAttribute("title", MESSAGE_TOOLTIP); //$NON-NLS-1$
-            }
-        }
-        Text text = createText(MESSAGE_CONTENT);
-        spanEle.appendChild(text);
-
-        return spanEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessagesTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessagesTagConverter.java
deleted file mode 100644
index c604d11..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/MessagesTagConverter.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.util.JSFUIPluginResourcesUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class MessagesTagConverter extends AbstractTagConverter
-{
-    private static final String MESSAGE_CONTENT = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultValue"); //$NON-NLS-1$
-    private static final String MESSAGE_TOOLTIP = JSFUIPluginResourcesUtil.getInstance().getString(
-                                                        "MessageTagConverter.defaultTooltip"); //$NON-NLS-1$
-
-    /**
-     * @param host
-     */
-    public MessagesTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        String layout = hostEle.getAttribute(IJSFConstants.ATTR_LAYOUT);
-        if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(layout))
-        {
-            Element table = createElement(IHTMLConstants.TAG_TABLE);
-            table.setAttribute(IHTMLConstants.ATTR_BORDER, "1"); //$NON-NLS-1$
-            for (int i = 0; i < 2; i++)
-            {
-                Element tr = createElement(IHTMLConstants.TAG_TR);
-                Element td = createElement(IHTMLConstants.TAG_TD);
-                Element span = createSpan();
-                td.appendChild(span);
-                tr.appendChild(td);
-                table.appendChild(tr);
-            }
-            return table;
-        }
-        Element ul = createElement(IHTMLConstants.TAG_UL);
-        for (int i = 0; i < 2; i++)
-        {
-            Element li = createElement(IHTMLConstants.TAG_LI);
-            Element span = createSpan();
-            li.appendChild(span);
-            ul.appendChild(li);
-        }
-        return ul;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-
-    private Element createSpan()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present, 
-        // render a "span" element. 
-        // XXX: to make things simpler, we always create a span
-        Element spanEle = createElement(IHTMLConstants.TAG_SPAN);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-
-        // If the "styleClass" attribute is present, 
-        // output the value of the "styleClass" attribute as the value of the "class" attribute on the "span" element
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        String fatalStyle = hostEle.getAttribute(IJSFConstants.ATTR_FATALSTYLE);
-        String errorStyle = hostEle.getAttribute(IJSFConstants.ATTR_ERRORSTYLE);
-        String warnStyle = hostEle.getAttribute(IJSFConstants.ATTR_WARNSTYLE);
-        String infoStyle = hostEle.getAttribute(IJSFConstants.ATTR_INFOSTYLE);
-        String fatalClass = hostEle.getAttribute(IJSFConstants.ATTR_FATALCLASS);
-        String errorClass = hostEle.getAttribute(IJSFConstants.ATTR_ERRORCLASS);
-        String warnClass = hostEle.getAttribute(IJSFConstants.ATTR_WARNCLASS);
-        String infoClass = hostEle.getAttribute(IJSFConstants.ATTR_INFOCLASS);
-
-        if ((!"".equals(fatalStyle)) && (fatalStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, fatalStyle);
-        }
-        else if ((!"".equals(errorStyle)) && (errorStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, errorStyle);
-        }
-        else if ((!"".equals(warnStyle)) && (warnStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, warnStyle);
-        }
-        else if ((!"".equals(infoStyle)) && (infoStyle != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IHTMLConstants.ATTR_STYLE, infoStyle);
-        }
-
-        if ((!"".equals(fatalClass)) && (fatalClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, fatalClass);
-        }
-        else if ((!"".equals(errorClass)) && (errorClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, errorClass);
-        }
-        else if ((!"".equals(warnClass)) && (warnClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, warnClass);
-        }
-        else if ((!"".equals(infoClass)) && (infoClass != null)) //$NON-NLS-1$
-        {
-            spanEle.setAttribute(IJSFConstants.ATTR_STYLECLASS, infoClass);
-        }
-
-        //If the "tooltip" attribute is present with the value of "true", and so does 
-        //the "showSummary",then output the "summary" as the value of the "title" attribute on the "span". 
-        String hasToolTip = hostEle.getAttribute(IJSFConstants.ATTR_TOOLTIP);
-        String showSummary = hostEle.getAttribute(IJSFConstants.ATTR_SHOWSUMMARY);
-        if ("true".equalsIgnoreCase(hasToolTip)) //$NON-NLS-1$
-        {
-            if ("true".equalsIgnoreCase(showSummary)) //$NON-NLS-1$
-            {
-                spanEle.setAttribute(IHTMLConstants.ATTR_TITLE, MESSAGE_TOOLTIP);
-            }
-        }
-        Text text = createText(MESSAGE_CONTENT);
-        spanEle.appendChild(text);
-
-        return spanEle;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLabelTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLabelTagConverter.java
deleted file mode 100644
index c7eaad3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLabelTagConverter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class OutputLabelTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public OutputLabelTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        Element labelEle = createElement(IHTMLConstants.TAG_LABEL);
-
-        JSFConverterUtil.copyAllAttributes(hostEle, labelEle, null);
-
-        // If the "styleClass" attribute is present, 
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, labelEle, IHTMLConstants.ATTR_CLASS);
-        labelEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        //        String value = getValue(hostEle);
-        //        Text	textNode = createText(value);
-        //        labelEle.appendChild(textNode);
-
-        int index = 0;
-        Node child = hostEle.getFirstChild();
-        if (hostEle.hasChildNodes())
-        {
-            for (; child != null; child = child.getNextSibling())
-            {
-                if (!shouldIgnore(child))
-                {
-                    if (child instanceof Element && JSFDOMUtil.isUIParameter((Element) child))
-                    {
-                        // skip
-                    }
-                    else
-                    {
-                        addChild(child, new ConvertPosition(labelEle, index++));
-                    }
-                }
-            }
-        }
-        else
-        {
-            labelEle.appendChild(createText(getDefaultValue()));
-        }
-
-        return labelEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getDefaultValue()
-    {
-        String name = IJSFConstants.TAG_OUTPUTLABEL;
-        
-        return name.substring(0, 1).toUpperCase() + name.substring(1);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLinkTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLinkTagConverter.java
deleted file mode 100644
index 3c45703..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputLinkTagConverter.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class OutputLinkTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public OutputLinkTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        Element aEle = createElement(IHTMLConstants.TAG_A);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, aEle, null);
-
-        // If the "styleClass" attribute is present,
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, aEle, IHTMLConstants.ATTR_CLASS);
-        aEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // value should be mapped to href, but it won't affect visual
-        // so use "#"
-        aEle.setAttribute(IHTMLConstants.ATTR_HREF, "#"); //$NON-NLS-1$
-
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_VALUE, aEle, IHTMLConstants.ATTR_HREF);
-        aEle.removeAttribute(IJSFConstants.ATTR_VALUE);
-
-        // Extend the container border a little to make it selectable
-        if (!isPreviewMode())
-        {
-            String style = aEle.getAttribute(IHTMLConstants.ATTR_STYLE);
-            style = "padding:0.3em;" + style; //$NON-NLS-1$
-            aEle.setAttribute(IHTMLConstants.ATTR_STYLE, style);
-        }
-
-        int index = 0;
-        Node child = hostEle.getFirstChild();
-        if (hostEle.hasChildNodes())
-        {
-            for (; child != null; child = child.getNextSibling())
-            {
-                if (!shouldIgnore(child))
-                {
-                    if (child instanceof Element && JSFDOMUtil.isUIParameter((Element) child))
-                    {
-                        // skip
-                    }
-                    else
-                    {
-                        addChild(child, new ConvertPosition(aEle, index++));
-                    }
-                }
-            }
-        }
-        if (ConverterUtil.isEmptyContainer(hostEle) && !hostEle.hasAttribute(IJSFConstants.ATTR_VALUE))
-        {
-            aEle.appendChild(createText(getDefaultValue()));
-        }
-        return aEle;
-    }
-
-    private String getDefaultValue()
-    {
-        String name = IJSFConstants.TAG_OUTPUTLINK;
-
-        return name.substring(0, 1).toUpperCase() + name.substring(1);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputTextTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputTextTagConverter.java
deleted file mode 100644
index f43ae97..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/OutputTextTagConverter.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class OutputTextTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public OutputTextTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present, 
-        // render a "span" element. 
-        // XXX: to make things simpler, we always create a span
-        Element spanEle = createElement(IHTMLConstants.TAG_SPAN);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-        
-        // If the "styleClass" attribute is present, 
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-        
-        spanEle.removeAttribute(IJSFConstants.ATTR_VALUE);
-
-        // If the "escape" attribute is not present, or it is present and 
-        // its value is "true" all angle brackets should be converted to the 
-        // ampersand xx semicolon syntax when rendering the value of the "value" 
-        // attribute as the value of the component. If the "escape" attribute is 
-        // present and is "false" the value of the component should be rendered 
-        // as text without escaping. 
-        String value = getValue(hostEle);
-        Text	textNode = createText(value);
-        spanEle.appendChild(textNode);
-
-        return spanEle;
-    }
-
-    /**
-     * @param hostEle
-     * @return
-     */
-    private String getValue(Element hostEle)
-    {
-        String valueAttr = hostEle.getAttribute(IJSFConstants.ATTR_VALUE);
-        if (valueAttr == null)
-        {
-            String name = hostEle.getLocalName();
-            return name.substring(0, 1).toUpperCase() + name.substring(1);
-        }
-        return mapValue(valueAttr);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGridTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGridTagConverter.java
deleted file mode 100644
index f9ff8e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGridTagConverter.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class PanelGridTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public PanelGridTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.visualtag.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element panelGridEle = this.getHostElement();
-
-        //  Renders an HTML "table" element, conforming to the rules in the HTML 401 specification.
-        Element tableEle = createElement(IHTMLConstants.TAG_TABLE);
-
-        // Render the pass-through attributes in the table below.
-        // TODO: need handle ignored attributes here. But as they don't conflict
-        // with standard table attributes, so its ok that we leave it later.
-        JSFConverterUtil.copyAllAttributes(panelGridEle, tableEle, null);
-        
-        // If the "styleClass" attribute is specified, render its value as the value of the "class" attribute
-        JSFConverterUtil.copyAttribute(panelGridEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);
-        tableEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(panelGridEle, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-
-        // Render the "header" facet, if present, inside of "thead", "tr", and "th" elements, nested in that order.
-        Element facet = JSFDOMUtil.findFacet(panelGridEle, "header"); //$NON-NLS-1$
-        if (facet != null)
-        {
-            // we need render a thead here
-            Element theadEle = createElement(IHTMLConstants.TAG_THEAD);
-            tableEle.appendChild(theadEle);
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-            Element thEle = createElement(IHTMLConstants.TAG_TH);
-            trEle.appendChild(thEle);
-            // If the "headerClass" attribute is specifed, render its value as the value of the "class" attribute on
-            // the "th" element.
-            String headerClass = panelGridEle.getAttribute(IJSFConstants.ATTR_HEADERCLASS);
-            if (headerClass != null && headerClass.length() > 0)
-            {
-                thEle.setAttribute(IHTMLConstants.ATTR_CLASS, headerClass);
-            }
-            // Render the value of the "columns" attribute as the value of the "colspan" attribute on the "th" element.
-            thEle.setAttribute(IHTMLConstants.ATTR_COLSPAN, String.valueOf(columns));
-            addChild(facet, new ConvertPosition(thEle, 0));
-        }
-
-        // Render the "footer" facet if present, using similar logic to the rendering of
-        // the "header", but replacing "thead" with "tfoot", "th" with "td", and "headerClass"
-        // with "footerClass".
-        facet = JSFDOMUtil.findFacet(panelGridEle, "footer"); //$NON-NLS-1$
-        if (facet != null)
-        {
-            // we need render a thead here
-            Element theadEle = createElement(IHTMLConstants.TAG_TFOOT);
-            tableEle.appendChild(theadEle);
-            Element trEle = createElement(IHTMLConstants.TAG_TR);
-            theadEle.appendChild(trEle);
-            Element tdEle = createElement(IHTMLConstants.TAG_TD);
-            trEle.appendChild(tdEle);
-            // If the "headerClass" attribute is specifed, render its value as the value of the "class" attribute on
-            // the "th" element.
-            String footerClass = panelGridEle.getAttribute(IJSFConstants.ATTR_FOOTERCLASS);
-            if (footerClass != null && footerClass.length() > 0)
-            {
-                tdEle.setAttribute(IHTMLConstants.ATTR_CLASS, footerClass);
-            }
-            // Render the value of the "columns" attribute as the value of the "colspan" attribute on the "th" element.
-            tdEle.setAttribute(IHTMLConstants.ATTR_COLSPAN, String.valueOf(columns));
-            addChild(facet, new ConvertPosition(tdEle, 0));
-        }
-
-        List rowclasses = new ArrayList();
-        String rowclassesattr = panelGridEle.getAttribute(IJSFConstants.ATTR_ROWCLASSES);
-        if (rowclassesattr != null)
-        {
-            StringTokenizer tokenizer = new StringTokenizer(rowclassesattr, ", "); //$NON-NLS-1$
-            while (tokenizer.hasMoreTokens())
-            {
-                rowclasses.add(tokenizer.nextToken());
-            }
-        }
-
-        List columnclasses = new ArrayList();
-        String columnclassattr = panelGridEle.getAttribute(IJSFConstants.ATTR_COLUMNCLASSES);
-        if (columnclassattr != null)
-        {
-            StringTokenizer tokenizer = new StringTokenizer(columnclassattr, ", "); //$NON-NLS-1$
-            while (tokenizer.hasMoreTokens())
-            {
-                columnclasses.add(tokenizer.nextToken());
-            }
-        }
-
-        // Render the children of the UIPanel component inside of a "tbody" element.
-        // Render the children based on the value of the "columns" attribute, creating a new
-        // row each time a "columns" worth of children have been rendered. Each child is rendered
-        // inside of a "td" element. If a child has "rendered==false" it is not rendered,
-        // and the column counter must not be incremented.
-        Element tbody = createElement(IHTMLConstants.TAG_TBODY);
-        tableEle.appendChild(tbody);
-
-        List uipanelChildren = JSFDOMUtil.getUIComponentChildren(panelGridEle);
-        Element currentTr = null;
-        int nextRow = 0; // for rowclasses
-        for (int i = 0; i < uipanelChildren.size(); i++)
-        {
-            int columnIndex = i % columns;
-            if (columnIndex == 0)
-            {
-                currentTr = createElement(IHTMLConstants.TAG_TR);
-                if (!rowclasses.isEmpty())
-                {
-                    currentTr.setAttribute(IHTMLConstants.ATTR_CLASS, (String) rowclasses.get(nextRow));
-                    nextRow = (nextRow + 1) % rowclasses.size();
-                }
-                tbody.appendChild(currentTr);
-            }
-            Element uichild = (Element) uipanelChildren.get(i);
-            Element td = createElement(IHTMLConstants.TAG_TD);
-            if (columnIndex < columnclasses.size())
-            {
-                td.setAttribute(IHTMLConstants.ATTR_CLASS, (String) columnclasses.get(columnIndex));
-            }
-            currentTr.appendChild(td);
-            this.addChild(uichild, new ConvertPosition(td, 0));
-        }
-
-        return (tableEle);
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needTableDecorator()
-     */
-    public boolean needTableDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGroupTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGroupTagConverter.java
deleted file mode 100644
index ca592cc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/PanelGroupTagConverter.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class PanelGroupTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public PanelGroupTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // If the "styleClass" or "style" attributes are present,
-        // render a "span" element.
-        // XXX: for page designer to have the panelGroup to always take up space,
-        // we use "div".
-        Element spanEle = createElement(IHTMLConstants.TAG_DIV);
-
-        // If the "style" attribute is present, pass it thru.
-        // XXX: we are passing all the attributes through, since other attribute
-        // don't conflict with html attributes.
-        JSFConverterUtil.copyAllAttributes(hostEle, spanEle, null);
-
-        // If the "styleClass" attribute is present,
-        // render its value as the value of the "class" attribute.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, spanEle, IHTMLConstants.ATTR_CLASS);
-        spanEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        copyChildren(hostEle, spanEle);
-        return spanEle;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return false;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBasedTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBasedTagConverter.java
deleted file mode 100644
index e7f817e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBasedTagConverter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public abstract class SelectBasedTagConverter extends SelectTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectBasedTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Render an HTML "select" element.
-        Element selectEle = createElement(IHTMLConstants.TAG_SELECT);
-
-        // Render the clientId of the component as the value of the "name" attribute.
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_ID, selectEle, IHTMLConstants.ATTR_NAME);
-
-        // XXX: handle ignore
-        JSFConverterUtil.copyAllAttributes(hostEle, selectEle, null);
-        
-//      If the "styleClass" attribute is specified, render its value as the value of 
-        // the "class" attribute on the "select" element.
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, selectEle, IHTMLConstants.ATTR_CLASS);
-        selectEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        // child class may generated different multiple and size attribute
-        handleMultipleAndSize(hostEle, selectEle);
-
-        // next generated the options under the <select>, so they can also be displayed.
-        List selectItems = this.getSelectItems(hostEle);
-        for (int i=0, size=selectItems.size(); i<size; i++)
-        {
-            SelectItemModel item = (SelectItemModel) selectItems.get(i);
-            Element option = createElement(IHTMLConstants.TAG_OPTION);
-            option.setAttribute(IHTMLConstants.ATTR_VALUE, item.getItemValue());
-            Text textNode = createText(item.getDisplayString());
-            option.appendChild(textNode);
-            selectEle.appendChild(option);
-        }
-
-        return (selectEle);
-    }
-
-    /**
-     * @param hostEle
-     * @param selectEle
-     */
-    protected abstract void handleMultipleAndSize(Element hostEle, Element selectEle);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBooleanCheckboxTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBooleanCheckboxTagConverter.java
deleted file mode 100644
index 26c512a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectBooleanCheckboxTagConverter.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.JSFConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectBooleanCheckboxTagConverter extends AbstractTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectBooleanCheckboxTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-        // Renders an HTML "input" element of type "checkbox".
-        Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-        JSFConverterUtil.copyAllAttributes(hostEle, inputEle, null);
-        JSFConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, inputEle, IHTMLConstants.ATTR_CLASS);
-        inputEle.removeAttribute(IJSFConstants.ATTR_STYLECLASS);
-
-        inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, "checkbox"); //$NON-NLS-1$
-        
-        if ("true".equalsIgnoreCase(inputEle.getAttribute(IHTMLConstants.ATTR_VALUE))) //$NON-NLS-1$
-        {
-            inputEle.setAttribute(IHTMLConstants.ATTR_CHECKED,"checked"); //$NON-NLS-1$
-        }
-        return inputEle;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectItemModel.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectItemModel.java
deleted file mode 100644
index b0493c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectItemModel.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-/**
- * This class emulate a javax.faces.model.SelectItem
- * 
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectItemModel
-{
-    private String _description;
-    private String _label;
-    private String _itemValue;
-    private String _value;
-    private String _id;
-    private boolean _disabled;
-    
-    /**
-     * @return Returns the disabled.
-     */
-    public boolean isDisabled()
-    {
-        return _disabled;
-    }
-    
-    /**
-     * @param disabled The disabled to set.
-     */
-    public void setDisabled(boolean disabled)
-    {
-        this._disabled = disabled;
-    }
-    
-    /**
-     * Return a description of this item, for use in development tools.
-     * @return the description
-     */ 
-    public String 	getDescription()
-    {
-        return _description;
-    }
-
-    /**
-     * Return the label of this item, to be rendered visibly for the user.
-     * @return the label for this item
-     */
-    public String 	getLabel()
-    {
-        return _label;
-    }
-
-    /**
-	 * Set the description of this item, for use in development tools.
-	 * @param description
-	 */
-    public void 	setDescription(java.lang.String description)
-    {
-        _description = description;
-    }
-
-    /**
-	 * Set the label of this item, to be rendered visibly for the user.
-	 * @param label
-	 */
-    public void 	setLabel(java.lang.String label)
-    {
-        this._label = label;
-    }
-    /**
-     * @return the item value
-     */
-    public String getItemValue()
-    {
-        return _itemValue;
-    }
-
-    /**
-     * @param itemValue
-     */
-    public void setItemValue(String itemValue)
-    {
-        this._itemValue = itemValue;
-    }
-
-    /**
-     * @return the value
-     */
-    public String getValue()
-    {
-        return _value;
-    }
-
-    /**
-     * @param value
-     */
-    public void setValue(String value)
-    {
-        this._value = value;
-    }
-
-    /**
-     * @return the id
-     */
-    public String getId()
-    {
-        return _id;
-    }
-
-    /**
-     * @param id
-     */
-    public void setId(String id)
-    {
-        _id = id;
-    }
-
-    /**
-     * @return the display string
-     */
-    public String getDisplayString()
-    {
-        if (_label != null && _label.length() > 0)
-        {
-            return _label;
-        }
-        else if (_value != null && _value.length() > 0)
-        {
-            return _value;
-        }
-        else if (_description != null && _description.length() > 0)
-        {
-            return _description;
-        }
-        else if (_itemValue != null && _itemValue.length() > 0)
-        {
-            return _itemValue;
-        }
-        else
-        {
-            return "SelectItem"; //$NON-NLS-1$
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyListboxTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyListboxTagConverter.java
deleted file mode 100644
index 32f404d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyListboxTagConverter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectManyListboxTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectManyListboxTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // If the component is a UISelectMany instance, render "multiple" as the value of the 
-        // "multiple" attribute.
-        selectEle.setAttribute("multiple", "multiple"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        // If the "size" attribute is specified, render its value as the value of the "size" 
-        // attribute. Otherwise use the number of items as the value of the "size" attribute.
-        String sizeattr = hostEle.getAttribute("size"); //$NON-NLS-1$
-
-        List selectItems = this.getSelectItems(hostEle);
-        if (sizeattr == null)
-        {
-            if (!selectItems.isEmpty())
-            {
-                selectEle.setAttribute("size", String.valueOf(selectItems.size())); //$NON-NLS-1$
-            }
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyMenuTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyMenuTagConverter.java
deleted file mode 100644
index 393f2ae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectManyMenuTagConverter.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectManyMenuTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectManyMenuTagConverter(Element host)
-    {
-        super(host);
-        // TODO Auto-generated constructor stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // If the component is a UISelectMany instance, render "multiple" as the value of the 
-        // "multiple" attribute.
-        selectEle.setAttribute("multiple", "multiple"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        // If the "size" attribute is specified, render its value as the value of the "size" 
-        // attribute. Otherwise use the number of items as the value of the "size" attribute.
-        selectEle.setAttribute("size", "1"); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneListboxTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneListboxTagConverter.java
deleted file mode 100644
index 4178e5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneListboxTagConverter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectOneListboxTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectOneListboxTagConverter(Element host)
-    {
-        super(host);
-        // TODO Auto-generated constructor stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // always not multiple
-        selectEle.removeAttribute("multiple"); //$NON-NLS-1$
-
-        // If the "size" attribute is specified, render its value as the value of the "size" 
-        // attribute. Otherwise use the number of items as the value of the "size" attribute.
-        String sizeattr = hostEle.getAttribute("size"); //$NON-NLS-1$
-
-        List selectItems = this.getSelectItems(hostEle);
-        if (sizeattr == null)
-        {
-            if (!selectItems.isEmpty())
-            {
-                selectEle.setAttribute("size", String.valueOf(selectItems.size())); //$NON-NLS-1$
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneMenuTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneMenuTagConverter.java
deleted file mode 100644
index 95d0bf3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectOneMenuTagConverter.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class SelectOneMenuTagConverter extends SelectBasedTagConverter
-{
-
-    /**
-     * @param host
-     */
-    public SelectOneMenuTagConverter(Element host)
-    {
-        super(host);
-        // TODO Auto-generated constructor stub
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.jsfhtml.SelectBasedTagConverter#handleMultipleAndSize(org.w3c.dom.Element, org.w3c.dom.Element)
-     */
-    protected void handleMultipleAndSize(Element hostEle, Element selectEle)
-    {
-        // always not multiple
-        selectEle.removeAttribute("multiple"); //$NON-NLS-1$
-
-        selectEle.setAttribute("size", "1"); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectTagConverter.java
deleted file mode 100644
index cbc7b3e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/SelectTagConverter.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This class is supposed to be common parent class for the different selectMany tags.
- * 
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public abstract class SelectTagConverter extends AbstractTagConverter
-{
-    /**
-     * @param host
-     */
-    public SelectTagConverter(Element host)
-    {
-        super(host);
-    }
-
-    /**
-     * Return a list of SelectItem
-     * 
-     * @param parent
-     * @return the select item list for parent
-     */
-    protected List getSelectItems(Element parent)
-    {
-        List result = new ArrayList();
-        NodeList nl = parent.getChildNodes();
-        for (int i = 0, size = nl.getLength(); i < size; i++)
-        {
-            Node child = nl.item(i);
-            if (child instanceof Element)
-            {
-                Element ele = (Element) child;
-                String tagname = ele.getLocalName();
-                if (IJSFConstants.TAG_SELECTITEM.equalsIgnoreCase(tagname))
-                {
-                    SelectItemModel item = new SelectItemModel();
-                    item.setDescription(ele.getAttribute(IJSFConstants.ATTR_ITEMDESCRIPTION));
-                    item.setLabel(ele.getAttribute(IJSFConstants.ATTR_ITEMLABEL));
-                    item.setItemValue(ele.getAttribute(IJSFConstants.ATTR_ITEMVALUE));
-                    item.setValue(ele.getAttribute(IJSFConstants.ATTR_VALUE));
-                    item.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
-                    item.setDisabled("true".equalsIgnoreCase(ele.getAttribute(IJSFConstants.ATTR_ITEMDISABLED))); //$NON-NLS-1$
-                    result.add(item);
-                }
-                else if (IJSFConstants.TAG_SELECTITEMS.equalsIgnoreCase(tagname))
-                {
-                    // as selectItems can only be resolved at run time, so we just emulate
-                    // as if it map to two selectitem
-                    String value = ele.getAttribute(IJSFConstants.ATTR_VALUE);
-                    if (value == null || value.length() == 0)
-                    {
-                        value = IJSFConstants.ATTR_VALUE;
-                    }
-                    SelectItemModel item1 = new SelectItemModel();
-                    item1.setValue(value + "_1"); //$NON-NLS-1$
-                    item1.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
-                    result.add(item1);
-                    SelectItemModel item2 = new SelectItemModel();
-                    item2.setValue(value + "_2"); //$NON-NLS-1$
-                    item2.setId(ele.getAttribute(IJSFConstants.ATTR_ID));
-                    result.add(item2);
-                }
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * @param parent
-     * @return the select item model for parent
-     */
-    public SelectItemModel getDefault(Element parent)
-    {
-        SelectItemModel item = new SelectItemModel();
-        if (parent.getLocalName().equals(IJSFConstants.TAG_SELECTONERADIO))
-        {
-            item.setLabel("radio"); //$NON-NLS-1$
-        }
-        else if (parent.getLocalName().equals(IJSFConstants.TAG_SELECTMANYCHECKBOX))
-        {
-            item.setLabel("checkBox"); //$NON-NLS-1$
-        }
-        else
-        {
-            item.setLabel(parent.getLocalName());
-        }
-        return item;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-     */
-    public boolean isMultiLevel()
-    {
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-     */
-    public boolean isWidget()
-    {
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/TableBasedSelectTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/TableBasedSelectTagConverter.java
deleted file mode 100644
index 94377ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfhtml/TableBasedSelectTagConverter.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.jsfhtml;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated Use DTTagConverter meta-data instead
- */
-public class TableBasedSelectTagConverter extends SelectTagConverter
-{
-
-    private String _inputType;
-
-    /**
-     * @param host
-     * @param inputType 
-     */
-    public TableBasedSelectTagConverter(Element host, String inputType)
-    {
-        super(host);
-        this._inputType = inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-     */
-    protected Element doConvertRefresh()
-    {
-        Element hostEle = getHostElement();
-
-        // Render a "table" element.
-        Element tableEle = createElement(IHTMLConstants.TAG_TABLE);
-
-        // If the "styleClass" is specified, render the value of the "styleClass"
-        // attribute as the value of the "class" attribute on the "table" element.
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLECLASS, tableEle, IHTMLConstants.ATTR_CLASS);
-
-        // If the "style", "border" attributes are specified, pass them thru. 
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_STYLE, tableEle, IHTMLConstants.ATTR_STYLE);
-        ConverterUtil.copyAttribute(hostEle, IJSFConstants.ATTR_BORDER, tableEle, IHTMLConstants.ATTR_BORDER);
-
-        // If the "layout" attribute is specified, and its value is "pageDirection", 
-        // render the children elements vertically, otherwise horizontally, in the table. 
-        boolean horizontal = true;
-        if ("pageDirection".equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_LAYOUT))) //$NON-NLS-1$
-        {
-            horizontal = false;
-        }
-
-        Element itemContainer;
-        if (horizontal)
-        {
-            itemContainer = createElement(IHTMLConstants.TAG_TR);
-            tableEle.appendChild(itemContainer);
-        }
-        else
-        {
-            itemContainer = tableEle;
-        }
-
-        // XXX: If any of the children are an instance of SelectItemGroup, render them as a 
-        // nested table.
-        // but at design time, we don't know anything about SelectItemGroup. so will not
-        // rendering nested table.
-
-        List selectitems = this.getSelectItems(hostEle);
-
-        // for designer, if there is no item, we still want to render one
-        if (this.isDesignerMode() && selectitems.isEmpty())
-        {
-            SelectItemModel item = getDefault(hostEle);
-            selectitems.add(item);
-        }
-
-        boolean isDisabled = Boolean.TRUE.toString()
-                .equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_DISABLED));
-        boolean isReadonly = Boolean.TRUE.toString()
-                .equalsIgnoreCase(hostEle.getAttribute(IJSFConstants.ATTR_READONLY));
-
-        for (int i = 0, size = selectitems.size(); i < size; i++)
-        {
-            SelectItemModel item = (SelectItemModel) selectitems.get(i);
-            // Each of the children are ultimately rendererd as follows. 
-            // Render a "label" element. Inside of the "label", render an "input" element 
-            // of "type" "checkbox" for each child component.
-            Element labelEle = createElement(IHTMLConstants.TAG_LABEL);
-            Element inputEle = createElement(IHTMLConstants.TAG_INPUT);
-            inputEle.setAttribute(IHTMLConstants.ATTR_TYPE, getInputType());
-            if (isDisabled || item.isDisabled())
-            {
-                inputEle.setAttribute(IHTMLConstants.ATTR_DISABLED, "disabled"); //$NON-NLS-1$
-            }
-            if (isReadonly)
-            {
-                inputEle.setAttribute(IHTMLConstants.ATTR_READONLY, "readonly"); //$NON-NLS-1$
-            }
-
-            // As an exception to the general 
-            // rules about how to handle the "id" attribute, render it as an attribute on 
-            // the outer "table" element, the value of which is the clientId of the component 
-            // per the rules at the beginning of this specification.The "id" attribute must 
-            // not be output on each "input" element.
-            if (item.getId() != null)
-            {
-                labelEle.setAttribute(IHTMLConstants.ATTR_ID, item.getId());
-            }
-
-            // The value of the current SelectItem 
-            // is rendered as the value of the "value" attribute. If the value of the enclosing 
-            // UISelectMany matches the current value, render "checked" as the value of the 
-            // "checked" attribute. If the current SelectItem.isDisabled() returns true, 
-            // render "disabled" as the value of the "disabled" attribute.
-            if (item.getValue() != null)
-            {
-                inputEle.setAttribute(IHTMLConstants.ATTR_VALUE, item.getValue());
-            }
-            // XXX: checked and disabled is not handled.
-
-            // Close out the "input" element and render the return value from 
-            // SelectItem.getLabel(). Close out the "label" element and any other nested elements.
-            Text label = createText(item.getDisplayString());
-
-            labelEle.appendChild(inputEle);
-            labelEle.appendChild(label);
-
-            if (horizontal)
-            {
-                Element td = createElement(IHTMLConstants.TAG_TD);
-                td.appendChild(labelEle);
-                itemContainer.appendChild(td);
-            }
-            else
-            {
-                Element tr = createElement(IHTMLConstants.TAG_TR);
-                Element td = createElement(IHTMLConstants.TAG_TD);
-                tr.appendChild(td);
-                td.appendChild(labelEle);
-                itemContainer.appendChild(tr);
-            }
-        }
-
-        return (tableEle);
-    }
-
-    /**
-     * @return the input type
-     */
-    protected String getInputType()
-    {
-        return _inputType;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-     */
-    public boolean needBorderDecorator()
-    {
-        return true;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java
deleted file mode 100644
index a8b15e7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/ColumnOperation.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation specifically for the "column" JSF (HTML)
- * Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ColumnOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-
-		//create "td" Element
-		Element tdElement = createElement("td"); //$NON-NLS-1$
-
-		//get parent Node
-		Node parentNode = srcElement.getParentNode();
-
-		//process if parentNode is a "dataTable" Element
-		if (parentNode != null && parentNode.getNodeType() == Node.ELEMENT_NODE && parentNode.getLocalName().equals("dataTable")) { //$NON-NLS-1$
-			//tokenize "columnClasses" attribute into a List
-			List columnClassesList = new ArrayList();
-			String columnClassesAttribute = ((Element)parentNode).getAttribute("columnClasses"); //$NON-NLS-1$
-			if (columnClassesAttribute != null && columnClassesAttribute.length() > 0) {
-				StringTokenizer tokenizer = new StringTokenizer(columnClassesAttribute, ", "); //$NON-NLS-1$
-				while (tokenizer.hasMoreTokens()) {
-					columnClassesList.add(tokenizer.nextToken());
-				}
-			}
-			//set "class" attribute
-			int offset = EditModelQuery.getInstance().getSameTypeNodeIndex(srcElement);
-			if (offset < columnClassesList.size()) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", (String)columnClassesList.get(offset)}); //$NON-NLS-1$
-				operation.transform(srcElement, tdElement);
-			}
-		}
-
-		//add non-transparent (?), non-facet children (for further processing)
-        if (EditModelQuery.getInstance().hasNonTransparentChild(srcElement, new String[] {"facet"})) { //$NON-NLS-1$
-        	Node childNode = srcElement.getFirstChild();
-        	int index = 0;
-        	while (childNode != null) {
-        		if (!(childNode instanceof Element) || !JSFDOMUtil.isFacet((Element)childNode)) {
-        			//Bug 251378 - only add element, text, and CDATA child nodes (as we do everywhere else)
-        			if (childNode.getNodeType() == Node.ELEMENT_NODE ||
-        					childNode.getNodeType() == Node.TEXT_NODE ||
-        					childNode.getNodeType() == Node.CDATA_SECTION_NODE) {
-        				tagConverterContext.addChild(childNode, new ConvertPosition(tdElement, index++));
-        			}
-        		}
-        		childNode = childNode.getNextSibling();
-        	}
-        } else {
-        	//append single space for esthetics of the "td" Element
-        	appendChildText(" ", tdElement); //$NON-NLS-1$
-        }
-
-		return tdElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java
deleted file mode 100644
index 95c0bed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/DataTableOperation.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "dataTable" JSF
- * (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DataTableOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element tableElement = null;
-		//create table element, copy all attributes, rename "styleClass" attribute to "class"
-		tableElement = createElement("table"); //$NON-NLS-1$
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAllAttributesOperation,
-					new String[]{});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_RenameAttributeOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$ //$NON-NLS-2$
-		operation.transform(srcElement, tableElement);
-		//build thead
-		buildHeaderOrFooter(srcElement, tableElement, true);
-		//build tbody
-		buildBody(srcElement, tableElement);
-		//build tfoot
-		buildHeaderOrFooter(srcElement, tableElement, false);
-		return tableElement;
-	}
-
-	private void buildHeaderOrFooter(Element srcElement, Element tableElement, boolean isHeader) {
-		//setup vars depending on whether we are building thead or tfoot
-		String facetName = isHeader ? "header" : "footer"; //$NON-NLS-1$ //$NON-NLS-2$
-		String headerOrFooterTagName = isHeader ? "thead" : "tfoot"; //$NON-NLS-1$ //$NON-NLS-2$
-		String thOrTdTagName = isHeader ? "th" : "td"; //$NON-NLS-1$ //$NON-NLS-2$
-		String headerClassOrFooterClassAttrName = isHeader ? "headerClass" : "footerClass"; //$NON-NLS-1$ //$NON-NLS-2$
-
-		//look for facet ("header" or "footer")
-		Element facetElement = getChildFacetByName(srcElement, facetName);
-
-		//get list of child "column" elements
-		List columnElementList = getChildElements(srcElement, "column"); //$NON-NLS-1$
-
-		//look for facet ("header" or "footer") on child "column" elements
-		boolean hasColumnFacet = false;
-		Iterator itColumnElementList = columnElementList.iterator();
-		while (itColumnElementList.hasNext()) {
-			Element columnElement = (Element)itColumnElementList.next();
-			Element columnFacet = getChildFacetByName(columnElement, facetName);
-			if (columnFacet != null) {
-				hasColumnFacet = true;
-				break;
-			}
-		}
-
-		//test if we even need to build header or footer
-		if (facetElement == null && !hasColumnFacet) {
-			return;
-		}
-
-		//append "thead" or "tfoot" Element
-		Element headerOrFooterElement = appendChildElement(headerOrFooterTagName, tableElement);
-
-		//if facetElement exists, build appropriate thead or tfoot children
-		if (facetElement != null) {
-			//append "tr" Element
-			Element trElement = appendChildElement("tr", headerOrFooterElement); //$NON-NLS-1$
-			//append "th" or "td" Element
-			Element thOrTdElement = appendChildElement(thOrTdTagName, trElement);
-			//set "class" attribute
-			String headerClassOrFooterClassAttribute = srcElement.getAttribute(headerClassOrFooterClassAttrName);
-			if (headerClassOrFooterClassAttribute != null && headerClassOrFooterClassAttribute.length() > 0) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", headerClassOrFooterClassAttribute}); //$NON-NLS-1$
-				operation.transform(srcElement, thOrTdElement);
-			}
-			//set "colspan" attribute
-			if (columnElementList.size() > 0) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"colspan", String.valueOf(columnElementList.size())}); //$NON-NLS-1$
-				operation.transform(srcElement, thOrTdElement);
-			}
-			//add facet Element as child (to be processed further)
-			tagConverterContext.addChild(facetElement, new ConvertPosition(thOrTdElement, 0));
-		}
-
-		//if any child column has "header" or "footer" facet, build "tr" element
-		if (hasColumnFacet) {
-			//append "tr" Element
-			Element trElement = appendChildElement("tr", headerOrFooterElement); //$NON-NLS-1$
-			//iterate through columnElementList
-			itColumnElementList = columnElementList.iterator();
-			while (itColumnElementList.hasNext()) {
-				Element columnElement = (Element)itColumnElementList.next();
-				//get "header" or "footer" facet of column
-				Element columnFacet = getChildFacetByName(columnElement, facetName);
-				//append "th" or "td" Element
-				Element thOrTdElement = appendChildElement(thOrTdTagName, trElement);
-				//set "class" attribute
-				String headerClassOrFooterClassAttribute = srcElement.getAttribute(headerClassOrFooterClassAttrName);
-				if (headerClassOrFooterClassAttribute != null && headerClassOrFooterClassAttribute.length() > 0) {
-					ITransformOperation operation =
-						TransformOperationFactory.getInstance().getTransformOperation(
-								TransformOperationFactory.OP_CreateAttributeOperation,
-								new String[]{"class", headerClassOrFooterClassAttribute}); //$NON-NLS-1$
-					operation.transform(srcElement, thOrTdElement);
-				}
-				//if facet exists, add facet Element as child (to be processed further)
-				if (columnFacet != null) {
-					tagConverterContext.addChild(columnFacet, new ConvertPosition(thOrTdElement, 0));
-				}
-			}
-		}
-	}
-
-	private void buildBody(Element srcElement, Element tableElement) {
-		//append "tbody" element
-		Element tbodyElement = appendChildElement("tbody", tableElement); //$NON-NLS-1$
-		//append "tr" element
-		Element trElement = appendChildElement("tr", tbodyElement); //$NON-NLS-1$
-		//parse "rowClasses" attribute and set "class" attribute
-		String rowClassesAttribute = srcElement.getAttribute("rowClasses"); //$NON-NLS-1$
-		if (rowClassesAttribute != null && rowClassesAttribute.length() > 0) {
-			StringTokenizer tokenizer = new StringTokenizer(rowClassesAttribute, ", "); //$NON-NLS-1$
-			if (tokenizer.hasMoreTokens()) {
-				ITransformOperation operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", tokenizer.nextToken()}); //$NON-NLS-1$
-				operation.transform(srcElement, trElement);
-			}
-		}
-		//add child columns (to be processed further)
-		List columnElementList = getChildElements(srcElement, "column"); //$NON-NLS-1$
-		Iterator itColumnElementList = columnElementList.iterator();
-		int index = 0;
-		while (itColumnElementList.hasNext()) {
-			Element columnElement = (Element)itColumnElementList.next();
-			tagConverterContext.addChild(columnElement, new ConvertPosition(trElement, index++));
-		}
-	}
-
-	/**
-	 * Gets a child Element of the specified parent Element that has the node
-	 * name "facet" and the specified value of the "name" attribute.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @param facetName Name of the facet Element for which to search.
-	 * @return Child Element that is a facet with the specified name.
-	 */
-	private Element getChildFacetByName(Element srcElement, String facetName) {
-		Element element = null;
-		List facets = getChildElements(srcElement, "facet"); //$NON-NLS-1$
-		Iterator itFacets = facets.iterator();
-		while (itFacets.hasNext()) {
-			Element facet = (Element)itFacets.next();
-			if (facet.getAttribute("name").equals(facetName)) { //$NON-NLS-1$
-				element = facet;
-				break;
-			}
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
deleted file mode 100644
index 7ae84d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.PropertyResourceBundle;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation specifically for the "loadBundle" JSF
- * (core) Element. 
- * 
- * @author Ian Trimble - Oracle
- */
-public class LoadBundleOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (srcElement != null) {
-			//get "var" and "basename" attributes of srcElement
-			String var = srcElement.getAttribute(IJSFConstants.ATTR_VAR);
-			String basename = srcElement.getAttribute(IJSFConstants.ATTR_BASENAME);
-			if (var != null && basename != null && var.length() > 0 && basename.length() > 0) {
-				String basePath =
-					basename.replace('.', IFileFolderConstants.PATH_SEPARATOR.charAt(0)) +
-							IFileFolderConstants.DOT +
-							IFileFolderConstants.EXT_PROPERTIES;
-				if (srcElement instanceof IDOMNode) {
-					//get model
-					IDOMModel model = ((IDOMNode)srcElement).getModel();
-					if (model != null) {
-						//get project
-						IProject project = StructuredModelUtil.getProjectFor(model);
-						if (project != null) {
-							//attempt to locate properties file in "/{WebRoot}/WEB-INF/classes"
-							IVirtualComponent component = ComponentCore.createComponent(project);
-							if (component != null) {
-								IVirtualFolder rootFolder = component.getRootFolder();
-								if (rootFolder != null) {
-									IPath webRootPath = rootFolder.getProjectRelativePath();
-									if (webRootPath != null) {
-										StringBuffer sb = new StringBuffer(webRootPath.toString());
-										if (!IFileFolderConstants.PATH_SEPARATOR.equals(webRootPath.toString())) {
-											sb.append(IFileFolderConstants.PATH_SEPARATOR);
-										}
-										sb.append(IFileFolderConstants.FOLDER_WEBINF);
-										sb.append(IFileFolderConstants.PATH_SEPARATOR);
-										sb.append(IFileFolderConstants.FOLDER_CLASS);
-										sb.append(IFileFolderConstants.PATH_SEPARATOR);
-										sb.append(basePath);
-										IResource resource = project.findMember(sb.toString());
-										if (resource == null) {
-											resource = findFileInSrcFolder(project, basePath);
-											if (resource != null) {
-												//load properties file and configure PreviewUtil
-												InputStream inputStream = null;
-												try {
-													File file = new File(resource.getLocation().toString());
-													inputStream = new FileInputStream(file);
-													if (inputStream != null) {
-														inputStream = new BufferedInputStream(inputStream);
-														PropertyResourceBundle bundle = new PropertyResourceBundle(inputStream);
-														if (bundle != null) {
-															if (PreviewUtil.getBUNDLE_MAP() == null) {
-																PreviewUtil.setBUNDLE_MAP(new HashMap());
-															} else {
-																PreviewUtil.getBUNDLE_MAP().clear();
-															}
-															PreviewUtil.getBUNDLE_MAP().put(var, bundle);
-															PreviewUtil.setBUNDLE(bundle);
-															PreviewUtil.setVAR(var);
-														}
-													}
-												} catch(IOException ioe) {
-													PDPlugin.getLogger(LoadBundleOperation.class).error("LoadBundleTagConverter.convertRefresh.IOException", ioe); //$NON-NLS-1$
-												} finally {
-													ResourceUtils.ensureClosed(inputStream);
-												}
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		//return null to indicate there is no HTML element associated with this tag
-		return null;
-	}
-
-	/**
-	 * Find specified file in any source folder of the specified project.
-	 * 
-	 * @param project IProject instance.
-	 * @param filePath Source folder-relative path of the file to be located.
-	 * @return the specified file in any source folder of the specified project.
-	 */
-	protected IResource findFileInSrcFolder(IProject project, String filePath) {
-		IResource resource = null;
-		IJavaProject javaProject = JavaCore.create(project);
-		if (javaProject != null) {
-			try {
-				IClasspathEntry[] classpathEntries = javaProject.getResolvedClasspath(true);
-				for (int i = 0; i < classpathEntries.length; i++) {
-					IClasspathEntry classpathEntry = classpathEntries[i];
-					if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-						IPath srcPath = classpathEntry.getPath();
-						//srcPath = srcPath.removeFirstSegments(srcPath.matchingFirstSegments(project.getFullPath()));
-						IPath srcFilePath = srcPath.append(filePath);
-						IResource tmpResource = project.getParent().findMember(srcFilePath);
-						if (tmpResource != null) {
-							resource = tmpResource;
-							break;
-						}
-					}
-				}
-			} catch(JavaModelException jme) {
-				//ignore - returning null from method will indicate failure
-			}
-		}
-		return resource;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java
deleted file mode 100644
index 7ee81bf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/PanelGridOperation.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation specifically for the "panelGrid" JSF
- * (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class PanelGridOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element tableElement = null;
-		//create table element, copy all attributes, rename "styleClass" attribute to "class"
-		tableElement = createElement("table"); //$NON-NLS-1$
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAllAttributesOperation,
-					new String[]{});
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_RenameAttributeOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$ //$NON-NLS-2$
-		operation.transform(srcElement, tableElement);
-		//get value of "columns" attribute
-		int columns;
-		try {
-			columns = Integer.parseInt(srcElement.getAttribute("columns")); //$NON-NLS-1$
-		} catch(NumberFormatException nfe) {
-			columns = 1;
-		}
-		if (columns < 1) {
-			columns = 1;
-		}
-		//check for "header" facet and render appropriately
-		Element headerFacetElement = getChildFacetByName(srcElement, "header"); //$NON-NLS-1$
-		if (headerFacetElement != null) {
-			Element tHeadElement = appendChildElement("thead", tableElement); //$NON-NLS-1$
-			Element trElement = appendChildElement("tr", tHeadElement); //$NON-NLS-1$
-			Element thElement = appendChildElement("th", trElement); //$NON-NLS-1$
-			String headerClass = srcElement.getAttribute("headerClass"); //$NON-NLS-1$
-			if (headerClass != null && headerClass.length() > 0) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", headerClass}); //$NON-NLS-1$
-				operation.transform(srcElement, thElement);
-			}
-			operation =
-				TransformOperationFactory.getInstance().getTransformOperation(
-						TransformOperationFactory.OP_CreateAttributeOperation,
-						new String[]{"colspan", String.valueOf(columns)}); //$NON-NLS-1$
-			operation.transform(srcElement, thElement);
-			tagConverterContext.addChild(headerFacetElement, new ConvertPosition(thElement, 0));
-		}
-		//check for "footer" facet and render appropriately
-		Element footerFacetElement = getChildFacetByName(srcElement, "footer"); //$NON-NLS-1$
-		if (footerFacetElement != null) {
-			Element tFootElement = appendChildElement("tfoot", tableElement); //$NON-NLS-1$
-			Element trElement = appendChildElement("tr", tFootElement); //$NON-NLS-1$
-			Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-			String footerClass = srcElement.getAttribute("footerClass"); //$NON-NLS-1$
-			if (footerClass != null && footerClass.length() > 0) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", footerClass}); //$NON-NLS-1$
-				operation.transform(srcElement, tdElement);
-			}
-			operation =
-				TransformOperationFactory.getInstance().getTransformOperation(
-						TransformOperationFactory.OP_CreateAttributeOperation,
-						new String[]{"colspan", String.valueOf(columns)}); //$NON-NLS-1$
-			operation.transform(srcElement, tdElement);
-			tagConverterContext.addChild(footerFacetElement, new ConvertPosition(tdElement, 0));
-		}
-		//get rowClasses and columnClasses for subsequent processing
-        List rowClasses = new ArrayList();
-        String rowClassesAttribute = srcElement.getAttribute("rowClasses"); //$NON-NLS-1$
-        if (rowClassesAttribute != null && rowClassesAttribute.length() > 0) {
-            StringTokenizer tokenizer = new StringTokenizer(rowClassesAttribute, ", "); //$NON-NLS-1$
-            while (tokenizer.hasMoreTokens()) {
-                rowClasses.add(tokenizer.nextToken());
-            }
-        }
-        List columnClasses = new ArrayList();
-        String columnClassAttribute = srcElement.getAttribute("columnClasses"); //$NON-NLS-1$
-        if (columnClassAttribute != null) {
-            StringTokenizer tokenizer = new StringTokenizer(columnClassAttribute, ", "); //$NON-NLS-1$
-            while (tokenizer.hasMoreTokens()) {
-                columnClasses.add(tokenizer.nextToken());
-            }
-        }
-		//render children using appropriate number of columns and appropriate classes
-        Element tBodyElement = appendChildElement("tbody", tableElement); //$NON-NLS-1$
-        List childElements = getChildElementsSkipFacets(srcElement);
-        Element trElement = null;
-        int nextRow = 0;
-        int curIndex = 0;
-        Iterator itChildElements = childElements.iterator();
-        while (itChildElements.hasNext()) {
-        	int columnIndex = curIndex % columns;
-        	if (columnIndex == 0) {
-        		trElement = appendChildElement("tr", tBodyElement); //$NON-NLS-1$
-        		if (!rowClasses.isEmpty()) {
-    				operation =
-    					TransformOperationFactory.getInstance().getTransformOperation(
-    							TransformOperationFactory.OP_CreateAttributeOperation,
-    							new String[]{"class", (String)rowClasses.get(nextRow)}); //$NON-NLS-1$
-    				operation.transform(srcElement, trElement);
-        			nextRow = (nextRow + 1) % rowClasses.size();
-        		}
-        	}
-        	Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-        	if (columnIndex < columnClasses.size()) {
-				operation =
-					TransformOperationFactory.getInstance().getTransformOperation(
-							TransformOperationFactory.OP_CreateAttributeOperation,
-							new String[]{"class", (String)columnClasses.get(columnIndex)}); //$NON-NLS-1$
-				operation.transform(srcElement, tdElement);
-        	}
-        	tagConverterContext.addChild((Element)itChildElements.next(), new ConvertPosition(tdElement, 0));
-        	curIndex++;
-        }
-        return tableElement;
-	}
-
-	/**
-	 * Gets a child Element of the specified parent Element that has the node
-	 * name "facet" and the specified value of the "name" attribute.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @param facetName Name of the facet Element for which to search.
-	 * @return Child Element that is a facet with the specified name.
-	 */
-	private Element getChildFacetByName(Element srcElement, String facetName) {
-		Element element = null;
-		List facets = getChildElements(srcElement, "facet"); //$NON-NLS-1$
-		Iterator itFacets = facets.iterator();
-		while (itFacets.hasNext()) {
-			Element facet = (Element)itFacets.next();
-			String facetAttrName = facet.getAttribute("name"); //$NON-NLS-1$
-			if (facetAttrName != null && facetAttrName.equals(facetName)) {
-				element = facet;
-				break;
-			}
-		}
-		return element;
-	}
-
-	/**
-	 * Gets a list of child Elements of the specified parent Element, skipping
-	 * any "facet" Elements.
-	 * 
-	 * @param srcElement Parent Element instance.
-	 * @return List of child Elements of the specified parent Element that does
-	 * not include any child "facet" Elements.
-	 */
-	private List getChildElementsSkipFacets(Element srcElement) {
-		List childElementsList = new ArrayList();
-		NodeList childNodes = srcElement.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node childNode = childNodes.item(i);
-			if (childNode.getNodeType() == Node.ELEMENT_NODE) {
-				if (!childNode.getLocalName().equals("facet")) { //$NON-NLS-1$
-					childElementsList.add(childNode);
-				}
-			}
-		}
-		return childElementsList;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectManyCheckboxOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectManyCheckboxOperation.java
deleted file mode 100644
index 4ebd28d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectManyCheckboxOperation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-/**
- * ITransformOperation implementation specifically for the "selectManyCheckbox"
- * JSF (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectManyCheckboxOperation extends TableBasedOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.TableBasedOperation#getInputType()
-	 */
-	protected String getInputType() {
-		return "checkbox"; //$NON-NLS-1$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectOneRadioOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectOneRadioOperation.java
deleted file mode 100644
index 12a32e5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/SelectOneRadioOperation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-/**
- * ITransformOperation implementation specifically for the "selectOneRadio"
- * JSF (HTML) Element. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SelectOneRadioOperation extends TableBasedOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf.TableBasedOperation#getInputType()
-	 */
-	protected String getInputType() {
-		return "radio"; //$NON-NLS-1$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/TableBasedOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/TableBasedOperation.java
deleted file mode 100644
index a503acf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/TableBasedOperation.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.jsf.ui.converter.operations.jsf;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.eclipse.jst.pagedesigner.jsf.ui.util.JSFUIPluginResourcesUtil;
-import org.w3c.dom.Element;
-
-/**
- * Abstract ITransformOperation implementation intended as super class for HTML
- * "table"-based "selectXXX" JSF (HTML) Elements. 
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class TableBasedOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element tableElement = createElement("table"); //$NON-NLS-1$
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"styleClass"}); //$NON-NLS-1$
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_RenameAttributeOperation,
-					new String[]{"styleClass", "class"}); //$NON-NLS-1$ //$NON-NLS-2$
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"style"}); //$NON-NLS-1$
-		operation.transform(srcElement, tableElement);
-		operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CopyAttributeOperation,
-					new String[]{"border"}); //$NON-NLS-1$
-		operation.transform(srcElement, tableElement);
-		boolean layoutHorizontal = true;
-		if ("pageDirection".equalsIgnoreCase(srcElement.getAttribute("layout"))) { //$NON-NLS-1$ //$NON-NLS-2$
-			layoutHorizontal = false;
-		}
-		Element itemContainer;
-		if (layoutHorizontal) {
-			itemContainer = appendChildElement("tr", tableElement); //$NON-NLS-1$
-		} else {
-			itemContainer = tableElement;
-		}
-		boolean isDisabled = Boolean.TRUE.toString().equalsIgnoreCase(srcElement.getAttribute("disabled")); //$NON-NLS-1$
-		boolean isReadOnly = Boolean.TRUE.toString().equalsIgnoreCase(srcElement.getAttribute("readonly")); //$NON-NLS-1$
-		List selectItemList = getChildElements(srcElement, "selectItem"); //$NON-NLS-1$
-		if (selectItemList.size() > 0) {
-			Iterator itSelectItemList = selectItemList.iterator();
-			while (itSelectItemList.hasNext()) {
-				Element selectItem = (Element) itSelectItemList.next();
-				Element labelElement = createElement("label"); //$NON-NLS-1$
-				Element inputElement = appendChildElement("input", labelElement); //$NON-NLS-1$
-				inputElement.setAttribute("type", getInputType()); //$NON-NLS-1$
-				if (isDisabled || Boolean.TRUE.toString().equalsIgnoreCase(selectItem.getAttribute("itemDisabled"))) { //$NON-NLS-1$
-					inputElement.setAttribute("disabled", "disabled"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				if (isReadOnly) {
-					inputElement.setAttribute("readonly", "readonly"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-				String selectItemID = selectItem.getAttribute("id"); //$NON-NLS-1$
-				if (selectItemID != null && selectItemID.length() > 0) {
-					inputElement.setAttribute("id", selectItemID); //$NON-NLS-1$
-				}
-				String selectItemValue = selectItem.getAttribute("value"); //$NON-NLS-1$
-				if (selectItemValue != null && selectItemValue.length() > 0) {
-					inputElement.setAttribute("value", selectItemValue); //$NON-NLS-1$
-				}
-				String label = getSelectItemLabel(selectItem);
-				appendChildText(label, labelElement);
-				if (layoutHorizontal) {
-					Element tdElement = appendChildElement("td", itemContainer); //$NON-NLS-1$
-					tdElement.appendChild(labelElement);
-				} else {
-					Element trElement = appendChildElement("tr", itemContainer); //$NON-NLS-1$
-					Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-					tdElement.appendChild(labelElement);
-				}
-			}
-		} else {
-			Element spanElement = createElement("span"); //$NON-NLS-1$
-			appendAttribute(spanElement, "style", //$NON-NLS-1$
-					JSFUIPluginResourcesUtil.getInstance().getString("TableBasedOperation.NoSelectItem.style")); //$NON-NLS-1$
-			List selectItemsList = getChildElements(srcElement, "selectItems"); //$NON-NLS-1$
-			if (selectItemsList.size() > 0) {
-				appendChildText(
-						JSFUIPluginResourcesUtil.getInstance().getString("TableBasedOperation.OnlySelectItems.text"), //$NON-NLS-1$
-						spanElement);
-			} else {
-				appendChildText(
-						JSFUIPluginResourcesUtil.getInstance().getString("TableBasedOperation.NoSelectItem.text"), //$NON-NLS-1$
-						spanElement);
-			}
-			if (layoutHorizontal) {
-				Element tdElement = appendChildElement("td", itemContainer); //$NON-NLS-1$
-				tdElement.appendChild(spanElement);
-			} else {
-				Element trElement = appendChildElement("tr", itemContainer); //$NON-NLS-1$
-				Element tdElement = appendChildElement("td", trElement); //$NON-NLS-1$
-				tdElement.appendChild(spanElement);
-			}
-		}
-		return tableElement;
-	}
-
-	/**
-	 * Subclasses override this in order to return the "type" attribute of
-	 * child "input" Elements ("checkbox" or "radio").
-	 * 
-	 * @return the "type" attribute of child "input" Elements.
-	 */
-	protected abstract String getInputType();
-
-	/**
-	 * Attempts to get a label for the selectItem Element instance.
-	 * 
-	 * @param selectItem "selectItem" source Element instance.
-	 * @return Label for the specified selectItem Element instance.
-	 */
-	private String getSelectItemLabel(Element selectItem) {
-		String attribute = selectItem.getAttribute("itemLabel"); //$NON-NLS-1$
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("value"); //$NON-NLS-1$
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("itemDescription"); //$NON-NLS-1$
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		attribute = selectItem.getAttribute("itemValue"); //$NON-NLS-1$
-		if (attribute != null && attribute.length() > 0) {
-			return attribute;
-		}
-		return "selectItem"; //$NON-NLS-1$
-	}
-
-	/**
-	 * Appends the specified attribute with the specified value to the specified
-	 * Element instance.
-	 * 
-	 * @param element Element instance to append attribute to.
-	 * @param attributeName Name of attribute to be appended.
-	 * @param attributeValue Value of attribute to be appended.
-	 */
-	protected void appendAttribute(
-			Element element,
-			String attributeName,
-			String attributeValue) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CreateAttributeOperation,
-					new String[]{attributeName, attributeValue});
-		operation.transform(null, element);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/FacetElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/FacetElementEdit.java
deleted file mode 100644
index cf5ac89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/FacetElementEdit.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.w3c.dom.Element;
-
-/**
- * Element edit for a f:facet
- * 
- * @author cbateman
- *
- */
-public class FacetElementEdit extends AbstractElementEdit
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#handleModelChange(org.w3c.dom.Element, org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public boolean handleModelChange(Element ele, ElementEditPart part,boolean recursive)
-    {
-        EditPart parent = part.getParent();
-        if (parent instanceof ElementEditPart)
-        {
-            ((ElementEditPart) parent).refreshModelChange(recursive);
-            return true;
-        }
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JSFCoreElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JSFCoreElementEditFactory.java
deleted file mode 100644
index 966a68b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JSFCoreElementEditFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFCoreElementEditFactory implements IElementEditFactory
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-     */
-    public IElementEdit createElementEdit(TagIdentifier tagIdentifier)
-    {
-        if (IJSFConstants.TAG_IDENTIFIER_LOADBUNDLE.isSameTagType(tagIdentifier))
-        {
-            return new LoadBundleElementEdit();
-        }
-        else if(IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(tagIdentifier))
-        {
-            return new FacetElementEdit();
-        }
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_CORE;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java
deleted file mode 100644
index 17ee5a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JarEntryEditorInput implements IStorageEditorInput
-{
-
-    private IStorage fJarEntryFile;
-
-    /**
-     * @param jarEntryFile
-     */
-    public JarEntryEditorInput(IStorage jarEntryFile)
-    {
-        fJarEntryFile = jarEntryFile;
-    }
-
-    /*
-     */
-    public boolean equals(Object obj)
-    {
-        if (this == obj)
-        {
-            return true;
-        }
-        if (!(obj instanceof JarEntryEditorInput))
-        {
-            return false;
-        }
-        JarEntryEditorInput other = (JarEntryEditorInput) obj;
-        return fJarEntryFile.equals(other.fJarEntryFile);
-    }
-
-    
-    @Override
-    public int hashCode() 
-    {
-        // two editor inputs are equal if their fJarEntryFile's are
-        // equal.  Therefore use the same criteria for hashcodes
-        return fJarEntryFile.hashCode();
-    }
-
-    /*
-     * @see IEditorInput#getPersistable()
-     */
-    public IPersistableElement getPersistable()
-    {
-        return null;
-    }
-
-    /*
-     * @see IEditorInput#getName()
-     */
-    public String getName()
-    {
-        return fJarEntryFile.getName();
-    }
-
-
-    /**
-     * @return the full path of the entry as a string
-     */
-    public String getFullPath()
-    {
-        return fJarEntryFile.getFullPath().toString();
-    }
-
-
-    /**
-     * @return the file extension of this input
-     */
-    public String getContentType()
-    {
-        return fJarEntryFile.getFullPath().getFileExtension();
-    }
-
-    /*
-     * @see IEditorInput#getToolTipText()
-     */
-    public String getToolTipText()
-    {
-        return fJarEntryFile.getFullPath().toString();
-    }
-
-    /*
-     * @see IEditorInput#getImageDescriptor()
-     */
-    public ImageDescriptor getImageDescriptor()
-    {
-        IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
-        return registry.getImageDescriptor(fJarEntryFile.getFullPath().getFileExtension());
-    }
-
-    /*
-     * @see IEditorInput#exists()
-     */
-    public boolean exists()
-    {
-        // JAR entries can't be deleted
-        return true;
-    }
-
-    /*
-     * @see IAdaptable#getAdapter(Class)
-     */
-    public Object getAdapter(Class adapter)
-    {
-        return null;
-    }
-
-    /*
-     * see IStorageEditorInput#getStorage()
-     */
-    public IStorage getStorage()
-    {
-        return fJarEntryFile;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleAction.java
deleted file mode 100644
index 2599167..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleAction.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorRegistry;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-
-
-/**
- * @author mengbo
- */
-public class LoadBundleAction extends Action
-{
-    private String   _baseName;
-    private IProject _project;
-
-    /**
-     * Create a new action
-     */
-    public LoadBundleAction()
-    {
-        setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.LoadBundle"));//$NON-NLS-1$
-    }
-
-    /**
-     * @param attribute
-     */
-    public void setBaseName(String attribute)
-    {
-        _baseName = attribute;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run()
-    {
-        if (_project == null || _baseName == null)
-        {
-            return;
-        }
-
-        IStorage storage = null;
-        try
-        {
-            storage = LoadBundleUtil.getLoadBundleResource(_project, _baseName);
-        }
-        catch (CoreException e)
-        {
-            JSFUIPlugin.getAlerts().warning("Message.Warning.Title", e.getLocalizedMessage());//$NON-NLS-1$
-            return;
-        }
-
-        if (storage instanceof IFile)
-        {
-            try
-            {
-                IDE.openEditor(getPage(), (IFile) storage, true);
-            }
-            catch (PartInitException e1)
-            {
-                JSFUIPlugin.getAlerts().warning("Message.Warning.Title", e1.getLocalizedMessage());//$NON-NLS-1$     
-            }
-        }
-        else if (storage != null)
-        {
-            IEditorInput input = new JarEntryEditorInput(storage);
-            try
-            {
-                getPage().openEditor(input, "org.eclipse.ui.DefaultTextEditor");//$NON-NLS-1$
-            }
-            catch (PartInitException e1)
-            {
-                JSFUIPlugin.getAlerts().warning("Message.Warning.Title", e1.getLocalizedMessage());//$NON-NLS-1$
-            }
-        }
-        else {
-        	//create new file???  Will be covered by https://bugs.eclipse.org/bugs/show_bug.cgi?id=225232 
-        	
-        }
-    }
-
-
-    private IWorkbenchPage getPage()
-    {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        return window.getActivePage();
-    }
-
-    /**
-     * @param projectFor
-     */
-    public void setProject(IProject projectFor)
-    {
-        this._project = projectFor;
-    }
-
-    /**
-     * @param inputName
-     * @return the editor id of theditor to open for the inputName or null
-     * if none can be ascertained
-     */
-    public String getEditorID(String inputName)
-    {
-        IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
-
-        // check for a default editor
-        IEditorDescriptor editorDescriptor = registry.getDefaultEditor(inputName);
-
-        // next check the OS for in-place editor (OLE on Win32)
-        if (editorDescriptor == null && registry.isSystemInPlaceEditorAvailable(inputName))
-        {
-            editorDescriptor = registry.findEditor(IEditorRegistry.SYSTEM_INPLACE_EDITOR_ID);
-        }
-
-        // next check with the OS for an external editor
-        if (editorDescriptor == null && registry.isSystemExternalEditorAvailable(inputName))
-        {
-            editorDescriptor = registry.findEditor(IEditorRegistry.SYSTEM_EXTERNAL_EDITOR_ID);
-        }
-
-        // next lookup the default text editor
-        if (editorDescriptor == null)
-        {
-            editorDescriptor = registry.findEditor("org.eclipse.ui.DefaultTextEditor"); //$NON-NLS-1$
-        }
-
-        // if no valid editor found, bail out
-        if (editorDescriptor == null)
-        {
-            return null;
-        }
-
-        return editorDescriptor.getId();
-    }
-    /* (non-Javadoc)
-     * @see org.eclipse.jface.action.IAction#isEnabled()
-     */
-    public boolean isEnabled()
-    {
-        return _project != null && _baseName != null && !"".equals(_baseName);//$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleElementEdit.java
deleted file mode 100644
index 4f3dfe6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/LoadBundleElementEdit.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfcore;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LoadBundleElementEdit extends AbstractElementEdit
-{
-    private LoadBundleAction loadBundleAction;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-    public void fillContextMenu(IMenuManager contextMenu, Element ele)
-    {
-        super.fillContextMenu(contextMenu,ele);
-
-        LoadBundleAction action = getAction();
-        action.setBaseName(ele.getAttribute(ICSSPropertyID.ATTR_BASENAME));
-        if (ele instanceof IDOMElement)
-        {
-            action.setProject(StructuredModelUtil.getProjectFor(((IDOMElement) ele).getModel()));
-        }
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_SPECIAL, action);
-    }
-
-    private LoadBundleAction getAction()
-    {
-        if (loadBundleAction == null)
-        {
-            loadBundleAction = new LoadBundleAction();
-        }
-        return loadBundleAction;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/ColumnElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/ColumnElementEdit.java
deleted file mode 100644
index 78affcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/ColumnElementEdit.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.editpolicies.ColumnHelper;
-import org.eclipse.jst.pagedesigner.editpolicies.ColumnResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.CaretPositionResolver;
-import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnElementEdit extends DefaultJSFHTMLElementEdit
-{
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#handleModelChange(org.w3c.dom.Element, org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public boolean handleModelChange(Element ele, ElementEditPart part, boolean recursive)
-    {
-        EditPart parent = part.getParent();
-        if (parent instanceof ElementEditPart)
-        {
-            ((ElementEditPart) parent).refreshModelChange(recursive);
-            return true;
-        }
-        return false;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public void createEditPolicies(ElementEditPart part)
-    {
-        part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ColumnResizableEditPolicy());
-    }
-    
-    public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer) {
-        return new MyDropLocationStrategy(viewer);
-    }
-
-    private static class MyDropLocationStrategy extends DefaultDropLocationStrategy
-    {
-        /**
-         * @param viewer
-         */
-        public MyDropLocationStrategy(EditPartViewer viewer) {
-            super(viewer);
-        }
-
-        public DesignPosition calculateDesignPosition(EditPart target,
-                Point p, IPositionMediator validator) 
-        {
-            // get the nearest ancestor part to target that is 
-            // editable or target if it is editable
-            target = validator.getEditableContainer(new Target(target));
-
-            // target must be an element part
-            if (target instanceof ElementEditPart)
-            {
-                // can only try to drop a column into a table.  If we are
-                // targetting a column, then we can see if its table will take it
-                TagIdentifier tagId = ((ElementEditPart)target).getTagIdentifier();
-                
-                if (IJSFConstants.TAG_IDENTIFIER_DATA_TABLE.isSameTagType(tagId))
-                {
-                    // if we're on the table, try to figure out which column we are above
-                    for (Iterator it = target.getChildren().iterator(); it.hasNext();)
-                    {
-                        final NodeEditPart nodeEditPart = (NodeEditPart) it.next();
-                        TagIdentifier tagId2 = nodeEditPart.getTagIdentifier();
-                        
-                        if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId2))
-                        {
-                            final Rectangle columnBounds = 
-                                ColumnHelper.getAdjustedColumnBoundingRectangle(nodeEditPart);
-                            if (columnBounds.contains(p))
-                            {
-                                target = nodeEditPart;
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                // recalculate the id because it may have changed
-                tagId = ((ElementEditPart)target).getTagIdentifier();
-                
-                if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId))
-                {
-                    DesignPosition position = null;
-                    final Rectangle columnBounds = 
-                        ColumnHelper.getAdjustedColumnBoundingRectangle((GraphicalEditPart) target);
-                    if (CaretPositionResolver.toXMiddle(columnBounds, p) < 0)
-                    {
-                        position = DesignPosition.createPositionBeforePart(target);
-                    }
-                    else
-                    {
-                        position = DesignPosition.createPositionAfterPart(target);
-                    }
-                    
-                     
-                    if (validator.isValidPosition(position))
-                    {
-                        return position;
-                    }
-                }
-            }
-            
-            // otherwise, no valid position
-            return null;
-        }
-
-        protected Rectangle createCaretBounds(DesignPosition position) {
-            Rectangle bounds = super.createCaretBounds(position);
-            
-            // we want to extend the insert caret to be the height of the column container (i.e. dataTable)
-            // and positioned so it starts at the top of the container in the column where the insertion will occur
-            GraphicalEditPart parent = 
-                (GraphicalEditPart) position.getContainerPart();
-            Rectangle containerBounds = parent.getFigure().getBounds().getCopy();
-            parent.getFigure().translateToAbsolute(containerBounds);
-            bounds.height = containerBounds.height;
-            bounds.y = containerBounds.y;
-            return bounds;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DataTableElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DataTableElementEdit.java
deleted file mode 100644
index 5025fb4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DataTableElementEdit.java
+++ /dev/null
@@ -1,487 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editpolicies.DragMoveEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.DeleteHColumnHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.DeleteHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.InsertHColumnHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.InsertHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableDeleteColumnCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableDeleteColumnHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableDeleteHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableInsertColumnCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableInsertColumnHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableInsertHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHColumnHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHColumnHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util.DataTableUtil;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.TableInsertRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizeRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableRowColumnDeleteRequest;
-import org.eclipse.jst.pagedesigner.tools.ObjectModeDragTracker;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DefaultPositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableElementEdit extends DefaultJSFHTMLElementEdit
-{
-    private final static Action     EMPTY_ACTION     = new Action()
-    {
-        // TODO: why?
-    };
-    private final static int FAKE_INDEX = -10;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-    public void fillContextMenu(IMenuManager contextMenu, Element ele)
-    {
-        super.fillContextMenu(contextMenu, ele);
-
-        final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.DataTable"));//$NON-NLS-1$
-        final ElementEditPart editPart = (ElementEditPart) ((IDOMElement) ele).getAdapterFor(EditPart.class);
-        // ok, we passed the checking, now let's create the actions.
-        tableMenu.add(EMPTY_ACTION);
-        tableMenu.addMenuListener(new IMenuListener()
-        {
-            public void menuAboutToShow(IMenuManager manager)
-            {
-                tableMenu.removeAll();
-                fillTableMenu(editPart, FAKE_INDEX, tableMenu);
-            }
-        });
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager, org.eclipse.jst.pagedesigner.parts.ElementEditPart, org.eclipse.jst.pagedesigner.parts.NodeEditPart, org.eclipse.jface.viewers.ISelection)
-     */
-    public boolean fillContainerContextMenu(IMenuManager contextMenu, final ElementEditPart elePart,
-            NodeEditPart nodePart, ISelection innerSelection)
-    {
-        Element table = (Element) elePart.getModel();
-        Node node = (Node) nodePart.getModel();
-
-        DataTableUtil util = new DataTableUtil(table);
-        Element columnParent = util.findHColumnParent(node);
-
-        final int cellColumn = util.getColumnIndex(columnParent);
-
-        final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.DataTable"));//$NON-NLS-1$
-
-        // ok, we passed the checking, now let's create the actions.
-        tableMenu.add(EMPTY_ACTION);
-        tableMenu.addMenuListener(new IMenuListener()
-        {
-            public void menuAboutToShow(IMenuManager manager)
-            {
-                tableMenu.removeAll();
-                fillTableMenu(elePart, cellColumn, tableMenu);
-            }
-        });
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-        return true;
-
-    }
-
-    /**
-     * @param elePart
-     * @param cellColumn
-     * @param tableMenu
-     */
-    private void fillTableMenu(ElementEditPart elePart, int cellColumn, IMenuManager tableMenu)
-    {
-        SelectEditPartAction action = SelectEditPartAction.create(JSFUIPlugin
-                .getResourceString("ElementEdit.Submenu.DataTable.SelectTable"), elePart);//$NON-NLS-1$
-        tableMenu.add(action);
-
-        tableMenu.add(new Separator());
-
-        {
-            InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DataTable.InsertColumnBefore"), //$NON-NLS-1$
-                    elePart, cellColumn, false, true);
-            tableMenu.add(insertColumnBeforeAction);
-
-            InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DataTable.InsertColumnAfter"),//$NON-NLS-1$ 
-                    elePart, cellColumn, false, false);
-            tableMenu.add(insertColumnAfterAction);
-
-            tableMenu.add(new Separator());
-        }
-
-        {
-            DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DataTable.DeleteColumn"), //$NON-NLS-1$
-                    elePart, cellColumn, false);
-            tableMenu.add(deleteColumnAction);
-            tableMenu.add(new Separator());
-        }
-
-        {
-            InsertHeaderFooterAction headerAction = new InsertHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.InsertTableHeader"), elePart, true);//$NON-NLS-1$
-            tableMenu.add(headerAction);
-
-            InsertHeaderFooterAction footerAction = new InsertHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.InsertTableFooter"), elePart, false);//$NON-NLS-1$
-            tableMenu.add(footerAction);
-
-            DeleteHeaderFooterAction delHeaderAction = new DeleteHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DeleteTableHeader"), elePart, true);//$NON-NLS-1$
-            tableMenu.add(delHeaderAction);
-
-            DeleteHeaderFooterAction delFooterAction = new DeleteHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DeleteTableFooter"), elePart, false);//$NON-NLS-1$
-            tableMenu.add(delFooterAction);
-            tableMenu.add(new Separator());
-        }
-
-        {
-            InsertHColumnHeaderFooterAction hColHeaderAction = new InsertHColumnHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.InsertColumnHeader"),//$NON-NLS-1$
-                    elePart, true);
-            tableMenu.add(hColHeaderAction);
-
-            InsertHColumnHeaderFooterAction hColFooterAction = new InsertHColumnHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.InsertColumnFooter"),//$NON-NLS-1$
-                    elePart, false);
-            tableMenu.add(hColFooterAction);
-
-            DeleteHColumnHeaderFooterAction delColHeader = new DeleteHColumnHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DeleteColumnHeader"),//$NON-NLS-1$
-                    elePart, true);
-            tableMenu.add(delColHeader);
-
-            DeleteHColumnHeaderFooterAction delColFooter = new DeleteHColumnHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.DeleteColumnFooter"),//$NON-NLS-1$
-                    elePart, false);
-            tableMenu.add(delColFooter);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public void createEditPolicies(ElementEditPart part)
-    {
-        part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new DataTableResizePolicy(part));
-        part.installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-                new MyDragMoveEditPolicy());
-    }
-
-    static class DataTableResizePolicy extends ElementResizableEditPolicy
-    {
-        private static final String COLUMN_SELECT_IMAGE_FILE = "column_select.gif"; //$NON-NLS-1$
-        
-		ElementEditPart _part;
-        Cursor          _columnSelectCursor;
-
-        /**
-         * @param part
-         */
-        public DataTableResizePolicy(ElementEditPart part)
-        {
-            _part = part;
-        }
-
-        public void deactivate() {
-            super.deactivate();
-            if (_columnSelectCursor != null && !_columnSelectCursor.isDisposed())
-            {
-                _columnSelectCursor.dispose();
-                _columnSelectCursor = null;
-            }
-        }
-
-        private Cursor getColumnSelectCursor()
-        {
-            if (_columnSelectCursor == null)
-            {
-                final Image cursorImage = JSFUIPlugin.getDefault().getImage(COLUMN_SELECT_IMAGE_FILE);
-                _columnSelectCursor = new Cursor(null, cursorImage.getImageData(), 2, 5);
-            }
-            
-            return _columnSelectCursor;
-        }
-        /* (non-Javadoc)
-         * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request)
-         */
-        public Command getCommand(Request request)
-        {
-            IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part.getViewer();
-            Element dataTable = (Element) _part.getIDOMNode();
-            if (request instanceof TableResizeRequest)
-            {
-                return super.getCommand(request);
-            }
-            else if (request instanceof TableInsertRequest)
-            {
-                TableInsertRequest tableInsertRequest = (TableInsertRequest) request;
-                if (tableInsertRequest.isRow())
-                {
-                    // don't support insert row.
-                    return null;
-                }
-                int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1);
-                return new DataTableInsertColumnCommand(viewer, dataTable, index);
-            }
-            else if (request instanceof InsertHeaderFooterRequest)
-            {
-                InsertHeaderFooterRequest req = (InsertHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableInsertHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof DeleteHeaderFooterRequest)
-            {
-                DeleteHeaderFooterRequest req = (DeleteHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableDeleteHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof InsertHColumnHeaderFooterRequest)
-            {
-                InsertHColumnHeaderFooterRequest req = (InsertHColumnHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableInsertColumnHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof DeleteHColumnHeaderFooterRequest)
-            {
-                DeleteHColumnHeaderFooterRequest req = (DeleteHColumnHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableDeleteColumnHeaderCommand(viewer, dataTable, isHeader);
-            }
-            else if (request instanceof TableRowColumnDeleteRequest)
-            {
-                TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request;
-                if (deleteReq.isRow())
-                {
-                    return null;
-                }
-                return new DataTableDeleteColumnCommand(viewer, dataTable, deleteReq.getIndex());
-            }
-            return super.getCommand(request);
-        }
-
-        public Cursor getSelectionToolCursor(Point mouseLocation) 
-        {
-            if (hitTestColumnSelection(mouseLocation))
-            {
-                return getColumnSelectCursor();
-            }
-            
-            return null;
-        }
-
-        protected DragTracker getSelectionTracker(LocationRequest request) {
-            final Point mouseLocator = request.getLocation();
-            if (hitTestColumnSelection(mouseLocator))
-            {
-                ObjectModeDragTracker dragTracker =  new ObjectModeDragTracker(getHost())
-                {
-                    protected boolean handleButtonDown(int button)
-                    {
-                        // only customize the case where we are in a column selection mode
-                        if (button == 1)
-                        {
-                            EditPart retarget = 
-                                getRetargetSelectionEditPart(mouseLocator);
-                            
-                            if (retarget != null)
-                            {
-                                setSourceEditPart(retarget);
-                            }
-                        }
-                        
-                        // default
-                        return super.handleButtonDown(button);
-                    }
-                };
-                
-                dragTracker.setDefaultCursor(getSelectionToolCursor(mouseLocator));
-                return dragTracker;
-            }
-            return new ObjectModeDragTracker(getHost());
-        }
-
-        public DragTracker getSelectionDragTracker(LocationRequest request) {
-            return getSelectionTracker(request);
-        }
-
-        /**
-         * @param mouseLocation
-         * @return the edit part fo the given mouse location
-         */
-        public EditPart getRetargetSelectionEditPart(Point mouseLocation) {
-            if (hitTestColumnSelection(mouseLocation))
-            {
-                GraphicalEditPart editPart = (GraphicalEditPart) getHost();
-                List children = editPart.getChildren();
-                
-                for (Iterator it = children.iterator(); it.hasNext();)
-                {
-                    GraphicalEditPart child = (GraphicalEditPart) it.next();
-
-                    if (child instanceof NodeEditPart)
-                    {
-                        Node childNode = ((NodeEditPart)child).getDOMNode();
-
-                        if (JSFDOMUtil.isHColumn(childNode))
-                        {
-                            Point relativeMousePointer = mouseLocation.getCopy();
-                            IFigure hostFigure = child.getFigure();
-                            hostFigure.translateToRelative(relativeMousePointer);
-                            Rectangle hostBounds = hostFigure.getBounds();
-                            if (relativeMousePointer.x >= hostBounds.x
-                                    && relativeMousePointer.x < hostBounds.x+hostBounds.width)
-                            {
-                                return child;
-                            }
-                        }
-                    }
-                }
-            }
-            
-            // otherwise, don't retarget
-            return null;
-        }
-
-        private boolean hitTestColumnSelection(Point mouseLocation)
-        {
-            final GraphicalEditPart part = (GraphicalEditPart) getHost();
-            final IFigure panelFigure = part.getFigure();
-            
-            Point  relativeLocation = mouseLocation.getCopy();
-            panelFigure.translateToRelative(relativeLocation);
-
-            final int yoffsetAbs = Math.abs(panelFigure.getBounds().y - relativeLocation.y);
-            
-            if (yoffsetAbs <= 4)
-            {
-                return true;
-            }
-            
-            return false;
-        }
-    }
-    
-    /**
-     * @author cbateman
-     *
-     */
-    public static class MyDragMoveEditPolicy extends DragMoveEditPolicy 
-    {
-        protected IPositionMediator createDropChildValidator(
-                DropRequest r) 
-        {
-            DropData dropData = createDropData(r);
-            
-            if (dropData!=null)
-            {
-                DnDPositionValidator validator = 
-                    new DnDPositionValidator(new DropActionData(
-                            ActionData.COMPONENT_MOVE, dropData));
-                validator.addRule(new OnlyColumnsAndFacetsRule(validator.getActionData()));
-                return validator;
-            }
-            return null;
-        }
-        
-        private static class OnlyColumnsAndFacetsRule extends DefaultPositionRule
-        {
-            /**
-             * @param actionData
-             */
-            public OnlyColumnsAndFacetsRule(ActionData actionData) {
-                super(actionData);
-            }
-
-            public boolean isEditable(Target target) {
-                if (IJSFConstants.TAG_IDENTIFIER_DATA_TABLE.isSameTagType(target.getTagWrapper()))
-                {
-                    return isDataDroppable();
-                }
-                
-                return true;
-            }
-            
-            private boolean isDataDroppable()
-            {
-                ActionData actionData = getActionData();
-                if (actionData instanceof DropActionData)
-                {
-                    DropActionData dropActionData = (DropActionData) actionData;
-                    TagIdentifier tagId = 
-                        (TagIdentifier) dropActionData.getDropData().getTagIdentifiers().get(0);
-                            
-                    if (IJSFConstants.TAG_IDENTIFIER_FACET.isSameTagType(tagId)
-                            || IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagId))
-                    {
-                        return true;
-                    }
-                }
-                
-                return false;
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DefaultJSFHTMLElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DefaultJSFHTMLElementEdit.java
deleted file mode 100644
index acfc346..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/DefaultJSFHTMLElementEdit.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.IJSFCoreSupport;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFAddActionGroup;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.JSFNavigationGroup;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DefaultJSFHTMLElementEdit extends AbstractElementEdit
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-    public void fillContextMenu(IMenuManager contextMenu, Element ele)
-    {
-        super.fillContextMenu(contextMenu, ele);
-
-        // next are JSF HTML special support.
-        new JSFAddActionGroup().fillContextMenu(contextMenu, (IDOMElement) ele, new JSFCoreSupport(ele.getLocalName()));
-        new JSFNavigationGroup().fillContextMenu(contextMenu, (IDOMElement) ele, new JSFCoreSupport(ele.getLocalName()));
-    }
-
-    static class JSFCoreSupport implements IJSFCoreSupport
-    {
-        String _localName;
-
-        /**
-         * @param localtag
-         */
-        public JSFCoreSupport(String localtag)
-        {
-            _localName = localtag;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isActionSource()
-         */
-        public boolean isActionSource()
-        {
-            // UICommand.
-            return _localName.startsWith("command"); //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isUIComponent()
-         */
-        public boolean isUIComponent()
-        {
-            return true;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isValueHolder()
-         */
-        public boolean isValueHolder()
-        {
-            // UIOutput
-            return _localName.startsWith("output") || _localName.startsWith("input") //$NON-NLS-1$ //$NON-NLS-2$
-                || _localName.startsWith("select"); //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#isEditableValueHolder()
-         */
-        public boolean isEditableValueHolder()
-        {
-            // UIInput
-            return _localName.startsWith("input") || _localName.startsWith("select"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jst.pagedesigner.jsf.actions.IJSFCoreSupport#supportSelectItems()
-         */
-        public boolean supportSelectItems()
-        {
-            return _localName.startsWith("select"); //$NON-NLS-1$
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/JSFHTMLElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/JSFHTMLElementEditFactory.java
deleted file mode 100644
index ebae8db..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/JSFHTMLElementEditFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHTMLElementEditFactory implements IElementEditFactory
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-     */
-    public IElementEdit createElementEdit(final TagIdentifier tagIdentifier)
-    {
-        if (IJSFConstants.TAG_IDENTIFIER_DATA_TABLE.isSameTagType(tagIdentifier))
-        {
-            return new DataTableElementEdit();
-        }
-        else if (IJSFConstants.TAG_IDENTIFIER_PANEL_GRID.isSameTagType(tagIdentifier))
-        {
-            return new PanelGridElementEdit();
-        }
-        else if (IJSFConstants.TAG_IDENTIFIER_COLUMN.isSameTagType(tagIdentifier))
-        {
-            return new ColumnElementEdit();
-        }
-        return new DefaultJSFHTMLElementEdit();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-     */
-    public String getSupportedURI()
-    {
-        return ITLDConstants.URI_JSF_HTML;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/PanelGridElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/PanelGridElementEdit.java
deleted file mode 100644
index 6719607..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfhtml/PanelGridElementEdit.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.jsfhtml;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.DeleteHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.actions.InsertHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.DataTableDeleteHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridDeleteColumnCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridDeleteRowCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertColumnCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertFooterCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertHeaderCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.commands.jsfhtml.PanelGridInsertRowCommand;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.DeleteHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request.InsertHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util.PanelGridUtil;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.TableInsertRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizeRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableRowColumnDeleteRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridElementEdit extends DefaultJSFHTMLElementEdit
-{
-    private final static Action  EMPTY_ACTION = new Action()
-    {
-        // TODO: why?
-    };
-    private final static int FAKE_INDEX = -10;
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-    public void fillContextMenu(IMenuManager contextMenu, Element ele)
-    {
-        super.fillContextMenu(contextMenu, ele);
-
-        final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.PanelGrid"));//$NON-NLS-1$
-        tableMenu.add(EMPTY_ACTION);
-        final ElementEditPart gridEditPart = (ElementEditPart) ((IDOMElement) ele).getAdapterFor(EditPart.class);
-
-        // ok, we passed the checking, now let's create the actions.
-        tableMenu.addMenuListener(new IMenuListener()
-        {
-            public void menuAboutToShow(IMenuManager manager)
-            {
-                tableMenu.removeAll();
-                fillPanelGridMenu(gridEditPart, FAKE_INDEX, FAKE_INDEX, tableMenu);
-            }
-        });
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager, org.eclipse.jst.pagedesigner.parts.ElementEditPart, org.eclipse.jst.pagedesigner.parts.NodeEditPart, org.eclipse.jface.viewers.ISelection)
-     */
-    public boolean fillContainerContextMenu(IMenuManager contextMenu, final ElementEditPart elePart,
-            NodeEditPart nodePart, ISelection innerSelection)
-    {
-        Element table = (Element) elePart.getModel();
-        Node node = (Node) nodePart.getModel();
-
-        Element childEle = null;
-        if (node instanceof Element)
-        {
-            childEle = (Element) node;
-        }
-        else
-        {
-            boolean hasElementParent = false;
-            Node nodeBackup = node;
-            while (!IJSFConstants.TAG_PANELGRID.equalsIgnoreCase(nodeBackup.getParentNode().getLocalName()))
-            {
-                nodeBackup = nodeBackup.getParentNode();
-                if (nodeBackup instanceof Element)
-                {
-                    hasElementParent = true;
-                    break;
-                }
-            }
-            if (!hasElementParent)
-            {
-                return false;
-            }
-            childEle = (Element) nodeBackup;
-        }
-
-        PanelGridUtil util = new PanelGridUtil(table);
-        final int cellRow = util.convertRowIndexFromDomToView(util.getDomRowIndex(childEle));
-        final int cellColumn = util.getDomColumnIndex(childEle);
-
-        final IMenuManager tableMenu = new MenuManager(JSFUIPlugin.getResourceString("ElementEdit.Submenu.PanelGrid"));//$NON-NLS-1$
-        tableMenu.add(EMPTY_ACTION);
-
-        // ok, we passed the checking, now let's create the actions.
-        tableMenu.addMenuListener(new IMenuListener()
-        {
-            public void menuAboutToShow(IMenuManager manager)
-            {
-                tableMenu.removeAll();
-                fillPanelGridMenu(elePart, cellRow, cellColumn, tableMenu);
-            }
-        });
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-        return true;
-
-    }
-
-    /**
-     * @param elePart
-     * @param cellRow
-     * @param cellColumn
-     * @param tableMenu
-     */
-    private void fillPanelGridMenu(ElementEditPart elePart, int cellRow, int cellColumn, IMenuManager tableMenu)
-    {
-        SelectEditPartAction action = SelectEditPartAction.create(JSFUIPlugin
-                .getResourceString("ElementEdit.Submenu.PanelGrid.SelectTable"), elePart);//$NON-NLS-1$
-        tableMenu.add(action);
-
-        tableMenu.add(new Separator());
-
-        {
-            InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertRowBefore"), //$NON-NLS-1$
-                    elePart, cellRow, true, true);
-            tableMenu.add(insertRowBeforeAction);
-
-            InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertRowAfter"), //$NON-NLS-1$
-                    elePart, cellRow, true, false);
-            tableMenu.add(insertRowAfterAction);
-
-            tableMenu.add(new Separator());
-        }
-
-        {
-            InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertColumnBefore"), //$NON-NLS-1$
-                    elePart, cellColumn, false, true);
-            tableMenu.add(insertColumnBeforeAction);
-
-            InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertColumnAfter"), //$NON-NLS-1$
-                    elePart, cellColumn, false, false);
-            tableMenu.add(insertColumnAfterAction);
-
-            tableMenu.add(new Separator());
-        }
-
-        {
-            DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteRow"), //$NON-NLS-1$
-                    elePart, cellRow, true);
-            tableMenu.add(deleteRowAction);
-
-            DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteColumn"), //$NON-NLS-1$
-                    elePart, cellColumn, false);
-            tableMenu.add(deleteColumnAction);
-            tableMenu.add(new Separator());
-        }
-
-        {
-            InsertHeaderFooterAction headerAction = new InsertHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertHeader"), //$NON-NLS-1$
-                    elePart, true);
-            tableMenu.add(headerAction);
-
-            InsertHeaderFooterAction footerAction = new InsertHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.InsertFooter"), //$NON-NLS-1$
-                    elePart, false);
-            tableMenu.add(footerAction);
-
-            DeleteHeaderFooterAction delHeaderAction = new DeleteHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGird.DeleteHeader"), elePart, true);//$NON-NLS-1$
-            tableMenu.add(delHeaderAction);
-
-            DeleteHeaderFooterAction delFooterAction = new DeleteHeaderFooterAction(JSFUIPlugin
-                    .getResourceString("ElementEdit.Submenu.PanelGrid.DeleteFooter"), elePart, false);//$NON-NLS-1$
-            tableMenu.add(delFooterAction);
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-     */
-    public void createEditPolicies(ElementEditPart part)
-    {
-        part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new PanelGridResizePolicy(part));
-    }
-
-    static class PanelGridResizePolicy extends ElementResizableEditPolicy
-    {
-        ElementEditPart _part;
-
-        /**
-         * @param part
-         */
-        public PanelGridResizePolicy(ElementEditPart part)
-        {
-            _part = part;
-        }
-
-        public Cursor getSelectionToolCursor(Point mouseLocation) 
-        {
-            final GraphicalEditPart part = (GraphicalEditPart) getHost();
-            final IFigure panelFigure = part.getFigure();
-            
-            Point  relativeLocation = mouseLocation.getCopy();
-            panelFigure.translateToRelative(relativeLocation);
-            
-            // row cursor if we are within +/- 2 pixels of the left side
-            final int xoffsetAbs = Math.abs(panelFigure.getBounds().x - relativeLocation.x);
-
-            if (xoffsetAbs <= 2)
-            {
-                return SharedCursors.SIZEE;
-            }
-            
-            final int yoffsetAbs = Math.abs(panelFigure.getBounds().y - relativeLocation.y);
-            
-            if (yoffsetAbs <= 2)
-            {
-                return SharedCursors.SIZEW;
-            }
-            
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request)
-         */
-        public Command getCommand(Request request)
-        {
-            IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part.getViewer();
-            Element panelGrid = (Element) _part.getIDOMNode();
-            if (request instanceof TableResizeRequest)
-            {
-                return super.getCommand(request);
-            }
-            else if (request instanceof TableInsertRequest)
-            {
-                TableInsertRequest tableInsertRequest = (TableInsertRequest) request;
-                if (tableInsertRequest.isRow())
-                {
-                    int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1);
-                    return new PanelGridInsertRowCommand(viewer, panelGrid, index);
-                }
-                int index = tableInsertRequest.getIndex() + (tableInsertRequest.isBefore() ? 0 : 1);
-                return new PanelGridInsertColumnCommand(viewer, panelGrid, index);
-            }
-            else if (request instanceof InsertHeaderFooterRequest)
-            {
-                InsertHeaderFooterRequest req = (InsertHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                if (isHeader)
-                {
-                    return new PanelGridInsertHeaderCommand(viewer, panelGrid);
-                }
-                return new PanelGridInsertFooterCommand(viewer, panelGrid);
-            }
-            else if (request instanceof DeleteHeaderFooterRequest)
-            {
-                DeleteHeaderFooterRequest req = (DeleteHeaderFooterRequest) request;
-                boolean isHeader = req.isHeader();
-                return new DataTableDeleteHeaderCommand(viewer, panelGrid, isHeader);
-            }
-            else if (request instanceof TableRowColumnDeleteRequest)
-            {
-                TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request;
-                if (deleteReq.isRow())
-                {
-                    return new PanelGridDeleteRowCommand(viewer, panelGrid, deleteReq.getIndex());
-                }
-                return new PanelGridDeleteColumnCommand(viewer, panelGrid, deleteReq.getIndex());
-            }
-            return super.getCommand(request);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHColumnHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHColumnHeaderFooterRequest.java
deleted file mode 100644
index 076fd74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHColumnHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHColumnHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public DeleteHColumnHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHeaderFooterRequest.java
deleted file mode 100644
index d935652..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/DeleteHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public DeleteHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHColumnHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHColumnHeaderFooterRequest.java
deleted file mode 100644
index 34e3d4a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHColumnHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHColumnHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public InsertHColumnHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHeaderFooterRequest.java
deleted file mode 100644
index 31e853f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/request/InsertHeaderFooterRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.request;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterRequest extends Request
-{
-    private boolean _isHeader;
-
-    /**
-     * @param type
-     * @param isHeader
-     */
-    public InsertHeaderFooterRequest(String type, boolean isHeader)
-    {
-        super(type);
-        this._isHeader = isHeader;
-    }
-
-    /**
-     * @return Returns the _isHeader.
-     */
-    public boolean isHeader()
-    {
-        return _isHeader;
-    }
-
-    /**
-     * @param header The _isHeader to set.
-     */
-    public void setHeader(boolean header)
-    {
-        _isHeader = header;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/DataTableUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/DataTableUtil.java
deleted file mode 100644
index 15c08ad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/DataTableUtil.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataTableUtil
-{
-    private static final int INVALID_POSITION = -10;
-    private Element          _dataTable       = null;
-
-    /**
-     * @param dataTable
-     */
-    public DataTableUtil(Element dataTable)
-    {
-        this._dataTable = dataTable;
-    }
-
-    /**
-     * @param column
-     * @return the column index for column
-     */
-    public int getColumnIndex(Element column)
-    {
-        NodeList nodeList = this._dataTable.getElementsByTagName("h:column"); //$NON-NLS-1$
-        if (nodeList != null)
-        {
-            for (int i = 0, size = nodeList.getLength(); i < size; i++)
-            {
-                if (column == (Element) nodeList.item(i))
-                {
-                    return i;
-                }
-            }
-        }
-        return INVALID_POSITION;
-    }
-
-    /**
-     * @param child
-     * @return the hcolumn parent of child or null if not found
-     */
-    public Element findHColumnParent(Node child)
-    {
-        if (child == null)
-        {
-            return null;
-        }
-
-        Node childBackup = child;
-        boolean hasHColumnParent = false;
-
-        if (JSFDOMUtil.isHColumn(child))
-        {
-            return (Element) child;
-        }
-        while (!IJSFConstants.TAG_DATATABLE.equalsIgnoreCase(childBackup.getParentNode().getLocalName()))
-        {
-            childBackup = childBackup.getParentNode();
-            String tagName = childBackup.getLocalName();
-            if (IJSFConstants.TAG_COLUMN.equalsIgnoreCase(tagName))
-            {
-                hasHColumnParent = true;
-                break;
-            }
-        }
-
-        if (hasHColumnParent)
-        {
-            return (Element) childBackup;
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/PanelGridUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/PanelGridUtil.java
deleted file mode 100644
index 8c19239..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/util/PanelGridUtil.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.elementedit.util;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.jsf.core.dom.JSFDOMUtil;
-import org.w3c.dom.Element;
-
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PanelGridUtil
-{
-    private static final int INVALID_POSITION = -10;
-    private Element          _panelGrid       = null;
-
-    /**
-     * @param panelGrid
-     */
-    public PanelGridUtil(Element panelGrid)
-    {
-        this._panelGrid = panelGrid;
-    }
-
-    /**
-     * @param domIndex
-     * @return the row index in the panel of the relative dom index
-     */
-    public int convertRowIndexFromDomToView(int domIndex)
-    {
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(this._panelGrid, "header") != null); //$NON-NLS-1$
-        boolean hasFooterRow = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null); //$NON-NLS-1$
-        if (!hasFooterRow)
-        {
-            return domIndex;
-        }
-        if (domIndex == 0)
-        {
-            return domIndex;
-        }
-        if (hasHeaderRow)
-        {
-            if (domIndex > 1)
-            {
-                return domIndex - 1;
-            }
-        }
-        else
-        {
-            if (domIndex > 0)
-            {
-                return domIndex - 1;
-            }
-        }
-        //must be footer
-        int uiRows = getUIRowCount();
-        return domIndex + uiRows;
-    }
-
-    /**
-     * @param cell
-     * @return the dom row index of cell in the panel
-     */
-    public int getDomRowIndex(Element cell)
-    {
-        boolean hasHeaderRow = (JSFDOMUtil.findFacet(this._panelGrid, "header") != null); //$NON-NLS-1$
-        boolean hasFooterRow = (JSFDOMUtil.findFacet(this._panelGrid, "footer") != null); //$NON-NLS-1$
-        //if cell is header or footer
-        boolean isFacet = JSFDOMUtil.isFacet(cell);
-        Element parent = (Element) cell.getParentNode();
-        boolean isParentFacet = JSFDOMUtil.isFacet(parent);
-        if (isParentFacet)
-        {
-            cell = parent;
-        }
-        if (isFacet || isParentFacet)
-        {
-            String attrName = cell.getAttribute("name"); //$NON-NLS-1$
-            if ("header".equalsIgnoreCase(attrName)) //$NON-NLS-1$
-            {
-                return 0;
-            }
-            else if ("footer".equalsIgnoreCase(attrName)) //$NON-NLS-1$
-            {
-                if (hasHeaderRow)
-                {
-                    return 1;
-                }
-                return 0;
-            }
-        }
-
-        int columns = DOMUtil.getIntAttributeIgnoreCase(this._panelGrid, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        int pos = getPosition(cell);
-        int rowIndex = pos / columns;
-
-        if (hasHeaderRow)
-        {
-            rowIndex++;
-        }
-        if (hasFooterRow)
-        {
-            rowIndex++;
-        }
-
-        return rowIndex;
-    }
-
-    /**
-     * @param cell
-     * @return the column index of cell in the panel
-     */
-    public int getDomColumnIndex(Element cell)
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(this._panelGrid, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        int pos = getPosition(cell);
-        //if position is at header or footer,then insert column action should be disabled
-        if (pos == INVALID_POSITION)
-        {
-            return pos;
-        }
-
-        int columnIndex = pos % columns;
-        return columnIndex;
-    }
-
-    /**
-     * @return the row count in the panel
-     */
-    public int getUIRowCount()
-    {
-        int columns = DOMUtil.getIntAttributeIgnoreCase(this._panelGrid, IJSFConstants.ATTR_COLUMNS, 1);
-        if (columns < 1)
-        {
-            columns = 1;
-        }
-        List children = JSFDOMUtil.getUIComponentChildren(this._panelGrid);
-        int numRows = (children.size() + columns - 1) / columns;
-
-        return numRows;
-    }
-
-    private int getPosition(Element cell)
-    {
-        List children = JSFDOMUtil.getUIComponentChildren(this._panelGrid);
-        int size = children.size();
-        int i = 0;
-        for (i = 0; i < size; i++)
-        {
-            if (cell == children.get(i))
-            {
-                break;
-            }
-        }
-        if (i == size)
-        {
-            return INVALID_POSITION;
-        }
-        return i;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/IInputWidgetTypes.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/IInputWidgetTypes.java
deleted file mode 100644
index a2df68a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/IInputWidgetTypes.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-interface IInputWidgetTypes 
-{
-    /**
-     *  a hidden input
-     */
-    public static final int       HIDDEN   = 0;
-    /**
-     * a secret input
-     */
-    public static final int       SECRET   = 1;
-    /**
-     * an input box
-     */
-    public static final int       TEXT     = 2;
-    /**
-     * an input text area
-     */
-    public static final int       TEXTAREA = 3;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertDateTimeGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertDateTimeGroup.java
deleted file mode 100644
index e69ed40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertDateTimeGroup.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StyleComboDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.properties.internal.AttributeGroup;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This group could be used in both section and dialog.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class JSFCoreConvertDateTimeGroup extends AttributeGroup//AttributeGroup
-{
-    private StyleComboDialogField      _typeField;
-    private StyleComboDialogField      _dateStyleField;
-    private StyleComboDialogField      _timeStyleField;
-    private StyleComboDialogField      _patternField;
-
-    final private static String[] TYPES            = { "date", "time", "both" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                                                   };
-    final private static String[] DATESTYLES       = { "default", "short", "medium", "long", "full", "custom" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-                                                   };
-    final private static String[] TIMESTYLES       = { "default", "short", "medium", "long", "full", "custom" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-                                                   };
-    final private static String[] DATEPATTERNS     = { "", "M/d/yy", "EEE, M/d/yy", "MM/dd/yyyy", "EEE, MM/dd/yyyy", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-            "MMM d, yyyy", "EEE, MMM d, yyyy", "MMMM d, yyyy", "EEEE, MMMM d, yyyy", "MMMM yyyy" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-                                                   };
-    final private static String[] TIMEPATTERNS     = { "", "hh:mm", "hh:mm z", "HH:mm z", "HH:mm:ss z" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-                                                   };
-    final private static String[] DATETIMEPATTERNS = {
-            "", "M/d/yy hh:mm", "EEE, M/d/yy hh:mm", "MM/dd/yyyy HH:mm:ss z", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-            "EEE, MM/dd/yyyy HH:mm:ss z", "MMM d, yyyy HH:mm z", "EEE, MMM d, yyyy HH:mm z", "MMMM d, yyyy HH:mm z", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-            "EEEE, MMMM d, yyyy HH:mm z" //$NON-NLS-1$
-                                                   };
-
-    /**
-     * The default constructor
-     */
-    public JSFCoreConvertDateTimeGroup()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_CONVERTDATETIME, new String[] { IJSFConstants.ATTR_TYPE,
-                IJSFConstants.ATTR_DATESTYLE, IJSFConstants.ATTR_TIMESTYLE, IJSFConstants.ATTR_PATTERN});
-    }
-
-    protected DialogField createDialogField(IPropertyPageDescriptor ppd) {
-        EditorCreator creator = EditorCreator.getInstance();        
-        if (ppd.getAttributeName().equals(IJSFConstants.ATTR_TYPE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-                    .createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _typeField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_DATESTYLE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _dateStyleField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            _dateStyleField.setItems(DATESTYLES);
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_TIMESTYLE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _timeStyleField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            _timeStyleField.setItems(TIMESTYLES);
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_PATTERN))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _patternField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else
-        {
-            return null;
-        }    	
-    }
-    
-    protected IDialogFieldApplyListener getDialogFieldApplyListener(IPropertyPageDescriptor ppd)
-    {
-        String attribute = ppd.getAttributeName();
-        if (attribute.equals(IJSFConstants.ATTR_TYPE) || attribute.equals(IJSFConstants.ATTR_DATESTYLE)
-                || attribute.equals(IJSFConstants.ATTR_TIMESTYLE))
-        {
-            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
-            {
-                public void dialogFieldApplied(DialogField field)
-                {
-                    updatePatternItems();
-                    updateFieldStatus();
-                    updateFieldData();
-                }
-            };
-            return listener;
-        }
-        else if (attribute.equals(IJSFConstants.ATTR_PATTERN))
-        {
-            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
-            {
-                public void dialogFieldApplied(DialogField field)
-                {
-                    updateFieldStatus();
-                    updateFieldData();
-                }
-            };
-            return listener;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.properties.attrgroup.AttributeGroup#refreshData()
-     */
-
-    public void refreshData()
-    {
-        IDOMElement element = getElement();
-
-        String type = element.getAttribute(IJSFConstants.ATTR_TYPE);
-        _typeField.setTextWithoutUpdate(type);
-
-        String dateStyle = element.getAttribute(IJSFConstants.ATTR_DATESTYLE);
-        if (!_dateStyleField.getText().equalsIgnoreCase(DATESTYLES[5]))
-        {
-            _dateStyleField.setTextWithoutUpdate(dateStyle);
-        }
-
-        String timeStyle = element.getAttribute(IJSFConstants.ATTR_TIMESTYLE);
-        if (!_timeStyleField.getText().equalsIgnoreCase(TIMESTYLES[5]))
-        {
-            _timeStyleField.setTextWithoutUpdate(timeStyle);
-        }
-
-        updatePatternItems();
-        String pattern = element.getAttribute(IJSFConstants.ATTR_PATTERN);       
-        _patternField.setTextWithoutUpdate(pattern);
-
-        updateFieldStatus();
-    }
-
-    /**
-     * 
-     */
-    private void updateFieldStatus()
-    {
-        String type = _typeField.getText();
-        String dateStyle = _dateStyleField.getText();
-        String timeStyle = _timeStyleField.getText();
-
-        if (type.equalsIgnoreCase(TYPES[0]))
-        {
-            _dateStyleField.setEnabled(true);
-            _timeStyleField.setEnabled(false);
-            if (dateStyle.equalsIgnoreCase(DATESTYLES[5]))
-            {
-                _patternField.setEnabled(true);
-            }
-            else
-            {
-                _patternField.setEnabled(false);
-            }
-        }
-        else if (type.equalsIgnoreCase(TYPES[1]))
-        {
-            _dateStyleField.setEnabled(false);
-            _timeStyleField.setEnabled(true);
-            if (timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-            {
-                _patternField.setEnabled(true);
-            }
-            else
-            {
-                _patternField.setEnabled(false);
-            }
-        }
-        else if (type.equalsIgnoreCase(TYPES[2]))
-        {
-            _dateStyleField.setEnabled(true);
-            _timeStyleField.setEnabled(true);
-            if (dateStyle.equalsIgnoreCase(DATESTYLES[5]) || timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-            {
-                _patternField.setEnabled(true);
-            }
-            else
-            {
-                _patternField.setEnabled(false);
-            }
-        }
-    }
-
-    private void updatePatternItems()
-    {
-        String type = _typeField.getText();
-        String dateStyle = _dateStyleField.getText();
-        String timeStyle = _timeStyleField.getText();
-
-        if (type.equalsIgnoreCase(TYPES[0]) && dateStyle.equalsIgnoreCase(DATESTYLES[5]))
-        {
-            _patternField.getComboControl(null, null).removeAll();
-            _patternField.getComboControl(null, null).setItems(DATEPATTERNS);
-        }
-
-        if (type.equalsIgnoreCase(TYPES[1]) && timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-        {
-            _patternField.getComboControl(null, null).removeAll();
-            _patternField.getComboControl(null, null).setItems(TIMEPATTERNS);
-        }
-
-        if (type.equalsIgnoreCase(TYPES[2])
-                && (dateStyle.equalsIgnoreCase(DATESTYLES[5]) || timeStyle.equalsIgnoreCase(TIMESTYLES[5])))
-        {
-            _patternField.getComboControl(null, null).removeAll();
-            _patternField.getComboControl(null, null).setItems(DATETIMEPATTERNS);
-        }
-    }
-
-    private void updateFieldData()
-    {
-        String type = _typeField.getText();
-        String dateStyle = _dateStyleField.getText();
-        String timeStyle = _timeStyleField.getText();
-        String pattern = _patternField.getText();
-
-        // update the model
-        if (!_dateStyleField.isEnabled() || dateStyle.equalsIgnoreCase(DATESTYLES[5]))
-        {
-            dateStyle = ""; //$NON-NLS-1$
-        }
-
-        if (!_timeStyleField.isEnabled() || timeStyle.equalsIgnoreCase(TIMESTYLES[5]))
-        {
-            timeStyle = ""; //$NON-NLS-1$
-        }
-
-        if (!_patternField.isEnabled())
-        {
-            pattern = ""; //$NON-NLS-1$
-
-        }
-
-        Map map = new HashMap();
-        map.put(IJSFConstants.ATTR_TYPE, type);
-        map.put(IJSFConstants.ATTR_DATESTYLE, dateStyle);
-        map.put(IJSFConstants.ATTR_TIMESTYLE, timeStyle);
-        map.put(IJSFConstants.ATTR_PATTERN, pattern);
-
-        ChangeAttributeCommand c = new ChangeAttributeCommand(SectionResources
-                .getString("JSFCoreConvertDateTimeSection.ChangeAttribute"), getElement(), map); //$NON-NLS-1$
-        c.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertNumberGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertNumberGroup.java
deleted file mode 100644
index 75a5d2f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFCoreConvertNumberGroup.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StyleComboDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.properties.internal.AttributeGroup;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- */
-public class JSFCoreConvertNumberGroup extends AttributeGroup
-{
-    private StyleComboDialogField _typeField;
-    private StyleComboDialogField _patternField;
-    private StyleComboDialogField _currencyCodeField;
-    private StringDialogField     _currencySymbolField;
-
-    final private static String[] TYPES = { "number", "currency", "percentage", "custom" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-                                        };
-
-    /**
-     * The default constructor
-     */
-    public JSFCoreConvertNumberGroup()
-    {
-        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_CONVERTNUMBER, new String[] { IJSFConstants.ATTR_TYPE,
-                IJSFConstants.ATTR_CURRENCYCODE, IJSFConstants.ATTR_CURRENCYSYMBOL, IJSFConstants.ATTR_PATTERN});
-    }
-
-    protected DialogField createDialogField(IPropertyPageDescriptor ppd)
-    {
-    	EditorCreator creator = EditorCreator.getInstance();
-        if (ppd.getAttributeName().equals(IJSFConstants.ATTR_TYPE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _typeField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-                    _typeField.setItems(TYPES);
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_CURRENCYCODE))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _currencyCodeField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_CURRENCYSYMBOL))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            		.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _currencySymbolField = (StringDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_PATTERN))
-        {
-            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
-            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
-            _patternField = (StyleComboDialogField) wrapper.getWrappedDialogField();
-            return wrapper;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    public IDialogFieldApplyListener getDialogFieldApplyListener(IPropertyPageDescriptor ppd)
-    {
-        String attribute = ppd.getAttributeName();
-        if (attribute.equals(IJSFConstants.ATTR_CURRENCYCODE) || attribute.equals(IJSFConstants.ATTR_CURRENCYSYMBOL)
-                || attribute.equals(IJSFConstants.ATTR_PATTERN))
-        {
-            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
-            {
-                public void dialogFieldApplied(DialogField field)
-                {
-                    updateFieldData();
-                }
-            };
-            return listener;
-        }
-        else if (attribute.equals(IJSFConstants.ATTR_TYPE))
-        {
-            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
-            {
-                public void dialogFieldApplied(DialogField field)
-                {
-                    updateFieldStatus();
-                    updateFieldData();
-                }
-            };
-            return listener;
-        }
-        else
-        {
-            return null;
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.pagedesigner.properties.attrgroup.AttributeGroup#refreshData()
-     */
-    public void refreshData()
-    {
-        IDOMElement element = getElement();
-
-        String type = element.getAttribute(IJSFConstants.ATTR_TYPE);
-        if (!_typeField.getText().equalsIgnoreCase(TYPES[3]))
-        {
-            _typeField.setTextWithoutUpdate(type);
-        }
-
-        String currencyCode = element.getAttribute(IJSFConstants.ATTR_CURRENCYCODE);
-        _currencyCodeField.setTextWithoutUpdate(currencyCode);
-
-        String currencySymbol = element.getAttribute(IJSFConstants.ATTR_CURRENCYSYMBOL);
-        _currencySymbolField.setTextWithoutUpdate(currencySymbol);
-
-        String pattern = element.getAttribute(IJSFConstants.ATTR_PATTERN);
-        _patternField.setTextWithoutUpdate(pattern);
-
-        updateFieldStatus();
-    }
-
-    private void updateFieldStatus()
-    {
-        String type = _typeField.getText();
-
-        if (type.equalsIgnoreCase(TYPES[0]))
-        {
-            _currencyCodeField.setEnabled(false);
-            _currencySymbolField.setEnabled(false);
-            _patternField.setEnabled(false);
-        }
-        else if (type.equalsIgnoreCase(TYPES[1]))
-        {
-            _currencyCodeField.setEnabled(true);
-            _currencySymbolField.setEnabled(true);
-            _patternField.setEnabled(false);
-        }
-        else if (type.equalsIgnoreCase(TYPES[2]))
-        {
-            _currencyCodeField.setEnabled(false);
-            _currencySymbolField.setEnabled(false);
-            _patternField.setEnabled(false);
-        }
-        else if (type.equalsIgnoreCase(TYPES[3]))
-        {
-            _currencyCodeField.setEnabled(false);
-            _currencySymbolField.setEnabled(false);
-            _patternField.setEnabled(true);
-        }
-    }
-
-    private void updateFieldData()
-    {
-        String type = _typeField.getText();
-        String currencyCode = _currencyCodeField.getText();
-        String currencySymbol = _currencySymbolField.getText();
-        String pattern = _patternField.getText();
-
-        // update the model
-        if (type.equalsIgnoreCase(TYPES[3]))
-        {
-            type = ""; //$NON-NLS-1$
-        }
-
-        if (!_currencyCodeField.isEnabled())
-        {
-            currencyCode = ""; //$NON-NLS-1$
-        }
-
-        if (!_currencySymbolField.isEnabled())
-        {
-            currencySymbol = ""; //$NON-NLS-1$
-        }
-
-        if (!_patternField.isEnabled())
-        {
-            pattern = ""; //$NON-NLS-1$
-        }
-
-        Map map = new HashMap();
-        map.put(IJSFConstants.ATTR_TYPE, type);
-        map.put(IJSFConstants.ATTR_CURRENCYCODE, currencyCode);
-        map.put(IJSFConstants.ATTR_CURRENCYSYMBOL, currencySymbol);
-        map.put(IJSFConstants.ATTR_PATTERN, pattern);
-
-        ChangeAttributeCommand c = new ChangeAttributeCommand(SectionResources
-                .getString("JSFCoreConvertNumberSection.CommandLabel.ChangeAttribute"), getElement(), map); //$NON-NLS-1$
-        c.execute();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java
deleted file mode 100644
index 33e7916..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlActionListenerSection extends BaseCustomSection
-{
-    final private static String[] LISTENTYPES = { "Action"}; //$NON-NLS-1$
-
-    private IDOMElement            _element;
-    private Table                 _listenersTable;
-    private TableViewer           _listenersViewer;
-    private CCombo                _listenTypeCombo;
-    private Button                _listenAddButton, _listenRemoveButton;
-
-    private class ListenerContentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("Listener") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // no support for viewer changes
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof Node)
-            {
-                Node node = (Node) element;
-                String nodeName = getTableNodeName(node, "type"); //$NON-NLS-1$
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = nodeName;
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        private String getTableNodeName(Node node, String ... attrNames) {
-        	for (String attrName : attrNames) {
-        		Node attr = node.getAttributes().getNamedItem(attrName);
-        		if (attr != null && attr.getNodeValue()!= null && 
-        				! attr.getNodeValue().trim().equals("")) //$NON-NLS-1$
-        			return attr.getNodeValue().trim();
-        	}
-			return node.getNodeName();
-		}
-
-		public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: listeners not supported?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: listeners not supported?
-        }
-    }
-
-     /**
-     * Default constructor
-     */
-    public JSFHtmlActionListenerSection()
-    {
-        super();
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createListenerPart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createListenerPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _listenersTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 4;
-        data.heightHint = 50;
-        data.widthHint = 100;
-        _listenersTable.setHeaderVisible(true);
-        _listenersTable.setLayoutData(data);
-        _listenersTable.setLinesVisible(true);
-
-        TableColumn listenColumn = new TableColumn(_listenersTable, SWT.NONE);
-        listenColumn.setText(SectionResources.getString("JSFHtmlCommandButtonSection.Listeners")); //$NON-NLS-1$
-        listenColumn.setWidth(500);
-
-        _listenersViewer = new TableViewer(_listenersTable);
-        _listenersViewer.setContentProvider(new ListenerContentLabelProvider());
-        _listenersViewer.setLabelProvider(new ListenerContentLabelProvider());
-        _listenersViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _listenersViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateListenerButtonStatus();
-            }
-        });
-
-        _listenTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _listenTypeCombo.setItems(LISTENTYPES);
-        _listenTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenTypeCombo.setLayoutData(data);
-
-        _listenAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlCommandButtonSection.Add"), //$NON-NLS-1$
-                SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenAddButton.setLayoutData(data);
-        _listenAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                String listener = _listenTypeCombo.getText();
-                listener = listener.substring(0, 1).toLowerCase() + listener.substring(1) + "Listener"; //$NON-NLS-1$
-                AddSubNodeCommand c = new AddSubNodeCommand(
-                        SectionResources.getString("JSFHtmlCommandButtonSection.CommandLabel.AddSubTag"), _element, listener, ITLDConstants.URI_JSF_CORE, attributes); //$NON-NLS-1$
-                c.execute();
-                _listenersViewer.refresh();
-                updateListenerButtonStatus();
-            }
-        });
-        _listenRemoveButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlCommandButtonSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenRemoveButton.setLayoutData(data);
-        _listenRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _listenersViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources
-                                .getString("JSFHtmlCommandButtonSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _listenersViewer.refresh();
-                    updateListenerButtonStatus();
-                }
-            }
-        });
-    }
-
-    private void updateListenerButtonStatus()
-    {
-        _listenRemoveButton.setEnabled(true);
-        ISelection selection = _listenersViewer.getSelection();
-        if (selection == null || selection.isEmpty())
-        {
-            _listenRemoveButton.setEnabled(false);
-        }
-        if (_listenersTable.getItemCount() == 0)
-        {
-            _listenRemoveButton.setEnabled(false);
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-        _element = (IDOMElement) DesignerPropertyTool.getElement(part, selection);
-        if (_listenersViewer != null)
-        	_listenersViewer.setInput(_element);
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
-    {
-        if(_listenersViewer != null && !_listenersViewer.getControl().isDisposed())
-        {
-            _listenersViewer.refresh();
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.java
deleted file mode 100644
index 92bd788..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.InsertSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlDataTableColumnsSection extends BaseCustomSection
-{
-    private Table                  _columnsTable;
-    private TableViewer            _columnsViewer;
-    private Button                 _addButton, _removeButton, _moveUpButton, _moveDownButton;
-
-    final static private String           DEFAULT_COLUMN_NAME = "column"; //$NON-NLS-1$
-    final static private String           DEFAULT_FACET_NAME  = "header"; //$NON-NLS-1$
-    final static private String           DEFAULT_TEXT_NAME   = "text"; //$NON-NLS-1$
-
-    class ColumnCotentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("column") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // no support for input changed
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = node.getAttribute(IJSFConstants.ATTR_ID);
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-    }
-
-    /**
-     * default constructor
-     */
-    public JSFHtmlDataTableColumnsSection()
-    {
-        super();
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createColumnPart(factory, top);
-    }
-    
-    private void createColumnPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _columnsTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 4;
-        data.widthHint = 10;
-        data.heightHint = 50;
-        _columnsTable.setHeaderVisible(true);
-        _columnsTable.setLayoutData(data);
-        _columnsTable.setLinesVisible(true);
-
-        TableColumn column = new TableColumn(_columnsTable, SWT.NONE);
-        column.setText(SectionResources.getString("JSFHtmlDataTableSection.Columns")); //$NON-NLS-1$
-        column.setWidth(200);
-
-        _columnsViewer = new TableViewer(_columnsTable);
-        _columnsViewer.setContentProvider(new ColumnCotentLabelProvider());
-        _columnsViewer.setLabelProvider(new ColumnCotentLabelProvider());
-        _columnsViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        }
-        );
-        _columnsViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateButtonStatus();
-            }
-        }
-        );
-
-        // add buttons group
-        _addButton = factory.createButton(other, SectionResources.getString("JSFHtmlDataTableSection.Add"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _addButton.setLayoutData(data);
-        _addButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                int count = _columnsTable.getItemCount();
-
-                Map attributes = new HashMap();
-                attributes.put(IJSFConstants.ATTR_ID, DEFAULT_COLUMN_NAME + (count + 1));
-                AddSubNodeCommand c = new AddSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.AddSubTag"), _element, "column", //$NON-NLS-1$ //$NON-NLS-2$
-                ITLDConstants.URI_JSF_HTML, attributes);
-                c.execute();
-
-                IDOMElement child = c.getChildNode();
-                attributes = new HashMap();
-                attributes.put(IJSFConstants.ATTR_NAME, DEFAULT_FACET_NAME);
-                c = new AddSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.AddSubTag"), child, "facet", ITLDConstants.URI_JSF_CORE, attributes); //$NON-NLS-1$ //$NON-NLS-2$
-                c.execute();
-
-                child = c.getChildNode();
-                attributes = new HashMap();
-                attributes.put(IJSFConstants.ATTR_ID, DEFAULT_TEXT_NAME + (count + 1));
-                attributes.put(IJSFConstants.ATTR_VALUE, DEFAULT_COLUMN_NAME + (count + 1));
-                c = new AddSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.AddSubTag"), child, "outputText", ITLDConstants.URI_JSF_HTML, attributes); //$NON-NLS-1$ //$NON-NLS-2$
-                c.execute();
-
-                _columnsViewer.refresh();
-                //                if (c.getChildNode() != null)
-                //                {
-                //                    gotoNode(c.getChildNode());
-                //                }
-                updateButtonStatus();
-            }
-        }
-        );
-        _removeButton = factory.createButton(other, SectionResources.getString("JSFHtmlDataTableSection.Remove"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _removeButton.setLayoutData(data);
-        _removeButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _columnsViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _columnsViewer.refresh();
-                    updateButtonStatus();
-                }
-            }
-        }
-        );
-        _moveUpButton = factory.createButton(other, SectionResources.getString("JSFHtmlDataTableSection.MoveUp"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _moveUpButton.setLayoutData(data);
-        _moveUpButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                int index = _columnsTable.getSelectionIndex();
-                IDOMElement child = (IDOMElement) _columnsTable.getItem(index).getData();
-                IDOMElement refchild = (IDOMElement) _columnsTable.getItem(index - 1).getData();
-                RemoveSubNodeCommand remove = new RemoveSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.RemoveSubTag"), _element, child); //$NON-NLS-1$
-                remove.execute();
-                InsertSubNodeCommand insert = new InsertSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.InsertSubTag"), _element, child, refchild); //$NON-NLS-1$
-                insert.execute();
-                _columnsViewer.refresh();
-                updateButtonStatus();
-            }
-        }
-        );
-        _moveDownButton = factory.createButton(other, SectionResources.getString("JSFHtmlDataTableSection.MoveDown"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _moveDownButton.setLayoutData(data);
-        _moveDownButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                int index = _columnsTable.getSelectionIndex();
-                IDOMElement child = (IDOMElement) _columnsTable.getItem(index).getData();
-                IDOMElement refchild = (IDOMElement) _columnsTable.getItem(index + 1).getData();
-                RemoveSubNodeCommand remove = new RemoveSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.RemoveSubTag"), _element, refchild); //$NON-NLS-1$
-                remove.execute();
-                InsertSubNodeCommand insert = new InsertSubNodeCommand(SectionResources.getString("JSFHtmlDataTableSection.CommandLabel.InsertSubTag"), _element, refchild, child); //$NON-NLS-1$
-                insert.execute();
-                _columnsViewer.refresh();
-                updateButtonStatus();
-            }
-        }
-        );
-    }
-    
-    /**
-     * Update the button status
-     */
-    private void updateButtonStatus()
-    {
-        _removeButton.setEnabled(true);
-        _moveUpButton.setEnabled(true);
-        _moveDownButton.setEnabled(true);
-        ISelection selection = _columnsViewer.getSelection();
-        if (selection.isEmpty())
-        {
-            _removeButton.setEnabled(false);
-            _moveUpButton.setEnabled(false);
-            _moveDownButton.setEnabled(false);
-        }
-        if (_columnsTable.getItemCount() == 0)
-        {
-            _removeButton.setEnabled(false);
-            _moveUpButton.setEnabled(false);
-            _moveDownButton.setEnabled(false);
-        }
-        if (_columnsTable.getSelectionCount() > 1)
-        {
-            _moveUpButton.setEnabled(false);
-            _moveDownButton.setEnabled(false);
-        }
-        if (_columnsTable.getSelectionIndex() == 0)
-        {
-            _moveUpButton.setEnabled(false);
-        }
-        if (_columnsTable.getSelectionIndex() == _columnsTable.getItemCount() - 1)
-        {
-            _moveDownButton.setEnabled(false);
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _columnsViewer.setInput(_element);
-
-        updateButtonStatus();
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
-    {
-        if(_columnsViewer != null && !_columnsViewer.getControl().isDisposed())
-        {
-            _columnsViewer.refresh();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputHiddenTypeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputHiddenTypeSection.java
deleted file mode 100644
index 77c1be1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputHiddenTypeSection.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeTagCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputHiddenTypeSection extends BaseCustomSection
-{
-    private RadiosDialogField     _typesField;
-
-    final private static String[] TYPES    = { SectionResources.getString("JSFHtmlInputHiddenSection.Type0"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type1"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type2"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type3") //$NON-NLS-1$
-                                           };
-
-    /**
-     * The default constructor
-     */
-    public JSFHtmlInputHiddenTypeSection()
-    {
-        super();
-        _typesField = new RadiosDialogField();
-        _typesField.setLabelText(SectionResources.getString("JSFHtmlInputHiddenSection.Type")); //$NON-NLS-1$
-        _typesField.setItems(TYPES);
-        _typesField.setDialogFieldApplyListener(new IDialogFieldApplyListener()
-        {
-            public void dialogFieldApplied(DialogField field)
-            {
-                int type = _typesField.getSelectedIndex();
-                String prefix = _element.getPrefix();
-                String localTag = toLocalTag(type);
-                String newtag = prefix + ":" + localTag; //$NON-NLS-1$
-                Map attrs = new HashMap();
-                if (type == IInputWidgetTypes.TEXTAREA)
-                {
-                    // need to change "size" attribute to "cols"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_SIZE);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_SIZE, null);
-                        attrs.put(IJSFConstants.ATTR_COLS, size);
-                    }
-                }
-                else
-                {
-                    //          need to change "cols" attribute to "size"
-                    String size = _element.getAttribute("cols"); //$NON-NLS-1$
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_COLS, null);
-                        attrs.put(IJSFConstants.ATTR_SIZE, size);
-                    }
-                }
-                ChangeTagCommand c = new ChangeTagCommand(SectionResources
-                        .getString("JSFHtmlInputHidden.CommandLabel.ChangeType"), _element, newtag, attrs, true); //$NON-NLS-1$
-                c.execute();
-                _element = c.getNewElement();
-            }
-        });
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        int numberOfColumns = _typesField.getNumberOfControls();
-        GridLayout layout = new GridLayout(numberOfColumns, false);
-        top.setLayout(layout);
-
-        _typesField.doFillIntoGrid(factory, top, numberOfColumns);
-        LayoutUtil.setGrabHorizontal(_typesField.getGroup(factory, top), true);
-    }
-
-    private String toLocalTag(int type)
-    {
-        switch (type)
-        {
-            case IInputWidgetTypes.SECRET:
-                return IJSFConstants.TAG_INPUTSECRET;
-            case IInputWidgetTypes.HIDDEN:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-            case IInputWidgetTypes.TEXTAREA:
-                return IJSFConstants.TAG_INPUTTEXTAREA;
-            case IInputWidgetTypes.TEXT:
-                return IJSFConstants.TAG_INPUTTEXT;
-            default:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _typesField.setSelectedIndexWithoutUpdate(getInputType());
-    }
-
-    /**
-     * @return the type of the input.  One of TEXT, TEXTAREA, HIDDEN, SECRET.
-     */
-    public int getInputType()
-    {
-        String localTag = _element.getLocalName();
-        if (IJSFConstants.TAG_INPUTTEXT.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXT;
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equals(localTag))
-        {
-            return IInputWidgetTypes.SECRET;
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equals(localTag))
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXTAREA;
-        }
-        else
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,
-            Object newValue, int pos)
-    {
-        if (_typesField != null)
-        {
-            _typesField.setSelectedIndexWithoutUpdate(getInputType());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputOthersSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputOthersSection.java
deleted file mode 100644
index 2da1a53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputOthersSection.java
+++ /dev/null
@@ -1,868 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputOthersSection extends BaseCustomSection
-{
-    private Table                 _validatorsTable, _convertorsTable, _listenersTable;
-    private TableViewer           _validatorsViewer, _convertorsViewer, _listenersViewer;
-
-    private Button                _validateAddButton, _validateRemoveButton;
-    private Button                _convertAddButton, _convertRemoveButton;
-    private Button                _listenAddButton, _listenRemoveButton;
-    private CCombo                _validateTypeCombo, _convertTypeCombo, _listenTypeCombo;
-    final private static String[] VALIDATETYPES           = { "DoubleRange", "Length", "LongRange" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-                                                          };
-    final private static String[] CONVERTTYPES            = { "DateTime", "Number" //$NON-NLS-1$ //$NON-NLS-2$
-                                                          };
-    final private static String[] LISTENTYPES             = { "ValueChange" //$NON-NLS-1$
-                                                          };
-    final private static String[] VALIDATORS_COLUMN_NAMES = { IJSFConstants.TAG_VALIDATOR, IJSFConstants.ATTR_MINIMUM,
-            IJSFConstants.ATTR_MAXIMUM                    };
-
-    private class ValidateContentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("validat") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // no support for input changed
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                String nodeName = node.getNodeName();
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = nodeName;
-                        break;
-                    case 1:
-                        result = node.getAttribute(IJSFConstants.ATTR_MINIMUM);
-                        break;
-                    case 2:
-                        result = node.getAttribute(IJSFConstants.ATTR_MAXIMUM);
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-    }
-
-    private class ValidateCellModifier implements ICellModifier
-    {
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-         */
-        public boolean canModify(Object element, String property)
-        {
-            int columnIndex = getColumnNames().indexOf(property);
-
-            if (columnIndex == 0)
-            {
-                return false;
-            }
-            return true;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-         */
-        public Object getValue(Object element, String property)
-        {
-            int columnIndex = getColumnNames().indexOf(property);
-
-            Object result = null;
-            IDOMElement node = (IDOMElement) element;
-            switch (columnIndex)
-            {
-                case 0: // Node Name
-                    result = node.getNodeName();
-                    break;
-                case 1: // Min
-                    result = node.getAttribute(IJSFConstants.ATTR_MINIMUM);
-                    break;
-                case 2: // Max
-                    result = node.getAttribute(IJSFConstants.ATTR_MAXIMUM);
-                    break;
-                default:
-                    result = ""; //$NON-NLS-1$
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
-         */
-        public void modify(Object element, String property, Object value)
-        {
-            int columnIndex = getColumnNames().indexOf(property);
-
-            TableItem item = (TableItem) element;
-            IDOMElement node = (IDOMElement) item.getData();
-            String valueString;
-            ChangeAttributeCommand c;
-            switch (columnIndex)
-            {
-                case 1: // Min 
-                    valueString = ((String) value).trim();
-                    c = new ChangeAttributeCommand(
-                            SectionResources.getString("JSFHtmlInputTextSection.CommandLabel.ChangeAttribute"), node, IJSFConstants.ATTR_MINIMUM, valueString); //$NON-NLS-1$
-                    c.execute();
-                    break;
-                case 2: // Max 
-                    valueString = ((String) value).trim();
-                    c = new ChangeAttributeCommand(
-                            SectionResources.getString("JSFHtmlInputTextSection.CommandLabel.ChangeAttribute"), node, IJSFConstants.ATTR_MAXIMUM, valueString); //$NON-NLS-1$
-                    c.execute();
-                    break;
-                default:
-                    break;
-            }
-            _validatorsViewer.refresh();
-//            _validatorsViewer.setInput(_element);
-            updateValidateButtonStatus();
-        }
-    }
-
-    private class ConvertContentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("convert") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // do nothing
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                String nodeName = node.getNodeName();
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = nodeName;
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-    }
-
-    private class ListenerContentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("Listener") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // do nothing
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                String nodeName = node.getNodeName();
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = nodeName;
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-    }
-
-    /**
-     * The default constructor
-     */
-    public JSFHtmlInputOthersSection()
-    {
-        super();
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createValidatePart(factory, top);
-
-        createConvertPart(factory, top);
-
-        createListenPart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createConvertPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _convertorsTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 3;
-        data.heightHint = 50;
-        _convertorsTable.setHeaderVisible(true);
-        _convertorsTable.setLayoutData(data);
-        _convertorsTable.setLinesVisible(true);
-
-        TableColumn convertColumn = new TableColumn(_convertorsTable, SWT.NONE);
-        convertColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Converter")); //$NON-NLS-1$
-        convertColumn.setWidth(150);
-
-        _convertorsViewer = new TableViewer(_convertorsTable);
-        _convertorsViewer.setContentProvider(new ConvertContentLabelProvider());
-        _convertorsViewer.setLabelProvider(new ConvertContentLabelProvider());
-        _convertorsViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _convertorsViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateConvertButtonStatus();
-            }
-        });
-
-        _convertTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _convertTypeCombo.setItems(CONVERTTYPES);
-        _convertTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertTypeCombo.setLayoutData(data);
-
-        _convertAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlInputTextSection.Add"), //$NON-NLS-1$
-                SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertAddButton.setLayoutData(data);
-        _convertAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                AddSubNodeCommand c = new AddSubNodeCommand(SectionResources
-                        .getString("JSFHtmlInputTextSection.CommandLabel.AddSubTag"), _element, "convert" //$NON-NLS-1$ //$NON-NLS-2$
-                        + _convertTypeCombo.getText(), ITLDConstants.URI_JSF_CORE, attributes);
-                c.execute();
-                _convertorsViewer.refresh();
-                updateConvertButtonStatus();
-            }
-        });
-        _convertRemoveButton = factory.createButton(other,
-                SectionResources.getString("JSFHtmlInputTextSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertRemoveButton.setLayoutData(data);
-        _convertRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _convertorsViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources
-                                .getString("JSFHtmlInputTextSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _convertorsViewer.refresh();
-                    updateConvertButtonStatus();
-                }
-            }
-        });
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createListenPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _listenersTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 3;
-        data.heightHint = 50;
-        _listenersTable.setHeaderVisible(true);
-        _listenersTable.setLayoutData(data);
-        _listenersTable.setLinesVisible(true);
-
-        TableColumn listenColumn = new TableColumn(_listenersTable, SWT.NONE);
-        listenColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Listeners")); //$NON-NLS-1$
-        listenColumn.setWidth(150);
-
-        _listenersViewer = new TableViewer(_listenersTable);
-        _listenersViewer.setContentProvider(new ListenerContentLabelProvider());
-        _listenersViewer.setLabelProvider(new ListenerContentLabelProvider());
-        _listenersViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _listenersViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateListenButtonStatus();
-            }
-        });
-
-        _listenTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _listenTypeCombo.setItems(LISTENTYPES);
-        _listenTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenTypeCombo.setLayoutData(data);
-
-        _listenAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlInputTextSection.Add"), //$NON-NLS-1$
-                SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenAddButton.setLayoutData(data);
-        _listenAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                String listener = _listenTypeCombo.getText();
-                listener = listener.substring(0, 1).toLowerCase() + listener.substring(1) + "Listener"; //$NON-NLS-1$
-                AddSubNodeCommand c = new AddSubNodeCommand(
-                        SectionResources.getString("JSFHtmlInputTextSection.CommandLabel.AddSubTag"), _element, listener, ITLDConstants.URI_JSF_CORE, attributes); //$NON-NLS-1$
-                c.execute();
-                _listenersViewer.refresh();
-                updateListenButtonStatus();
-            }
-        });
-        _listenRemoveButton = factory.createButton(other,
-                SectionResources.getString("JSFHtmlInputTextSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _listenRemoveButton.setLayoutData(data);
-        _listenRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _listenersViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources
-                                .getString("JSFHtmlInputTextSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _listenersViewer.refresh();
-                    updateListenButtonStatus();
-                }
-            }
-        });
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createValidatePart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _validatorsTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 3;
-        data.heightHint = 50;
-        _validatorsTable.setHeaderVisible(true);
-        _validatorsTable.setLayoutData(data);
-        _validatorsTable.setLinesVisible(true);
-
-        TableColumn validateColumn = new TableColumn(_validatorsTable, SWT.NONE);
-        validateColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Validators")); //$NON-NLS-1$
-        validateColumn.setWidth(150);
-
-        TableColumn minColumn = new TableColumn(_validatorsTable, SWT.NONE);
-        minColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Minimum")); //$NON-NLS-1$
-        minColumn.setWidth(100);
-
-        TableColumn maxColumn = new TableColumn(_validatorsTable, SWT.NONE);
-        maxColumn.setText(SectionResources.getString("JSFHtmlInputTextSection.Maximum")); //$NON-NLS-1$
-        maxColumn.setWidth(100);
-
-        _validatorsViewer = new TableViewer(_validatorsTable);
-        _validatorsViewer.setColumnProperties(VALIDATORS_COLUMN_NAMES);
-
-        CellEditor[] editors = new CellEditor[VALIDATORS_COLUMN_NAMES.length];
-        TextCellEditor textEditor = new TextCellEditor(_validatorsTable);
-        editors[0] = textEditor;
-        textEditor = new TextCellEditor(_validatorsTable);
-        editors[1] = textEditor;
-        textEditor = new TextCellEditor(_validatorsTable);
-        editors[2] = textEditor;
-
-        _validatorsViewer.setCellEditors(editors);
-        _validatorsViewer.setCellModifier(new ValidateCellModifier());
-        _validatorsViewer.setContentProvider(new ValidateContentLabelProvider());
-        _validatorsViewer.setLabelProvider(new ValidateContentLabelProvider());
-        _validatorsViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _validatorsViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateValidateButtonStatus();
-            }
-        });
-
-        _validateTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _validateTypeCombo.setItems(VALIDATETYPES);
-        _validateTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _validateTypeCombo.setLayoutData(data);
-
-        _validateAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlInputTextSection.Add"), //$NON-NLS-1$
-                SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _validateAddButton.setLayoutData(data);
-        _validateAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                AddSubNodeCommand c = new AddSubNodeCommand(SectionResources
-                        .getString("JSFHtmlInputTextSection.CommandLabel.AddSubTag"), _element, "validate" //$NON-NLS-1$ //$NON-NLS-2$
-                        + _validateTypeCombo.getText(), ITLDConstants.URI_JSF_CORE, attributes);
-                c.execute();
-                _validatorsViewer.refresh();
-                updateValidateButtonStatus();
-            }
-        });
-        _validateRemoveButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlInputTextSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _validateRemoveButton.setLayoutData(data);
-        _validateRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _validatorsViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources
-                                .getString("JSFHtmlInputTextSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _validatorsViewer.refresh();
-                    updateValidateButtonStatus();
-                }
-            }
-        });
-    }
-
-    private void updateValidateButtonStatus()
-    {
-        _validateRemoveButton.setEnabled(true);
-        ISelection selection = _validatorsViewer.getSelection();
-        if (selection == null || selection.isEmpty())
-        {
-            _validateRemoveButton.setEnabled(false);
-        }
-        if (_validatorsTable.getItemCount() == 0)
-        {
-            _validateRemoveButton.setEnabled(false);
-        }
-    }
-
-    private void updateConvertButtonStatus()
-    {
-        _convertAddButton.setEnabled(true);
-        _convertRemoveButton.setEnabled(true);
-        ISelection selection = _convertorsViewer.getSelection();
-        if (selection == null || selection.isEmpty())
-        {
-            _convertRemoveButton.setEnabled(false);
-        }
-        if (_convertorsTable.getItemCount() == 0)
-        {
-            _convertRemoveButton.setEnabled(false);
-        }
-        if (_convertorsTable.getItemCount() > 0)
-        {
-            _convertAddButton.setEnabled(false);
-        }
-    }
-
-    private void updateListenButtonStatus()
-    {
-        _listenRemoveButton.setEnabled(true);
-        ISelection selection = _listenersViewer.getSelection();
-        if (selection == null || selection.isEmpty())
-        {
-            _listenRemoveButton.setEnabled(false);
-        }
-        if (_listenersTable.getItemCount() == 0)
-        {
-            _listenRemoveButton.setEnabled(false);
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _validatorsViewer.setInput(_element);
-        updateValidateButtonStatus();
-
-        _convertorsViewer.setInput(_element);
-        updateConvertButtonStatus();
-
-        _listenersViewer.setInput(_element);
-        updateListenButtonStatus();
-    }
-
-    private List getColumnNames()
-    {
-        return Arrays.asList(VALIDATORS_COLUMN_NAMES);
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
-    {
-        if(_validatorsViewer != null && !_validatorsViewer.getControl().isDisposed())
-        {
-            _validatorsViewer.refresh();
-            _convertorsViewer.refresh();
-            _listenersViewer.refresh();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputSecretTypeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputSecretTypeSection.java
deleted file mode 100644
index 76b49ea..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputSecretTypeSection.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeTagCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputSecretTypeSection extends BaseCustomSection
-{
-    private RadiosDialogField     _typesField;
-
-    final private static String[] TYPES    = { SectionResources.getString("JSFHtmlInputHiddenSection.Type0"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type1"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type2"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type3") //$NON-NLS-1$
-                                           };
-
-    /**
-     * The default constructor
-     */
-    public JSFHtmlInputSecretTypeSection()
-    {
-        super();
-        _typesField = new RadiosDialogField();
-        _typesField.setLabelText(SectionResources.getString("JSFHtmlInputHiddenSection.Type")); //$NON-NLS-1$
-        _typesField.setItems(TYPES);
-        _typesField.setDialogFieldApplyListener(new IDialogFieldApplyListener()
-        {
-            public void dialogFieldApplied(DialogField field)
-            {
-                int type = _typesField.getSelectedIndex();
-                String prefix = _element.getPrefix();
-                String localTag = toLocalTag(type);
-                String newtag = prefix + ":" + localTag; //$NON-NLS-1$
-                Map attrs = new HashMap();
-                if (type == IInputWidgetTypes.TEXTAREA)
-                {
-                    // need to change "size" attribute to "cols"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_SIZE);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_SIZE, null);
-                        attrs.put(IJSFConstants.ATTR_COLS, size);
-                    }
-                }
-                else
-                {
-                    // need to change "cols" attribute to "size"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_COLS);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_COLS, null);
-                        attrs.put(IJSFConstants.ATTR_SIZE, size);
-                    }
-                }
-                ChangeTagCommand c = new ChangeTagCommand(SectionResources
-                        .getString("JSFHtmlInputHidden.CommandLabel.ChangeType"), _element, newtag, attrs, true); //$NON-NLS-1$
-                c.execute();
-                _element = c.getNewElement();
-            }
-        });
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        int numberOfColumns = _typesField.getNumberOfControls();
-        GridLayout layout = new GridLayout(numberOfColumns, false);
-        top.setLayout(layout);
-
-        _typesField.doFillIntoGrid(factory, top, numberOfColumns);
-        LayoutUtil.setGrabHorizontal(_typesField.getGroup(factory, top), true);
-    }
-
-    private String toLocalTag(int type)
-    {
-        switch (type)
-        {
-            case IInputWidgetTypes.SECRET:
-                return IJSFConstants.TAG_INPUTSECRET;
-            case IInputWidgetTypes.HIDDEN:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-            case IInputWidgetTypes.TEXTAREA:
-                return IJSFConstants.TAG_INPUTTEXTAREA;
-            case IInputWidgetTypes.TEXT:
-                return IJSFConstants.TAG_INPUTTEXT;
-            default:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-        _typesField.setSelectedIndexWithoutUpdate(getInputType());
-    }
-
-    /**
-     * @return the input type
-     */
-    public int getInputType()
-    {
-        String localTag = _element.getLocalName();
-        if (IJSFConstants.TAG_INPUTTEXT.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXT;
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equals(localTag))
-        {
-            return IInputWidgetTypes.SECRET;
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equals(localTag))
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXTAREA;
-        }
-        else
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,
-            Object newValue, int pos)
-    {
-        if (_typesField != null)
-        {
-            _typesField.setSelectedIndexWithoutUpdate(getInputType());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextTypeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextTypeSection.java
deleted file mode 100644
index 26befdf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextTypeSection.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeTagCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputTextTypeSection extends BaseCustomSection
-{
-    private RadiosDialogField     _typesField;
-
-    final private static String[] TYPES    = { SectionResources.getString("JSFHtmlInputHiddenSection.Type0"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type1"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type2"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type3") //$NON-NLS-1$
-                                           };
-
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlInputTextTypeSection()
-    {
-        super();
-        _typesField = new RadiosDialogField();
-        _typesField.setLabelText(SectionResources.getString("JSFHtmlInputHiddenSection.Type")); //$NON-NLS-1$
-        _typesField.setItems(TYPES);
-        _typesField.setDialogFieldApplyListener(new IDialogFieldApplyListener()
-        {
-            public void dialogFieldApplied(DialogField field)
-            {
-                int type = _typesField.getSelectedIndex();
-                String prefix = _element.getPrefix();
-                String localTag = toLocalTag(type);
-                String newtag = prefix + ":" + localTag; //$NON-NLS-1$
-                Map attrs = new HashMap();
-                if (type == IInputWidgetTypes.TEXTAREA)
-                {
-                    // need to change "size" attribute to "cols"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_SIZE);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_SIZE, null);
-                        attrs.put(IJSFConstants.ATTR_COLS, size);
-                    }
-                }
-                else
-                {
-                    //          need to change "cols" attribute to "size"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_COLS);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_COLS, null);
-                        attrs.put(IJSFConstants.ATTR_SIZE, size);
-                    }
-                }
-                ChangeTagCommand c = new ChangeTagCommand(SectionResources
-                        .getString("JSFHtmlInputHidden.CommandLabel.ChangeType"), _element, newtag, attrs, true); //$NON-NLS-1$
-                c.execute();
-                _element = c.getNewElement();
-            }
-        });
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        int numberOfColumns = _typesField.getNumberOfControls();
-        GridLayout layout = new GridLayout(numberOfColumns, false);
-        top.setLayout(layout);
-
-        _typesField.doFillIntoGrid(factory, top, numberOfColumns);
-        LayoutUtil.setGrabHorizontal(_typesField.getGroup(factory, top), true);
-    }
-
-    private String toLocalTag(int type)
-    {
-        switch (type)
-        {
-            case IInputWidgetTypes.SECRET:
-                return IJSFConstants.TAG_INPUTSECRET;
-            case IInputWidgetTypes.HIDDEN:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-            case IInputWidgetTypes.TEXTAREA:
-                return IJSFConstants.TAG_INPUTTEXTAREA;
-            case IInputWidgetTypes.TEXT:
-                return IJSFConstants.TAG_INPUTTEXT;
-            default:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _typesField.setSelectedIndexWithoutUpdate(getInputType());
-    }
-
-    /**
-     * @return the input type. One of IInputWidgetTypes.
-     */
-    public int getInputType()
-    {
-        String localTag = _element.getLocalName();
-        if (IJSFConstants.TAG_INPUTTEXT.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXT;
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equals(localTag))
-        {
-            return IInputWidgetTypes.SECRET;
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equals(localTag))
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXTAREA;
-        }
-        else
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,
-            Object newValue, int pos)
-    {
-        if (_typesField != null)
-        {
-            _typesField.setSelectedIndexWithoutUpdate(getInputType());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextareaTypeSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextareaTypeSection.java
deleted file mode 100644
index 5696ccc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlInputTextareaTypeSection.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.RadiosDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeTagCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * FIXME: there is a lot of copied code for this input sections
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlInputTextareaTypeSection extends BaseCustomSection
-{
-    private RadiosDialogField     _typesField;
-
-    final private static String[] TYPES    = { SectionResources.getString("JSFHtmlInputHiddenSection.Type0"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type1"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type2"), //$NON-NLS-1$
-                                           SectionResources.getString("JSFHtmlInputHiddenSection.Type3") //$NON-NLS-1$
-                                           };
-
-    /**
-     * The default constructor 
-     */
-    public JSFHtmlInputTextareaTypeSection()
-    {
-        super();
-        _typesField = new RadiosDialogField();
-        _typesField.setLabelText(SectionResources.getString("JSFHtmlInputHiddenSection.Type")); //$NON-NLS-1$
-        _typesField.setItems(TYPES);
-        _typesField.setDialogFieldApplyListener(new IDialogFieldApplyListener()
-        {
-            public void dialogFieldApplied(DialogField field)
-            {
-                int type = _typesField.getSelectedIndex();
-                String prefix = _element.getPrefix();
-                String localTag = toLocalTag(type);
-                String newtag = prefix + ":" + localTag; //$NON-NLS-1$
-                Map attrs = new HashMap();
-                if (type == IInputWidgetTypes.TEXTAREA)
-                {
-                    // need to change "size" attribute to "cols"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_SIZE);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_SIZE, null);
-                        attrs.put(IJSFConstants.ATTR_COLS, size);
-                    }
-                }
-                else
-                {
-                    // need to change "cols" attribute to "size"
-                    String size = _element.getAttribute(IJSFConstants.ATTR_COLS);
-                    if (size != null && size.length() != 0)
-                    {
-                        attrs.put(IJSFConstants.ATTR_COLS, null);
-                        attrs.put(IJSFConstants.ATTR_SIZE, size);
-                    }
-                }
-                ChangeTagCommand c = new ChangeTagCommand(SectionResources
-                        .getString("JSFHtmlInputHidden.CommandLabel.ChangeType"), _element, newtag, attrs, true); //$NON-NLS-1$
-                c.execute();
-                _element = c.getNewElement();
-            }
-        });
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        int numberOfColumns = _typesField.getNumberOfControls();
-        GridLayout layout = new GridLayout(numberOfColumns, false);
-        top.setLayout(layout);
-
-        _typesField.doFillIntoGrid(factory, top, numberOfColumns);
-        LayoutUtil.setGrabHorizontal(_typesField.getGroup(factory, top), true);
-    }
-
-    private String toLocalTag(int type)
-    {
-        switch (type)
-        {
-            case IInputWidgetTypes.SECRET:
-                return IJSFConstants.TAG_INPUTSECRET;
-            case IInputWidgetTypes.HIDDEN:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-            case IInputWidgetTypes.TEXTAREA:
-                return IJSFConstants.TAG_INPUTTEXTAREA;
-            case IInputWidgetTypes.TEXT:
-                return IJSFConstants.TAG_INPUTTEXT;
-            default:
-                return IJSFConstants.TAG_INPUTHIDDEN;
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _typesField.setSelectedIndexWithoutUpdate(getInputType());
-    }
-
-    /**
-     * @return one of IInputWidgetTypes
-     */
-    public int getInputType()
-    {
-        String localTag = _element.getLocalName();
-        if (IJSFConstants.TAG_INPUTTEXT.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXT;
-        }
-        else if (IJSFConstants.TAG_INPUTSECRET.equals(localTag))
-        {
-            return IInputWidgetTypes.SECRET;
-        }
-        else if (IJSFConstants.TAG_INPUTHIDDEN.equals(localTag))
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-        else if (IJSFConstants.TAG_INPUTTEXTAREA.equals(localTag))
-        {
-            return IInputWidgetTypes.TEXTAREA;
-        }
-        else
-        {
-            return IInputWidgetTypes.HIDDEN;
-        }
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,
-            Object newValue, int pos)
-    {
-        if (_typesField != null)
-        {
-            _typesField.setSelectedIndexWithoutUpdate(getInputType());
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.java
deleted file mode 100644
index 1d307cf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlOutputFormatParamsSection extends BaseCustomSection
-{
-    private Table                  _paramTable;
-    private TableViewer            _paramViewer;
-    private Button                 _paramAddButton, _paramRemoveButton;
-
-    private String[]               _columnNames = 
-    {
-        "name", "value" //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    ;
-
-    private class ParamCotentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("param") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // do nothing
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = node.getAttribute(IJSFConstants.ATTR_NAME);
-                        break;
-                    case 1:
-                        result = node.getAttribute(IJSFConstants.ATTR_VALUE);
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-    }
-
-    private class ParamCellModifier implements ICellModifier
-    {
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
-         */
-        public boolean canModify(Object element, String property)
-        {
-            return true;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
-         */
-        public Object getValue(Object element, String property)
-        {
-            int columnIndex = getColumnNames().indexOf(property);
-
-            Object result = null;
-            IDOMElement node = (IDOMElement) element;
-            switch (columnIndex)
-            {
-                case 0: // Name
-                    result = node.getAttribute(IJSFConstants.ATTR_NAME);
-                    break;
-                case 1: // Value
-                    result = node.getAttribute(IJSFConstants.ATTR_VALUE);
-                    break;
-                default:
-                    result = ""; //$NON-NLS-1$
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
-         */
-        public void modify(Object element, String property, Object value)
-        {
-            int columnIndex = getColumnNames().indexOf(property);
-
-            TableItem item = (TableItem) element;
-            IDOMElement node = (IDOMElement) item.getData();
-            String valueString;
-            ChangeAttributeCommand c;
-            switch (columnIndex)
-            {
-                case 0: // Name 
-                    valueString = ((String) value).trim();
-                    c = new ChangeAttributeCommand(SectionResources.getString("JSFHtmlOutputFormatSection.CommandLabel.ChangeAttribute"), node, IJSFConstants.ATTR_NAME, valueString); //$NON-NLS-1$
-                    c.execute();
-                    break;
-                case 1: // Value 
-                    valueString = ((String) value).trim();
-                    c = new ChangeAttributeCommand(SectionResources.getString("JSFHtmlOutputFormatSection.CommandLabel.ChangeAttribute"), node, IJSFConstants.ATTR_VALUE, valueString); //$NON-NLS-1$
-                    c.execute();
-                    break;
-                default:
-                    break;
-            }
-            _paramViewer.setInput(_element);
-            // TODO: does nothing updateParamButtonStatus();
-        }
-    }
-
-    /**
-     * Default constructor
-     */
-    public JSFHtmlOutputFormatParamsSection()
-    {
-        super();
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createParamPart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createParamPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-
-        Label label = factory.createLabel(other, SectionResources.getString("JSFHtmlOutputFormatSection.Parameters")); //$NON-NLS-1$
-        data = new GridData(GridData.FILL);
-        data.horizontalSpan = 4;
-        label.setLayoutData(data);
-
-        _paramTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 3;
-        data.heightHint = 50;
-        _paramTable.setHeaderVisible(true);
-        _paramTable.setLinesVisible(true);
-        _paramTable.setLayoutData(data);
-
-        TableColumn column = new TableColumn(_paramTable, SWT.NONE);
-        column.setText(SectionResources.getString("JSFHtmlOutputFormatSection.ColName")); //$NON-NLS-1$
-        column.setWidth(100);
-
-        column = new TableColumn(_paramTable, SWT.NONE);
-        column.setText(SectionResources.getString("JSFHtmlOutputFormatSection.ColValue")); //$NON-NLS-1$
-        column.setWidth(100);
-
-        _paramViewer = new TableViewer(_paramTable);
-        _paramViewer.setColumnProperties(_columnNames);
-
-        CellEditor[] editors = new CellEditor[_columnNames.length];
-        TextCellEditor textEditor = new TextCellEditor(_paramTable);
-        editors[0] = textEditor;
-        textEditor = new TextCellEditor(_paramTable);
-        editors[1] = textEditor;
-
-        _paramViewer.setCellEditors(editors);
-        _paramViewer.setCellModifier(new ParamCellModifier());
-        _paramViewer.setContentProvider(new ParamCotentLabelProvider());
-        _paramViewer.setLabelProvider(new ParamCotentLabelProvider());
-        _paramViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        }
-        );
-        _paramViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-//              TODO: does nothing updateParamButtonStatus();
-            }
-        }
-        );
-
-        _paramAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlOutputTextSection.Add"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _paramAddButton.setLayoutData(data);
-        _paramAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                attributes.put(IJSFConstants.ATTR_NAME, "name"); //$NON-NLS-1$
-                attributes.put(IJSFConstants.ATTR_VALUE, "value"); //$NON-NLS-1$
-                AddSubNodeCommand c = new AddSubNodeCommand(SectionResources.getString("JSFHtmlOutputFormatSection.CommandLabel.AddSubTag"), _element, "param", //$NON-NLS-1$ //$NON-NLS-2$
-                ITLDConstants.URI_JSF_CORE, attributes);
-                c.execute();
-                _paramViewer.refresh();
-//              TODO: does nothing updateParamButtonStatus();
-            }
-        }
-        );
-        _paramRemoveButton = factory.createButton(other, SectionResources.getString("JSFHtmlOutputTextSection.Remove"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _paramRemoveButton.setLayoutData(data);
-        _paramRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _paramViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources.getString("JSFHtmlOutputFormatSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _paramViewer.refresh();
-//                  TODO: does nothing updateParamButtonStatus();
-                }
-            }
-        }
-        );
-    }
-    
-    // TODO: does nothing
-//    private void updateParamButtonStatus()
-//    {
-//    }
-    
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _paramViewer.setInput(_element);
-//      TODO: does nothing updateParamButtonStatus();
-    }
-    
-    private List getColumnNames()
-    {
-        return Arrays.asList(_columnNames);
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
-    {
-        if(_paramViewer != null && !_paramViewer.getControl().isDisposed())
-        {
-            _paramViewer.refresh();
-        }
-        
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java
deleted file mode 100644
index 718dddc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlOutputTextConverterSection extends BaseCustomSection
-{
-    private Table                  _convertTable;
-    private TableViewer            _convertViewer;
-    private Button                 _convertAddButton, _convertRemoveButton;
-    private CCombo                 _convertTypeCombo;
-    final private static String[]  CONVERTTYPES = 
-    {
-        "DateTime", "Number" //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    ;
-    
-    private class ConvertCotentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(Object inputElement)
-        {
-            IDOMElement root = _element;
-            List result = new ArrayList();
-
-            NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    IDOMElement element = (IDOMElement) child;
-                    String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("convert") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
-        {
-            // do nothing
-        }
-
-        public String getColumnText(Object element, int columnIndex)
-        {
-            String result = null;
-            if (element instanceof IDOMElement)
-            {
-                IDOMElement node = (IDOMElement) element;
-                String nodeName = node.getNodeName();
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = nodeName;
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-         */
-
-        public void dispose()
-        {
-            // nothing to dispose
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-         */
-        public Image getColumnImage(Object element, int columnIndex)
-        {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void addListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
-         */
-        public boolean isLabelProperty(Object element, String property)
-        {
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
-         */
-        public void removeListener(ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-    }
-
-    /**
-     * Default constructor
-     */
-    public JSFHtmlOutputTextConverterSection()
-    {
-        super();
-    }
-
-    public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        Composite top = factory.createFlatFormComposite(parent);
-
-        GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createConvertPart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createConvertPart(TabbedPropertySheetWidgetFactory factory, Composite other)
-    {
-        GridData data;
-        _convertTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 3;
-        _convertTable.setHeaderVisible(true);
-        _convertTable.setLayoutData(data);
-        _convertTable.setLinesVisible(true);
-
-        TableColumn convertColumn = new TableColumn(_convertTable, SWT.NONE);
-        convertColumn.setText(SectionResources.getString("JSFHtmlOutputTextSection.Converter")); //$NON-NLS-1$
-        convertColumn.setWidth(100);
-
-        _convertViewer = new TableViewer(_convertTable);
-        _convertViewer.setContentProvider(new ConvertCotentLabelProvider());
-        _convertViewer.setLabelProvider(new ConvertCotentLabelProvider());
-        _convertViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(DoubleClickEvent event)
-            {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        }
-        );
-        _convertViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event)
-            {
-                updateConvertButtonStatus();
-            }
-        }
-        );
-
-        _convertTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _convertTypeCombo.setItems(CONVERTTYPES);
-        _convertTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertTypeCombo.setLayoutData(data);
-
-        _convertAddButton = factory.createButton(other, SectionResources.getString("JSFHtmlOutputTextSection.Add"), //$NON-NLS-1$
-        SWT.NONE);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertAddButton.setLayoutData(data);
-        _convertAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                Map attributes = new HashMap();
-                AddSubNodeCommand c = new AddSubNodeCommand(SectionResources.getString("JSFHtmlOutputTextSection.CommandLabel.AddSubTag"), _element, "convert" //$NON-NLS-1$ //$NON-NLS-2$
-                + _convertTypeCombo.getText(), ITLDConstants.URI_JSF_CORE, attributes);
-                c.execute();
-                _convertViewer.refresh();
-                updateConvertButtonStatus();
-            }
-        }
-        );
-        _convertRemoveButton = factory.createButton(other, SectionResources
-            .getString("JSFHtmlOutputTextSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _convertRemoveButton.setLayoutData(data);
-        _convertRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e)
-            {
-                IStructuredSelection selection = (IStructuredSelection) _convertViewer.getSelection();
-                if (selection != null)
-                {
-                    for (Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        IDOMElement node = (IDOMElement) i.next();
-                        RemoveSubNodeCommand c = new RemoveSubNodeCommand(SectionResources.getString("JSFHtmlOutputTextSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _convertViewer.refresh();
-                    updateConvertButtonStatus();
-                }
-            }
-        }
-        );
-    }
-
-    private void updateConvertButtonStatus()
-    {
-        _convertAddButton.setEnabled(true);
-        _convertRemoveButton.setEnabled(true);
-        ISelection selection = _convertViewer.getSelection();
-        if (selection == null || selection.isEmpty())
-        {
-            _convertRemoveButton.setEnabled(false);
-        }
-        if (_convertTable.getItemCount() == 0)
-        {
-            _convertRemoveButton.setEnabled(false);
-        }
-        if (_convertTable.getItemCount() > 0)
-        {
-            _convertAddButton.setEnabled(false);
-        }
-    }
-
-    public void setInput(IWorkbenchPart part, ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _convertViewer.setInput(_element);
-        updateConvertButtonStatus();
-    }
-
-    protected void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos)
-    {
-        if(_convertViewer != null && !_convertViewer.getControl().isDisposed())
-        {
-            _convertViewer.refresh();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java
deleted file mode 100644
index 4b7f39c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.InsertSubNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.single.RemoveSubNodeCommand;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFHtmlSelectChoicesSection extends BaseCustomSection
-{
-    final private static String[] CHOICETYPES = { IJSFConstants.TAG_SELECTITEM, IJSFConstants.TAG_SELECTITEMS};
-    private Table                 _choiceTable;
-    private TableViewer           _choiceViewer;
-    private CCombo                _choiceTypeCombo;
-    private Button                _choiceAddButton, _choiceRemoveButton, _choiceMoveUpButton, _choiceMoveDownButton;
-    private static final String[] COLUMN_NAMES = new String[] {"choices","itemLabel", "itemValue", "id"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-
-    private class ChoiceCotentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
-    {
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-         */
-        public Object[] getElements(final Object inputElement)
-        {
-            final IDOMElement root = _element;
-            final List result = new ArrayList();
-
-            final NodeList children = root.getChildNodes();
-            for (int i = 0, n = children.getLength(); i < n; i++)
-            {
-                final Node child = children.item(i);
-                if (child.getNodeType() == Node.ELEMENT_NODE)
-                {
-                    final IDOMElement element = (IDOMElement) child;
-                    final String nodeName = element.getNodeName();
-                    if (nodeName.indexOf("select") != -1) //$NON-NLS-1$
-                    {
-                        result.add(child);
-                    }
-                }
-            }
-
-            if (result.isEmpty())
-            {
-                return new Object[0];
-            }
-
-            return result.toArray(new IDOMElement[result.size()]);
-        }
-
-        /* (non-Javadoc)
-         * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-         */
-        public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput)
-        {
-            // do nothing
-        }
-
-        public String getColumnText(final Object element, final int columnIndex)
-        {
-            String result = null;
-            if (element instanceof Node)
-            {
-                final Node node = (Node) element;
-                Node attrNode = null;
-                String attrName = null;
-                if (columnIndex == 1)
-                {
-                    attrName = "itemLabel"; //$NON-NLS-1$
-                }
-                else if (columnIndex == 2)
-                {
-                    attrName = "itemValue"; //$NON-NLS-1$
-                }
-                else if (columnIndex == 3)
-                {
-                    attrName = "id"; //$NON-NLS-1$
-                }
-
-                switch (columnIndex)
-                {
-                    case 0:
-                        result = node.getNodeName();
-                        break;
-                    default:
-                    {
-                        attrNode = node.getAttributes().getNamedItem(attrName);
-                        if (attrNode != null)
-                        {
-                            result = attrNode.getNodeValue()!=null ? attrNode.getNodeValue() : " - "; //$NON-NLS-1$
-                        }
-                        else
-                        {
-                            result = " - "; //$NON-NLS-1$
-                        }
-                    }
-                }
-            }
-            return result != null ? result : ""; //$NON-NLS-1$
-        }
-
-        public void dispose()
-        {
-            // do nothing
-        }
-
-        public Image getColumnImage(final Object element, final int columnIndex)
-        {
-            return null;
-        }
-
-        public void addListener(final ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-
-        public boolean isLabelProperty(final Object element, final String property)
-        {
-            return false;
-        }
-
-        public void removeListener(final ILabelProviderListener listener)
-        {
-            // TODO: no support for listeners?
-        }
-    }
-
-    /**
-     * Default constructor
-     */
-    public JSFHtmlSelectChoicesSection()
-    {
-        super();
-    }
-
-    @Override
-    public void createControls(final Composite parent, final TabbedPropertySheetPage aTabbedPropertySheetPage)
-    {
-        super.createControls(parent, aTabbedPropertySheetPage);
-        final TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
-        final Composite top = factory.createFlatFormComposite(parent);
-
-        final GridLayout layout = new GridLayout();
-        layout.numColumns = 4;
-        top.setLayout(layout);
-
-        createChoicePart(factory, top);
-    }
-
-    /**
-     * @param factory
-     * @param other
-     */
-    private void createChoicePart(final TabbedPropertySheetWidgetFactory factory, final Composite other)
-    {
-        GridData data;
-        _choiceTable = factory.createTable(other, SWT.FULL_SELECTION | SWT.MULTI);
-        data = new GridData(GridData.FILL_BOTH);
-        data.horizontalSpan = 3;
-        data.verticalSpan = 5;
-        data.heightHint = 50;
-        _choiceTable.setHeaderVisible(true);
-        _choiceTable.setLayoutData(data);
-        _choiceTable.setLinesVisible(true);
-
-        final TableColumn choiceColumn = new TableColumn(_choiceTable, SWT.NONE);
-        choiceColumn.setText(SectionResources.getString("JSFHtmlSelectManyCheckboxSection.Choices")); //$NON-NLS-1$
-        choiceColumn.setWidth(100);
-
-        final TableColumn labelColumn = new TableColumn(_choiceTable, SWT.NONE);
-        labelColumn.setText("itemLabel"); //$NON-NLS-1$
-        labelColumn.setWidth(100);
-
-        final TableColumn valueColumn = new TableColumn(_choiceTable, SWT.NONE);
-        valueColumn.setText("itemValue"); //$NON-NLS-1$
-        valueColumn.setWidth(100);
-
-        final TableColumn idColumn = new TableColumn(_choiceTable, SWT.NONE);
-        idColumn.setText("id"); //$NON-NLS-1$
-        idColumn.setWidth(100);
-
-        _choiceViewer = new TableViewer(_choiceTable);
-        _choiceViewer.setColumnProperties(COLUMN_NAMES );
-        final CellEditor[] editors = new CellEditor[4];
-        TextCellEditor textEditor = new TextCellEditor(_choiceTable);
-        editors[0] = textEditor;
-        textEditor = new TextCellEditor(_choiceTable);
-        editors[1] = textEditor;
-        textEditor = new TextCellEditor(_choiceTable);
-        editors[2] = textEditor;
-        textEditor = new TextCellEditor(_choiceTable);
-        editors[3] = textEditor;
-
-        _choiceViewer.setCellEditors(editors);
-        _choiceViewer.setCellModifier(new ICellModifier(){
-
-            public boolean canModify(final Object element, final String property) {
-                final IDOMElement node = (IDOMElement)element;
-                if (node.getLocalName().equals("selectItem")) //$NON-NLS-1$
-                {
-                    return ! property.equals("choices"); //$NON-NLS-1$
-                }
-
-                return property.equals("id"); //$NON-NLS-1$
-            }
-
-            public Object getValue(final Object element, final String property) {
-                final IDOMElement node = (IDOMElement) element;
-                final String val = node.getAttribute(property) != null ? node.getAttribute(property) : ""; //$NON-NLS-1$
-                return val;
-            }
-
-            public void modify(final Object element, final String property, final Object value) {
-
-                final TableItem item = (TableItem) element;
-                final IDOMElement node = (IDOMElement) item.getData();
-                String valueString;
-                ChangeAttributeCommand c;
-
-                valueString = ((String) value).trim();
-                c = new ChangeAttributeCommand(
-                        SectionResources.getString("JSFHtmlInputTextSection.CommandLabel.ChangeAttribute"), node, property, valueString); //$NON-NLS-1$
-                c.execute();
-
-                _choiceViewer.refresh();
-            }
-
-        });
-        _choiceViewer.setContentProvider(new ChoiceCotentLabelProvider());
-        _choiceViewer.setLabelProvider(new ChoiceCotentLabelProvider());
-        _choiceViewer.addDoubleClickListener(new IDoubleClickListener()
-        {
-            public void doubleClick(final DoubleClickEvent event)
-            {
-                final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection != null)
-                {
-                    final IDOMElement node = (IDOMElement) selection.getFirstElement();
-                    gotoNode(node);
-                }
-            }
-        });
-        _choiceViewer.addSelectionChangedListener(new ISelectionChangedListener()
-        {
-            public void selectionChanged(final SelectionChangedEvent event)
-            {
-                updateChoiceButtonStatus();
-            }
-        });
-
-        _choiceTypeCombo = factory.createCCombo(other, SWT.READ_ONLY);
-        _choiceTypeCombo.setItems(CHOICETYPES);
-        _choiceTypeCombo.select(0);
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _choiceTypeCombo.setLayoutData(data);
-
-        _choiceAddButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlSelectManyCheckboxSection.Add"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _choiceAddButton.setLayoutData(data);
-        _choiceAddButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final Map attributes = new HashMap();
-                final AddSubNodeCommand c = new AddSubNodeCommand(
-                        SectionResources.getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.AddSubTag"), _element, _choiceTypeCombo.getText(), //$NON-NLS-1$
-                        ITLDConstants.URI_JSF_CORE, attributes);
-                c.execute();
-                _choiceViewer.refresh();
-                updateChoiceButtonStatus();
-            }
-        });
-        _choiceRemoveButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlSelectManyCheckboxSection.Remove"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _choiceRemoveButton.setLayoutData(data);
-        _choiceRemoveButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final IStructuredSelection selection = (IStructuredSelection) _choiceViewer.getSelection();
-                if (selection != null)
-                {
-                    for (final Iterator i = selection.iterator(); i.hasNext();)
-                    {
-                        final IDOMElement node = (IDOMElement) i.next();
-                        final RemoveSubNodeCommand c = new RemoveSubNodeCommand(
-                                SectionResources
-                                .getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag"), _element, node); //$NON-NLS-1$
-                        c.execute();
-                    }
-                    _choiceViewer.refresh();
-                    updateChoiceButtonStatus();
-                }
-            }
-        });
-        _choiceMoveUpButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlSelectManyCheckboxSection.MoveUp"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _choiceMoveUpButton.setLayoutData(data);
-        _choiceMoveUpButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final int index = _choiceTable.getSelectionIndex();
-                final IDOMElement child = (IDOMElement) _choiceTable.getItem(index).getData();
-                final IDOMElement refchild = (IDOMElement) _choiceTable.getItem(index - 1).getData();
-                final RemoveSubNodeCommand remove = new RemoveSubNodeCommand(SectionResources
-                        .getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag"), _element, child); //$NON-NLS-1$
-                remove.execute();
-                final InsertSubNodeCommand insert = new InsertSubNodeCommand(
-                        SectionResources.getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.InsertSubTag"), _element, child, refchild); //$NON-NLS-1$
-                insert.execute();
-                _choiceViewer.refresh();
-                _choiceViewer.getTable().select(index - 1);
-                updateChoiceButtonStatus();
-            }
-        });
-        _choiceMoveDownButton = factory.createButton(other, SectionResources
-                .getString("JSFHtmlSelectManyCheckboxSection.MoveDown"), SWT.NONE); //$NON-NLS-1$
-        data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        _choiceMoveDownButton.setLayoutData(data);
-        _choiceMoveDownButton.addSelectionListener(new SelectionAdapter()
-        {
-            @Override
-            public void widgetSelected(final SelectionEvent e)
-            {
-                final int index = _choiceTable.getSelectionIndex();
-                final IDOMElement child = (IDOMElement) _choiceTable.getItem(index).getData();
-                final IDOMElement refchild = (IDOMElement) _choiceTable.getItem(index + 1).getData();
-                final RemoveSubNodeCommand remove = new RemoveSubNodeCommand(SectionResources
-                        .getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag"), _element, refchild); //$NON-NLS-1$
-                remove.execute();
-                final InsertSubNodeCommand insert = new InsertSubNodeCommand(
-                        SectionResources.getString("JSFHtmlSelectManyCheckboxSection.CommandLabel.InsertSubTag"), _element, refchild, child); //$NON-NLS-1$
-                insert.execute();
-                _choiceViewer.refresh();
-                _choiceViewer.getTable().select(index + 1);
-                updateChoiceButtonStatus();
-            }
-        });
-    }
-
-    private void updateChoiceButtonStatus()
-    {
-        _choiceRemoveButton.setEnabled(true);
-        _choiceMoveUpButton.setEnabled(true);
-        _choiceMoveDownButton.setEnabled(true);
-        final ISelection selection = _choiceViewer.getSelection();
-        if (selection.isEmpty())
-        {
-            _choiceRemoveButton.setEnabled(false);
-            _choiceMoveUpButton.setEnabled(false);
-            _choiceMoveDownButton.setEnabled(false);
-        }
-        if (_choiceTable.getItemCount() == 0)
-        {
-            _choiceRemoveButton.setEnabled(false);
-            _choiceMoveUpButton.setEnabled(false);
-            _choiceMoveDownButton.setEnabled(false);
-        }
-        if (_choiceTable.getSelectionCount() > 1)
-        {
-            _choiceMoveUpButton.setEnabled(false);
-            _choiceMoveDownButton.setEnabled(false);
-        }
-        if (_choiceTable.getSelectionIndex() == 0)
-        {
-            _choiceMoveUpButton.setEnabled(false);
-        }
-        if (_choiceTable.getSelectionIndex() == _choiceTable.getItemCount() - 1)
-        {
-            _choiceMoveDownButton.setEnabled(false);
-        }
-    }
-
-    @Override
-    public void setInput(final IWorkbenchPart part, final ISelection selection)
-    {
-        super.setInput(part, selection);
-
-        _choiceViewer.setInput(_element);
-        updateChoiceButtonStatus();
-    }
-
-    @Override
-    protected void notifyChanged(final INodeNotifier notifier, final int eventType, final Object changedFeature, final Object oldValue,
-            final Object newValue, final int pos)
-    {
-        if (_choiceViewer != null && !_choiceViewer.getControl().isDisposed())
-        {
-            _choiceViewer.refresh();
-        }
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.java
deleted file mode 100644
index c4b2b82..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.sections;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * Section resources
- * @author mengbo
- * @version 1.5
- */
-public final class SectionResources
-{
-    private static final String         BUNDLE_NAME     = "org.eclipse.jst.pagedesigner.jsf.ui.sections.SectionResources"; //$NON-NLS-1$
-
-    private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
-
-    private SectionResources()
-    {
-        // no external instantiation
-    }
-
-    /**
-     * @param key
-     * @return the resource for key or !key! if not found
-     */
-    public static String getString(String key)
-    {
-        try
-        {
-            return RESOURCE_BUNDLE.getString(key);
-        }
-        catch (MissingResourceException e)
-        {
-            return '!' + key + '!';
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.properties
deleted file mode 100644
index e2db901..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/SectionResources.properties
+++ /dev/null
@@ -1,78 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# <f:convertDateTime>
-JSFCoreConvertDateTimeSection.ChangeAttribute=Change Attribute
-
-# <f:convertNumber>
-JSFCoreConvertNumberSection.CommandLabel.ChangeAttribute=Change Attribute
-
-# <h:commandButton>
-JSFHtmlCommandButtonSection.Listeners=Listeners
-JSFHtmlCommandButtonSection.Add=&Add
-JSFHtmlCommandButtonSection.Remove=&Remove
-JSFHtmlCommandButtonSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlCommandButtonSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:dataTable>
-JSFHtmlDataTableSection.Columns=Columns
-JSFHtmlDataTableSection.Add=&Add
-JSFHtmlDataTableSection.Remove=&Remove
-JSFHtmlDataTableSection.MoveUp=Move &up
-JSFHtmlDataTableSection.MoveDown=Move &down
-JSFHtmlDataTableSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlDataTableSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-JSFHtmlDataTableSection.CommandLabel.InsertSubTag=Insert Sub Tag
-
-# <h:inputHidden>
-JSFHtmlInputHiddenSection.Type=Type:
-JSFHtmlInputHiddenSection.Type0=Hidden
-JSFHtmlInputHiddenSection.Type1=Secret
-JSFHtmlInputHiddenSection.Type2=Text
-JSFHtmlInputHiddenSection.Type3=Textarea
-
-JSFHtmlInputHidden.CommandLabel.ChangeType=Change Type
-
-# <h:inputText>
-JSFHtmlInputTextSection.Validators=Validators
-JSFHtmlInputTextSection.Listeners=Listeners
-JSFHtmlInputTextSection.Minimum=Minimum
-JSFHtmlInputTextSection.Maximum=Maximum
-JSFHtmlInputTextSection.Add=&Add
-JSFHtmlInputTextSection.Remove=&Remove
-JSFHtmlInputTextSection.Converter=Converter
-JSFHtmlInputTextSection.CommandLabel.ChangeAttribute=Change Attribute
-JSFHtmlInputTextSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlInputTextSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:outputFormat>
-JSFHtmlOutputFormatSection.Parameters=Parameters:
-JSFHtmlOutputFormatSection.ColName=Name
-JSFHtmlOutputFormatSection.ColValue=Value
-JSFHtmlOutputFormatSection.CommandLabel.ChangeAttribute=Change Attribute
-JSFHtmlOutputFormatSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlOutputFormatSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:outputText>
-JSFHtmlOutputTextSection.Converter=Converter
-JSFHtmlOutputTextSection.Add=&Add
-JSFHtmlOutputTextSection.Remove=&Remove
-JSFHtmlOutputTextSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlOutputTextSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-
-# <h:selectManyCheckbox>
-JSFHtmlSelectManyCheckboxSection.Choices=Choices
-JSFHtmlSelectManyCheckboxSection.Add=&Add
-JSFHtmlSelectManyCheckboxSection.Remove=&Remove
-JSFHtmlSelectManyCheckboxSection.MoveUp=Move &up
-JSFHtmlSelectManyCheckboxSection.MoveDown=Move &down
-JSFHtmlSelectManyCheckboxSection.CommandLabel.AddSubTag=Add Sub Tag
-JSFHtmlSelectManyCheckboxSection.CommandLabel.RemoveSubTag=Remove Sub Tag
-JSFHtmlSelectManyCheckboxSection.CommandLabel.InsertSubTag=Insert Sub Tag
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/util/JSFUIPluginResourcesUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/util/JSFUIPluginResourcesUtil.java
deleted file mode 100644
index a542670..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/util/JSFUIPluginResourcesUtil.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.util;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-
-/**
- * @author mengbo
- */
-public class JSFUIPluginResourcesUtil extends ResourceUtils
-{
-    private final static String             bundleName = "org.eclipse.jst.pagedesigner.jsf.ui.JSFUIResources"; //$NON-NLS-1$
-    private static Logger                   _log       = JSFUICommonPlugin.getLogger(JSFUIPluginResourcesUtil.class);
-    private static JSFUIPluginResourcesUtil _resource;                                                          // singleton
-
-    private JSFUIPluginResourcesUtil()
-    {
-        try
-        {
-            _resources = ResourceBundle.getBundle(bundleName);
-        }
-        catch (MissingResourceException e)
-        {
-            _log.error("Error in getting show messages resource bundle file", e); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @return the singleton instance
-     */
-    public static JSFUIPluginResourcesUtil getInstance()
-    {
-        if (_resource == null)
-        {
-            _resource = new JSFUIPluginResourcesUtil();
-        }
-        return _resource;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.classpath b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.cvsignore b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.cvsignore
deleted file mode 100644
index f9eb27a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-@dot
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.project b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.project
deleted file mode 100644
index 9685725..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.pagedesigner.jsp.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 1c9084e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:05:25 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d8bc1cd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,82 +0,0 @@
-#Mon Jun 30 15:58:19 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 851c0c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 12:00:06 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 6a5feed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,33 +0,0 @@
-Manifest-Version: 1.0
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner.jsp.core;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.jst.pagedesigner.jsp.core.JSPCorePlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.wst.html.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-ManifestVersion: 2
-Export-Package: org.eclipse.jst.pagedesigner.jsp.core;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.el;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.pagevar;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;x-internal:=true,
- org.eclipse.jst.pagedesigner.jsp.core.util;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: javax.servlet;version="2.4.0",
- javax.servlet.http;version="2.4.0",
- javax.servlet.jsp;version="2.0.0",
- javax.servlet.jsp.el;version="2.0.0",
- javax.servlet.jsp.resources;version="2.0.0",
- javax.servlet.jsp.tagext;version="2.0.0",
- javax.servlet.resources;version="2.4.0",
- org.apache.commons.el;version="1.0.0",
- org.apache.commons.el.parser;version="1.0.0"
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/about.html b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/about.html
deleted file mode 100644
index 90bd74d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/build.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/build.properties
deleted file mode 100644
index 6429d84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               schema/,\
-               about.html,\
-               plugin.properties\                         
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.properties b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.properties
deleted file mode 100644
index 3c3f9a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Plugin XML information.
-####################################################
-pluginName=JavaServer Faces Tools - JSP Core Pagedesigner
-providerName=Eclipse.org
-
-extension-point.name.0 = page variable
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.xml
deleted file mode 100644
index ea261e8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/plugin.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="pageVar" name="%extension-point.name.0" schema="schema/pageVar.exsd"/>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/schema/pageVar.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/schema/pageVar.exsd
deleted file mode 100644
index 962bf34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/schema/pageVar.exsd
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner.jsp.core">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner.jsp.core" id="pageVar" name="page variable"/>
-      </appInfo>
-      <documentation>
-         [Enter description of this extension point.]
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="taglib" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tag">
-      <complexType>
-         <attribute name="varName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="varTypeMode" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="CLASSNAME">
-                  </enumeration>
-                  <enumeration value="EXPRESSION">
-                  </enumeration>
-                  <enumeration value="EXPRESSION_COLLECTION_ITEM">
-                  </enumeration>
-                  <enumeration value="BUNDLE">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="varTypeString" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="varNameIsAttr" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="varTypeStringIsAttr" type="boolean" use="default" value="true">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="tagName" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="taglib">
-      <complexType>
-         <sequence>
-            <element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         [Enter the first release in which this extension point appears.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         /*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/IJSPCoreConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/IJSPCoreConstants.java
deleted file mode 100644
index a628e6a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/IJSPCoreConstants.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IJSPCoreConstants 
-{
-    /**
-     * JSP tag name
-     */
-    final static public String TAG_ATTRIBUTE = "attribute"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_BODY = "body"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_ELEMENT = "element"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_EXPRESSION = "expression"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DECLARATION = "declaration"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_INCLUDE = "directive.include"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_PAGE = "directive.page"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DIRECTIVE_TAGLIB = "directive.taglib"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_DOBODY = "doBody"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_FORWARD = "forward"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_GETPROPERTY = "getProperty"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_INCLUDE = "include"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_INVOKE = "invoke"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_OUTPUT = "output"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_PLUGIN = "plugin"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_ROOT = "root"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_SCRIPTLET = "scriptlet"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_SETPROPERTY = "setProperty"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_TEXT = "text"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_USEBEAN = "useBean"; //$NON-NLS-1$
-
-    /**
-     * JSP tag name
-     */
-	final static public String TAG_LEADING_DIRECTIVE = "directive."; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ALIGN = "align"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ARCHIVE = "archive"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_BEANNAME = "beanName"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CLASS = "class"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CODE = "code"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_CODEBASE = "codebase"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPEROOTELEMENT = "doctype-root-element"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPESYSTEM = "doctype-system"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_DOCTYPEPUBLIC = "doctype-public"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_FILE = "file"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_FRAGMENT = "fragment"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_HEIGHT = "height"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_HSPACE = "hspace"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_ID = "id"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_IEPLUGINURL = "iepluginurl"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_JREVERSION = "jreversion"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_NAME = "name"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_NSPLUGINURL = "nspluginurl"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_OMITXMLDECLARATION = "omit-xml-declaration"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_PAGE = "page"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_PROPERTY = "property"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_SCOPE = "scope"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_TRIM = "trim"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_TYPE = "type"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_URI = "uri"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final public static String ATTR_TAGDIR = "tagdir"; //$NON-NLS-1$
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VALUE = "value"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VAR = "var"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VARREADER = "varReader"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_VERSION = "version"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_XMLNSJSP = "xmlns:jsp"; //$NON-NLS-1$
-
-    /**
-     * JSP tag attribute name
-     */
-	final static public String ATTR_XMLNSTAGLIBPREFIX = "xmlns:taglibPrefix"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/JSPCorePlugin.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/JSPCorePlugin.java
deleted file mode 100644
index 4ea9674..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/JSPCorePlugin.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.Plugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class JSPCorePlugin extends Plugin {
-	// The shared instance.
-	private static JSPCorePlugin plugin;
-
-	// Resource bundle.
-	private ResourceBundle resourceBundle;
-
-	/**
-	 * The constructor.
-	 */
-	public JSPCorePlugin() {
-		super();
-		plugin = this;
-		try {
-			resourceBundle = ResourceBundle
-					.getBundle("org.eclipse.jst.pagedesigner.jsp.core.JSPCorePluginResources"); //$NON-NLS-1$
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the default plugin instance
-	 */
-	public static JSPCorePlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 * @param key 
-	 * @return the string for key or 'key' if not found in the default resource bundle
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = JSPCorePlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 * @return the resource bundle
-	 */
-	public ResourceBundle getResourceBundle() {
-		return resourceBundle;
-	}
-
-	/**
-	 * @return the plugin id
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/ListenerList.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/ListenerList.java
deleted file mode 100644
index 9596f97..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/ListenerList.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core;
-
-/**
- * Local version of org.eclipse.jface.util.ListenerList (modified)
- * @author mengbo
- * @version 1.5
- */
-public class ListenerList {
-	/**
-	 * The current number of listeners. Maintains invariant: 0 <= fSize <=
-	 * listeners.length.
-	 */
-	private int _size;
-
-	/**
-	 * The list of listeners. Initially <code>null</code> but initialized to
-	 * an array of size capacity the first time a listener is added. Maintains
-	 * invariant: listeners != null if and only if fSize != 0
-	 */
-	private Object[] _listeners = null;
-
-	/**
-	 * The empty array singleton instance, returned by getListeners() when size ==
-	 * 0.
-	 */
-	private static final Object[] EmptyArray = new Object[0];
-
-	/**
-	 * Creates a listener list with the given initial capacity.
-	 * 
-	 * @param capacity
-	 *            the number of listeners which this list can initially accept
-	 *            without growing its internal representation; must be at least
-	 *            1
-	 */
-	public ListenerList(int capacity) {
-		if (capacity < 1) {
-			throw new IllegalArgumentException();
-		}
-		_listeners = new Object[capacity];
-		_size = 0;
-	}
-
-	/**
-	 * Adds a listener to the list. Has no effect if an identical listener is
-	 * already registered.
-	 * 
-	 * @param listener
-	 *            a listener
-	 */
-	public synchronized void add(Object listener) {
-		if (listener == null) {
-			throw new IllegalArgumentException();
-		}
-		// check for duplicates using identity
-		for (int i = 0; i < _size; ++i) {
-			if (_listeners[i] == listener) {
-				return;
-			}
-		}
-		// grow array if necessary
-		if (_size == _listeners.length) {
-			Object[] temp = new Object[(_size * 2) + 1];
-			System.arraycopy(_listeners, 0, temp, 0, _size);
-			_listeners = temp;
-		}
-		_listeners[_size++] = listener;
-	}
-
-	/**
-	 * Returns an array containing all the registered listeners. The resulting
-	 * array is unaffected by subsequent adds or removes. If there are no
-	 * listeners registered, the result is an empty array singleton instance (no
-	 * garbage is created). Use this method when notifying listeners, so that
-	 * any modifications to the listener list during the notification will have
-	 * no effect on the notification itself.
-	 * @return the array of registered listeners
-	 */
-	public synchronized Object[] getListeners() {
-		if (_size == 0) {
-			return EmptyArray;
-		}
-		Object[] result = new Object[_size];
-		System.arraycopy(_listeners, 0, result, 0, _size);
-		return result;
-	}
-
-	/**
-	 * Removes a listener from the list. Has no effect if an identical listener
-	 * was not already registered.
-	 * 
-	 * @param listener
-	 *            a listener
-	 */
-	public synchronized void remove(Object listener) {
-		if (listener == null) {
-			throw new IllegalArgumentException();
-		}
-
-		for (int i = 0; i < _size; ++i) {
-			if (_listeners[i] == listener) {
-				if (--_size == 0) {
-					_listeners = new Object[1];
-				} else {
-					if (i < _size) {
-						_listeners[i] = _listeners[_size];
-					}
-					_listeners[_size] = null;
-				}
-				return;
-			}
-		}
-	}
-
-	/**
-	 * Removes all the listeners from the list.
-	 */
-	public void removeAll() {
-		_listeners = new Object[0];
-		_size = 0;
-	}
-
-	/**
-	 * Returns the number of registered listeners
-	 * 
-	 * @return the number of registered listeners
-	 */
-	public int size() {
-		return _size;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/ELParser.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/ELParser.java
deleted file mode 100644
index 9c3ee7f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/ELParser.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.el;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.el.ComplexValue;
-import org.apache.commons.el.NamedValue;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ELParser {
-	private String _jsfExpression;
-
-	private List _expressionList;
-
-	/**
-	 * @param expression 
-	 * 
-	 */
-	public ELParser(String expression) {
-		super();
-		_jsfExpression = expression;
-		init();
-	}
-
-	/**
-	 * 
-	 */
-	private void init() {
-		Object parsedExpression = JSFELParserHelper
-				.parseExpression(_jsfExpression);
-
-		if (parsedExpression instanceof ComplexValue) {
-			_expressionList = new ArrayList();
-			_expressionList.add(((ComplexValue) parsedExpression).getPrefix());
-			_expressionList.addAll(((ComplexValue) parsedExpression)
-					.getSuffixes());
-		} else if (parsedExpression instanceof NamedValue) {
-			_expressionList = new ArrayList();
-			_expressionList.add(parsedExpression);
-		}
-
-	}
-
-	/**
-	 * @return the expression elements of null if none
-	 */
-	public Object[] getElements() {
-		if (_expressionList == null) {
-			return null;
-		}
-
-		return _expressionList.toArray();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/JSFELParserHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/JSFELParserHelper.java
deleted file mode 100644
index b8bca4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/el/JSFELParserHelper.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.el;
-
-import java.io.StringReader;
-
-import org.apache.commons.el.Expression;
-import org.apache.commons.el.ExpressionString;
-import org.apache.commons.el.parser.ELParser;
-import org.apache.commons.el.parser.ParseException;
-
-/**
- * Utility class to implement support functionality to "morph" JSP EL into JSF
- * EL
- * 
- * @author mengbo
- * @version 1.5
- */
-public final class JSFELParserHelper {
-	/**
-	 * an EL left brace
-	 */
-	public static String JSF_EL_LEFT_BRACE = "#{"; //$NON-NLS-1$
-
-	/**
-	 * an EL right brace
-	 */
-	public static String JSF_EL_RIGHT_BRACE = "}"; //$NON-NLS-1$
-
-	private JSFELParserHelper() {
-		// util class, do not instantiate
-	}
-
-	/**
-	 * Gets the parsed form of the given expression string. Returns either an
-	 * Expression or ExpressionString.
-	 * @param expressionString 
-	 * @return the result of parsing expressionString
-	 */
-	public static Object parseExpression(String expressionString) {
-		expressionString = toJspElExpression(expressionString);
-
-		ELParser parser = new ELParser(new StringReader(expressionString));
-		try {
-			Object expression = parser.ExpressionString();
-			if (!(expression instanceof Expression)
-					&& !(expression instanceof ExpressionString)) {
-				return null;
-			}
-
-			return expression;
-		} catch (ParseException e) {
-
-			// String msg = "Invalid expression: '" + expressionString + "'";
-			// log.debug(msg, e);
-			// throw new ReferenceSyntaxException(msg, e);
-		}
-		return null;
-	}
-
-	/**
-	 * @param expressionString
-	 * @return true if the expression is 'valid'
-	 */
-	public static boolean isValidEL(String expressionString) {
-		if (expressionString == null || expressionString.length() == 0) {
-			return false;
-		}
-
-		return expressionString.startsWith(JSF_EL_LEFT_BRACE)
-				&& expressionString.endsWith(JSF_EL_RIGHT_BRACE);
-	}
-
-	/**
-	 * @param expressionString
-	 * @return expressionString with the left and right braces removed
-	 * or the original string if isValidEL(expression) == false
-	 */
-	public static String trimELBrace(String expressionString) {
-		if (!isValidEL(expressionString)) {
-			return expressionString;
-		}
-		String trimedExpression = null;
-
-		trimedExpression = expressionString.substring(JSF_EL_LEFT_BRACE
-				.length(), expressionString.length()
-				- JSF_EL_RIGHT_BRACE.length());
-
-		return trimedExpression;
-	}
-
-	/**
-	 * Convert ValueBinding syntax #{ } to JSP EL syntax ${ }
-	 * 
-	 * @param expressionString
-	 *            <code>ValueBinding</code> reference expression
-	 * 
-	 * @return JSP EL compatible expression
-	 */
-	public static String toJspElExpression(String expressionString) {
-		StringBuffer sb = new StringBuffer(expressionString.length());
-		int remainsPos = 0;
-
-		for (int posOpenBrace = expressionString.indexOf('{'); posOpenBrace >= 0; posOpenBrace = expressionString
-				.indexOf('{', remainsPos)) {
-			if (posOpenBrace > 0) {
-				if (posOpenBrace - 1 > remainsPos)
-					sb.append(expressionString.substring(remainsPos,
-							posOpenBrace - 1));
-
-				if (expressionString.charAt(posOpenBrace - 1) == '$') {
-					sb.append("${'${'}"); //$NON-NLS-1$
-					remainsPos = posOpenBrace + 1;
-					continue;
-				} else if (expressionString.charAt(posOpenBrace - 1) == '#') {
-					// TODO: should use \\ as escape for \ always, not just when
-					// before #{
-					// allow use of '\' as escape symbol for #{ (for
-					// compatibility with Sun's extended implementation)
-					/*
-					 * if (isEscaped(expressionString, posOpenBrace - 1)) {
-					 * escapes: { for (int i = sb.length() - 1; i >= 0; i--) {
-					 * if (sb.charAt(i) != '\\') { sb.setLength( sb.length() -
-					 * (sb.length() - i) / 2); break escapes; } }
-					 * sb.setLength(sb.length() / 2); } sb.append("#{"); } else {
-					 */
-					sb.append("${"); //$NON-NLS-1$
-					int posCloseBrace = indexOfMatchingClosingBrace(
-							expressionString, posOpenBrace);
-					sb.append(expressionString.substring(posOpenBrace + 1,
-							posCloseBrace + 1));
-					remainsPos = posCloseBrace + 1;
-					continue;
-					// }
-				} else {
-					if (posOpenBrace > remainsPos)
-						sb.append(expressionString.charAt(posOpenBrace - 1));
-				}
-			}
-
-			// Standalone brace
-			sb.append('{');
-			remainsPos = posOpenBrace + 1;
-		}
-
-		sb.append(expressionString.substring(remainsPos));
-
-		// Create a new String to shrink mem size since we are caching
-		return new String(sb.toString());
-	}
-
-	private static int findQuote(String expressionString, int start) {
-		int indexofSingleQuote = expressionString.indexOf('\'', start);
-		int indexofDoubleQuote = expressionString.indexOf('"', start);
-		return minIndex(indexofSingleQuote, indexofDoubleQuote);
-	}
-
-	/**
-	 * Return the index of the matching closing brace, skipping over quoted text
-	 * 
-	 * @param expressionString
-	 *            string to search
-	 * @param indexofOpeningBrace
-	 *            the location of opening brace to match
-	 * 
-	 * @return the index of the matching closing brace
-	 * 
-	 * @throws ReferenceSyntaxException
-	 *             if matching brace cannot be found
-	 */
-	private static int indexOfMatchingClosingBrace(String expressionString,
-			int indexofOpeningBrace) {
-		int len = expressionString.length();
-		int i = indexofOpeningBrace + 1;
-
-		// Loop through quoted strings
-		for (;;) {
-			if (i >= len) {
-				throw new IllegalStateException(
-						"Missing closing brace. Expression: '" //$NON-NLS-1$
-								+ expressionString + "'"); //$NON-NLS-1$
-			}
-
-			int indexofClosingBrace = expressionString.indexOf('}', i);
-			i = minIndex(indexofClosingBrace, findQuote(expressionString, i));
-
-			if (i < 0) {
-				// No delimiter found
-				throw new IllegalStateException(
-						"Missing closing brace. Expression: '" //$NON-NLS-1$
-								+ expressionString + "'"); //$NON-NLS-1$
-			}
-
-			// 1. If quoted literal, find closing quote
-			if (i != indexofClosingBrace) {
-				i = indexOfMatchingClosingQuote(expressionString, i) + 1;
-				if (i == 0) {
-					// Note: if no match, i==0 because -1 + 1 = 0
-					throw new IllegalStateException(
-							"Missing closing quote. Expression: '" //$NON-NLS-1$
-									+ expressionString + "'"); //$NON-NLS-1$
-				}
-			} else {
-				// Closing brace
-				return i;
-			}
-		}
-	}
-
-	/**
-	 * Returns the index of the matching closing quote, skipping over escaped
-	 * quotes
-	 * 
-	 * @param expressionString
-	 *            string to scan
-	 * @param indexOfOpeningQuote
-	 *            start from this position in the string
-	 * @return -1 if no match, the index of closing quote otherwise
-	 */
-	private static int indexOfMatchingClosingQuote(String expressionString,
-			int indexOfOpeningQuote) {
-		char quote = expressionString.charAt(indexOfOpeningQuote);
-		for (int i = expressionString.indexOf(quote, indexOfOpeningQuote + 1); i >= 0; i = expressionString
-				.indexOf(quote, i + 1)) {
-			if (!isEscaped(expressionString, i)) {
-				return i;
-			}
-		}
-
-		// No matching quote found
-		return -1;
-	}
-
-	private static boolean isEscaped(String expressionString, int i) {
-		int escapeCharCount = 0;
-		while ((--i >= 0) && (expressionString.charAt(i) == '\\')) {
-			escapeCharCount++;
-		}
-
-		return (escapeCharCount % 2) != 0;
-	}
-
-	/**
-	 * Returns the minimum index >= 0, if any
-	 * 
-	 * <p>
-	 * Use to find the first of two characters in a string:<br>
-	 * <code>minIndex(s.indexOf('/'), indexOf('\'))</code>
-	 * </p>
-	 * @param a 
-	 * @param b 
-	 * @return the minimum index >= 0, if any
-	 * 
-	 */
-	public static int minIndex(int a, int b) {
-		return (a < 0) ? b : (b < 0) ? a : (a < b) ? a : b;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/DocumentPageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/DocumentPageVariableAdapter.java
deleted file mode 100644
index ebd93fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/DocumentPageVariableAdapter.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.jsp.core.ListenerList;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IChangeListener;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This adapter will be adapted on the JSP document.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DocumentPageVariableAdapter implements
-		IDocumentPageVariableAdapter {
-	private IDOMDocument _document;
-
-	private ListenerList _changeListeners = new ListenerList(2);
-
-	private List _variableInfos = new ArrayList();
-
-	private boolean _readingInfo = false;
-
-	/**
-	 * @param doc 
-	 * 
-	 */
-	public DocumentPageVariableAdapter(IDOMDocument doc) {
-		super();
-		this._document = doc;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#getBeanInfos()
-	 */
-	public IVariableInfo[] getBeanInfos() {
-		IVariableInfo[] ret = new IVariableInfo[_variableInfos.size()];
-		return (IVariableInfo[]) _variableInfos.toArray(ret);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#addChangeListener(org.eclipse.jst.pagedesigner.jsp.core.pagevar.IChangeListener)
-	 */
-	public void addChangeListener(IChangeListener listener) {
-		this.reReadInfo();
-		_changeListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#removeChangeListener(org.eclipse.jst.pagedesigner.jsp.core.pagevar.IChangeListener)
-	 */
-	public void removeChangeListener(IChangeListener listener) {
-		_changeListeners.remove(listener);
-	}
-
-	/**
-	 * fire change events on all listeners
-	 */
-	protected void fireChanged() {
-		Object[] listeners = _changeListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			IChangeListener l = (IChangeListener) listeners[i];
-			l.changed();
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return IDocumentPageVariableAdapter.class.equals(type);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		switch (eventType) {
-		case INodeNotifier.STRUCTURE_CHANGED:
-		case INodeNotifier.CONTENT_CHANGED:
-		case INodeNotifier.CHANGE:
-			refresh();
-			break;
-		default:
-			// skip. Ignore other kinds of change.
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider#refresh()
-	 */
-	public void refresh() {
-		reReadInfo();
-	}
-
-	/**
-	 * re-read page variable info
-	 */
-	protected void reReadInfo() {
-		if (this._readingInfo) {
-			return;
-		}
-		try {
-			List oldInfo = this._variableInfos;
-			this._variableInfos = new ArrayList();
-			readNode(_document);
-			if (!isSame(oldInfo, this._variableInfos)) {
-				fireChanged();
-			}
-		} finally {
-			this._readingInfo = false;
-		}
-	}
-
-	/**
-	 * compare two variable info list.
-	 * 
-	 * @param oldInfo
-	 * @param list
-	 * @return true if same.
-	 */
-	private boolean isSame(List oldInfo, List list) {
-		if (oldInfo.size() != list.size()) {
-			return false;
-		}
-		for (int i = 0, size = oldInfo.size(); i < size; i++) {
-			IVariableInfo info1 = (IVariableInfo) oldInfo.get(i);
-			IVariableInfo info2 = (IVariableInfo) list.get(i);
-			if (info1 == null) {
-				return false;// should not happen
-			}
-			if (!info1.equals(info2)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * recursively read all element, and see whether they have
-	 * IPageVariableAdapter, and then get variable info.
-	 * 
-	 * @param element
-	 */
-	private void readNode(Node node) {
-		if (node instanceof INodeNotifier && node instanceof Element) {
-			Element element = (Element) node;
-			Object obj = ((INodeNotifier) element)
-					.getAdapterFor(IPageVariableAdapter.class);
-			if (obj instanceof IPageVariableAdapter) {
-				IPageVariableAdapter adapter = (IPageVariableAdapter) obj;
-				if (adapter.supportMultipleVariable(element)) {
-					List infos = ((IPageVariableAdapter) obj)
-							.getVariableInfos(element);
-					if (infos != null) {
-						this._variableInfos.addAll(infos);
-					}
-				} else {
-					// hope not doing addAll could improve some performance.
-					IVariableInfo info = adapter.getVariableInfo(element);
-					if (info != null) {
-						this._variableInfos.add(info);
-					}
-				}
-			}
-		}
-
-		NodeList childNodes = node.getChildNodes();
-		if (childNodes != null) {
-			for (int i = 0, length = childNodes.getLength(); i < length; i++) {
-				Node childNode = childNodes.item(i);
-				readNode(childNode);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdapter.java
deleted file mode 100644
index 40e01b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdapter.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageVariableAdapter implements IPageVariableAdapter {
-	static final PageVariableAdapter _instance = new PageVariableAdapter();
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static PageVariableAdapter getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * no external instatiation
-	 */
-	private PageVariableAdapter() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return IPageVariableAdapter.class.equals(type);
-	}
-
-	private IDocumentPageVariableAdapter getDocumentAdapter(
-			INodeNotifier notifier) {
-		if (notifier instanceof IDOMNode) {
-			IDOMModel model = ((IDOMNode) notifier).getModel();
-			if (model != null) {
-				IDOMDocument document = model.getDocument();
-				if (document != null) {
-					return (IDocumentPageVariableAdapter) document
-							.getAdapterFor(IDocumentPageVariableAdapter.class);
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		IDocumentPageVariableAdapter docadapter = getDocumentAdapter(notifier);
-
-		switch (eventType) {
-		case INodeNotifier.STRUCTURE_CHANGED:
-			docadapter.refresh();
-			break;
-		case INodeNotifier.CONTENT_CHANGED:
-		case INodeNotifier.CHANGE:
-			// only this node changed, only refresh if this node is page
-			// variable node
-			if (notifier instanceof Element
-					&& supportVariableInfo((Element) notifier)) {
-				docadapter.refresh();
-			}
-			break;
-		default:
-			// skip. Ignore other kinds of change.
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter#supportMultipleVariable(org.w3c.dom.Element)
-	 */
-	public boolean supportMultipleVariable(Element element) {
-		return false;
-	}
-
-	/**
-	 * @param element
-	 * @return
-	 */
-	private boolean supportVariableInfo(Element element) {
-		return PageVariableAdatperRegistry.getInstance().getTagVarDescriptor(
-				element) != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter#getVariableInfo(org.w3c.dom.Element)
-	 */
-	public IVariableInfo getVariableInfo(Element element) {
-		TagVarDescriptor desc = PageVariableAdatperRegistry.getInstance()
-				.getTagVarDescriptor(element);
-		if (desc == null) {
-			return null;
-		}
-		String name;
-		if (desc.isVarNameIsAttr()) {
-			name = element.getAttribute(desc.getVarName());
-			if (name == null || name.length() == 0) {
-				return null; // missing name.
-			}
-		} else {
-			name = desc.getVarName();
-		}
-		String type;
-		if (desc.isVarTypeStringIsAttr()) {
-			type = element.getAttribute(desc.getVarTypeString());
-			if (type == null || type.length() == 0) {
-				return null; // missing type
-			}
-		} else {
-			type = desc.getVarTypeString();
-		}
-		return new VariableInfo(name, desc.getVarTypeMode(), type);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IPageVariableAdapter#getVariableInfos(org.w3c.dom.Element)
-	 */
-	public List getVariableInfos(Element element) {
-		IVariableInfo info = getVariableInfo(element);
-		if (info == null) {
-			return Collections.EMPTY_LIST;
-		}
-        List ret = new ArrayList(1);
-        ret.add(info);
-        return ret;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdatperRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdatperRegistry.java
deleted file mode 100644
index e64dce6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/PageVariableAdatperRegistry.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.jsp.core.JSPCorePlugin;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.util.CMUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageVariableAdatperRegistry {
-	/**
-	 * pageVar
-	 */
-	public static final String PAGEVAR = "pageVar"; //$NON-NLS-1$
-
-	/**
-	 * taglib
-	 */
-	public static final String TAGLIB = "taglib"; //$NON-NLS-1$
-
-	/**
-	 * tag
-	 */
-	public static final String TAG = "tag"; //$NON-NLS-1$
-
-	/**
-	 * varName
-	 */
-	public static final String VARNAME = "varName"; //$NON-NLS-1$
-
-	/**
-	 * varNameIsAttr
-	 */
-	public static final String VARNAMEISATTR = "varNameIsAttr"; //$NON-NLS-1$
-
-	/**
-	 * varTypeMode
-	 */
-	public static final String VARTYPEMODE = "varTypeMode"; //$NON-NLS-1$
-
-	/**
-	 * tagName
-	 */
-	public static final String TAGNAME = "tagName"; //$NON-NLS-1$
-
-	/**
-	 * varTypeString
-	 */
-	public static final String VARTYPESTRING = "varTypeString"; //$NON-NLS-1$
-
-	/**
-	 * varTypeStringIsAttr
-	 */
-	public static final String VARTYPESTRINGISATTR = "varTypeStringIsAttr"; //$NON-NLS-1$
-
-	/**
-	 * uri
-	 */
-	public static final String URI = "uri"; //$NON-NLS-1$
-
-	private static PageVariableAdatperRegistry _instance = null;
-
-	private Map _registry;
-
-	private TagVarDescriptor _useBeanDescriptor;
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static PageVariableAdatperRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new PageVariableAdatperRegistry();
-		}
-		return _instance;
-	}
-
-	private PageVariableAdatperRegistry() {
-		_registry = readAllDescriptors();
-	}
-
-	// public IPageVariableAdapter createAdapter(IDOMElement ele, String uri,
-	// String tagname)
-	// {
-	// String key = uri + "#" + tagname;
-	// TagVarDescriptor desc = (TagVarDescriptor) _registry.get(key);
-	// if (desc != null)
-	// {
-	// PageVariableAdapter adapter = new PageVariableAdapter(ele);
-	// adapter.setVarName(desc.getVarName());
-	// adapter.setVarNameAttrName(desc.isVarNameIsAttr());
-	// adapter.setVarTypeString(desc.getVarTypeString());
-	// adapter.setVarTypeAttrName(desc.isVarTypeStringIsAttr());
-	// adapter.setVarTypeMode(desc.getVarTypeMode());
-	// return adapter;
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-
-	private Map readAllDescriptors() {
-		Map map = new HashMap();
-
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(JSPCorePlugin.getPluginId(), PAGEVAR);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] facs = ext.getConfigurationElements();
-
-			for (int j = 0; j < facs.length; j++) {
-				if (facs[j].getName().equals(TAGLIB)) {
-					String uri = facs[j].getAttribute(URI);
-					if (uri == null || uri.length() == 0) {
-						continue;
-					}
-					IConfigurationElement[] tags = facs[j].getChildren(TAG);
-					for (int k = 0; k < tags.length; k++) {
-						TagVarDescriptor desc = new TagVarDescriptor();
-
-						String tag = tags[k].getAttribute(TAGNAME);
-						String varName = tags[k].getAttribute(VARNAME);
-						boolean varNameIsAttr = "true".equalsIgnoreCase(tags[k] //$NON-NLS-1$
-								.getAttribute(VARNAMEISATTR));
-						String varTypeString = tags[k]
-								.getAttribute(VARTYPESTRING);
-						boolean varTypeStringIsAttr = "true" //$NON-NLS-1$
-								.equalsIgnoreCase(tags[k]
-										.getAttribute(VARTYPESTRINGISATTR));
-						String varTypeModeString = tags[k]
-								.getAttribute(VARTYPEMODE);
-						int varTypeMode = toVarTypeMode(varTypeModeString);
-
-						desc.setVarName(varName);
-						desc.setVarNameIsAttr(varNameIsAttr);
-						desc.setVarTypeMode(varTypeMode);
-						desc.setVarTypeString(varTypeString);
-						desc.setVarTypeStringIsAttr(varTypeStringIsAttr);
-						desc.setTagName(tag);
-
-						// Use uri#tag as key.
-						map.put(uri + "#" + tag, desc); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-
-		return map;
-	}
-
-	/**
-	 * @param varTypeModeString
-	 * @return variable typemode
-	 */
-	public static int toVarTypeMode(String varTypeModeString) {
-		if ("CLASSNAME".equalsIgnoreCase(varTypeModeString)) { //$NON-NLS-1$
-			return IVariableInfo.CLASSNAME;
-		} else if ("EXPRESSION".equalsIgnoreCase(varTypeModeString)) { //$NON-NLS-1$
-			return IVariableInfo.EXPRESSION;
-		} else if ("EXPRESSION_COLLECTION_ITEM" //$NON-NLS-1$
-				.equalsIgnoreCase(varTypeModeString)) {
-			return IVariableInfo.EXPRESSION_LISTITEM;
-		} else if ("BUNDLE".equalsIgnoreCase(varTypeModeString)) { //$NON-NLS-1$
-			return IVariableInfo.RESOURCEBUNDLE;
-		} else {
-			return IVariableInfo.EXPRESSION; // default
-		}
-	}
-
-	/**
-	 * @param uri
-	 * @param tagname
-	 * @return the tag variable descriptor for the given tag (may be null)
-	 */
-	public TagVarDescriptor getTagVarDescriptor(String uri, String tagname) {
-		String key = uri + "#" + tagname; //$NON-NLS-1$
-		return (TagVarDescriptor) _registry.get(key);
-	}
-
-	/**
-	 * @param localName
-	 * @return
-	 */
-	private TagVarDescriptor getJSPTagVarDescriptor(String localName) {
-		if (IJSPCoreConstants.TAG_USEBEAN.equals(localName)) {
-			if (_useBeanDescriptor == null) {
-				_useBeanDescriptor = new TagVarDescriptor();
-				_useBeanDescriptor.setVarName(IJSPCoreConstants.ATTR_ID);
-				_useBeanDescriptor.setVarNameIsAttr(true);
-				_useBeanDescriptor.setVarTypeMode(IVariableInfo.CLASSNAME);
-				_useBeanDescriptor
-						.setVarTypeString(IJSPCoreConstants.ATTR_CLASS);
-				_useBeanDescriptor.setVarTypeStringIsAttr(true);
-			}
-
-			return _useBeanDescriptor;
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param target 
-	 * @return the tag variable descriptor for the target
-	 */
-	public TagVarDescriptor getTagVarDescriptor(Element target) {
-		if (target instanceof IDOMElement) {
-			IDOMElement xmlEle = (IDOMElement) target;
-			CMElementDeclaration decl = CMUtil.getElementDeclaration(xmlEle);
-			if (decl != null) {
-			    if (CMUtil.isJSP(decl)) {
-			        return getJSPTagVarDescriptor(xmlEle.getLocalName());
-			    }
-                String uri = CMUtil.getTagURI(decl);
-                if (uri != null) {
-                    return getTagVarDescriptor(uri, xmlEle.getLocalName());
-                }
-			}
-		}
-        return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/TagVarDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/TagVarDescriptor.java
deleted file mode 100644
index 8e5b649..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/TagVarDescriptor.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TagVarDescriptor {
-	private String _varName;
-
-	private boolean _varNameIsAttr;
-
-	private String _varTypeString;
-
-	private boolean _varTypeStringIsAttr;
-
-	private int _varTypeMode;
-
-	private String _tagName;
-
-	/**
-	 * @return the varName
-	 */
-	public String getVarName() {
-		return _varName;
-	}
-
-	/**
-	 * @param varName
-	 */
-	public void setVarName(String varName) {
-		this._varName = varName;
-	}
-
-	/**
-	 * @return true if var name is attribute
-	 */
-	public boolean isVarNameIsAttr() {
-		return _varNameIsAttr;
-	}
-
-	/**
-	 * @param varNameIsAttr
-	 */
-	public void setVarNameIsAttr(boolean varNameIsAttr) {
-		this._varNameIsAttr = varNameIsAttr;
-	}
-
-	/**
-	 * @return the variable type mode
-	 */
-	public int getVarTypeMode() {
-		return _varTypeMode;
-	}
-
-	/**
-	 * @param varTypeMode
-	 */
-	public void setVarTypeMode(int varTypeMode) {
-		this._varTypeMode = varTypeMode;
-	}
-
-	/**
-	 * @return the variable type string
-	 */
-	public String getVarTypeString() {
-		return _varTypeString;
-	}
-
-	/**
-	 * @param varTypeString
-	 */
-	public void setVarTypeString(String varTypeString) {
-		this._varTypeString = varTypeString;
-	}
-
-	/**
-	 * @return true if variable type string is attr
-	 */
-	public boolean isVarTypeStringIsAttr() {
-		return _varTypeStringIsAttr;
-	}
-
-	/**
-	 * @param varTypeStringIsAttr
-	 */
-	public void setVarTypeStringIsAttr(boolean varTypeStringIsAttr) {
-		this._varTypeStringIsAttr = varTypeStringIsAttr;
-	}
-
-	/**
-	 * @param tag
-	 */
-	public void setTagName(String tag) {
-		this._tagName = tag;
-	}
-
-	/**
-	 * @return the tag name
-	 */
-	public String getTagName() {
-		return this._tagName;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/VariableInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/VariableInfo.java
deleted file mode 100644
index 6b29b9a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/internal/pagevar/VariableInfo.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class VariableInfo implements IVariableInfo {
-	private String _typeInfo;
-
-	private int _mode;
-
-	private String _name;
-
-	/**
-	 * @param name 
-	 * @param mode 
-	 * @param typeInfo 
-	 * 
-	 */
-	public VariableInfo(String name, int mode, String typeInfo) {
-		this._name = name;
-		this._mode = mode;
-		this._typeInfo = typeInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo#getName()
-	 */
-	public String getName() {
-		return _name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo#getMode()
-	 */
-	public int getMode() {
-		return _mode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo#getTypeInfoString()
-	 */
-	public String getTypeInfoString() {
-		return _typeInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-    // TODO: no hashcode override?
-	public boolean equals(Object obj) {
-		if (this == obj) {
-			return true;
-		}
-		if (obj instanceof VariableInfo) {
-			VariableInfo info = (VariableInfo) obj;
-			return this._mode == info._mode && equals(this._name, info._name)
-					&& equals(this._typeInfo, info._typeInfo);
-		}
-        return false;
-	}
-
-	private boolean equals(String s1, String s2) {
-		if (s1 == null) {
-			return s2 == null;
-		}
-        return s1.equals(s2);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IChangeListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IChangeListener.java
deleted file mode 100644
index 9196d0c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IChangeListener.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar;
-
-import java.util.EventListener;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IChangeListener extends EventListener {
-	/**
-	 * fire a changed indication
-	 */
-	public void changed();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IPageVariablesProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IPageVariablesProvider.java
deleted file mode 100644
index a538ec8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IPageVariablesProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IPageVariablesProvider {
-	/**
-	 * 
-	 */
-	public void refresh();
-
-	/**
-	 * @return the bean infos
-	 */
-	public IVariableInfo[] getBeanInfos();
-
-	/**
-	 * @param listener
-	 */
-	public void addChangeListener(IChangeListener listener);
-
-	/**
-	 * @param listener
-	 */
-	public void removeChangeListener(IChangeListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IVariableInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IVariableInfo.java
deleted file mode 100644
index a491de0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/IVariableInfo.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IVariableInfo {
-	/**
-	 * @return the name
-	 */
-	public String getName();
-
-	/**
-	 * TODO
-	 */
-	public static final int CLASSNAME = 0;
-
-	/**
-	 * TODO
-	 */
-	public static final int EXPRESSION = 1;
-
-	/**
-	 * TODO
-	 */
-	public static final int EXPRESSION_LISTITEM = 2;
-
-	/**
-	 * TODO
-	 */
-	public static final int RESOURCEBUNDLE = 3;
-
-	/**
-	 * @return one of CLASSNAME, EXPRESSION, EXPRESSION_LISTITEM, RESOURCEBUNDLE
-	 */
-	public int getMode();
-
-	/**
-	 * type info string will have different meaning for different mode.
-	 * 
-	 * @return the type info string
-	 */
-	public String getTypeInfoString();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IDocumentPageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IDocumentPageVariableAdapter.java
deleted file mode 100644
index 31979ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IDocumentPageVariableAdapter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-
-/**
- * IDocumentPageVariableAdapter will be adapted to the jsp document.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IDocumentPageVariableAdapter extends IPageVariablesProvider,
-		INodeAdapter {
-    // TODO: what's this for?
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IPageVariableAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IPageVariableAdapter.java
deleted file mode 100644
index 158799f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/IPageVariableAdapter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;
-
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.w3c.dom.Element;
-
-/**
- * A IPageVariableAdapter normally will be adapted to an JSP tag.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IPageVariableAdapter extends INodeAdapter {
-	/**
-	 * most JSP tags will only support a single variable.
-	 * @param element 
-	 * 
-	 * @return true if the tag supports multiple variables
-	 */
-	public boolean supportMultipleVariable(Element element);
-
-	/**
-	 * If only support single variable, this method will return the variable
-	 * info. This method is provided for better performance.
-	 * 
-	 * @param element 
-	 * @return null means no variable info provided.
-	 */
-	public IVariableInfo getVariableInfo(Element element);
-
-	/**
-	 * should return a list of IVariableInfo
-	 * @param element 
-	 * 
-	 * @return the list of variable infos
-	 */
-	public List getVariableInfos(Element element);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/PageVariableAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/PageVariableAdapterFactory.java
deleted file mode 100644
index 1c6c64d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/pagevar/adapter/PageVariableAdapterFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter;
-
-import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.PageVariableAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PageVariableAdapterFactory extends AbstractAdapterFactory {
-	/**
-	 * 
-	 */
-	public PageVariableAdapterFactory() {
-		super(IPageVariableAdapter.class, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory#createAdapter(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	protected INodeAdapter createAdapter(INodeNotifier target) {
-		if (target instanceof IDOMElement) {
-			return PageVariableAdapter.getInstance();
-		}
-        return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/util/CMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/util/CMUtil.java
deleted file mode 100644
index fd299aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsp.core/src/org/eclipse/jst/pagedesigner/jsp/core/util/CMUtil.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsp.core.util;
-
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.wst.html.core.internal.provisional.HTMLCMProperties;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMNodeWrapper;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
-
-/**
- * Utility class to content model related information.
- * 
- * @author mengbo
- */
-public class CMUtil {
-	/**
-	 * If the element is a custom tag, get the URI of it. If the element is a
-	 * standard JSP tag, return null. If is not jsp tag, then return null
-	 * @param decl 
-	 * @return the tag uri for decl
-	 */
-	public static String getTagURI(CMElementDeclaration decl) {
-		if (decl instanceof CMNodeWrapper) {
-			decl = (CMElementDeclaration) ((CMNodeWrapper) decl)
-					.getOriginNode();
-		}
-		if (decl instanceof TLDElementDeclaration) {
-			CMDocument doc = ((TLDElementDeclaration) decl).getOwnerDocument();
-			if (doc instanceof TLDDocument) {
-				return ((TLDDocument) doc).getUri();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * get element declaration of specified element
-	 * 
-	 * @param element
-	 * @return null if can't get it.
-	 */
-	public static CMElementDeclaration getElementDeclaration(IDOMElement element) {
-		INodeNotifier notifier = (INodeNotifier) element.getOwnerDocument();
-		if (notifier == null) {
-			return null;
-		}
-		ModelQueryAdapter mqa = (ModelQueryAdapter) notifier
-				.getAdapterFor(ModelQueryAdapter.class);
-		if (mqa == null) {
-			return null;
-		}
-		return mqa.getModelQuery().getCMElementDeclaration(element);
-	}
-
-	/**
-	 * @param element
-	 * @return the tld element declaration for element
-	 */
-	public static TLDElementDeclaration getTLDElementDeclaration(
-			IDOMElement element) {
-		CMNode decl = getElementDeclaration(element);
-		if (decl instanceof CMNodeWrapper) {
-			decl = ((CMNodeWrapper) decl).getOriginNode();
-		}
-		if (decl instanceof TLDElementDeclaration) {
-			return (TLDElementDeclaration) decl;
-		}
-        return null;
-	}
-
-	/**
-	 * @param decl 
-	 * @return true if decl is a JSP tag 
-	 */
-	public static boolean isJSP(CMElementDeclaration decl) {
-		if (!decl.supports(HTMLCMProperties.IS_JSP)) {
-			return false;
-		}
-		return ((Boolean) decl.getProperty(HTMLCMProperties.IS_JSP))
-				.booleanValue();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath b/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath
deleted file mode 100644
index 472ee29..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore b/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore
deleted file mode 100644
index f9eb27a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-@dot
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.options b/jsf/plugins/org.eclipse.jst.pagedesigner/.options
deleted file mode 100644
index 0b7e602..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.options
+++ /dev/null
@@ -1,5 +0,0 @@
-org.eclipse.jst.pagedesigner/debug=true
-org.eclipse.jst.pagedesigner/debug/converter/load=false
-org.eclipse.jst.pagedesigner/debug/converter/selection=false
-org.eclipse.jst.pagedesigner/debug/elementedit/load=false
-org.eclipse.jst.pagedesigner/debug/elementedit/selection=false
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.project b/jsf/plugins/org.eclipse.jst.pagedesigner/.project
deleted file mode 100644
index 290ca26..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.pagedesigner</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.jem.beaninfo.BeanInfoNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index f2dd42a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:04:56 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 3342f83..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,87 +0,0 @@
-#Wed Mar 04 15:05:47 PST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 6a74a22..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:58:12 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF
deleted file mode 100644
index 8c8f159..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,135 +0,0 @@
-Manifest-Version: 1.0
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner;singleton:=true
-Bundle-Name: %pluginName
-Bundle-Version: 1.3.0.qualifier
-Bundle-Activator: org.eclipse.jst.pagedesigner.PDPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.debug.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.workbench.texteditor;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.ui;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.uriresolver;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.3.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.jst.jsp.ui;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.jst.j2ee.web;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.pagedesigner.jsp.core;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.html.ui;bundle-version="[1.0.100,1.1.0)",
- org.eclipse.wst.css.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.html.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.2.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.ui.views.properties.tabbed;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.expressions;bundle-version="[3.4.0,3.5.0]",
- org.eclipse.jst.jsf.common.runtime;bundle-version="[1.0.201,2.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-ManifestVersion: 2
-Export-Package: org.eclipse.jst.pagedesigner;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.container;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.link;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.menuextension;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.range;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.single;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.table;x-internal:=true,
- org.eclipse.jst.pagedesigner.adapters;x-internal:=true,
- org.eclipse.jst.pagedesigner.adapters.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.nav;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.range;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.single;x-internal:=true,
- org.eclipse.jst.pagedesigner.converter,
- org.eclipse.jst.pagedesigner.converter.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.converter.jsp;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.border;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.color;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.font;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.layout;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.layout.table;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.list;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.marker;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.property;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.provider;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.style;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.value;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.widget;x-internal:=true,
- org.eclipse.jst.pagedesigner.dnd;x-internal:=true,
- org.eclipse.jst.pagedesigner.dnd.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.dom;x-internal:=true,
- org.eclipse.jst.pagedesigner.dom.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.dtmanager,
- org.eclipse.jst.pagedesigner.dtmanager.converter,
- org.eclipse.jst.pagedesigner.dtmanager.converter.internal;x-friends:="org.eclipse.jst.pagedesigner.jsf.ui",
- org.eclipse.jst.pagedesigner.dtmanager.converter.operations,
- org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo,
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;x-internal:=true,
- org.eclipse.jst.pagedesigner.dtresourceprovider;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.actions;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.pagedesigner;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.properties,
- org.eclipse.jst.pagedesigner.editors.properties.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections,
- org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.util;x-internal:=true,
- org.eclipse.jst.pagedesigner.editpolicies;x-internal:=true,
- org.eclipse.jst.pagedesigner.elementedit;x-internal:=true,
- org.eclipse.jst.pagedesigner.elementedit.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.elementedit.jsp;x-internal:=true,
- org.eclipse.jst.pagedesigner.extensionpoint,
- org.eclipse.jst.pagedesigner.figurehandler;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation.command;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation.customizer;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.meta;x-internal:=true,
- org.eclipse.jst.pagedesigner.meta.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.parts;x-internal:=true,
- org.eclipse.jst.pagedesigner.preview;x-internal:=true,
- org.eclipse.jst.pagedesigner.properties;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.properties.attrgroup;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.properties.celleditors;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.properties.dialogfields;x-internal:=true,
- org.eclipse.jst.pagedesigner.properties.internal;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.range;x-internal:=true,
- org.eclipse.jst.pagedesigner.requests;x-internal:=true,
- org.eclipse.jst.pagedesigner.tableedit;x-internal:=true,
- org.eclipse.jst.pagedesigner.tools;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.common;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.common.sash;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.dialogfields;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.dialogs;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.preferences;x-internal:=true,
- org.eclipse.jst.pagedesigner.utils;x-internal:=true,
- org.eclipse.jst.pagedesigner.validation.caret;x-internal:=true,
- org.eclipse.jst.pagedesigner.viewer;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: javax.servlet;version="2.4.0",
- javax.servlet.http;version="2.4.0",
- javax.servlet.jsp;version="2.0.0",
- javax.servlet.jsp.el;version="2.0.0",
- javax.servlet.jsp.resources;version="2.0.0",
- javax.servlet.jsp.tagext;version="2.0.0",
- javax.servlet.resources;version="2.4.0",
- org.apache.commons.el;version="1.0.0",
- org.apache.commons.el.parser;version="1.0.0"
-
-
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/about.html b/jsf/plugins/org.eclipse.jst.pagedesigner/about.html
deleted file mode 100644
index 90bd74d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/build.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/build.properties
deleted file mode 100644
index fdf6446..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/build.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-jars.compile.order = .
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               schema/,\
-               about.html,\
-               default.properties,\
-               .options
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties
deleted file mode 100644
index d6297e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# This file contains all the Default Preference Settings
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/LineBreak.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/LineBreak.gif
deleted file mode 100644
index b468685..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/LineBreak.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png
deleted file mode 100644
index 679ef99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif
deleted file mode 100644
index 6638a99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif
deleted file mode 100644
index c5064fd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif
deleted file mode 100644
index 471b1b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif
deleted file mode 100644
index f814851..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif
deleted file mode 100644
index 639de46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif
deleted file mode 100644
index fdfcae0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif
deleted file mode 100644
index 4dae95d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif
deleted file mode 100644
index fb765fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif
deleted file mode 100644
index 7475315..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif
deleted file mode 100644
index 39afd38..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif
deleted file mode 100644
index fe38ccb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif
deleted file mode 100644
index b129090..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif
deleted file mode 100644
index f0b4eba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif
deleted file mode 100644
index c02528a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif
deleted file mode 100644
index 86986df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif
deleted file mode 100644
index b8ac977..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif
deleted file mode 100644
index f06517b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif
deleted file mode 100644
index 6564d07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg
deleted file mode 100644
index f98b233..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/library_obj.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/library_obj.gif
deleted file mode 100644
index cb55e33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/library_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif
deleted file mode 100644
index ecd75f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif
deleted file mode 100644
index a320fcb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif
deleted file mode 100644
index 5e7fb33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif
deleted file mode 100644
index 095beb0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif
deleted file mode 100644
index 04800a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif
deleted file mode 100644
index 095beb0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif
deleted file mode 100644
index 0af6903..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif
deleted file mode 100644
index 5c828d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif
deleted file mode 100644
index 0af6903..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_down.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_down.gif
deleted file mode 100644
index e85fa90..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_down.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_up.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_up.gif
deleted file mode 100644
index 5eeef33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_up.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin.png b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin.png
deleted file mode 100644
index 8f229e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/skin.png
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.ecore b/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.ecore
deleted file mode 100644
index 7343bdf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.ecore
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="dtinfo"
-    nsURI="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore" nsPrefix="dti">
-  <eClassifiers xsi:type="ecore:EClass" name="DTInfo">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagConvertInfo" lowerBound="1"
-        eType="#//TagConvertInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-convert-info"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagDecorateInfos" upperBound="-1"
-        eType="#//TagDecorateInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-decorate-info"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagConvertInfo">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="operations" upperBound="-1"
-        eType="#//Operation" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="operation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Operation">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        iD="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1"
-        eType="#//Parameter" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="parameter"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="operations" upperBound="-1"
-        eType="#//Operation" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="operation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Parameter">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagDecorateInfo">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        iD="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minHeight" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minWidth" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="multiLevel" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="needBorderDecorator" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="needTableDecorator" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nonVisual" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nonVisualImagePath" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resolveChildText" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resolveAttributeValue"
-        eType="#//ResolveAttributeValue" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="resolve-attribute-value"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="setNonVisualChildElements"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="widget" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ResolveAttributeValue">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="attributeName" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.genmodel b/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.genmodel
deleted file mode 100644
index a85b144..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.genmodel
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2007 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.pagedesigner/src" editDirectory="/org.eclipse.jst.pagedesigner/src"
-    editorDirectory="/org.eclipse.jst.pagedesigner/src" modelPluginID="org.eclipse.jst.pagedesigner"
-    modelName="DTInfo" editPluginClass="org.eclipse.jst.pagedesigner.PDPlugin" editorPluginClass="org.eclipse.jst.pagedesigner.PDPlugin"
-    testsDirectory="/org.eclipse.jst.pagedesigner/src" testSuiteClass="org.eclipse.jst.pagedesigner.PDPlugin"
-    importerID="org.eclipse.emf.importer.ecore">
-  <foreignModel>DTInfo.ecore</foreignModel>
-  <genPackages prefix="DTInfo" basePackage="org.eclipse.jst.pagedesigner.dtmanager"
-      disposableProviderFactory="true" classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util"
-      providerPackageSuffix="internal.provider" presentationPackageSuffix="internal.presentation"
-      testsPackageSuffix="internal.tests" generateExampleClass="false" ecorePackage="DTInfo.ecore#/">
-    <genClasses ecoreClass="DTInfo.ecore#//DTInfo">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//DTInfo/tagConvertInfo"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//DTInfo/tagDecorateInfos"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//TagConvertInfo">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//TagConvertInfo/operations"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="DTInfo.ecore#//Operation">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//Operation/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//Operation/parameters"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//Operation/operations"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//Parameter">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//Parameter/value"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//TagDecorateInfo">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/minHeight"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/minWidth"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/multiLevel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/needBorderDecorator"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/needTableDecorator"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/nonVisual"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/nonVisualImagePath"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/resolveChildText"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//TagDecorateInfo/resolveAttributeValue"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/setNonVisualChildElements"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/widget"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//ResolveAttributeValue">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//ResolveAttributeValue/attributeName"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.ecore b/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.ecore
deleted file mode 100644
index 5b3c237..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.ecore
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="quickedittabsections"
-    nsURI="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore" nsPrefix="qe">
-  <eClassifiers xsi:type="ecore:EClass" name="QuickEditTabSections">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="sections" upperBound="-1"
-        eType="#//SectionInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="section"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SectionInfo">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//SECTION_TYPE"
-        defaultValueLiteral="ATTRIBUTE"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="SECTION_TYPE">
-    <eLiterals name="ATTRIBUTE"/>
-    <eLiterals name="SECTION" value="1"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.genmodel b/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.genmodel
deleted file mode 100644
index 4aed6be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.genmodel
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2007 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.pagedesigner/src" editDirectory="/org.eclipse.jst.pagedesigner/src"
-    editorDirectory="/org.eclipse.jst.pagedesigner/src" modelPluginID="org.eclipse.jst.pagedesigner"
-    modelName="QuickEditTabSections" editPluginClass="org.eclipse.jst.pagedesigner.PDPlugin"
-    editorPluginClass="/org.eclipse.jst.pagedesigner.PDPlugin" importerID="org.eclipse.emf.importer.ecore"
-    complianceLevel="5.0" providerRootExtendsClass="">
-  <foreignModel>QuickEditTabSections.ecore</foreignModel>
-  <genPackages prefix="QuickEditTabSections" basePackage="org.eclipse.jst.pagedesigner.editors.properties"
-      disposableProviderFactory="true" classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util"
-      providerPackageSuffix="internal.provider" presentationPackageSuffix="internal.presentation"
-      testsPackageSuffix="internal.tests" generateExampleClass="false" multipleEditorPages="false"
-      generateModelWizard="false" ecorePackage="QuickEditTabSections.ecore#/">
-    <genEnums typeSafeEnumCompatible="false" ecoreEnum="QuickEditTabSections.ecore#//SECTION_TYPE">
-      <genEnumLiterals ecoreEnumLiteral="QuickEditTabSections.ecore#//SECTION_TYPE/ATTRIBUTE"/>
-      <genEnumLiterals ecoreEnumLiteral="QuickEditTabSections.ecore#//SECTION_TYPE/GROUP"/>
-    </genEnums>
-    <genClasses ecoreClass="QuickEditTabSections.ecore#//QuickEditTabSections">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference QuickEditTabSections.ecore#//QuickEditTabSections/sections"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="QuickEditTabSections.ecore#//Section">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute QuickEditTabSections.ecore#//Section/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute QuickEditTabSections.ecore#//Section/type"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties
deleted file mode 100644
index 46d2298..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Plugin XML information.
-####################################################
-pluginName=JavaServer Faces Tools - Web Page Editor
-providerName=Eclipse.org
-
-editor.binding.context.name=Using Web Page Editor
-editor.binding.context.description=Key binding context when using the web page editor
-# ====================================================================
-
-
-editor.name.0 = Web Page Editor
-category.name.0 = Web Page Editor Layout
-command.name.0 = Vertical Layout
-command.name.1 = Horizontal Layout
-command.name.2 = Graphical Designer
-command.name.3 = Source Code
-
-extension-point.name.0 = Web Page Editor Extension
-extension-point.name.1 = property contributor
-extension-point.name.2 = popupMenu Contributor
-extension-point.name.3 = Content Model Meta Data
-propertyTab.label.QuickEdit = Quick Edit
-propertyTab.label.Attributes = Attributes
-
-ext-pt.WPEPropPage.name = Web Page Editor
-preferencepage.webPageEditor.name=Web Page Editor
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml b/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml
deleted file mode 100644
index dff36d0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml
+++ /dev/null
@@ -1,246 +0,0 @@
-<?eclipse version="3.0"?>
-<plugin>
-	<extension-point id="pageDesignerExtension" name="%extension-point.name.0" schema="schema/pageDesignerExtension.exsd" />
-	<extension-point id="propertyContributor" name="%extension-point.name.1" schema="schema/propertyContributor.exsd" />
-	<extension-point id="popupMenuContributor" name="%extension-point.name.2" schema="schema/popupMenuContributor.exsd"/>
-
-	<extension point="org.eclipse.ui.editors">
-		<editor class="org.eclipse.jst.pagedesigner.editors.HTMLEditor"
-			contributorClass="org.eclipse.jst.pagedesigner.editors.actions.PageDesignerActionBarContributor2"
-			default="false"
-			extensions="jsp,jspx,jsf,html,htm,xhtml"
-			icon="icons/PD_Plugin.gif"
-			id="org.eclipse.jst.pagedesigner.PageDesignerEditor"
-			name="%editor.name.0">
-		</editor>
-	</extension>
-
-	<extension point="org.eclipse.ui.actionSetPartAssociations">
-    	<actionSetPartAssociation targetID="org.eclipse.debug.ui.launchActionSet">
-        	<part id="org.eclipse.jst.pagedesigner.PageDesignerEditor"/>
-    	</actionSetPartAssociation>
-	</extension>
-
-	<extension point="org.eclipse.core.runtime.adapters">
-		<factory
-			class="org.eclipse.jst.pagedesigner.utils.UriAdapterFactory"
-			adaptableType="org.eclipse.core.resources.IProject">
-			<adapter type="org.eclipse.wst.sse.core.internal.util.URIResolver" />
-		</factory>
-	</extension>
-
-	 <extension
-       point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-		<propertyTabs
-			contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor">
-			<propertyTab label="%propertyTab.label.QuickEdit" category="Quick Edit" id="org.eclipse.jst.pagedesigner.tabQuickEdit" />
-			<propertyTab label="%propertyTab.label.Attributes" category="Attributes" id="org.eclipse.jst.pagedesigner.tabAttributes" />
-		</propertyTabs>
- 	</extension>
- 	
-  	<extension
-        point="org.eclipse.ui.views.properties.tabbed.propertySections">
-		<propertySections 
-			contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor">
-			<propertySection
-         		afterSection="top"
-         		class="org.eclipse.jst.pagedesigner.properties.AllPropertySection"
-         		id="section.allproperty"
-        	 	tab="org.eclipse.jst.pagedesigner.tabAttributes">
-  			 </propertySection>
-		</propertySections>
-	</extension>
-
-	<extension point="org.eclipse.jst.pagedesigner.pageDesignerExtension">
-		<linkCreator class="org.eclipse.jst.pagedesigner.actions.link.HtmlLinkCreator" linkIdentifier="Html Link"/>
-  <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildElementOperation"
-        id="AppendChildElementOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildTextFromXPathOperation"
-        id="AppendChildTextFromXPathOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildTextOperation"
-        id="AppendChildTextOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.ConvertAttributeToTextOperation"
-        id="ConvertAttributeToTextOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAllAttributesOperation"
-        id="CopyAllAttributesOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAttributeOperation"
-        id="CopyAttributeOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-          class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAttributeWithRenameOperation"
-          id="CopyAttributeWithRenameOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyChildrenOperation"
-        id="CopyChildrenOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateAttributeFromXPathOperation"
-        id="CreateAttributeFromXPathOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateAttributeOperation"
-        id="CreateAttributeOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateElementOperation"
-        id="CreateElementOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IfNotOperation"
-        id="IfNotOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IfOperation"
-        id="IfOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IterateOverElementsOperation"
-        id="IterateOverElementsOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.MakeParentElementCurrentOperation"
-        id="MakeParentElementCurrentOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.RemoveAttributeOperation"
-        id="RemoveAttributeOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.RenameAttributeOperation"
-        id="RenameAttributeOperation">
-  </tagTransformOperation>
-	</extension>
-	
-	<extension id="org.eclipse.jst.pagedesigner.commands" point="org.eclipse.ui.commands">
-		<category id="org.eclipse.jst.pagedesigner.pagelayout" name="%category.name.0"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout"
-			id="org.eclipse.jst.pagedesigner.vertical"
-			name="%command.name.0"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout" 
-			id="org.eclipse.jst.pagedesigner.horizotal"
-			name="%command.name.1"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout"
-			id="org.eclipse.jst.pagedesigner.design"
-			name="%command.name.2"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout"
-			id="org.eclipse.jst.pagedesigner.source"
-			name="%command.name.3"/>
-	</extension>
-	
-	<extension point="org.eclipse.ui.bindings">
-		<key commandId="org.eclipse.jst.pagedesigner.vertical"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F9"/>
-		<key commandId="org.eclipse.jst.pagedesigner.horizotal"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F10"/>
-		<key commandId="org.eclipse.jst.pagedesigner.design"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F11"/>
-		<key commandId="org.eclipse.jst.pagedesigner.source"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F12"/>
-	</extension>
-	
-	<extension point="org.eclipse.wst.sse.ui.editorConfiguration">
-		<contentOutlineConfiguration
-			class="org.eclipse.jst.pagedesigner.editors.OutlineConfiguration"
-			target="org.eclipse.jst.pagedesigner.editors.DesignerStructuredTextEditorJSP"/>
-	</extension>
-	
-	<extension point="org.eclipse.emf.ecore.generated_package">
-    <package
-          class="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage"
-          genModel="model/DTInfo.genmodel"
-          uri="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore">
-    </package>
-    <package
-          class="org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage"
-          genModel="model/QuickEditTabSections.genmodel"
-          uri="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore">
-    </package>
-   </extension>
-
- <extension
-       point="org.eclipse.ui.contexts">
-    <context
-          description="%editor.binding.context.description"
-          id="org.eclipse.jst.pagedesigner.editorContext"
-          name="%editor.binding.context.name"
-          parentId="org.eclipse.ui.textEditorScope">
-    </context>
- </extension>
- <extension
-       point="org.eclipse.jst.jsf.core.MetaDataEnabledFeatures">
-    <MetaDataEnabledFeature
-          class="org.eclipse.jst.pagedesigner.editors.properties.internal.PropertyDescriptor"
-          typeid="org.eclipse.jst.jsf.core.attributevalues.BaseType">
-    </MetaDataEnabledFeature>
- </extension>
- <extension
-       point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-    <propertyContributor
-          contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor"
-          tabDescriptorProvider="org.eclipse.jst.pagedesigner.properties.internal.WPETabDescriptorProvider">
-       <propertyCategory></propertyCategory>
-    </propertyContributor>
- </extension>
- <extension
-       point="org.eclipse.ui.propertyPages">
-    <page
-          adaptable="true"
-          class="org.eclipse.jst.pagedesigner.ui.dialogs.WPEPropertyPage"
-          id="org.eclipse.jst.pagedesigner.WPEPropertyPage"
-          name="%ext-pt.WPEPropPage.name"
-          objectClass="org.eclipse.core.resources.IProject">
-       <enabledWhen>
-          <and>
-             <adapt type="org.eclipse.core.resources.IProject">
-                <or>
-                   <test
-                      forcePluginActivation="true"
-                      property="org.eclipse.wst.common.project.facet.core.projectFacet"
-                      value="jst.web">
-                   </test>
-                   <test
-                      forcePluginActivation="true"
-                      property="org.eclipse.wst.common.project.facet.core.projectFacet"
-                      value="wst.web">
-                   </test>
-                </or>
-             </adapt>
-          </and>
-       </enabledWhen>
-    </page>
- </extension>
- <extension
-        point="org.eclipse.ui.preferencePages">
-     <page
-           category="org.eclipse.jst.jsf.ui.JSFRootPage"
-           class="org.eclipse.jst.pagedesigner.ui.preferences.PDPreferencePage"
-           id="org.eclipse.jst.jsf.pagedesigner.ui.preferences.PDPreferences"
-           name="%preferencepage.webPageEditor.name"/>
-  </extension>
- <extension
-       point="org.eclipse.core.runtime.preferences">
-    <initializer
-          class="org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences">
-    </initializer>
- </extension>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
deleted file mode 100644
index 4ed77d5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
+++ /dev/null
@@ -1,290 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="pageDesignerExtension" name="Web Page Editor Extension"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="localDropHandler" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="attributeCellEditorFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="tagConverterFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="elementEditFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="linkCreator" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="tagAttributeCellEditorFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="tagTransformOperation" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="dtResourceProvider" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="propertyPageFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="paletteFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="attributeValueResolver" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="localDropHandler">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="attributeCellEditorFactory">
-      <annotation>
-         <documentation>
-            deprecated - use tagAttributeCellEditorFactory
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" deprecated="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagAttributeCellEditorFactory">
-      <annotation>
-         <documentation>
-            provides ability for 3rd parties to supply their own cell and dialog field editors for MD enabled tag library attributes in the WPE tabbed property sheets
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagConverterFactory">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="elementEditFactory">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="linkCreator">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.actions.link.ILinkCreator"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="linkIdentifier" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagTransformOperation">
-      <annotation>
-         <documentation>
-            define a tag transformation operation class
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The transform operation id.    Referencers will use plugin-qualified references.   i.e if the plugin extending this was &lt;code&gt;org.foo.bar&lt;/code&gt;,  then the meta data instance that referenced this operation would specify:
- &lt;pre&gt;
-  &lt;operation id=&quot;org.foo.bar.MyTransformId&quot;/&gt;
- &lt;/pre&gt;
- 
-The exception to this rule is that if the reference is not plugin-qualified, then the reference is assumed to be a &lt;i&gt;core&lt;/i&gt; transformation and uses the &lt;code&gt;org.eclipse.jst.pagedesigner&lt;/code&gt; prefix.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  class extending the &lt;code&gt;org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation&lt;/code&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="dtResourceProvider">
-      <annotation>
-         <documentation>
-            Defines a Design-Time Resource Provider class for a specific ID.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The ID of the Design-Time Resource Provider class. This is used to map usage of each DT Resource Provider class to a specific page neing edited, and so is typically the NS URI of the tag library for which the class provides resources.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Class extending &lt;code&gt;org.eclipse.jst.pagedesigner.dtresourceprovider.AbstractDTResourceProvider&lt;/code&gt;.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.dtresourceprovider.AbstractDTResourceProvider:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyPageFactory">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Provisional API.  If an extension point is found in the system, the Web Page Editor will use the factory implementation to provide its property page.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.editors.AbstractPropertySheetPageFactory:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="paletteFactory">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Provisional API.  If an extension point is found in the system, the Web Page Editor will use the factory implementation to provide its paletteViewerPage
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.editors.palette.AbstractPaletteFactory:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="attributeValueResolver">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.dtmanager.converter.internal.AbstractAttributeValueResolver:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/popupMenuContributor.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/popupMenuContributor.exsd
deleted file mode 100644
index 27956f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/popupMenuContributor.exsd
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="popupMenuContributor" name="popupMenu Contributor"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="menuItemContributor" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="menuItemContributor">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="URI" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertyContributor.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertyContributor.exsd
deleted file mode 100644
index 934161d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertyContributor.exsd
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="propertyContributor" name="property contributor"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is unused and deprecated, and will be removed&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="propertyContributor" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyContributor">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <attribute name="sectionDescriptorProvider" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/tagProperty.xsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/tagProperty.xsd
deleted file mode 100644
index f970c08..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/tagProperty.xsd
+++ /dev/null
@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<schema xmlns="http://www.w3.org/2001/XMLSchema">
-	<element name="taglib">
-		<complexType>
-			<sequence>
-				<element ref="tag" maxOccurs="unbounded"></element>
-				<element ref="definition" minOccurs="0" maxOccurs="1"></element>
-			</sequence>
-			<attribute ref="uri" />
-		</complexType>
-	</element>
-
-	<element name="tag">
-		<complexType>
-			<sequence>
-				<element ref="category" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-				<element ref="referedcategory" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-			<attribute ref="name"></attribute>
-		</complexType>
-	</element>
-
-	<element name="category">
-		<complexType>
-			<sequence>
-				<element ref="attribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-				<element ref="referedattribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-			<attribute ref="name"></attribute>
-			<attribute ref="displaylabel"></attribute>
-		</complexType>
-	</element>
-
-	<element name="referedcategory">
-		<complexType>
-			<sequence>
-				<element ref="includeattrs" minOccurs="0"
-					maxOccurs="1">
-				</element>
-				<element ref="excludeattrs" minOccurs="0"
-					maxOccurs="1">
-				</element>
-			</sequence>
-			<attribute ref="ref"></attribute>
-			<attribute ref="displaylabel"></attribute>
-		</complexType>
-	</element>
-
-	<element name="definition">
-		<complexType>
-			<sequence>
-				<element ref="categories" minOccurs="0" maxOccurs="1"></element>
-				<element ref="attributes" minOccurs="0" maxOccurs="1"></element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="attribute">
-		<complexType>
-			<sequence>
-				<element ref="option" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-			<attribute ref="name"></attribute>
-			<attribute ref="displaylabel"></attribute>
-			<attribute ref="required"></attribute>
-			<attribute ref="type"></attribute>
-			<attribute ref="typeparam"></attribute>
-		</complexType>
-	</element>
-
-	<element name="referedattribute">
-		<complexType>
-			<attribute ref="ref"></attribute>
-			<attribute ref="overridename"></attribute>
-			<attribute ref="displaylabel"></attribute>
-		</complexType>
-	</element>
-
-	<element name="includeattrs">
-		<complexType>
-			<sequence>
-				<element ref="attribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-				<element ref="referedattribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="excludeattrs">
-		<complexType>
-			<attribute ref="refs"></attribute>
-		</complexType>
-	</element>
-
-	<element name="categories">
-		<complexType>
-			<sequence>
-				<element ref="category"></element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="attributes">
-		<complexType>
-			<sequence>
-				<element ref="attribute"></element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="option">
-		<complexType>
-			<attribute ref="key"></attribute>
-			<attribute ref="value"></attribute>
-			<attribute ref="default"></attribute>
-		</complexType>
-	</element>
-
-	<attribute name="name" type="string"></attribute>
-
-	<attribute name="displaylabel" type="string"></attribute>
-
-	<attribute name="ref" type="string"></attribute>
-
-	<attribute name="refs" type="string"></attribute>
-
-	<attribute name="uri" type="string"></attribute>
-
-	<attribute name="type" type="string"></attribute>
-
-	<attribute name="typeparam" type="string"></attribute>
-
-	<attribute name="key" type="string"></attribute>
-
-	<attribute name="value" type="string"></attribute>
-
-	<attribute name="overridename" type="string"></attribute>
-	<attribute name="default" type="string" fixed="default"></attribute>
-	<attribute name="required" type="string" fixed="required"></attribute>
-
-</schema>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IHTMLConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IHTMLConstants.java
deleted file mode 100644
index 9902293..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IHTMLConstants.java
+++ /dev/null
@@ -1,1147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- * @author mengbo
- */
-public class IHTMLConstants {
-	/**
-	 * anchor tag name
-	 */
-	public static final String TAG_A = "a"; //$NON-NLS-1$
-
-	/**
-	 * abbreviated form (e.g.,WWW, HTTP, etc.) tag name
-	 */
-	public static final String TAG_ABBR = "abbr"; //  //$NON-NLS-1$
-
-	/**
-	 * acronym tag name
-	 */
-	public static final String TAG_ACRONYM = "acronym"; //$NON-NLS-1$
-
-	/**
-	 * address tag name
-	 */
-	public static final String TAG_ADDRESS = "address"; //$NON-NLS-1$
-
-	/**
-	 * Java applet tag name
-	 */
-	public static final String TAG_APPLET = "applet"; //$NON-NLS-1$
-
-	/**
-	 * client-side image map tag name
-	 */
-	public static final String TAG_AREA = "area"; //$NON-NLS-1$
-
-	// area
-
-	/**
-	 * bold text style tag name
-	 */
-	public static final String TAG_B = "b"; //$NON-NLS-1$
-
-	/**
-	 * document base URI tag name
-	 */
-	public static final String TAG_BASE = "base"; //$NON-NLS-1$
-
-	/**
-	 * base font size tag name
-	 */
-	public static final String TAG_BASEFONT = "basefont"; //$NON-NLS-1$
-
-	/**
-	 * I18N BiDi over-ride tag name
-	 */
-	public static final String TAG_BDO = "bdo";  //$NON-NLS-1$
-
-	/**
-	 * large text style tag name
-	 */
-	public static final String TAG_BIG = "big"; //$NON-NLS-1$
-
-	/**
-	 * blockquote tag name
-	 */
-	public static final String TAG_BLOCKQUOTE = "blockquote"; //$NON-NLS-1$
-
-	// quotation
-
-	/**
-	 * document body tag name
-	 */
-	public static final String TAG_BODY = "body"; //$NON-NLS-1$
-
-	/**
-	 * forced line break tag name
-	 */
-	public static final String TAG_BR = "br"; //$NON-NLS-1$
-
-	/**
-	 * push button tag name
-	 */
-	public static final String TAG_BUTTON = "button"; //$NON-NLS-1$
-
-	/**
-	 * table caption tag name
-	 */
-	public static final String TAG_CAPTION = "caption"; //$NON-NLS-1$
-
-	/**
-	 * shorthand for DIV align=center tag name
-	 */
-	public static final String TAG_CENTER = "center"; //$NON-NLS-1$
-
-	/**
-	 * citation tag name
-	 */
-	public static final String TAG_CITE = "cite"; //$NON-NLS-1$
-
-	/**
-	 * computer code fragment tag name
-	 */
-	public static final String TAG_CODE = "code"; //$NON-NLS-1$
-
-	/**
-	 * table column tag name
-	 */
-	public static final String TAG_COL = "col"; //$NON-NLS-1$
-
-	/**
-	 * table column group tag name
-	 */
-	public static final String TAG_COLGROUP = "colgroup"; //$NON-NLS-1$
-
-	/**
-	 * definition description tag name
-	 */
-	public static final String TAG_DD = "dd"; //$NON-NLS-1$
-
-	/**
-	 * deleted text tag name
-	 */
-	public static final String TAG_DEL = "del"; //$NON-NLS-1$
-
-	/**
-	 * instance definition tag name
-	 */
-	public static final String TAG_DFN = "dfn";  //$NON-NLS-1$
-
-	/**
-	 * directory list tag name
-	 */
-	public static final String TAG_DIR = "dir"; //$NON-NLS-1$
-
-	/**
-	 * generic language/style container (div) tag name
-	 */
-	public static final String TAG_DIV = "div"; //$NON-NLS-1$
-
-	/**
-	 * definition list tag name
-	 */
-	public static final String TAG_DL = "dl"; //$NON-NLS-1$
-
-	/**
-	 * definition term tag name
-	 */
-	public static final String TAG_DT = "dt"; //$NON-NLS-1$
-
-	/**
-	 * emphasis tag name
-	 */
-	public static final String TAG_EM = "em"; //$NON-NLS-1$
-
-	/**
-	 * fieldset tag name
-	 */
-	public static final String TAG_FIELDSET = "fieldset"; //$NON-NLS-1$
-
-	/**
-	 * local change to font (font) tag name
-	 */
-	public static final String TAG_FONT = "font";  //$NON-NLS-1$
-
-	/**
-	 * form tag name
-	 */
-	public static final String TAG_FORM = "form"; //$NON-NLS-1$
-
-	/**
-	 * frame tag name
-	 */
-	public static final String TAG_FRAME = "frame"; //$NON-NLS-1$
-
-	/**
-	 * frameset tag name
-	 */
-	public static final String TAG_FRAMESET = "frameset";  //$NON-NLS-1$
-	
-	/**
-	 * h1 tag name
-	 */
-	public static final String TAG_H1 = "h1";  //$NON-NLS-1$
-
-	/**
-	 * h2 tag name
-	 */
-	public static final String TAG_H2 = "h2";  //$NON-NLS-1$
-
-	/**
-	 * h3 tag name
-	 */
-	public static final String TAG_H3 = "h3";  //$NON-NLS-1$
-
-	/**
-	 * h4 tag name
-	 */
-	public static final String TAG_H4 = "h4";  //$NON-NLS-1$
-	
-	/**
-	 * h5 tag name
-	 */
-	public static final String TAG_H5 = "h5"; //$NON-NLS-1$
-
-	/**
-	 * h6 tag name
-	 */
-	public static final String TAG_H6 = "h6"; //$NON-NLS-1$
-
-	/**
-	 * head tag name
-	 */
-	public static final String TAG_HEAD = "head"; //$NON-NLS-1$
-
-	/**
-	 * horizontal rule tag name
-	 */
-	public static final String TAG_HR = "hr";  //$NON-NLS-1$
-
-	/**
-	 * document root element (html) tag name
-	 */
-	public static final String TAG_HTML = "html"; //$NON-NLS-1$
-
-	/**
-	 * italic text style tag name
-	 */
-	public static final String TAG_I = "i"; //$NON-NLS-1$
-
-	/**
-	 * inline subwindow (iframe) tag name
-	 */
-	public static final String TAG_IFRAME = "iframe"; //$NON-NLS-1$
-
-	/**
-	 * Embedded image tag name
-	 */
-	public static final String TAG_IMG = "img";  //$NON-NLS-1$
-
-	/**
-	 * input tag name
-	 */
-	public static final String TAG_INPUT = "input"; //$NON-NLS-1$
-
-	/**
-	 * inserted text tag name
-	 */
-	public static final String TAG_INS = "ins"; //$NON-NLS-1$
-
-	/**
-	 * isindex tag name
-	 */
-	public static final String TAG_ISINDEX = "isindex"; //$NON-NLS-1$
-
-	/**
-	 * text to be entered by the user tag name
-	 */
-	public static final String TAG_KBD = "kbd"; //$NON-NLS-1$
-
-	/**
-	 * form field label text tag name
-	 */
-	public static final String TAG_LABEL = "label";  //$NON-NLS-1$
-
-	/**
-	 * fieldset legend tag name
-	 */
-	public static final String TAG_LEGEND = "legend"; //$NON-NLS-1$
-
-	/**
-	 * list item tag name
-	 */
-	public static final String TAG_LI = "li";  //$NON-NLS-1$
-
-	/**
-	 * media-independent link tag name
-	 */
-	public static final String TAG_LINK = "link"; //$NON-NLS-1$
-
-	/**
-	 * client-side image map tag name
-	 */
-	public static final String TAG_MAP = "map";  //$NON-NLS-1$
-
-	/**
-	 * menu list tag name
-	 */
-	public static final String TAG_MENU = "menu"; //$NON-NLS-1$
-
-	/**
-	 * generic metainformation tag name
-	 */
-	public static final String TAG_META = "meta"; //$NON-NLS-1$
-
-	/**
-	 * noembed tag name
-	 */
-	public static final String TAG_NOEMBED = "noembed"; //$NON-NLS-1$
-
-	/**
-	 * container for non-frame-based
-     * rendering (noframes) tag name
-	 */
-	public static final String TAG_NOFRAMES = "noframes"; //$NON-NLS-1$
-
-	// 
-
-	/**
-	 * container for non-script-based
-     * rendering (noscript) tag name
-	 */
-	public static final String TAG_NOSCRIPT = "noscript"; //$NON-NLS-1$
-
-	// 
-
-	/**
-	 * generic embedded (object) tag name
-	 */
-	public static final String TAG_OBJECT = "object"; //$NON-NLS-1$
-
-	/**
-	 * ordered list tag name
-	 */
-	public static final String TAG_OL = "ol"; //$NON-NLS-1$
-
-	/**
-	 * option group tag name
-	 */
-	public static final String TAG_OPTGROUP = "optgroup";  //$NON-NLS-1$
-
-	/**
-	 * selectable choice tag name
-	 */
-	public static final String TAG_OPTION = "option"; //$NON-NLS-1$
-
-	/**
-	 * paragraph tag name
-	 */
-	public static final String TAG_P = "p"; //$NON-NLS-1$
-
-	/**
-	 * named property value tag name
-	 */
-	public static final String TAG_PARAM = "param"; //$NON-NLS-1$
-
-	/**
-	 * preformatted text tag name
-	 */
-	public static final String TAG_PRE = "pre"; //$NON-NLS-1$
-
-	/**
-	 * short inline quotation tag name
-	 */
-	public static final String TAG_Q = "q"; //$NON-NLS-1$
-
-	/**
-	 * strike-through text style tag name
-	 */
-	public static final String TAG_S = "s";  //$NON-NLS-1$
-
-	/**
-	 * sample program output tag name
-	 */
-	public static final String TAG_SAMP = "samp"; //$NON-NLS-1$
-
-	// scripts, etc.
-
-	/**
-	 * script statements tag name
-	 */
-	public static final String TAG_SCRIPT = "script";  //$NON-NLS-1$
-
-	/**
-	 * option selector tag name
-	 */
-	public static final String TAG_SELECT = "select";  //$NON-NLS-1$
-
-	/**
-	 * small text style tag name
-	 */
-	public static final String TAG_SMALL = "small";  //$NON-NLS-1$
-
-	/**
-	 * generic language/style tag name
-	 */
-	public static final String TAG_SPAN = "span"; //$NON-NLS-1$
-
-	// container
-
-	/**
-	 * strike-through text tag name
-	 */
-	public static final String TAG_STRIKE = "strike"; //$NON-NLS-1$
-
-	/**
-	 * strong emphasis tag name
-	 */
-	public static final String TAG_STRONG = "strong"; //$NON-NLS-1$
-
-	/**
-	 *  style info tag name
-	 */
-	public static final String TAG_STYLE = "style"; //$NON-NLS-1$
-
-	/**
-	 * subscript tag name
-	 */
-	public static final String TAG_SUB = "sub"; //$NON-NLS-1$
-
-	/**
-	 * superscript tag name
-	 */
-	public static final String TAG_SUP = "sup"; //$NON-NLS-1$
-
-	/**
-	 * table tag name
-	 */
-	public static final String TAG_TABLE = "table"; //$NON-NLS-1$
-
-	/**
-	 *  table body tag name
-	 */
-	public static final String TAG_TBODY = "tbody"; //$NON-NLS-1$
-
-	/**
-	 * table data cell tag name
-	 */
-	public static final String TAG_TD = "td"; //$NON-NLS-1$
-
-	/**
-	 * multi-line text
-	 */
-	public static final String TAG_TEXTAREA = "textarea"; //$NON-NLS-1$
-
-	// field
-
-	/**
-	 * table footer tag name
-	 */
-	public static final String TAG_TFOOT = "tfoot"; //$NON-NLS-1$
-
-	/**
-	 * table header cell tag name
-	 */
-	public static final String TAG_TH = "th"; //$NON-NLS-1$
-
-	/**
-	 * table header tag name
-	 */
-	public static final String TAG_THEAD = "thead"; //$NON-NLS-1$
-
-	/**
-	 * document title tag name
-	 */
-	public static final String TAG_TITLE = "title"; //$NON-NLS-1$
-
-	/**
-	 * table row tag name
-	 */
-	public static final String TAG_TR = "tr"; //$NON-NLS-1$
-
-	/**
-	 * teletype or monospaced text tag name
-	 */
-	public static final String TAG_TT = "tt";  //$NON-NLS-1$
-
-	// style
-
-	/**
-	 * underlined text style tag name
-	 */
-	public static final String TAG_U = "u";  //$NON-NLS-1$
-
-	/**
-	 * unordered list tag name
-	 */
-	public static final String TAG_UL = "ul"; //$NON-NLS-1$
-
-	/**
-	 * instance of a variable tag name
-	 */
-	public static final String TAG_VAR = "var"; //$NON-NLS-1$
-
-	/**
-	 * Tag identifier for an HTML form tag
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_HTML_FORM =
-	    TagIdentifierFactory.createJSPTagWrapper(CMDocType.HTML_DOC_TYPE, TAG_FORM);
-	
-    // program argument
-
-	/**
-	 * abbr attribute
-	 */
-	public static final String ATTR_ABBR = "abbr"; //$NON-NLS-1$
-
-	/**
-	 * accept-charset attribute
-	 */
-	public static final String ATTR_ACCEPTCHARSET = "accept-charset"; //$NON-NLS-1$
-
-	/**
-	 * accept attribute
-	 */
-	public static final String ATTR_ACCEPT = "accept"; //$NON-NLS-1$
-
-	/**
-	 * access key attribute
-	 */
-	public static final String ATTR_ACCESSKEY = "accesskey"; //$NON-NLS-1$
-
-	/**
-	 * action attribute
-	 */
-	public static final String ATTR_ACTION = "action"; //$NON-NLS-1$
-
-	/**
-	 * align attribute
-	 */
-	public static final String ATTR_ALIGN = "align"; //$NON-NLS-1$
-
-	/**
-	 * alink attribute
-	 */
-	public static final String ATTR_ALINK = "alink"; //$NON-NLS-1$
-
-	/**
-	 * alt attribute
-	 */
-	public static final String ATTR_ALT = "alt"; //$NON-NLS-1$
-
-	/**
-	 * archive attribute
-	 */
-	public static final String ATTR_ARCHIVE = "archive"; //$NON-NLS-1$
-
-	/**
-	 * axis attribute
-	 */
-	public static final String ATTR_AXIS = "axis"; //$NON-NLS-1$
-
-	/**
-	 * background attribute
-	 */
-	public static final String ATTR_BACKGROUND = "background"; //$NON-NLS-1$
-
-	/**
-	 * bgcolor attribute
-	 */
-	public static final String ATTR_BGCOLOR = "bgcolor"; //$NON-NLS-1$
-
-	/**
-	 * border attribute
-	 */
-	public static final String ATTR_BORDER = "border"; //$NON-NLS-1$
-
-	/**
-	 * cellpadding attribute
-	 */
-	public static final String ATTR_CELLPADDING = "cellpadding"; //$NON-NLS-1$
-
-	/**
-	 * cellspacing attribute
-	 */
-	public static final String ATTR_CELLSPACING = "cellspacing"; //$NON-NLS-1$
-
-	/**
-	 * char attribute
-	 */
-	public static final String ATTR_CHAR = "char"; //$NON-NLS-1$
-
-	/**
-	 * charoff attribute
-	 */
-	public static final String ATTR_CHAROFF = "charoff"; //$NON-NLS-1$
-
-	/**
-	 * charset attribute
-	 */
-	public static final String ATTR_CHARSET = "charset"; //$NON-NLS-1$
-
-	/**
-	 * checked attribute
-	 */
-	public static final String ATTR_CHECKED = "checked"; //$NON-NLS-1$
-
-	/**
-	 * cite attribute
-	 */
-	public static final String ATTR_CITE = "cite"; //$NON-NLS-1$
-
-	/**
-	 * class attribute
-	 */
-	public static final String ATTR_CLASS = "class"; //$NON-NLS-1$
-
-	/**
-	 * classid attribute
-	 */
-	public static final String ATTR_CLASSID = "classid"; //$NON-NLS-1$
-
-	/**
-	 * clear attribute
-	 */
-	public static final String ATTR_CLEAR = "clear"; //$NON-NLS-1$
-
-	/**
-	 * code attribute
-	 */
-	public static final String ATTR_CODE = "code"; //$NON-NLS-1$
-
-	/**
-	 * codebase attribute
-	 */
-	public static final String ATTR_CODEBASE = "codebase"; //$NON-NLS-1$
-
-	/**
-	 * code type attribute
-	 */
-	public static final String ATTR_CODETYPE = "codetype"; //$NON-NLS-1$
-
-	/**
-	 * color attribute
-	 */
-	public static final String ATTR_COLOR = "color"; //$NON-NLS-1$
-
-	/**
-	 * cols attribute
-	 */
-	public static final String ATTR_COLS = "cols"; //$NON-NLS-1$
-
-	/**
-	 * colspan attribute
-	 */
-	public static final String ATTR_COLSPAN = "colspan"; //$NON-NLS-1$
-
-	/**
-	 * compact attribute
-	 */
-	public static final String ATTR_COMPACT = "compact"; //$NON-NLS-1$
-
-	/**
-	 * content attribute
-	 */
-	public static final String ATTR_CONTENT = "content"; //$NON-NLS-1$
-
-	/**
-	 * coords attribute
-	 */
-	public static final String ATTR_COORDS = "coords"; //$NON-NLS-1$
-
-	/**
-	 * data attribute
-	 */
-	public static final String ATTR_DATA = "data"; //$NON-NLS-1$
-
-	/**
-	 * datetime attribute
-	 */
-	public static final String ATTR_DATETIME = "datetime"; //$NON-NLS-1$
-
-	/**
-	 * declare attribute
-	 */
-	public static final String ATTR_DECLARE = "declare"; //$NON-NLS-1$
-
-	/**
-	 * defer attribute
-	 */
-	public static final String ATTR_DEFER = "defer"; //$NON-NLS-1$
-
-	/**
-	 * dir attribute
-	 */
-	public static final String ATTR_DIR = "dir"; //$NON-NLS-1$
-
-	/**
-	 * disabled attribute
-	 */
-	public static final String ATTR_DISABLED = "disabled"; //$NON-NLS-1$
-
-	/**
-	 * enctype attribute
-	 */
-	public static final String ATTR_ENCTYPE = "enctype"; //$NON-NLS-1$
-
-	/**
-	 * face attribute
-	 */
-	public static final String ATTR_FACE = "face"; //$NON-NLS-1$
-
-	/**
-	 * for  attribute
-	 */
-	public static final String ATTR_FOR = "for"; //$NON-NLS-1$
-
-	/**
-	 * frame attribute
-	 */
-	public static final String ATTR_FRAME = "frame"; //$NON-NLS-1$
-
-	/**
-	 * frameborder attribute
-	 */
-	public static final String ATTR_FRAMEBORDER = "frameborder"; //$NON-NLS-1$
-
-	/**
-	 * headers attribute
-	 */
-	public static final String ATTR_HEADERS = "headers"; //$NON-NLS-1$
-
-	/**
-	 * height attribute
-	 */
-	public static final String ATTR_HEIGHT = "height"; //$NON-NLS-1$
-
-	/**
-	 * href  attribute
-	 */
-	public static final String ATTR_HREF = "href"; //$NON-NLS-1$
-
-	/**
-	 * hreflang attribute
-	 */
-	public static final String ATTR_HREFLANG = "hreflang"; //$NON-NLS-1$
-
-	/**
-	 * hspace attribute
-	 */
-	public static final String ATTR_HSPACE = "hspace"; //$NON-NLS-1$
-
-	/**
-	 * http-equiv attribute
-	 */
-	public static final String ATTR_HTTPEQUIV = "http-equiv"; //$NON-NLS-1$
-
-	/**
-	 * id attribute
-	 */
-	public static final String ATTR_ID = "id"; //$NON-NLS-1$
-
-	/**
-	 * ismap attribute
-	 */
-	public static final String ATTR_ISMAP = "ismap"; //$NON-NLS-1$
-
-	/**
-	 * label attribute
-	 */
-	public static final String ATTR_LABEL = "label"; //$NON-NLS-1$
-
-	/**
-	 * lang attribute
-	 */
-	public static final String ATTR_LANG = "lang"; //$NON-NLS-1$
-
-	/**
-	 * language attribute
-	 */
-	public static final String ATTR_LANGUAGE = "language"; //$NON-NLS-1$
-
-	/**
-	 * link attribute
-	 */
-	public static final String ATTR_LINK = "link"; //$NON-NLS-1$
-
-	/**
-	 * longdesc attribute
-	 */
-	public static final String ATTR_LONGDESC = "longdesc"; //$NON-NLS-1$
-
-	/**
-	 *  marginheight attribute
-	 */
-	public static final String ATTR_MARGINHEIGHT = "marginheight"; //$NON-NLS-1$
-
-	/**
-	 * margin width attribute
-	 */
-	public static final String ATTR_MARGINWIDTH = "marginwidth"; //$NON-NLS-1$
-
-	/**
-	 * maxlength attribute
-	 */
-	public static final String ATTR_MAXLENGTH = "maxlength"; //$NON-NLS-1$
-
-	/**
-	 * media attribute
-	 */
-	public static final String ATTR_MEDIA = "media"; //$NON-NLS-1$
-
-	/**
-	 * method attribute
-	 */
-	public static final String ATTR_METHOD = "method"; //$NON-NLS-1$
-
-	/**
-	 * multiple attribute
-	 */
-	public static final String ATTR_MULTIPLE = "multiple"; //$NON-NLS-1$
-
-	/**
-	 * name attribute
-	 */
-	public static final String ATTR_NAME = "name"; //$NON-NLS-1$
-
-	/**
-	 * nohref attribute
-	 */
-	public static final String ATTR_NOHREF = "nohref"; //$NON-NLS-1$
-
-	/**
-	 * noresize attribute
-	 */
-	public static final String ATTR_NORESIZE = "noresize"; //$NON-NLS-1$
-
-	/**
-	 * noshade attribute
-	 */
-	public static final String ATTR_NOSHADE = "noshade"; //$NON-NLS-1$
-
-	/**
-	 * nowrap attribute
-	 */
-	public static final String ATTR_NOWRAP = "nowrap"; //$NON-NLS-1$
-
-	/**
-	 * object attribute
-	 */
-	public static final String ATTR_OBJECT = "object"; //$NON-NLS-1$
-
-	/**
-	 * onblur attribute
-	 */
-	public static final String ATTR_ONBLUR = "onblur"; //$NON-NLS-1$
-
-	/**
-	 * onchange attribute
-	 */
-	public static final String ATTR_ONCHANGE = "onchange"; //$NON-NLS-1$
-
-	/**
-	 * onclick attribute
-	 */
-	public static final String ATTR_ONCLICK = "onclick"; //$NON-NLS-1$
-
-	/**
-	 * ondblclick attribute
-	 */
-	public static final String ATTR_ONDBLCLICK = "ondblclick"; //$NON-NLS-1$
-
-	/**
-	 * onfocus attribute
-	 */
-	public static final String ATTR_ONFOCUS = "onfocus"; //$NON-NLS-1$
-
-	/**
-	 * onkeydown attribute
-	 */
-	public static final String ATTR_ONKEYDOWN = "onkeydown"; //$NON-NLS-1$
-
-	/**
-	 * onkeypress attribute
-	 */
-	public static final String ATTR_ONKEYPRESS = "onkeypress"; //$NON-NLS-1$
-
-	/**
-	 * onkeyup attribute
-	 */
-	public static final String ATTR_ONKEYUP = "onkeyup"; //$NON-NLS-1$
-
-	/**
-	 * onload attribute
-	 */
-	public static final String ATTR_ONLOAD = "onload"; //$NON-NLS-1$
-
-	/**
-	 * onmousedown attribute
-	 */
-	public static final String ATTR_ONMOUSEDOWN = "onmousedown"; //$NON-NLS-1$
-
-	/**
-	 * onmousemove attribute
-	 */
-	public static final String ATTR_ONMOUSEMOVE = "onmousemove"; //$NON-NLS-1$
-
-	/**
-	 * onmouseout attribute
-	 */
-	public static final String ATTR_ONMOUSEOUT = "onmouseout"; //$NON-NLS-1$
-
-	/**
-	 * onmouseover attribute
-	 */
-	public static final String ATTR_ONMOUSEOVER = "onmouseover"; //$NON-NLS-1$
-
-	/**
-	 * onmouseup attribute
-	 */
-	public static final String ATTR_ONMOUSEUP = "onmouseup"; //$NON-NLS-1$
-
-	/**
-	 * onreset attribute
-	 */
-	public static final String ATTR_ONRESET = "onreset"; //$NON-NLS-1$
-
-	/**
-	 * onselect attribute
-	 */
-	public static final String ATTR_ONSELECT = "onselect"; //$NON-NLS-1$
-
-	/**
-	 * onsubmit attribute
-	 */
-	public static final String ATTR_ONSUBMIT = "onsubmit"; //$NON-NLS-1$
-
-	/**
-	 * onunload attribute
-	 */
-	public static final String ATTR_ONUNLOAD = "onunload"; //$NON-NLS-1$
-
-	/**
-	 * profile attribute
-	 */
-	public static final String ATTR_PROFILE = "profile"; //$NON-NLS-1$
-
-	/**
-	 * prompt attribute
-	 */
-	public static final String ATTR_PROMPT = "prompt"; //$NON-NLS-1$
-
-	/**
-	 * readonly attribute
-	 */
-	public static final String ATTR_READONLY = "readonly"; //$NON-NLS-1$
-
-	/**
-	 * rel attribute
-	 */
-	public static final String ATTR_REL = "rel"; //$NON-NLS-1$
-
-	/**
-	 * rev attribute
-	 */
-	public static final String ATTR_REV = "rev"; //$NON-NLS-1$
-
-	/**
-	 * rows attribute
-	 */
-	public static final String ATTR_ROWS = "rows"; //$NON-NLS-1$
-
-	/**
-	 * rowspan attribute
-	 */
-	public static final String ATTR_ROWSPAN = "rowspan"; //$NON-NLS-1$
-
-	/**
-	 * rules attribute 
-	 */
-	public static final String ATTR_RULES = "rules"; //$NON-NLS-1$
-
-	/**
-	 * scheme attribute
-	 */
-	public static final String ATTR_SCHEME = "scheme"; //$NON-NLS-1$
-
-	/**
-	 * scope attribute
-	 */
-	public static final String ATTR_SCOPE = "scope"; //$NON-NLS-1$
-
-	/**
-	 * scrolling attribute
-	 */
-	public static final String ATTR_SCROLLING = "scrolling"; //$NON-NLS-1$
-
-	/**
-	 * selected attribute
-	 */
-	public static final String ATTR_SELECTED = "selected"; //$NON-NLS-1$
-
-	/**
-	 * shape attribute
-	 */
-	public static final String ATTR_SHAPE = "shape"; //$NON-NLS-1$
-
-	/**
-	 * size attribute
-	 */
-	public static final String ATTR_SIZE = "size"; //$NON-NLS-1$
-
-	/**
-	 * span attribute
-	 */
-	public static final String ATTR_SPAN = "span"; //$NON-NLS-1$
-
-	/**
-	 * src attribute
-	 */
-	public static final String ATTR_SRC = "src"; //$NON-NLS-1$
-
-	/**
-	 * standby attribute
-	 */
-	public static final String ATTR_STANDBY = "standby"; //$NON-NLS-1$
-
-	/**
-	 * start attribute
-	 */
-	public static final String ATTR_START = "start"; //$NON-NLS-1$
-
-	/**
-	 * style attribute
-	 */
-	public static final String ATTR_STYLE = "style"; //$NON-NLS-1$
-
-	/**
-	 * summary attribute
-	 */
-	public static final String ATTR_SUMMARY = "summary"; //$NON-NLS-1$
-
-	/**
-	 * tabindex attribute
-	 */
-	public static final String ATTR_TABINDEX = "tabindex"; //$NON-NLS-1$
-
-	/**
-	 * target attribute
-	 */
-	public static final String ATTR_TARGET = "target"; //$NON-NLS-1$
-
-	/**
-	 * text attribute
-	 */
-	public static final String ATTR_TEXT = "text"; //$NON-NLS-1$
-
-	/**
-	 * title attribute
-	 */
-	public static final String ATTR_TITLE = "title"; //$NON-NLS-1$
-
-	/**
-	 * type attribute
-	 */
-	public static final String ATTR_TYPE = "type"; //$NON-NLS-1$
-
-	/**
-	 * usemap attribute
-	 */
-	public static final String ATTR_USEMAP = "usemap"; //$NON-NLS-1$
-
-	/**
-	 * valign attribute
-	 */
-	public static final String ATTR_VALIGN = "valign"; //$NON-NLS-1$
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_VALUE = "value"; //$NON-NLS-1$
-
-	/**
-	 * valuetype attribute
-	 */
-	public static final String ATTR_VALUETYPE = "valuetype"; //$NON-NLS-1$
-
-	/**
-	 * version attribute
-	 */
-	public static final String ATTR_VERSION = "version"; //$NON-NLS-1$
-
-	/**
-	 * vlink attribute
-	 */
-	public static final String ATTR_VLINK = "vlink"; //$NON-NLS-1$
-
-	/**
-	 * vspace attribute
-	 */
-	public static final String ATTR_VSPACE = "vspace"; //$NON-NLS-1$
-
-	/**
-	 * width attribute
-	 */
-	public static final String ATTR_WIDTH = "width"; //$NON-NLS-1$
-
-	/**
-	 * submit type
-	 */
-	public static final String TYPE_SUBMIT = "submit"; //$NON-NLS-1$
-
-	/**
-	 * checkbox type
-	 */
-	public static final String TYPE_CHECKBOX = "checkbox"; //$NON-NLS-1$
-
-	/**
-	 * radio type
-	 */
-	public static final String TYPE_RADIO = "radio"; //$NON-NLS-1$
-
-	/**
-	 * image type
-	 */
-	public static final String TYPE_IMAGE = "image"; //$NON-NLS-1$
-
-	/**
-	 * password type
-	 */
-	public static final String TYPE_PASSWORD = "password"; //$NON-NLS-1$
-
-	/**
-	 * text type
-	 */
-	public static final String TYPE_TEXT = "text"; //$NON-NLS-1$
-
-	/**
-	 * hidden type
-	 */
-	public static final String TYPE_HIDDEN = "hidden"; //$NON-NLS-1$
-
-	/**
-	 * submit query label
-	 */
-	public static final String SUBMIT_LABEL = "Submit Query"; //$NON-NLS-1$
-
-	/**
-	 * reset label
-	 */
-	public static final String RESET_LABEL = "Reset"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java
deleted file mode 100644
index 7dbd5b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner;
-
-/**
- * JMT constants that would be used through the JMT core plugin.
- * 
- * @author mengbo
- */
-public interface IJMTConstants {
-	/**
-	 * bundle file name
-	 */
-	public static final String PAGEDESIGNER_RESOURCE_BUNDLE_FILE = "org.eclipse.jst.pagedesigner.editors.pagedesigner.JSPEditorMessages"; //$NON-NLS-1$
-
-	// Properties contains general properties and defaults to preferences.
-	/**
-	 * root resource bundle name
-	 */
-	public static final String ROOT_RESOURCEBUNDLE = "org.eclipse.jst.pagedesigner.JMTResources"; //$NON-NLS-1$
-
-	/**
-	 * default property file name
-	 */
-	public static final String DEFAULT_PROPERTIES = "default.properties"; //$NON-NLS-1$
-
-	/**
-	 * default style sheet
-	 */
-	public static final String USERAGENT = "html4.css"; //$NON-NLS-1$
-
-	/**
-	 * html editor id
-	 */
-	public static final String EDITORID_HTML = "org.eclipse.jst.pagedesigner.PageDesignerEditor"; //$NON-NLS-1$
-
-	/**
-	 * show all action preference id
-	 */
-	public static final String PREF_PALETTE_SHOW_ALL = "pref.palette.showall"; //$NON-NLS-1$
-
-	/**
-	 * local name of page designer extension
-	 */
-	public static final String EXTENSION_POINT_PAGEDESIGNER = "pageDesignerExtension"; //$NON-NLS-1$
-
-	/**
-	 * local name of cm registry extension
-	 */
-	public static final String EXTENSION_POINT_CMREGISTRY = "cmRegistry"; //$NON-NLS-1$
-
-	/**
-	 * local name of DT resource provider extension
-	 */
-	public static final String DT_RESOURCE_PROVIDER = "dtResourceProvider"; //$NON-NLS-1$
-
-	/**
-	 * local name of local drop handler extension
-	 */
-	public static final String LOCAL_DROP_HANDLER = "localDropHandler"; //$NON-NLS-1$
-
-	/**
-	 * local name of tag converter factory extension
-	 */
-	public static final String TAG_CONVERTER_FACTORY = "tagConverterFactory"; //$NON-NLS-1$
-
-	/**
-	 * local name of attribute cell editor factory extension
-	 * @deprecated and unused
-	 */
-	public static final String ATTRIBUTE_CELLEDITOR_FACTORY = "attributeCellEditorFactory"; //$NON-NLS-1$
-
-	/**
-	 * local name of tag attribute cell editor factory extension
-	 */
-	public static final String TAG_ATTRIBUTE_CELLEDITOR_FACTORY = "tagAttributeCellEditorFactory"; //$NON-NLS-1$
-	
-	/**
-	 * local name of tag transform operation extension
-	 */
-	public static final String TAG_TRANSFORM_OPERATION = "tagTransformOperation"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 * local name of element edit factory extension
-	 */
-	public static final String ELEMENT_EDIT_FACTORY = "elementEditFactory"; //$NON-NLS-1$
-
-	/**
-	 * local name of link creator extension
-	 */
-	public static final String LINK_CREATOR = "linkCreator"; //$NON-NLS-1$
-    
-	/**
-	 * extension for property page factory
-	 */
-	public static final String PROPERTY_PAGE_FACTORY = "propertyPageFactory"; //$NON-NLS-1$
-	/**
-	 * extension for palette viewer page factory
-	 */
-	public static final String PALETTE_FACTORY = "paletteFactory"; //$NON-NLS-1$
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties
deleted file mode 100644
index 90f1c4d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties
+++ /dev/null
@@ -1,258 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Resource message for Logging
-####################################################
-Log.Error.PageDesignerResources.Open=Error occurred getting the source bundle.
-Log.Error.MessageFormater.Format0=Error in message format.
-Log.Error.ExtensionReader.ReadLinkExtension=can't create linkCreator instance
-Log.Error.PreviewResources.ResouceNotFound=resource {0} not found
-
-Error.StringBufferWriter.Write.0=Error in string buffer writing.
-Error.RangeModeCommand.SetSelection=Selection error
-Error.SourceViewerCommand.Execution=Error in command execution
-Error.PDPlugin.Installation.0=Error starting plug-in.
-Error.PDPlugin.Installation.1=Problems starting plug-in Web Application Development.
-Error.PDPlugin.Installation.6=Problems starting plug-in Web Application Development.
-Error.DesignerPropertyTool.NatureQuerying=Error in project Java nature querying.
-Error.PDPlugin.Installation.10=log.PDPlugin.image.error
-Error.PDPlugin.Installation.13=log.PDPlugin.image.error
-Error.PDPlugin.Installation.15=error in installtion query.
-Error.ProjectResolver.GetlocationByURI.0=Error in taglib locating.
-Error.ProjectFileDialogContentProvider.0=Core error, you may need to restart the application.
-Error.EditValidateUtil.Position = Error in position validation.
-Error.EditValidateUtil.Text = Error occurred in text validation.
-Error.EditValidateUtil.Node = Error occurred in node validation.
-Error.EditValidateUtil.Range = Error occurred in range validation.
-Error.EditValidateUtil.StringIndex = Invalid string.
-Error.EditValidateUtil.IndexOffset = Invalid index or offset of string.
-CSSColorConverter.0=Error in color expression:
-CSSColorConverter.1=Error in color expression:
-Error.CSSFigure.0=Error in flowContext setting.
-Error.CSSUtil.0=Could not cast to CSS style
-Error.CSSUtil.1=Could not cast to CSS style
-Error.CSSUtil.2=Could not cast to CSS style
-Error.CSSUtil.3=Could not cast to CSS style
-Error.HTMLEditor.0=
-Error.HTMLEditor.1=Error occurred getting storage contents
-Error.HTMLEditor.2=Error occurred closing content.
-Error.HTMLEditor.3=The core has exception
-Error.HTMLEditor.4=Error occurred closing stream.
-Error.HTMLEditor.5=Error occurred initializing the editor.
-Error.HTMLEditor.6=Error occurred changing the page.
-Error.FontSizeMeta.0=Error occurred in tag font attribute calculating.
-Error.EditModelQuery.0=Error in position creation:
-Error.EditModelQuery.1=Error occurred getting node at indexed position
-Error.CommonResourceDialog.0.1=Error in project memeber querying
-Error.CommonResourceDialog.0.2=Please refer to error log for details
-Error.ImgFileFilter.1=CoreException is thrown, please refer to error log for details
-Error.ImgFileFilter.3=CoreException is thrown, please refer to error log for details
-Error.ImgFileFilter.0=Error in filtering the tree
-Error.ImgFileFilter.2=Error in getting project Nature
-Info.FontWeightMeta.0=Error occurred in integer processing.
-Warn.PolicyHelper.0=cannot get status line manager
-Warn.PolicyHelper.1=viewer is not HTML viewer
-HTMLSpecialCharHelper.3=Exception thrown
-HTMLSpecialCharHelper.2=Truncated & without ;
-HTMLSpecialCharHelper.1=Not an entity and not a &\#XXXX;
-HTMLSpecialCharHelper.0=Error in number expression
-
-####################################################
-# Resource message for RenderingTraverser
-####################################################
-RenderingTraverser.Error.FileNotFound		=	File Not Found
-RenderingTraverser.Error.UnsupportedEncoding	=	Unsupport Encoding
-RenderingTraverser.Error.IO		=	IO exception
-
-PaletteItemManager.error=error in constructor
-PaletteItemManager.initForPluginExtension.error.IOException=IOExcetpion in initForPluginExtension error
-PaletteItemManager.initForPluginExtension.error.MalformedURLException=MalformedURLException in initForPluginExtension
-PaletteItemManager.initForPluginExtension.error.InstantiationException=InstantiationException in initForPluginExtension
-PaletteItemManager.save.error.IOException=IOException when save
-ParagraphSupport.CommandLabel.Preformated=Preformated
-PaletteItemManager.loadPaletteItemState.error.IOException=IOException in loadPaletteItemState
-PaletteItemManager.loadPaletteItemState.error.SAXException=SAXException in loadPaletteItemState
-PaletteItemManager.loadPaletteItemState.error.getDocumentBuilderFail=getDocumentBuilder Failed
-
-PreviewUtil.previewFile.CoreException= CoreException previewing file
-PreviewUtil.previewFile.IOException= IOException previewing file
-
-#context menu
-ActionGroup.Submenu.TextStyle=Text Style
-ActionGroup.Submenu.Align=Align
-ActionGroup.Submenu.ParagraphFormat=Paragraph Format
-ActionGroup.Submenu.StyleClasses=Style Classes
-ActionGroup.Submenu.BorderStyle=Border Style
-ActionGroup.Submenu.Color=Color
-ActionGroup.Submenu.BackgroundColor=Background Color
-ActionGroup.Submenu.Link=Make Link...
-ActionGroup.Submenu.SelectRelative=Select Relative
-
-TableActionGroup.Submenu.SelectTable=Select Table
-TableActionGroup.Submenu.InsertRowBefore=Insert Row Before
-TableActionGroup.Submenu.InsertRowAfter=Insert Row After
-TableActionGroup.Submenu.InsertColumnBefore=Insert Column Before
-TableActionGroup.Submenu.InsertColumnAfter=Insert Column After
-TableActionGroup.Submenu.DeleteRow=Delete Row
-TableActionGroup.Submenu.DeleteColumn=Delete Column
-ElementEdit.Submenu.Table=Table
-ElementEdit.Submenu.SelectTable=Select Table
-ElementEdit.Submenu.InsertRowBefore=Insert Row Before
-ElementEdit.Submenu.InsertRowAfter=Insert Row After
-ElementEdit.Submenu.InsertColumnBefore=Insert Column Before
-ElementEdit.Submenu.InsertColumnAfter=Insert Column After
-ElementEdit.Submenu.DeleteRow=Delete Row
-ElementEdit.Submenu.DeleteColumn=Delete Column
-ElementEdit.Submenu.InsertHeader=Insert Header
-ElementEdit.Submenu.InsertFooter=Insert Footer
-ElementEdit.Submenu.DeleteHeader=Delete Header
-ElementEdit.Submenu.DeleteFooter=Delete Footer
-ElementEdit.Submenu.Taglib=Open Definition File
-TableInsertHeaderFooterCommand.ColumnHeader=Column Header
-TableInsertHeaderFooterCommand.ColumnFooter=Column Footer
-
-HeadElementEdit.Submenu.InsertStylesheetLink=Stylesheet Link
-
-Action.Name.Copy=Copy
-Action.Name.Cut=Cut
-Action.Name.Paste=Paste
-
-Message.Warning.Title=Warning
-Taglib.OpenFile.ERROR=The file that the URI refers to does not exist.
-
-MakeLinkAction.Wizard.PageTitle=Please select link type
-CreateLinkWizard.Title=Select Link Type
-LinkWizardPage.GroupTitle=Link Types
-LinkWizardPage.PreviewLabel=Preview
-
-ItemCreationEditPolicy.CommandLabel.CreateItem=Create Item
-MakeLinkCommand.Label.MakeLink=Make Link
-AttributePropertySource.CommandLabel.ChangeAttribute=Change Attribute
-ChangeAttributeAction.CommandLabel.ChangeStyleClass=Change Style Class
-BorderStyleSupport.CommandLabel.Hidden=Hidden
-BorderStyleSupport.CommandLabel.Dotted=Dotted
-BorderStyleSupport.CommandLabel.Dashed=Dashed
-BorderStyleSupport.CommandLabel.Solid=Solid
-BorderStyleSupport.CommandLabel.Double=Double
-BorderStyleSupport.CommandLabel.Groove=Groove
-BorderStyleSupport.CommandLabel.Ridge=Ridge
-BorderStyleSupport.CommandLabel.Inset=Inset
-BorderStyleSupport.CommandLabel.Outset=Outset
-ColorSupport.CommandLabel.Aqua=Aqua
-ColorSupport.CommandLabel.Black=Black
-ColorSupport.CommandLabel.Blue=Blue
-ColorSupport.CommandLabel.Fuchsia=Fuchsia
-ColorSupport.CommandLabel.Gray=Gray
-ColorSupport.CommandLabel.Green=Green
-ColorSupport.CommandLabel.Lime=Lime
-ColorSupport.CommandLabel.Maroon=Maroon
-ColorSupport.CommandLabel.Navy=Navy
-ColorSupport.CommandLabel.Olive=Olive
-ColorSupport.CommandLabel.Orange=Orange
-ColorSupport.CommandLabel.Purple=Purple
-ColorSupport.CommandLabel.Red=Red
-ColorSupport.CommandLabel.Silver=Silver
-ColorSupport.CommandLabel.Teal=Teal
-ColorSupport.CommandLabel.White=White
-ColorSupport.CommandLabel.Yellow=Yellow
-ColorSupport.CommandLabel.Default=Default
-ParagraphSupport.CommandLabel.None=None
-ParagraphSupport.CommandLabel.Paragraph=Paragraph
-ParagraphSupport.CommandLabel.Heading1=Heading 1
-ParagraphSupport.CommandLabel.Heading2=Heading 2
-ParagraphSupport.CommandLabel.Heading3=Heading 3
-ParagraphSupport.CommandLabel.Heading4=Heading 4
-ParagraphSupport.CommandLabel.Heading5=Heading 5
-ParagraphSupport.CommandLabel.Heading6=Heading 6
-ParagraphSupport.CommandLabel.P=P
-ParagraphSupport.CommandLabel.H1=H1
-ParagraphSupport.CommandLabel.H2=H2
-ParagraphSupport.CommandLabel.H3=H3
-ParagraphSupport.CommandLabel.H4=H4
-ParagraphSupport.CommandLabel.H5=H5
-ParagraphSupport.CommandLabel.H6=H6
-ParagraphSupport.CommandLabel.PRE=PRE
-HTagsInsertGroupAction.ActionLabel.Hx=Hx
-RangeStyleSupport.ActionLabel.Bold=Bold
-RangeStyleSupport.ActionLabel.Italic=Italic
-RangeStyleSupport.ActionLabel.Underline=Underline
-ShowAllAction.ActionLabel.ShowAll=Show All
-AlignSupport.ActionLabel.Left=Left
-AlignSupport.ActionLabel.Center=Center
-AlignSupport.ActionLabel.Right=Right
-AlignSupport.ActionLabel.Justify=Justify
-
-Info.ElementDescReader.ReadPropertyFile=The property file:{0} is not found
-Info.ElementDescReader.ReadPropertyFile.Key=The key:{0} is not found in file:{1}
-ChangeStyleAction.Text=Edit Style...
-
-Log.Error.HTMLStringTagConverter.Error=Error
-ConverterUtil.Description= Drag and drop Web page content here
-
-SimpleGraphicalEditor.help.id=org.eclipse.jst.pagedesigner.graphicalEditor
-DesignerTabbedPropertySheetPage.help.id=org.eclipse.jst.pagedesigner.QuickEditor
-MyPropertySheetPage.help.id=org.eclipse.jst.pagedesigner.Attributes
-StyleDialog.help.id=org.eclipse.jst.pagedesigner.styleDialog
-DesignerPaletteViewerProvider.help.id=org.eclipse.jst.pagedesigner.palette_help
-
-StyleClassSupport.Default=Default
-XMLUtil.Error.0=Error in create documentBuilder:
-XMLUtil.Error.2=Error in object persistance:
-PreviewUtil.Error.0=Error occurred processing the resource bundle:
-PreviewUtil.Error.3=Error occurred opening the file:
-PreviewHandlerNew.Error.0=Error in model release:
-PreviewConvertContext.Error.0=Error:
-CellEditorFactoryRegistry.Info.2=Error in fields retrieving:
-CellEditorFactoryRegistry.Info.3=Error in fields retrieving:
-PageExpressionContext.Info.0=Error:
-TextLayoutSupport.Info.1=Error in text painting:
-
-CMRegistry.ReadConfigration=Reading Properties Configurations
-CMRegistry.HTMLConfigration=Reading HTML Configuration ...
-CMRegistry.JSPConfigration=Reading JSP Configuration ...
-CMRegistry.OtherConfigration=Reading Other Configuration ...
-
-HTMLEditor.Design=Design
-HTMLEditor.Source=Source
-
-LocalSelectionDropTargetListener.MessageDialog.Title=Info
-LocalSelectionDropTargetListener.MessageDialog.Message=The page is deleted, save it first.
-
-LoadBundleTagConverter.convertRefresh.MalformedURLException= MalformedURLException in LoadBundleTagConverter
-LoadBundleTagConverter.convertRefresh.IOException= IOException in LoadBundleTagConverter
-
-Warning.TransformOperationFactory.ExtensionNotFound=ITransformOperation id not found in pageDesigner extension registry ("{0}")
-Warning.TransformOperationFactory.CannotLoadOpClass=Unable to load tag transform operation Class for id ("{0}")
-Warning.TransformOperationFactory.ClassNotFound=ITransformOperation class specified by name in metadata not found ("{0}")
-Warning.TransformOperationFactory.IllegalAccess=ITransformOperation class specified by name in metadata could not be legally accessed ("{0}")
-Warning.TransformOperationFactory.Instantiation=ITransformOperation class specified by name in metadata could not be instantiated ("{0}")
-Warning.TransformOperationFactory.NotAbstractTransformOperation=ITransformOperation class specified by name in metadata does not extend AbstractTransformOperation ("{0}")
-Warning.TransformOperationFactory.UnknownOperationID=Unknown operation ID specified in metadata ("{0}")
-Warning.TransformOperationFactory.TooFewParameters=Too few parameters specified in metadata for operation ("{0}")
-Warning.TransformOperationFactory.RegistryError=Unable to read "{0}" extension registry
-
-Warning.DTResourceProviderFactory.RegistryError=Unable to read "{0}" extension registry
-Warning.DTResourceProviderFactory.ClassNotFound=DT resource provider class "{0}" specified for id "{1}" could not be found
-
-Warning.ProviderClassMap.IllegalAccess=DT resource provider class "{0}" specified for id "{1}" could not be legally accessed
-Warning.ProviderClassMap.Instantiation=DT resource provider class "{0}" specified for id "{1}" could not be instantiated
-Warning.ProviderClassMap.NotIDTResourceProvider=DT resource provider class "{0}" is not correct type (must be IDTResourceProvider)
-
-Warning.DefaultDTSkin.FailureLoadingStyleSheet=DefaultDTSkin "{0}" failed to load a StyleSheet for the URL "{1}"
-
-#Errors relating to ITagCreator et al.
-Error.TagCreatorMustBeOfType=ITagCreator instances must be of type {0}.
-Error.ProblemLoadingExtensionPoint=Problem loading ITagCreatorFactory extension Point
-Error.ProblemLoadingTagCreatorFactory=Problem loading tag creator factory: {0}
-Error.ProblemLoadingExecutingTagCreator=Problem executing tag creator: {0}
-
-#Property Sheet
-QuickEditTab.no_quick_edit_md=No quick edit properties are available for the current selection
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java
deleted file mode 100644
index 9056855..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java
+++ /dev/null
@@ -1,456 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.Properties;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class PDPlugin extends AbstractUIPlugin {
-	private static final String ICONS_LIB_PATH = "icons"; //$NON-NLS-1$
-
-	//private static final boolean ROOT_PLUGIN = false;
-
-	// The shared instance.
-	private static PDPlugin _plugin;
-
-	private static Logger _log;
-
-	private static Alerts _alerts;
-
-	private ResourceBundle _resourceBundle;
-
-	private Properties _properties;
-
-	private URL _pluginBase;
-
-	/**
-	 * The constructor.
-	 */
-	public PDPlugin() {
-		super();
-		_plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		try {
-			// get resource bundle.
-			_resourceBundle = ResourceBundle
-					.getBundle(IJMTConstants.ROOT_RESOURCEBUNDLE);
-			_alerts = new Alerts(this, _resourceBundle);
-
-			// get properties.
-			_properties = new Properties();
-			InputStream input = null;
-			_pluginBase = getBundle().getEntry("/"); //$NON-NLS-1$
-			try {
-				input = (new URL(_pluginBase, IJMTConstants.DEFAULT_PROPERTIES))
-						.openStream();
-				_properties.load(input);
-			} finally {
-				try {
-					input.close();
-				} catch (IOException ee)// NOPMD
-				{
-					// nothing to do when IOException throwed in closing files.
-				}
-			}
-
-			// set up logging for this plugin and everthing under it.
-			_log = new Logger(this.getBundle(), _resourceBundle);
-
-			// NOTE: add in any other plugin code statup HERE!!!!
-
-			// log.CommonPlugin=Web Application Development Common Plugin
-			// initialized on eclipse version {0}.
-
-			// log.info("log.CommonPlugin", version);
-
-		} catch (Exception ee) {
-			// only log if the logger was configured correctly.
-			if (_log != null) {
-				_log
-						.error(
-								"log.msg", //$NON-NLS-1$
-								"Problems starting plug-in Web Application Development Common.", //$NON-NLS-1$
-								ee);
-			}
-
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							getBundle().getSymbolicName(),
-							IStatus.OK,
-							"Problems starting plug-in Web Application Development Common", //$NON-NLS-1$
-							ee));
-		}
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the default plugin
-	 */
-	public static PDPlugin getDefault() {
-		return _plugin;
-	}
-
-	/**
-	 * get the alerts objects associated with this plugin for alerting the user.
-	 * 
-	 * @return the Alerts object
-	 */
-	public static Alerts getAlerts() {
-		return _alerts;
-	}
-
-	/**
-	 * Returns a logger for the new class using this plugin for reference.
-	 * @param theClass
-	 * @return the Logger object associated with theClass
-	 */
-	public static Logger getLogger(Class theClass) {
-		if (getDefault() != null && getDefault().getRootLogger() != null) {
-			return getDefault().getRootLogger();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the plugin's root logger
-	 * @return the root logger
-	 */
-	public Logger getRootLogger() {
-		return _log;
-	}
-
-	/**
-	 * Returns this plugin's unique identifier
-	 * @return the plugin id
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	/**
-	 * @return the plugin's resource bundle
-	 */
-	public ResourceBundle getResourceBundle() {
-		return _resourceBundle;
-	}
-
-	/**
-	 * @param key 
-	 * @return the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = PDPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-
-	/**
-	 * @return the plugin's descriptor's resource bundle,
-	 */
-	public ResourceBundle getPluginDecriptorBundle() {
-		return Platform.getResourceBundle(getDefault().getBundle());
-	}
-
-	/**
-	 * @return the plugin's default properties. These are normally used for
-	 * default preferences.
-	 */
-	public Properties getProperties() {
-		return _properties;
-	}
-
-	/**
-	 * @return the standard display to be used. The method first checks, if the
-	 * thread calling this method has an associated dispaly. If so, this display
-	 * is returned. Otherwise the method returns the default display.
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;
-	}
-
-	/**
-	 * @return the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * Returns a shared image for the given name.  Image must exist in icons folder of pagedesigner plugin.
-	 * <p>
-	 * Note: Images returned from this method will be automitically disposed of
-	 * when this plug-in shuts down. Callers must not dispose of these images
-	 * themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the image name found in /icons (with extension)
-	 * @return the image, null on error or not found.
-	 */
-	public Image getImage(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		Image image = images.get(name);
-		if (image == null) {
-			getImageDescriptor(name);		
-			image = images.get(name);
-		}
-		return image;
-	}
-
-	/**
-	 * Returns a shared ImageDescriptor for the given name
-	 * <p>
-	 * Note: ImageDescriptor returned from this method will be automatically
-	 * disposed of when this plug-in shuts down. Callers must not dispose of
-	 * these ImageDescriptor themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the ImageDescriptor name found in /icons (with extension)
-	 * @return the ImageDescriptor, null on error or not found.
-	 */
-	public ImageDescriptor getImageDescriptor(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		ImageDescriptor id = images.getDescriptor(name);
-		if (id == null) {
-			InputStream stream = null;
-			try {//check existance of file
-				URL url = new URL(_pluginBase,
-						ICONS_LIB_PATH + "/" + name); //$NON-NLS-1$
-				
-				//doing the following to check existance... exception will be caught and null descriptor returned
-				stream = url.openStream();
-				stream.close();
-				
-				id = ImageDescriptor.createFromURL(url);
-				images.put(name, id);
-			} catch (IOException e1) {
-				_log.info("Unable to create ImageDescriptor for: "+name, e1); //$NON-NLS-1$
-				return null;
-			} 
-		}
-		return id;
-	}
-
-	/**
-	 * Read a file resource. The file should contain any partial path and the
-	 * filename from the plugin base. The caller is responsible for closing the
-	 * file.
-	 * @param file 
-	 * @return the input stream for the file
-	 * @throws MalformedURLException 
-	 * @throws IOException 
-	 */
-	public InputStream readFile(String file) throws MalformedURLException,
-			IOException {
-		return (new URL(_pluginBase, file)).openStream();
-	}
-
-	/**
-	 * @param file
-	 * @return the File associate with the name 'file'
-	 * @throws MalformedURLException
-	 * @throws IOException
-	 */
-	public File getFile(String file) throws MalformedURLException, IOException {
-		return new File((new URL(_pluginBase, file)).getPath());
-	}
-
-	/**
-	 * @return the plugin's install location with the leading "/" removed
-	 * and normalized to the the os string.
-	 */
-	public static Path getInstallLocation() {
-		try {
-			URL url = getDefault().getBundle().getEntry("/"); //$NON-NLS-1$
-			String s1 = FileLocator.resolve(url).getFile();
-			if (s1.startsWith("/")) //$NON-NLS-1$
-			{
-				s1 = s1.substring(1);
-			}
-			s1 = (new Path(s1)).toOSString();
-			String s;
-			if (s1.endsWith(File.separator)) {
-				s = s1;
-			} else {
-				s = s1 + File.separator;
-			}
-			return new Path(s);
-		} catch (Exception exception) {
-			_log.error("Error.PDPlugin.Installation.15", exception); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-    /**
-	 * Returns the active workbench window.
-	 * 
-	 * @return the active workbench window. this can be null but I've never seen
-	 *         it.
-	 */
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		if (getDefault().getWorkbench() == null) {
-			return null;
-		}
-        return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	/**
-	 * Returns the active workbench page. Note that the active page may not be
-	 * the one that the user perceives as active in some situations so this
-	 * method of obtaining the activate page should only be used if no other
-	 * method is available.
-	 * 
-	 * @return the active workbench page
-	 */
-	public static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow window = getActiveWorkbenchWindow();
-		if (window == null) {
-			return null;
-		}
-		return window.getActivePage();
-	}
-
-	/**
-	 * Initializes the preference controls to the default values. These values
-	 * are used the first time the preference page is displayed or when the user
-	 * presses the Defaults button in the preferences page.
-	 */
-	protected void initializeDefaultPreferences(IPreferenceStore store) {
-		// initialize any preferences for this plugin.
-	}
-
-	/**
-	 * @return the active workbench Shell. Used for some funciton need IShell
-	 * Parameter.
-	 */
-	public static Shell getActiveWorkbenchShell() {
-		IWorkbenchWindow window = getActiveWorkbenchWindow();
-		if (window != null) {
-			return window.getShell();
-		}
-		IWorkbenchWindow[] windows = getDefault().getWorkbench()
-				.getWorkbenchWindows();
-		if (windows.length > 0) {
-			return windows[0].getShell();
-		}
-		return null;
-	}
-
-	/**
-	 * @return the active display.
-	 */
-	public static Display getDisplay() {
-		Shell shell = getActiveWorkbenchShell();
-		if (shell != null) {
-			return shell.getDisplay();
-		}
-        return Display.getDefault();
-	}
-
-	/**
-	 * @return current active project.
-	 */
-	public static IProject getCurrentProject() {
-		IProject curProject = null;
-		IEditorPart editor = PDPlugin.getDefault().getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-		IEditorInput input = editor.getEditorInput();
-		IFile inputFile = null;
-		if (input instanceof IFileEditorInput) {
-			inputFile = ((IFileEditorInput) input).getFile();
-			curProject = inputFile.getProject();
-		}
-		return curProject;
-	}
-	
-	/**
-	 * Log status using the default plugin logger
-	 * @param status
-	 */
-	public static void log(IStatus status)
-	{
-	    ILog log = getDefault().getLog();
-	    log.log(status);
-	}
-	
-	/**
-	 * @param message
-	 * @param excp
-	 */
-	public static void log(String message, Throwable excp)
-	{
-	    Status status = new Status(IStatus.ERROR, getPluginId(), message, excp);
-	    log(status);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PageDesignerTraceOptions.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PageDesignerTraceOptions.java
deleted file mode 100644
index 5bcf32a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PageDesignerTraceOptions.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner;
-
-import org.eclipse.osgi.framework.debug.FrameworkDebugOptions;
-import org.eclipse.osgi.service.debug.DebugOptions;
-
-/**
- * Defines that standard runtime trace options for debugging. See .options file
- * for definitions.
- * 
- * NOT API
- * 
- * @author cbateman
- * 
- */
-public final class PageDesignerTraceOptions
-{
-    /**
-     * True if debug tracing is enabled. Other tracing cannot be enabled unless
-     * this is enabled.
-     */
-    public static final boolean ENABLED;
-
-    /**
-     * True if tag converter ext load tracing is enabled
-     */
-    public static final boolean TRACE_CONVERTERLOAD;
-    /**
-     * True if tag converter selection tracing is enabled
-     */
-    public static final boolean TRACE_CONVERTERSELECT;
-    /**
-     * True if tag element edit ext load tracing is enabled
-     */
-    public static final boolean TRACE_ELEMENTEDITLOAD;
-    /**
-     * True if tag element edit selection tracing is enabled
-     */
-    public static final boolean TRACE_ELEMENTEDITSELECTION;
-
-    private static final String KEY_DEBUG_ENABLED = "/debug"; //$NON-NLS-1$
-    private static final String KEY_CONVERTER = KEY_DEBUG_ENABLED+"/converter"; //$NON-NLS-1$
-    private static final String KEY_CONVERTER_LOAD = KEY_CONVERTER + "/load"; //$NON-NLS-1$
-    private static final String KEY_CONVERTER_SELECTION = KEY_CONVERTER + "/selection"; //$NON-NLS-1$
-
-    private static final String KEY_ELEMENTEDIT = KEY_DEBUG_ENABLED+"/elementedit"; //$NON-NLS-1$
-    private static final String KEY_ELEMENTEDIT_LOAD = KEY_ELEMENTEDIT + "/load"; //$NON-NLS-1$
-    private static final String KEY_ELEMENTEDIT_SELECTION = KEY_ELEMENTEDIT + "/selection"; //$NON-NLS-1$
-
-    
-    static
-    {
-        final DebugOptions debugOptions = FrameworkDebugOptions.getDefault();
-        final String pluginId = PDPlugin.getPluginId();
-        ENABLED = debugOptions != null
-                && debugOptions.getBooleanOption(pluginId
-                        + KEY_DEBUG_ENABLED, false);
-
-        if (ENABLED)
-        {
-            TRACE_CONVERTERLOAD = debugOptions.getBooleanOption(
-                    pluginId + KEY_CONVERTER_LOAD, false);
-            TRACE_CONVERTERSELECT = debugOptions.getBooleanOption(
-                    pluginId + KEY_CONVERTER_SELECTION, false);
-            TRACE_ELEMENTEDITLOAD = debugOptions.getBooleanOption(
-                    pluginId + KEY_ELEMENTEDIT_LOAD, false);
-            TRACE_ELEMENTEDITSELECTION = debugOptions.getBooleanOption(
-                    pluginId + KEY_ELEMENTEDIT_SELECTION, false);
-        }
-        else
-        {
-            TRACE_CONVERTERLOAD = false;
-            TRACE_CONVERTERSELECT = false;
-            TRACE_ELEMENTEDITLOAD = false;
-            TRACE_ELEMENTEDITSELECTION = false;
-        }
-    }
-
-    /**
-     * @param message
-     */
-    public static void log(final String message)
-    {
-        System.out.println(message);
-    }
-    
-    /**
-     * @param msg A short label placed before the trace of t to show the source
-     * @param t
-     */
-    public static void log(final String msg, final Throwable t)
-    {
-        System.out.printf("%s: Exception Trace:\n\n",msg); //$NON-NLS-1$
-        t.printStackTrace(System.out);
-        System.out.print("\n\n\n"); //$NON-NLS-1$
-    }
-
-    private PageDesignerTraceOptions()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java
deleted file mode 100644
index 807cad2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.container;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.ui.actions.ActionGroup;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ContainerActionGroup extends ActionGroup {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ISelection selection = this.getContext().getSelection();
-
-		EditPart part = findCommonAncesterPart(selection);
-		if (!(part instanceof NodeEditPart)) {
-			return;
-		}
-
-		NodeEditPart original = (NodeEditPart) part;
-		// start from the parent of part
-		while (part.getParent() instanceof ElementEditPart) {
-			ElementEditPart elementEditPart = (ElementEditPart) part
-					.getParent();
-
-			IElementEdit elementEdit = elementEditPart.getElementEdit();
-			if (elementEdit != null) {
-				boolean filled = elementEdit.fillContainerContextMenu(menu,
-						elementEditPart, original, selection);
-				if (filled) {
-					break;
-				}
-			}
-
-			part = part.getParent();
-		}
-	}
-
-	/**
-	 * Give a selection, find a single common container node as start for table
-	 * related operations.
-	 * 
-	 * @param selection
-	 * @return
-	 */
-	private EditPart findCommonAncesterPart(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structsel = (IStructuredSelection) selection;
-			if (structsel.size() != 1) {
-				return null;
-			} else if (structsel.getFirstElement() instanceof EditPart) {
-				return (EditPart) structsel.getFirstElement();
-			} else {
-				return null;
-			}
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			if (!range.isValid()) {
-				return null;
-			}
-			if (range.isEmpty()) {
-				DesignPosition position = range.getStartPosition();
-				if (position.getOffset() == 0
-						|| position.getContainerNode() instanceof Text) {
-					return position.getContainerPart();
-				}
-                return position.getSiblingEditPart(false);
-			}
-            return RangeUtil.findCommonAncestor(range);
-		} else {
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java
deleted file mode 100644
index 925b449..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractLinkCreator implements ILinkCreator,
-		IExecutableExtension {
-	private String _identifier;
-    /**
-     * the link identifier attribute name
-     */
-    private static final String LINK_IDENTIFIER = "linkIdentifier"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#canExcute(org.eclipse.jst.pagedesigner.viewer.DesignRange)
-	 */
-	public boolean canExecute(DesignRange range) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#getLinkIdentifier()
-	 */
-	public String getLinkIdentifier() {
-		return this._identifier;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config,
-			String propertyName, Object data) throws CoreException {
-		this._identifier = config.getAttribute(LINK_IDENTIFIER);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java
deleted file mode 100644
index 2aae9ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.Map;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CreateLinkWizard extends Wizard {
-	private static final String WIZARD_TITLE = PDPlugin
-			.getResourceString("CreateLinkWizard.Title"); //$NON-NLS-1$
-
-	private static final String INTIAL_DEFAULT_PAGE_IMAGE = "newsuade_wiz.gif"; //$NON-NLS-1$
-
-	private static final String PAGE_NAME = "first"; //$NON-NLS-1$
-
-	private String _pageTitle;
-
-	private EditPart _part;
-
-	private DesignRange _range;
-
-	private Map<String, ILinkCreator> _linkMap;
-
-	private String _linkType;
-
-	/**
-	 * @param part
-	 * @param range
-	 * @param linkMap
-	 */
-	public CreateLinkWizard(EditPart part, DesignRange range, Map<String, ILinkCreator> linkMap) {
-		this._part = part;
-		this._range = range;
-		this._linkMap = linkMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#addPages()
-	 */
-	public void addPages() {
-		addPage(new LinkWizardPage(PAGE_NAME, _pageTitle, this._part,
-				this._range, this._linkMap));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
-	 */
-	public boolean canFinish() {
-		return super.canFinish();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		LinkWizardPage page = (LinkWizardPage) getPage(PAGE_NAME);
-		this._linkType = page.getChosenLinkType();
-		return true;
-	}
-
-	/**
-	 * @param pageTitle
-	 */
-	public void setPageTitle(String pageTitle) {
-		_pageTitle = pageTitle;
-		initializeDefaultPageImageDescriptor();
-	}
-
-	/**
-	 * 
-	 */
-	protected void initializeDefaultPageImageDescriptor() {
-		ImageDescriptor desc = PDPlugin.getDefault().getImageDescriptor(
-				INTIAL_DEFAULT_PAGE_IMAGE);
-		setDefaultPageImageDescriptor(desc);
-		setWindowTitle(WIZARD_TITLE);
-	}
-
-	/**
-	 * @return the link type
-	 */
-	public String getChosenLinkType() {
-		return this._linkType;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java
deleted file mode 100644
index f4ababf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionReader {
-	private static Logger _log = PDPlugin.getLogger(ExtensionReader.class);
-
-	private static List<ILinkCreator> _handlers = null;
-
-	private static final String ATTR_CLASS = "class"; //$NON-NLS-1$
-
-	/** 
-	 * @return the ext-pts for the link handler
-	 * List is not modifiable
-	 */
-	public static synchronized List<ILinkCreator> getAllLinkHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllLinkHandlers();
-		}
-		return Collections.unmodifiableList(_handlers);
-
-	}
-
-	private static List<ILinkCreator> readAllLinkHandlers() {
-	    List<ILinkCreator> result = new ArrayList<ILinkCreator>();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] linkHandlers = ext
-					.getConfigurationElements();
-
-			for (int j = 0; j < linkHandlers.length; j++) {
-				if (linkHandlers[j].getName()
-						.equals(IJMTConstants.LINK_CREATOR)) {
-					linkHandlers[j].getAttribute(ATTR_CLASS);
-					Object obj;
-					try {
-						obj = linkHandlers[j]
-								.createExecutableExtension(ATTR_CLASS);
-
-						if (obj instanceof ILinkCreator) {
-							result.add((ILinkCreator)obj);
-						}
-					} catch (CoreException e) {
-						_log
-								.error("Log.Error.ExtensionReader.ReadLinkExtension"); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java
deleted file mode 100644
index 14e8591..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HtmlLinkCreator extends AbstractLinkCreator {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#makeLinkElement(org.eclipse.gef.EditPart,
-	 *      org.eclipse.jst.pagedesigner.viewer.DesignRange)
-	 */
-	public Element makeLinkElement(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			Text middleNode = LinkUtil.splitDomText(part, range);
-			EditPart parent = part.getParent();
-			Node parentNode = (Node) parent.getModel();
-			Document doc = (parentNode instanceof Document) ? (Document) parentNode
-					: (parentNode.getOwnerDocument());
-
-			Element htmlLink = doc.createElement(IHTMLConstants.TAG_A);
-			htmlLink.setAttribute(ICSSPropertyID.ATTR_HREF, ""); //$NON-NLS-1$
-			Text text = doc.createTextNode(middleNode.getNodeValue());
-			htmlLink.appendChild(text);
-			parentNode.replaceChild(htmlLink, middleNode);
-			return htmlLink;
-		}
-
-		return null;
-	}
-
-	public String getSourcePreview(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			TextEditPart textPart = (TextEditPart) part;
-			int[] offsets = textPart.getSelectedRange();
-			String displayData = textPart.getTextData();
-
-			String linkExp = displayData.substring(offsets[0], offsets[1]);
-			StringBuffer sb = new StringBuffer();
-			sb.append("<a href=\"\">"); //$NON-NLS-1$
-			sb.append(linkExp);
-			sb.append("</a>"); //$NON-NLS-1$
-			return sb.toString();
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java
deleted file mode 100644
index 0652f37..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ILinkCreator {
-
-	/**
-	 * @param part
-	 * @param range
-	 * @return the link element
-	 */
-	public Element makeLinkElement(EditPart part, DesignRange range);
-
-	/**
-	 * @return link identifier
-	 */
-	public String getLinkIdentifier();
-
-	/**
-	 * @param range
-	 * @return true if can call makeLinkElement
-	 */
-	public boolean canExecute(DesignRange range);
-
-	/**
-	 * @param part
-	 * @param range
-	 * @return a preview string that approximates the result
-	 * of makeLinkElement
-	 */
-	public String getSourcePreview(EditPart part, DesignRange range);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java
deleted file mode 100644
index 1caa1f8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.Request;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LinkRequest extends Request {
-	private final String _identifier;
-
-	private final DesignRange _range;
-
-	/**
-	 * @param identifier
-	 * @param range
-	 */
-	public LinkRequest(String identifier, DesignRange range) {
-		this._identifier = identifier;
-		this._range = range;
-	}
-
-	/**
-	 * @return the identifier
-	 */
-	public String getIdentifier() {
-		return this._identifier;
-	}
-
-	/**
-	 * @return the design range
-	 */
-	public DesignRange getDesignRange() {
-		return this._range;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java
deleted file mode 100644
index aeeaf41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRangeHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LinkUtil {
-	/**
-	 * @param part
-	 * @param range
-	 * @return the select text if part is a text node or null.
-	 */
-	public static String getSelectedText(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			TextEditPart textPart = (TextEditPart) part;
-			int[] offsets = textPart.getSelectedRange();
-			String displayData = textPart.getTextData();
-
-			String linkExp = displayData.substring(offsets[0], offsets[1]);
-			return linkExp;
-		}
-		return null;
-	}
-
-	/**
-	 * @param part
-	 * @param range
-	 * @return the text from part split if it is a text node or null
-	 */
-	public static Text splitDomText(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			Text textNode = (Text) part.getModel();
-
-			DOMRange domRange = DOMRangeHelper.toDOMRange(range);
-			IDOMPosition start = domRange.getStartPosition();
-			IDOMPosition end = domRange.getEndPosition();
-			int domTempStartOffset = computeOffset(start, textNode);
-			int domTempEndOffset = computeOffset(end, textNode);
-
-			int domStartOffset = Math.min(domTempStartOffset, domTempEndOffset);
-			int domEndOffset = Math.max(domTempStartOffset, domTempEndOffset);
-
-			Text lastNode = textNode;
-			if (domStartOffset > 0) {
-				lastNode = textNode.splitText(domStartOffset);
-			}
-			lastNode = lastNode.splitText(domEndOffset - domStartOffset);
-			Text middleNode = (Text) lastNode.getPreviousSibling();
-			return middleNode;
-		}
-		return null;
-	}
-
-	private static int computeOffset(IDOMPosition pos, Text textNode) {
-		int domOffset = 0;
-		if (pos instanceof DOMRefPosition) {
-			DOMRefPosition rep = (DOMRefPosition) pos;
-			boolean forward = rep.isForward();
-			Node refNode = rep.getReferenceNode();
-
-			if ((refNode != textNode) && forward || (refNode == textNode)
-					&& !forward) {
-				domOffset = 0;
-			} else {
-				domOffset = textNode.getLength();
-			}
-		} else {
-			domOffset = pos.getOffset();
-		}
-		return domOffset;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java
deleted file mode 100644
index aca4824..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class LinkWizardPage extends WizardPage {
-	private static final String GROUP_TITLE = PDPlugin
-			.getResourceString("LinkWizardPage.GroupTitle"); //$NON-NLS-1$
-
-	private static final String PREVIEW_TAG_LABEL = PDPlugin
-			.getResourceString("LinkWizardPage.PreviewLabel"); //$NON-NLS-1$
-
-	private StyledText _text = null;
-
-	private final Map<String, ILinkCreator> _linkMap;
-
-	private String _linkType = null;
-
-	private final EditPart _part;
-
-	private final DesignRange _range;
-
-	/**
-	 * @param pageName
-	 * @param title
-	 * @param editPart
-	 * @param range
-	 * @param linkMap
-	 */
-	public LinkWizardPage(String pageName, String title, EditPart editPart,
-			DesignRange range, Map<String, ILinkCreator> linkMap) {
-		super(pageName, title, null);
-		this._part = editPart;
-		this._range = range;
-		this._linkMap = linkMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		layout = new GridLayout();
-		layout.marginWidth = 20;
-		parent.setLayout(layout);
-		data = new GridData(GridData.FILL_BOTH | GridData.CENTER);
-		parent.setLayoutData(data);
-
-		Group group = new Group(parent, SWT.NONE);
-		group.setText(GROUP_TITLE);
-		layout = new GridLayout();
-		group.setLayout(layout);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		group.setLayoutData(data);
-
-		String defaultLink = ""; //$NON-NLS-1$
-		Set<String> set = this._linkMap.keySet();
-		int size = set.size();
-		String[] keys = new String[size];
-		Iterator<String> itr = set.iterator();
-		int i = 0;
-		while (itr.hasNext()) {
-			String key = itr.next();
-			keys[i++] = key;
-		}
-		Arrays.sort(keys);
-		for (int j = 0; j < size; j++) {
-			Button bt = new Button(group, SWT.RADIO);
-			data = new GridData(GridData.FILL_HORIZONTAL);
-			bt.setLayoutData(data);
-			bt.setText(keys[j]);
-			if (j == 0) {
-				bt.setSelection(true);
-				defaultLink = keys[j];
-			}
-			bt.addSelectionListener(new SelectLinkListener(keys[j]));
-		}
-
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(PREVIEW_TAG_LABEL);
-
-		_text = new StyledText(parent, SWT.WRAP | SWT.V_SCROLL | SWT.BORDER);
-		data = new GridData(GridData.FILL_BOTH);
-		data.heightHint = 50;
-		_text.setLayoutData(data);
-
-		ILinkCreator creator = _linkMap.get(defaultLink);
-		_linkType = creator.getLinkIdentifier();
-		String previewText = creator.getSourcePreview(_part, _range);
-		previewText = previewText == null ? "" : previewText; //$NON-NLS-1$
-		_text.setText(previewText);
-		_text.setEditable(false);
-
-		super.setControl(group);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		return true;
-	}
-
-	/**
-	 * @return the link type
-	 */
-	public String getChosenLinkType() {
-		return this._linkType;
-	}
-
-    class SelectLinkListener extends SelectionAdapter {
-		private String _key;
-
-		/**
-		 * @param key
-		 */
-		public SelectLinkListener(String key) {
-			this._key = key;
-		}
-
-		public void widgetSelected(SelectionEvent e) {
-			ILinkCreator creator = _linkMap.get(this._key);
-			_linkType = creator.getLinkIdentifier();
-			String previewText = creator.getSourcePreview(_part, _range);
-			previewText = previewText == null ? "" : previewText; //$NON-NLS-1$
-			_text.setText(previewText);
-			super.widgetSelected(e);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java
deleted file mode 100644
index 475f4ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MakeLinkAction extends Action {
-	private final static String MAKE_LINK = PDPlugin
-			.getResourceString("ActionGroup.Submenu.Link"); //$NON-NLS-1$
-
-	private final static String WIZARD_PAGE_TITLE = PDPlugin
-			.getResourceString("MakeLinkAction.Wizard.PageTitle"); //$NON-NLS-1$
-
-	private EditPart _editPart;
-
-	private DesignRange _range;
-
-	private String _linkType;
-
-	/**
-	 * @param range
-	 */
-	public MakeLinkAction(DesignRange range) {
-		super(MAKE_LINK);
-		_range = range;
-		_editPart = convertToEditPart(_range);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		Map<String, ILinkCreator> map = calAvailableLinkCreator();
-		if (map.size() > 1) {
-			CreateLinkWizard wizard = new CreateLinkWizard(_editPart, _range,
-					map);
-			wizard.setPageTitle(WIZARD_PAGE_TITLE);
-			CommonWizardDialog wizardDialog = new CommonWizardDialog(
-					getShell(), wizard);
-			wizardDialog.create();
-			if (wizardDialog.open() == Window.OK) {
-				_linkType = wizard.getChosenLinkType();
-			}
-		}
-		// else must be html link
-		else if (map.size() == 1) {
-			Set<Map.Entry<String, ILinkCreator>> set = map.entrySet();
-			Iterator<Map.Entry<String,ILinkCreator>> itr = set.iterator();
-			while (itr.hasNext()) {
-				ILinkCreator creator =  itr.next().getValue();
-				_linkType = creator.getLinkIdentifier();
-			}
-		}
-
-		if (_linkType != null) {
-			Request request = new LinkRequest(_linkType, _range);
-			Command cmd = _editPart.getCommand(request);
-			if (cmd != null && cmd.canExecute()) {
-				cmd.execute();
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		if (_editPart == null) {
-			return false;
-		}
-		return super.isEnabled();
-	}
-
-	private EditPart convertToEditPart(DesignRange range) {
-		DesignPosition startPosition = range.getStartPosition();
-		EditPart startPart = startPosition.getContainerPart();
-
-		DesignPosition endPosition = range.getEndPosition();
-		EditPart endPart = endPosition.getContainerPart();
-
-		if (startPosition == endPosition) {
-			return null;
-		}
-
-		if (startPart instanceof TextEditPart
-				&& endPart instanceof TextEditPart) {
-			if ((startPart == endPart)) {
-				return startPart;
-			}
-		} else if (!(startPart instanceof TextEditPart)
-				&& !(endPart instanceof TextEditPart)) {
-			Node[] startNodeOptions = null;
-			startNodeOptions = getSideNodes(startPosition);
-			Node[] endNodeOptions = null;
-			endNodeOptions = getSideNodes(endPosition);
-			Node selectedNode = null;
-			for (int i = 0; i < 2; i++) {
-				for (int j = 0; j < 2; j++) {
-					if (startNodeOptions[i] == endNodeOptions[j]) {
-						selectedNode = startNodeOptions[i];
-						break;
-					}
-				}
-				if (selectedNode != null) {
-					break;
-				}
-			}
-			if (selectedNode != null) {
-				EditPart part = (EditPart) ((INodeNotifier) selectedNode)
-						.getAdapterFor(EditPart.class);
-				return part;
-			}
-		} else {
-			if (startPart instanceof TextEditPart) {
-				Node[] endNodeOptions = null;
-				endNodeOptions = getSideNodes(endPosition);
-				if (startPart.getModel() == endNodeOptions[0]
-						|| startPart.getModel() == endNodeOptions[1]) {
-					return startPart;
-				}
-			}
-			if (endPart instanceof TextEditPart) {
-				Node[] startNodeOptions = null;
-				startNodeOptions = getSideNodes(startPosition);
-				if (endPart.getModel() == startNodeOptions[0]
-						|| endPart.getModel() == startNodeOptions[1]) {
-					return endPart;
-				}
-			}
-		}
-
-		return null;
-	}
-
-	private Node[] getSideNodes(DesignPosition pos) {
-		Node[] nodes = new Node[2];
-
-		EditPart part = pos.getContainerPart();
-		Node node = (Node) part.getModel();
-		NodeList list = node.getChildNodes();
-
-		if (list.getLength() == pos.getOffset()) {
-			nodes[0] = list.item(pos.getOffset() - 1);
-			nodes[1] = list.item(pos.getOffset() - 1);
-		} else if (pos.getOffset() == 0) {
-			nodes[0] = list.item(0);
-			nodes[1] = list.item(0);
-		} else if (pos.getOffset() > 0 && pos.getOffset() < list.getLength()) {
-			nodes[0] = list.item(pos.getOffset() - 1);
-			nodes[1] = list.item(pos.getOffset());
-		}
-
-		return nodes;
-	}
-
-	private Shell getShell() {
-		if (_editPart != null) {
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _editPart
-					.getViewer();
-			return viewer.getControl().getShell();
-		}
-		return null;
-	}
-
-	private Map<String, ILinkCreator> calAvailableLinkCreator() {
-		Map<String, ILinkCreator> map = new HashMap<String, ILinkCreator>();
-		List<ILinkCreator> linkCreators = ExtensionReader.getAllLinkHandlers();
-		for (ILinkCreator linkCreator : linkCreators) {
-			String identifier = linkCreator.getLinkIdentifier();
-			boolean canExecute = linkCreator.canExecute(_range);
-			if (canExecute) {
-				map.put(identifier, linkCreator);
-			}
-		}
-		return map;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java
deleted file mode 100644
index 7c4835f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MakeLinkCommand extends DesignerCommand {
-	private String _identifier = null;
-
-	private EditPart _part = null;
-
-	private DesignRange _range = null;
-
-	private ILinkCreator _linkcreator = null;
-
-	private Element _ele = null;
-
-	/**
-	 * @param identifier
-	 * @param viewer
-	 * @param part
-	 * @param range
-	 */
-	public MakeLinkCommand(String identifier, IHTMLGraphicalViewer viewer,
-			EditPart part, DesignRange range) {
-		super(identifier, viewer);
-		setLabel(PDPlugin.getResourceString("MakeLinkCommand.Label.MakeLink"));//$NON-NLS-1$
-		this._identifier = identifier;
-		this._part = part;
-		this._range = range;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		List<ILinkCreator> creators = ExtensionReader.getAllLinkHandlers();
-		if (creators != null) {
-			for (ILinkCreator linkCreator : creators) {
-				String identifier = linkCreator.getLinkIdentifier();
-				if (this._identifier.equalsIgnoreCase(identifier)) {
-					this._linkcreator = linkCreator;
-					break;
-				}
-			}
-		}
-		if (this._linkcreator != null) {
-			return this._linkcreator.canExecute(_range);
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		if (this._linkcreator != null) {
-			Element ele = this._linkcreator.makeLinkElement(this._part,
-					this._range);
-			Node node = (Node) this._part.getModel();
-			Node parent = node.getParentNode();
-			formatNode(parent);
-
-			this._ele = ele;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_ele);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java
deleted file mode 100644
index b6721fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.menuextension;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CustomedContextMenuActionGroup extends ActionGroup {
-	private final static String POPUPMENU_EXTENSION_ID = "org.eclipse.jst.pagedesigner.popupMenuContributor"; //$NON-NLS-1$
-
-	private List _contributedMenuListener;
-
-	private Control _parentControl;
-
-	private IStructuredModel _model;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		populateContributedMenu(menu);
-	}
-
-	private List getListeners() {
-		if (_contributedMenuListener == null) {
-			_contributedMenuListener = computeContributedMenuListener();
-		}
-		return _contributedMenuListener;
-	}
-
-	private List computeContributedMenuListener() {
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = registry
-				.getExtensionPoint(POPUPMENU_EXTENSION_ID);
-		IExtension[] extensions = extensionPoint.getExtensions();
-		List results = new ArrayList();
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement[] elements = extensions[i]
-					.getConfigurationElements();
-			for (int j = 0; j < elements.length; j++) {
-				try {
-					Object listener = elements[j]
-							.createExecutableExtension("class");//$NON-NLS-1$
-
-					if (listener instanceof IContextMenuItemContributor) {
-						results.add(listener);
-						((IContextMenuItemContributor) listener)
-								.setURI(elements[j].getAttribute("URI"));//$NON-NLS-1$
-					}
-				} catch (CoreException e) {
-					// ignore
-				}
-			}
-		}
-		return results;
-	}
-
-	private void populateContributedMenu(IMenuManager menuMgr) {
-		List list = getListeners();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			IContextMenuItemContributor contributor = (IContextMenuItemContributor) list
-					.get(i);
-			IFile file = StructuredModelUtil.getFileFor(_model);
-			if (file != null && contributor.getURI() != null) {
-				if (JSPUtil.supportTaglib(contributor.getURI(), file)) {
-					contributor.fillContextMenu(menuMgr, getContext()
-							.getSelection(), _model, _parentControl);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the model.
-	 */
-	public IStructuredModel getModel() {
-		return _model;
-	}
-
-	/**
-	 * @param model
-	 *            The model to set.
-	 */
-	public void setModel(IStructuredModel model) {
-		this._model = model;
-	}
-
-	/**
-	 * @return Returns the parentControl.
-	 */
-	public Control getParentControl() {
-		return _parentControl;
-	}
-
-	/**
-	 * @param parentControl
-	 *            The parentControl to set.
-	 */
-	public void setParentControl(Control parentControl) {
-		this._parentControl = parentControl;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java
deleted file mode 100644
index 3528019..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.menuextension;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RunAction extends Action {
-	/**
-	 * constant for debug launch mode
-	 */
-	public static final String LAUNCH_MODE_DEBUG = "debug"; //$NON-NLS-1$
-
-	/**
-	 * constant for run launch mode
-	 */
-	public static final String LAUNCH_MODE_RUN = "run"; //$NON-NLS-1$
-
-	private final String ID = "org.eclipse.jst.pagedesigner.actions.menuextension.RunAction"; //$NON-NLS-1$
-
-	//private EditorPart _editor;
-
-	private String _mode;
-
-	/**
-	 * @param editor
-	 * @param mode
-	 */
-	public RunAction(EditorPart editor, String mode) {
-		//_editor = editor;
-		_mode = mode;
-	}
-
-	public void run() {
-	    PDPlugin.getLogger(getClass()).error("Obsolete.  Shouldn't be used", new Throwable()); //$NON-NLS-1$
-	    // FIXME: we don't support this feature and it seems to depend
-	    // on debugger internal code anyway...
-	    //		List allShortCuts = DebugUIPlugin.getDefault()
-//				.getLaunchConfigurationManager().getLaunchShortcuts();
-//		Iterator iter = allShortCuts.iterator();
-//		LaunchShortcutExtension ext = null;
-//		while (iter.hasNext()) {
-//			ext = (LaunchShortcutExtension) iter.next();
-//			try {
-//				if (ext.getId().equals("org.eclipse.wst.server.launchShortcut")) {
-//					break;
-//				}
-//			} catch (Exception e) {
-//				// not supported
-//			}
-//		}
-//		if (ext != null) {
-//			ext.launch(getSelection(), _mode);
-//		}
-	}
-
-//	private IStructuredSelection getSelection() {
-//		IEditorInput input = ((HTMLEditor) _editor).getEditorInput();
-//		List elements = new ArrayList();
-//		if (input instanceof FileEditorInput) {
-//			elements.add(((FileEditorInput) input).getFile());
-//		}
-//		return new StructuredSelection(elements);
-//	}
-
-	public String getId() {
-		return ID;
-	}
-
-	public String getText() {
-		return _mode.substring(0, 1).toUpperCase()
-				+ _mode.substring(1, _mode.length());
-	}
-
-	private ImageDescriptor getImageDescriptorForModel(String id) {
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.actionSets"); //$NON-NLS-1$
-		for (int i = 0; i < elements.length; i++) {
-			if ("actionSet".equals(elements[i].getName())) { //$NON-NLS-1$
-				IConfigurationElement[] actions = elements[i]
-						.getChildren("action"); //$NON-NLS-1$
-				for (int j = 0; j < actions.length; j++) {
-					if (id.equals(actions[j].getAttribute("id"))) { //$NON-NLS-1$
-						String iconPath = actions[j].getAttribute("icon"); //$NON-NLS-1$
-						if (iconPath != null) {
-							return AbstractUIPlugin.imageDescriptorFromPlugin(
-									actions[j].getDeclaringExtension()
-											.getContributor().getName(), iconPath);
-						}
-                        return null;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public ImageDescriptor getImageDescriptor() {
-		if (_mode == LAUNCH_MODE_DEBUG) {
-			return getImageDescriptorForModel("org.eclipse.debug.internal.ui.actions.DebugDropDownAction"); //$NON-NLS-1$
-		} else if (_mode == LAUNCH_MODE_RUN) {
-			return getImageDescriptorForModel("org.eclipse.debug.internal.ui.actions.RunDropDownAction"); //$NON-NLS-1$
-		} else {
-			return super.getImageDescriptor();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java
deleted file mode 100644
index aaab7e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AlignSupport {
-
-	private static final String[] ALIGN_VALUES = new String[] {
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Left"), //$NON-NLS-1$
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Center"), //$NON-NLS-1$
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Right"), //$NON-NLS-1$
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Justify") //$NON-NLS-1$ 
-	};
-
-	private static Element[] _nodes = null;
-
-	/**
-	 * @param menu
-	 * @param viewer
-	 */
-	public static void createAlignActions(IMenuManager menu,
-			IHTMLGraphicalViewer viewer) {
-		for (int i = 0; i < ALIGN_VALUES.length; i++) {
-			ParagraphStyleAction action = new ParagraphStyleAction(
-					ALIGN_VALUES[i], _nodes[i], null, IAction.AS_CHECK_BOX);
-			action.setViewer(viewer);
-			menu.add(action);
-		}
-	}
-
-	/**
-	 * @param nodes
-	 */
-	public static void setAlignNodes(Element[] nodes) {
-		if (_nodes != nodes) {
-			_nodes = nodes;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java
deleted file mode 100644
index d710e3c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.ApplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRangeHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ChangeStyleAction extends DesignerToolBarAction {
-	private final String _expectedTag;
-
-	/**
-	 * @param text
-	 * @param name 
-	 * @param image
-	 * @param style 
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_expectedTag = name;
-		this.setImageDescriptor(image);
-	}
-
-	/**
-	 * @param text
-	 * @param name
-	 * @param enabled
-	 * @param disabled
-	 * @param style
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor enabled,
-			ImageDescriptor disabled, int style) {
-		super(text, style);
-		_expectedTag = name;
-		setImageDescriptor(enabled);
-		setDisabledImageDescriptor(disabled);
-	}
-
-
-	protected boolean isApplied(DOMRange range) {
-		if (range == null) {
-			return false;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-		Node startnode = start.getContainerNode();
-		Node endnode = end.getContainerNode();
-		if (!EditModelQuery.hasAncestor(startnode, _expectedTag, true)) {
-			return false;
-		}
-		for (Node node = startnode; node != endnode; node = EditModelQuery
-				.getInstance().getNextLeafNeighbor(node)) {
-			if (!EditModelQuery.hasAncestor(node, _expectedTag, true)) {
-				return false;
-			}
-		}
-		if (!EditModelQuery.hasAncestor(endnode, _expectedTag, true)) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * @return the expected tag
-	 */
-	protected String getExpectedTag() {
-		return _expectedTag;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		DesignRange range = getViewer().getRangeSelection();
-		DOMRange dRange = DOMRangeHelper.toDOMRange(range);
-		Command command;
-		if (isApplied(dRange)) {
-			// command = new UnapplyStyleCommand(getViewer(), _expectedTag,
-			// null, null);
-			// since the un-applystyle is not implemented yet,we do nothing
-			// here.
-			command = null;
-			this.setChecked(true);
-		} else {
-			command = new ApplyStyleCommand(getViewer(), _expectedTag, null,
-					null);
-		}
-		return command;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		if (canRun(getViewer())) {
-			setEnabled(true);
-		} else {
-			setEnabled(false);
-		}
-		updateStatus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction#updateStatus()
-	 */
-	public void updateStatus() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getModel().getDocument().hasChildNodes()) {
-			DesignRange range = getViewer().getRangeSelection();
-			if (range != null && range.isValid()) {
-				DOMRange domRange = null;
-				domRange = new DOMRange(DOMPositionHelper.toDOMPosition(range
-						.getStartPosition()), DOMPositionHelper
-						.toDOMPosition(range.getEndPosition()));
-				if (isApplied(domRange)) {
-					this.setChecked(true);
-				} else {
-					this.setChecked(false);
-				}
-				return;
-			}
-		}
-		this.setChecked(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction#canRun(org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer)
-	 */
-	protected boolean canRun(IHTMLGraphicalViewer viewer) {
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getModel().getDocument().hasChildNodes()) {
-			DesignRange range = viewer.getRangeSelection();
-			if (range != null && range.isValid()) {
-				DesignPosition startPos = range.getStartPosition();
-				DesignPosition endPos = range.getEndPosition();
-				if (startPos != endPos) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java
deleted file mode 100644
index 3e241e3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * @author mengbo
- */
-public abstract class DesignerToolBarAction extends Action implements IUpdate,
-		ISelectionChangedListener {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param text
-	 * @param style
-	 */
-	public DesignerToolBarAction(String text, int style) {
-		super(text, style);
-	}
-
-	/**
-	 * @param text
-	 * @param image
-	 */
-	public DesignerToolBarAction(String text, ImageDescriptor image) {
-		super(text, image);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		update();
-	}
-
-	/**
-	 * 
-	 */
-	public void update() {
-		if (canRun(this._viewer)) {
-			setEnabled(true);
-			updateStatus();
-		} else {
-			setEnabled(false);
-		}
-	}
-
-	/**
-	 * Update the status
-	 */
-	protected void updateStatus() {
-		DesignRange range = _viewer.getRangeSelection();
-		DOMRange domRange = null;
-		if (range != null) {
-			domRange = new DOMRange(DOMPositionHelper.toDOMPosition(range
-					.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-					.getEndPosition()));
-			if (isApplied(domRange)) {
-				this.setChecked(true);
-			} else {
-				this.setChecked(false);
-			}
-		}
-	}
-
-	/**
-	 * @param range
-	 * @return ??
-	 */
-	protected abstract boolean isApplied(DOMRange range);
-
-	/**
-	 * @param viewer
-	 * @return true if this action can run
-	 */
-	protected boolean canRun(IHTMLGraphicalViewer viewer) {
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getModel().getDocument().hasChildNodes()) {
-			DesignRange range = viewer.getRangeSelection();
-			if (range != null && range.isValid()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param viewer
-	 */
-	public void setViewer(IHTMLGraphicalViewer viewer) {
-		if (viewer == _viewer) {
-			return;
-		}
-        
-        if (_viewer != null) {
-        	_viewer.removeSelectionChangedListener(this);
-        }
-        _viewer = viewer;
-        if (_viewer != null) {
-        	_viewer.addSelectionChangedListener(this);
-        }
-        update();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		// Assert.isTrue(_viewer != null && _viewer.isInRangeMode());
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return;
-		}
-		Command command = getCommand();
-		if (command != null) {
-			command.execute();
-		}
-	}
-
-	/**
-	 * @return the command for this action or null
-	 */
-	protected abstract Command getCommand();
-
-	/**
-	 * @return Returns the _viewer.
-	 */
-	public IHTMLGraphicalViewer getViewer() {
-		return _viewer;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java
deleted file mode 100644
index 28352ca..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-
-/**
- * @author mengbo
- */
-public class HTagsInsertGroupAction extends DesignerToolBarAction implements
-		IMenuCreator {
-	private Menu _menu;
-
-	private static Map _actions = new HashMap();
-
-	/**
-	 * @param image
-	 * @param style
-	 */
-	public HTagsInsertGroupAction(ImageDescriptor image, int style) {
-		super(
-				PDPlugin
-						.getResourceString("HTagsInsertGroupAction.ActionLabel.Hx"), IAction.AS_DROP_DOWN_MENU); //$NON-NLS-1$
-		this.setImageDescriptor(image);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-	 */
-	public Menu getMenu(Control parent) {
-		if (_menu != null) {
-			_menu.dispose();
-		}
-		_menu = new Menu(parent);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H1);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H2);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H3);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H4);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H5);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H6);
-
-		return _menu;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		return null;
-	}
-
-	/**
-	 * @param parent
-	 * @param name
-	 */
-	protected void addActionToMenu(Menu parent, String name) {
-		DesignerToolBarAction action;
-		if (_actions.get(name) == null) {
-			action = new ParagraphStyleAction(name, name, null,
-					IAction.AS_CHECK_BOX);
-			_actions.put(name, action);
-		} else {
-			action = (ParagraphStyleAction) _actions.get(name);
-		}
-		action.setViewer(getViewer());
-		action.update();
-		ActionContributionItem item = new ActionContributionItem(action);
-		item.fill(parent, -1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-	 */
-	public void dispose() {
-		if (_menu != null) {
-			_menu.dispose();
-			_menu = null;
-			_actions.clear();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#getMenuCreator()
-	 */
-	public IMenuCreator getMenuCreator() {
-		return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#canRun(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean isApplied(DOMRange range) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		return;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#setViewer(org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer)
-	 */
-	public void setViewer(IHTMLGraphicalViewer viewer) {
-		if (_actions != null && _actions.size() > 0) {
-			Collection values = _actions.values();
-			Iterator iterator = values.iterator();
-			while (iterator.hasNext()) {
-				DesignerToolBarAction action = (DesignerToolBarAction) iterator
-						.next();
-				action.setViewer(viewer);
-			}
-		}
-		super.setViewer(viewer);
-	}
-
-	/*
-	 * The group will delegate update to its children.
-	 */
-	public void updateStatus() {
-		if (_actions != null && _actions.size() > 0) {
-			Collection values = _actions.values();
-			Iterator iterator = values.iterator();
-			while (iterator.hasNext()) {
-				DesignerToolBarAction action = (DesignerToolBarAction) iterator
-						.next();
-				action.updateStatus();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java
deleted file mode 100644
index 7624a2b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.actions.ChangeStyleAction;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class InsertTagChangeStyleAction extends ChangeStyleAction {
-	/**
-	 * @param text
-	 * @param tag 
-	 * @param image
-	 * @param style
-	 */
-	public InsertTagChangeStyleAction(String text, String tag,
-			ImageDescriptor image, int style) {
-		super(text, tag, image, style);
-	}
-
-	protected String getExpectedCSSProperty() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	protected String getExpectedCSSPropertyValue() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-    protected void updateState() 
-	{
-        setEnabled(getDesignRange());
-    }
-
-	/**
-	 * @param range
-	 */
-	public void setEnabled(DesignRange range) {
-		DOMRange domRange = null;
-		// We didn't deal with undo, so only enable is set.
-		domRange = new DOMRange(DOMPositionHelper.toDOMPosition(range
-				.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-				.getEndPosition()));
-		if (canRun(domRange)) {
-			this.setEnabled(true);
-		} else {
-			this.setEnabled(false);
-		}
-	}
-
-	private boolean canRun(DOMRange range) {
-		if (range != null) {
-			if (EditModelQuery.isSame(range)) {
-				return false;
-			}
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-			if (getExpectedTag() == null
-					|| EditModelQuery.hasAncestor(common, getExpectedTag(),
-							true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java
deleted file mode 100644
index 17793f8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.Paragraph;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphFinder;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphUnapplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class NoneParagraphStyleAction extends ParagraphStyleAction {
-
-	private String[] _applyingTags;
-
-	/**
-	 * @param text
-	 * @param tags
-	 * @param image
-	 * @param style
-	 */
-	public NoneParagraphStyleAction(String text, String[] tags,
-			ImageDescriptor image, int style) {
-		super(text, "", image, style); //$NON-NLS-1$
-		_applyingTags = tags;
-	}
-
-	/**
-	 * @param text
-	 * @param node
-	 * @param image
-	 * @param style
-	 */
-	public NoneParagraphStyleAction(String text, Node node,
-			ImageDescriptor image, int style) {
-		super(text, node, image, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#isApplied(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean isApplied(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			if (EditModelQuery.isSame(range)) {
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			// the lowest common block parent is the container to apply style.
-			if (EditModelQuery.hasAncestor(common, _applyingTags, true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		ParagraphUnapplyStyleCommand command = new ParagraphUnapplyStyleCommand(
-				getViewer(), _applyingTags, null, null);
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java
deleted file mode 100644
index 44c9c76..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.UnapplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class NoneStyleAction extends ChangeStyleAction {
-	private String[] _applyingStyleTags;
-
-	/**
-	 * @param text
-	 * @param names
-	 * @param image
-	 * @param style
-	 */
-	public NoneStyleAction(String text, String[] names, ImageDescriptor image,
-			int style) {
-		super(text, "", image, style); //$NON-NLS-1$
-		_applyingStyleTags = names;
-	}
-
-	protected boolean isApplied(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-			if (EditModelQuery.hasAncestor(common, _applyingStyleTags, true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		UnapplyStyleCommand command = new UnapplyStyleCommand(getViewer(),
-				getExpectedTag(), null, null);
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java
deleted file mode 100644
index d2f13d0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ParagraphAction extends Action {
-	/**
-	 * @param text
-	 * @param htmlTag
-	 */
-	public ParagraphAction(String text, String htmlTag) {
-		super(text);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java
deleted file mode 100644
index 5c5b042..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.Paragraph;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphApplyStyleCommand;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphFinder;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphStyleAction extends DesignerToolBarAction {
-	private String _tagName;
-
-	private Node _applyingNode;
-
-	/**
-	 * @param text
-	 * @param name
-	 * @param image
-	 * @param style
-	 */
-	public ParagraphStyleAction(String text, String name,
-			ImageDescriptor image, int style) {
-		super(text, style);
-		_tagName = name;
-		setImageDescriptor(image);
-	}
-
-	/**
-	 * @param text
-	 * @param node
-	 * @param image
-	 * @param style
-	 */
-	public ParagraphStyleAction(String text, Node node, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_applyingNode = node;
-		setImageDescriptor(image);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#isApplied(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean isApplied(DOMRange range) {
-		Assert.isTrue(getExpectedTag() != null);
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			if (EditModelQuery.isSame(range)) {
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			// the lowest common block parent is the container to apply style.
-			if (containsTag(common)) {
-				return true;
-			}
-            return false;
-		}
-        return false;
-	}
-
-	/**
-	 * @param common
-	 * @return ??? 
-	 */
-	protected boolean containsTag(Node common) {
-		// the lowest common block parent is the container to apply style.
-		if (_applyingNode == null) {
-			return common.getNodeName() != null
-					&& getExpectedTag().equalsIgnoreCase(
-							common.getNodeName().toLowerCase());
-		}
-        
-        String align = ((Element) _applyingNode).getAttribute("align"); //$NON-NLS-1$
-        if (!(common instanceof Element)) {
-        	return false;
-        }
-        String cAlign = ((Element) common).getAttribute("align"); //$NON-NLS-1$
-        if (align == null || cAlign == null) {
-        	return false;
-        }
-        if (align.equals(cAlign)) {
-        	return true;
-        }
-        return false;
-	}
-
-	/**
-	 * @return Returns the _expectedTag.
-	 */
-	public String getExpectedTag() {
-		if (_tagName == null) {
-			return _applyingNode.getNodeName().toLowerCase();
-		}
-        return _tagName.toLowerCase();
-	}
-
-	/**
-	 * @return Returns the _applyingNode.
-	 */
-	public Element getApplyingNode() {
-		if (_applyingNode != null) {
-			return (Element) _applyingNode;
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		ParagraphApplyStyleCommand command = null;
-		if (getApplyingNode() != null) {
-			command = new ParagraphApplyStyleCommand(getViewer(),
-					getApplyingNode(), null, null);
-		} else {
-			command = new ParagraphApplyStyleCommand(getViewer(),
-					getExpectedTag(), null, null);
-		}
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java
deleted file mode 100644
index 2d03548..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ParagraphSupport {
-	static final String[] labels = new String[] {
-			PDPlugin.getResourceString("ParagraphSupport.CommandLabel.None"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Paragraph"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading1"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading2"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading3"), //$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading4"),//$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading5"), //$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading6"), //$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Preformated") //$NON-NLS-1$ 
-	};
-
-	static final String[] tags = new String[] {
-			null,
-			PDPlugin.getResourceString("ParagraphSupport.CommandLabel.P"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H1"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H2"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H3"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H4"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H5"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H6"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.PRE") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-	};
-
-	/**
-	 * @param man
-	 * @param range
-	 * @param viewer
-	 */
-	public static void createParagraphActions(IMenuManager man,
-			DesignRange range, IHTMLGraphicalViewer viewer) {
-		ParagraphStyleAction action = new NoneParagraphStyleAction(
-				PDPlugin
-						.getResourceString("ParagraphSupport.CommandLabel.None"), tags, null, IAction.AS_CHECK_BOX); //$NON-NLS-1$
-		action.setViewer(viewer);
-		action.update();
-		man.add(action);
-		for (int i = 1; i < labels.length; i++) {
-			action = new ParagraphStyleAction(labels[i], tags[i], null,
-					IAction.AS_CHECK_BOX);
-			action.setViewer(viewer);
-			action.update();
-			man.add(action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java
deleted file mode 100644
index 42c17aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.link.MakeLinkAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editors.actions.DesignActionBarFactory;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.actions.ActionGroup;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeActionGroup extends ActionGroup {
-    // TODO: what is this?  a separator?
-	private static final Action action = new Action() {
-        // Action is abstract but has no abstract methods
-        // so create a default empty action that does nothing
-	};
-
-	/**
-	 * 
-	 */
-	public RangeActionGroup() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu) 
-    {
-		DesignRange selection = fixUpSelection(getContext().getSelection());
-		if (selection == null) {
-			return;
-		}
-        IContributionItem styleSubMenuItem = 
-            contextMenu.find(PageDesignerActionConstants.STYLE_SUBMENU_ID);
-        
-        if (styleSubMenuItem instanceof IMenuManager)
-        {
-            final IMenuManager subMenu = (IMenuManager) styleSubMenuItem;
-    		if (getContext().getInput() instanceof IHTMLGraphicalViewer) {
-    			addParagraphFormatMenu(subMenu, selection,
-    					(IHTMLGraphicalViewer) getContext().getInput());
-    			addHorizontalAlignMenu(subMenu, selection,
-    					(IHTMLGraphicalViewer) getContext().getInput());
-    			addTextStyleMenu(subMenu, (IHTMLGraphicalViewer) getContext()
-    					.getInput());
-    		}
-            // TODO: the (commented out) copy of this method does nothing
-    		//addListModeMenu(menu, selection);
-    
-    		// TODO: the (commented out) copy of this method does nothing
-            //addTextFontMenu(menu, selection);
-    
-    		addLinkMenu(subMenu, selection);
-        }
-    }
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	private DesignRange fixUpSelection(ISelection selection) {
-		if (selection instanceof DesignRange) {
-			return (DesignRange) selection;
-		}
-        return null;
-	}
-
-	private void addLinkMenu(IMenuManager menu, final DesignRange selection) {
-		Action action1 = new MakeLinkAction(selection);
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, action1);
-	}
-
-	private void addTextStyleMenu(IMenuManager menu,
-			final IHTMLGraphicalViewer viewer) {
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.TextStyle"));//$NON-NLS-1$
-		submenu.add(action);
-
-		submenu.setRemoveAllWhenShown(true);
-		submenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				DesignerToolBarAction action1 = null;
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_U);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_B);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_I);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_SMALL);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_BIG);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-//	private void addTextFontMenu(IMenuManager menu, DesignRange selection) {
-//	    //
-//	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-	private void addHorizontalAlignMenu(IMenuManager menu,
-			final DesignRange selection, final IHTMLGraphicalViewer viewer) {
-		// we have to initialize align nodes here for some refresh problem
-		Element[] alignNodes = new Element[4];
-		final String[] alignValues = new String[] { "left", "center", "right", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				"justify" }; //$NON-NLS-1$
-		Document document = viewer.getModel().getDocument();
-		for (int i = 0; i < 4; i++) {
-			Element node = document.createElement(IHTMLConstants.TAG_P);
-			node.setAttribute(IHTMLConstants.ATTR_ALIGN, alignValues[i]);
-			alignNodes[i] = node;
-		}
-		AlignSupport.setAlignNodes(alignNodes);
-
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.Align"));//$NON-NLS-1$
-		submenu.add(action);
-		submenu.setRemoveAllWhenShown(true);
-		submenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				AlignSupport.createAlignActions(submenu, viewer);
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-
-	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-//	private void addListModeMenu(IMenuManager menu, DesignRange selection) {
-//	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-	private void addParagraphFormatMenu(IMenuManager menu,
-			final DesignRange selection, final IHTMLGraphicalViewer viewer) {
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.ParagraphFormat"));//$NON-NLS-1$
-		submenu.add(action);
-		// Add the submenu.
-
-		submenu.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				submenu.removeAll();
-				ParagraphSupport.createParagraphActions(submenu, selection,
-						viewer);
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java
deleted file mode 100644
index 2346403..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeStyleAction extends Action {
-	/**
-	 * @param text
-	 * @param range 
-	 * @param htmlTag 
-	 * @param cssProperty 
-	 * @param cssValue 
-	 */
-	public RangeStyleAction(String text, DesignRange range, String htmlTag,
-			String cssProperty, String cssValue) {
-		super(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (isChecked()) {
-			// un-apply the style here
-		} else {
-			// apply the style here.
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java
deleted file mode 100644
index e4e13ad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeStyleSupport {
-	private static final String[] ActionLabel = new String[] {
-			PDPlugin.getResourceString("RangeStyleSupport.ActionLabel.Bold"),//$NON-NLS-1$
-			PDPlugin.getResourceString("RangeStyleSupport.ActionLabel.Italic"),//$NON-NLS-1$
-			PDPlugin
-					.getResourceString("RangeStyleSupport.ActionLabel.Underline"), }; //$NON-NLS-1$
-
-	private static final String[] HtmlTag = new String[] { "STRONG", "I", "U", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	private static final String[] CSSProperty = new String[] {
-			"font-weight", "font-style", "text-decoration", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	private static final String[] CSSValue = new String[] { "bolder", "italic", //$NON-NLS-1$ //$NON-NLS-2$
-			"underline", }; //$NON-NLS-1$
-
-	/**
-	 * @param menu
-	 * @param range
-	 */
-	public static void createRangeStyleActions(IMenuManager menu,
-			DesignRange range) {
-		for (int i = 0; i < ActionLabel.length; i++) {
-			RangeStyleAction action = new RangeStyleAction(ActionLabel[i],
-					range, HtmlTag[i], CSSProperty[i], CSSValue[i]);
-
-			menu.add(action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleAction.java
deleted file mode 100644
index 1723662..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BorderStyleAction extends Action {
-
-	/**
-	 * @param stylevalue
-	 * @param ele
-	 * @param text
-	 * 
-	 */
-	public BorderStyleAction(String text, IDOMElement ele, String stylevalue) {
-		super(text);
-		// TODO Auto-generated constructor stub
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeAttributeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeAttributeAction.java
deleted file mode 100644
index 7595da6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeAttributeAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeAttributeAction extends Action {
-	IDOMElement _ele;
-
-	String _attrValue;
-
-	private String _attrName;
-
-	/**
-	 * @param label 
-	 * @param ele
-	 * @param attrName 
-	 * @param attrValue 
-	 */
-	public ChangeAttributeAction(String label, IDOMElement ele,
-			String attrName, String attrValue) {
-		super(label);
-		this._ele = ele;
-		this._attrName = attrName;
-		this._attrValue = attrValue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (this.isChecked()) {
-			return;
-		}
-
-		ChangeAttributeCommand c = new ChangeAttributeCommand(
-				PDPlugin
-						.getResourceString("ChangeAttributeAction.CommandLabel.ChangeStyleClass"), _ele, _attrName, _attrValue); //$NON-NLS-1$
-		c.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStyleAction.java
deleted file mode 100644
index 272dd4f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStyleAction.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.ui.dialogs.StyleDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeStyleAction extends Action {
-	private static final String MY_TEXT = PDPlugin
-			.getResourceString("ChangeStyleAction.Text"); //$NON-NLS-1$
-
-	private ElementEditPart _editPart;
-
-	private IDOMElement _element;
-
-	/**
-	 * @param part
-	 * @param ele
-	 */
-	public ChangeStyleAction(ElementEditPart part, IDOMElement ele) {
-		super(MY_TEXT);
-		this._editPart = part;
-		this._element = ele;
-	}
-
-	public void run() {
-		ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) this._element)
-				.getStyle();
-		PreferenceManager manager = new PreferenceManager();
-		EditPartViewer viewer = this._editPart.getViewer();
-		Shell shell = viewer.getControl().getShell();
-
-		CSSPropertyContext context = new CSSPropertyContext(styleDeclaration);
-		StyleDialog dialog = new StyleDialog(shell, manager, _element, context);
-		if (dialog.open() == Window.OK) {
-			if (context.isModified()) {
-				ChangeStyleCommand c = new ChangeStyleCommand(_element, context);
-				c.execute();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStylePropertyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStylePropertyAction.java
deleted file mode 100644
index 1fef76f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStylePropertyAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeStylePropertyAction extends Action {
-	private IDOMElement _ele;
-
-	private String _cssProperty;
-
-	private String _cssValue;
-
-	/**
-	 * @param text
-	 * @param ele 
-	 * @param cssProperty 
-	 * @param cssValue 
-	 */
-	public ChangeStylePropertyAction(String text, IDOMElement ele,
-			String cssProperty, String cssValue) {
-		super(text);
-		this._ele = ele;
-		this._cssProperty = cssProperty;
-		this._cssValue = cssValue;
-	}
-
-	public void run() {
-		if (isChecked()) {
-			return;
-		}
-
-		Map map = new HashMap();
-		map.put(_cssProperty, _cssValue);
-		ChangeStyleCommand command = new ChangeStyleCommand(_ele, map);
-		command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ColorSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ColorSupport.java
deleted file mode 100644
index d253dd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ColorSupport.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class ColorSupport {
-	static final String[] COLOR_VALUES = new String[] {
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Aqua"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Black"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Blue"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Fuchsia"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Gray"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Green"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Lime"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Maroon"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Navy"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Olive"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Orange"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Purple"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Red"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Silver"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Teal"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.White"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Yellow") //$NON-NLS-1$
-	};
-
-	/**
-	 * 
-	 * @param menu
-	 * @param ele
-	 * @param cssProperty
-	 *            will be "color" or "background-color"
-	 */
-	static void createColorActions(IMenuManager menu, IDOMElement ele,
-			String cssProperty) {
-		boolean needAdditional = true;
-		String currentValue = DOMStyleUtil.getInlineStyleProperty(ele,
-				cssProperty);
-		ChangeStylePropertyAction defaultAction = new ChangeStylePropertyAction(
-				PDPlugin.getResourceString("ColorSupport.CommandLabel.Default"), ele, cssProperty, null); //$NON-NLS-1$
-		if (currentValue == null || currentValue.length() == 0) {
-			defaultAction.setChecked(true);
-			needAdditional = false;
-		}
-		menu.add(defaultAction);
-		menu.add(new Separator());
-		for (int i = 0; i < COLOR_VALUES.length; i++) {
-			ChangeStylePropertyAction action = new ChangeStylePropertyAction(
-					COLOR_VALUES[i], ele, cssProperty, COLOR_VALUES[i]);
-			if (COLOR_VALUES[i].equalsIgnoreCase(currentValue)) {
-				action.setChecked(true);
-				needAdditional = false;
-			}
-			menu.add(action);
-		}
-
-		if (needAdditional) {
-			ChangeStylePropertyAction action = new ChangeStylePropertyAction(
-					currentValue, ele, cssProperty, currentValue);
-			action.setChecked(true);
-			menu.add(action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/Messages.java
deleted file mode 100644
index 8ca7772..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/Messages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.actions.single.messages"; //$NON-NLS-1$
-
-	/**
-	 * see messages.properties
-	 */
-	public static String SelectParentAction_MenuTextNoParent;
-	/**
-	 * see messages.properties
-	 */
-	public static String SelectParentAction_MenuTextParent;
-	/**
-	 * see messages.properties
-	 */
-	public static String SingleElementActionGroup_ChildrenActionText;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java
deleted file mode 100644
index 2cb2299..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class SelectEditPartAction extends Action {
-    
-    /**
-     * @param text
-     * @param forThisPart
-     * @return a convience object when the edit part that needs selection
-     * is already known when the action is constructed
-     */
-    public static SelectEditPartAction create(final String text, final EditPart forThisPart)
-    {
-        return new SelectEditPartAction(text)
-        {
-            protected EditPart getNewSelection() {
-                return forThisPart;
-            }
-        };
-    }
-
-	/**
-	 * @param text
-	 */
-	protected SelectEditPartAction(String text) {
-		super(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-        final EditPart newSelection = getNewSelection();
-        newSelection.getViewer().setSelection(new StructuredSelection(newSelection));
-	}
-    
-    /**
-     * @return the EditPart onto which selection should be applied.
-     */
-    protected abstract EditPart getNewSelection();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java
deleted file mode 100644
index 5724e31..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.w3c.dom.Node;
-
-/**
- * An edit part selection action that corresponds to a Node selection
- */
-public abstract class SelectNodeAction extends SelectEditPartAction 
-{
-    private final Node  _node;
-
-    /**
-     * @param text
-     * @param curNode
-     */
-    protected SelectNodeAction(String text, Node curNode) {
-        super(text);
-        _node = curNode;
-    }
-
-    /**
-     * @return the current node
-     */
-    protected Node getNode() {
-        return _node;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java
deleted file mode 100644
index 4a02abc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.osgi.util.NLS;
-import org.w3c.dom.Node;
-
-/**
- * Given a target node/edit part change selection to its parent
- * 
- * @author cbateman
- *
- */
-public class SelectParentAction extends SelectNodeAction {
-
-    private final EditPart _editPart;
-    
-    /**
-     * @param node
-     * @param editPart
-     * @return an action that will change focus selection to the parent
-     * part of node/editPart or a disabled one if there is no parent
-     */
-    public static SelectParentAction create(Node node, EditPart editPart)
-    {
-        Node parent = node.getParentNode();
-        
-        if (parent != null)
-        {
-            final String text = NLS.bind(Messages.SelectParentAction_MenuTextParent, parent.getNodeName()); 
-            return new SelectParentAction(text, node, editPart);
-        }
-        SelectParentAction action = new SelectParentAction(Messages.SelectParentAction_MenuTextNoParent, node, editPart); 
-        action.setEnabled(false);
-        return action;
-    }
-    
-    private SelectParentAction(String text, Node node, EditPart editPart)
-    {
-        super(text, node);
-        _editPart = editPart;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction#getNewSelection()
-     */
-    protected EditPart getNewSelection() 
-    {
-        return _editPart.getParent();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java
deleted file mode 100644
index 402a391..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * Group that constructs context menu items for a single selected element.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class SingleElementActionGroup extends ActionGroup {
-    // TODO: why?
-	private static final Action action = new Action() {
-        // create a default instance that does nothing
-        // Action is abstract but has no abstract methods
-        // run() on this object is a NOOP
-	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ElementEditPart part = fixUpSelection(getContext().getSelection());
-		if (part == null) {
-			return;
-		}
-		IDOMElement ele = (IDOMElement) part.getIDOMNode();
-        addPositionRelativeMenu(menu, part, ele);
-		addStylelMenu(menu, part, ele);
-
-		// next add element special actions
-		IElementEdit elementEdit = part.getElementEdit();
-		if (elementEdit != null) {
-			elementEdit.fillContextMenu(menu, ele);
-		}
-	}
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	private ElementEditPart fixUpSelection(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection sel = (IStructuredSelection) selection;
-			if (sel.size() != 1) {
-				return null;
-			}
-			if (sel.getFirstElement() instanceof ElementEditPart) {
-				return (ElementEditPart) sel.getFirstElement();
-			}
-		}
-		return null;
-	}
-
-    /**
-     * Add menu actions that select relative to the current position
-     * 
-     * @param menu
-     * @param part
-     * @param ele
-     */
-    private void addPositionRelativeMenu(IMenuManager menu, ElementEditPart part, IDOMElement ele)
-    {
-        IContributionItem subMenuItem = menu.find(PageDesignerActionConstants.SELECT_SUBMENU_ID);
-        
-        if (subMenuItem instanceof IMenuManager)
-        {
-            final IMenuManager subMenu = (IMenuManager) subMenuItem;
-    //        final IMenuManager selectMenu = new MenuManager(PDPlugin
-    //                .getResourceString("ActionGroup.Submenu.SelectRelative"));//$NON-NLS-1$
-            SelectParentAction  selectParentAction = SelectParentAction.create(ele, part);
-            // Eclipse UI guideline: 6.13
-            // even if there is no parent, a disabled action will be returned by
-            // create and this should be added to the menu
-            subMenu.add(selectParentAction);
-            
-            List children = new ArrayList();
-            for (Iterator it = part.getChildren().iterator(); it.hasNext();)
-            {
-                EditPart childPart = (EditPart) it.next();
-                
-                // only include selectable element edit part that are modelling
-                // XML elements in the source doc
-                if (childPart instanceof ElementEditPart
-                        && ((ElementEditPart)childPart).isSelectable()
-                        && ((ElementEditPart)childPart).getModel() instanceof Element)
-                {
-                    children.add(SelectNodeAction
-                            .create(((Element)((ElementEditPart)childPart).getModel()).getNodeName(), childPart));
-                }
-            }
-
-            
-            // don't add the select Children menu unless there are actually children
-            if (children.size() > 0)
-            {
-                MenuManager selectChildMenu = new MenuManager(Messages.SingleElementActionGroup_ChildrenActionText);
-                subMenu.add(selectChildMenu);
-
-                for (final Iterator it = children.iterator(); it.hasNext();)
-                {
-                    selectChildMenu.add((Action)it.next());
-                }
-            }
-            else
-            {   // Eclipse UI guideline 6.13
-                // create the child actions even if no children but make it
-                // a disabled option if no children
-                Action childrenAction = new Action(Messages.SingleElementActionGroup_ChildrenActionText){/* do nothing*/};
-                childrenAction.setEnabled(false);
-                subMenu.add(childrenAction);
-            }
-        }
-    }
-    
-	/**
-	 * @param menu
-	 * @param part
-	 */
-	private void addStylelMenu(IMenuManager menu, ElementEditPart part,
-			IDOMElement ele) {
-        IContributionItem subMenu = 
-            menu.find(PageDesignerActionConstants.STYLE_SUBMENU_ID);
-
-        if (subMenu instanceof IMenuManager)
-        {
-            final IMenuManager subMenuManager = 
-                (IMenuManager) subMenu;
-    		addStyle(subMenuManager, part, ele);
-    		addStyleClassesMenu(subMenuManager, part, ele);
-    
-    		if (DOMStyleUtil.supportStyleAttribute(ele)) {
-    			// addBorderStyleMenu(stylesub, part, ele);
-    			addColorMenu(subMenuManager, part, ele);
-    			addBackgroundMenu(subMenuManager, part, ele);
-    		}
-        }
-	}
-
-	/**
-	 * 
-	 * @param menu
-	 * @param part
-	 * @param ele
-	 */
-	private void addStyle(IMenuManager subMenu, ElementEditPart part,
-			IDOMElement ele) {
-        StyleSupport.createStyleAction(subMenu, part, ele);
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addStyleClassesMenu(IMenuManager subMenu,
-			ElementEditPart part, final IDOMElement ele) {
-		final IMenuManager classmenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.StyleClasses"));//$NON-NLS-1$
-		StyleClassSupport.createStyleClassActions(classmenu, ele);
-
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-                classmenu);
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addColorMenu(IMenuManager subMenu, ElementEditPart part,
-			final IDOMElement ele) {
-		final IMenuManager colorSub = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.Color"));//$NON-NLS-1$
-		colorSub.add(action);
-		colorSub.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				colorSub.removeAll();
-				ColorSupport.createColorActions(colorSub, ele,
-						ICSSPropertyID.ATTR_COLOR);
-			}
-		});
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-				colorSub);
-
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addBackgroundMenu(IMenuManager subMenu, ElementEditPart part,
-			final IDOMElement ele) {
-		final IMenuManager colorSub = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.BackgroundColor"));//$NON-NLS-1$
-		colorSub.add(action);
-		colorSub.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				colorSub.removeAll();
-				ColorSupport.createColorActions(colorSub, ele,
-						ICSSPropertyID.ATTR_BACKGROUND_COLOR);
-			}
-		});
-
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-				colorSub);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java
deleted file mode 100644
index 40264f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleClassSupport {
-	private final static String DEFAULT = PDPlugin
-			.getResourceString("StyleClassSupport.Default"); //$NON-NLS-1$
-
-	/**
-	 * @param classmenu
-	 * @param ele 
-	 */
-	public static void createStyleClassActions(IMenuManager classmenu,
-			IDOMElement ele) {
-		String styleClassAttr = getStyleClassAttributeName(ele);
-		if (styleClassAttr == null) {
-			return; // don't support style class
-		}
-		String styleClass = getStyleClass(ele);
-
-		boolean needAdditional = true;
-		ChangeAttributeAction action = new ChangeAttributeAction(DEFAULT, ele,
-				styleClassAttr, null);
-		if (styleClass == null || styleClass.length() == 0) {
-			action.setChecked(true);
-			needAdditional = false;
-		}
-		classmenu.add(action);
-		String[] classes = CSSUtil.getCSSClasses(ele.getOwnerDocument());
-		if (classes.length > 0) {
-			classmenu.add(new Separator());
-		}
-		for (int i = 0; i < classes.length; i++) {
-			ChangeAttributeAction action2 = new ChangeAttributeAction(
-					classes[i], ele, styleClassAttr, classes[i]);
-			if (classes[i].equalsIgnoreCase(styleClass)) {
-				action2.setChecked(true);
-				needAdditional = false;
-			}
-			classmenu.add(action2);
-		}
-		if (needAdditional) {
-			ChangeAttributeAction action2 = new ChangeAttributeAction(
-					styleClass, ele, styleClassAttr, styleClass);
-			action2.setChecked(true);
-			classmenu.add(action2);
-		}
-	}
-
-	/**
-	 * @param ele
-	 * @return the style class for ele or null if none
-	 */
-	public static String getStyleClass(IDOMElement ele) {
-		String styleClassAttr = getStyleClassAttributeName(ele);
-		if (styleClassAttr != null) {
-			return ele.getAttribute(styleClassAttr);
-		}
-        return null;
-	}
-
-	/**
-	 * FIXME: This is a temparary impelementation, with everything hard coded.
-	 * In the future, should have some INodeAdapter mechanism for each node to
-	 * tell the style class attribute name.
-	 * 
-	 * @param ele
-	 * @return the style class attribute name or null if none applies
-	 */
-	public static String getStyleClassAttributeName(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl == null) {
-			return null;
-		}
-		String taguri = CMUtil.getTagURI(decl);
-		if (taguri == null || ITLDConstants.URI_HTML.equals(taguri)) {
-			if (decl.getAttributes().getNamedItem("class") != null) { //$NON-NLS-1$
-				return "class"; //$NON-NLS-1$
-			}
-            return null;
-		} else if (decl.getAttributes().getNamedItem("styleClass") != null) { //$NON-NLS-1$
-			return "styleClass"; //$NON-NLS-1$
-		} else if (decl.getAttributes().getNamedItem("class") != null) { //$NON-NLS-1$
-			return "class"; //$NON-NLS-1$
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java
deleted file mode 100644
index e32abab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class StyleSupport {
-	/**
-	 * @param menu
-	 * @param part
-	 * @param ele
-	 */
-	public static void createStyleAction(IMenuManager menu,
-			ElementEditPart part, IDOMElement ele) {
-		if (part == null) {
-			return;
-		}
-		if (hasStyleAttribute(ele)) {
-			IAction action = new ChangeStyleAction(part, ele);
-			menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, action);
-		}
-	}
-
-	private static boolean hasStyleAttribute(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl == null) {
-			return false;
-		}
-		if (decl.getAttributes().getNamedItem("style") != null) { //$NON-NLS-1$
-			return true;
-		}
-		return false;
-	}
-	
-	private StyleSupport()
-	{
-		// util class; no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/messages.properties
deleted file mode 100644
index 3b36f16..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-SelectParentAction_MenuTextNoParent=Parent
-SelectParentAction_MenuTextParent=Parent ({0})
-SingleElementActionGroup_ChildrenActionText=Children
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableActionGroup.java
deleted file mode 100644
index f076978..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableActionGroup.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.table;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableActionGroup extends ActionGroup {
-	// TODO: I think there's a pattern emerging...
-    private final static Action action = new Action() {
-        // create an empty no-op
-	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ISelection selection = this.getContext().getSelection();
-
-		EditPart part = findCommonAncesterPart(selection);
-		if (part == null) {
-			return;
-		}
-
-		TableOperationContext context = TableOperationContext
-				.getTableOperationContext(part);
-		if (context == null) {
-			return;
-		}
-
-		final ElementEditPart tablePart = context.getTablePart();
-
-		if (tablePart == null || !supportTableActions(tablePart)) {
-			return;
-		}
-
-		final int cellRow = context.getRowIndex();
-		final int cellColumn = context.getColumnIndex();
-
-		String tag = ((IDOMElement) tablePart.getIDOMNode()).getLocalName();
-		final IMenuManager tableMenu = new MenuManager(tag);
-
-		// ok, we passed the checking, now let's create the actions.
-		tableMenu.add(action);
-		tableMenu.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				tableMenu.removeAll();
-				fillTableMenu(tablePart, cellRow, cellColumn, tableMenu);
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER,
-				tableMenu);
-	}
-
-	/**
-	 * @param tablePart
-	 * @param cellRow
-	 * @param cellColumn
-	 * @param tableMenu
-	 */
-	private void fillTableMenu(ElementEditPart tablePart, int cellRow,
-			int cellColumn, IMenuManager tableMenu) {
-		SelectEditPartAction action1 = SelectEditPartAction.create(
-				PDPlugin
-						.getResourceString("TableActionGroup.Submenu.SelectTable"), tablePart);//$NON-NLS-1$
-		tableMenu.add(action1);
-
-		tableMenu.add(new Separator());
-
-		{
-			InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertRowBefore"),//$NON-NLS-1$
-					tablePart, cellRow, true, true);
-			tableMenu.add(insertRowBeforeAction);
-
-			InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertRowAfter"),//$NON-NLS-1$
-					tablePart, cellRow, true, false);
-			tableMenu.add(insertRowAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertColumnBefore"),//$NON-NLS-1$
-					tablePart, cellColumn, true, true);
-			tableMenu.add(insertColumnBeforeAction);
-
-			InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertColumnAfter"),//$NON-NLS-1$
-					tablePart, cellColumn, true, false);
-			tableMenu.add(insertColumnAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.DeleteRow"),//$NON-NLS-1$
-					tablePart, cellRow, true);
-			tableMenu.add(deleteRowAction);
-
-			DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.DeleteColumn"),//$NON-NLS-1$
-					tablePart, cellColumn, false);
-			tableMenu.add(deleteColumnAction);
-		}
-	}
-
-	/**
-	 * @param tablePart
-	 * @return
-	 */
-	private boolean supportTableActions(ElementEditPart tablePart) {
-	    // TODO: what's the point of this method?
-        // it's only used in one place and always resolves to the same value..
-		return true;
-	}
-
-	/**
-	 * Give a selection, find a single common container node as start for table
-	 * related operations.
-	 * 
-	 * @param selection
-	 * @return
-	 */
-	private EditPart findCommonAncesterPart(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structsel = (IStructuredSelection) selection;
-			if (structsel.size() != 1) {
-				return null;
-			} else if (structsel.getFirstElement() instanceof EditPart) {
-				return (EditPart) structsel.getFirstElement();
-			} else {
-				return null;
-			}
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			if (!range.isValid()) {
-				return null;
-			}
-			if (range.isEmpty()) {
-				DesignPosition position = range.getStartPosition();
-				if (position.getOffset() == 0) {
-					return position.getContainerPart();
-				}
-                return position.getSiblingEditPart(true);
-			}
-            return RangeUtil.findCommonAncestor(range);
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableOperationContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableOperationContext.java
deleted file mode 100644
index 0981ed3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableOperationContext.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.table;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableCellLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.css2.layout.table.TableCellInfo;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableOperationContext {
-	private ElementEditPart _tablePart;
-
-	private int _rowIndex;
-
-	private int _columnIndex;
-
-	/**
-	 * @param part
-	 * @return the operation context for part
-	 */
-	public static TableOperationContext getTableOperationContext(EditPart part) {
-		EditPart originalPart = part;
-		ElementEditPart tablePart = null;
-		CSSTableLayout2 tableLayout = null;
-
-		while (part.getParent() instanceof ElementEditPart) {
-			part = part.getParent();
-			IFigure figure = ((GraphicalEditPart) part).getFigure();
-
-			if (figure.getLayoutManager() instanceof CSSTableLayout2) {
-				tableLayout = (CSSTableLayout2) figure.getLayoutManager();
-				tablePart = ((ElementEditPart) part);
-				break;
-			}
-		}
-		if (tablePart == null) {
-			return null;
-		}
-
-		part = originalPart;
-
-		IFigure figure = ((GraphicalEditPart) originalPart).getFigure();
-		while (figure instanceof CSSFigure) {
-			if (figure.getLayoutManager() instanceof CSSTableCellLayout) {
-				CSSTableCellLayout cellLayout = (CSSTableCellLayout) figure
-						.getLayoutManager();
-				if (cellLayout.getTableLayout() == tableLayout) {
-					// ok, we found.
-					TableCellInfo cellInfo = cellLayout.getTableCellInfo();
-					if (cellInfo == null) {
-						return null;
-					}
-                    TableOperationContext context = new TableOperationContext();
-                    context._tablePart = tablePart;
-                    context._rowIndex = cellInfo.getRowIndex();
-                    context._columnIndex = cellInfo.getColumnIndex();
-                    return context;
-				}
-                return null;
-			}
-			figure = figure.getParent();
-		}
-		return null;
-	}
-
-    ElementEditPart getTablePart() {
-        return _tablePart;
-    }
-
-    int getRowIndex() {
-        return _rowIndex;
-    }
-
-    int getColumnIndex() {
-        return _columnIndex;
-    }
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java
deleted file mode 100644
index 34dfb61..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.adapters;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This is an adapter interface. Will be adapted to all the node in the
- * document. It provides additional information to support designer.
- * 
- * Basicaly it tells the correspoinding node's body related information.
- * 
- * @author mengbo
- */
-// XXX: in the future will use adapter mechanism to support dynamic information
-public interface IBodyInfo // extends INodeAdapter
-{
-	// /**
-	// * whether this node is runtime visible.
-	// *
-	// * @return
-	// */
-	// public boolean isRuntimeVisible(INodeNotifier node);
-	//    
-	// /**
-	// * whether this node is design time visible.
-	// * @return
-	// */
-	// public boolean isDesignTimeVisible(INodeNotifier node);
-
-	// /**
-	// * whether is HTML tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isHTML(IDOMNode node);
-	//    
-	// /**
-	// * whether is JSP tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isJSP(IDOMNode node);
-	//    
-	// /**
-	// * whether is custom tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isCustomTag(IDOMNode node);
-	//    
-	// /**
-	// * for custom tag, there may have a corresponding HTML tag name.
-	// * This can be used for content model validation.
-	// *
-	// * @param node
-	// * @return
-	// */
-	// public String getCorrespondingHTMLTag(IDOMNode node);
-
-	/**
-	 * whether this node is body node. We treat the document node and certain
-	 * element node like "HTML", "BODY", "f:view", "f:subview" as body node. At
-	 * design time we may want to move those visual node into the body.
-	 * 
-	 * @param node 
-	 * @return true if node is a body container
-	 */
-	public boolean isBodyContainer(IDOMNode node);
-
-	/**
-	 * this method should only be called isBodyContainer return true; It checks
-	 * whether the uri/localname should belong to the head part of this body
-	 * container.
-	 * 
-	 * @param node 
-	 * @param uri
-	 * @param localname
-	 * @return true if node is a header
-	 */
-	public boolean isBodyHeader(IDOMNode node, String uri, String localname);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java
deleted file mode 100644
index c969a15..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.adapters.internal;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-// XXX: currently hard coded as singleton implementation,
-// it is believed in the future will not use singleton, because
-// we want to dynamically support other taglibs.
-public class BodyInfo implements IBodyInfo {
-	private static final BodyInfo _instance = new BodyInfo();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.adapters.IDesignInfo#isBodyContainer(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	public boolean isBodyContainer(IDOMNode node) {
-		switch (node.getNodeType()) {
-		case Node.DOCUMENT_FRAGMENT_NODE:
-		case Node.DOCUMENT_NODE:
-			return true;
-		case Node.ELEMENT_NODE:
-			return isBodyContainerElement((Element) node);
-		default:
-			return false;
-		}
-	}
-
-	/**
-	 * @param element
-	 * @return
-	 */
-	private boolean isBodyContainerElement(Element element) {
-		String localname = element.getLocalName();
-		/*
-		 * String namespaceURI = CMUtil.getElementNamespaceURI(element); if
-		 * (IJMTConstants.URI_HTML.equals(namespaceURI)) { return
-		 * "html".equalsIgnoreCase(localname) ||
-		 * "body".equalsIgnoreCase(localname); } if
-		 * (IJMTConstants.URI_JSF_CORE.equals(namespaceURI)) { return
-		 * "view".equals(localname) || "subview".equals(localname); }
-		 */
-		return IHTMLConstants.TAG_HTML.equalsIgnoreCase(localname)
-				|| IHTMLConstants.TAG_BODY.equalsIgnoreCase(localname)
-				|| IJSFConstants.TAG_VIEW.equals(localname)
-				|| IJSFConstants.TAG_SUBVIEW.equals(localname);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.adapters.IDesignInfo#isBodyHeader(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public boolean isBodyHeader(IDOMNode node, String uri, String localname) {
-		switch (node.getNodeType()) {
-		case Node.DOCUMENT_FRAGMENT_NODE:
-		case Node.DOCUMENT_NODE:
-			return isDocumentHeader(uri, localname);
-		case Node.ELEMENT_NODE:
-			return isElementHeader((Element) node, uri, localname);
-		default:
-			return false;
-		}
-	}
-
-	/**
-	 * @param element
-	 * @param uri
-	 * @param localname
-	 * @return
-	 */
-	private boolean isElementHeader(Element element, String uri,
-			String localname) {
-		String elelocalname = element.getLocalName();
-		String namespaceURI = CMUtil.getElementNamespaceURI(element);
-		if (ITLDConstants.URI_HTML.equals(namespaceURI)
-				&& IHTMLConstants.TAG_HTML.equalsIgnoreCase(elelocalname)) {
-			return IHTMLConstants.TAG_HEAD.equalsIgnoreCase(localname);
-		}
-		if (ITLDConstants.URI_JSF_CORE.equals(namespaceURI)
-				&& IJSFConstants.TAG_VIEW.equalsIgnoreCase(elelocalname)) {
-			return IJSFConstants.TAG_LOADBUNDLE.equalsIgnoreCase(localname);
-		}
-		return false;
-	}
-
-	/**
-	 * @param uri
-	 * @param localname
-	 * @return
-	 */
-	private boolean isDocumentHeader(String uri, String localname) {
-		// FIXME: temparary commented out, since the dragged node do not have
-		// uri information for now.
-		// if (IJMTConstants.URI_JSP.equals(uri))
-		return IJSPCoreConstants.TAG_DIRECTIVE_PAGE.equals(localname)
-				|| IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB.equals(localname);
-
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static IBodyInfo getInstance() {
-		return _instance;
-	}
-
-	private BodyInfo()
-	{
-	    // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java
deleted file mode 100644
index c618210..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * This is when user control+mouse drag. Can also be used in other places.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CloneNodeCommand extends DesignerCommand {
-	IDOMPosition _insertPosition;
-
-	Node _originalNode;
-
-	Node _resultNode;
-
-	/**
-	 * @param viewer
-	 * @param insertionPoint 
-	 * @param originalNode 
-	 */
-	public CloneNodeCommand(IHTMLGraphicalViewer viewer,
-			IDOMPosition insertionPoint, Node originalNode) {
-		super(
-				CommandResources.getString("CloneNodeCommand.Label.CloneNode"), viewer); //$NON-NLS-1$
-		this._insertPosition = insertionPoint;
-		this._originalNode = originalNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		Node newNode = DOMUtil.cloneNodeDeep(this.getDocument(), _originalNode);
-		DOMUtil.insertNode(_insertPosition, newNode);
-		_resultNode = newNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_resultNode);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java
deleted file mode 100644
index c18db16..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommandResources {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.commands.CommandResources"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private CommandResources() {
-        // no local instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the resource value for key or  !key! if not foudnd
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties
deleted file mode 100644
index 3e3464b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties
+++ /dev/null
@@ -1,33 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-PasteNodeCommand.Label.DeleteNode=Delete Node
-CutNodeCommand.Label.CutNode=Cut Node
-DeleteNodeCommand.Label.DeleteNode=Delete Node
-DeleteAction.CommandLabel.Delete=Delete
-TableDeleteColumnCommand.Label.DeleteColumn=Delete Column
-TableInsertColumnCommand.Label.InsertColumn=Insert Column
-TableResizeColumnCommand.Label.ResizeColumn=Resize Column
-TableInsertColumnCommand.Text.Default=Cell
-TableResizeRowCommand.Label.ResizeColumn=Resize Column
-TableDeleteRowCommand.Label.DeleteRow=Delete Row
-TableInsertRowCommand.Label.InsertRow=Insert Row
-TableDeleteHeaderFooterCommand.Label.DeleteHeader=Delete Header
-TableDeleteHeaderFooterCommand.Label.DeleteFooter=Delete Footer
-TableInsertHeaderFooterCommand.Label.InsertHeader=Insert Header
-TableInsertHeaderFooterCommand.Label.InsertFooter=Insert Footer
-PasteCommand.Label.Paste=Paste
-DeleteCommand.Label.Delete=Delete
-CutCommand.Label.Cut=Cut
-CopyCommand.Label.Copy=Copy
-ApplyStyleCommand.Label.ApplyStyle=Apply Style
-ChangeStyleCommand.Label.ChangeStyle=Change Style
-MoveNodeCommand.Label.MoveNode=Move Node
-CloneNodeCommand.Label.CloneNode=Copy Node
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java
deleted file mode 100644
index 2502ac3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.range.CopyCommand;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CopyAction extends DesignAction implements UpdateAction {
-	/**
-	 * @param editor
-	 */
-	public CopyAction(GraphicalEditor editor) {
-		super(editor, PDPlugin.getResourceString("Action.Name.Copy"));//$NON-NLS-1$
-		// this.setAccelerator(SWT.CTRL | SWT.INSERT);
-		// this.setActionDefinitionId(ITextEditorActionDefinitionIds.CUT);
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new CopyCommand(viewer);
-			command.execute();
-		} else {
-			Command nodeCopy = new CopyNodeCommand(viewer);
-			nodeCopy.execute();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null) {
-			if (viewer.isInRangeMode()
-					&& !EditModelQuery.isSame(viewer.getRangeSelection())) {
-				return true;
-			} else if (!viewer.isInRangeMode()
-					&& viewer.getSelectedEditParts().size() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		this.setEnabled(isEnabled());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java
deleted file mode 100644
index ebc766c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.w3c.dom.Node;
-
-/**
- * As copy operation won't change anything in the current document, so it is not
- * extending from DesignerCommand.
- * 
- * @author mengbo
- */
-public class CopyNodeCommand extends Command {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param viewer
-	 */
-	public CopyNodeCommand(IHTMLGraphicalViewer viewer) {
-		super(""); //$NON-NLS-1$
-		this._viewer = viewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	public void execute() {
-		List parts = _viewer.getSelectedEditParts();
-		Vector result = new Vector();
-		if (parts.size() > 0) {
-			for (int i = 0, n = parts.size(); i < n; i++) {
-				EditPart part = (EditPart) parts.get(i);
-				Object model = part.getModel();
-				if (model instanceof Node) {
-					EditValidateUtil.validNode((Node) model);
-					result.add(((Node) model).cloneNode(true));
-				}
-			}
-			setClipboard(result);
-		}
-	}
-
-	private void setClipboard(Vector result) {
-		Node[] nodes = (Node[]) result.toArray(new Node[result.size()]);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0, size = nodes.length; i < size; i++) {
-			DOMUtil.nodeToString(nodes[i], sb);
-		}
-		// TemplateTransfer.getInstance().setObject(result);
-		Clipboard board = new Clipboard(_viewer.getControl().getDisplay());
-		board.setContents(new Object[] { result, sb.toString() },
-				new Transfer[] { TemplateTransfer.getInstance(),
-						TextTransfer.getInstance() });
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java
deleted file mode 100644
index e19bb0a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class CreateItemCommand extends DesignerCommand implements ICustomizableCommand 
-{
-    private final IDOMPosition _position;
-    private final IDropSourceData _creationProvider;
-    private Element _ele;
-    private IAdaptable _customizationData;
-
-    /**
-     * @param label
-     * @param model
-     * @param position
-     * @param creationProvider
-     */
-    public CreateItemCommand(String label, IDOMModel model,
-            IDOMPosition position, IDropSourceData creationProvider) {
-        super(label, model.getDocument());
-        this._position = position;
-        this._creationProvider = creationProvider;
-    }
-
-    /**
-     * @return the dom position for the drop
-     */
-    public IDOMPosition getPosition()
-    {
-        return _position;
-    }
-
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-     */
-    protected void doExecute() 
-    {
-        Element element = CommandUtil.executeInsertion(
-                _creationProvider,
-                getModel(), this._position, this._customizationData);
-        if (element != null) 
-        {
-            formatNode(element);
-        }
-        this._ele = element;
-    }
-
-    @Override
-    protected void postPostExecute() 
-    {
-        // during JUnit testing, we may not have viewer.
-        // this will cause us not to have undo support,
-        // but should not effect testing for this command
-        if (getViewer() != null)
-        {
-            super.postPostExecute();
-        }
-    }
-
-    @Override
-    protected boolean prePreExecute() 
-    {
-        // during JUnit testing, we may not have viewer.
-        // this will cause us not to have undo support,
-        // but should not effect testing for this command
-        if (getViewer() != null)
-        {
-            return super.prePreExecute();
-        }
-        
-        return true;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @seeorg.eclipse.jst.pagedesigner.commands.DesignerCommand#
-     * getAfterCommandDesignerSelection()
-     */
-    protected ISelection getAfterCommandDesignerSelection() {
-        return toDesignSelection(_ele);
-    }
-
-    /**
-     * @param customizationData
-     */
-    public void setCustomizationData(IAdaptable customizationData) 
-    {
-        _customizationData = customizationData;
-    }
-    
-    /**
-     * This method is for test purposes and should generally not be 
-     * used by clients.
-     * 
-     * @return the customization data
-     */
-    protected final IAdaptable getCustomizationData()
-    {
-        return _customizationData;
-    }
-    
-    /**
-     * @return the result of the command execution
-     * TODO: add Object getResult() method to DesignerCommand
-     */
-    protected Element getResult()
-    {
-        return this._ele;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutAction.java
deleted file mode 100644
index 3617aec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.range.CutCommand;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CutAction extends DesignAction implements UpdateAction {
-	/**
-	 * @param editor
-	 */
-	public CutAction(GraphicalEditor editor) {
-		super(editor, PDPlugin.getResourceString("Action.Name.Cut"));//$NON-NLS-1$
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new CutCommand(viewer);
-			command.execute();
-		} else {
-			command = new CutNodeCommand(viewer);
-			command.execute();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null) {
-			if (viewer.isInRangeMode()
-					&& !EditModelQuery.isSame(viewer.getRangeSelection())) {
-				return true;
-			} else if (!viewer.isInRangeMode()
-					&& viewer.getSelectedEditParts().size() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		setEnabled(isEnabled());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutNodeCommand.java
deleted file mode 100644
index 006629a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutNodeCommand.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class CutNodeCommand extends DesignerCommand {
-	private static final String COMMAND_LABEL = CommandResources
-			.getString("CutNodeCommand.Label.CutNode"); //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List parts = getViewer().getSelectedEditParts();
-		Vector result = new Vector();
-		if (parts.size() > 0) {
-			for (int i = 0, n = parts.size(); i < n; i++) {
-				EditPart part = (EditPart) parts.get(i);
-				Object model = part.getModel();
-				if (model instanceof Node) {
-					EditValidateUtil.validNode((Node) model);
-					Node parent = ((Node) model).getParentNode();
-					model = parent.removeChild((Node) model);
-					result.add(model);
-				}
-			}
-			setClipboard(result);
-		}
-	}
-
-	protected ISelection getAfterCommandDesignerSelection() {
-		return null;
-	}
-
-	/**
-	 * @param viewer
-	 */
-	public CutNodeCommand(IHTMLGraphicalViewer viewer) {
-		super(COMMAND_LABEL, viewer);
-	}
-
-	private void setClipboard(Vector result) {
-		Node[] nodes = (Node[]) result.toArray(new Node[result.size()]);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0, size = nodes.length; i < size; i++) {
-			DOMUtil.nodeToString(nodes[i], sb);
-		}
-		// TemplateTransfer.getInstance().setObject(result);
-		Clipboard board = new Clipboard(_viewer.getControl().getDisplay());
-		board.setContents(new Object[] { result, sb.toString() },
-				new Transfer[] { TemplateTransfer.getInstance(),
-						TextTransfer.getInstance() });
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteAction.java
deleted file mode 100644
index 3c89651..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.commands.range.DeleteCommand;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class DeleteAction extends DesignAction {
-	/**
-	 * @param editor
-	 */
-	public DeleteAction(GraphicalEditor editor) {
-		super(editor, CommandResources
-				.getString("DeleteAction.CommandLabel.Delete")); //$NON-NLS-1$
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new DeleteCommand(true, viewer);
-			command.execute();
-		} else {
-			command = new DeleteNodeCommand(viewer);
-			command.execute();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null) {
-			if (viewer.isInRangeMode()
-					&& !EditModelQuery.isSame(viewer.getRangeSelection())) {
-				return true;
-			} else if (!viewer.isInRangeMode()) {
-				int size = viewer.getSelectedEditParts().size();
-				if (size > 1) {
-					return true;
-				} else if (size == 1
-						&& !(viewer.getSelectedEditParts().get(0) instanceof DocumentEditPart)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteNodeCommand.java
deleted file mode 100644
index 71e529a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteNodeCommand.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DeleteNodeCommand extends DesignerCommand {
-	private static final String COMMAND_LABEL = CommandResources
-			.getString("DeleteNodeCommand.Label.DeleteNode"); //$NON-NLS-1$
-
-	private DesignRange _prevRange;
-
-	/**
-	 * @param viewer
-	 */
-	public DeleteNodeCommand(IHTMLGraphicalViewer viewer) {
-		super(COMMAND_LABEL, viewer);
-	}
-
-	protected void preExecute() {
-		_prevRange = _viewer.getRangeSelection();
-		DesignPosition position = findObjectModePosition();
-		_prevRange = new DesignRange(position, position);
-		super.preExecute();
-	}
-
-	private DesignPosition findObjectModePosition() {
-		DesignPosition result = null;
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = getCurrentObjectPosition();
-		if (position != null) {
-			if (!validator.isValidPosition(position)) {
-				result = null;
-			} else {
-				result = position;
-			}
-		}
-		return result;
-	}
-
-	private DesignPosition getCurrentObjectPosition() {
-		DesignRange result = null;
-		if (_viewer.isInRangeMode()) {
-			result = _viewer.getRangeSelection();
-		} else {
-			List parts = _viewer.getSelectedEditParts();
-			if (parts.size() > 0) {
-				EditPart selection = (EditPart) parts.get(0);
-				if (selection instanceof SubNodeEditPart) {
-					DesignPosition position = new DesignRefPosition(selection,
-							false);
-					position = DOMPositionHelper.toDesignPosition(EditHelper
-							.ensureDOMPosition(DOMPositionHelper
-									.toDOMPosition(position)));
-					result = new DesignRange(position, position);
-				}
-			}
-		}
-		return result != null && result.isValid() ? result.getEndPosition()
-				: null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List parts = getViewer().getSelectedEditParts();
-		for (int i = 0, n = parts.size(); i < n; i++) {
-			EditPart part = (EditPart) parts.get(i);
-			Object model = part.getModel();
-			if (model instanceof Node) {
-				EditValidateUtil.validNode((Node) model);
-				Node parent = ((Node) model).getParentNode();
-				model = parent.removeChild((Node) model);
-			}
-		}
-	}
-
-	protected ISelection getAfterCommandDesignerSelection() {
-		if (_prevRange.isValid()) {
-			return _prevRange;
-		}
-        return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignAction.java
deleted file mode 100644
index a92e225..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.editors.IDesignViewer;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public abstract class DesignAction extends Action implements UpdateAction {
-	private GraphicalEditor _editor;
-
-	/**
-	 * @param editor
-	 * @param text
-	 */
-	public DesignAction(GraphicalEditor editor, String text) {
-		super(text);
-		_editor = editor;
-	}
-
-	/**
-	 * @return Returns the _editor.
-	 */
-	protected GraphicalEditor getEditor() {
-		return _editor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		perform();
-		// Since the parameters don't affect, so they could be null, may change
-		// in the future
-		_editor.selectionChanged(null, null);
-	}
-
-	abstract void perform();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		setEnabled(isEnabled());
-	}
-
-	/**
-	 * @return the viewer
-	 */
-	protected IHTMLGraphicalViewer getViewer() {
-		return ((IDesignViewer) _editor).getGraphicViewer();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java
deleted file mode 100644
index e829767..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class DesignResizeComponentCommand extends Command {
-	private EditPart _part;
-
-	private Object _constraint;
-
-	private SourceViewer _viewer;
-
-	/**
-	 * @param child
-	 * @param constraint
-	 */
-	public DesignResizeComponentCommand(EditPart child, Object constraint) {
-		this._part = child;
-		this._constraint = constraint;
-		EditPart part = child;
-		if (part instanceof ScalableRootEditPart) {
-            // TODO: eh?
-            // do nothing I guess...
-		} else {
-			while (part != null
-					&& !(part.getParent() instanceof ScalableRootEditPart)) {
-				part = part.getParent();
-			}
-		}
-		if (part != null) {
-			EditPartViewer viewer = ((ScalableRootEditPart) part.getParent())
-					.getViewer();
-			HTMLEditor editor = ((HTMLEditor) ((DefaultEditDomain) ((IHTMLGraphicalViewer) viewer)
-					.getEditDomain()).getEditorPart());
-			_viewer = editor.getTextEditor().getTextViewer();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		Element element = ((Element) _part.getModel());
-		String width = element.getAttribute(ICSSPropertyID.ATTR_WIDTH);
-		// String height = element.getAttribute(ICSSPropertyID.ATTR_HEIGHT);
-		String originalStyle = element.getAttribute(ICSSPropertyID.ATTR_STYLE);
-		StringBuffer style;
-		if (originalStyle != null) {
-			originalStyle = this.removeOthers(originalStyle,
-					ICSSPropertyID.ATTR_WIDTH);
-			originalStyle = this.removeOthers(originalStyle,
-					ICSSPropertyID.ATTR_HEIGHT);
-			style = new StringBuffer(originalStyle);
-		} else {
-			style = new StringBuffer(50);
-		}
-		if (null == width) {
-			style.append(";").append(ICSSPropertyID.ATTR_WIDTH).append(":") //$NON-NLS-1$ //$NON-NLS-2$
-					.append(((Rectangle) _constraint).width).append(";"); //$NON-NLS-1$
-			style.append(ICSSPropertyID.ATTR_HEIGHT).append(":").append( //$NON-NLS-1$
-					((Rectangle) _constraint).height).append(""); //$NON-NLS-1$
-		}
-		element.setAttribute(ICSSPropertyID.ATTR_STYLE, style.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#redo()
-	 */
-	public void redo() {
-		_viewer.doOperation(ITextOperationTarget.REDO);
-	}
-
-	/**
-	 * @param style
-	 * @param item
-	 * @return ?
-	 */
-	public String removeOthers(String style, String item) {
-		String result = null;
-		int pos = style.indexOf(item);
-		if (pos < 0) {
-			return style;
-		}
-		int pos1 = pos;
-		if (pos > 0) {
-			if (style.charAt(pos - 1) == ';') {
-				pos--;
-			}
-		}
-		char ch = style.charAt(pos1);
-		while (!(ch == ';' || ch == '"' || ch == '\'')) {
-			pos1++;
-			if (pos1 >= style.length()) {
-				break;
-			}
-			ch = style.charAt(pos1);
-		}
-		if (pos1 < style.length()) {
-			result = style.substring(0, pos)
-					+ style.substring(pos1 + 1, style.length());
-		} else {
-			result = style.substring(0, pos);
-		}
-		if (result.indexOf(item) >= 0) {
-			return removeOthers(result, item);
-		}
-        return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		_viewer.doOperation(ITextOperationTarget.UNDO);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java
deleted file mode 100644
index 10d6c60..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This class is intended to be the base class for all designer GEF commands.
- * Basically, it will wrap the real command with common actions like handle
- * undo/redo, etc.
- * 
- * @author mengbo
- */
-public abstract class DesignerCommand extends Command {
-	private final IDOMModel _model;
-
-	/**
-	 * the graphical viewer
-	 */
-	protected IHTMLGraphicalViewer _viewer;
-
-	private static final Logger _log = PDPlugin
-			.getLogger(DesignerCommand.class);
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public DesignerCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label);
-		this._viewer = viewer;
-		this._model = viewer.getModel();
-	}
-
-	/**
-	 * @param label
-	 * @param node
-	 *            the node must be a node in the IHTMLGraphicalViewer.
-	 */
-	public DesignerCommand(String label, IDOMNode node) {
-	    this(label, (IDOMDocument) node.getOwnerDocument());
-	}
-
-	/**
-	 * @param label
-	 * @param document
-	 */
-	public DesignerCommand(String label, IDOMDocument document)
-	{
-	    super(label);
-        this._model = document.getModel();
-        EditPart part = (EditPart) document.getAdapterFor(EditPart.class);
-        if (part != null) {
-            this._viewer = (IHTMLGraphicalViewer) part.getViewer();
-        }
-	}
-	/**
-	 * @return the GEF viewer this command is targeted for
-	 * 
-	 */
-	public IHTMLGraphicalViewer getViewer() {
-		return _viewer;
-	}
-
-	/**
-	 * @return the DOM model that this command will effect
-	 */
-	public IDOMModel getModel() {
-		return _model;
-	}
-
-	/**
-	 * @return the dom document for the model this command will effect
-	 */
-	public IDOMDocument getDocument() {
-		return getModel().getDocument();
-	}
-
-	/**
-	 * executes the Command. This method should not be called if the Command is
-	 * not executable.
-	 */
-	public final void execute() {
-		boolean ok = prePreExecute();
-		if (ok) {
-			try {
-				preExecute();
-				doExecute();
-				postExecute();
-			} catch (Exception ex) {
-				handleException(ex);
-			} finally {
-				postPostExecute();
-			}
-		}
-	}
-
-	/**
-	 * child class can override.
-	 * 
-	 * @param ex
-	 */
-	protected void handleException(Exception ex) {
-		ex.printStackTrace();
-	}
-
-	/**
-	 * prePreExecute and postPostExecute is a pair. prePreExecute() SHOULD NOT
-	 * throw any exception, if it throw any exception, it should catch itself
-	 * and return false to indicate not continue.
-	 * @return true if execution should continue, false if should not 
-	 */
-	protected boolean prePreExecute() {
-		int position = -1;
-		int length = -1;
-		ISelection selection = getViewer().getSelection();
-		if (selection != null) {
-			if (getViewer().isInRangeMode()) {
-				DesignRange range = (DesignRange) selection;
-				if (range.isValid()) {
-					IDOMPosition domPos = DOMPositionHelper.toDOMPosition(range
-							.getStartPosition());
-					IDOMPosition domEnd = DOMPositionHelper.toDOMPosition(range
-							.getEndPosition());
-					if (EditValidateUtil.validPosition(domPos)
-							&& EditValidateUtil.validPosition(domEnd)) {
-						position = EditModelQuery
-								.getIndexedRegionLocation(domPos);
-						int end = EditModelQuery
-								.getIndexedRegionLocation(domEnd);
-						if (end < position) {
-							length = position - end;
-							position = end;
-						} else {
-							length = end - position;
-						}
-					}
-				}
-			} else {
-				Object object = ((IStructuredSelection) selection)
-						.getFirstElement();
-				if (object instanceof ElementEditPart) {
-					Node node = ((ElementEditPart) object).getIDOMNode();
-					position = EditModelQuery.getNodeStartIndex(node);
-					length = EditModelQuery.getNodeLenth(node);
-				}
-			}
-		}
-		if (position >= 0 && length >= 0) {
-			getModel().beginRecording(this, getLabel(), position, length);
-		} else {
-			getModel().beginRecording(this, getLabel());
-		}
-		getViewer().startSelectionChange();
-		getModel().aboutToChangeModel();
-		return true;
-	}
-
-	/**
-	 * child class can override this method for any pre action.
-	 */
-	protected void preExecute() {
-        // does nothing; children may wish to implement
-	}
-
-	/**
-	 * child class should override this method for the real action.
-	 */
-	protected abstract void doExecute();
-
-	/**
-	 * child class can override this method for any post action. NOTE: if
-	 * preExecute() or doExecute() throw exception, then this method will NOT be
-	 * called.
-	 */
-	protected void postExecute() {
-        // does nothing; child may wish to implement
-	}
-
-	/**
-	 * if prePreExecute() return true, then this method will always be called
-	 * even preExecute()/doExecute() and postExecute() fail.
-	 */
-	protected void postPostExecute() {
-		getModel().changedModel();
-
-		// after "changedModel()" is called, model will fire out batched events
-		// about model change
-		// and EditPart will be refreshed. Only at this time, could we use
-		// EditPart to construct the
-		// result selection.
-
-		// enforce a validate, so things get layed out, thus all the figures
-		// will be valid.
-		this.getViewer().getViewport().validate();
-
-		ISelection sel = getAfterCommandDesignerSelection();
-		if (sel != null) {
-			ITextSelection textSel = SelectionHelper
-					.convertFromDesignSelectionToTextSelection(sel);
-			if (textSel != null) {
-				getModel().endRecording(this, textSel.getOffset(),
-						textSel.getLength());
-			} else {
-				getModel().endRecording(this);
-			}
-		} else {
-			getModel().endRecording(this);
-		}
-
-		if (sel != null) {
-			getViewer().setSelection(sel);
-		} else {
-			getViewer().deselectAll();
-		}
-		if (getViewer() != null) {
-			getViewer().selectionChanged();
-		}
-	}
-
-	/**
-	 * child class should override this method to provide the selection after
-	 * command. This method is called after model changed. So at time of this
-	 * call, the editpart should be valid. Default implementation.
-	 * 
-	 * @return the selection
-	 */
-	protected abstract ISelection getAfterCommandDesignerSelection();
-
-	/**
-	 * @param range
-	 * @return a selection that contains the dom range or null if one doesn't exist
-	 */
-	protected ISelection toDesignRange(DOMRange range) {
-		try {
-			if (range == null) {
-				return null;
-			}
-			IDOMPosition startPos = range.getStartPosition();
-			DesignPosition start = DOMPositionHelper.toDesignPosition(startPos);
-			if (range.isEmpty()) {
-				return new DesignRange(start, start);
-			}
-            IDOMPosition endPos = range.getEndPosition();
-            return new DesignRange(start, DOMPositionHelper
-            		.toDesignPosition(endPos));
-		} catch (Exception e) {
-			// "Selection error"
-			_log.error("Error.RangeModeCommand.SetSelection"); //$NON-NLS-1$
-			return null;
-		}
-
-	}
-
-	/**
-	 * @param node
-	 * @return a selection for the node
-	 */
-	protected IStructuredSelection toDesignSelection(Node node) {
-		if (node instanceof INodeNotifier) {
-			EditPart part = (EditPart) ((INodeNotifier) node)
-					.getAdapterFor(EditPart.class);
-			if (part != null) {
-				return new StructuredSelection(part);
-			}
-		}
-		return null;
-	}
-
-	//    
-	// /**
-	// * set selection to the specified node. Normally called by child class in
-	// <code>setSelection()</code> implementation.
-	// *
-	// * @param node
-	// */
-	// protected final void setSelection(Node node)
-	// {
-	// EditPart part = (EditPart) ((INodeNotifier)
-	// node).getAdapterFor(EditPart.class);
-	//
-	// StructuredSelection sel = new StructuredSelection(part);
-	// getViewer().setSelection(sel);
-	// }
-
-	/**
-	 * format the specified node in source code. Utility method that can be
-	 * called by child classes
-	 * 
-	 * @param node
-	 */
-	public void formatNode(Node node) {
-		// XXX: there should have some other way to get the FormatProcessor.
-		// currently hardcoded to HTMLFormatProcessorImpl().
-		new HTMLFormatProcessorImpl().formatNode(node);
-	}
-
-	/**
-	 * Re-executes the Command. This method should only be called after
-	 * <code>undo()</code> has been called.
-	 */
-	public void redo() {
-		// this method should in fact never be called, because we have already
-		// delegate undo
-		// operations to source view.
-		getModel().getUndoManager().redo();
-	}
-
-	/**
-	 * Undoes the changes performed during <code>execute()</code>. This
-	 * method should only be called after <code>execute</code> has been
-	 * called, and only when <code>canUndo()</code> returns <code>true</code>.
-	 * 
-	 * @see #canUndo()
-	 */
-	public void undo() {
-		// this method should in fact never be called, because we have already
-		// delegate undo
-		// operations to source view.
-		getModel().getUndoManager().undo();
-	}
-
-	/**
-	 * a utility method. NOTE: this method can ONLY be called BEFORE you change
-	 * anything in the model.
-	 * 
-	 * @param ele
-	 * @return the figure info for the  element
-	 */
-	public IFigure getFigureInfo(Element ele) {
-		if (ele instanceof IDOMElement) {
-			EditPart part = (EditPart) ((IDOMElement) ele)
-					.getAdapterFor(EditPart.class);
-			if (part instanceof GraphicalEditPart) {
-				return ((GraphicalEditPart) part).getFigure();
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/ICustomizableCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/ICustomizableCommand.java
deleted file mode 100644
index 12d2d6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/ICustomizableCommand.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * A command that can be customized with drop customizable command
- * 
- * This is not public API.  Clients should not use.
- * 
- * @author cbateman
- *
- */
-public interface ICustomizableCommand
-{
-    /**
-     * Sets the customization data
-     * 
-     * @param customizationData
-     */
-    public void setCustomizationData(IAdaptable customizationData);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java
deleted file mode 100644
index 327a2c7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Move a node from one place to another place.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class MoveNodeCommand extends DesignerCommand {
-	private IDOMPosition insertPosition;
-
-	private Node originalNode;
-
-	/**
-	 * @param viewer
-	 * @param insertionPoint 
-	 * @param originalNode 
-	 */
-	public MoveNodeCommand(IHTMLGraphicalViewer viewer,
-			IDOMPosition insertionPoint, Node originalNode) {
-		super(
-				CommandResources.getString("MoveNodeCommand.Label.MoveNode"), viewer); //$NON-NLS-1$
-		this.insertPosition = insertionPoint;
-		this.originalNode = originalNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		getModel().beginRecording(this);
-		try {
-			Node originalParent = originalNode.getParentNode();
-			if (originalParent == null) {
-				return;
-			}
-			// when remove the _originalNode, may affect the insertionPosition.
-			if (originalParent == insertPosition.getContainerNode()) {
-				// under same parent, may affect it.
-				int insertIndex = insertPosition.getOffset();
-				int nodeIndex = -1;
-				NodeList list = originalParent.getChildNodes();
-				for (int i = 0, length = list.getLength(); i < length; i++) {
-					if (originalNode == list.item(i)) {
-						nodeIndex = i;
-					}
-				}
-				if (nodeIndex == -1) {
-					return; // should not happen.
-				}
-				if (insertIndex < nodeIndex) {
-					insertPosition = new DOMPosition(originalParent,
-							insertIndex);
-				} else if (insertIndex == nodeIndex
-						|| insertIndex == nodeIndex + 1) {
-					// move to same position, do nothing.
-					return;
-				} else {
-					insertPosition = new DOMPosition(originalParent,
-							insertIndex - 1);
-				}
-			}
-			originalParent.removeChild(originalNode);
-			DOMUtil.insertNode(insertPosition, originalNode);
-		} finally {
-			getModel().endRecording(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(originalNode);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java
deleted file mode 100644
index 75c1fcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.swt.dnd.DropTargetEvent;
-
-/**
- * @author mengbo
- */
-public class PDDropRequest extends Request implements DropRequest {
-	private Point _location;
-
-	private DropTargetEvent _currentEvent;
-
-	/**
-	 * 
-	 */
-	public PDDropRequest() {
-		setType(PDRequestConstants.REQ_DROP);
-	}
-
-	/**
-	 * Returns the location of the object to be created.
-	 * 
-	 * @return the location
-	 */
-	public Point getLocation() {
-		return _location;
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		this._location = location;
-	}
-
-	/**
-	 * @param ev
-	 */
-	public void setCurrentEvent(DropTargetEvent ev) {
-		_currentEvent = ev;
-	}
-
-	/**
-	 * @return the current drop target event
-	 */
-	public DropTargetEvent getCurrentEvent() {
-		return _currentEvent;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java
deleted file mode 100644
index 8b73061..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-/**
- * @author mengbo
- */
-public interface PDRequestConstants {
-
-	/**
-	 * TODO: purpose?
-	 */
-	String REQ_DROP = "pd drop"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java
deleted file mode 100644
index 7438282..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.internal.SourceViewerDragDropHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.DropCustomizationController;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Handles tag creation when dropped onto the WPE source view
- * 
- * @author mengbo
- */
-public class PaletteDropInsertCommand extends SourceViewerCommand implements ICustomizableCommand
-{
-
-	private final Logger _log = PDPlugin
-			.getLogger(PaletteDropInsertCommand.class);
-
-	private IDropSourceData _creationProvider;
-
-	private int _location;
-
-	private Element _element;
-
-	private IAdaptable _customizationData;
-
-	/**
-	 * @param label
-	 * @param editor
-	 * @param creationProvider
-	 * @param location
-	 */
-	public PaletteDropInsertCommand(String label, StructuredTextEditor editor,
-			IDropSourceData creationProvider, int location) {
-		super(label, editor);
-		_creationProvider = creationProvider;
-		_location = location;
-	}
-
-	public void doExecute() {
-		Node node;
-		try {
-			node = getSourceEditingTextTools().getNode(_location);
-		} catch (Exception e) {
-			_log.error("Bad text insertion location", e);		 //$NON-NLS-1$
-			return;
-		}
-		IDOMPosition position = null;
-		if (node != null) {
-			position = SourceViewerDragDropHelper.getInstance()
-					.findPosition(_location, node);
-		} else {
-			if (getModel().getDocument().getFirstChild() != null) {
-				//Fix for 224541 - When palette item is dropped to end of file in source view of Web Page Editor, the item is inserted at the top of file
-				//add inside at end of necessary container
-				position = SourceViewerDragDropHelper.getInstance()
-					.findPosition(getModel().getDocument().getEndOffset(), getModel().getDocument().getFirstChild());
-			} 
-			else {
-				// empty file
-				position = new DOMPosition(getModel().getDocument(), 0);
-			}
-		}
-
-        // essentially copied from ItemCreationTool so that DesignView drop and
-        // SourceViewDrop are same.
-        // Note that SourceView does NO drop validation checking. This is
-        // handled by ItemCreationPolicy in DesignView
-        final IStatus status = performCustomization(getModel().getDocument(),
-                position);
-
-        if (status.isOK()) 
-        {
-            final Element element = CommandUtil.executeInsertion(
-                    _creationProvider, getModel()
-                    , position, getCustomizationData());
-            if (element != null) {
-                formatNode(element);
-            }
-            this._element = element;
-        }
-    }
-
-	/**
-     * @param domDoc 
-	 * @param position 
-     * @return status
-	 */
-	protected IStatus performCustomization(final IDOMDocument domDoc, final IDOMPosition position) {
-		return new DropCustomizationController(this, _creationProvider, domDoc, position).performCustomization();
-	}
-
-    /**
-	 * @param customizationData
-	 */
-	public void setCustomizationData(IAdaptable customizationData) {
-		_customizationData = customizationData;
-	}
-
-	/**
-	 * This method is for test purposes and should generally not be 
-	 * used by clients.
-	 * 
-	 * @return the customization data
-	 */
-	protected final IAdaptable getCustomizationData() {
-		return _customizationData;
-	}
-	
-	public void setSelection() {
-		if (_element != null) {
-			int offset = EditModelQuery.getNodeStartIndex(_element);
-			int length = EditModelQuery.getNodeEndIndex(_element) - offset;
-			_editor.getTextViewer().setSelectedRange(offset, length);
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteAction.java
deleted file mode 100644
index 46c2050..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.range.PasteCommand;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-
-/**
- * @author mengbo
- */
-public class PasteAction extends DesignAction {
-
-	/**
-	 * @param editor
-	 */
-	public PasteAction(GraphicalEditor editor) {
-		super(editor, PDPlugin.getResourceString("Action.Name.Paste"));//$NON-NLS-1$
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new PasteCommand(viewer);
-			command.execute();
-		} else {
-			return;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getRangeSelection().isValid()) {
-			Clipboard clipboard = new Clipboard(viewer.getControl()
-					.getDisplay());
-			return clipboard.getContents(TemplateTransfer.getInstance()) != null
-					|| clipboard.getContents(TextTransfer.getInstance()) != null;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteNodeCommand.java
deleted file mode 100644
index 81b25a0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteNodeCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.wst.html.core.internal.document.ElementStyleImpl;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class PasteNodeCommand extends Command implements ICaretPositionMover {
-	private static final String COMMAND_LABEL = CommandResources
-			.getString("PasteNodeCommand.Label.DeleteNode"); //$NON-NLS-1$
-
-	private Node child;
-
-	private SourceViewer _sourceViewer;
-
-	/**
-	 * @param viewer
-	 */
-	public PasteNodeCommand(SourceViewer viewer) {
-		super(COMMAND_LABEL);
-		this._sourceViewer = viewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		_sourceViewer.getTextWidget().setSelection(
-				((ElementStyleImpl) child).getStartOffset(),
-				((ElementStyleImpl) child).getStartOffset());
-		_sourceViewer.doOperation(ITextOperationTarget.PASTE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#redo()
-	 */
-	public void redo() {
-		_sourceViewer.doOperation(ITextOperationTarget.REDO);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		_sourceViewer.doOperation(ITextOperationTarget.UNDO);
-
-	}
-
-	/**
-	 * @param child
-	 *            The child to set.
-	 */
-	public void setChild(Node child) {
-		this.child = child;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SourceViewerCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SourceViewerCommand.java
deleted file mode 100644
index 2974929..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SourceViewerCommand.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.ui.internal.provisional.IDOMSourceEditingTextTools;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class SourceViewerCommand extends Command {
-	/**
-	 * the structured text editor containing the viewer
-	 */
-	protected final StructuredTextEditor _editor;
-
-	private Document _document;
-
-	private Logger _log = PDPlugin.getLogger(SourceViewerCommand.class);
-
-	/**
-	 * @param label 
-	 * @param editor 
-	 */
-	public SourceViewerCommand(String label, StructuredTextEditor editor) {
-		super();
-		_editor = editor;
-		IDOMSourceEditingTextTools tools = getSourceEditingTextTools();
-		_document = tools.getDOMDocument();
-	}
-
-	/**
-	 * @return the text tools
-	 */
-	protected IDOMSourceEditingTextTools getSourceEditingTextTools() {
-		IDOMSourceEditingTextTools tools = (IDOMSourceEditingTextTools) _editor
-				.getAdapter(ISourceEditingTextTools.class);
-		return tools;
-	}
-
-	/**
-	 * preExecute and postExecute is a pair. () SHOULD NOT throw any exception,
-	 * if it throw any exception, it should catch itself and return false to
-	 * indicate not continue.
-	 * @return true if preExec succeeded
-	 */
-	protected final boolean preExecute() {
-		int position = 0;
-		int length = 0;
-		ISelection selection = _editor.getTextViewer().getSelection();
-		if (selection instanceof TextSelection) {
-			position = ((TextSelection) selection).getOffset();
-			length = ((TextSelection) selection).getLength();
-		}
-		getModel().beginRecording(this, getLabel(), position, length);
-		getModel().aboutToChangeModel();
-		return true;
-	}
-
-	/**
-	 * if preExecute() return true, then this method will always be called even
-	 * preExecute()/doExecute() and postExecute() fail.
-	 */
-	protected final void postExecute() {
-		getModel().changedModel();
-		getModel().endRecording(this);
-		setSelection();
-	}
-
-	/**
-	 * format the specified node in source code. Utility method that can be
-	 * called by child classes
-	 * 
-	 * @param node
-	 */
-	public final void formatNode(Node node) {
-		new HTMLFormatProcessorImpl().formatNode(node);
-	}
-
-	/**
-	 * @return the dom model
-	 */
-	protected IDOMModel getModel() {
-		Assert.isTrue(_document != null && _document instanceof IDOMNode);
-		return ((IDOMNode) _document).getModel();
-	}
-
-	public final void execute() {
-		boolean ok = preExecute();
-		if (ok) {
-			try {
-				doExecute();
-			} catch (Exception ex) {
-				// "Error in command execution"
-				_log.error("Error.SourceViewerCommand.Execution", ex); //$NON-NLS-1$
-			} finally {
-				postExecute();
-			}
-		}
-	}
-
-	/**
-	 * execute
-	 */
-	public abstract void doExecute();
-
-	/**
-	 * set the selection
-	 */
-	public abstract void setSelection();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SwitchSelectionCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SwitchSelectionCommand.java
deleted file mode 100644
index 6092c52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SwitchSelectionCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * A command to switch the selection
- *
- */
-public class SwitchSelectionCommand extends Command {
-	IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param viewer
-	 */
-	public SwitchSelectionCommand(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-	}
-
-	public void execute() {
-		if (_viewer.isInRangeMode()) {
-			ISelection selection = _viewer.getSelection();
-			if (selection instanceof DesignRange) {
-				DesignPosition posStart = ((DesignRange) selection)
-						.getStartPosition();
-				DesignPosition posEnd = ((DesignRange) selection)
-						.getEndPosition();
-				if (EditValidateUtil.validPosition(posStart)
-						&& EditValidateUtil.validPosition(posEnd)) {
-					Node ancestor = EditModelQuery.getInstance()
-							.getCommonAncestor(posStart.getContainerNode(),
-									posEnd.getContainerNode());
-					if (ancestor instanceof Text) {
-						ancestor = ancestor.getParentNode();
-					}
-					if (ancestor instanceof Element) {
-						EditPart part = Target.resolvePart(ancestor);
-						if (part instanceof SubNodeEditPart) {
-							_viewer.select(part);
-						}
-					}
-				}
-			}
-		} else {
-			List parts = _viewer.getSelectedEditParts();
-			if (parts.size() > 0) {
-				EditPart parent = ((EditPart) parts.get(0)).getParent();
-				if (!(parent instanceof DocumentEditPart)) {
-					_viewer.select(parent);
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteColumnCommand.java
deleted file mode 100644
index d9ba50d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteColumnCommand.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableDeleteColumnCommand extends DesignerCommand {
-	private Element _tableEle;
-
-	private int _columnIndex;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param dataTable
-	 * @param index
-	 */
-	public TableDeleteColumnCommand(IHTMLGraphicalViewer viewer,
-			Element dataTable, int index) {
-		super(
-				CommandResources
-						.getString("TableDeleteColumnCommand.Label.DeleteColumn"), viewer); //$NON-NLS-1$
-		this._tableEle = dataTable;
-		this._columnIndex = index;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._columnIndex < 0) {
-			return false;
-		}
-		boolean hasColSpan = _tableUtil.hasColumnSpanElement(this._columnIndex);
-		boolean isAffectedByColSpan = _tableUtil
-				.isAffectedByColSpan(this._columnIndex);
-		if (hasColSpan || isAffectedByColSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List trList = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, trList);
-
-		List[] lists = _tableUtil.getTrCellLists();
-
-		for (int i = 0, size = trList.size(); i < size; i++) {
-			Element tr = (Element) trList.get(i);
-			List cells = lists[i];
-			if (cells.size() <= this._columnIndex) {
-				continue;
-			}
-			Element cell = (Element) cells.get(this._columnIndex);
-			if (!cell.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-			{
-				tr.removeChild(cell);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteHeaderFooterCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteHeaderFooterCommand.java
deleted file mode 100644
index 432e204..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteHeaderFooterCommand.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableDeleteHeaderFooterCommand extends DesignerCommand {
-	private Element _table;
-
-	private boolean _isHeader;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param isHeader
-	 */
-	public TableDeleteHeaderFooterCommand(IHTMLGraphicalViewer viewer,
-			Element table, boolean isHeader) {
-		super(
-				isHeader ? CommandResources
-						.getString("TableDeleteHeaderFooterCommand.Label.DeleteHeader") : CommandResources.getString("TableDeleteHeaderFooterCommand.Label.DeleteFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-		this._table = table;
-		this._isHeader = isHeader;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		int rows = TableUtil.countSectionRows(this._table, sectionName);
-		if (rows == 0) {
-			return false;
-		}
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		List list = DOMUtil.getChildElementsByTagIgnoreCase(this._table,
-				sectionName);
-		Node delNode = (Node) list.get(0);
-		this._table.removeChild(delNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return this.toDesignSelection(this._table);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java
deleted file mode 100644
index 3ee5ea7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableDeleteRowCommand extends DesignerCommand {
-	Element _tableEle;
-
-	int _rowIndex;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param index
-	 */
-	public TableDeleteRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int index) {
-		super(CommandResources
-				.getString("TableDeleteRowCommand.Label.DeleteRow"), viewer); //$NON-NLS-1$
-		this._tableEle = table;
-		this._rowIndex = index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._rowIndex < 0) {
-			return false;
-		}
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-		// this._rowIndex);
-		int index = this._rowIndex;
-		Element tr = (Element) list.get(index);
-		boolean hasRowSpan = TableUtil.hasRowSpanElement(tr);
-		boolean isAffectedByRowSpan = TableUtil.isAffectedByRowSpan(list, tr,
-				index);
-		if (hasRowSpan || isAffectedByRowSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-		// this._rowIndex);
-		int index = this._rowIndex;
-		Element tr = (Element) list.get(index);
-		tr.getParentNode().removeChild(tr);
-		formatNode(this._tableEle);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java
deleted file mode 100644
index 9fe1dbb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertColumnCommand extends DesignerCommand {
-	private Element _tableEle;
-
-	private int _columnIndex;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param dataTable
-	 * @param index
-	 */
-	public TableInsertColumnCommand(IHTMLGraphicalViewer viewer,
-			Element dataTable, int index) {
-		super(
-				CommandResources
-						.getString("TableInsertColumnCommand.Label.InsertColumn"), viewer); //$NON-NLS-1$
-		this._tableEle = dataTable;
-		this._columnIndex = index;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		List trList = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, trList);
-		if (trList == null || trList.isEmpty()) {
-			return false;
-		}
-		if (this._columnIndex < 0 && this._columnIndex != -10) {
-			return false;
-		}
-		boolean isAffectedByColSpan = _tableUtil
-				.isAffectedByColSpan(this._columnIndex);
-		if (isAffectedByColSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List trList = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, trList);
-
-		List[] lists = _tableUtil.getTrCellLists();
-		int maxColumn = _tableUtil.getColumnCount();
-
-		boolean isAtLastColumn = false;
-		if (this._columnIndex >= maxColumn) {
-			isAtLastColumn = true;
-		}
-
-		for (int i = 0, size = trList.size(); i < size; i++) {
-			Element tr = (Element) trList.get(i);
-			boolean hasTH = (DOMUtil.getChildElementsByTagIgnoreCase(tr,
-					IHTMLConstants.TAG_TH).size() > 0);
-
-			List cells = lists[i];
-			if (isAtLastColumn || (cells.size() <= this._columnIndex)) {
-				int index = this._columnIndex + 1;
-				for (int k = cells.size(); k < index; k++) {
-					tr.appendChild(createDefaultElement(hasTH));
-				}
-			} else {
-				if (this._columnIndex != -10) {
-					Element cell = (Element) cells.get(this._columnIndex);
-					if (!cell.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-					{
-						tr.insertBefore(createDefaultElement(hasTH), cell);
-					} else {
-						boolean hasRealElement = false;
-						for (int k = _columnIndex + 1; k < cells.size(); k++) {
-							Element td = (Element) cells.get(k);
-							if (!td.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-							{
-								hasRealElement = true;
-								tr.insertBefore(createDefaultElement(hasTH), td);
-								break;
-							}
-						}
-						if (!hasRealElement) {
-							tr.appendChild(createDefaultElement(hasTH));
-						}
-					}
-				} else {
-					tr.appendChild(createDefaultElement(hasTH));
-				}
-			}
-		}
-
-		formatNode(this._tableEle);
-	}
-
-	private Element createDefaultElement(boolean createTH) {
-		Document doc = this._tableEle.getOwnerDocument();
-		Element td = null;
-		if (createTH) {
-			td = doc.createElement(IHTMLConstants.TAG_TH);
-		} else {
-			td = doc.createElement(IHTMLConstants.TAG_TD);
-		}
-
-		Node node = doc.createTextNode(
-				CommandResources.getString("TableInsertColumnCommand.Text.Default")); //$NON-NLS-1$
-		td.appendChild(node);
-		return td;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java
deleted file mode 100644
index c3cc31e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertHeaderFooterCommand extends DesignerCommand {
-	private Element _table;
-
-	private Element _headerOrFooter;
-
-	private boolean _isHeader;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param isHeader
-	 */
-	public TableInsertHeaderFooterCommand(IHTMLGraphicalViewer viewer,
-			Element table, boolean isHeader) {
-		super(
-				isHeader ? CommandResources
-						.getString("TableInsertHeaderFooterCommand.Label.InsertHeader") : CommandResources.getString("TableInsertHeaderFooterCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-		this._table = table;
-		this._isHeader = isHeader;
-		this._tableUtil = new TableUtil(this._table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		int rows = TableUtil.countSectionRows(this._table, sectionName);
-		if (rows > 0) {
-			return false;
-		}
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		this._headerOrFooter = this._table.getOwnerDocument().createElement(
-				sectionName);
-		Element tr = createDefaultElement();
-		this._headerOrFooter.appendChild(tr);
-		if (this._isHeader) {
-			Node child = this._table.getFirstChild();
-			this._table.insertBefore(this._headerOrFooter, child);
-		} else {
-			int headRows = TableUtil.countSectionRows(this._table,
-					IHTMLConstants.TAG_THEAD);
-			Node refNode = null;
-			if (headRows > 0) {
-				List list = DOMUtil.getChildElementsByTagIgnoreCase(
-						this._table, IHTMLConstants.TAG_THEAD);
-				Node header = (Node) list.get(0);
-				refNode = header.getNextSibling();
-			} else {
-				refNode = this._table.getFirstChild();
-			}
-			this._table.insertBefore(this._headerOrFooter, refNode);
-		}
-		formatNode(this._headerOrFooter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return this.toDesignSelection(this._headerOrFooter);
-	}
-
-	private Element createDefaultElement() {
-		String key = this._isHeader ? "TableInsertHeaderFooterCommand.ColumnHeader" //$NON-NLS-1$
-				: "TableInsertHeaderFooterCommand.ColumnFooter"; //$NON-NLS-1$
-		String name = PDPlugin.getResourceString(key);
-		Document doc = this._table.getOwnerDocument();
-		Element ele = doc.createElement(IHTMLConstants.TAG_TR);
-		int columnCount = _tableUtil.getColumnCount();
-		for (int i = 0; i < columnCount; i++) {
-			Element td = null;
-			if (this._isHeader) {
-				td = doc.createElement(IHTMLConstants.TAG_TH);
-			} else {
-				td = doc.createElement(IHTMLConstants.TAG_TD);
-			}
-			Node node = doc.createTextNode(name);
-			td.appendChild(node);
-			ele.appendChild(td);
-		}
-		return ele;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertRowCommand.java
deleted file mode 100644
index 813a868..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertRowCommand.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertRowCommand extends DesignerCommand {
-	private Element _tableEle;
-
-	private int _rowIndex;
-
-	private boolean _isBefore;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param index
-	 * @param isBefore 
-	 */
-	public TableInsertRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int index, boolean isBefore) {
-		super(CommandResources
-				.getString("TableInsertRowCommand.Label.InsertRow"), viewer); //$NON-NLS-1$
-		this._tableEle = table;
-		this._rowIndex = index;
-		this._isBefore = isBefore;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._rowIndex < 0 && this._rowIndex != -10) {
-			return false;
-		}
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// if the row neither at the beginning nor the end then count
-		if (_rowIndex > 0 && _rowIndex < list.size()) {
-			// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-			// this._rowIndex);
-			int index = this._rowIndex;
-			Element tr = (Element) list.get(index);
-			boolean isAffectedByRowSpan = TableUtil.isAffectedByRowSpan(list,
-					tr, index);
-			if (isAffectedByRowSpan) {
-				return false;
-			}
-
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		Element insertElement = createDefaultElement();
-
-		if (this._rowIndex < list.size()) {
-			if (this._rowIndex != -10) {
-				// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-				// this._rowIndex);
-				int index = this._rowIndex;
-				Element tr = (Element) list.get(index);
-				Element nextTr = tr;
-	
-				// int headRows = TableUtil.countSectionRows(this._tableEle,
-				// IHTMLConstants.TAG_THEAD);
-				// int footRows = TableUtil.countSectionRows(this._tableEle,
-				// IHTMLConstants.TAG_TFOOT);
-				if (!_isBefore) {
-					int parentIndex = index - 1;
-					/**
-					 * doesn't need any more,since the row index is from model now
-					 * int bodyRows = list.size() - headRows - footRows; boolean
-					 * hasBodyRow = false; boolean hasFootRow = false; if (bodyRows >
-					 * 0) { hasBodyRow = true; } if (footRows > 0) { hasFootRow =
-					 * true; } //last row in THEAD excute insert row after command
-					 * if ((this._rowIndex == headRows) && hasBodyRow && hasFootRow) {
-					 * parentIndex = index - footRows - 1; } //last row in TBODY
-					 * excute insert row after command if ((this._rowIndex ==
-					 * (list.size() - footRows)) && hasBodyRow && hasFootRow) {
-					 * parentIndex = list.size() - 1; }
-					 */
-	
-					tr = (Element) list.get(parentIndex);
-				}
-	
-				if (tr.getParentNode() == nextTr.getParentNode()) {
-					tr.getParentNode().insertBefore(insertElement, nextTr);
-				} else {
-					tr.getParentNode().appendChild(insertElement);
-				}
-			} else {
-				//empty table - append first row
-				_tableEle.appendChild(insertElement);
-			}
-		} else {
-			// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-			// this._rowIndex - 1);
-			int index = this._rowIndex - 1;
-			Element tr = (Element) list.get(index);
-			tr.getParentNode().insertBefore(insertElement, null);
-		}
-		formatNode(this._tableEle);
-
-	}
-
-	private Element createDefaultElement() {
-		Document doc = this._tableEle.getOwnerDocument();
-		Element ele = doc.createElement(IHTMLConstants.TAG_TR);
-		int columnCount = _tableUtil.getColumnCount();
-		if (columnCount < 1) {
-			columnCount = 1;
-		}
-		for (int i = 0; i < columnCount; i++) {
-			Element td = doc.createElement(IHTMLConstants.TAG_TD);
-			Node node = doc.createTextNode(
-					CommandResources.getString("TableInsertColumnCommand.Text.Default")); //$NON-NLS-1$
-			td.appendChild(node);
-			ele.appendChild(td);
-		}
-		return ele;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java
deleted file mode 100644
index d11ef19..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizeColumnCommand extends DesignerCommand {
-	private Element _table;
-
-	private TableUtil _tableUtil;
-
-	private int _columnIndex;
-
-	private int _delta;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param columnIndex
-	 * @param delta
-	 */
-	public TableResizeColumnCommand(IHTMLGraphicalViewer viewer, Element table,
-			int columnIndex, int delta) {
-		super(
-				CommandResources
-						.getString("TableResizeColumnCommand.Label.ResizeColumn"), viewer); //$NON-NLS-1$
-		this._table = table;
-		this._columnIndex = columnIndex;
-		this._delta = delta;
-		_tableUtil = new TableUtil(this._table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		int index = this._columnIndex - 1;
-		if (index < 0) {
-			index = 0;
-		}
-		List list = _tableUtil.getColumnCells(index);
-		Iterator itr = list.iterator();
-		Element cell = null;
-		while (itr.hasNext()) {
-			Element ele = (Element) itr.next();
-			if (ele.getTagName().equalsIgnoreCase("fake") || DOMUtil.getIntAttributeIgnoreCase(ele, IHTMLConstants.ATTR_COLSPAN, 1) > 1) //$NON-NLS-1$
-			{
-				continue;
-			}
-			cell = ele;
-			break;
-		}
-
-		IFigure cellFigure = getFigureInfo(cell);
-		int oldColumnWidth = cellFigure.getBounds().width;
-		int cellPadding = cellFigure.getInsets().getWidth();
-		int newWidth = oldColumnWidth + this._delta - cellPadding;
-		if (this._columnIndex - 1 < 0) {
-			newWidth = oldColumnWidth - this._delta - cellPadding;
-		}
-		Map map = new HashMap();
-		if (newWidth > 0) {
-			map.put(ICSSPropertyID.ATTR_WIDTH, newWidth + "px"); //$NON-NLS-1$
-			DOMStyleUtil.insertStyle(cell, map);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeRowCommand.java
deleted file mode 100644
index 5330368..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeRowCommand.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizeRowCommand extends DesignerCommand {
-	private Element _table;
-
-	private int _rowIndex;
-
-	private int _delta;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param rowIndex
-	 * @param delta
-	 */
-	public TableResizeRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int rowIndex, int delta) {
-		super(CommandResources
-				.getString("TableResizeRowCommand.Label.ResizeColumn"), viewer); //$NON-NLS-1$
-		this._table = table;
-		this._rowIndex = rowIndex;
-		this._delta = delta;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(this._table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		int index = this._rowIndex - 1;
-		if (index < 0) {
-			index = 0;
-		}
-		// int domIndex = TableUtil.countRowIndexInDOMTree(this._table, index);
-		int domIndex = index;
-
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._table, list);
-		Element tr = (Element) list.get(domIndex);
-
-		IFigure cellFigure = getFigureInfo(tr);
-		int oldRowHeight = cellFigure.getBounds().height;
-		int cellPadding = cellFigure.getInsets().getHeight();
-		int newHeight = oldRowHeight + this._delta - cellPadding;
-		if (this._rowIndex - 1 < 0) {
-			newHeight = oldRowHeight - this._delta - cellPadding;
-		}
-		Map map = new HashMap();
-		if (newHeight > 0) {
-			map.put(ICSSPropertyID.ATTR_HEIGHT, newHeight + "px"); //$NON-NLS-1$
-			DOMStyleUtil.insertStyle(tr, map);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java
deleted file mode 100644
index 7295210..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-/**
- * @author mengbo
- */
-public interface CaretPositionTracker {
-	/**
-	 * @return Returns the xoffset.
-	 */
-	public int getXoffset();
-
-	/**
-	 * @param xoffset
-	 *            The xoffset to set.
-	 */
-	public void setXoffset(int xoffset);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java
deleted file mode 100644
index 101463a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class HorizontalMoveCommand extends Command implements
-		ICaretPositionMover {
-	private static Logger _log = PDPlugin
-			.getLogger(HorizontalMoveCommand.class);
-
-	IHTMLGraphicalViewer _viewer;
-
-	boolean _forward;
-
-	boolean _onlyMoveEnd;
-
-	/**
-	 * @param viewer
-	 * @param b
-	 * @param c
-	 */
-	public HorizontalMoveCommand(IHTMLGraphicalViewer viewer, boolean b,
-			boolean c) {
-		_viewer = viewer;
-		_forward = b;
-		_onlyMoveEnd = c;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		DesignPosition position = null;
-		if (_viewer.isInRangeMode()) {
-			if (_viewer.getRangeSelection() != null
-					&& _viewer.getRangeSelection().isValid()) {
-				position = _viewer.getRangeSelection().getEndPosition();
-				position = performInlineMode(_forward);
-			}
-		} else {
-			position = performObjectMode();
-		}
-		setRange(position);
-	}
-
-	private DesignPosition performObjectMode() {
-		DesignPosition result = null;
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = getCurrentObjectPosition();
-		if (position != null) {
-			_viewer.setRange(position, position);
-			if (!validator.isValidPosition(position)) {
-				position = performInlineMode(_forward);
-				if (validator.isValidPosition(position)) {
-					result = position;
-				} else {
-					result = performInlineMode(!_forward);
-				}
-			} else {
-				result = position;
-			}
-		}
-		return result;
-	}
-
-	private DesignPosition performInlineMode(boolean forward) {
-		DesignRange range = _viewer.getRangeSelection();
-
-		if (range == null || !range.isValid()) {
-			_log.error("invalid range"); //$NON-NLS-1$
-			return null;
-		}
-
-		DesignPosition position = range.getEndPosition();
-		if (position.getContainerPart() instanceof TextEditPart) {
-			int length = ((TextEditPart) position.getContainerPart())
-					.getTextData().length();
-			int newoffset = position.getOffset() + (_forward ? 1 : -1);
-			if (newoffset >= 0 && newoffset <= length) {
-				DesignPosition newposi = new DesignPosition(position
-						.getContainerPart(), newoffset);
-				return newposi;
-			}
-		}
-		DesignPosition newpos = EditHelper.moveToNextEditPosition(
-				ActionData.KEYBOARD_NAVAGATION, position, forward);
-		return newpos;
-	}
-
-	private void setRange(DesignPosition newpos) {
-		if (_onlyMoveEnd) {
-			_viewer.setRangeEndPosition(newpos);
-		} else {
-			_viewer.setRange(newpos, newpos);
-		}
-	}
-
-	private DesignPosition getCurrentObjectPosition() {
-		DesignRange result = null;
-		if (_viewer.isInRangeMode()) {
-			result = _viewer.getRangeSelection();
-		} else {
-			List parts = _viewer.getSelectedEditParts();
-			if (parts.size() > 0) {
-				EditPart selection = (EditPart) parts.get(0);
-				if (selection instanceof SubNodeEditPart) {
-					DesignPosition position = new DesignRefPosition(selection,
-							_forward);
-					result = new DesignRange(position, position);
-				}
-			}
-		}
-		return result != null && result.isValid() ? result.getEndPosition()
-				: null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java
deleted file mode 100644
index ca75659..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-/**
- * Tags commands that care about caret position
- * TODO: does presently appear to have a purpose
- * 
- * @author mengbo
- * 
- */
-public interface ICaretPositionMover {
-    // empty; tagging interface
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java
deleted file mode 100644
index 3fe0dc5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Caret;
-
-/**
- * @author mengbo
- */
-public class VerticalMoveCommand extends Command {
-	private static Logger _log = PDPlugin
-			.getLogger(HorizontalMoveCommand.class);
-
-	IHTMLGraphicalViewer _viewer;
-
-	boolean _up;
-
-	boolean _onlyMoveEnd;
-
-	/**
-	 * @param viewer
-	 * @param up
-	 * @param c
-	 */
-	public VerticalMoveCommand(IHTMLGraphicalViewer viewer, boolean up,
-			boolean c) {
-		_viewer = viewer;
-		_up = up;
-		_onlyMoveEnd = c;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		int OFFSET = 2;
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			_log.error("invalid range"); //$NON-NLS-1$
-			return;
-		}
-		IMovementMediator moveMediator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = range.getEndPosition();
-		Caret caret = _viewer.getCaret();
-		Point point = null;
-		DesignPosition newPos = position;
-		EditPart containerpart = null, rootpart1;
-		if (_up) {
-			point = new Point(((CaretPositionTracker) _viewer).getXoffset(),
-					caret.getBounds().y);
-		} else {
-			point = new Point(((CaretPositionTracker) _viewer).getXoffset(),
-					caret.getBounds().y + caret.getBounds().height);
-
-		}
-		rootpart1 = getRootEditablePart(position.getContainerPart(),
-				moveMediator);// position.getContainerPart();
-		if (rootpart1 == null) {
-			return;
-		}
-        
-        point = adjustLocation(rootpart1, point);
-		Rectangle bound = EditPartPositionHelper.getAbsoluteBounds(rootpart1);
-		// get current according to the point.
-		// FlowBoxLine line =
-		// getCurrentLine(moveMediator.getEditableContainer(new
-		// Target(rootpart)), point, moveMediator);
-		while (true) {
-			// try to change offset and then to search for new point.
-			if (_up) {
-				point.y -= OFFSET;
-				if (point.y <= bound.y) {
-					newPos = position;
-					break;
-				}
-			} else {
-				point.y += OFFSET;
-				if (point.y >= bound.y + bound.height) {
-					newPos = position;
-					break;
-				}
-			}
-			containerpart = ((InlineEditingNavigationMediator) moveMediator)
-					.getConstainedEditableContainer(position, point, _viewer);
-			if (containerpart != null) {
-				if (!EditModelQuery.isChild(Target.resolveNode(rootpart1),
-						Target.resolveNode(containerpart))) {
-					containerpart = rootpart1;
-				}
-				bound = EditPartPositionHelper.getAbsoluteBounds(rootpart1);
-				newPos = EditPartPositionHelper
-						.findEditPartPositionConstrained(containerpart, point,
-								moveMediator);
-			} else {
-				newPos = position;
-				break;
-			}
-			if (newPos != null) {
-				if (found(newPos, position)) {
-					break;
-				}
-			}
-		}
-		setRange(position, newPos);
-	}
-
-	private void setRange(DesignPosition position, DesignPosition newPos) {
-		if (!EditModelQuery.isSame(position, newPos)) {
-			{
-				if (_onlyMoveEnd) {
-					_viewer.setRangeEndPosition(newPos);
-				} else {
-					_viewer.setRange(newPos, newPos);
-				}
-			}
-		}
-	}
-
-	/*
-	 * We should change this, it is too tricky to do in this way.
-	 */
-	private Point adjustLocation(EditPart rootPart, Point point) {
-		Point result = point.getCopy();
-		Rectangle bounds = EditPartPositionHelper.getAbsoluteBounds(rootPart);
-		if (!bounds.contains(point)) {
-			if (bounds.getLeft().x > point.x) {
-				result.x = bounds.getLeft().x;
-			} else if (bounds.getRight().x < point.x) {
-				result.x = bounds.getRight().x;
-			}
-		}
-		return result;
-	}
-
-	private EditPart getRootEditablePart(EditPart part,
-			IMovementMediator moveMediator) {
-		EditPart rootpart = null;
-		if ((rootpart = ((InlineEditingNavigationMediator) moveMediator)
-				.getRootConstainedEditableContainer(new Target(part))) == null) {
-			rootpart = moveMediator.getEditableContainer(new Target(part));
-		}
-		return rootpart;
-	}
-
-	private boolean found(DesignPosition newPos, DesignPosition prevPos) {
-		Rectangle newRec = EditPartPositionHelper
-				.convertToAbsoluteCaretRect(newPos);
-		Rectangle prevRec = EditPartPositionHelper
-				.convertToAbsoluteCaretRect(prevPos);
-		if (_up) {
-			return getYDistance(newRec, prevRec, _up) < 0;
-		}
-        return getYDistance(newRec, prevRec, _up) > 0;
-	}
-
-	/**
-	 * Distance from rec1 to rec2 at y coordination, if top, compare top,
-	 * otherwise compare bottom.
-	 * 
-	 * @param rec1
-	 * @param rec2
-	 * @param up
-	 * @return
-	 */
-	private int getYDistance(Rectangle rec1, Rectangle rec2, boolean top) {
-		if (rec1.getCopy().intersect(rec2).height > 0) {
-			return 0;
-		}
-        if (top) {
-        	return rec1.getTop().y - rec2.getTop().y;
-        }
-        return rec1.getBottom().y - rec2.getBottom().y;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java
deleted file mode 100644
index 2f087a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class ApplyStyleCommand extends RangeModeCommand {
-	private String _tag;
-
-	private String _cssProperty;
-
-	private String _cssPropertyValue;
-
-	private final Element _applyingNode;
-
-	/**
-	 * @param viewer
-	 * @param tag 
-	 * @param property 
-	 * @param value 
-	 */
-	public ApplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(
-				CommandResources
-						.getString("ApplyStyleCommand.Label.ApplyStyle"), viewer); //$NON-NLS-1$
-		this._tag = tag;
-		this._cssProperty = property;
-		this._cssPropertyValue = value;
-		this._applyingNode = null;
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ApplyStyleCommand(IHTMLGraphicalViewer viewer, Element node,
-			String property, String value) {
-		super(
-				CommandResources
-						.getString("ApplyStyleCommand.Label.ApplyStyle"), viewer); //$NON-NLS-1$
-		this._applyingNode = node;
-	}
-
-	/**
-	 * @return the applying node (may be null)
-	 */
-	protected final Element getApplyingNode() {
-        return _applyingNode;
-    }
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node startContainer = start.getContainerNode();
-		Node endContainer = end.getContainerNode();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-
-		if (common instanceof Text) {
-			// under the same Text scope
-			range = doTextNodeStyleApply((Text) common, start.getOffset(), end
-					.getOffset());
-
-			return range;
-		}
-        
-        if (startContainer instanceof Text) {
-        	// if the start offset is 0,then skip split the Text
-        	if (start.getOffset() > 0) {
-        		startContainer = ((Text) startContainer).splitText(start
-        				.getOffset());
-        		start = new DOMRefPosition(startContainer, false);
-        	}
-        } else {
-        	startContainer = start.getNextSiblingNode();
-        }
-        if (endContainer instanceof Text) {
-        	if (end.getOffset() > 0) {
-        		endContainer = ((Text) endContainer).splitText(end
-        				.getOffset());
-        		endContainer = endContainer.getPreviousSibling();
-        	} else {
-        		endContainer = endContainer.getPreviousSibling();
-        	}
-        } else {
-        	endContainer = end.getPreviousSiblingNode();
-        }
-
-        for (Node node = startContainer; node != endContainer; node = EditModelQuery
-        		.getInstance().getNextLeafNeighbor(node)) {
-        	if (EditModelQuery.hasAncestor(node, getTag(), true)) {
-        		continue;
-        	}
-        	Element newnode = createStyleElement();
-        	node.getParentNode().insertBefore(newnode, node);
-        	newnode.appendChild(node);
-        }
-        if (!EditModelQuery.hasAncestor(endContainer, getTag(), true)) {
-        	Element newnode = createStyleElement();
-        	endContainer.getParentNode()
-        			.insertBefore(newnode, endContainer);
-        	newnode.appendChild(endContainer);
-        }
-
-		// merge the style tags
-
-		for (Node node = startContainer; node != endContainer; node = EditModelQuery
-				.getInstance().getNextLeafNeighbor(node)) {
-			Node stylenode = node;
-			while (stylenode != null
-					&& !stylenode.getNodeName().equalsIgnoreCase(getTag())) {
-				stylenode = stylenode.getParentNode();
-			}
-			if (stylenode == null) {
-				continue;
-			}
-			if (stylenode.getNextSibling() != null
-					&& stylenode.getNextSibling().getNodeName()
-							.equalsIgnoreCase(getTag())) {
-				Node sibling = stylenode.getNextSibling();
-				while (sibling.getFirstChild() != null) {
-					stylenode.appendChild(sibling.getFirstChild());
-				}
-				stylenode.getParentNode().removeChild(sibling);
-				node = startContainer;
-			}
-		}
-
-		return new DOMRange(start, end);
-
-		/*
-		 * boolean ordered = range.isOrdered(); IDOMPosition start = ordered ?
-		 * range.getStartPosition() : range.getEndPosition(); IDOMPosition end =
-		 * ordered ? range.getEndPosition() : range.getStartPosition();
-		 * 
-		 * Node common = DOMUtil.findCommonAncester(start.getContainerNode(),
-		 * end.getContainerNode()); if (common == null) { // should not happen.
-		 * return null; }
-		 * 
-		 * DOMRange result = null; if (common instanceof Text) { result =
-		 * doTextNodeStyleApply((Text) common, start.getOffset(),
-		 * end.getOffset()); } else { IDOMPosition startPosition = start;
-		 * IDOMPosition endPosition = end; Node ancester = common; DOMRange[]
-		 * leftRange = new DOMRange[1]; DOMRange[] rightRange = new DOMRange[1];
-		 * 
-		 * startPosition = partialApply(startPosition, ancester, true,
-		 * leftRange); endPosition = partialApply(endPosition, ancester, false,
-		 * rightRange); DOMRange middle = middleApply(ancester, startPosition,
-		 * endPosition);
-		 * 
-		 * IDOMPosition startref = null; if (leftRange[0] != null &&
-		 * leftRange[0].getStartPosition() != null) { startref =
-		 * leftRange[0].getStartPosition(); } else if (middle != null &&
-		 * middle.getStartPosition() != null) { startref =
-		 * middle.getStartPosition(); } else if (rightRange[0] != null &&
-		 * rightRange[0].getStartPosition() != null) { startref =
-		 * rightRange[0].getStartPosition(); }
-		 * 
-		 * IDOMPosition endref = null; if (rightRange[0] != null &&
-		 * rightRange[0].getEndPosition() != null) { endref =
-		 * rightRange[0].getEndPosition(); } else if (middle != null &&
-		 * middle.getEndPosition() != null) { endref = middle.getEndPosition(); }
-		 * else if (leftRange[0] != null && leftRange[0].getEndPosition() !=
-		 * null) { endref = leftRange[0].getEndPosition(); }
-		 * 
-		 * if (startref == null) { result = null; } else { startref = new
-		 * DOMPosition(EditModelQuery.getInstance().getNextLeafNeighbor(startref.getContainerNode()),
-		 * 0); System.out.println(startref.toString()); endref = new
-		 * DOMPosition(endref.getContainerNode(), 0); result = new
-		 * DOMRange(startref, endref); } }
-		 * 
-		 * if (result == null) { return null; }
-		 * 
-		 * if (ordered) { return result; } else { return new
-		 * DOMRange(result.getEndPosition(), result.getStartPosition()); }
-		 */
-	}
-
-    // TODO: unused code.  Dead?
-//	private DOMRange middleApply(Node ancester, IDOMPosition startPosition,
-//			IDOMPosition endPosition) {
-//		startPosition = skip(startPosition, true);
-//		if (startPosition.getNextSiblingNode() == null
-//				|| startPosition.getOffset() >= endPosition.getOffset()) {
-//			return null;
-//		} else {
-//			List needMove = new ArrayList();
-//			Node startNext = startPosition.getNextSiblingNode();
-//			Node endNext = endPosition.getNextSiblingNode();
-//			while (startNext != null && startNext != endNext) {
-//				needMove.add(startNext);
-//				startNext = startNext.getNextSibling();
-//			}
-//			Element newEle = createStyleElement();
-//			ancester.insertBefore(newEle, startPosition.getNextSiblingNode());
-//			for (int i = 0, n = needMove.size(); i < n; i++) {
-//				newEle.appendChild((Node) needMove.get(i));
-//			}
-//			return new DOMRange(new DOMRefPosition(newEle, false),
-//					new DOMRefPosition(newEle, true));
-//		}
-//	}
-
-    // TODO: unused code.  Dead?
-//	private IDOMPosition partialApply(IDOMPosition position, Node ancester,
-//			boolean forward, DOMRange[] result) {
-//		IDOMPosition startRef = null, endRef = null;
-//
-//		while (position != null && position.getContainerNode() != ancester) {
-//			Node container = position.getContainerNode();
-//			if (container instanceof Text) {
-//				// splitText will move the position up one level
-//				position = splitText(position);
-//			} else {
-//				// skip those nodes that can't have the style applied.
-//				position = skip(position, forward);
-//				Node sibling = position.getSibling(forward);
-//				if (sibling != null) {
-//					List needMove = new ArrayList();
-//					while (sibling != null) {
-//						needMove.add(sibling);
-//						sibling = forward ? sibling.getNextSibling() : sibling
-//								.getPreviousSibling();
-//					}
-//
-//					// ok, there is nodes that need the style
-//					Element newEle = createStyleElement();
-//					container.insertBefore(newEle, position
-//							.getNextSiblingNode());
-//					for (int i = 0, size = needMove.size(); i < size; i++) {
-//						newEle.appendChild((Node) needMove.get(i));
-//					}
-//					if (startRef == null) {
-//						startRef = new DOMRefPosition(newEle, !forward);
-//					}
-//					endRef = new DOMRefPosition(newEle, forward);
-//				}
-//				// move the position up one level
-//				position = new DOMRefPosition(container, forward);
-//			}
-//		}
-//		if (startRef == null) {
-//			result[0] = null;
-//		} else {
-//			result[0] = forward ? new DOMRange(startRef, endRef)
-//					: new DOMRange(endRef, startRef);
-//		}
-//		return position;
-//	}
-
-	/**
-	 * @param position
-	 * @return
-	 */
-    // TODO: dead?
-//	private IDOMPosition splitText(IDOMPosition position) {
-//		Text text = (Text) position.getContainerNode();
-//		int offset = position.getOffset();
-//		if (offset <= 0) {
-//			return new DOMRefPosition(text, false);
-//		} else if (offset >= text.getData().length()) {
-//			return new DOMRefPosition(text, true);
-//		} else {
-//			text.splitText(offset);
-//			return new DOMRefPosition(text, true);
-//		}
-//	}
-
-	/**
-	 * @param start
-	 * @param end
-	 * @param common
-	 */
-	private DOMRange doTextNodeStyleApply(Text textNode, int startOffset,
-			int endOffset) {
-		String data = textNode.getData();
-		String before = data.substring(0, startOffset);
-		String middle = data.substring(startOffset, endOffset);
-		String tail = data.substring(endOffset);
-
-		Text middleText = getModel().getDocument().createTextNode(middle);
-
-		// case 1: normal one
-		if (!isEmptyString(before) && !isEmptyString(tail)) {
-			Node parent = textNode.getParentNode();
-			parent.insertBefore(
-					getModel().getDocument().createTextNode(before), textNode);
-			Element bnode = createStyleElement();
-			bnode.appendChild(middleText);
-			parent.insertBefore(bnode, textNode);
-			textNode.setNodeValue(tail);
-		}
-
-		if (isEmptyString(before) && !isEmptyString(tail)) {
-			Node sibling = textNode.getPreviousSibling();
-			if (sibling != null
-					&& sibling.getNodeName().equalsIgnoreCase(getTag())) {
-				sibling.appendChild(middleText);
-			} else {
-				Node parent = textNode.getParentNode();
-				parent.insertBefore(getModel().getDocument().createTextNode(
-						before), textNode);
-				Element bnode = createStyleElement();
-				bnode.appendChild(middleText);
-				parent.insertBefore(bnode, textNode);
-			}
-			textNode.setNodeValue(tail);
-		}
-
-		if (!isEmptyString(before) && isEmptyString(tail)) {
-			Node sibling = textNode.getNextSibling();
-			textNode.setNodeValue(before);
-			if (sibling != null
-					&& sibling.getNodeName().equalsIgnoreCase(getTag())) {
-				sibling.insertBefore(middleText, sibling.getFirstChild());
-			} else {
-				Element bnode = createStyleElement();
-				bnode.appendChild(middleText);
-				textNode.getParentNode().insertBefore(bnode, sibling);
-			}
-		}
-
-		if (isEmptyString(before) && isEmptyString(tail)) {
-
-			Node previousSibling = textNode.getPreviousSibling();
-			Node nextSibling = textNode.getNextSibling();
-			//
-			if (getTag().equalsIgnoreCase(IHTMLConstants.TAG_P)) {
-				Element bnode = createStyleElement();
-				bnode.appendChild(middleText);
-				textNode.getParentNode().insertBefore(bnode, textNode);
-				textNode.getParentNode().removeChild(textNode);
-			}
-			//
-			else {
-				if (previousSibling != null
-						&& previousSibling.getNodeName().equalsIgnoreCase(
-								getTag()) && nextSibling != null
-						&& nextSibling.getNodeName().equalsIgnoreCase(getTag())) {
-					previousSibling.appendChild(middleText);
-					while (nextSibling.getFirstChild() != null) {
-						previousSibling
-								.appendChild(nextSibling.getFirstChild());
-					}
-					nextSibling.getParentNode().removeChild(nextSibling);
-				} else if (previousSibling != null
-						&& previousSibling.getNodeName().equalsIgnoreCase(
-								getTag())) {
-					previousSibling.appendChild(middleText);
-				} else if (nextSibling != null
-						&& nextSibling.getNodeName().equalsIgnoreCase(getTag())) {
-					nextSibling.insertBefore(middleText, nextSibling
-							.getFirstChild());
-				} else {
-					Element bnode = createStyleElement();
-					bnode.appendChild(middleText);
-					textNode.getParentNode().insertBefore(bnode, textNode);
-				}
-				textNode.getParentNode().removeChild(textNode);
-			}
-		}
-
-		return new DOMRange(new DOMRefPosition(middleText, false),
-				new DOMRefPosition(middleText, true));
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @return a style element (cached on create)
-	 */
-	protected Element createStyleElement() {
-		if (_applyingNode != null) {
-			return _applyingNode;
-		}
-        Element element = getModel().getDocument().createElement(getTag());
-        if (_cssProperty != null && _cssPropertyValue != null) {
-        	element.setAttribute(_cssProperty, _cssPropertyValue);
-        }
-        return element;
-	}
-
-	/**
-	 * @param position
-	 * @param b
-	 * @return
-	 */
-    // TODO: dead?
-//	private IDOMPosition skip(IDOMPosition position, boolean forward) {
-//		Node node = position.getSibling(forward);
-//
-//		if (node == null) {
-//			return position;
-//		}
-//		boolean canSkip = false;
-//		if (node instanceof Text) {
-//			canSkip = ((IDOMText) node).isElementContentWhitespace();
-//		} else if (node instanceof Element) {
-//			if (getTag().equalsIgnoreCase(((Element) node).getTagName())) {
-//				canSkip = true;
-//			} else {
-//				canSkip = false;
-//			}
-//		} else {
-//			canSkip = true;
-//		}
-//		if (canSkip) {
-//			return new DOMRefPosition(node, forward);
-//		} else {
-//			return position;
-//		}
-//	}
-
-	/**
-	 * @return Returns the _cssProperty.
-	 */
-	public final String getCssProperty() {
-		return _cssProperty;
-	}
-
-	/**
-	 * @param property
-	 *            The _cssProperty to set.
-	 */
-	public final void setCssProperty(String property) {
-		_cssProperty = property;
-	}
-
-	/**
-	 * @return Returns the _cssPropertyValue.
-	 */
-	public final String getCssPropertyValue() {
-		return _cssPropertyValue;
-	}
-
-	/**
-	 * @param propertyValue
-	 *            The _cssPropertyValue to set.
-	 */
-	public final void setCssPropertyValue(String propertyValue) {
-		_cssPropertyValue = propertyValue;
-	}
-
-	/**
-	 * @return Returns the _tag.
-	 */
-	public final String getTag() {
-		if (_tag != null) {
-			return _tag;
-		}
-        return _applyingNode.getNodeName();
-	}
-
-	/**
-	 * @param _tag
-	 *            The _tag to set.
-	 */
-	public final void setTag(String _tag) {
-		this._tag = _tag;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/BlockNodeFinder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/BlockNodeFinder.java
deleted file mode 100644
index a4a3a8a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/BlockNodeFinder.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class BlockNodeFinder {
-	private String[] _additionalTags;
-
-	private IDOMPosition _position;
-
-	/**
-	 * @param position
-	 * @param additionalTags
-	 */
-	public BlockNodeFinder(IDOMPosition position, String[] additionalTags) {
-		_position = position;
-		_additionalTags = additionalTags;
-	}
-
-	private Node findInlineSiblings(IDOMPosition position, List result,
-			boolean forward) {
-		Node container = EditModelQuery.getInstance().getSibling(position,
-				forward);
-		if (!forward) {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getPreviousSibling();
-			}
-		} else {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getNextSibling();
-			}
-		}
-		// the result will be non-zero length.
-		return null;
-	}
-
-	private Node getParagraphNodes(IDOMPosition position, List result,
-			boolean forward) {
-		Node sResult = findInlineSiblings(position, result, forward);
-		Node container = position.getContainerNode();
-		container = position.isText() ? container.getParentNode() : container;
-		while (sResult == null) {
-			// stop at block, special container and H style nodes.
-			if (EditModelQuery.isBlockNode(container)
-					|| EditModelQuery.isDocument(container)
-					|| (container.getLocalName() != null && (container
-							.getLocalName().equals(IJSFConstants.TAG_VIEW) || container
-							.getLocalName().equalsIgnoreCase(
-									IHTMLConstants.TAG_HTML))) || //
-					(_additionalTags != null
-							&& Arrays.asList(_additionalTags).contains(
-									getTagName()) && Arrays.asList(
-							_additionalTags).contains(container))) {
-				return container;
-			}
-			position = new DOMRefPosition(container, forward);
-			sResult = findInlineSiblings(position, result, forward);
-			container = container.getParentNode();
-		}
-		return sResult;
-	}
-
-	/**
-	 * Search for an area between two block nodes or within a block node, search
-	 * will stop before or under a node which has block display-type, or
-	 * particular container like "html", jsf "view", .etc, two positions (left
-	 * and right) are returned in result.
-	 * 
-	 * The searcher will search parent's directly children, if no block node is
-	 * found, then go up the node tree to search again.
-	 * 
-	 * @param position
-	 * @param result
-	 */
-	public void getParagraphNodes(IDOMPosition position, List result) {
-		List tempResult = new ArrayList();
-		Node r1 = getParagraphNodes(position, tempResult, true);
-		if (EditModelQuery.isChild(r1, position.getContainerNode())) {
-			result.add(new DOMPosition(r1, r1.getChildNodes().getLength()));
-		} else {
-			result.add(new DOMRefPosition(r1, false));
-		}
-
-		Node r2 = getParagraphNodes(position, tempResult, false);
-		if (EditModelQuery.isChild(r2, position.getContainerNode())) {
-			result.add(new DOMPosition(r2, 0));
-		} else {
-			result.add(new DOMRefPosition(r2, true));
-		}
-	}
-
-	private String getTagName() {
-		String name = _position.getContainerNode().getNodeName();
-		name = name == null ? "" : name.toLowerCase(); //$NON-NLS-1$
-		return name;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java
deleted file mode 100644
index 8900ab4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Vector;
-
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.widgets.Control;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ClipboardData implements IInputSourceProvider {
-
-	private Control _control;
-
-	/**
-	 * @param control 
-	 */
-	public ClipboardData(Control control) {
-		super();
-		_control = control;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.IInputSourceProvider#getNodes()
-	 */
-	public Node[] getNodes() {
-		Object data = getClipboardData();
-		if (data instanceof Vector && ((Vector) data).size() > 0) {
-			return (Node[]) ((Vector) data).toArray(new Node[] {});
-		} else if (data instanceof Node[]) {
-			return (Node[]) data;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.IInputSourceProvider#getStringData()
-	 */
-	public String getStringData() {
-		Object data = getClipboardData();
-		if (data instanceof String) {
-			return (String) data;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.IInputSourceProvider#getCharacterData()
-	 */
-	public Character getCharacterData() {
-		return null;
-	}
-
-	/**
-	 * @return the clip board data
-	 */
-	public Object getClipboardData() {
-		Clipboard clipboard = new Clipboard(_control.getDisplay());
-
-		final Object cuted = clipboard.getContents(TemplateTransfer.getInstance());
-		if (cuted instanceof Node[] || cuted instanceof Vector) {
-			return cuted;
-		}
-        return clipboard.getContents(TextTransfer.getInstance());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java
deleted file mode 100644
index 064ffd9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Text;
-
-/**
- * This command can used to handle things like "paste". Or keyboard printable
- * ascii key. Note: ENTER key is not handled here.
- * 
- * @author mengbo
- */
-// FIXME: \r \n in the content string is not handled.
-public class ContentCommand extends RangeModeCommand {
-
-	private String _content;
-
-	/**
-	 * @param viewer
-	 * @param content 
-	 */
-	public ContentCommand(IHTMLGraphicalViewer viewer, String content) {
-		super("", viewer); //$NON-NLS-1$
-		_content = content;
-	}
-
-	/**
-	 * @param viewer
-	 * @param c
-	 */
-	public ContentCommand(IHTMLGraphicalViewer viewer, char c) {
-		super("", viewer); //$NON-NLS-1$
-		_content = String.valueOf(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null)
-			return null;
-
-		IDOMPosition position = DOMPositionHelper.removeRange(range);
-		position = doContent(position);
-		return new DOMRange(position, position);
-
-	}
-
-	/**
-	 * @param position
-	 * @return ??
-	 */
-	protected IDOMPosition doContent(IDOMPosition position) {
-		position = DOMPositionHelper.mergeIntoText(position);
-
-		if (position.getContainerNode() instanceof Text) {
-			Text text = (Text) position.getContainerNode();
-			String data = text.getData();
-			int offset = position.getOffset();
-			String newData = data.substring(0, offset) + _content
-					+ data.substring(offset);
-			text.setData(newData);
-			return new DOMPosition(text, offset + _content.length());
-		}
-        // we need to create a text node.
-        Text text = getDocument().createTextNode(_content);
-        position.getContainerNode().insertBefore(text,
-        		position.getNextSiblingNode());
-        return new DOMRefPosition(text, true);
-	}
-
-	// protected DesignPosition doContent()
-	// {
-	// // DesignPosition position = removeRange();
-	// DesignPosition position = this.getSelectionRange().getEndPosition();
-	// if ('\r' == _content || '\n' == _content)
-	// {
-	// Element br = getModel().getDocument().createElement("BR");
-	// Node node = RangeUtil.insertElement(position, br);
-	//
-	// // we need set the new range to the node.
-	// // FIXME: temp code, need to reconsider how to do refresh, when those
-	// editpart
-	// // are recreated.
-	// IDOMNode parent = (IDOMNode) node.getParentNode();
-	// EditPart parentPart = (EditPart) parent.getAdapterFor(EditPart.class);
-	// List childParts = parentPart.getChildren();
-	// for (int i=0; i<childParts.size(); i++)
-	// {
-	// if (node == ((EditPart)childParts.get(i)).getModel())
-	// {
-	// return new DesignPosition(parentPart, i+1);
-	// }
-	// }
-	// return new DesignPosition(parentPart, childParts.size());
-	// }
-	// else
-	// {
-	// TextPosition textPosition = RangeUtil.insertText(position,
-	// String.valueOf(_content));
-	// IDOMText text = textPosition.getTextNode();
-	// EditPart part = (EditPart) text.getAdapterFor(EditPart.class);
-	// return new DesignPosition(part, textPosition.getOffset());
-	// }
-	// }
-	//
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java
deleted file mode 100644
index 594cf62..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CopyCommand extends RangeModeCommand {
-
-	/**
-	 * @param viewer
-	 */
-	public CopyCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("CopyCommand.Label.Copy"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = new CopyEdit(selection, getViewer());
-		edit.operate();
-		return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java
deleted file mode 100644
index 93d3efe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class CopyEdit extends DesignEdit {
-	private static Logger _log = PDPlugin.getLogger(CopyEdit.class);
-
-	private Stack result = new Stack();
-
-	/**
-	 * @param range
-	 * @param viewer
-	 */
-	public CopyEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		WorkNode root = getRootWorkNode();
-		Node rootNode = root.getNode();
-		result = getProcessedResult();
-		collectOtherStyles(rootNode, result);
-		setClipboard(result);
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#processContainer(org.eclipse.jst.pagedesigner.commands.range.WorkNode)
-	 */
-	protected Node processContainer(WorkNode node) {
-		return node.getNode().cloneNode(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processNode(org.w3c.dom.Node,
-	 *      int[], java.util.Stack)
-	 */
-	protected Node processNode(WorkNode node) {
-		int pos[] = node.getPosOffsets();
-		// the text could be tranparent, or 0 length.
-		Assert.isTrue(pos[0] <= pos[1]);
-		if (pos[0] == pos[1]) {
-			return null;
-		}
-		return node.getNode().cloneNode(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processText(org.w3c.dom.Text,
-	 *      int[], java.util.Stack)
-	 */
-	protected Text processText(WorkNode node) {
-		Text currentNode = (Text) node.getNode();
-		int left = EditModelQuery.getNodeStartIndex(currentNode);
-		int right = EditModelQuery.getNodeEndIndex(currentNode);
-		int location1 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[0], true);
-		int location2 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[1], true);
-		int start = 0;
-		int end = right - left;
-		// left index
-		if (location1 > EditHelper.IN_MIDDLE
-				|| location2 < EditHelper.IN_MIDDLE) {
-			return null;
-		}
-		if (location1 <= EditHelper.IN_MIDDLE) {
-			start = node.getQualifiedOffsets()[0];
-		}
-		if (location2 >= EditHelper.IN_MIDDLE) {
-			end = node.getQualifiedOffsets()[1];
-		}
-		if (start == end) {
-			return null;
-		}
-        
-        try {
-        	String text = currentNode.getData().substring(start, end);
-        	return EditModelQuery.getDocumentNode(currentNode)
-        			.createTextNode(text);
-        } catch (DOMException e) {
-            // TODO: changed this from catching Exception
-            // DOMException is the only exception that 
-            // anything in the try is threatening to throw
-            // and even that is Runtime
-        	_log.error("Exception", e); //$NON-NLS-1$
-        	return null;
-        }
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java
deleted file mode 100644
index 985967b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CutCommand extends RangeModeCommand {
-	/**
-	 * @param viewer
-	 */
-	public CutCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("CutCommand.Label.Cut"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = new CutEdit(selection, getViewer());
-		if (EditModelQuery.isSame(selection)) {
-			return null;
-		}
-        if (edit.perform()) {
-        	return new DOMRange(edit.getOperationPosition(), edit
-        			.getOperationPosition());
-        }
-        return selection;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java
deleted file mode 100644
index c0a8104..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-
-/**
- * @author mengbo
- */
-public class CutEdit extends DeleteEdit {
-	/**
-	 * @param range
-	 * @param viewer 
-	 */
-	public CutEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		Stack result = deleteRange();
-		setClipboard(result);
-		return true;
-	}
-
-	/*
-	 * private Text cutText(Text text, int start, int end) {
-	 * EditValidateUtil.validStringIndexOffset(text, start, end - start); String
-	 * content = text.substringData(start, end - start); if (content == null ||
-	 * content.length() == 0) { return null; } text.deleteData(start, end -
-	 * start); return _document.createTextNode(content); }
-	 */
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java
deleted file mode 100644
index 26ea1d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * @author mengbo
- */
-public class DeleteCommand extends RangeModeCommand implements
-		ICaretPositionMover {
-	private boolean _forward;
-
-	/**
-	 * @param forward
-	 * @param viewer
-	 */
-	public DeleteCommand(boolean forward, IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("DeleteCommand.Label.Delete"), viewer); //$NON-NLS-1$
-		_forward = forward;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		if (selection == null) {
-			return null;
-		}
-
-		DesignEdit edit = new DeleteEdit(selection, getViewer(), _forward);
-		Listener listener = new Listener() {
-			public void handleEvent(Event event) {
-				event.type = SWT.NONE;
-			}
-		};
-		getViewer().getControl().getDisplay()
-				.addFilter(SWT.Selection, listener);
-		boolean status = edit.perform();
-		getViewer().getControl().getDisplay().removeFilter(SWT.Selection,
-				listener);
-		if (status) {
-			return new DOMRange(edit.getOperationPosition(), edit
-					.getOperationPosition());
-		}
-        return selection;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java
deleted file mode 100644
index 805e23c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-import java.util.Vector;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IETablePositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.LayoutPart;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DeleteEdit extends DesignEdit {
-	private static final Logger _log = PDPlugin.getLogger(DeleteEdit.class);
-
-	private static final boolean INNER_DEBUG = false;
-
-	private boolean _forward;
-
-	Vector deleted = new Vector();
-
-	/**
-	 * @param range
-	 * @param viewer
-	 * @param forward 
-	 */
-	public DeleteEdit(DOMRange range, GraphicalViewer viewer, boolean forward) {
-		super(range, viewer);
-		_forward = forward;
-	}
-
-	/**
-	 * @param range
-	 * @param viewer
-	 */
-	public DeleteEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		try {
-			boolean result = true;
-			if (EditModelQuery.isSame(getRange())) {
-				deleteSingle();
-			} else {
-				deleteRange();
-			}
-			return result;
-		} catch (Exception e) {
-			_log.error("Exception", e); //$NON-NLS-1$
-			return false;
-		}
-	}
-
-	/**
-	 * Delete one node or char at operation position.
-	 */
-	private void deleteSingle() {
-		IDOMPosition opPosition = getOperationPosition();
-		opPosition = EditHelper.moveToNextEditPosition(getOperationPosition(),
-				_forward, new InlineEditingNavigationMediator(new ActionData(
-						ActionData.INLINE_EDIT, null)));
-		// for inner debug
-		if (INNER_DEBUG) {
-			_log.info("EditHelper, now we are at:" + opPosition); //$NON-NLS-1$
-		}
-		if (EditModelQuery.isSame(opPosition, getOperationPosition())) {
-			return;
-		}
-        setRange(new DOMRange(opPosition, getOperationPosition()));
-        deleteRange();
-	}
-
-	/**
-	 * @return the stack
-	 */
-	protected Stack deleteRange() {
-		WorkNode root = getRootWorkNode();
-		Node rootNode = root.getNode();
-		Stack result = getProcessedResult();
-		collectOtherStyles(rootNode, result);
-		return result;
-	}
-
-	private boolean isTableComponents(WorkNode node) {
-		String name = node.getNode().getNodeName();
-		return (IHTMLConstants.TAG_TD.equalsIgnoreCase(name) || //
-				IHTMLConstants.TAG_TH.equalsIgnoreCase(name) || //
-				IHTMLConstants.TAG_TR.equalsIgnoreCase(name) || // 
-				IHTMLConstants.TAG_THEAD.equalsIgnoreCase(name) || //
-				IHTMLConstants.TAG_TBODY.equalsIgnoreCase(name) || //
-		IHTMLConstants.TAG_TFOOT.equalsIgnoreCase(name));
-	}
-
-	private Node processContainerTable(WorkNode node) {
-		Node result = null;
-		if ((isTableComponents(node) || IHTMLConstants.TAG_TABLE
-				.equalsIgnoreCase(node.getNode().getNodeName())) //
-				&& new IETablePositionRule(null).isInValidTable(node
-						.getNode())) {
-			result = node.getNode().cloneNode(false);
-		}
-		return result;
-	}
-
-	private Node processContainerStyleNodes(WorkNode node) {
-		String name = node.getNode().getNodeName();
-		Node result = null;
-		if (IHTMLConstants.TAG_LI.equalsIgnoreCase(name) || // 
-				EditModelQuery.HTML_STYLE_NODES.contains(node.getNode()
-						.getLocalName())) {
-			if (node.getNode().hasChildNodes()) {
-				result = node.getNode().cloneNode(false);
-			}
-		}
-		return result;
-	}
-
-	private Node processContainerView(WorkNode node) {
-		Node result = null;
-		if (IJSFConstants.TAG_VIEW.equalsIgnoreCase(node.getNode()
-				.getLocalName())) {
-			result = EditModelQuery.getDocumentNode(node.getNode())
-					.createElement(IJSFConstants.TAG_SUBVIEW);
-			result.setPrefix(node.getNode().getPrefix());
-		} else if (IHTMLConstants.TAG_BODY.equalsIgnoreCase(node.getNode()
-				.getNodeName())
-				|| IHTMLConstants.TAG_HTML.equalsIgnoreCase(node.getNode()
-						.getNodeName())) {
-			result = EditModelQuery.getDocumentNode(node.getNode())
-					.createElement(node.getNode().getNodeName());
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processContainer(org.eclipse.jst.pagedesigner.commands.range.WorkNode)
-	 */
-	protected Node processContainer(WorkNode node) {
-		Node result = processContainerView(node);
-		if (result == null) {
-			result = processContainerTable(node);
-		}
-		if (result == null) {
-			result = processContainerStyleNodes(node);
-		}
-		if (result == null) {
-			// strip out container
-			if (LayoutPart.getConcreteNode(node.getNode()) != null) {
-				Node parent = node.getNode().getParentNode();
-				Node refNode = node.getNode();
-				Node child = node.getNode().getFirstChild();
-				Node first = null, last = null;
-				int index = 0;
-				NodeList children = node.getNode().getChildNodes();
-				int size = children.getLength();
-				while (child != null) {
-					Node next = child.getNextSibling();
-					Node n = EditHelper.deleteNode(child);
-					parent.insertBefore(n, refNode);
-					if (index == 0) {
-						if (refNode != null) {
-							first = refNode.getPreviousSibling();
-						} else {
-							first = parent.getLastChild();
-						}
-					}
-					if (index == size - 1) {
-						if (refNode != null) {
-							last = refNode.getPreviousSibling();
-						} else {
-							last = parent.getLastChild();
-						}
-					}
-					index++;
-					child = next;
-				}
-				if (node.getPosOffsets()[0] <= 0) {
-					setOperationPosition(new DOMRefPosition(first, false));
-				} else {
-					setOperationPosition(new DOMRefPosition(last, true));
-				}
-			} else {
-				setOperationPosition(new DOMRefPosition(node.getNode(), false));
-			}
-			result = EditHelper.deleteNode(node.getNode());
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processNode(org.w3c.dom.Node,
-	 *      int[])
-	 */
-	protected Node processNode(WorkNode node) {
-		Node result = null;
-		if (!isTableComponents(node)
-				|| !new IETablePositionRule(null).isInValidTable(node
-						.getNode())) {
-			// it's not table components.
-			setOperationPosition(new DOMRefPosition(node.getNode(), false));
-			result = EditHelper.deleteNode(node.getNode());
-		}
-		return result;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processText(org.w3c.dom.Text,
-	 *      int[])
-	 */
-	protected Text processText(WorkNode node) {
-		Text currentNode = (Text) node.getNode();
-		int[] offsets = node.getPosOffsets();
-		Node second = null;
-		int location1 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[0], true);
-		int location2 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[1], true);
-		// left index
-		if (currentNode.getData().length() > 0) {
-			if (location1 == EditHelper.IN_MIDDLE) {
-				IDOMPosition position = new DOMPosition(currentNode, node
-						.getPosOffsets()[0]);
-				setOperationPosition(position);
-				position = DOMPositionHelper.splitText(position);
-				Node nnode = position.getNextSiblingNode();
-				if (nnode instanceof Text) {
-					currentNode = (Text) nnode;
-					offsets[1] -= offsets[0] > 0 ? offsets[0] : 0;
-				}
-			} else {
-				// setOperationPosition(new DOMRefPosition(currentNode, false));
-				if (currentNode.getPreviousSibling() != null) {
-					setOperationPosition(new DOMRefPosition(currentNode
-							.getPreviousSibling(), true));
-				} else {
-					setOperationPosition(new DOMPosition(currentNode
-							.getParentNode(), 0));
-				}
-			}
-			// right index
-			if (location2 >= EditHelper.IN_MIDDLE) {
-				IDOMPosition position = new DOMPosition(currentNode, offsets[1]);
-				position = DOMPositionHelper.splitText(position);
-				second = position.getPreviousSiblingNode();
-			}
-			return second != null ? (Text) EditHelper.deleteNode(second) : null;
-		}
-        setOperationPosition(new DOMRefPosition(currentNode, false));
-        return (Text) EditHelper.deleteNode(currentNode);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DesignEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DesignEdit.java
deleted file mode 100644
index d60faf4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DesignEdit.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public abstract class DesignEdit {
-
-    private Stack _selections;
-
-	private DOMRange _range;
-
-	private GraphicalViewer _viewer;
-
-	private IDOMPosition _operationPosition;
-
-	private final Document _document;
-
-	private Stack _processedResult;
-
-	/**
-	 * @param range
-	 * @param viewer
-	 */
-	public DesignEdit(DOMRange range, GraphicalViewer viewer) {
-		setRange(range);
-		_viewer = viewer;
-		_operationPosition = getRange().getStartPosition();
-		_document = ((IDOMNode) _operationPosition.getContainerNode())
-				.getModel().getDocument();
-	}
-
-	
-	/**
-	 * @return the target document
-	 */
-	protected final Document getDocument() {
-        return _document;
-    }
-
-    /**
-     * @return the result
-     */
-    protected abstract boolean operate();
-
-	/**
-	 * @param node
-	 * @return the text
-	 */
-	protected abstract Text processText(WorkNode node);
-
-	/**
-	 * @param node
-	 * @return the node 
-	 */
-	protected abstract Node processNode(WorkNode node);
-
-	/**
-	 * @param node
-	 * @return the node
-	 */
-	protected abstract Node processContainer(WorkNode node);
-
-	/**
-	 * @return the dom range
-	 */ 
-	public DOMRange getRange() {
-		return _range;
-	}
-
-	void setRange(DOMRange range) {
-		range = EditHelper.normal(range);
-		IDOMPosition start = EditHelper.ensureDOMPosition(range
-				.getStartPosition());
-		IDOMPosition end = EditHelper.ensureDOMPosition(range.getEndPosition());
-		_range = new DOMRange(start, end);
-		EditValidateUtil.validRange(range);
-	}
-
-	/**
-	 * @return the clipboard
-	 */
-	protected Clipboard getClipboard() {
-		return new Clipboard(_viewer.getControl().getDisplay());
-	}
-
-	/**
-	 * @return the position
-	 */
-	public IDOMPosition getOperationPosition() {
-		// try
-		// {
-		// Assert.isTrue(_operationPosition != null &&
-		// _operationPosition.getContainerNode() != null &&
-		// _operationPosition.getOffset() > -1);
-		// if (_operationPosition.isText())
-		// {
-		// int length = ((Text)
-		// _operationPosition.getContainerNode()).getLength();
-		// Assert.isTrue(_operationPosition.getOffset() >= 0 &&
-		// _operationPosition.getOffset() <= length);
-		// }
-		// }
-		// catch (Exception e)
-		// {
-		// // "Error", "Error in operation location move"
-		// PDPlugin.getAlerts().confirm("Alert.DesignEdit.opLocationValidTitle",
-		// "Alert.DesignEdit.opLocationValidMessage"); //$NON-NLS-1$
-		// //$NON-NLS-2$
-		// }
-
-		return _operationPosition;
-	}
-
-	/**
-	 * @param position
-	 */
-	protected void setOperationPosition(IDOMPosition position) {
-		if (!EditValidateUtil.validPosition(position)) {
-			return;
-		}
-		position = EditHelper.ensureDOMPosition(position);
-		_operationPosition = position;
-	}
-
-	/**
-	 * @return the result of performing the edit
-	 */
-	public boolean perform() {
-		boolean result = false;
-
-		result = operate();
-		return result;
-	}
-
-	/**
-	 * @return Returns the _viewer.
-	 */
-	public GraphicalViewer getViewer() {
-		return _viewer;
-	}
-
-	private Stack collectNodes() {
-		Node node;
-		Stack result = new Stack();
-		IDOMPosition start = getRange().getStartPosition(), end = getRange()
-				.getEndPosition();
-		int pos[] = new int[] { EditModelQuery.getIndexedRegionLocation(start),
-				EditModelQuery.getIndexedRegionLocation(end), };
-		if (!EditModelQuery.isSame(start, end)) {
-			Node ancestor = EditModelQuery.getInstance().getCommonAncestor(
-					start, end);
-			WorkNode rootWorkNode = new WorkNode(ancestor, pos[0], pos[1]);
-			rootWorkNode.setRoot(true);
-			result.push(rootWorkNode);
-			try {
-				// Loop all the children of the ancestor, and and the result
-				// will be collected
-				if (EditModelQuery.isText(ancestor)) {
-					Stack temp = new Stack();
-					EditHelper.getInstance().collectNodes(ancestor, pos[0],
-							pos[1], ancestor, temp);
-					WorkNode wNode = (WorkNode) temp.remove(0);
-					wNode.setParent(rootWorkNode);
-					result.push(wNode);
-				} else {
-					node = ancestor.getFirstChild();
-					Stack temp = new Stack();
-					while (node != null) {
-						EditHelper.getInstance().collectNodes(node, pos[0],
-								pos[1], ancestor, temp);
-						while (temp.size() > 0) {
-							WorkNode wNode = (WorkNode) temp.remove(0);
-							if (wNode.getNode().getParentNode() == ancestor) {
-								wNode.setParent(rootWorkNode);
-							}
-							result.push(wNode);
-						}
-						node = node.getNextSibling();
-					}
-				}
-			} catch (Exception e) {
-				result.clear();
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @return Returns the result.
-	 */
-	public Stack getSelections() {
-		if (_selections == null) {
-			_selections = collectNodes();
-		}
-		return _selections;
-	}
-
-	/**
-	 * @return the result stack
-	 */
-	public Stack getProcessedResult() {
-		if (_processedResult == null) {
-			_processedResult = new Stack();
-			WorkNode rootNode = getRootWorkNode();
-			if (rootNode != null) {
-				processNodes(rootNode, _processedResult);
-			}
-		}
-		return _processedResult;
-	}
-
-	/**
-	 * @return the root work node
-	 */
-	protected final WorkNode getRootWorkNode() {
-		WorkNode result = null;
-		if (getSelections().size() > 0) {
-			WorkNode node = (WorkNode) getSelections().get(0);
-			while (node.getParent() != null) {
-				node = node.getParent();
-			}
-			result = node;
-			Assert.isTrue(node.isRoot());
-		}
-		return result;
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 * @return true if node
-	 */
-	private final boolean processText(WorkNode node, Stack result) {
-		boolean done = false;
-		if (EditModelQuery.isText(node.getNode())) {
-			Node text = processText(node);
-			if (text != null) {
-				result.add(text);
-			}
-			getSelections().remove(node);
-			done = true;
-		}
-		return done;
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 */
-	private final void processContainer(WorkNode node, Stack result) {
-		processContainer(node);
-		getSelections().remove(node);
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 * @return true if done
-	 */
-	private final boolean processChildren(WorkNode node, Stack result) {
-		boolean done = false;
-		if (getFirstSelectedChild(node) != null) {
-			Stack myResult = new Stack();
-			{
-				WorkNode child = null;
-				while ((child = getFirstSelectedChild(node)) != null) {
-					{
-						processNodes(child, myResult);
-					}
-				}
-				Node newParent = processContainer(node);
-				newParent = toBeParent(newParent, myResult);
-				result.push(newParent);
-			}
-			getSelections().remove(node);
-			done = true;
-		}
-		return done;
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 * @return true if done
-	 */
-	private final boolean processChildren1(WorkNode node, Stack result) {
-		boolean done = false;
-		if (node.getNode().hasChildNodes()) {
-			Stack myResult = new Stack();
-			{
-				Node childNode = node.getNode().getFirstChild();
-				Node next = null;
-				while (childNode != null) {
-					next = childNode.getNextSibling();
-					int x1 = EditModelQuery.getNodeStartIndex(childNode) - 1;
-					int x2 = EditModelQuery.getNodeEndIndex(childNode) + 1;
-					processNodes(new WorkNode(childNode, x1, x2), myResult);
-					childNode = next;
-				}
-				Node newParent = processContainer(node);
-				newParent = toBeParent(newParent, myResult);
-				result.push(newParent);
-			}
-			getSelections().remove(node);
-			done = true;
-		}
-		return done;
-	}
-
-	/**
-	 * Process the nodes that are selected, the result is a collection of nodes
-	 * that either are clones or the nodes cuted.
-	 * 
-	 * @param node
-	 * @param result
-	 */
-	protected final void processNodes(WorkNode node, Stack result) {
-		WorkNode child = null;
-		if (node.isRoot()) {
-			while ((child = getFirstSelectedChild(node)) != null) {
-				processNodes(child, result);
-			}
-		} else {
-			if (node.isWholeSelected()
-					|| //
-					(!EditModelQuery.isText(node.getNode()) && EditModelQuery
-							.getInstance().isSingleRegionNode(node.getNode()))
-					|| //
-					EditModelQuery.isWidget(node.getNode())) {
-				Node temp = processNode(node);
-				if (temp != null) {
-					result.push(temp);
-					getSelections().remove(node);
-				} else {
-					if (!processText(node, result)) {
-						if (!processChildren1(node, result)) {
-							processContainer(node, result);
-						}
-					}
-				}
-			} else {
-				if (!processText(node, result)) {
-					if (!processChildren(node, result)) {
-						processContainer(node, result);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param result
-	 */
-	protected void setClipboard(Stack result) {
-		Node[] nodes = (Node[]) result.toArray(new Node[result.size()]);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0, size = nodes.length; i < size; i++) {
-			DOMUtil.nodeToString(nodes[i], sb);
-		}
-		getClipboard().setContents(
-				new Object[] { result, sb.toString() },
-				new Transfer[] { TemplateTransfer.getInstance(),
-						TextTransfer.getInstance() });
-	}
-
-	private Node toBeParent(Node parent, Stack children) {
-		while (children.size() > 0) {
-			parent.appendChild((Node) children.remove(0));
-		}
-		return parent;
-	}
-
-	private WorkNode getFirstSelectedChild(WorkNode node) {
-		for (int i = 0, n = getSelections().size(); i < n; i++) {
-			WorkNode wNode = (WorkNode) getSelections().get(i);
-			if (wNode.getParent() == node) {
-				return wNode;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param rootNode
-	 * @param result
-	 * @return the node
-	 */
-	Node collectStyleNodes(Node rootNode, Vector result) {
-		Element element = null;
-		if (rootNode instanceof Element) {
-			element = (Element) rootNode;
-		} else if (rootNode.getParentNode() != null) {
-			element = (Element) rootNode.getParentNode();
-		}
-		ICSSStyle style = CSSUtil.getCSSStyle(element);
-
-		Node node = EditModelQuery.getDocumentNode(rootNode).createElement(
-				"span"); //$NON-NLS-1$
-		for (int i = 0, n = result.size(); i < n; i++) {
-			node.appendChild((Node) result.elementAt(i));
-		}
-		((Element) node).setAttribute(IHTMLConstants.ATTR_STYLE, CSSUtil
-				.resolveCSSStyle(style));
-		result.removeAllElements();
-		result.add(node);
-		return node;
-	}
-
-	/**
-	 * @param rootNode
-	 * @param result 
-	 * @return the node
-	 */
-	protected final Node collectOtherStyles(Node rootNode, Vector result) {
-		Node cur = rootNode, prev = null, appendPoint = null;
-		if (EditValidateUtil.validNode(rootNode)) {
-			while (!EditModelQuery.isDocument(cur)) {
-				if (!EditValidateUtil.validNode(cur)) {
-					return null;
-				}
-				String name = cur.getNodeName() != null ? cur.getNodeName()
-						.toLowerCase() : ""; //$NON-NLS-1$
-				if (EditModelQuery.HTML_STYLE_NODES.contains(name)) {
-					if (prev != null) {
-						Node newone = cur.cloneNode(false);
-						newone.appendChild(prev);
-						prev = newone;
-					} else {
-						prev = cur.cloneNode(false);
-						appendPoint = prev;
-					}
-				}
-				cur = cur.getParentNode();
-			}
-			if (appendPoint != null) {
-				for (int i = 0, n = result.size(); i < n; i++) {
-					appendPoint.appendChild((Node) result.elementAt(i));
-				}
-				result.removeAllElements();
-				result.add(prev);
-			}
-		}
-		return prev;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java
deleted file mode 100644
index 9922329..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public interface IInputSourceProvider {
-	/**
-	 * @return Returns the _data.
-	 */
-	public Node[] getNodes();
-
-	/**
-	 * @return the string data
-	 */
-	public String getStringData();
-
-	/**
-	 * @return the character data
-	 */
-	public Character getCharacterData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertCommand.java
deleted file mode 100644
index 0723268..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertCommand.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class InsertCommand extends RangeModeCommand implements
-		ICaretPositionMover {
-
-	private IInputSourceProvider _data;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 * @param data 
-	 */
-	public InsertCommand(String label, IHTMLGraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(label, viewer);
-		_data = data;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = null;
-		edit = new InsertEdit(selection, getViewer(), _data);
-		edit.perform();
-		selection = new DOMRange(edit.getOperationPosition(), edit
-				.getOperationPosition());
-		return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertEdit.java
deleted file mode 100644
index bcf96eb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertEdit.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * InsertEdit will perform action at a single location, the data souce could be
- * clipboard or keyboard.
- * 
- * @author mengbo
- */
-public class InsertEdit extends DeleteEdit {
-	private IInputSourceProvider _data;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	public boolean operate() {
-		DOMRange range = getRange();
-		if (!EditModelQuery.isSame(range.getStartPosition(), range
-				.getEndPosition())) {
-			deleteRange();
-			range = new DOMRange(getOperationPosition(), getOperationPosition());
-			setRange(range);
-		}
-		if (insertNodes()) {
-			return true;
-		} else if (insertString()) {
-			return true;
-		} else {
-			return insertChar();
-		}
-	}
-
-	/**
-	 * @param range
-	 * @param viewer
-	 * @param data 
-	 */
-	public InsertEdit(DOMRange range, GraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(range, viewer);
-		_data = data;
-	}
-
-	/**
-	 * @param position
-	 * @param viewer
-	 * @param data
-	 */
-	public InsertEdit(IDOMPosition position, GraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(new DOMRange(position, position), viewer);
-		setOperationPosition(position);
-		_data = data;
-	}
-
-	/**
-	 * @return ??
-	 */
-	public boolean insertChar() {
-		if (_data.getStringData() == null) {
-			return false;
-		}
-		IDOMPosition position = getOperationPosition();
-		if (position.isText()) {
-			Text text = EditModelQuery.getInstance().getText(position);
-			text.insertData(getOperationPosition().getOffset(), _data
-					.getCharacterData().toString());
-			setOperationPosition(new DOMPosition(text, position.getOffset() + 1));
-		} else {
-			Node refNode = position.getNextSiblingNode();
-			Text text = getDocument().createTextNode(_data.getCharacterData()
-					.toString());
-			position.getContainerNode().insertBefore(text, refNode);
-			setOperationPosition(new DOMPosition(text, text.getLength()));
-		}
-		return true;
-	}
-
-	/**
-	 * @return ????
-	 */
-	public boolean insertString() {
-		String content = _data.getStringData();
-		if (content != null) {
-			IDOMPosition position = getOperationPosition();
-			if (position.isText()) {
-				Text text = EditModelQuery.getInstance().getText(position);
-				text.insertData(getOperationPosition().getOffset(), content);
-				setOperationPosition(new DOMPosition(text, position.getOffset()
-						+ content.length()));
-			} else {
-				Node refNode = position.getNextSiblingNode();
-				Text text = getDocument().createTextNode(content);
-				position.getContainerNode().insertBefore(text, refNode);
-				setOperationPosition(new DOMPosition(text, text.getLength()));
-			}
-			return true;
-		}
-		return false;
-	}
-
-	private boolean insertNodes() {
-		Node[] nodes = _data.getNodes();
-		if (nodes == null) {
-			return false;
-		}
-		IDOMPosition position = getOperationPosition();
-		if (position == null) {
-			return false;
-		}
-		Node refNode = null;
-		if (position.isText()) {
-			position = DOMPositionHelper.splitText(position);
-		}
-		refNode = position.getNextSiblingNode();
-		Node parent = position.getContainerNode();
-		Node node = null;
-		for (int i = 0; i < nodes.length; i++) {
-			node = DOMUtil.cloneNodeDeep(getDocument(), nodes[i]);
-			String prefix = node.getPrefix();
-			String name = node.getLocalName();
-			if (name != null
-					&& ITLDConstants.URI_JSP.equals(prefix)
-					&& (node.getLocalName().startsWith(
-							IJSPCoreConstants.TAG_LEADING_DIRECTIVE)
-							|| IJSPCoreConstants.TAG_DECLARATION.equals(name)
-							|| IJSPCoreConstants.TAG_EXPRESSION.equals(name) || IJSPCoreConstants.TAG_SCRIPTLET
-							.equals(name))) {
-				// it is a jsp tag
-				((IDOMElement) node).setJSPTag(true);
-			}
-			node = parent.insertBefore(node, refNode);
-		}
-
-		if (node != null) {
-			setOperationPosition(new DOMRefPosition(node, true));
-		} else if (refNode != null) {
-			setOperationPosition(new DOMRefPosition(refNode, false));
-		} else {
-			setOperationPosition(new DOMRefPosition(parent.getLastChild(), true));
-		}
-		return true;
-	}
-
-    // TODO: dead?
-//	private boolean splitNode() {
-//		if ((getViewer()).getSelection() instanceof DesignRange
-//				&& _data.getCharacterData() != null
-//				&& _data.getCharacterData().charValue() == '\r') {
-//			DesignRange range = (DesignRange) (getViewer()).getSelection();
-//			Node node = range.getStartPosition().getContainerNode();
-//			if (EditModelQuery.isText(node)) {
-//				node = node.getParentNode();
-//			}
-//			if (EditModelQuery.isListItem(node)) {
-//				IDOMPosition position = DOMPositionHelper.toDOMPosition(range
-//						.getStartPosition());
-//				// split text and it's parent.
-//				position = EditHelper.splitNode(position);
-//				position = EditHelper.splitNode(position);
-//				position = EditHelper.moveInto(position.getNextSiblingNode(),
-//						new InlineEditingNavigationMediator(new ActionData(
-//								ActionData.INLINE_EDIT, null)), true);
-//				setOperationPosition(position);
-//				return true;
-//			}
-//		}
-//		return false;
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/KeyboardData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/KeyboardData.java
deleted file mode 100644
index 7f194bc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/KeyboardData.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.swt.SWT;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class KeyboardData implements IInputSourceProvider {
-	private Character _keyCode;
-
-	private int _stateMask;
-
-	private GraphicalViewer _viewer;
-
-	/**
-	 * @param code
-	 * @param mask
-	 * @param viewer
-	 */
-	public KeyboardData(char code, int mask, GraphicalViewer viewer) {
-		if ((mask & SWT.SHIFT) != 0) {
-			_keyCode = new Character(Character.toUpperCase(code));
-		} else {
-			_keyCode = new Character(code);
-		}
-		_stateMask = mask;
-		_viewer = viewer;
-	}
-
-	/**
-	 * @return Returns the keyCode.
-	 */
-	public int getKeyCode() {
-		return _keyCode.charValue();
-	}
-
-	/**
-	 * @param keyCode
-	 *            The keyCode to set.
-	 */
-	public void setKeyCode(char keyCode) {
-		this._keyCode = new Character(keyCode);
-	}
-
-	/**
-	 * @return Returns the stateMask.
-	 */
-	public int getStateMask() {
-		return _stateMask;
-	}
-
-	/**
-	 * @param stateMask
-	 *            The stateMask to set.
-	 */
-	public void setStateMask(int stateMask) {
-		this._stateMask = stateMask;
-	}
-
-	/**
-	 * @param keyCode
-	 * @return the node or null
-	 */
-	public Node getSpecialNode(KeyboardData keyCode) {
-		Object name;
-		EditDomain domain = _viewer.getEditDomain();
-		Document document = null;
-		if (domain instanceof DefaultEditDomain) {
-			document = ((HTMLEditor) (((DefaultEditDomain) domain)
-					.getEditorPart())).getDOMDocument();
-		}
-		// if ((keyCode.getStateMask() & SWT.SHIFT) != 0)
-		{
-			if ((name = EditModelQuery.CHAR_NODE_MAP.get(keyCode
-					.getCharacterData())) != null) {
-				return document.createElement((String) name);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the _data.
-	 */
-	public Node[] getNodes() {
-		Node node = getSpecialNode(this);
-		if (node != null) {
-			return new Node[] { node };
-		}
-		return null;
-	}
-
-	public String getStringData() {
-		return _keyCode.toString();
-	}
-
-	// public Key
-	public Character getCharacterData() {
-		return _keyCode;
-	}
-
-	/**
-	 * @return the char value of the key code
-	 */
-	public char getChar() {
-		return _keyCode.charValue();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/Paragraph.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/Paragraph.java
deleted file mode 100644
index c3757d0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/Paragraph.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class Paragraph {
-	private DOMRange _range;
-
-	/**
-	 * @param start
-	 * @param end
-	 */
-	public Paragraph(IDOMPosition start, IDOMPosition end) {
-		_range = new DOMRange(start, end);
-	}
-
-	/**
-	 * @return the lowest container node
-	 */
-	public Node getLowestContainer() {
-		return EditModelQuery.getInstance().getCommonAncestor(
-				_range.getStartPosition(), _range.getEndPosition());
-	}
-
-	/**
-	 * @return Returns the _end.
-	 */
-	public final IDOMPosition getStart() {
-		return _range.isOrdered() ? _range.getStartPosition() : _range
-				.getEndPosition();
-	}
-
-	/**
-	 * @return Returns the _start.
-	 */
-	public final IDOMPosition getEnd() {
-		return _range.isOrdered() ? _range.getEndPosition() : _range
-				.getStartPosition();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphApplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphApplyStyleCommand.java
deleted file mode 100644
index d25f65e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphApplyStyleCommand.java
+++ /dev/null
@@ -1,408 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Arrays;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMRefPosition;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class ParagraphApplyStyleCommand extends ApplyStyleCommand {
-
-    /**
-     * the list of possible html heading tags
-     */
-    private static final String[] HH = { "h1", "h2", "h3", "h4", "h5", "h6" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-
-    /**
-	 * @param viewer
-	 * @param tag
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphApplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(viewer, tag, property, value);
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphApplyStyleCommand(IHTMLGraphicalViewer viewer,
-			Element node, String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			Node container = null;
-			if (EditModelQuery.isSame(range)) {
-				container = start.getContainerNode();
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				start = p.getStart();
-				end = p.getEnd();
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			DOMRange rt;
-			// This code is for h1-h6 only, it may need to be replaced.
-			if ((rt = replaceExistingH(start, end)) != null) {
-				return rt;
-			}
-			// replace existing p
-			if (getTag().equalsIgnoreCase(IHTMLConstants.TAG_P)) {
-				rt = replaceExistingP(start, end);
-				if (rt != null) {
-					return rt;
-				}
-			}
-			if (start.getContainerNode() == end.getContainerNode()) {
-				int offset1 = start.getOffset();
-				int offset2 = end.getOffset();
-				IDOMPosition old = start;
-				start = split(start);
-				// parent is splited
-				if (start != old) {
-					container = start.getNextSiblingNode();
-					offset2 -= offset1;
-					end = new DOMPosition(container, offset2);
-				}
-				end = split(end);
-			} else {
-				start = split(common, start);
-				end = split(common, end);
-			}
-			range = InsertStyleTag(new DOMRange(start, end));
-		}
-		return range;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return true;
-	}
-
-	/*
-	 * Try to split the node so that we can avoid wrap its children directly.
-	 * Begining from 'position' the split can reach as high as the level of
-	 * 'common'.
-	 */
-	private IDOMPosition split(Node common, IDOMPosition position) {
-		Assert.isTrue(EditModelQuery.isChild(common, position
-				.getContainerNode()));
-		Node container = position.getContainerNode();
-		String[] styleNodes = new String[EditModelQuery.HTML_STYLE_NODES.size()];
-		EditModelQuery.HTML_STYLE_NODES.toArray(styleNodes);
-		while (EditModelQuery.isText(container) || (container != common && //
-				EditModelQuery.containItem(styleNodes, container, true))) {
-			IDOMPosition old = position;
-			position = EditHelper.splitNode(position);
-			if (old == position) {
-				int pos = EditHelper.getLocation(position);
-				switch (pos) {
-				case -1:
-					position = new DOMRefPosition(position.getContainerNode(),
-							false);
-					break;
-				case 1:
-					position = new DOMRefPosition(position.getContainerNode(),
-							true);
-				}
-			}
-			Node containerBackup = container;
-			container = container.getParentNode();
-			if (containerBackup.getNodeName().equalsIgnoreCase(
-					IHTMLConstants.TAG_P)) {
-				container.removeChild(containerBackup);
-			}
-		}
-		return position;
-	}
-
-	/*
-	 * Split the position's container node only.
-	 */
-	private IDOMPosition split(IDOMPosition position) {
-		Node container = position.getContainerNode();
-		String[] styleNodes = new String[EditModelQuery.HTML_STYLE_NODES.size()];
-		EditModelQuery.HTML_STYLE_NODES.toArray(styleNodes);
-		if (EditModelQuery.isText(container)
-				|| EditModelQuery.containItem(styleNodes, container, true)) {
-			return EditHelper.splitNode(position);
-		}
-		return position;
-	}
-
-	private DOMRange replaceExistingH(IDOMPosition start, IDOMPosition end) {
-		Node common = EditModelQuery.getInstance()
-				.getCommonAncestor(start, end);
-		// Here we insert some code to avoid creating tags duplicated. but these
-		// are not the entire cases.
-		if (Arrays.asList(HH).contains(
-				getAName(getTag()).toLowerCase())
-				&& Arrays.asList(HH).contains(
-						getAName(common.getNodeName()).toLowerCase())) {
-			// uncheck action menu
-			if (getAName(getTag()).toLowerCase().equalsIgnoreCase(
-					getAName(common.getNodeName()).toLowerCase())) {
-				NodeList nodes = common.getChildNodes();
-
-				for (int i = 0, size = nodes.getLength(); i < size; i++) {
-					common.getParentNode().insertBefore(nodes.item(i), common);
-				}
-				common.getParentNode().removeChild(common);
-				return new DOMRange(start, end);
-			}
-			start = DOMPositionHelper.toDOMRefPosition(start);
-			end = DOMPositionHelper.toDOMRefPosition(end);
-			Node newHNode = EditModelQuery.getDocumentNode(common)
-					.createElement(getTag());
-			EditModelQuery.copyChildren(common, newHNode);
-			common.getParentNode().replaceChild(newHNode, common);
-			return new DOMRange(start, end);
-		}
-		return null;
-	}
-
-	private DOMRange replaceExistingP(IDOMPosition start, IDOMPosition end) {
-		// find the selected startNode,endNode and start node's parent node
-		Node startNode = start instanceof IDOMRefPosition ? start
-				.getNextSiblingNode() : start.getContainerNode();
-		Node endNode = end instanceof IDOMRefPosition ? end
-				.getPreviousSiblingNode() : end.getContainerNode();
-		Node parentNode = startNode.getParentNode();
-
-		if (!(start.isText()) && start instanceof DOMPosition) {
-			startNode = startNode.getChildNodes().item(start.getOffset());
-			parentNode = start.getContainerNode();
-		}
-		if (!(end.isText()) && end instanceof DOMPosition) {
-			// because the offset is based on the position between nodes,so we
-			// need to reduce one from the offset
-			// in order to get the correct end node.
-			endNode = endNode.getChildNodes().item(end.getOffset() - 1);
-		}
-
-		// compute selected character number in the text or selected element
-		// number under a node
-		int len = 0;
-//		if (start instanceof DOMPosition && end instanceof DOMPosition
-//				|| start instanceof IDOMPosition && end instanceof IDOMPosition) {
-        // TODO: as written, this will be the only statement run, since
-        // both start and end are instanceof IDOMPosition by defn.
-			len = end.getOffset() - start.getOffset();
-//		} else {
-//			IDOMRefPosition startRef = null;
-//			IDOMRefPosition endRef = null;
-//			if (!(start.isText()) && start instanceof DOMPosition) {
-//				startRef = new DOMRefPosition(startNode, false);
-//			} else if (!(end.isText()) && end instanceof DOMPosition) {
-//				endRef = new DOMRefPosition(endNode, true);
-//			}
-//			len = (endRef != null ? endRef.getOffset() : end.getOffset())
-//					- (startRef != null ? startRef.getOffset() : start
-//							.getOffset());
-//		}
-
-		// if a full Text node is selected,and the Text node is the only child
-		// of its parent
-		if ((startNode == endNode) && (startNode instanceof Text)) {
-			TextEditPart part = (TextEditPart) ((INodeNotifier) startNode)
-					.getAdapterFor(EditPart.class);
-			boolean condition = false;
-			if (start instanceof IDOMRefPosition
-					|| (start instanceof DOMPosition && !start.isText())) {
-				condition = parentNode.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_P)
-						&& parentNode.getChildNodes().getLength() == 1;
-			} else {
-				condition = parentNode.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_P)
-						&& parentNode.getChildNodes().getLength() == 1
-						&& part.getTextData().length() == len;
-			}
-			if (condition) {
-				// if uncheck the align action
-				if (this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN)
-						.equals(
-								((Element) parentNode)
-										.getAttribute(IHTMLConstants.ATTR_ALIGN))) {
-					((Element) parentNode)
-							.removeAttribute(IHTMLConstants.ATTR_ALIGN);
-					IDOMPosition startPos = new DOMPosition(parentNode, 0);
-					IDOMPosition endPos = new DOMRefPosition(endNode, true);
-					return new DOMRange(startPos, endPos);
-				}
-				// else replace the align attribute
-				/**
-				 * this._applyingNode.appendChild(startNode);
-				 * parentNode.getParentNode().replaceChild(this._applyingNode,
-				 * parentNode);
-				 */
-				String align = this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN);
-				((Element) parentNode).setAttribute(IHTMLConstants.ATTR_ALIGN,
-						align);
-
-				IDOMPosition startPos = new DOMPosition(parentNode, 0);
-				IDOMPosition endPos = new DOMRefPosition(endNode, true);
-				return new DOMRange(startPos, endPos);
-			}
-		} else {
-			if (parentNode != null
-					&& parentNode.getNodeName().equalsIgnoreCase(
-							IHTMLConstants.TAG_P)
-					&& parentNode.getChildNodes().getLength() == len) {
-				if (this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN)
-						.equals(
-								((Element) parentNode)
-										.getAttribute(IHTMLConstants.ATTR_ALIGN))) {
-					((Element) parentNode)
-							.removeAttribute(IHTMLConstants.ATTR_ALIGN);
-					IDOMPosition startPos = new DOMPosition(parentNode, 0);
-					IDOMPosition endPos = new DOMRefPosition(endNode, true);
-					return new DOMRange(startPos, endPos);
-				}
-
-				/**
-				 * Node sibling = startNode.getNextSibling();
-				 * this._applyingNode.appendChild(startNode); Node
-				 * endNodeSibling = endNode.getNextSibling(); while (sibling !=
-				 * null && startNode != endNode && sibling != endNodeSibling) {
-				 * Node tempNode = sibling.getNextSibling();
-				 * this._applyingNode.appendChild(sibling); sibling = tempNode; }
-				 * parentNode.getParentNode().replaceChild(this._applyingNode,
-				 * parentNode);
-				 */
-				String align = this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN);
-				((Element) parentNode).setAttribute(IHTMLConstants.ATTR_ALIGN,
-						align);
-
-				IDOMPosition startPos = new DOMPosition(parentNode, 0);
-				IDOMPosition endPos = new DOMRefPosition(endNode, true);
-				return new DOMRange(startPos, endPos);
-			}
-		}
-		return null;
-	}
-
-	private DOMRange InsertStyleTag(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node startContainer = start.getContainerNode();
-		Node endContainer = end.getContainerNode();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-        if (startContainer instanceof Text) {
-        	// if the start offset is 0,then skip split the Text
-        	if (start.getOffset() > 0) {
-        		startContainer = ((Text) startContainer).splitText(start
-        				.getOffset());
-        		start = new DOMRefPosition(startContainer, false);
-        	}
-        } else {
-        	startContainer = start.getNextSiblingNode();
-        }
-        if (endContainer instanceof Text) {
-        	if (end.getOffset() > 0) {
-        		endContainer = ((Text) endContainer).splitText(end
-        				.getOffset());
-        		endContainer = endContainer.getPreviousSibling();
-        	} else {
-        		endContainer = endContainer.getPreviousSibling();
-        	}
-        } else {
-        	endContainer = end.getPreviousSiblingNode();
-        }
-
-        // now the startContainer and the endContainer should share the same
-        // parent
-        Element newNode = createStyleElement();
-        startContainer.getParentNode()
-        		.insertBefore(newNode, startContainer);
-
-        Node sibling = startContainer.getNextSibling();
-        newNode.appendChild(startContainer);
-        Node endNodeSibling = endContainer.getNextSibling();
-        while (sibling != null && startContainer != endContainer
-        		&& sibling != endNodeSibling) {
-        	Node tempNode = sibling.getNextSibling();
-        	newNode.appendChild(sibling);
-        	sibling = tempNode;
-        }
-
-        IDOMPosition startPos = new DOMPosition(newNode, 0);
-        IDOMPosition endPos = new DOMRefPosition(endContainer, true);
-        return new DOMRange(startPos, endPos);
-	}
-
-	private static String getAName(String name) {
-		return name == null ? "" : name; //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java
deleted file mode 100644
index 1dfda9d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphFinder {
-	private final IDOMPosition _position;
-
-	/**
-	 * @param position
-	 */
-	public ParagraphFinder(IDOMPosition position) {
-		_position = position;
-	}
-
-	/**
-	 * @return the dom position
-	 */
-	public IDOMPosition getPosition() {
-		return _position;
-	}
-
-	private Node findInlineSiblings(IDOMPosition position, List result,
-			boolean forward) {
-		Node container = EditModelQuery.getInstance().getSibling(position,
-				forward);
-		if (!forward) {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getPreviousSibling();
-			}
-		} else {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getNextSibling();
-			}
-		}
-		// the result will be non-zero length.
-		return null;
-	}
-
-	private Node getParagraphNodes(IDOMPosition position, List result,
-			boolean forward) {
-		Node sResult = findInlineSiblings(position, result, forward);
-		Node container = position.getContainerNode();
-		container = position.isText() ? container.getParentNode() : container;
-		while (sResult == null) {
-			// stop at block, special container and H style nodes.
-			if (EditModelQuery.isBlockNode(container)
-					|| EditModelQuery.isDocument(container)
-					|| (container.getLocalName() != null && (container
-							.getLocalName().equals(IJSFConstants.TAG_VIEW) || container
-							.getLocalName().equalsIgnoreCase(
-									IHTMLConstants.TAG_HTML)))) {
-				return container;
-			}
-			position = new DOMRefPosition(container, forward);
-			sResult = findInlineSiblings(position, result, forward);
-			container = container.getParentNode();
-		}
-		return sResult;
-	}
-
-	/**
-	 * Search for an area between two block nodes or within a block node, search
-	 * will stop before or under a node which has block display-type, or
-	 * particular container like "html", jsf "view", .etc, two positions (left
-	 * and right) are returned in result.
-	 * 
-	 * The searcher will search parent's directly children, if no block node is
-	 * found, then go up the node tree to search again.
-	 * 
-	 * @param position
-	 * @return the paragraph
-	 */
-	public Paragraph getParagraph(IDOMPosition position) {
-		List tempResult = new ArrayList();
-		IDOMPosition p1, p2;
-		Node r1 = getParagraphNodes(position, tempResult, true);
-		if (EditModelQuery.isChild(r1, position.getContainerNode())) {
-			p1 = new DOMPosition(r1, r1.getChildNodes().getLength());
-		} else {
-			p1 = new DOMRefPosition(r1, false);
-		}
-
-		Node r2 = getParagraphNodes(position, tempResult, false);
-		if (EditModelQuery.isChild(r2, position.getContainerNode())) {
-			p2 = new DOMPosition(r2, 0);
-		} else {
-			p2 = new DOMRefPosition(r2, true);
-		}
-		return new Paragraph(p1, p2);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java
deleted file mode 100644
index 328621e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphUnapplyStyleCommand extends ApplyStyleCommand {
-	private String _groupTags[];
-
-	/**
-	 * @param viewer
-	 * @param tags
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphUnapplyStyleCommand(IHTMLGraphicalViewer viewer,
-			String[] tags, String property, String value) {
-		super(viewer, "", property, value); //$NON-NLS-1$
-		_groupTags = tags;
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphUnapplyStyleCommand(IHTMLGraphicalViewer viewer,
-			Element node, String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	private DOMRange removeExistingStyles(IDOMPosition start, IDOMPosition end) {
-		Node common = null;
-		if (EditModelQuery.isSame(start, end)) {
-			ParagraphFinder finder = new ParagraphFinder(start);
-			Paragraph p = finder.getParagraph(start);
-			start = p.getStart();
-			end = p.getEnd();
-			common = p.getLowestContainer();
-		} else {
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-		}
-		// Here we insert some code to avoid creating tags duplicated. but these
-		// are not the entire cases.
-		// if (Arrays.asList(_groupTags).contains(common.getNodeName()))
-		if (EditModelQuery.containItem(_groupTags, common, true)) {
-			start = DOMPositionHelper.toDOMRefPosition(start);
-			end = DOMPositionHelper.toDOMRefPosition(end);
-			Node parent = common.getParentNode();
-			EditModelQuery.copyChildren(common, parent);
-			common.getParentNode().removeChild(common);
-			return new DOMRange(start, end);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		return removeExistingStyles(range.getStartPosition(), range
-				.getEndPosition());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java
deleted file mode 100644
index 5ec0958..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class PasteCommand extends RangeModeCommand {
-
-	/**
-	 * @param viewer
-	 */
-	public PasteCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("PasteCommand.Label.Paste"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		InsertEdit edit = new InsertEdit(selection, getViewer(),
-				new ClipboardData(getViewer().getControl()));
-		if (edit.operate()) {
-			return new DOMRange(edit.getOperationPosition(), edit
-					.getOperationPosition());
-		}
-        return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java
deleted file mode 100644
index 07ce127..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class RangeModeCommand extends DesignerCommand {
-//	private static final Logger _log = PDPlugin
-//			.getLogger(RangeModeCommand.class);
-
-	DOMRange _resultRange = null;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public RangeModeCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#prePreExecute()
-	 */
-	protected boolean prePreExecute() {
-		int position = -1;
-		int length = -1;
-		ISelection selection = getViewer().getSelection();
-		if (selection != null) {
-			if (getViewer().isInRangeMode()) {
-				DesignRange range = (DesignRange) selection;
-				if (range.isValid()) {
-					IDOMPosition domPos = DOMPositionHelper.toDOMPosition(range
-							.getStartPosition());
-					IDOMPosition domEnd = DOMPositionHelper.toDOMPosition(range
-							.getEndPosition());
-					if (!EditValidateUtil.validPosition(domPos)
-							|| !EditValidateUtil.validPosition(domEnd)) {
-						return false;
-					}
-					position = EditModelQuery.getIndexedRegionLocation(domPos);
-					int end = EditModelQuery.getIndexedRegionLocation(domEnd);
-					if (end < position) {
-						length = position - end;
-						position = end;
-					} else {
-						length = end - position;
-					}
-				}
-			} else {
-				Object object = ((IStructuredSelection) selection)
-						.getFirstElement();
-				if (object instanceof ElementEditPart) {
-					Node node = ((ElementEditPart) object).getIDOMNode();
-					position = EditModelQuery.getNodeStartIndex(node);
-					length = EditModelQuery.getNodeLenth(node);
-				} else {
-					return false;
-				}
-			}
-			if (position >= 0 && length >= 0) {
-				getModel().beginRecording(this, getLabel(), position, length);
-			} else {
-				getModel().beginRecording(this, getLabel());
-			}
-			getViewer().startSelectionChange();
-			getModel().aboutToChangeModel();
-			return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected final void doExecute() {
-		DesignRange range = getViewer().getRangeSelection();
-		if (range != null && range.isValid()) {
-			DOMRange domrange = (range == null || !range.isValid()) ? null
-					: toDOMRange(range);
-			_resultRange = doRangeExecute(domrange);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected final ISelection getAfterCommandDesignerSelection() {
-//		try {
-			if (_resultRange == null) {
-				return null;
-			}
-			IDOMPosition startPos = _resultRange.getStartPosition();
-			DesignPosition start = DOMPositionHelper.toDesignPosition(startPos);
-			if (_resultRange.isEmpty()) {
-				return new DesignRange(start, start);
-			}
-            IDOMPosition endPos = _resultRange.getEndPosition();
-            return new DesignRange(start, DOMPositionHelper
-            		.toDesignPosition(endPos));
-            // TODO: don't know what this exception catch is for
-//		} catch (Exception e) {
-//			// "Selection error"
-//			_log.error("Error.RangeModeCommand.SetSelection"); //$NON-NLS-1$
-//			return null;
-//		}
-	}
-
-	/**
-	 * @param range
-	 * @return
-	 */
-	private DOMRange toDOMRange(DesignRange range) {
-		return new DOMRange(DOMPositionHelper.toDOMPosition(range
-				.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-				.getEndPosition()));
-	}
-
-	/**
-	 * In the implementation of this method, should not do anything relating to
-	 * EditPart. (maybe even not ICSSStyle, since not style information not
-	 * refreshed yet)
-	 * @param selection 
-	 * 
-	 * @return null means no change have been done to the model. In this case,
-	 *         system may choose to cancel undo recorrding, etc.
-	 */
-	protected abstract DOMRange doRangeExecute(DOMRange selection);
-
-	/**
-	 * @param parent
-	 * @param ref
-	 * @param child
-	 */
-	protected static void appendChild(Node parent, Node ref, Node child) {
-		Node next = ref.getNextSibling();
-		if (next == null)
-			parent.appendChild(child);
-		else
-			parent.insertBefore(child, next);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java
deleted file mode 100644
index 4118016..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.JSFRootContainerPositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.RootContainerPositionRule;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Called in response to a Ctrl-A-style select all action
- *
- */
-public class SelectAllCommand extends Command {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public SelectAllCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label);
-		_viewer = viewer;
-	}
-
-	public void execute() {
-		Node document = _viewer.getModel().getDocument();
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		Node htmlRoot = RootContainerPositionRule
-				.getBasicContainer((Document) document);
-		Node jsfRoot = JSFRootContainerPositionRule
-				.getBasicContainer((Document) document, 3);
-		Node root;
-		if (htmlRoot != null && jsfRoot != null) {
-			if (EditModelQuery.isChild(htmlRoot, jsfRoot)) {
-				root = htmlRoot;
-			} else if (EditModelQuery.isChild(jsfRoot, htmlRoot)) {
-				root = jsfRoot;
-			} else {
-				root = htmlRoot;
-			}
-		} else {
-			if (htmlRoot != null) {
-				root = htmlRoot;
-			} else if (jsfRoot != null) {
-				root = jsfRoot;
-			} else {
-				root = document;
-			}
-		}
-		IDOMPosition position1, position2;
-		// if (root.hasChildNodes())
-		// {
-		// Node first = root.getFirstChild();
-		// position1 = new DOMRefPosition(first, false);
-		// Node last = root.getLastChild();
-		// position2 = new DOMRefPosition(last, true);
-		// }
-		// else
-		// {
-		position1 = new DOMPosition(root, 0);
-		position2 = new DOMPosition(root, root.getChildNodes().getLength());
-		// }
-		if (!validator.isValidPosition(position1)) {
-			position1 = EditHelper.moveToNextEditPosition(position1, true,
-					validator);
-		}
-		if (!validator.isValidPosition(position2)) {
-			position2 = EditHelper.moveToNextEditPosition(position2, false,
-					validator);
-		}
-		if (EditValidateUtil.validPosition(position1)
-				&& EditValidateUtil.validPosition(position2)) {
-			_viewer.setRange(DOMPositionHelper.toDesignPosition(position1),
-					DOMPositionHelper.toDesignPosition(position2));
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java
deleted file mode 100644
index b2c05e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class UnapplyStyleCommand extends ApplyStyleCommand {
-	/**
-	 * @param viewer
-	 * @param tag
-	 * @param property
-	 * @param value
-	 */
-	public UnapplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(viewer, tag, property, value);
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public UnapplyStyleCommand(IHTMLGraphicalViewer viewer, Element node,
-			String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-
-		if (common instanceof Text) {
-			doTextNodeStyleApply((Text) common, start.getOffset(), end
-					.getOffset());
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param start
-	 * @param end
-	 * @param common
-	 */
-	private DOMRange doTextNodeStyleApply(Text textNode, int startOffset,
-			int endOffset) {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java
deleted file mode 100644
index a76f2be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final class WorkNode {
-	private WorkNode parent;
-
-	private WorkNode previous;
-
-	private WorkNode next;
-
-	private Node node;
-
-	private final int pos[];
-
-	private boolean isRoot;
-
-	/**
-	 * @param node
-	 * @param pos1
-	 * @param pos2
-	 */
-	public WorkNode(Node node, final int pos1, final int pos2) {
-		this.pos = resoveOffsets(node, pos1, pos2);
-		this.node = node;
-	}
-
-	/**
-	 * @return Returns the node.
-	 */
-	public Node getNode() {
-		return node;
-	}
-
-	/**
-	 * @param node
-	 *            The node to set.
-	 */
-	public void setNode(Node node) {
-		this.node = node;
-	}
-
-	/**
-	 * @return the offsets
-	 */
-	int[] getQualifiedOffsets() {
-		int result[] = new int[] { getPosOffsets()[0], getPosOffsets()[1] };
-		result[0] = result[0] < 0 ? 0 : result[0];
-		int length = EditModelQuery.getNodeLenth(node);
-		result[0] = result[0] > length ? length : result[0];
-		result[1] = result[1] < 0 ? 0 : result[1];
-		result[1] = result[1] > length ? length : result[1];
-		return result;
-	}
-
-	/**
-	 * @return Returns the pos.
-	 */
-	public int[] getPosOffsets() {
-		return pos;
-	}
-
-	/**
-	 * @return Returns the isRoot.
-	 */
-	public boolean isRoot() {
-		return isRoot;
-	}
-
-	/**
-	 * @param isRoot
-	 *            The isRoot to set.
-	 */
-	public void setRoot(boolean isRoot) {
-		this.isRoot = isRoot;
-	}
-
-	/**
-	 * @return Returns the next.
-	 */
-	public WorkNode getNext() {
-		return next;
-	}
-
-	/**
-	 * @param next
-	 *            The next to set.
-	 */
-	public void setNext(WorkNode next) {
-		this.next = next;
-	}
-
-	/**
-	 * @return Returns the parent.
-	 */
-	public WorkNode getParent() {
-		return parent;
-	}
-
-	/**
-	 * @param parent
-	 *            The parent to set.
-	 */
-	public void setParent(WorkNode parent) {
-		this.parent = parent;
-	}
-
-	/**
-	 * @return Returns the previous.
-	 */
-	public WorkNode getPrevious() {
-		return previous;
-	}
-
-	/**
-	 * @param previous
-	 *            The previous to set.
-	 */
-	public void setPrevious(WorkNode previous) {
-		this.previous = previous;
-	}
-
-	private int[] resoveOffsets(Node node1, int pos1, int pos2) {
-		int left = EditModelQuery.getNodeStartIndex(node1);
-		return new int[] { pos1 - left, pos2 - left };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("Node:").append(node).append(" pos[]:").append(pos); //$NON-NLS-1$ //$NON-NLS-2$
-		return sb.toString();
-	}
-
-	boolean isWholeSelected() {
-		int start = EditModelQuery.getNodeStartIndex(node);
-		int end = EditModelQuery.getNodeEndIndex(node);
-		return getQualifiedOffsets()[0] <= 0
-				&& getQualifiedOffsets()[1] >= end - start;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java
deleted file mode 100644
index 178aba7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddSubNodeCommand extends SingleNodeCommand {
-	private final IDOMElement _parent;
-	private IDOMElement _child;
-
-	private final String _tagName;
-
-	private final String _url;
-
-	private final Map _attributes;
-
-	/**
-	 * @param label
-	 * @param node
-	 * @param name 
-	 * @param url 
-	 * @param attributs 
-	 */
-	public AddSubNodeCommand(String label, IDOMElement node, String name,
-			String url, Map attributs) {
-		super(label, node);
-		this._parent = node;
-		this._tagName = name;
-		this._url = url;
-		this._attributes = attributs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String nodeName = null;
-		if (ITLDConstants.URI_HTML.equals(_url)) {
-			nodeName = _tagName;
-		} else {
-			String prefix = JSPUtil.getOrCreatePrefix(_parent.getModel(), _url, null);
-			nodeName = prefix + ":" + _tagName; //$NON-NLS-1$
-		}
-
-		_child = (IDOMElement) _parent.getOwnerDocument().createElement(nodeName);
-
-		if (_child == null) {
-			return;
-		}
-
-		for (Iterator iterator = _attributes.keySet().iterator(); iterator
-				.hasNext();) {
-			String key = (String) iterator.next();
-			String value = (String) _attributes.get(key);
-			_child.setAttribute(key, value);
-		}
-
-		_parent.appendChild(_child);
-	}
-
-	/**
-	 * @return the child node
-	 */
-	public IDOMElement getChildNode() {
-		return _child;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeAttributeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeAttributeCommand.java
deleted file mode 100644
index 223f4ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeAttributeCommand.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This command is for change an single attribute of an IDOMElement. Normally
- * used by the properties view.
- * 
- * @author mengbo
- */
-public class ChangeAttributeCommand extends SingleNodeCommand {
-	private IDOMElement _element;
-
-	private String _attrValue;
-
-	private String _attrName;
-
-	private Map _attributes;
-
-	private boolean _keepEmptyAttribute = false;
-
-	/**
-	 * 
-	 * @param label
-	 * @param node
-	 * @param attrName
-	 * @param attrValue
-	 *            if null means remove the specified attribute
-	 */
-	public ChangeAttributeCommand(String label, IDOMElement node,
-			String attrName, String attrValue) {
-		super(label, node);
-		_element = node;
-		_attrName = attrName;
-		_attrValue = attrValue;
-		_attributes = null;
-	}
-
-	/** TODO: can these two constructors be merged?
-	 * @param label
-	 * @param node
-	 * @param attributes
-	 */
-	public ChangeAttributeCommand(String label, IDOMElement node, Map attributes) {
-		super(label, node);
-		_element = node;
-		_attributes = attributes;
-		_attrName = null;
-		_attrValue = null;
-	}
-
-	protected void doExecute() {
-		if (_attrName != null) {
-			updateElement(_attrName, _attrValue);
-		} else if (_attributes != null) {
-			for (Iterator iterator = _attributes.keySet().iterator(); iterator
-					.hasNext();) {
-				String name = (String) iterator.next();
-				String value = (String) _attributes.get(name);
-				if (isSameValue(value, _element.getAttribute(name))) {
-					continue;
-				}
-				updateElement(name, value);
-			}
-		}
-	}
-
-	private void updateElement(String name, String value) {
-		if (_element.hasAttribute(name) && isEmptyString(value)
-				&& !_keepEmptyAttribute) {
-			_element.removeAttribute(name);
-		}
-		if (!isEmptyString(value) || _keepEmptyAttribute) {
-			_element.setAttribute(name, value);
-		}
-	}
-
-	private boolean isSameValue(String value1, String value2) {
-		value1 = value1 == null ? "" : value1; //$NON-NLS-1$
-		value2 = value2 == null ? "" : value2; //$NON-NLS-1$
-		return value1.equals(value2);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.equals("")) { //$NON-NLS-1$
-			return true;
-		}
-        return false;
-	}
-
-	/**
-	 * @return Returns the keepEmptyAttribute.
-	 */
-	public boolean isKeepEmptyAttribute() {
-		return _keepEmptyAttribute;
-	}
-
-	/**
-	 * @param keepEmptyAttribute
-	 *            The keepEmptyAttribute to set.
-	 */
-	public void setKeepEmptyAttribute(boolean keepEmptyAttribute) {
-		this._keepEmptyAttribute = keepEmptyAttribute;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java
deleted file mode 100644
index 4a88c34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeStyleCommand extends SingleNodeCommand {
-	private Map _styleProperties = null;
-
-	private CSSPropertyContext _context = null;
-
-	/**
-	 * @param node
-	 * @param map
-	 */
-	public ChangeStyleCommand(IDOMElement node, Map map) {
-		super(CommandResources
-				.getString("ChangeStyleCommand.Label.ChangeStyle"), node); //$NON-NLS-1$
-		_styleProperties = map;
-	}
-
-	/**
-	 * @param node
-	 * @param context
-	 */
-	public ChangeStyleCommand(IDOMElement node, CSSPropertyContext context) {
-		super(CommandResources
-				.getString("ChangeStyleCommand.Label.ChangeStyle"), node); //$NON-NLS-1$
-		_context = context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		getOriginalElement().getModel().beginRecording(this);
-		try {
-			if (_styleProperties != null) {
-				IDOMElement original = this.getOriginalElement();
-				DOMStyleUtil.insertStyle(original, _styleProperties);
-			} else if (_context != null) {
-				ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) getOriginalElement())
-						.getStyle();
-
-				if (styleDeclaration == null) {
-					getOriginalElement().setAttribute(IJSFConstants.ATTR_STYLE,
-							""); //$NON-NLS-1$
-					styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) getOriginalElement())
-							.getStyle();
-				}
-				_context.applyModified(styleDeclaration);
-			}
-		} finally {
-			getOriginalElement().getModel().endRecording(this);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java
deleted file mode 100644
index 90a33b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Attr;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This is for command that changes an element's tagname and some attributes.
- * 
- * @author mengbo
- */
-public class ChangeTagCommand extends SingleNodeCommand {
-    private final IDOMElement _element;
-
-    private final Map _attributes;
-
-    private final boolean _moveContent;
-
-    private String _uri;
-
-    private String _localTag;
-
-    private  String _totalTag;
-
-	/**
-	 * @param label
-	 * @param node
-	 * @param totaltag
-	 * @param attributes
-	 * @param movecontent
-	 */
-	public ChangeTagCommand(String label, IDOMElement node, String totaltag,
-			Map attributes, boolean movecontent) {
-		super(label, node);
-		this._element = node;
-		this._totalTag = totaltag;
-		this._attributes = attributes;
-		this._moveContent = movecontent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String tag = null;
-
-		if (_totalTag != null) {
-			tag = _totalTag;
-		} else {
-			if (ITLDConstants.URI_HTML.equals(_uri)) {
-				tag = _localTag;
-			} else if (ITLDConstants.URI_JSP.equals(_uri)) {
-				tag = "jsp:" + _localTag; //$NON-NLS-1$
-			} else {
-				tag = JSPUtil.getOrCreatePrefix(getModel(), _uri, null)
-						+ _localTag;
-			}
-		}
-		// we need to remove the old element and create a new one with the new
-		// tag.
-		IDOMElement replacement = (IDOMElement) _element.getOwnerDocument()
-				.createElement(tag);
-		NamedNodeMap attrs = _element.getAttributes();
-		for (int i = 0, n = attrs.getLength(); i < n; i++) {
-			Attr a = (Attr) attrs.item(i);
-			replacement.setAttribute(a.getName(), a.getValue());
-		}
-		if (_attributes != null) {
-			for (Iterator iter = _attributes.keySet().iterator(); iter
-					.hasNext();) {
-				String name = (String) iter.next();
-				String value = (String) _attributes.get(name);
-				replacement.setAttribute(name, value);
-			}
-		}
-		if (_moveContent) {
-			NodeList nl = _element.getChildNodes();
-			ArrayList list = new ArrayList();
-			for (int i = 0, n = nl.getLength(); i < n; i++) {
-				list.add(nl.item(i));
-
-			}
-			for (int i = 0, n = list.size(); i < n; i++) {
-				replacement.appendChild((Node) list.get(i));
-			}
-		}
-		_element.getParentNode().replaceChild(replacement, _element);
-		setReplacedElement(replacement);
-	}
-
-	/**
-	 * @return the replacemd element
-	 */
-	public IDOMElement getNewElement() {
-		return getReplacedElment();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/InsertSubNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/InsertSubNodeCommand.java
deleted file mode 100644
index 7790c17..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/InsertSubNodeCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertSubNodeCommand extends SingleNodeCommand {
-	private IDOMElement _parent, _child, _refchild;
-
-	/**
-	 * @param label
-	 * @param parent
-	 * @param child 
-	 * @param refchild 
-	 */
-	public InsertSubNodeCommand(String label, IDOMElement parent,
-			IDOMElement child, IDOMElement refchild) {
-		super(label, parent);
-		this._parent = parent;
-		this._child = child;
-		this._refchild = refchild;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		_parent.insertBefore(_child, _refchild);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/RemoveSubNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/RemoveSubNodeCommand.java
deleted file mode 100644
index 8ec630c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/RemoveSubNodeCommand.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RemoveSubNodeCommand extends SingleNodeCommand {
-	private IDOMElement _parent, _child;
-
-	/**
-	 * @param label
-	 * @param parent
-	 * @param child 
-	 */
-	public RemoveSubNodeCommand(String label, IDOMElement parent,
-			IDOMElement child) {
-		super(label, parent);
-		_parent = parent;
-		_child = child;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		_parent.removeChild(_child);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/SingleNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/SingleNodeCommand.java
deleted file mode 100644
index 68f5db4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/SingleNodeCommand.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRangeHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This is the super class for those commands that change attribute or tag name
- * of a single element.
- * 
- * This base class helps handles selection. As after the command, the editpart
- * may totally change, so it tried to remember the selection before command and
- * then restore it after the command.
- * 
- * So the limitation to child class of this command is that: the command should
- * only change a single element node. It could remove the node and replace with
- * a new one, but should not touch other nodes.
- * 
- * @author mengbo
- */
-public abstract class SingleNodeCommand extends DesignerCommand {
-	List _structuredSelectedNodes = null;
-
-	DOMRange _rangeSelection = null;
-
-	IDOMElement _originalElement;
-
-	IDOMElement _replacement;
-
-	/**
-	 * @param label
-	 * @param node
-	 */
-	public SingleNodeCommand(String label, IDOMElement node) {
-		super(label, node);
-		_originalElement = node;
-	}
-
-	protected void preExecute() {
-		super.preExecute();
-		// remember current selection
-		ISelection selection = getViewer().getSelection();
-		if (selection instanceof IStructuredSelection) {
-			Object[] array = ((IStructuredSelection) selection).toArray();
-			_structuredSelectedNodes = new ArrayList();
-			if (array != null) {
-				for (int i = 0; i < array.length; i++) {
-					EditPart part = (EditPart) array[i];
-					_structuredSelectedNodes.add(part.getModel());
-				}
-			}
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			_rangeSelection = DOMRangeHelper.toDOMRange(range);
-		}
-	}
-
-	/**
-	 * this method is to be called by child class in the doExecute() method.
-	 * Telling the super class that the original element will be replaced by the
-	 * specified element.
-	 * 
-	 * @param ele
-	 */
-	protected void setReplacedElement(IDOMElement ele) {
-		_replacement = ele;
-	}
-
-	/**
-	 * @return the replacement element
-	 */
-	protected IDOMElement getReplacedElment() {
-		return _replacement;
-	}
-
-	/**
-	 * @return the original element
-	 */
-	protected IDOMElement getOriginalElement() {
-		return _originalElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected final ISelection getAfterCommandDesignerSelection() {
-		if (_structuredSelectedNodes != null) {
-			// handle replacement fire.
-			if (_replacement != null && _replacement != _originalElement) {
-				int index = _structuredSelectedNodes.indexOf(_originalElement);
-				if (index >= 0) {
-					_structuredSelectedNodes.set(index, _replacement);
-				}
-			}
-
-			// as the editpart may have been refreshed, so recreated the
-			// selection
-			List parts = new ArrayList();
-			for (int i = 0, size = _structuredSelectedNodes.size(); i < size; i++) {
-				Object obj = _structuredSelectedNodes.get(i);
-				if (obj instanceof INodeNotifier) {
-					EditPart part = (EditPart) ((INodeNotifier) obj)
-							.getAdapterFor(EditPart.class);
-					if (part != null)
-						parts.add(part);
-				}
-			}
-			StructuredSelection sel = new StructuredSelection(parts);
-			return sel;
-		} else if (_rangeSelection != null) {
-			DOMRange newrange = handleReplacement(_rangeSelection,
-					_originalElement, _replacement);
-			return DOMRangeHelper.toDesignRange(newrange);
-		} else {
-			return null;
-		}
-	}
-
-	private DOMRange handleReplacement(DOMRange selection,
-			IDOMElement original, IDOMElement replacement) {
-		if (replacement == null || replacement == original)
-			return selection;
-		return DOMRangeHelper.handleReplacement(selection, original,
-				replacement);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java
deleted file mode 100644
index bfdc0c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.preview.PageExpressionContext;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This is base class for all non-hidden tag converters.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractTagConverter implements ITagConverter,
-		ITagEditInfo, INodeAdapter, IDOMFactory {
-	private IDOMDocument _targetDocument;
-
-	private Element _hostElement;
-
-	private Element _resultElement;
-
-	private List _childNodes = Collections.EMPTY_LIST;
-
-	private Map _childNodePositions = Collections.EMPTY_MAP;
-
-	private int _mode;
-
-	private int _minWidth;
-
-	private int _minHeight;
-
-	private boolean _needBorderDecorator;
-
-	/**
-	 * @param host 
-	 * 
-	 */
-	public AbstractTagConverter(Element host) {
-		_hostElement = host;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setTargetDocument(org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument)
-	 */
-	public void setDestDocument(IDOMDocument document) {
-		_targetDocument = document;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#convertRefresh(java.lang.Object)
-	 */
-	public final void convertRefresh(Object context) {
-		_resultElement = null;
-		_childNodes = new ArrayList();
-		_childNodePositions = new HashMap();
-
-		_resultElement = doConvertRefresh();
-		if (_resultElement instanceof INodeNotifier) {
-			((INodeNotifier) _resultElement).addAdapter(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		// do nothing.
-	}
-
-	/**
-	 * Child class should override this method. The child class should NEVER
-	 * change the host DOM structure.
-	 * 
-	 * @return the convert result. Should be an HTML element.
-	 */
-	protected abstract Element doConvertRefresh();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getHostElement()
-	 */
-	public final Element getHostElement() {
-		return _hostElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getResultElement()
-	 */
-	public final Element getResultElement() {
-		return _resultElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildModeList()
-	 */
-	public final List getChildModeList() {
-		return _childNodes;
-	}
-
-
-	public List getNonVisualChildren() 
-    {
-	    // by default, no non-visual children
-        return Collections.EMPTY_LIST;
-    }
-
-    /**
-	 * child class should call this method.
-	 * 
-	 * @param childNode
-	 *            the childNode of the hostElement that should be futher
-	 *            converted.
-	 * @param position
-	 * 
-	 */
-	protected void addChild(Node childNode, ConvertPosition position) {
-		_childNodes.add(childNode);
-		_childNodePositions.put(childNode, position);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildVisualPosition(org.w3c.dom.Node)
-	 */
-	public final ConvertPosition getChildVisualPosition(Node childModel) {
-		return (ConvertPosition) _childNodePositions.get(childModel);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isVisualByHTML()
-	 */
-	public boolean isVisualByHTML() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getVisualImage()
-	 */
-	public Image getVisualImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#dispose()
-	 */
-	public void dispose() {
-        // do nothing; children may wish to sub-class
-        // TODO: null shared references?
-        // this doesn't seem to be called by anybody..
-        // need to review this
-	}
-
-	/**
-	 * @param node
-	 * @return true if the node should be ignored for  conversion purposes
-	 */
-	protected boolean shouldIgnore(Node node) {
-		int nodeType = node.getNodeType();
-		switch (nodeType) {
-		case Node.TEXT_NODE:
-		case Node.CDATA_SECTION_NODE:
-		case Node.ELEMENT_NODE:
-			return false;
-		default:
-			return true;
-		}
-
-	}
-
-	/**
-	 * utility method for those converter that only converts the host tag's name
-	 * and directly copy children.
-	 * @param src 
-	 * @param dest 
-	 * 
-	 */
-	protected void copyChildren(Element src, Element dest) {
-		Node node = src.getFirstChild();
-		int index = 0;
-		for (; node != null; node = node.getNextSibling()) {
-			if (!shouldIgnore(node)) {
-				addChild(node, new ConvertPosition(dest, index++));
-			}
-		}
-	}
-
-	/**
-	 * utility method for those converter that directly copy children.
-	 * @param src 
-	 * @param dest 
-	 * 
-	 */
-	protected void dumCopyChildren(Element src, Element dest) {
-		Node node = src.getFirstChild();
-		Document destDoc = dest.getOwnerDocument();
-		for (; node != null; node = node.getNextSibling()) {
-			if (!shouldIgnore(node)) {
-				Node n = DOMUtil.cloneNodeDeepIgnoreError(destDoc, node);
-				dest.appendChild(n);
-			}
-		}
-	}
-
-	/**
-	 * In the future, the conversion result HTML DOM tree could be in another
-	 * document.
-	 * 
-	 * @return the destination document
-	 */
-	public IDOMDocument getDestDocument() {
-		if (this._targetDocument != null) {
-			return this._targetDocument;
-		}
-        return (IDOMDocument) _hostElement.getOwnerDocument();
-	}
-
-	/**
-	 * shortcut method. Child class should always use this method to create a
-	 * result element.
-	 * 
-	 * @param tagName
-	 * @return a new element named tagName
-	 */
-	public Element createElement(String tagName) {
-		return getDestDocument().createElement(tagName);
-	}
-
-	/**
-	 * shortcut method. Child class should always use this method to create a
-	 * text node.
-	 * 
-	 * @param text
-	 * @return a new text node using text as the value
-	 */
-	public Text createText(String text) {
-		return getDestDocument().createTextNode(text);
-	}
-
-	/**
-	 * @param original
-	 * @return the mapped String  TODO: currently does nothing
-	 */
-	protected String mapURL(String original) {
-		// TODO: how to map URL? such as original url look like:
-		// getContext().getPath()+...
-		return original;
-	}
-
-	// TODO: FIXME: XXX:
-	// if the value is expression, we may want to do something here!!!
-	/**
-	 * @param value
-	 * @return value mapped based on EL expression
-	 */
-	protected String mapValue(String value) {
-		if (value == null) {
-			return null;
-		}
-		if (isDesignerMode()) {
-			// if there has jsf binding expressions
-			int checkPos = value.indexOf("#{"); //$NON-NLS-1$
-			if (checkPos != -1) {
-				String mapValue = ""; //$NON-NLS-1$
-				int preferType = PreferenceReader.getMapValueType();
-				switch (preferType) {
-				case PreferenceReader.FULL_EXPRESSION_TYPE:
-					mapValue = value;
-					break;
-				case PreferenceReader.LAST_EXPRESSION_TYPE:
-					String strBackup = value;
-					StringBuffer sb = new StringBuffer();
-					while (strBackup.indexOf("#{") != -1) { //$NON-NLS-1$
-						int pos = strBackup.indexOf("#{"); //$NON-NLS-1$
-						int endBracketPos = strBackup.indexOf("}", pos + 1); //$NON-NLS-1$
-						if (endBracketPos != -1) {
-							sb.append(strBackup.substring(0, pos + 2));
-							String exp = strBackup.substring(pos + 2,
-									endBracketPos);
-							if (allowTrim(exp)) {
-								int lastDotPos = exp.lastIndexOf("."); //$NON-NLS-1$
-								if (lastDotPos != -1) {
-									String convertedExp = exp
-											.substring(lastDotPos + 1);
-									sb.append(convertedExp);
-								} else {
-									sb.append(exp);
-								}
-
-							} else {
-								sb.append(exp);
-							}
-							sb.append("}"); //$NON-NLS-1$
-						} else {
-							break;
-						}
-						if (strBackup.length() > endBracketPos + 1) {
-							strBackup = strBackup.substring(endBracketPos + 1);
-						} else {
-							strBackup = ""; //$NON-NLS-1$
-							break;
-						}
-
-					}
-					sb.append(strBackup);
-					mapValue = sb.toString();
-					break;
-				case PreferenceReader.REAL_VALUE_TYPE:
-					// TODO calculate the expression value
-				default:
-					mapValue = value;
-					break;
-				}
-
-				return mapValue;
-			}
-		} else {
-			// preview mode. let's try to display the value.
-			try {
-				return (String) PageExpressionContext.getCurrent()
-						.evaluateExpression(value, String.class, null);
-			} catch (Exception ex) {
-				// can't calculate the result. ignore.
-				// ex.printStackTrace();
-			}
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return this._needBorderDecorator;
-	}
-
-	/**
-	 * @param b
-	 */
-	public void setNeedBorderDecorator(boolean b) {
-		this._needBorderDecorator = b;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needTableDecorator()
-	 */
-	public boolean needTableDecorator() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		if (type == ITagEditInfo.class) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param mode
-	 */
-	public final void setMode(int mode) {
-		this._mode = mode;
-	}
-
-	/**
-	 * @return true if the converter mode is preview
-	 */
-	public final boolean isPreviewMode() {
-		return this._mode == IConverterFactory.MODE_PREVIEW;
-	}
-
-	/**
-	 * @return true if the converter mode is designer
-	 */
-	public final boolean isDesignerMode() {
-		return this._mode == IConverterFactory.MODE_DESIGNER;
-	}
-
-	/**
-	 * @return the converter mode
-	 */
-	public final int getMode() {
-		return this._mode;
-	}
-
-	/**
-	 * The method is used to judge whether the value binding and method binding
-	 * expression is allowed to be trimmed.Currently only expression contains
-	 * only letter,digit,and '.' is allowed to be trimmed.
-	 * 
-	 * @param expression
-	 *            value binding or method binding expression
-	 * @return
-	 */
-	private boolean allowTrim(String expression) {
-		for (int i = 0, size = expression.length(); i < size; i++) {
-			char ch = expression.charAt(i);
-			if (!Character.isLetterOrDigit(ch) && (ch != '.') && (ch != '_')) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#getMinWidth()
-	 */
-	public int getMinWidth() {
-		return this._minWidth;
-	}
-
-	/**
-	 * @param minWidth
-	 */
-	public void setMinWidth(int minWidth) {
-		this._minWidth = minWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#getMinHeight()
-	 */
-	public int getMinHeight() {
-		return this._minHeight;
-	}
-
-	/**
-	 * @param minHeight
-	 */
-	public void setMinHeight(int minHeight) {
-		this._minHeight = minHeight;
-	}
-
-	/**
-	 * @param element
-	 * @param attrname
-	 * @return the attribute on element with the name attrname
-	 */
-	public static boolean hasAttribute(Element element, String attrname) {
-		return element.hasAttribute(attrname);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java
deleted file mode 100644
index 130ec40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Node;
-
-/**
- * This class is used to locate a position for child model nodes.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ConvertPosition {
-	private final Node _parentNode;
-
-	private final int _index;
-
-	/**
-	 * @param parent \
-	 * @param index 
-	 * 
-	 */
-	public ConvertPosition(Node parent, int index) {
-		this._parentNode = parent;
-		this._index = index;
-	}
-
-	/**
-	 * @return the parent node
-	 */
-	public Node getParentNode() {
-		return _parentNode;
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java
deleted file mode 100644
index 1560e2e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterFacRegistryReader {
-	private static List<IConverterFactory> _handlers = null;
-
-	/**
-	 * @return the list of handlers.  The list is not modifiable and will
-	 * throw exceptions if it is attempted.
-	 */
-	public static synchronized List<IConverterFactory> getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return Collections.unmodifiableList(_handlers);
-
-	}
-
-	private static List<IConverterFactory> readAllHandlers()
-    {
-        final List<IConverterFactory> result = new ArrayList<IConverterFactory>();
-        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-                .getExtensionPoint(PDPlugin.getPluginId(),
-                        IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-        IExtension[] extensions = extensionPoint.getExtensions();
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            IExtension ext = extensions[i];
-            IConfigurationElement[] tagConverter = ext
-                    .getConfigurationElements();
-
-            for (int j = 0; j < tagConverter.length; j++)
-            {
-                final IConfigurationElement element = tagConverter[j];
-
-                if (element.getName().equals(
-                        IJMTConstants.TAG_CONVERTER_FACTORY))
-                {
-                    element.getAttribute("class"); //$NON-NLS-1$
-                    Object obj;
-                    try
-                    {
-                        obj = element.createExecutableExtension("class"); //$NON-NLS-1$
-
-                        if (element.getContributor().getName().startsWith(
-                                "org.eclipse.jst")) //$NON-NLS-1$
-                        {
-                            if (PageDesignerTraceOptions.TRACE_CONVERTERLOAD)
-                            {
-                                PageDesignerTraceOptions.log("ConverterFacRegistryReader: Appending to list:"+obj.getClass().getName()); //$NON-NLS-1$
-                            }
-                            // push JSF tools provided ones to the end
-                            result.add((IConverterFactory) obj);
-                        }
-                        // prepend if something outside JSF tools declared it
-                        else
-                        {
-                            if (PageDesignerTraceOptions.TRACE_CONVERTERLOAD)
-                            {
-                                PageDesignerTraceOptions.log("ConverterFacRegistryReader: Prepending to list:"+obj.getClass().getName()); //$NON-NLS-1$
-                            }
-                            // this way, adopters can put their overrides
-                            // of factories with built-in support like
-                            // JSF HTML/CORE will be used first
-                            result.add(0, (IConverterFactory) obj);
-                        }
-
-                    } 
-                    catch (CoreException e)
-                    {
-                        PDPlugin.log("Problem loading tag converter extension for "+element.toString(), e); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-
-        if (PageDesignerTraceOptions.TRACE_CONVERTERLOAD)
-        {
-            PageDesignerTraceOptions.log("\nFinal converterFactory list in order:"); //$NON-NLS-1$
-            for (final IConverterFactory factory : result)
-            {
-                PageDesignerTraceOptions.log(factory.getClass().getName());
-            }
-            PageDesignerTraceOptions.log("\n"); //$NON-NLS-1$
-        }
-        return result;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java
deleted file mode 100644
index 53e4f1b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
-import org.eclipse.jst.pagedesigner.converter.html.HTMLConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.jsp.JSPConverterFactory;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterFactoryRegistry
-{
-    List _factories = new ArrayList();
-
-    private static ConverterFactoryRegistry _instance;
-
-    /**
-	 *
-	 */
-    private ConverterFactoryRegistry()
-    {
-        final List<IConverterFactory> facs = ConverterFacRegistryReader
-                .getAllHandlers();
-        if (facs != null)
-        {
-            for (final IConverterFactory fac : facs)
-            {
-                addFactory(fac);
-            }
-        }
-        _factories.add(new JSPConverterFactory());
-        _factories.add(new HTMLConverterFactory());
-        
-        // TODO: this is not ideal, but until we get a better system for 
-        // doing converter factory ordering:
-        // loop through the list and place the DTManager
-    }
-
-    /**
-     * @param fac
-     */
-    public void addFactory(final IConverterFactory fac)
-    {
-        _factories.add(fac);
-    }
-
-    /**
-     * @param ele
-     * @param mode
-     * @param targetDocument
-     * @return the new btag converter
-     */
-    public ITagConverter createTagConverter(final Element ele, final int mode,
-            final IDOMDocument targetDocument)
-    {
-        final ITagConverter converter = internalCreateTagConverter(ele, mode);
-        if (converter != null)
-        {
-            converter.setDestDocument(targetDocument);
-        }
-        return converter;
-    }
-
-    /**
-     * @param ele
-     * @param mode
-     * @return the new tag converter
-     */
-    protected final ITagConverter internalCreateTagConverter(final Element ele,
-            final int mode)
-    {
-        final String uri = CMUtil.getElementNamespaceURI(ele);
-        // first round, match uri
-        for (int i = 0, size = _factories.size(); i < size; i++)
-        {
-            final IConverterFactory fac = (IConverterFactory) _factories.get(i);
-            final String facuri = fac.getSupportedURI();
-            if (facuri != null && facuri.equals(uri))
-            {
-                final ITagConverter converter = fac.createConverter(ele, mode);
-                if (converter != null)
-                {
-                    if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-                    {
-                        PageDesignerTraceOptions
-                                .log("ConverterFactoryRegistry: first loop, " //$NON-NLS-1$
-                                        + String
-                                                .format(
-                                                        "Selected converter %s for uri=%s, tagname=%s", //$NON-NLS-1$
-                                                        converter.getClass()
-                                                                .getName(),
-                                                        uri, ele.getLocalName()));
-                    }
-                    return converter;
-                }
-            }
-        }
-        // second round
-        for (int i = 0, size = _factories.size(); i < size; i++)
-        {
-            final IConverterFactory fac = (IConverterFactory) _factories.get(i);
-            final String facuri = fac.getSupportedURI();
-            if (facuri == null)
-            {
-                final ITagConverter converter = fac.createConverter(ele, mode);
-                if (converter != null)
-                {
-                    if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-                    {
-                        PageDesignerTraceOptions
-                                .log("ConverterFactoryRegistry: second loop, " //$NON-NLS-1$
-                                        + String
-                                                .format(
-                                                        "Selected converter %s for uri=%s, tagname=%s", //$NON-NLS-1$
-                                                        converter.getClass()
-                                                                .getName(),
-                                                        uri, ele.getLocalName()));
-                    }
-                    return converter;
-                }
-            }
-        }
-
-        // can't find. We need some default tag converter for it.
-        // if the tag is empty, show it as icon.
-        if (uri == null || ITLDConstants.URI_HTML.equals(uri))
-        {
-            if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-            {
-                PageDesignerTraceOptions
-                        .log("ConverterFactoryRegistry: factory not found, " //$NON-NLS-1$
-                                + String
-                                        .format(
-                                                "Selected DumTagConverter for uri=%s, tagname=%s", //$NON-NLS-1$
-                                                uri, ele.getLocalName()));
-            }
-
-            // basically, for HTML or non JSP tag, directly renders it.
-            return new DumTagConverter(ele);
-        }
-        final CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-        if (decl == null)
-        {
-            if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-            {
-                PageDesignerTraceOptions
-                        .log("ConverterFactoryRegistry: factory and decl not found, " //$NON-NLS-1$
-                                + String
-                                        .format(
-                                                "Selected DumTagConverter for uri=%s, tagname=%s", //$NON-NLS-1$
-                                                uri, ele.getLocalName()));
-            }
-            return new DumTagConverter(ele);
-        }
-        final int contentType = decl.getContentType();
-        if (contentType == CMElementDeclaration.EMPTY)
-        {
-            if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-            {
-                PageDesignerTraceOptions
-                        .log("ConverterFactoryRegistry: factory not found, content is EMPTY, " //$NON-NLS-1$
-                                + String
-                                        .format(
-                                                "Selected HiddenTagConverter with UnknownImage for uri=%s, tagname=%s", //$NON-NLS-1$
-                                                uri, ele.getLocalName()));
-            }
-
-            // if the tag is empty, show it as icon.
-            return new HiddenTagConverter(ele, new LabelProvider()
-            {
-                @Override
-                public Image getImage(final Object element)
-                {
-                    return getUnknownImage();
-                }
-            });
-        }
-        if (PageDesignerTraceOptions.TRACE_CONVERTERSELECT)
-        {
-            PageDesignerTraceOptions
-                    .log("ConverterFactoryRegistry: fall-through to default case, " //$NON-NLS-1$
-                            + String
-                                    .format(
-                                            "Selected DefaultUnknownTagConverter with UnknownImage for uri=%s, tagname=%s", //$NON-NLS-1$
-                                            uri, ele.getLocalName()));
-        }
-        return new DefaultUnknownTagConverter(ele, mode);
-
-    }
-
-    private static Image getUnknownImage()
-    {
-        return JSFUICommonPlugin.getDefault().getImage(
-                JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-    }
-
-    /**
-     * @return the singleton instance of the registry
-     */
-    public synchronized static ConverterFactoryRegistry getInstance()
-    {
-        if (_instance == null)
-        {
-            _instance = new ConverterFactoryRegistry();
-        }
-        return _instance;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java
deleted file mode 100644
index 3b03710..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.Set;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterUtil {
-	/**
-	 * 
-	 * @param source
-	 * @param dest
-	 * @param ignore
-	 */
-	public static void copyAllAttributes(Element source, Element dest,
-			Set ignore) {
-		NamedNodeMap attrs = source.getAttributes();
-		for (int i = 0, size = attrs.getLength(); i < size; i++) {
-			Attr attr = (Attr) attrs.item(i);
-			if (ignore == null || !ignore.contains(attr.getName())) {
-				dest.setAttribute(attr.getName(), attr.getValue());
-			}
-		}
-	}
-
-	/**
-	 * copy a single attribute (if exist)
-	 * 
-	 * @param source
-	 * @param srcattr
-	 * @param dest
-	 * @param destattr
-	 */
-	public static void copyAttribute(Element source, String srcattr,
-			Element dest, String destattr) {
-		Attr attr = source.getAttributeNode(srcattr);
-		if (attr != null) {
-			dest.setAttribute(destattr, attr.getValue());
-		}
-	}
-
-	/**
-	 * @param hostElement
-	 * @return true if hostElement represents an empty container
-	 */
-	public static boolean isEmptyContainer(Element hostElement) {
-		NodeList nl = hostElement.getChildNodes();
-		if (nl == null || nl.getLength() == 0) {
-			return true;
-		}
-
-		for (int i = 0, n = nl.getLength(); i < n; i++) {
-			Node node = nl.item(i);
-			if (!(node instanceof IDOMText)) {
-				return false;
-			}
-			if (!((IDOMText) node).isElementContentWhitespace()) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @param document
-	 * @param text
-	 * @return the description element in the document containing text
-	 */
-	public static Element createDescriptionElement(IDOMDocument document,
-			String text) {
-		if (document == null) {
-			return null;
-		}
-		Element span = document.createElement(IHTMLConstants.TAG_SPAN);
-		span.setAttribute(
-				"style", "color:gray;font-style:italic;font-size:normal;"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (text == null) {
-			span.appendChild(document.createTextNode(PDPlugin
-					.getResourceString("ConverterUtil.Description"))); //$NON-NLS-1$
-		} else {
-			span.appendChild(document.createTextNode(text));
-		}
-		return span;
-	}
-
-	/**
-	 * Method to find the resulting converted tag containing a given
-	 * source element. The converted element that will be
-	 * the parent tag is returned so the caller can then determine
-	 * if the parent is part of a table, header, body, footer, row,
-	 * cell, or some other element. 
-	 * 
-	 * @param srcElem the source element to test.
-	 * @param childElem a child of the source element (used by a
-	 *                  recursive call to handle special case where
-	 *                  it was moved up a level to the child model
-	 *                  list of the grandparent).
-	 * @return a converted element of the type that will contain the
-	 *         source element. 
-	 */
-	static Node findConvertedParentElement(Element srcElem, Element childElem) {
-		Node parent = srcElem.getParentNode();
-		if ((parent == null) || !(parent instanceof Element)) {
-			return null;
-		}
-
-		String name = parent.getNodeName();
-		if (IHTMLConstants.TAG_HTML.equalsIgnoreCase(name)
-				|| IHTMLConstants.TAG_BODY.equalsIgnoreCase(name)) {
-			return null;
-		}
-
-		ITagConverter converter = createTagConverter((Element) parent);
-		if (!converter.isVisualByHTML()) {
-			return null;
-		}
-
-		converter.convertRefresh(null);
-		ConvertPosition position = null;
-		if (childElem != null) {
-			// If a child node (grand child of current parent) was
-			// passed in, check for its position. It may have been
-			// moved up a level to child model list of the current
-			// parent. In JSF this is done with a header or
-			// footer facet tag in a column tag for a dataTable.
-			position = converter.getChildVisualPosition(childElem);
-		}
-		if (position == null) {
-			position = converter.getChildVisualPosition(srcElem);
-		}
-		if (position != null) {
-			// return the node that will contain the visual
-			// child and then the caller can check to see if this
-			// element is table mark-up.
-			return position.getParentNode();
-		}
-
-		// The current source element is not in the child model
-		// list for the converted parent so recurse to next
-		// ancestor and pass source element to see if it has been
-		// moved up a level as child model of the grandparent.
-		return findConvertedParentElement((Element) parent, srcElem);
-	}
-
-	private static ITagConverter createTagConverter(Element ele) {
-		return DTManager.getInstance().getTagConverter(ele,
-				IConverterFactory.MODE_DESIGNER, null);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java
deleted file mode 100644
index e0a2af2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This tag converter is for those unsupported jsp tags.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DefaultUnknownTagConverter extends AbstractTagConverter {
-
-	private static final int NO_ELEMENT = 0;
-	private static final int TABLE_ELEMENT = 1;
-	private static final int TABLE_ROW_ELEMENT = 2;
-
-	/**
-	 * @param host
-	 * @param mode 
-	 */
-	public DefaultUnknownTagConverter(Element host, int  mode) {
-		super(host);
-        setMode(mode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element hostEle = this.getHostElement();
-
-		// Test to see if the src element is contained in an
-		// element that renders as a table. If so, render this
-		// element accordingly as content in the table.
-		// This is done to address the use case where tags
-		// (such as JSTL) are used in collaboration within HTML
-		// tables. The CSS layout for tables does not handle
-		// invalid HTML so this change tries to produce valid
-		// HTML. If the table layout code gets updated to handle
-		// invalid HTML tables, then this code can be removed.
-		// See https://bugs.eclipse.org/bugs/show_bug.cgi?id=253974
-		Node containingElement = ConverterUtil.findConvertedParentElement(hostEle, null);
-		String name = null;
-		if (containingElement != null) {
-			name = containingElement.getNodeName(); 
-		}
-		if (name != null) {
-			if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(name)
-					|| IHTMLConstants.TAG_TBODY.equalsIgnoreCase(name)
-					|| IHTMLConstants.TAG_TFOOT.equalsIgnoreCase(name)) {
-				// this element is contained in a table, tbody or tfoot
-				return renderAsTableRow(hostEle, false, TABLE_ELEMENT);
-			} else if (IHTMLConstants.TAG_THEAD.equalsIgnoreCase(name)) {
-				// this element is contained in a thead
-				return renderAsTableRow(hostEle, true, TABLE_ELEMENT);
-			} else if (IHTMLConstants.TAG_TR.equalsIgnoreCase(name)) {
-				// this element is contained in a tr
-				return renderAsTableCell(hostEle, false, TABLE_ROW_ELEMENT);
-			}
-		}
-		
-		// Otherwise, use the default rendering for an unknown tag
-		return renderDefault(hostEle, NO_ELEMENT);
-	}
-
-	private Element renderDefault(Element hostEle, int tableElement) {
-		// rendering for host element not contained in a table
-		Element divEle = createElement("div"); //$NON-NLS-1$
-		String style = DOMUtil.getAttributeIgnoreCase(hostEle, "style"); //$NON-NLS-1$
-		if (style == null) {
-			style = ""; //$NON-NLS-1$
-		}
-		if (style.length() > 0 && !style.endsWith(";")) { //$NON-NLS-1$
-			style += ";"; //$NON-NLS-1$
-		}
-		style += "border: none; padding: 0; margin: 0"; //$NON-NLS-1$
-		divEle.setAttribute("style", style); //$NON-NLS-1$
-		Element div2 = createElement("span"); //$NON-NLS-1$
-        String border = isPreviewMode() ? "border-style: solid;border-width: 1px" : "border:none"; //$NON-NLS-1$ //$NON-NLS-2$
-		div2.setAttribute("style", "background-color: white;"+border+";color:gray"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		Text txt = createText(hostEle.getTagName());
-		div2.appendChild(txt);
-
-		divEle.appendChild(div2);
-
-		Element childContainer = null;
-		switch (tableElement) {
-		case TABLE_ELEMENT:
-			childContainer = createElement(IHTMLConstants.TAG_TABLE);
-			copyChildren(getHostElement(), childContainer);
-			break;
-		case TABLE_ROW_ELEMENT:
-			childContainer = createElement(IHTMLConstants.TAG_TABLE);
-			Element trElem = createElement(IHTMLConstants.TAG_TR);
-			childContainer.appendChild(trElem);
-			copyChildren(getHostElement(), trElem);
-			break;
-		case NO_ELEMENT:
-		default:
-			childContainer = createElement("div"); //$NON-NLS-1$
-			childContainer.setAttribute("style", "margin: 0; padding: 0"); //$NON-NLS-1$ //$NON-NLS-2$
-			copyChildren(getHostElement(), childContainer);
-			break;
-		}
-
-		divEle.appendChild(childContainer);
-
-		return divEle;
-	}
-
-	/*
-	 * Creates a table row, and adds either a table cell (data
-	 * or a header depending on the boolean flag).
-	 */
-	private Element renderAsTableRow(Element hostEle, boolean isHeader, int tableElement) {
-		Element trElem = createElement(IHTMLConstants.TAG_TR);
-		Element tdElem = renderAsTableCell(hostEle, isHeader, tableElement);
-		trElem.appendChild(tdElem);
-		return trElem;
-	}
-
-	/*
-	 * Creates a table cell, as either data or a header depending
-	 * on the boolean flag.
-	 */
-	private Element renderAsTableCell(Element hostEle, boolean isHeader, int tableElement) {
-		Element tdElem = null;
-		if (isHeader) {
-			tdElem = createElement(IHTMLConstants.TAG_TH);
-		} else {
-			tdElem = createElement(IHTMLConstants.TAG_TD);
-		}
-		tdElem.appendChild(renderDefault(hostEle, tableElement));
-		return tdElem;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java
deleted file mode 100644
index 0a56b52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumDeepTagConverter extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public DumDeepTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		return (Element) DOMUtil.cloneNodeDeepIgnoreError(getDestDocument(),
-				getHostElement());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-    // TODO: dead?
-//	private boolean internalIsWidget(Element result) {
-//		String tagname = result.getTagName();
-//		if (IHTMLConstants.TAG_INPUT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_SELECT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_TEXTAREA.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_IMG.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_HEAD.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_SCRIPT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagname)) {
-//			return true;
-//		} else {
-//
-//			return false;
-//		}
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java
deleted file mode 100644
index 2221a52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumDescriptionTagConverter extends AbstractTagConverter {
-	/**
-	 * @param host
-	 */
-	public DumDescriptionTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		copyChildren(getHostElement(), result);
-
-		if (!this.isPreviewMode()
-				&& ConverterUtil.isEmptyContainer(getHostElement())) {
-			result.appendChild(ConverterUtil.createDescriptionElement(
-					getDestDocument(), null));
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java
deleted file mode 100644
index 455bc85..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumTagConverter extends AbstractTagConverter {
-	/**
-	 * @param host 
-	 * @param needBorder 
-	 */
-	public DumTagConverter(Element host, boolean needBorder) {
-		this(host);
-		this.setNeedBorderDecorator(needBorder);
-	}
-
-	/**
-	 * @param host
-	 */
-	public DumTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		if (!internalIsWidget(result)) {
-			copyChildren(getHostElement(), result);
-		} else {
-			dumCopyChildren(getHostElement(), result);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		if (isWidget()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param result
-	 * @return
-	 */
-	private boolean internalIsWidget(Element result) {
-		String tagname = result.getTagName();
-		if (IHTMLConstants.TAG_INPUT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_SELECT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_TEXTAREA.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_IMG.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_OBJECT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_HEAD.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_SCRIPT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_BR.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_STYLE.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_HR.equalsIgnoreCase(tagname)) {
-			return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return internalIsWidget(getResultElement());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java
deleted file mode 100644
index 1a3b711..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * For some tag, could generate some XML code.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class HTMLStringTagConverter extends AbstractTagConverter {
-
-	static Logger _log = PDPlugin.getLogger(HTMLStringTagConverter.class);
-
-	/**
-	 * @param host
-	 */
-	public HTMLStringTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		// following are XML implementation. Assume the string is welformed HTML
-		// try
-		// {
-		// String html = getGeneratedHTML();
-		// DocumentBuilder builder =
-		// DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		// Element result = builder.parse(new InputSource(new
-		// StringReader(html))).getDocumentElement();
-		// return (Element)DOMUtil.cloneNodeDeep(this.getDestDocument(),
-		// result);
-		// }
-		// catch(Exception ex)
-		// {
-		// Element temp = createElement("div");
-		// temp.appendChild(createText("ERROR: "+ex.getMessage()));
-		// return temp;
-		// }
-		InputStream stream = null;
-		try {
-			String id = "" + System.currentTimeMillis() + ".html"; //$NON-NLS-1$ //$NON-NLS-2$
-			IModelManager manager = StructuredModelManager.getModelManager();
-			stream = new ByteArrayInputStream(getGeneratedHTML().getBytes());
-			IDOMModel model = (IDOMModel) manager.getModelForRead(id, stream,
-					null);
-			Element root = model.getDocument().getDocumentElement();
-			Element resultEle = (Element) DOMUtil.cloneNodeDeepIgnoreError(
-					getDestDocument(), root);
-			model.releaseFromRead();
-			return resultEle;
-		} catch (Exception ex) {
-			_log.error("Log.Error.HTMLStringTagConverter.Error", ex); //$NON-NLS-1$
-			Element temp = createElement("div"); //$NON-NLS-1$
-			temp.appendChild(createText("Error loading: " + ex.getMessage())); //$NON-NLS-1$
-			return temp;
-		} finally {
-			ResourceUtils.ensureClosed(stream);
-		}
-	}
-
-	/**
-	 * @return the generated HTML string
-	 * @throws Exception
-	 */
-	public abstract String getGeneratedHTML() throws Exception;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java
deleted file mode 100644
index 51a6c1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This is for those tags that don't convert to HTML. So they will not display
- * anything in preview, and will display a small icon in designer.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class HiddenTagConverter implements ITagConverter {
-	private Element _hostElement;
-
-    private ILabelProvider         _labelProvider;
-
-	private int _mode;
-
-	/**
-	 * @param host 
-	 * @param labelProvider 
-	 * 
-	 */
-	public HiddenTagConverter(Element host, ILabelProvider labelProvider) {
-		_hostElement = host;
-		//_image = image;
-        _labelProvider = labelProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setDestDocument(org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument)
-	 */
-	public void setDestDocument(IDOMDocument document) {
-        // do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#convertRefresh(java.lang.Object)
-	 */
-	public void convertRefresh(Object context) {
-		// do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getHostElement()
-	 */
-	public Element getHostElement() {
-		return _hostElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isVisualByHTML()
-	 */
-	public boolean isVisualByHTML() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getVisualImage()
-	 */
-	public Image getVisualImage() {
-        // defer the creation of the image until it is needed
-		return _labelProvider.getImage(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getResultElement()
-	 */
-	public Element getResultElement() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildModeList()
-	 */
-	public List getChildModeList() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildVisualPosition(org.w3c.dom.Node)
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#dispose()
-	 */
-	public void dispose() {
-        // do nothing
-        // TODO: dispose of image or Element here?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setMode(int)
-	 */
-	public void setMode(int mode) {
-		this._mode = mode;
-	}
-
-	/**
-	 * @return the mode
-	 */
-	public int getMode() {
-		return _mode;
-	}
-
-    public List getNonVisualChildren() {
-        return Collections.EMPTY_LIST;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java
deleted file mode 100644
index f51af22..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * HiddenTagConverter2 is similiar to HiddenTagConverter, with the following
- * difference:
- * 
- * <ol>
- * <li>HiddenTagConverter2 will copy the DOM sub tree to the destination
- * document.</li>
- * </ol>
- * 
- * TODO: this the wrong way to do this.  This should sub-class HiddenTagConverter
- * 
- * @author mengbo
- * @version 1.5
- */
-public class HiddenTagConverter2 extends AbstractTagConverter {
-
-	private Image _image;
-
-	/**
-	 * @param host
-	 * @param image
-	 */
-	public HiddenTagConverter2(Element host, Image image) {
-		super(host);
-		this._image = image;
-	}
-
-	protected Element doConvertRefresh() {
-		return (Element) DOMUtil.cloneNodeDeepIgnoreError(getDestDocument(),
-				getHostElement());
-	}
-
-	public boolean isVisualByHTML() {
-		return false;
-	}
-
-	public Image getVisualImage() {
-		return _image;
-	}
-
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java
deleted file mode 100644
index f8aebf2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IConverterFactory {
-	/**
-	 * indicates designer mode 
-	 */
-	public static final int MODE_DESIGNER = 0;
-
-	/**
-	 * indicates preview mode
-	 */
-	public static final int MODE_PREVIEW = 1;
-
-	/**
-	 * 
-	 * @param element
-	 * @param mode 
-	 * @return null if this factory don't support this element
-	 */
-	public ITagConverter createConverter(Element element, int mode);
-
-	/**
-	 * get the URI namespace that this factory support. "null" means this
-	 * factory can be used as default factory.
-	 * 
-	 * @return null if this factory don't have a specific URI to support.
-	 */
-	public String getSupportedURI();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java
deleted file mode 100644
index 3e3d374..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * Factory interface. AbstractTagConverter will implement it.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IDOMFactory {
-	/**
-	 * create element
-	 * 
-	 * @param tag
-	 * @return a new element using tag as its name
-	 */
-	public Element createElement(String tag);
-
-	/**
-	 * create text node
-	 * 
-	 * @param content
-	 * @return a new text node using content as its body
-	 */
-	public Text createText(String content);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java
deleted file mode 100644
index b5aea53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.List;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITagConverter is used to convert a custom tag to a HTML tag. Each
- * ITagConverter instance will be dedicated to a single custom tag element.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ITagConverter {
-	/**
-	 * Set the target document where the converted node should belong to.
-	 * 
-	 * @param document
-	 */
-	public void setDestDocument(IDOMDocument document);
-
-	/**
-	 * refresh the internal state of this ITagConverter. This method normally is
-	 * called when the host element change.
-	 * 
-	 * @param context
-	 */
-	public void convertRefresh(Object context);
-
-	/**
-	 * @return The host element being converted.
-	 */
-	public Element getHostElement();
-
-	/**
-	 * for some tags, they don't convert to HTML. In that case, this method
-	 * should return false for them. And if this method return false, then
-	 * should return an image in <code>getVisualImage()</code> for displaying
-	 * in the designer.
-	 * 
-	 * @return true if the tag represents something that will be rendered visually at runtime
-	 */
-	public boolean isVisualByHTML();
-
-	/**
-	 * if isVisualByHTML() return false, then this method should return an image
-	 * to be displayed in designer.
-	 * 
-	 * Normally this image will be a shared image for those hidden elements. It
-	 * is this class's responsibility to dispose the image if the image is not a
-	 * shared one.
-	 * 
-	 * @return the placeholder image for non-visual tags
-	 */
-	public Image getVisualImage();
-
-	/**
-	 * @return the result element after conversion
-	 */
-	public Element getResultElement();
-
-	/**
-	 * @return the list of children that should be continuely converted.
-	 */
-	public List getChildModeList();
-    
-    /**
-     * @return a list of Element tags that map to non-visual children
-     * Type should be always be Element.
-     */
-    public List getNonVisualChildren();
-
-	/**
-	 * For child nodes that need further convert, return their position in the
-	 * converted DOM tree.
-	 * 
-	 * @param childModel
-	 * @return the position of child nodes
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel);
-
-	/**
-	 * When the convert result in multi-level element. If this method return
-	 * false, then the caller should not use child nodes of
-	 * <code>getHostElement()</code>
-	 * 
-	 * @return true if the host element has convertable children
-	 */
-	public boolean isMultiLevel();
-
-	/**
-	 * 
-	 * @return true if the host element is a widget
-	 */
-	public boolean isWidget();
-
-	/**
-	 * API contract needed here
-	 * 
-	 */
-	public void dispose();
-
-	/**
-	 * @param mode
-	 */
-	public void setMode(int mode);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java
deleted file mode 100644
index abfacda..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFConverterUtil {
-	private static List NamedBooleanList = Arrays.asList(new String[] {
-			"disabled", "readonly", "ismap" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * 
-	 * @param source
-	 * @param dest
-	 * @param ignore
-	 */
-	public static void copyAllAttributes(Element source, Element dest,
-			Set ignore) {
-		NamedNodeMap attrs = source.getAttributes();
-		for (int i = 0, size = attrs.getLength(); i < size; i++) {
-			Attr attr = (Attr) attrs.item(i);
-			if (ignore == null || !ignore.contains(attr.getName())) {
-				if (NamedBooleanList.contains(attr.getName())
-						&& "false".equalsIgnoreCase(attr.getValue())) { //$NON-NLS-1$
-					continue;
-				}
-				dest.setAttribute(attr.getName(), attr.getValue());
-			}
-		}
-	}
-
-	/**
-	 * copy a single attribute (if exist)
-	 * 
-	 * @param source
-	 * @param srcattr
-	 * @param dest
-	 * @param destattr
-	 */
-	public static void copyAttribute(Element source, String srcattr,
-			Element dest, String destattr) {
-		Attr attr = source.getAttributeNode(srcattr);
-		if (attr != null) {
-			dest.setAttribute(destattr, attr.getValue());
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java
deleted file mode 100644
index ea9dc4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreferenceReader {
-	/**
-	 * expression type
-	 */
-	public final static int FULL_EXPRESSION_TYPE = 0;
-
-    /**
-     * expression type
-     */
-	public final static int LAST_EXPRESSION_TYPE = 1;
-
-    /**
-     * expression type
-     */
-	public final static int REAL_VALUE_TYPE = 2;
-
-	/**
-	 * @return the map value type
-	 */
-	public static int getMapValueType() {
-		return LAST_EXPRESSION_TYPE;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java
deleted file mode 100644
index 619875d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TagConverterToDumBlock extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public TagConverterToDumBlock(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(IHTMLConstants.TAG_DIV);
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java
deleted file mode 100644
index aec787e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * This converter can be used simply convert the tag to inline div, and copy all
- * the children
- * 
- * NOTE: It behave almost same as "span". In fact, we may remove this later, if
- * our css engine support "minWidth"/"minHeight" for inline element.
- * 
- * NOTE: it will not copy attributes!
- * 
- * @author mengbo
- * @version 1.5
- * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinHeight()
- * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinWidth()
- */
-public class TagConverterToInlineBlock extends AbstractTagConverter {
-	private int displayMode;
-
-	/**
-	 * @param host
-	 * @param mode
-	 */
-	public TagConverterToInlineBlock(Element host, int mode) {
-		super(host);
-		this.displayMode = mode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = null;
-		if (displayMode == IConverterFactory.MODE_PREVIEW) {
-			result = createElement("span"); //$NON-NLS-1$
-			copyChildren(getHostElement(), result);
-		} else {
-			result = createElement("div"); //$NON-NLS-1$
-			result
-					.setAttribute(
-							"style", //$NON-NLS-1$
-							"display:inline-block; border-width:0; margin:0; min-width:1.2em;min-height:1.2em;"); //$NON-NLS-1$
-			copyChildren(getHostElement(), result);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java
deleted file mode 100644
index 8a05f56..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * This converter can be used simply convert the tag to span, and copy all the
- * children
- * 
- * NOTE: it will not copy attributes!
- * 
- * @author mengbo
- * @version 1.5
- */
-public class TagConverterToSpan extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public TagConverterToSpan(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		// Register a named facet on the UIComponent associated with the
-		// closest parent UIComponent custom action.
-		// we'll render facet as a inline flow figure. so treat it as simple
-		// <span> here.
-		Element result = createElement("span"); //$NON-NLS-1$
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java
deleted file mode 100644
index 8f1ebca..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.html;
-
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.DumTagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ATagConverter extends DumTagConverter {
-	private boolean _emptyContainer = false;
-
-	/**
-	 * @param host
-	 */
-	public ATagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		_emptyContainer = ConverterUtil.isEmptyContainer(getHostElement());
-		if (_emptyContainer) {
-			Element resultEle = createElement("a"); //$NON-NLS-1$
-			ConverterUtil.copyAllAttributes(getHostElement(), resultEle, null);
-			Text fakedNode = createText("link"); //$NON-NLS-1$
-			resultEle.appendChild(fakedNode);
-			return resultEle;
-		}
-        return super.doConvertRefresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return _emptyContainer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return _emptyContainer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return _emptyContainer;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java
deleted file mode 100644
index de2a907..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.html;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.DumDescriptionTagConverter;
-import org.eclipse.jst.pagedesigner.converter.DumTagConverter;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter2;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HTMLConverterFactory implements IConverterFactory {
-
-	/**
-	 * the constructor
-	 */
-	public HTMLConverterFactory() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		String tagName = element.getLocalName();
-
-		if (mode == MODE_PREVIEW) {
-			return new DumTagConverter(element);
-		}
-		if (!HTMLUtil.isVisualHtmlElement(tagName)) {
-			return new HiddenTagConverter2(element, getUnknownImage());
-		}
-
-		AbstractTagConverter c;
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(tagName)) {
-			c = new TableTagConverter(element);
-		} else if (IHTMLConstants.TAG_A.equalsIgnoreCase(tagName)) {
-			c = new ATagConverter(element);
-		} else if (IHTMLConstants.TAG_FORM.equalsIgnoreCase(tagName)) {
-			// for those HTML tag that we want to build a border decorator,
-			// should
-			// go there.
-			c = new DumTagConverter(element, true);
-		} else if (IHTMLConstants.TAG_HTML.equalsIgnoreCase(tagName)
-				|| IHTMLConstants.TAG_BODY.equalsIgnoreCase(tagName)) {
-			c = new DumDescriptionTagConverter(element);
-			c.setNeedBorderDecorator(true);
-		} else {
-			c = new DumTagConverter(element);
-		}
-		c.setMode(mode);
-		return c;
-	}
-
-	private static Image getUnknownImage() {
-		return JSFUICommonPlugin.getDefault().getImage(
-				JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_HTML;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/TableTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/TableTagConverter.java
deleted file mode 100644
index eaf1928..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/TableTagConverter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.html;
-
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class TableTagConverter extends AbstractTagConverter {
-	/**
-	 * @param host
-	 */
-	public TableTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needTableDecorator()
-	 */
-	public boolean needTableDecorator() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java
deleted file mode 100644
index 4dd5e85..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.jsp;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.DocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.PageVariableAdapterFactory;
-import org.eclipse.jst.pagedesigner.preview.PageExpressionContext;
-import org.eclipse.jst.pagedesigner.preview.PreviewConvertContext;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This is the tag converter for preview.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class IncludeTagConverterPreview extends AbstractTagConverter {
-	private static Logger _log = PDPlugin
-			.getLogger(IncludeTagConverterPreview.class);
-
-	private String _fileAttrName;
-
-	/**
-	 * @param host
-	 * @param fileAttrname 
-	 */
-	public IncludeTagConverterPreview(Element host, String fileAttrname) {
-		super(host);
-		this._fileAttrName = fileAttrname;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		String fileName = getResolvedURL(getHostElement(), this._fileAttrName);
-		if (fileName == null || fileName.length() == 0) {
-			return null;
-		}
-        IPath includedPath = new Path(fileName);
-        includedPath.makeAbsolute();
-
-        IFile file = getFile(includedPath);
-        if (file == null) {
-        	return null;
-        }
-        return previewFile(file);
-	}
-
-	/**
-	 * @param includedPath
-	 * @return the IFile corresponding to the IPath
-	 */
-	public IFile getFile(IPath includedPath) {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IProject[] projects = workspaceRoot.getProjects();
-
-		for (int i = 0, length = projects.length; i < length; i++) {
-			IPath path = projects[i].getLocation();
-			path = path.makeAbsolute();
-			if (path != null && path.isPrefixOf(includedPath)) {
-				// -1 so we still have the project path
-				includedPath = includedPath.removeFirstSegments(path
-						.segmentCount() - 1);
-				return ResourcesPlugin.getWorkspace().getRoot().getFile(
-						includedPath);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param file
-	 * @return the Element
-	 */
-	public Element previewFile(IFile file) {
-		IDOMModel xmlModel = null;
-		DocumentPageVariableAdapter provider = null;
-		boolean pushedPageVarProvider = false;
-		try {
-
-			xmlModel = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(
-					file);
-			if (xmlModel != null) {
-				IDOMDocument doc = xmlModel.getDocument();
-
-				// XXX: need to also register page variable adapters. In the
-				// future, this should go to some
-				// SSE system registry mechanism.
-				xmlModel.getFactoryRegistry().addFactory(
-						new PageVariableAdapterFactory());
-				provider = new DocumentPageVariableAdapter(doc);
-				doc.addAdapter(provider);
-
-				provider.refresh();
-				PageExpressionContext.getCurrent()
-						.pushPageVarProvider(provider);
-
-				Node child = xmlModel.getDocument().getFirstChild();
-				PreviewConvertContext context = new PreviewConvertContext(this
-						.getDestDocument());
-				List results = new ArrayList();
-				while (child != null) {
-					Node node = context.previewConvert(child);
-					if (node != null) {
-						results.add(node);
-					}
-					child = child.getNextSibling();
-				}
-
-				if (results.size() == 0) {
-					return null;
-				} else if (results.size() == 1
-						&& results.get(0) instanceof Element) {
-					return (Element) results.get(0);
-				} else {
-					Element ret = createElement(IHTMLConstants.TAG_SPAN);
-					for (int i = 0, n = results.size(); i < n; i++) {
-						ret.appendChild((Node) results.get(i));
-					}
-					return ret;
-				}
-			}
-		} catch (CoreException e) {
-			_log.error("PreviewUtil.previewFile.CoreException", e); //$NON-NLS-1$
-		} catch (IOException e) {
-			_log.error("PreviewUtil.previewFile.IOException", e); //$NON-NLS-1$
-		} catch (Exception ex) {
-			_log.error("PreviewUtil.previewFile.CoreException", ex); //$NON-NLS-1$
-		} finally {
-			if (pushedPageVarProvider) {
-				PageExpressionContext.getCurrent().popPageVarProvider(provider);
-			}
-			if (xmlModel != null) {
-				xmlModel.releaseFromRead();
-			}
-		}
-		return null;
-	}
-
-	static String getResolvedURL(Element element, String attrName) {
-		URIResolver resolver = null;
-		if (element instanceof IDOMNode) {
-            // TODO: the new URI resolver is not available on the IStructuredModel
-			resolver = ((IDOMNode) element).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = element.getAttribute(attrName);
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java
deleted file mode 100644
index 5d1844f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.jsp;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.converter.TagConverterToDumBlock;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSPConverterFactory implements IConverterFactory {
-    private final ILabelProvider  _labelProvider;
-    
-	/**
-	 * 
-	 */
-	public JSPConverterFactory() {
-        _labelProvider = new MyLabelProvider();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		String tagName = element.getLocalName();
-
-		if (mode == IConverterFactory.MODE_PREVIEW) {
-			// we want to generate the included page in preview, so
-			// handle differently
-			if (IJSPCoreConstants.TAG_INCLUDE.equalsIgnoreCase(tagName)) {
-				IncludeTagConverterPreview c = new IncludeTagConverterPreview(
-						element, "page"); //$NON-NLS-1$
-				c.setMode(mode);
-				return c;
-			} else if (IJSPCoreConstants.TAG_DIRECTIVE_INCLUDE
-					.equalsIgnoreCase(tagName)) {
-				IncludeTagConverterPreview c = new IncludeTagConverterPreview(
-						element, "file"); //$NON-NLS-1$
-				c.setMode(mode);
-				return c;
-			} else if (IJSPCoreConstants.TAG_ROOT.equalsIgnoreCase(tagName)) {
-				TagConverterToDumBlock c = new TagConverterToDumBlock(element);
-				c.setNeedBorderDecorator(true);
-				c.setMode(mode);
-				return c;
-			} else {
-				return new HiddenTagConverter(element, _labelProvider);
-			}
-		}
-        if (IJSPCoreConstants.TAG_ROOT.equalsIgnoreCase(tagName)) {
-        	TagConverterToDumBlock c = new TagConverterToDumBlock(element);
-        	c.setNeedBorderDecorator(true);
-        	c.setMode(mode);
-        	return c;
-        }
-        return new HiddenTagConverter(element, _labelProvider);
-	}
-    
-    private static class MyLabelProvider extends org.eclipse.jface.viewers.LabelProvider
-    {
-
-        public Image getImage(Object element) 
-        {
-            if (element instanceof ITagConverter)
-            {
-                final Element hostElement = ((ITagConverter)element).getHostElement();
-                IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(hostElement);
-                if (context != null){                	
-                	IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-                	if (wsResolver != null){
-                		return TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),"JSP11", ITLDConstants.URI_JSP + ":"+hostElement.getLocalName()); //$NON-NLS-1$ //$NON-NLS-2$
-                	}
-                }
-            }
-            
-            return null;
-        }
-    }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_JSP;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/package-info.java
deleted file mode 100644
index d74c9f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Tag conversion framework. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.converter;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.java
deleted file mode 100644
index 34ef432..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
-import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.stylesheets.StyleSheet;
-import org.w3c.dom.stylesheets.StyleSheetList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class CSSTempUtil {
-	/**
-	 * the default implementation of (IStyleSheetListAdapter)
-	 * docnotifier.getAdapterFor(IStyleSheetListAdapter.class) will only get
-	 * those style tags under certain tags like "html", "head", etc.
-	 * 
-	 * But datawindow is generating style tag and is not putting them into
-	 * "head". So we can't handle them using the default SSE mechanism.
-	 * 
-	 * We have another problem: currently the converted element is also using
-	 * the original document, not generating another document, and these
-	 * elements is not really adding into the document, so they can't be reached
-	 * from the document.
-	 * 
-	 * @param element
-	 * @return the list
-	 * see org.eclipse.wst.html.core.htmlcss.HTMLDocumentAdapter#addStyleSheet(org.w3c.dom.Element)
-	 */
-	public static List getStyleSheets(Element element) {
-		List styleSheets = new ArrayList();
-		INodeNotifier docnotifier = (INodeNotifier) element.getOwnerDocument();
-		IStyleSheetListAdapter adapter = (IStyleSheetListAdapter) docnotifier
-				.getAdapterFor(IStyleSheetListAdapter.class);
-
-		StyleSheetList ssl = (adapter == null ? null : adapter.getStyleSheets());
-
-		if (ssl != null) {
-			for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++) {
-				// loop for styles (<style> and <link>)
-				org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-				styleSheets.add(ss);
-			}
-		}
-
-		// now is our work-around part for support datawindow.
-		Node parent = element.getParentNode();
-		Element rootEle = element;
-		while (parent != null && parent instanceof Element) {
-			rootEle = (Element) parent;
-			parent = parent.getParentNode();
-		}
-		addStyleSheet(rootEle, styleSheets);
-
-		//add stylesheets from any active IDTSkin instances
-		if (element instanceof IDOMNode) {
-			List<IDTSkin> dtSkins =
-				DTSkinManager.getInstance((IDOMNode)element).getCurrentSkins();
-			for (IDTSkin dtSkin: dtSkins) {
-				if (dtSkin != null) {
-					styleSheets.addAll(dtSkin.getStyleSheets());
-				}
-			}
-		}
-
-		return styleSheets;
-	}
-
-	/**
-	 */
-	private static void addStyleSheet(Element node, List result) {
-		IDOMElement element = (IDOMElement) node;
-		String tagName = element.getTagName();
-		if (tagName == null) {
-			return;
-		}
-		boolean isContainer = false;
-
-		if (element.isCommentTag()) {
-			Node parent = element.getParentNode();
-			if (parent == element.getOwnerDocument()) {
-				// This condition is too severe, actually do not work for JSF
-				// template.
-				// But above (! globalTag() && isContainer()) cover JSF template
-				// + tpl template
-				isContainer = true;
-			} else if (parent.getNodeType() == Node.ELEMENT_NODE) {
-				tagName = ((Element) parent).getTagName();
-				if (tagName != null
-						&& tagName
-								.equalsIgnoreCase(HTML40Namespace.ElementName.HEAD)) {
-					isContainer = true;
-				}
-			}
-		} else {
-			INodeNotifier notifier = element;
-
-			// (lium) Increase performance: since this method is called tooooo
-			// many times,
-			// and getAdapterFor() is slow, so add a check on the tagName to
-			// filter
-			// those stylesheet stuff first.
-			if (IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagName)
-					|| IHTMLConstants.TAG_STYLE.equalsIgnoreCase(tagName)) {
-				INodeAdapter adapter = notifier
-						.getAdapterFor(IStyleSheetAdapter.class);
-				if (adapter instanceof IStyleSheetAdapter) {
-                    // XXX: see bug 171740.  This is a (hopefully) temporary
-                    // workaround that avoids having the call to getSheet throw an NPE
-                    IStyleSheetAdapter sheetAdapter = (IStyleSheetAdapter) adapter;
-                    if (sheetAdapter.getElement() != null
-                            && "text/css".equals(sheetAdapter.getElement().getAttribute(HTML40Namespace.ATTR_NAME_TYPE))) //$NON-NLS-1$
-
-                    {
-    					StyleSheet sheet = ((IStyleSheetAdapter) adapter)
-    							.getSheet();
-                        
-                        if (sheet != null)
-                        {
-                            result.add(sheet);
-                        }
-                    }
-				}
-			}
-
-			isContainer = true;
-		}
-		if (isContainer) {
-			for (Node child = element.getFirstChild(); child != null; child = child
-					.getNextSibling()) {
-				if (child.getNodeType() != Node.ELEMENT_NODE)
-					continue;
-				addStyleSheet((Element) child, result);
-			}
-		}
-	}
-	
-	private CSSTempUtil()
-	{
-	    //  util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSUtil.java
deleted file mode 100644
index 6d1cdad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSUtil.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFont;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
-import org.eclipse.wst.css.core.internal.util.CSSClassTraverser;
-import org.eclipse.wst.html.core.internal.htmlcss.CSSQueryTraverser;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSStyleDeclaration;
-import org.w3c.dom.stylesheets.StyleSheet;
-import org.w3c.dom.stylesheets.StyleSheetList;
-
-/**
- * @author mengbo
- */
-public class CSSUtil {
-	private static StyleSheet _userAgentDefault;
-
-	/**
-	 * @param doc
-	 * @return the css classes
-	 */
-	public static String[] getCSSClasses(Document doc) {
-		Collection c = Collections.EMPTY_SET;
-		if (doc instanceof INodeNotifier) {
-			IStyleSheetListAdapter adapter = (IStyleSheetListAdapter) ((INodeNotifier) doc)
-					.getAdapterFor(IStyleSheetListAdapter.class);
-			StyleSheetList ssl = (adapter == null ? null : adapter
-					.getStyleSheets());
-
-			CSSClassTraverser traverser = new CSSClassTraverser();
-			if (ssl != null) {
-				for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++) {
-					// loop for styles (<style> and <link>)
-					org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-
-					try {
-						traverser.apply((ICSSNode) ss);
-					} catch (ClassCastException ex) {
-						Logger log = PDPlugin
-								.getLogger(CSSStyleDeclaration.class);
-						log.error("Error.CSSUtil.0", ex); //$NON-NLS-1$
-						// FIXME: should this continue to be processed?
-					}
-				}
-				c = traverser.getClassNames();
-			}
-		}
-		String[] result = new String[c.size()];
-		c.toArray(result);
-		return result;
-	}
-
-	/**
-	 * Get the css style of a node.
-	 * 
-	 * @param node
-	 * @return the style
-	 */
-	public static ICSSStyle getCSSStyle(Element node) {
-		ICSSStyle style = null;
-		if (node instanceof IDOMElement) {
-			style = (ICSSStyle) ((IDOMElement) node)
-					.getAdapterFor(ICSSStyle.class);
-		}
-		if (style == null) {
-			return DefaultStyle.getInstance();
-		}
-        return style;
-	}
-
-	/**
-	 * Resolve the css style string from css style elements.
-	 * 
-	 * @param style
-	 * @return the style string
-	 */
-	public static String resolveCSSStyle(ICSSStyle style) {
-		StringBuffer sb = new StringBuffer();
-		Object object1 = style.getColor();
-		if (object1 instanceof Color) {
-			sb.append("color:"); //$NON-NLS-1$
-
-			sb.append("#").append( //$NON-NLS-1$
-					Integer.toHexString(((Color) object1).getRed()));
-			sb.append("#").append( //$NON-NLS-1$
-					Integer.toHexString(((Color) object1).getGreen()));
-			sb.append("#").append( //$NON-NLS-1$
-					Integer.toHexString(((Color) object1).getBlue()));
-			sb.append(";"); //$NON-NLS-1$
-		}
-		Object object2 = style.getCSSFont();
-		if (object2 instanceof CSSFont) {
-			sb.append(((CSSFont) object2).getCSSString());
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Many of this method implementation copied from HTMLDocumentAdapter,
-	 * mainly add support for user agent default style sheet.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @param pseudoName
-	 *            the pseudoname of the element
-	 * @return the style declaration
-	 */
-	public static CSSStyleDeclaration getCSSDeclaration(Element element,
-			String pseudoName) {
-		// please reference comments in CSSTempUtil.
-		List styleSheets = CSSTempUtil.getStyleSheets(element);
-		// INodeNotifier docnotifier = (INodeNotifier)
-		// element.getOwnerDocument();
-		// IStyleSheetListAdapter adapter = (IStyleSheetListAdapter)
-		// docnotifier.getAdapterFor(IStyleSheetListAdapter.class);
-		//
-		// StyleSheetList ssl = (adapter == null ? null :
-		// adapter.getStyleSheets());
-
-		CSSQueryTraverser query = new CSSQueryTraverser();
-		query.setTraverseImported(true);
-		query.setTraverseImportFirst(true);
-		query.setElement(element, pseudoName);
-
-		// if (ssl != null)
-		// {
-		// for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++)
-		// {
-		// // loop for styles (<style> and <link>)
-		// org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-		if (styleSheets != null) {
-			for (int i = 0, numStyles = styleSheets.size(); i < numStyles; i++) {
-				StyleSheet ss = (StyleSheet) styleSheets.get(i);
-				try {
-					query.apply((ICSSNode) ss);
-				} catch (ClassCastException ex) {
-					Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-					log.error("Error.CSSUtil.0", ex); //$NON-NLS-1$
-					// FIXME: should this continue to be processed?
-				}
-			}
-		}
-		CSSStyleDeclaration declare = query.getDeclaration();
-		// FIXME: when do we need to apply the user agent style sheet?
-		return declare;
-	}
-
-	/**
-	 * Many of this method implementation copied from HTMLDocumentAdapter,
-	 * mainly add support for user agent default style sheet.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @param pseudoName
-	 *            the pseudoname of the element
-	 * @return the style declaration
-	 */
-	public static CSSStyleDeclaration getDefaultCSSDeclaration(Element element,
-			String pseudoName) {
-		CSSQueryTraverser query = new CSSQueryTraverser();
-		query.setTraverseImported(true);
-		query.setTraverseImportFirst(true);
-
-		query.setElement(element, pseudoName);
-
-		// FIXME: when do we need to apply the user agent style sheet?
-		try {
-			getUserAgentDefaultStyleSheet(element);
-		} catch (UnsupportedEncodingException e) {
-			Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-			log.error("Error.CSSUtil.1", e); //$NON-NLS-1$
-		} catch (IOException e) {
-			Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-			log.error("Error.CSSUtil.2", e); //$NON-NLS-1$
-		}
-		if (_userAgentDefault != null) {
-			try {
-				query.apply((ICSSNode) _userAgentDefault);
-			} catch (ClassCastException ex) {
-				Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-				log.error("Error.CSSUtil.3", ex); //$NON-NLS-1$
-			}
-		}
-		CSSStyleDeclaration declare = query.getDeclaration();
-		return declare;
-	}
-
-	/**
-	 * Get the user agent default style sheet.
-	 * 
-	 * @param element
-	 * @return
-	 * @throws IOException
-	 * @throws UnsupportedEncodingException
-	 */
-	// XXX: in the future, we may get user agent default style sheet based on
-	// device type.
-	private static StyleSheet getUserAgentDefaultStyleSheet(Element element)
-			throws UnsupportedEncodingException, IOException {
-		if (_userAgentDefault == null) {
-			InputStream input = null;
-			
-			try
-			{
-				input = CSSUtil.class
-					.getResourceAsStream(IJMTConstants.USERAGENT);
-				IStructuredModel model = StructuredModelManager.getModelManager()
-						.getModelForEdit(IJMTConstants.USERAGENT, input, null);
-				ICSSModel cssmodel = (ICSSModel) model;
-				_userAgentDefault = (StyleSheet) cssmodel.getDocument();
-			}
-			finally
-			{
-				ResourceUtils.ensureClosed(input);
-			}
-		}
-
-		return _userAgentDefault;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/ICSSStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/ICSSStyle.java
deleted file mode 100644
index 25d3ed6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/ICSSStyle.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2;
-
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-
-/**
- * The style declaration for an element can be cached.
- * 
- * @author mengbo
- */
-public interface ICSSStyle extends INodeAdapter, IAdaptable 
-{
-    /**
-     * 
-     */
-    public static final int INHERIT = Integer.MIN_VALUE;
-    
-	/**
-	 * the top attribute vale
-	 */
-	public static final String TOP = "top"; //$NON-NLS-1$
-
-	/**
-	 * the right attribute value
-	 */
-	public static final String RIGHT = "right"; //$NON-NLS-1$
-
-	/**
-	 * the left attribute value
-	 */
-	public static final String LEFT = "left"; //$NON-NLS-1$
-
-	/**
-	 * the bottom attribute value
-	 */
-	public static final String BOTTOM = "bottom"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public void reset();
-
-	/**
-	 * @return the font
-	 */
-	public ICSSFont getCSSFont();
-
-	/**
-	 * @param property
-	 * @return the style property
-	 */
-	public Object getStyleProperty(String property);
-
-	/**
-	 * @return the margin insets
-	 */
-	public Insets getMarginInsets();
-
-	/**
-	 * @return the border insets
-	 */
-	public Insets getBorderInsets();
-
-	/**
-	 * @return the padding insets
-	 */
-	public Insets getPaddingInsets();
-
-	/**
-	 * shortcut method to get the CSS display.
-	 * 
-	 * see http://www.w3.org/TR/REC-CSS2/visuren.html#propdef-display
-	 * @return the display string
-	 */
-	public String getDisplay();
-
-	/**
-	 * null means transparent.
-	 * 
-	 * @return the background color
-	 */
-	public Object getBackgroundColor();
-
-	/**
-	 * @return the foreground color
-	 */
-	public Object getColor();
-
-	/**
-	 * @return true if size includes border padding
-	 */
-	public boolean isSizeIncludeBorderPadding();
-
-	/**
-	 * 
-	 */
-	public void dispose();
-
-	/**
-	 * @return the parent style
-	 */
-	public ICSSStyle getParentStyle();
-
-	/**
-	 * Get counters declared on this style. the counters are either created by
-	 * counter-reset or refered by counter-increment
-	 * 
-	 * @return the counters
-	 */
-	public Map getCounters();
-
-	/**
-	 * Search a named counter declared on this style or its ancestors' styles
-	 * 
-	 * @param name
-	 * @param must
-	 * @return the generator
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must);
-
-	/**
-	 * Currently, rowspan and colspan are not CSS property. But based on the CSS
-	 * specification, it is expected in the future this two will be added as CSS
-	 * property, so we also include them into ICSSStyle
-	 * 
-	 * @return the row span
-	 */
-	public int getRowSpan();
-
-	/**
-	 * @return the column span
-	 */
-	public int getColSpan();
-
-	/**
-	 * Normally, when layout a figure and its children. We'll reset the counters
-	 * declared on this style. And if there are "counter-increment" on this
-	 * style, they'll also be processed.
-	 * 
-	 */
-	public void processCounters();
-
-	/**
-	 * Whether the corresponding figure should be draw in selected mode. This is
-	 * not a real CSS property. This is a shortcut method. implemented through
-	 * getAdapter() on IRangeSelectionProxy
-	 * 
-	 * @return true if in selection
-	 */
-	public boolean isInSelection();
-
-	/**
-	 * @param propertyName
-	 * @return the element init value
-	 */
-	public Object getHTMLelementInitValue(String propertyName);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/border/CSSBorder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/border/CSSBorder.java
deleted file mode 100644
index 96d6465..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/border/CSSBorder.java
+++ /dev/null
@@ -1,542 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.border;
-
-import java.util.Arrays;
-
-import org.eclipse.draw2d.AbstractBorder;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.MessageFormater;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSBorder extends AbstractBorder {
-
-	private static final String BODER_QUERY_TEMPLETE = "border-{0}-style"; //$NON-NLS-1$
-
-	private static final String COLOR_QUERY_TEMPLETE = "border-{0}-color"; //$NON-NLS-1$
-
-	private final ICSSStyle _style;
-
-	private final Rectangle _innerRect = new Rectangle();
-
-	/**
-	 * @param style
-	 */
-	public CSSBorder(ICSSStyle style) {
-		this._style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Border#getInsets(org.eclipse.draw2d.IFigure)
-	 */
-	public Insets getInsets(IFigure figure) {
-		return _style.getBorderInsets();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Border#paint(org.eclipse.draw2d.IFigure,
-	 *      org.eclipse.draw2d.Graphics, org.eclipse.draw2d.geometry.Insets)
-	 */
-	public void paint(IFigure figure, Graphics graphics, Insets insets) {
-		tempRect.setBounds(getPaintRectangle(figure, insets));
-		_innerRect.setBounds(tempRect);
-		_innerRect.crop(_style.getBorderInsets());
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.LEFT);
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.RIGHT);
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.TOP);
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.BOTTOM);
-	}
-
-	/**
-	 * @param style
-	 * @return
-	 */
-	private boolean shouldDraw(String style) {
-		return style != null && !ICSSPropertyID.VAL_NONE.equals(style)
-				&& !ICSSPropertyID.VAL_HIDDEN.equals(style);
-	}
-
-	/**
-	 * Fetchs the color array used to draw the given edge under the given style
-	 * 
-	 * @param graphics
-	 * @param style
-	 * @param edge
-	 * @return
-	 */
-	private RGB[] getEdgeColors(Graphics graphics, String style, String edge) {
-		String property = MessageFormater.format(COLOR_QUERY_TEMPLETE, edge);
-		Object obj = _style.getStyleProperty(property);
-		if (obj instanceof RGB) {
-			return getCustomColors(graphics, style, edge, (RGB) obj);
-		} else if (obj instanceof Color) {
-			return getCustomColors(graphics, style, edge, ((Color) obj)
-					.getRGB());
-		} else {
-			return getDefaultColors(graphics, style, edge);
-		}
-	}
-	// TODO: needs refactoring
-	private RGB[] getDefaultColors(Graphics graphics, String style, String edge) {
-		if (ICSSPropertyID.VAL_OUTSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.button.getRGB(),
-						ColorConstants.buttonLightest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonDarkest.getRGB(),
-            		ColorConstants.buttonDarker.getRGB() };
-		} else if (ICSSPropertyID.VAL_INSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.buttonDarker.getRGB(),
-						ColorConstants.buttonDarkest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonLightest.getRGB(),
-            		ColorConstants.button.getRGB() };
-		} else if (ICSSPropertyID.VAL_TDBORDERSTYLE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.buttonDarker.getRGB() };
-			}
-            return new RGB[] { ColorConstants.button.getRGB() };
-		} else if (ICSSPropertyID.VAL_RIDGE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.button.getRGB(),
-						ColorConstants.buttonDarkest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonDarkest.getRGB(),
-            		ColorConstants.button.getRGB() };
-		} else if (ICSSPropertyID.VAL_GROOVE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.buttonDarker.getRGB(),
-						ColorConstants.buttonLightest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonLightest.getRGB(),
-            		ColorConstants.buttonDarker.getRGB(), };
-		} else if (ICSSPropertyID.VAL_DOUBLE.equals(style)) {
-			return new RGB[] { ColorConstants.buttonDarkest.getRGB(),
-					graphics.getBackgroundColor().getRGB(),
-					ColorConstants.buttonDarkest.getRGB() };
-		} else if (ICSSPropertyID.VAL_SOLID.equals(style)) {
-			return new RGB[] { ColorConstants.black.getRGB() };
-		}
-
-		return new RGB[] { ColorConstants.black.getRGB() };
-	}
-
-    // TODO: needs refactoring
-	private RGB[] getCustomColors(Graphics graphics, String style, String edge,
-			RGB baseColor) {
-		if (ICSSPropertyID.VAL_OUTSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red * 3 / 4,
-								baseColor.green * 3 / 4,
-								baseColor.blue * 3 / 4),
-						new RGB(baseColor.red, baseColor.green, baseColor.blue) };
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red / 2,
-            				baseColor.green / 2,
-            				baseColor.blue / 2),
-            		new RGB(baseColor.red / 4,
-            				baseColor.green / 4,
-            				baseColor.blue / 4) };
-		} else if (ICSSPropertyID.VAL_INSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red / 4,
-								baseColor.green / 4,
-								baseColor.blue / 4),
-						new RGB(baseColor.red / 2,
-								baseColor.green / 2,
-								baseColor.blue / 2) };
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red, baseColor.green, baseColor.blue),
-            		new RGB(baseColor.red * 3 / 4,
-            				baseColor.green * 3 / 4,
-            				baseColor.blue * 3 / 4), };
-		} else if (ICSSPropertyID.VAL_TDBORDERSTYLE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { new RGB(baseColor.red / 4,
-						baseColor.green / 4, baseColor.blue / 4) };
-			}
-            return new RGB[] { new RGB(baseColor.red, baseColor.green,
-            		baseColor.blue) };
-		} else if (ICSSPropertyID.VAL_RIDGE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red * 3 / 4,
-								baseColor.green * 3 / 4,
-								baseColor.blue * 3 / 4),
-						new RGB(baseColor.red / 2,
-								baseColor.green / 2,
-								baseColor.blue / 2) };
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red / 2,
-            				baseColor.green / 2,
-            				baseColor.blue / 2),
-            		new RGB(baseColor.red * 3 / 4,
-            				baseColor.green * 3 / 4,
-            				baseColor.blue * 3 / 4) };
-		} else if (ICSSPropertyID.VAL_GROOVE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red / 4,
-								baseColor.green / 4,
-								baseColor.blue / 4),
-						new RGB(baseColor.red, baseColor.green, baseColor.blue) };
-
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red, baseColor.green, baseColor.blue),
-            		new RGB(baseColor.red / 4,
-            				baseColor.green / 4,
-            				baseColor.blue / 4) };
-		} else if (ICSSPropertyID.VAL_DOUBLE.equals(style)) {
-			return new RGB[] {
-					new RGB(baseColor.red, baseColor.green, baseColor.blue),
-					graphics.getBackgroundColor().getRGB(),
-					new RGB(baseColor.red, baseColor.green, baseColor.blue) };
-		} else if (ICSSPropertyID.VAL_SOLID.equals(style)) {
-			return new RGB[] { new RGB(baseColor.red, baseColor.green,
-					baseColor.blue) };
-		}
-		return new RGB[] { new RGB(baseColor.red, baseColor.green,
-				baseColor.blue) };
-	}
-
-	/**
-	 * @param graphics
-	 * @param rect
-	 * @param innerRect
-	 * @param edge
-	 * @param style
-	 */
-	public void paintEdge(Graphics graphics, Rectangle rect,
-			Rectangle innerRect, String edge, String style) {
-		if (!shouldDraw(style)) {
-			return;
-		}
-		RGB[] rgbs = getEdgeColors(graphics, style, edge);
-
-		if (ICSSStyle.TOP.equals(edge)) {
-			paintTopEdge(graphics, rgbs, style, rect, innerRect);
-		} else if (ICSSStyle.BOTTOM.equals(edge)) {
-			paintBottomEdge(graphics, rgbs, style, rect, innerRect);
-		} else if (ICSSStyle.LEFT.equals(edge)) {
-			paintLeftEdge(graphics, rgbs, style, rect, innerRect);
-		} else if (ICSSStyle.RIGHT.equals(edge)) {
-			paintRightEdge(graphics, rgbs, style, rect, innerRect);
-		}
-	}
-
-	/**
-	 * @param graphics
-	 * @param rect
-	 * @param innerRect
-	 * @param edge
-	 */
-	protected void paintEdge(Graphics graphics, Rectangle rect,
-			Rectangle innerRect, String edge) {
-		String property = MessageFormater.format(BODER_QUERY_TEMPLETE, edge);
-		Object obj = _style.getStyleProperty(property);
-		String style = obj.toString();
-		paintEdge(graphics, rect, innerRect, edge, style);
-	}
-
-	private void paintTopEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int leftX = rect.x;
-		int rightX = rect.right() - 1;
-		int y = rect.y;
-		int width = innerRect.y - rect.y;
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.TOP, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.TOP, rect, width);
-		} else {
-			double xLeftRate = ((double) (innerRect.x - rect.x)) / width;
-			double xRightRate = ((double) (rect.right() - innerRect.right()))
-					/ width;
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine((int) (leftX + i * xLeftRate), y + i,
-						(int) (rightX - i * xRightRate), y + i);
-				color.dispose();
-			}
-			graphics.popState();
-		}
-	}
-
-	private void paintBottomEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int leftX = rect.x;
-		int rightX = rect.right() - 1;
-		int y = rect.bottom() - 1;
-		int width = rect.bottom() - innerRect.bottom();
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.BOTTOM, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.BOTTOM, rect, width);
-		} else {
-			double xLeftRate = ((double) (innerRect.x - rect.x)) / width;
-			double xRightRate = ((double) (rect.right() - innerRect.right()))
-					/ width;
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine(leftX + (int) (i * xLeftRate), y - i, rightX
-						- (int) (i * xRightRate), y - i);
-				color.dispose();
-			}
-			graphics.popState();
-		}
-	}
-
-	private void paintLeftEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int x = rect.x;
-		int topY = rect.y;
-		int bottomY = rect.bottom() - 1;
-		int width = innerRect.x - rect.x;
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.LEFT, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.LEFT, rect, width);
-		} else {
-			double yTopRate = ((double) (innerRect.y - rect.y)) / width;
-			double yBottomRate = ((double) (rect.bottom() - innerRect.bottom()))
-					/ width;
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine(x + i, topY + (int) (i * yTopRate), x + i,
-						bottomY - (int) (i * yBottomRate));
-				color.dispose();
-			}
-			graphics.popState();
-		}
-
-	}
-
-	private void paintRightEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int x = rect.right() - 1;
-		int topY = rect.y;
-		int bottomY = rect.bottom() - 1;
-		int width = rect.right() - innerRect.right();
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.RIGHT, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.RIGHT, rect, width);
-		} else {
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				double yTopRate = ((double) (innerRect.y - rect.y)) / width;
-				double yBottomRate = ((double) (rect.bottom() - innerRect
-						.bottom()))
-						/ width;
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine(x - i, topY + (int) (i * yTopRate), x - i,
-						bottomY - (int) (i * yBottomRate));
-				color.dispose();
-			}
-			graphics.popState();
-		}
-	}
-
-	private void drawDottedBorder(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, int width) {
-		if (width == 0 || 3 * width > rect.width) {
-			return;
-		}
-
-		int beginX = 0;
-		int beginY = 0;
-		int xRate = 0;
-		int yRate = 0;
-		int span = 0;
-
-		if (ICSSStyle.TOP.equals(style)) {
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 1;
-			yRate = 0;
-			span = rect.width;
-		} else if (ICSSStyle.LEFT.equals(style)) {
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-			span = rect.height;
-		} else if (ICSSStyle.BOTTOM.equals(style)) {
-			beginX = rect.x;
-			beginY = rect.y + rect.height - width;
-			xRate = 1;
-			yRate = 0;
-			span = rect.width;
-		} else if (ICSSStyle.RIGHT.equals(style)) {
-			beginX = rect.x + rect.width - width;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-			span = rect.height;
-		}
-
-		int dottedCount = (span + width) / (2 * width);
-		if (dottedCount < 2) {
-			dottedCount = 2;
-		}
-		int averagePad = (span - dottedCount * width) / (dottedCount - 1);
-		int leftPad = (span - dottedCount * width) % (dottedCount - 1);
-		int[] paddings = new int[dottedCount - 1];
-		Arrays.fill(paddings, averagePad);
-		for (int i = 0; i < leftPad; i++) {
-			paddings[i] = paddings[i] + 1;
-		}
-
-		int pad = 0;
-		Color color = new Color(Display.getCurrent(), rgbs[0]);
-		graphics.pushState();
-		graphics.setBackgroundColor(color);
-		for (int i = 0; i < dottedCount; i++) {
-			graphics.fillOval(beginX + (pad + width * i) * xRate, beginY
-					+ (pad + width * i) * yRate, width, width);
-			if (i != dottedCount - 1) {
-				pad += paddings[i];
-			}
-		}
-		graphics.popState();
-		color.dispose();
-
-	}
-
-	private void drawDashedBorder(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, int borderThick) {
-		if (borderThick == 0 || 5 * borderThick > rect.width) {
-			return;
-		}
-
-		if ((5 * borderThick > rect.height)
-				&& (ICSSStyle.LEFT.equals(style) || ICSSStyle.RIGHT
-						.equals(style))) {
-			return;
-		}
-
-		int width = 0;
-		int height = 0;
-		int edgeLength = 0;
-		int beginX = 0;
-		int beginY = 0;
-		int xRate = 0;
-		int yRate = 0;
-		int span = 0;
-
-		if (ICSSStyle.TOP.equals(style)) {
-			width = borderThick * 2;
-			height = borderThick;
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 1;
-			yRate = 0;
-
-			span = rect.width;
-			edgeLength = width;
-		} else if (ICSSStyle.LEFT.equals(style)) {
-			width = borderThick;
-			height = borderThick * 2;
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-
-			span = rect.height;
-			edgeLength = height;
-		} else if (ICSSStyle.BOTTOM.equals(style)) {
-			width = borderThick * 2;
-			height = borderThick;
-			beginX = rect.x;
-			beginY = rect.y + rect.height - height;
-			xRate = 1;
-			yRate = 0;
-
-			span = rect.width;
-			edgeLength = width;
-		} else if (ICSSStyle.RIGHT.equals(style)) {
-			width = borderThick;
-			height = borderThick * 2;
-			beginX = rect.x + rect.width - width;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-
-			span = rect.height;
-			edgeLength = height;
-		}
-
-		int dottedCount = (span + borderThick) / (edgeLength + borderThick);
-		if (dottedCount < 2) {
-			dottedCount = 2;
-		}
-		int averagePad = (span - dottedCount * edgeLength) / (dottedCount - 1);
-		int leftPad = (span - dottedCount * edgeLength) % (dottedCount - 1);
-		int[] paddings = new int[dottedCount - 1];
-		Arrays.fill(paddings, averagePad);
-		for (int i = 0; i < leftPad; i++) {
-			paddings[i] = paddings[i] + 1;
-		}
-
-		int pad = 0;
-		graphics.pushState();
-		Color color = new Color(Display.getCurrent(), rgbs[0]);
-		graphics.setBackgroundColor(color);
-		for (int i = 0; i < dottedCount; i++) {
-			graphics.fillRectangle(beginX + (pad + width * i) * xRate, beginY
-					+ (pad + height * i) * yRate, width, height);
-			if (i != dottedCount - 1) {
-				pad += paddings[i];
-			}
-		}
-		graphics.popState();
-		color.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorConverter.java
deleted file mode 100644
index ea520a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorConverter.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.color;
-
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * @author mengbo
- */
-public class CSSColorConverter {
-	private static final String PREFIX_RGB = "rgb"; //$NON-NLS-1$
-
-	private static Logger _log = PDPlugin.getLogger(CSSColorConverter.class);
-
-	private static CSSColorConverter _instance = new CSSColorConverter();
-
-	/**
-	 * @return singleton instance
-	 */
-	public static CSSColorConverter getInstantce() {
-		if (_instance == null) {
-			_instance = new CSSColorConverter();
-		}
-		return _instance;
-	}
-
-	Object getCSSColor(String CSSText) {
-		if (CSSText == null) {
-			return null;
-		}
-
-		CSSText = CSSText.trim().toLowerCase();
-		if (CSSText.length() == 0) {
-			return null;
-		}
-		if (CSSColorDefaults.SYSTEM_DEFAULT_COLORS.containsKey(CSSText)) {
-			Object result = null;
-			result = CSSColorDefaults.SYSTEM_DEFAULT_COLORS.get(CSSText);
-			return result;
-		} else if (CSSColorDefaults.EXTENDED_COLORS.containsKey(CSSText)) {
-			Object result = null;
-			result = CSSColorDefaults.EXTENDED_COLORS.get(CSSText);
-			return result;
-		} else {
-			return convertStringToRGB(CSSText);
-		}
-	}
-
-	private RGB convertStringToRGB(String CSSText) {
-		StringBuffer sb = new StringBuffer(CSSText);
-		int value;
-		try {
-			if (sb.indexOf("#") == 0) //$NON-NLS-1$
-			{
-				if (sb.length() == 4) {
-					sb.insert(1, sb.charAt(1));
-					sb.insert(3, sb.charAt(3));
-					sb.insert(5, sb.charAt(5));
-					value = Integer.parseInt(sb.substring(1, sb.length())
-							.toString(), 16);
-					return new RGB(value >>> 16 & 0xff, value >>> 8 & 0xff,
-							value & 0xff);
-				} else if (sb.length() == 7) {
-					value = Integer.parseInt(sb.substring(1, sb.length()), 16);
-					return new RGB(value >>> 16 & 0xff, value >>> 8 & 0xff,
-							value & 0xff);
-				}
-			} else if (CSSText.startsWith(PREFIX_RGB)) {
-				return convertRgbToRGB(sb.substring(
-						sb.indexOf("(") + 1, sb.indexOf(")"))); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} catch (Exception e) {
-			_log.info("CSSColorConverter.0", CSSText, null); //$NON-NLS-1$
-			return null;
-		}
-		return null;
-	}
-
-	private RGB convertRgbToRGB(String text) {
-		text = text.trim();
-		try {
-			StringTokenizer tokenizer = new StringTokenizer(text, ",");//$NON-NLS-1$
-
-			if (tokenizer.countTokens() != 3) {
-				return null;
-			}
-			String[] rgbText = new String[3];
-			for (int i = 0; i < 3; i++) {
-				rgbText[i] = tokenizer.nextToken();
-			}
-
-			int[] intRGB = new int[] { 0, 0, 0 };
-			for (int i = 0; i < 3; i++) {
-				int intValue = -1;
-				String textValue = rgbText[i].trim();
-
-				if (textValue.endsWith("%"))//$NON-NLS-1$
-				{
-					textValue = textValue.substring(0, textValue.length() - 1);
-
-					intValue = Integer.parseInt(textValue) * 255 / 100;
-				} else {
-					intValue = Integer.parseInt(textValue);
-				}
-				if (intValue < 0) {
-					intValue = 0;
-				} else if (intValue > 255) {
-					intValue = 255;
-				}
-				intRGB[i] = intValue;
-			}
-			return new RGB(intRGB[0], intRGB[1], intRGB[2]);
-		} catch (Exception e) {
-			// notify
-			_log.info("CSSColorConverter.1", text, null); //$NON-NLS-1$
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorDefaults.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorDefaults.java
deleted file mode 100644
index f5aa44c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorDefaults.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.color;
-
-import java.util.HashMap;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSColorDefaults {
-	static final HashMap SYSTEM_DEFAULT_COLORS = new HashMap(20);
-
-	static final HashMap EXTENDED_COLORS = new HashMap(20);
-
-    // TODO C.B.: there is overlap here between the default and extended
-    // colors.  Also, for the custom colors, should use a ColorRegistry
-    // that allows other components to share values here
-	static {
-		SYSTEM_DEFAULT_COLORS.put("black", ColorConstants.black); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("blue", ColorConstants.blue); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("gray", ColorConstants.gray); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("green", new Color(null, 0, 128, 0)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("orange", ColorConstants.orange); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("red", ColorConstants.red); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("white", ColorConstants.white); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("yellow", ColorConstants.yellow); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("aqua", ColorConstants.cyan); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("fuchsia", new Color(null, 255, 0, 255)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("lime", ColorConstants.green); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("maroon", new Color(null, 128, 0, 0)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("navy", new Color(null, 0, 0, 128)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("olive", new Color(null, 128, 128, 0)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("purple", new Color(null, 128, 0, 128)); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("silver", ColorConstants.lightGray); //$NON-NLS-1$
-		SYSTEM_DEFAULT_COLORS.put("teal", new Color(null, 0, 128, 128)); //$NON-NLS-1$
-
-		SYSTEM_DEFAULT_COLORS.put("activeborder", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_BORDER));
-		// Active window border.
-		SYSTEM_DEFAULT_COLORS.put("activecaption", //$NON-NLS-1$
-				ColorConstants.titleBackground);
-		// Active window caption.
-		SYSTEM_DEFAULT_COLORS
-				.put("appworkspace", ColorConstants.listBackground); //$NON-NLS-1$
-		// Background color of multiple document interface.
-		SYSTEM_DEFAULT_COLORS.put("background", ColorConstants.listBackground); //$NON-NLS-1$
-		// Desktop background.
-		SYSTEM_DEFAULT_COLORS.put("buttonface", ColorConstants.button); //$NON-NLS-1$
-		// Face color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("buttonhighlight", //$NON-NLS-1$
-				ColorConstants.buttonLightest);
-		// Dark shadow for three-dimensional display elements (for edges facing
-		// away from the light source).
-		SYSTEM_DEFAULT_COLORS.put("buttonshadow", ColorConstants.buttonDarker); //$NON-NLS-1$
-		// Shadow color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("buttontext", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_FOREGROUND));
-		// Text on push buttons.
-		SYSTEM_DEFAULT_COLORS
-				.put("captiontext", ColorConstants.titleForeground); //$NON-NLS-1$
-		// Text in caption, size box, and scrollbar arrow box.
-		SYSTEM_DEFAULT_COLORS.put("graytext", //$NON-NLS-1$
-				ColorConstants.titleInactiveForeground);
-		// Grayed (disabled) text. This color is set to #000 if the current
-		// display driver does not support a solid gray color.
-		SYSTEM_DEFAULT_COLORS.put("highlight", //$NON-NLS-1$
-				ColorConstants.menuBackgroundSelected);
-		// Item(s) selected in a control.
-		SYSTEM_DEFAULT_COLORS.put("highlighttext", //$NON-NLS-1$
-				ColorConstants.menuForegroundSelected);
-		// Text of item(s) selected in a control.
-		SYSTEM_DEFAULT_COLORS.put("inactiveborder", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT));
-		// Inactive window border.
-		SYSTEM_DEFAULT_COLORS.put("inactivecaption", //$NON-NLS-1$
-				ColorConstants.titleInactiveBackground);
-		// Inactive window caption.
-		SYSTEM_DEFAULT_COLORS.put("inactivecaptiontext", //$NON-NLS-1$
-				ColorConstants.titleInactiveForeground);
-		// Color of text in an inactive caption.
-		SYSTEM_DEFAULT_COLORS.put("infobackground", //$NON-NLS-1$
-				ColorConstants.tooltipBackground);
-		// Background color for tooltip controls.
-		SYSTEM_DEFAULT_COLORS.put("infotext", ColorConstants.tooltipForeground); //$NON-NLS-1$
-		// Text color for tooltip controls.
-		SYSTEM_DEFAULT_COLORS.put("menu", ColorConstants.menuBackground); //$NON-NLS-1$
-		// Menu background.
-		SYSTEM_DEFAULT_COLORS.put("menutext", ColorConstants.menuForeground); //$NON-NLS-1$
-		// Text in menus.
-		SYSTEM_DEFAULT_COLORS.put("scrollbar", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		// Scroll bar gray area.
-		SYSTEM_DEFAULT_COLORS.put("threeddarkshadow", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
-		// Dark shadow for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedface", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		// Face color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedhighlight", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
-		// Highlight color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedlightshadow", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
-		// Light color for three-dimensional display elements (for edges facing
-		// the light source).
-		SYSTEM_DEFAULT_COLORS.put("threedshadow", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
-		// Dark shadow for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("window", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-		// Window background.
-		SYSTEM_DEFAULT_COLORS.put("windowframe", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_WIDGET_BORDER));
-		// Window frame.
-		SYSTEM_DEFAULT_COLORS.put("windowtext", Display.getCurrent() //$NON-NLS-1$
-				.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
-		// Window text
-		SYSTEM_DEFAULT_COLORS.put("hyperlink", ColorConstants.blue); //$NON-NLS-1$
-	}
-
-    // populate the extended color palette.  Where the extended 
-    // color is the same as a constant color, use that to save
-    // on SWT resource handles
-	static {
-		EXTENDED_COLORS.put("aliceblue", new Color(null, 240, 248, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("antiquewhite", new Color(null, 250, 235, 215)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("aqua", ColorConstants.cyan); //$NON-NLS-1$
-		EXTENDED_COLORS.put("aquamarine", new Color(null, 127, 255, 212)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("azure", new Color(null, 240, 255, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("beige", new Color(null, 245, 245, 220)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("bisque", new Color(null, 255, 228, 196)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("black", ColorConstants.black); //$NON-NLS-1$
-		EXTENDED_COLORS.put("blanchedalmond", new Color(null, 255, 235, 205)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("blue", ColorConstants.blue); //$NON-NLS-1$
-		EXTENDED_COLORS.put("blueviolet", new Color(null, 138, 43, 226)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("brown", new Color(null, 165, 42, 42)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("burlywood", new Color(null, 222, 184, 135)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("cadetblue", new Color(null, 95, 158, 160)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("chartreuse", new Color(null, 127, 255, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("chocolate", new Color(null, 210, 105, 30)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("coral", new Color(null, 255, 127, 80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("cornflowerblue", new Color(null, 100, 149, 237)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("cornsilk", new Color(null, 255, 248, 220)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("crimson", new Color(null, 220, 20, 60)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("cyan", new Color(null, 0, 255, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkblue", new Color(null, 0, 0, 139)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkcyan", new Color(null, 0, 139, 139)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkgoldenrod", new Color(null, 184, 134, 11)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkgray", new Color(null, 169, 169, 169)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkgreen", new Color(null, 0, 100, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkkhaki", new Color(null, 189, 183, 107)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkmagenta", new Color(null, 139, 0, 139)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkolivegreen", new Color(null, 85, 107, 47)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkorange", new Color(null, 255, 140, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkorchid", new Color(null, 153, 50, 204)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkred", new Color(null, 139, 0, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darksalmon", new Color(null, 233, 150, 122)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkseagreen", new Color(null, 143, 188, 143)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkslateblue", new Color(null, 72, 61, 139)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkslategray", new Color(null, 47, 79, 79)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkturquoise", new Color(null, 0, 206, 209)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("darkviolet", new Color(null, 148, 0, 211)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("deeppink", new Color(null, 255, 20, 147)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("deepskyblue", new Color(null, 0, 191, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("dimgray", new Color(null, 105, 105, 105)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("dodgerblue", new Color(null, 30, 144, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("feldspar", new Color(null, 209, 146, 117)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("firebrick", new Color(null, 178, 34, 34)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("floralwhite", new Color(null, 255, 250, 240)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("forestgreen", new Color(null, 34, 139, 34)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("fuchsia", new Color(null, 255, 0, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("gainsboro", new Color(null, 220, 220, 220)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("ghostwhite", new Color(null, 248, 248, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("gold", new Color(null, 255, 215, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("goldenrod", new Color(null, 218, 165, 32)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("gray", ColorConstants.gray); //$NON-NLS-1$
-		EXTENDED_COLORS.put("green", new Color(null, 0, 128, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("greenyellow", new Color(null, 173, 255, 47)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("honeydew", new Color(null, 240, 255, 240)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("hotpink", new Color(null, 255, 105, 180)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("indianred", new Color(null, 205, 92, 92)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("indigo", new Color(null, 75, 0, 130)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("ivory", new Color(null, 255, 255, 240)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("khaki", new Color(null, 240, 230, 140)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lavender", new Color(null, 230, 230, 250)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lavenderblush", new Color(null, 255, 240, 245)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lawngreen", new Color(null, 124, 252, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lemonchiffon", new Color(null, 255, 250, 205)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightblue", new Color(null, 173, 216, 230)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightcoral", new Color(null, 240, 128, 128)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightcyan", new Color(null, 224, 255, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightgoldenrodyellow", new Color(null, 250, 250, //$NON-NLS-1$
-				210));
-		EXTENDED_COLORS.put("lightgrey", new Color(null, 211, 211, 211)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightgreen", new Color(null, 144, 238, 144)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightpink", new Color(null, 255, 182, 193)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightsalmon", new Color(null, 255, 160, 122)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightseagreen", new Color(null, 32, 178, 170)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightskyblue", new Color(null, 135, 206, 250)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightslateblue", new Color(null, 132, 112, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightslategray", new Color(null, 119, 136, 153)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightsteelblue", new Color(null, 176, 196, 222)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lightyellow", new Color(null, 255, 255, 224)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("lime", ColorConstants.green); //$NON-NLS-1$
-		EXTENDED_COLORS.put("limegreen", new Color(null, 50, 205, 50)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("linen", new Color(null, 250, 240, 230)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("magenta", new Color(null, 255, 0, 255)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("maroon", new Color(null, 128, 0, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumaquamarine", new Color(null, 102, 205, 170)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumblue", new Color(null, 0, 0, 205)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumorchid", new Color(null, 186, 85, 211)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumpurple", new Color(null, 147, 112, 216)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumseagreen", new Color(null, 60, 179, 113)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumslateblue", new Color(null, 123, 104, 238)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumspringgreen", new Color(null, 0, 250, 154)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumturquoise", new Color(null, 72, 209, 204)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mediumvioletred", new Color(null, 199, 21, 133)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("midnightblue", new Color(null, 25, 25, 112)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mintcream", new Color(null, 245, 255, 250)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("mistyrose", new Color(null, 255, 228, 225)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("moccasin", new Color(null, 255, 228, 181)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("navajowhite", new Color(null, 255, 222, 173)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("navy", new Color(null, 0, 0, 128)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("oldlace", new Color(null, 253, 245, 230)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("olive", new Color(null, 128, 128, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("olivedrab", new Color(null, 107, 142, 35)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("orange", new Color(null, 255, 165, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("orangeted", new Color(null, 255, 69, 0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("orchid", new Color(null, 218, 112, 214)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("ralegoldenrod", new Color(null, 238, 232, 170)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("palegreen", new Color(null, 152, 251, 152)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("paleturquoise", new Color(null, 175, 238, 238)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("palevioletred", new Color(null, 216, 112, 147)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("papayawhip", new Color(null, 255, 239, 213)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("peachpuff", new Color(null, 255, 218, 185)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("peru", new Color(null, 205, 133, 63)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("pink", new Color(null, 255, 192, 203)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("plum", new Color(null, 221, 160, 221)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("powderblue", new Color(null, 176, 224, 230)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("purple", new Color(null, 128, 0, 128)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("red", ColorConstants.red); //$NON-NLS-1$
-		EXTENDED_COLORS.put("rosybrown", new Color(null, 188, 143, 143)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("royalblue", new Color(null, 65, 105, 225)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("saddlebrown", new Color(null, 139, 69, 19)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("salmon", new Color(null, 250, 128, 114)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("sandybrown", new Color(null, 244, 164, 96)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("seagreen", new Color(null, 46, 139, 87)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("seashell", new Color(null, 255, 245, 238)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("sienna", new Color(null, 160, 82, 45)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("silver", new Color(null, 192, 192, 192)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("skyblue", new Color(null, 135, 206, 235)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("slateblue", new Color(null, 106, 90, 205)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("slategray", new Color(null, 112, 128, 144)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("snow", new Color(null, 255, 250, 250)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("springgreen", new Color(null, 0, 255, 127)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("steelblue", new Color(null, 70, 130, 180)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("tan", new Color(null, 210, 180, 140)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("teal", new Color(null, 0, 128, 128)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("thistle", new Color(null, 216, 191, 216)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("tomato", new Color(null, 255, 99, 71)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("turquoise", new Color(null, 64, 224, 208)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("violet", new Color(null, 238, 130, 238)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("violetred", new Color(null, 208, 32, 144)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("wheat", new Color(null, 245, 222, 179)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("white", ColorConstants.white); //$NON-NLS-1$
-		EXTENDED_COLORS.put("whitesmoke", new Color(null, 245, 245, 245)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("yellow", ColorConstants.yellow); //$NON-NLS-1$
-		EXTENDED_COLORS.put("yellowgreen", new Color(null, 154, 205, 50)); //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java
deleted file mode 100644
index 66dce7b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.color;
-
-/**
- * @author mengbo
- */
-public class CSSColorManager {
-	private static CSSColorManager _instance;
-
-	private CSSColorManager() {
-        // no external instantiation
-	}
-
-	/**
-	 * @return the single instance
-	 */
-	public static CSSColorManager getInstance() {
-		if (_instance == null) {
-			_instance = new CSSColorManager();
-		}
-		return _instance;
-	}
-
-	/**
-	 * return Color or RGB. If return color, then the returned color is system
-	 * color, caller should NOT dispose the returned color
-	 * 
-	 * @param cssText
-	 * @return the color object for cssText
-	 */
-	public Object getColor(String cssText) {
-		return CSSColorConverter.getInstantce().getCSSColor(cssText);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java
deleted file mode 100644
index 646da86..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * @author mengbo
- */
-public class CSSFont implements ICSSFont {
-	private String _family;
-
-	private int _size;
-
-	private int _style;
-
-	private int _weight;
-
-	private String _cssString;
-
-	/**
-	 * @param family 
-	 * @param size 
-	 * @param style 
-	 * @param weight 
-	 * @param cssString 
-	 * 
-	 */
-	public CSSFont(String family, int size, int style, int weight,
-			String cssString) {
-		this._family = family;
-		this._size = size;
-		this._style = style;
-		this._weight = weight;
-		_cssString = cssString;
-	}
-
-	public String getFontFamily() {
-		return _family;
-	}
-
-	public int getFontSize() {
-		return _size;
-	}
-
-	public int getFontStyle() {
-		return _style;
-	}
-
-	public String getCSSString() {
-		return _cssString;
-	}
-
-	public int getWeight() {
-		return _weight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof CSSFont) {
-			CSSFont fd = (CSSFont) obj;
-			return this._family.equals(fd._family) && this._size == fd._size
-					&& this._style == fd._style && this._weight == fd._weight;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return _family.hashCode() + _size + _style + _weight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFont#getSwtFont()
-	 */
-	public Font getSwtFont() {
-		// return FontPoolManager.getInstance().getFont(this);
-		return CSSFontManager.getInstance().getSwtFont(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFont#getXHeight()
-	 */
-	public int getXHeight() {
-		return getFontSize();
-	}
-
-	/**
-	 * @return the style mask for the font style
-	 */
-	public int getSwtFontStyle() {
-		int style = SWT.NONE;
-		// see:http://www.htmlhelp.com/reference/css/font/font-weight.html
-		if (getWeight() >= 600)
-			style |= SWT.BOLD;
-		style |= getFontStyle();
-		return style;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
deleted file mode 100644
index 0297f92..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.FontFamilyMeta;
-import org.eclipse.jst.pagedesigner.css2.property.FontSizeMeta;
-import org.eclipse.jst.pagedesigner.css2.property.FontWeightMeta;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.CacheManager;
-import org.eclipse.jst.pagedesigner.utils.ICacheEntryCreator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSFontManager implements ICSSFontManager {
-	private static CSSFontManager _instance;
-
-	private static final boolean DEBUG = false;
-
-	private int _totalFont = 0;
-
-	// private static FontPoolManager _fontPoolManager;
-	// Map _cache = new HashMap();
-
-	private static final int CACHESIZE = 100; // we cache 100 font.
-
-	// the scale to convert the px to pt.
-	private final static double FONT_SCALE = ((double) Display.getCurrent()
-			.getDPI().x) / 72;
-
-	static String cssFontToLocalFont(String original) {
-		if ("serif".equalsIgnoreCase(original)) { //$NON-NLS-1$
-			return "Georgia"; //$NON-NLS-1$
-		} else if ("sans-serif".equalsIgnoreCase(original)) { //$NON-NLS-1$
-			return "Arial"; //$NON-NLS-1$
-		} else if ("cursive".equalsIgnoreCase(original)) { //$NON-NLS-1$
-			// FIXME: MS windows does not support the alternative fonts that
-			// match cursive defined at
-			// http://www.w3.org/TR/REC-CSS2/fonts.html#generic-font-families,
-			// We use Comic Sans MS font family
-			// because it is MS alternative.
-			return "Comic Sans MS"; //$NON-NLS-1$
-		} else if ("fantasy".equalsIgnoreCase(original)) { //$NON-NLS-1$
-			return cssFontToLocalFont("serif"); //$NON-NLS-1$
-		} else if ("monospace".equalsIgnoreCase(original)) { //$NON-NLS-1$
-			return "Courier New"; //$NON-NLS-1$
-		} else {
-			return original;
-		}
-	}
-
-	private CacheManager _cacheManager = new CacheManager(
-			new ICacheEntryCreator<CSSFont, Font>() {
-				public Font createEntry(CSSFont key) {
-					if (DEBUG) {
-						_totalFont++;
-						System.out.println("TotalFont++: " + _totalFont); //$NON-NLS-1$
-					}
-					Font font = new Font(null, cssFontToLocalFont(key
-							.getFontFamily()), (int) Math.round(key
-							.getFontSize()
-							/ FONT_SCALE), key.getSwtFontStyle());
-					return font;
-				}
-
-				public void dispose(CSSFont key, Font entry) {
-					if (DEBUG) {
-						_totalFont--;
-						System.out.println("TotalFont--: " + _totalFont); //$NON-NLS-1$
-					}
-					entry.dispose();
-
-				}
-			}, CACHESIZE);
-
-	/**
-	 * constructor
-	 */
-	private CSSFontManager() {
-		super();
-	}
-
-	private String resolveFontStyleString(ICSSStyle style) {
-		StringBuffer sb = new StringBuffer();
-		sb.append(ICSSPropertyID.ATTR_FONT_FAMILY).append(":"); //$NON-NLS-1$
-		sb.append("'").append( //$NON-NLS-1$
-				(String) style
-						.getStyleProperty(ICSSPropertyID.ATTR_FONT_FAMILY))
-				.append("'"); //$NON-NLS-1$
-		sb.append(";"); //$NON-NLS-1$
-		sb.append(ICSSPropertyID.ATTR_FONT_STYLE).append(":"); //$NON-NLS-1$
-		sb
-				.append(
-						(String) style
-								.getStyleProperty(ICSSPropertyID.ATTR_FONT_STYLE))
-				.append(";"); //$NON-NLS-1$
-		sb.append(ICSSPropertyID.ATTR_FONT_WEIGHT).append(":"); //$NON-NLS-1$
-		sb.append(
-				((Integer) style
-						.getStyleProperty(ICSSPropertyID.ATTR_FONT_WEIGHT))
-						.toString()).append(";"); //$NON-NLS-1$
-		sb.append(ICSSPropertyID.ATTR_FONT_SIZE).append(":"); //$NON-NLS-1$
-		int fontSize = getFontSize(style, style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_SIZE));
-		sb.append(Integer.toString(fontSize));
-		return sb.toString();
-	}
-
-	public ICSSFont createFont(ICSSStyle style) {
-		String fontfamily = (String) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_FAMILY);
-		Object fontsizeobj = style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_SIZE);
-		int fontsize;
-		fontsize = getFontSize(style, fontsizeobj);
-		int fontstyle = getFontStyle(style);
-		int fontweight = ((Integer) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_WEIGHT)).intValue();
-
-		return new CSSFont(fontfamily, fontsize, fontstyle, fontweight,
-				resolveFontStyleString(style));
-	}
-
-	private int getFontSize(ICSSStyle style, Object fontsizeobj) {
-		int fontsize;
-		if (fontsizeobj instanceof Length) {
-			fontsize = ((Length) fontsizeobj).getValue();
-		} else {
-			fontsize = style.getParentStyle().getCSSFont().getFontSize();
-		}
-		return fontsize;
-	}
-
-	/**
-	 * @param style
-	 */
-	private int getFontStyle(ICSSStyle style) {
-		int fontstyle;
-		String fontstylestr = (String) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_STYLE);
-		if (ICSSPropertyID.VAL_ITALIC.equals(fontstylestr)
-				|| ICSSPropertyID.VAL_OBLIQUE.equals(fontstylestr)) {
-			fontstyle = SWT.ITALIC;
-		} else {
-			fontstyle = SWT.NORMAL;
-		}
-		return fontstyle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFontManager#dispose()
-	 */
-	public void dispose() {
-		_cacheManager.disposeAll();
-	}
-
-	/**
-	 * @return the default css font
-	 */
-	public ICSSFont createDefaultFont() {
-		CSSFont result = new CSSFont(FontFamilyMeta.DEFAULT_FONT,
-				(int) FontSizeMeta.MEDIUM_VAL_INT, SWT.NORMAL,
-				FontWeightMeta.NORMAL_WEIGHT.intValue(), ""); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * @param f
-	 * @return the swt font for f
-	 */
-	public Font getSwtFont(CSSFont f) {
-		return (Font) _cacheManager.getEntry(f);
-	}
-
-	/**
-	 * @return the singleton font manager
-	 */
-	public static CSSFontManager getInstance() {
-		if (_instance == null) {
-			_instance = new CSSFontManager();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java
deleted file mode 100644
index 74adcfb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.swt.graphics.Font;
-
-/**
- * XXX: this class should be renamed to CSSFontDescriptor. Since now it is only
- * used to describe a CSSFont.
- * 
- * @author mengbo
- */
-public interface ICSSFont {
-	/**
-	 * Will get a Font system resource from a pool.
-	 * 
-	 * The caller should NOT dispose the returned Font object.
-	 * 
-	 * The caller should not hold reference on the returned Font object, since
-	 * system may dispose it at any time.
-	 * 
-	 * @return the swt font
-	 */
-	public Font getSwtFont();
-
-	/**
-	 * @return the css font family
-	 */
-	public String getFontFamily();
-
-	/**
-	 * @return font size in pixel 
-	 */
-	public int getFontSize();
-
-	/**
-	 * @return font x height in pixel
-	 */
-	public int getXHeight();
-
-	/**
-	 * @return the font weight
-	 */
-	public int getWeight();
-
-	/**
-	 * 
-	 * @return could be SWT.NONE or SWT.ITALIC
-	 */
-	public int getFontStyle();
-
-	/**
-	 * @return the css string
-	 */
-	public String getCSSString();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java
deleted file mode 100644
index a5a8d3d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- */
-public interface ICSSFontManager {
-	/**
-	 * @param style
-	 * @return ??
-	 */
-	public ICSSFont createFont(ICSSStyle style);
-
-	/**
-	 * FIXME: purpose?
-	 */
-	public void dispose();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css
deleted file mode 100644
index e91e5de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Basic HTML style information.
- */
-html,
-address,
-blockquote,listing,
-body, dd, div,
-dl, dt, fieldset, legend,form,
-frame, frameset,
-h1, h2, h3, h4,
-h5, h6, noframes,noscript,
-ol, p, ul, center,
-dir, hr, menu, pre, plaintext, xmp  { display: block }
-
-ol				{counter-reset: _anonymous; list-style-type: decimal}
-ul,dir,menu  	{counter-reset: _anonymous; list-style-type: disc}
-li           	{display: list-item}
-li				{counter-increment: _anonymous}
-
-head            { display: none }
-table           { display: table }
-tr              { display: table-row }
-thead           { display: table-header-group }
-tbody           { display: table-row-group }
-tfoot           { display: table-footer-group }
-col             { display: table-column }
-colgroup        { display: table-column-group }
-td, th          { display: table-cell; }
-caption         { display: table-caption }
-th              { font-weight: bolder;}
-caption         { text-align: center;horizontal-align:top }
-button, textarea,
-input, object, 
-select, img { display:inline-block; }
-pre,plaintext, xmp   { white-space: pre }
-h1, h2, h3, h4,
-h5, h6, b,
-strong          { font-weight: bold }
-i, cite, em,dfn,
-var, address    { font-style: italic }
-pre, tt, code,plaintext, xmp,
-kbd, samp       { font-family: monospace }
-ol              { list-style-type: decimal }
-br:before       { content: "\A" }
-center          { text-align: center }
-sub             { vertical-align: sub }
-sup             { vertical-align: super }
-u, ins          { text-decoration: underline }
-input			{ text-decoration: none }
-button			{ white-space: nowrap }
-a[href]			{ text-decoration: underline }
-
-/*
- * styles that may be different for different user agent.
- * This part may need to move out and put into different css files.
- */
-body            { line-height: 1.12em }
-h1              { font-size: 2em; margin: .67em 0 }
-h2              { font-size: 1.5em; margin: .75em 0 }
-h3              { font-size: 1.17em; margin: .83em 0 }
-h4, p,ul,
-fieldset, form,
-ol, dl, dir,
-menu            { margin: 1.12em 0 }
-blockquote      { margin: 1em 40px }
-h5              { font-size: .83em; margin: 1.5em 0 }
-h6              { font-size: .75em; margin: 1.67em 0 }
-blockquote      { margin-left: 40px; margin-right: 40px }
-big             { font-size: larger }
-small, sub, sup { font-size: smaller }
-s, strike, del  { text-decoration: line-through }
-hr              { border: 1px inset }
-ol, ul, dir,
-menu, dd        { margin-left: 40px;border:0px }
-ol ul, ul ol,
-ul ul, ol ol    { margin-top: 0; margin-bottom: 0 }
-abbr, acronym   { font-variant: small-caps; letter-spacing: 0.1em }
-a[href]         { color:blue;}
-select			{background-color: window;font-family:sans-serif;font-size:13px;font-weight: normal;}
-textarea		{border: 2px inset;font-size:13px;font-family:monospace}
-textarea,
-input 			{background-color: window}
-input,
-input[type=text],
-input[type=password] {border: 2px inset;font-size:13px;font-family:sans-serif;font-weight: normal;}
-/* following upcased TYPE is for workaround the WTP M2 bug of not setting default content type */
-input[TYPE=submit],input[TYPE=reset],input[TYPE=button],input[TYPE=cancel],
-button,
-input[type=button],
-input[type=reset],
-input[type=cancel],
-input[type=submit] {background-color: ButtonFace; border: 2px outset; font-size:13px;
-					font-family:sans-serif;text-align: center;font-weight: normal;}
-input[type=image],
-input[type=checkbox],
-input[type=radio]  {border: none }
-input[type=hidden]  {border: none }
-img				{border: 0px none}
-listing         {font-family:monospace;font-size: medium;white-space: pre; margin: 1em 0;}
-tbody,thead,tfoot     {vertical-align: middle;}
-blink 			{text-decoration: blink;}
-
-hr 		{margin: 0.5em auto 0.5em auto;}
-caption  {border: 0px none;margin: 0px; padding:0px 0px 4px 0px;}
-td, th,
-table    {border: 4px none;}
-button   {padding: 3px 5px;text-align: center;vertical-align: middle;}
-button,textarea,input   {vertical-align: text-bottom;color:black;font-style:none;}
-select {vertical-align: text-bottom;}
-input[type=image]  {vertical-align: baseline;}
-li   {min-height:1.2em}
-button {min-height:1.8em}
-div,tr,form {min-height:1.2em}
-table,td {min-width:1.2em;min-height:1.2em}
-
-/* nested lists have no top/bottom margins */
-ul ul,   ul ol,   ul dir,   ul menu,   ul dl,
-ol ul,   ol ol,   ol dir,   ol menu,   ol dl,
-dir ul,  dir ol,  dir dir,  dir menu,  dir dl,
-menu ul, menu ol, menu dir, menu menu, menu dl,
-dl ul,   dl ol,   dl dir,   dl menu,   dl dl 	{margin-top: 0; margin-bottom: 0;}
-
-/* 2 deep unordered lists use a circle */
-ol ul,   ul ul,   menu ul,   dir ul,
-ol menu, ul menu, menu menu, dir menu,
-ol dir,  ul dir,  menu dir,  dir dir 	{list-style-type: circle;}
-
-/* 3 deep (or more) unordered lists use a square */
-ol ol ul,     ol ul ul,     ol menu ul,     ol dir ul,
-ol ol menu,   ol ul menu,   ol menu menu,   ol dir menu,
-ol ol dir,    ol ul dir,    ol menu dir,    ol dir dir,
-ul ol ul,     ul ul ul,     ul menu ul,     ul dir ul,
-ul ol menu,   ul ul menu,   ul menu menu,   ul dir menu,
-ul ol dir,    ul ul dir,    ul menu dir,    ul dir dir,
-menu ol ul,   menu ul ul,   menu menu ul,   menu dir ul,
-menu ol menu, menu ul menu, menu menu menu, menu dir menu,
-menu ol dir,  menu ul dir,  menu menu dir,  menu dir dir,
-dir ol ul,    dir ul ul,    dir menu ul,    dir dir ul,
-dir ol menu,  dir ul menu,  dir menu menu,  dir dir menu,
-dir ol dir,   dir ul dir,   dir menu dir,   dir dir dir { list-style-type: square;}
-
-/**
- * We do not write codes to support some elements. This part defines properties for them 
- * to improve the look of these elements.
- */
-applet {border: 1px solid;}
-fieldset {border: 2px groove;}
-applet,iframe {display:inline-block; border:3px inset; }
-object {display:inline-block;border:0px none;}
-
-
-/* 
- * Sets right margin to have gap between widgets.
- */
-input,textarea,button	 { margin-right: 2px;}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java
deleted file mode 100644
index d20bc7a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * A CompositeBox suitable for containing multiple LineBox fragments. Based on
- * BlockBox of draw2d.
- * 
- * @author mengbo
- */
-public class BlockBox extends CompositeBox {
-	// internalContent dimension is for the closure of the FlowBox(es) added
-	// into the BlockBox.
-	private int _internalContentWidth = -1;
-
-	private int _internalContentHeight = -1;
-
-	Rectangle toRectangle() {
-		return new Rectangle(_x, _y, Math.max(_width, _recommendedWidth),
-				_height);
-	}
-
-	/**
-	 * Sets the height.
-	 * 
-	 * @param h
-	 *            The height
-	 */
-	public void setHeight(int h) {
-		_height = h;
-	}
-
-	/**
-	 * Unions the dimensions of this with the dimensions of the passed FlowBox.
-	 * For BlockBox, each time unionInfo is called, the passed in object
-	 * represents a line.
-	 * 
-	 * @param box
-	 *            The FlowBox to union this with
-	 */
-	protected void unionInfo(FlowBox box) {
-		_width = Math.max(_width, box._width + this.getBorderPaddingWidth());
-		_height = Math.max(_height, box._y + box._height
-				+ this.getBorderPaddingHeight());
-
-		_internalContentWidth = Math.max(_internalContentWidth, box._width);
-		_internalContentHeight = Math.max(_internalContentHeight, box._y
-				+ box._height);
-	}
-
-	int getInternalContentWidth() {
-		return _internalContentWidth;
-	}
-
-	int getInternalContentHeight() {
-		return _internalContentHeight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowBox#getAscent()
-	 */
-	public int getAscent() {
-		// XXX: some hard coded things here. If the blockbox is only for a
-		// single widget, and if that widget support ascent, then we'll
-		// delegate to that widget for ascent support.
-		// if (_fragments.size()==1)
-		// {
-		// FlowBox box = (FlowBox) _fragments.get(0);
-		// if (box instanceof LineBox)
-		// {
-		// List linecomponents = ((LineBox) box).getFragments();
-		// if (linecomponents != null && linecomponents.size() == 1)
-		// {
-		// FlowBox box2 = (FlowBox) linecomponents.get(0);
-		// if (box2 instanceof WidgetBox)
-		// {
-		// WidgetBox widgetBox = (WidgetBox) box2;
-		// if (widgetBox.supportAscent())
-		// {
-		// return widgetBox.getAscent() + this.getBorderPaddingInsets().top;
-		// }
-		// }
-		// }
-		// }
-		// }
-		return super.getAscent();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlow.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlow.java
deleted file mode 100644
index 675fdeb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlow.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.PositionConstants;
-
-/**
- * A <code>FlowFigure</code> represented by a single {@link BlockBox}fragment
- * containing one or more lines. A BlockFlow is a creator of LineBoxes, which
- * its children require during layout. A BlockFlow can be thought of as a
- * paragraph.
- * <P>
- * BlockFlows should be nested inside other BlockFlows, but it is also valid to
- * place them in InlineFlows. {@link FlowPage}can be used as a "root" block and
- * can be added to normal draw2d Figures.
- * <P>
- * Only {@link FlowFigure}s can be added to a BlockFlow.
- */
-/*package*/ class BlockFlow extends FlowFigure {
-
-	final BlockBox _blockBox;
-
-	private int _aligment;
-
-	/**
-	 * Constructs a new BlockFlow.
-	 */
-	public BlockFlow() {
-		setLayoutManager(createDefaultFlowLayout());
-		_blockBox = createBlockBox();
-	}
-
-	BlockBox createBlockBox() {
-		return new BlockBox();
-	}
-
-	/**
-	 * @return the default flow layout
-	 * 
-	 */
-	protected FlowFigureLayout createDefaultFlowLayout() {
-		return new BlockFlowLayout(this);
-	}
-
-	/**
-	 * Returns the BlockBox associated with this.
-	 * 
-	 * @return This BlockFlow's BlockBox
-	 */
-	protected BlockBox getBlockBox() {
-		return _blockBox;
-	}
-
-	/**
-	 * Returns the horizontal aligment.
-	 * 
-	 * @return the hotizontal aligment
-	 */
-	public int getHorizontalAligment() {
-		return _aligment & PositionConstants.LEFT_CENTER_RIGHT;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		setBounds(getBlockBox().toRectangle().expand(getInsets()));
-		List v = getChildren();
-		for (int i = 0, n = v.size(); i < n; i++) {
-			((FlowFigure) v.get(i)).postValidate();
-		}
-	}
-
-	/**
-	 * Sets the horitontal aligment of the block. Valid values are:
-	 * <UL>
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#LEFT}
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#RIGHT}
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#CENTER}
-	 * 
-	 * @param value
-	 *            the aligment
-	 */
-	public void setHorizontalAligment(int value) {
-		if (!(value == PositionConstants.LEFT
-				|| value == PositionConstants.RIGHT || value == PositionConstants.CENTER)) {
-			throw new IllegalArgumentException(
-					"Horizontal Aligment must be one of: LEFT, CENTER, RIGHT"); //$NON-NLS-1$
-		}
-		this._aligment &= ~PositionConstants.LEFT_CENTER_RIGHT;
-		this._aligment |= value;
-		revalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java
deleted file mode 100644
index 44c43c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-
-/**
- * When doing absolute positioning, we need to create a block. But that block
- * don't have a corresponding figure. So we need a block without corresponding
- * figure.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class BlockFlowContext implements FlowContext {
-	private LineBox _currentLine;
-
-	private LineBox _previousLine = null;
-
-	BlockBox _blockBox;
-
-	private final FlowContext _originalContext;
-
-	private final ICSSStyle _style;
-
-	/**
-	 * @param originalContext 
-	 * @param style 
-	 */
-	public BlockFlowContext(FlowContext originalContext, ICSSStyle style) {
-		this._originalContext = originalContext;
-		this._style = style;
-		setup();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-
-		return _originalContext.getContainerWidth();
-	}
-
-	/**
-	 * Initialize the object
-	 */
-	private void setup() {
-		_blockBox = new BlockBox();
-		_blockBox.setRecommendedWidth(getRecommendedWidth());
-		_currentLine = this.getCurrentLine();
-		_previousLine = null;
-	}
-
-	private int getRecommendedWidth() {
-		int containerWidth = getContainerWidth();
-		Object leftObj = _style.getStyleProperty(ICSSPropertyID.ATTR_LEFT);
-		if (leftObj != null && leftObj instanceof Length) {
-			Length left = (Length) leftObj;
-			int intLeft = left.getValue();
-			if (left.isPercentage()) {
-				intLeft = containerWidth * intLeft / 100;
-			}
-			if (intLeft < containerWidth) {
-				return containerWidth - intLeft;
-			}
-		}
-		return containerWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#addToCurrentLine(org.eclipse.jst.pagedesigner.css2.layout.FlowBox)
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#endLine()
-	 */
-	public void endLine() {
-		// this is called from child layouts.
-		// If there is no current line, state is equivalent to new line
-		if (_currentLine == null)
-			return;
-		if (_currentLine.isOccupied())
-			layoutLine(); // finalize the current line layout
-		else
-			return;
-
-		LineBox box = _currentLine;
-		// _currentLine = _previousLine; //XXX: ???? why (yang)
-		_previousLine = box;
-
-		_currentLine = null;
-		// setupLine(getCurrentLine());
-
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine()
-	 */
-	public LineBox getCurrentLine() {
-		if (_currentLine == null)
-			createNewLine();
-		return _currentLine;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine(int)
-	 */
-	public LineBox getCurrentLine(int topMargin) {
-		if (_currentLine == null)
-			createNewLine(topMargin);
-		return _currentLine;
-	}
-
-	/**
-	 * @param topMargin
-	 */
-	private void createNewLine(int topMargin) {
-		createNewLine();
-	}
-
-	private void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, Integer.MIN_VALUE);
-	}
-
-	/**
-	 * Override to setup the line's x, remaining, and available width.
-	 * 
-	 * @param line
-	 *            the LineBox to set up
-	 * @param topMargin 
-	 */
-	protected void setupLine(LineBox line, int topMargin) {
-		line.clear();
-
-		// the caller of getCurrentLine() may add leftMargin and leftPadding and
-		// leftBorder to line.x
-		line._x = _blockBox.getBorderInsets().left + _blockBox.getPaddingInsets().left;
-
-		// FIXME: here should check the floating boxes, and minus the width of
-		// them from
-		// current line.
-		// XXX: the RecommendedContentWidth is related with the RecommendedWidth
-		// of container that
-		// usually larger than it needed.here we do not set the RecommendedWidth
-		// for the sake of
-		// layouting right absolute position.
-		// /shortcoming:the box will break into multi-line after every white
-		// space.
-		// line.setRecommendedWidth(_blockBox.getRecommendedContentWidth());
-		if (_previousLine == null) {
-			line._y = _blockBox.getBorderInsets().top
-					+ _blockBox.getPaddingInsets().top;
-			if (topMargin != Integer.MIN_VALUE)
-				line._y += topMargin;
-		} else {
-			if (topMargin == Integer.MIN_VALUE)
-				line._y = _previousLine._y + _previousLine.getHeight()
-						+ getLinePadding() + _previousLine.getMarginInsets().bottom; // XXX:
-			// should
-			// add
-			// previous
-			// margin
-			// bottom?
-			else
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine.getMarginInsets().bottom);
-		}
-		// line.validate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y; // FIXME: margin of previous block?
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCurrentLineOccupied()
-	 */
-	public boolean isCurrentLineOccupied() {
-		return _currentLine != null && _currentLine.isOccupied();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getLastMarginRight()
-	 */
-	public int getLastMarginRight() {
-		if (_currentLine == null || !_currentLine.isOccupied()) {
-			return 0;
-		}
-		FlowBox box = (FlowBox) _currentLine.getFragments().get(
-				_currentLine.getFragments().size() - 1);
-		if (box != null) {
-			return box.getMarginInsets().right;
-		}
-        return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		return false;
-	}
-
-	/**
-	 * Adjust all fragments in the current line to have the same baseline. Do
-	 * any additional adjustments, such as horizontal alignment.
-	 */
-	protected void layoutLine() {
-		// currentLine.x = 0; //XXX: comment out, don't understand why set to 0,
-		// because it has already
-		// been set when setupLine(). And if do need, should
-		// set to getBorderPaddingInsets().left
-		// if (!isInlineBlock() && shouldExpand())
-		// {
-		// // FIXME: currently we are using getRecommendedContentWidth,
-		// // what happen if after adding the new line, the new width is bigger
-		// than
-		// // recommendedContentWidth? should we use getWidth() instead of
-		// // recommendedcontentWidth?
-		//
-		// Object textalign =
-		// (getCSSStyle().getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN));
-		// if (textalign == ICSSPropertyID.VAL_RIGHT)
-		// {
-		// _currentLine._x = _blockBox.getRecommendedContentWidth() +
-		// _blockBox.getBorderPaddingInsets().left - _currentLine.getWidth();
-		// }
-		// else if (textalign == ICSSPropertyID.VAL_CENTER)
-		// {
-		//
-		// _currentLine._x = _blockBox.getBorderPaddingInsets().left +
-		// (_blockBox.getRecommendedContentWidth() - _currentLine.getWidth()) /
-		// 2;
-		// }
-		// if (_currentLine._x < 0)
-		// _currentLine._x = 0;
-		// }
-
-		// FIXME: should check vertical alignment here?
-		_currentLine.commit();
-		_blockBox.add(_currentLine);
-	}
-
-	void endBlock() {
-		endLine();
-	}
-
-	int getLinePadding() {
-		return 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowLayout.java
deleted file mode 100644
index 05bf6c4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowLayout.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Insets;
-
-/**
- * The layout for {@link BlockFlow}figures.
- * <P>
- * WARNING: This class is not intended to be subclassed by clients.
- * 
- * @author mengbo
- * @since 2.1
- */
-public class BlockFlowLayout extends FlowContainerLayout {
-	private LineBox _previousLine = null;
-
-	BlockBox _blockBox;
-
-	/**
-	 * Creates a new BlockFlowLayout with the given BlockFlow.
-	 * 
-	 * @param blockFlow
-	 *            the BlockFlow
-	 */
-	public BlockFlowLayout(BlockFlow blockFlow) {
-		super(blockFlow);
-	}
-
-	/**
-	 * @see FlowContainerLayout#cleanup()
-	 */
-	protected void cleanup() {
-		_currentLine = _previousLine = null;
-	}
-
-	/**
-	 * @see FlowContainerLayout#createNewLine()
-	 */
-	protected void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, Integer.MIN_VALUE);
-	}
-
-	protected void createNewLine(int topmargin) {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, topmargin);
-	}
-
-	/**
-	 * Override to setup the line's x, remaining, and available width.
-	 * 
-	 * @param line
-	 *            the LineBox to set up
-	 * @param topMargin 
-	 */
-	protected void setupLine(LineBox line, int topMargin) {
-		line.clear();
-
-		// the caller of getCurrentLine() may add leftMargin and leftPadding and
-		// leftBorder to line.x
-		line._x = 0;
-
-		// FIXME: here should check the floating boxes, and minus the width of
-		// them from
-		// current line.
-		line.setRecommendedWidth(_blockBox.getRecommendedContentWidth());
-		if (_previousLine == null) {
-			line._y = 0;
-			if (topMargin != Integer.MIN_VALUE) {
-				line._y += topMargin;
-			}
-		} else {
-			if (topMargin == Integer.MIN_VALUE) {
-				line._y = _previousLine._y + _previousLine.getHeight()
-						+ getLinePadding() + _previousLine.getMarginInsets().bottom; // XXX:
-				// should
-				// add
-				// previous
-				// margin
-				// bottom?
-			} else {
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine.getMarginInsets().bottom);
-			}
-		}
-		// line.validate();
-	}
-
-	/**
-	 * Called by flush(), adds the BlockBox associated with this BlockFlowLayout
-	 * to the current line and then ends the line.
-	 */
-	protected void endBlock() {
-		getFlowContext().addToCurrentLine(_blockBox);
-
-		// FIXME: here should tell the context the bottom margin.
-		getFlowContext().endLine();
-	}
-
-	/**
-	 * @see FlowContext#endLine()
-	 */
-	public void endLine() {
-		// this is called from child layouts.
-		// If there is no current line, state is equivalent to new line
-		if (_currentLine == null) {
-			return;
-		}
-		if (_currentLine.isOccupied()) {
-			layoutLine(); // finalize the current line layout
-		} else {
-			_currentLine = null;
-			return;
-		}
-		LineBox box = _currentLine;
-		_previousLine = box;
-		_currentLine = null;// _previousLine; //XXX: ???? why (yang)
-
-		// setupLine(getCurrentLine());
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y; // FIXME: margin of previous block?
-	}
-
-	/**
-	 * Returns the BlockFlow associated with this BlockFlowLayout
-	 * 
-	 * @return the BlockFlow
-	 */
-	protected final BlockFlow getBlockFlow() {
-		return (BlockFlow) getFlowFigure();
-	}
-
-	/**
-	 * Adjust all fragments in the current line to have the same baseline. Do
-	 * any additional adjustments, such as horizontal alignment.
-	 */
-	protected void layoutLine() {
-		// currentLine.x = 0; //XXX: comment out, don't understand why set to 0,
-		// because it has already
-		// been set when setupLine(). And if do need, should
-		// set to getBorderPaddingInsets().left
-		switch (getBlockFlow().getHorizontalAligment()) {
-		case PositionConstants.RIGHT:
-			_currentLine._x = _blockBox.getContentWidth()
-					- getBorderPaddingInsets().right - _currentLine.getWidth();
-			break;
-		case PositionConstants.CENTER:
-			_currentLine._x = (_blockBox.getContentWidth()
-					+ getBorderPaddingInsets().left
-					- getBorderPaddingInsets().right - _currentLine.getWidth()) / 2;
-			break;
-		}
-		// FIXME: should check vertical alignment here?
-		_currentLine.commit();
-		_blockBox.add(_currentLine);
-	}
-
-	/**
-	 * @see FlowContainerLayout#flush()
-	 */
-	protected void flush() {
-		if (_currentLine != null)
-			layoutLine();
-		endBlock();
-	}
-
-	/**
-	 * @see FlowContainerLayout#preLayout()
-	 */
-	protected void preLayout() {
-		_blockBox = getBlockFlow().getBlockBox();
-		setupBlock();
-		// Probably could setup current and previous line here, or just previous
-	}
-
-	/**
-	 * sets up the single block that contains all of the lines.
-	 */
-	protected void setupBlock() {
-		// Ask for a new line, in case we are in the middle of a line
-
-		// FIXME: the endLine() should tell context the top margin of this
-		// block.
-		getFlowContext().endLine();
-
-		LineBox line = getFlowContext().getCurrentLine();
-		// int recommended = line.getAvailableWidth();
-		// if (recommended != previousRecommendedWidth)
-		// Remove all current Fragments
-		_blockBox.clear();
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-
-		// FIXME: here should check whether the CSS already set recommended
-		// width for this
-		// block.
-		_blockBox.setRecommendedWidth(line.getAvailableWidth());
-
-		_blockBox._y = getFlowContext().getCurrentY();
-
-		// FIXME: blockBox.x should be context.getBorderPaddingInsets().left
-		// or just line.x ?
-		_blockBox._x = 0;
-	}
-
-	Insets getBorderPaddingInsets() {
-		// FIXME:
-		return new Insets();
-	}
-
-	int getLinePadding() {
-		return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-		int width = Math.max(0, Math.max(_blockBox.getWidth(), _blockBox
-				.getRecommendedWidth()));
-		return width;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BoxUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BoxUtil.java
deleted file mode 100644
index b91e30e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BoxUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @author mengbo
- */
-public class BoxUtil {
-	/**
-	 * @param box
-	 * @param style
-	 */
-	public static void setupBorderPaddingMargin(FlowBox box, ICSSStyle style) {
-		box.setMarginInsets(new Insets(style.getMarginInsets()));
-		box.setBorderInsets(new Insets(style.getBorderInsets()));
-		box.setPaddingInsets(new Insets(style.getPaddingInsets()));
-
-		if (box.getBorderPaddingHeight() > box.getHeight()) {
-			box.setHeight(box.getBorderPaddingHeight());
-		}
-		if (box.getBorderPaddingWidth() > box.getWidth()) {
-			box.setWidth(box.getBorderPaddingWidth());
-		}
-	}
-
-	/**
-	 * Debug code.
-	 * 
-	 * @param g
-	 * @param box
-	 */
-	public static void drawBox(Graphics g, FlowBox box) {
-		Color color = null;
-		if (box instanceof BlockBox) {
-			// color = ColorConstants.red;
-		} else if (box instanceof LineBox) {
-			color = ColorConstants.blue;
-		} else if (box instanceof TextFragmentBox) {
-			color = ColorConstants.green;
-		} else {
-			color = ColorConstants.darkGreen;
-		}
-		if (color != null) {
-			g.setForegroundColor(color);
-			g.setLineStyle(Graphics.LINE_DASH);
-			g.setLineWidth(1);
-			g.drawRectangle(box._x, box._y, box.getWidth(), box.getHeight());
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBlockFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBlockFlowLayout.java
deleted file mode 100644
index e37deff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBlockFlowLayout.java
+++ /dev/null
@@ -1,745 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.css2.widget.BorderUtil;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * The block layout for {@link CSSFigure}figures. Basic code structure is from
- * BlockFlowLayout.
- * 
- * @author mengbo
- */
-public class CSSBlockFlowLayout extends CSSLayout implements ICSSPainter2 {
-	private LineBox _previousLine = null;
-
-	/**
-	 * the block box for the layout object
-	 */
-	protected BlockBox _blockBox = null;
-
-	/**
-	 * The font metrics for this layout object
-	 */
-	protected FontMetrics _fontMetrices;
-
-	int _userSpecifiedWidth;
-
-	int _userSpecifiedHeight;
-
-	/*
-	 * whether we need HScroll and VScroll when overflow is set to "scroll".
-	 * will be updated in "endBlock" and used in "paintFigurePostClientArea"
-	 */
-	boolean _needHScroll = false;
-
-	boolean _needVScroll = false;
-
-	/**
-     * Creates a new CSSBlockFlowLayout with the given BlockFlow.
-	 * @param cssfigure
-	 */
-	public CSSBlockFlowLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * @return true if this layout box has more than one line
-	 */
-	protected boolean hasMoreThanOneLine() {
-		return _previousLine != null;
-	}
-
-	/**
-	 * @return true if this layout block is inline
-	 */
-	public boolean isInlineBlock() {
-		String obj = getCSSStyle().getDisplay();
-		return ICSSPropertyID.VAL_INLINE_BLOCK.equals(obj)
-				|| ICSSPropertyID.VAL_INLINE_TABLE.equals(obj);
-	}
-
-	/**
-	 * @return true if should expand the width to all available width. 
-	 */
-	public boolean shouldExpand() {
-		ICSSStyle style = getCSSStyle();
-		if (style == null) {
-			return false;
-		}
-        return "block".equalsIgnoreCase(style.getDisplay()) //$NON-NLS-1$
-        		|| "list-item".equalsIgnoreCase(style.getDisplay()); //$NON-NLS-1$
-	}
-
-	// ---------------------------------------------------------------------------------------------------
-	// preLayout stage. Major job is get the top-left corner information of the
-	// new block.
-
-	/**
-	 * sets up the single block that contains all of the lines.
-	 */
-	protected void setupBlock() {
-		// int recommended = line.getAvailableWidth();
-		// if (recommended != previousRecommendedWidth)
-		// Remove all current Fragments
-		_blockBox.clear();
-		// Ask for a new line, in case we are in the middle of a line
-
-		if (!isInlineBlock()) {
-			LineBox lineBox = getFlowContext().getCurrentLine();
-			if (lineBox != null && !lineBox.isEmptyStringLine()) {
-				getFlowContext().endLine();
-			}
-		}
-
-		ICSSStyle style = getCSSStyle();
-
-		// endLine will result in context create a new line, so we are in the
-		// new line now.
-		// passing in the top margin, and context will consider that when create
-		// the new line.
-		int marginTop = style.getMarginInsets().top;
-		LineBox line = getFlowContext().getCurrentLine(marginTop);
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-
-		// FIXME: according to spec, when using percentage width/height, should
-		// percentage to
-		// the "containing block". But we don't have very good "containing
-		// block" resolution
-		// implementation yet.
-
-		// calculate the min size
-		// int minWidth = 0;
-		// int minHeight = 0;
-		// if (style != null)
-		// {
-		// // try to see whether there is any designer specified min size
-		// ITagEditInfo info = (ITagEditInfo)
-		// style.getAdapter(ITagEditInfo.class);
-		// if (info != null)
-		// {
-		// minWidth = info.getMinWidth();
-		// minHeight = info.getMinHeight();
-		// }
-		//
-		// // CSS also has the min-width/min-height property. We should also get
-		// that,
-		// // and using the max of the "min-width" css property and the designer
-		// specified min size.
-		// int height = getLengthValue(style,ICSSPropertyID.ATTR_MIN_HEIGHT);
-		// if(height > minHeight)
-		// {
-		// minHeight = height;
-		// }
-		// int width = getLengthValue(style,ICSSPropertyID.ATTR_MIN_WIDTH);
-		// if(width > minWidth)
-		// {
-		// minWidth = width;
-		// }
-		// }
-
-		// keep track of user specified size, this will be used when handling
-		// the "overflow" CSS property.
-		_userSpecifiedWidth = 0;
-		_userSpecifiedHeight = 0;
-
-		{
-			int width = getLengthValue(style, ICSSPropertyID.ATTR_WIDTH);
-
-			int availableWidth = line.getAvailableWidth()
-					- style.getMarginInsets().getWidth();
-			if (width <= 0) {
-				// no width setting
-				if (isCalculatingMaxWidth()) {
-					_blockBox.setRecommendedWidth(Integer.MAX_VALUE);
-					// _blockBox.setWidth( (minWidth>0?minWidth:0));
-				} else {
-					_blockBox.setRecommendedWidth(availableWidth);
-					if (shouldExpand()) {
-						_blockBox.setWidth(availableWidth);
-					} else {
-						// _blockBox.setWidth( (minWidth>0?minWidth:0));
-					}
-				}
-			} else {
-				int w = width;
-				if (!style.isSizeIncludeBorderPadding()) {
-					w += style.getBorderInsets().getWidth()
-							+ style.getPaddingInsets().getWidth();
-				}
-				// XXX: should we use minWidth or follow user's choice?
-				// if (w < minWidth)
-				// {
-				// w = minWidth;
-				// }
-				_userSpecifiedWidth = w;
-				_blockBox.setWidth(w);
-				_blockBox.setRecommendedWidth(w);
-			}
-		}
-
-		{
-			int height = getLengthValue(style, ICSSPropertyID.ATTR_HEIGHT);
-			// Object height =
-			// style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			// Length heightLength = (height instanceof Length) ? (Length)
-			// height : null;
-
-			if (height <= 0) {
-				// if (minHeight > 0)
-				// {
-				// // _blockBox.setHeight(minHeight);
-				// _blockBox.setRecommendedHeight(minHeight);
-				// }
-				// else
-				{
-					_blockBox.setHeight(0);
-					_blockBox.setRecommendedHeight(0);
-				}
-			} else {
-				int h = height;
-				if (handlingBorderForBlock()
-						&& !style.isSizeIncludeBorderPadding()) {
-					h += style.getBorderInsets().getHeight()
-							+ style.getPaddingInsets().getHeight();
-				}
-				// XXX: should we follow minHeight or user's choice?
-				// if (minHeight > h)
-				// {
-				// h = minHeight;
-				// }
-				_userSpecifiedHeight = h;
-				_blockBox.setHeight(h);
-				_blockBox.setRecommendedHeight(h);
-			}
-		}
-		_blockBox.setMarginInsets(new Insets(style.getMarginInsets()));
-		if (handlingBorderForBlock()) {
-			BoxUtil.setupBorderPaddingMargin(_blockBox, getCSSStyle());
-		}
-
-		// as in designer, we don't want to the element to have zero size, so
-		// set a minimun size here.
-		// _blockBox.setWidth(Math.max(20, _blockBox.getWidth()));
-		// int minHeight = getCSSStyle().getCSSFont().getFontSize() +
-		// _blockBox.getBorderPaddingHeight();
-		// _blockBox.setHeight(Math.max(minHeight, _blockBox.getHeight()));
-
-		_blockBox._y = line._y;
-		_blockBox._x = line._x;
-
-		setBlockVerticalAlign(_blockBox);
-	}
-
-	/**
-	 * @param style
-	 * @param property
-	 * @return the length value
-	 */
-	protected int getLengthValue(ICSSStyle style, String property) {
-		int lengthValue = 0;
-		if (style != null) {
-			Object object = style.getStyleProperty(property);
-			Length lengthObj = (object instanceof Length) ? (Length) object
-					: null;
-
-			if (lengthObj != null) {
-				lengthValue = lengthObj.getValue();
-				if (lengthObj.isPercentage()) {
-					if (ICSSPropertyID.ATTR_WIDTH.equalsIgnoreCase(property)
-							|| ICSSPropertyID.ATTR_MIN_WIDTH
-									.equalsIgnoreCase(property)) {
-						lengthValue = this.getFlowContext().getCurrentLine().getRecommendedContentWidth()
-								* lengthValue / 100;
-					} else if (ICSSPropertyID.ATTR_HEIGHT
-							.equalsIgnoreCase(property)
-							|| ICSSPropertyID.ATTR_MIN_HEIGHT
-									.equalsIgnoreCase(property)) {
-						// XXX: we should omit it because we don't support
-						// percentage height now.
-						lengthValue = 0;
-					}
-				}
-			}
-		}
-		return lengthValue;
-	}
-
-	private void setBlockVerticalAlign(BlockBox box) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			box.setVerticalAlignData(style
-					.getStyleProperty(ICSSPropertyID.ATTR_VERTICAL_ALIGN));
-		}
-	}
-
-	/**
-	 * @see FlowContainerLayout#preLayout()
-	 */
-	protected void preLayout() {
-		super.preLayout();
-		_blockBox = new BlockBox();
-		setupBlock();
-		// Probably could setup current and previous line here, or just previous
-	}
-
-	// -------------------------------------------------------------------------------------------------------
-	/**
-	 * layout the lines in this layout
-	 */
-	protected void layoutLines() {
-		List lines = _blockBox.getFragments();
-		if (lines != null) {
-			for (int i = 0; i < lines.size(); i++) {
-				if (lines.get(i) instanceof LineBox) {
-					layoutLine((LineBox) lines.get(i));
-				}
-			}
-		}
-	}
-
-	/**
-	 * Called by flush(), adds the BlockBox associated with this BlockFlowLayout
-	 * to the current line and then ends the line.
-	 */
-	protected void endBlock() {
-		layoutLines();
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			int minWidth = 0;
-			int minHeight = 0;
-			// try to see whether there is any designer specified min size
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null) {
-				minWidth = info.getMinWidth();
-				minHeight = info.getMinHeight();
-			}
-
-			// CSS also has the min-width/min-height property. We should also
-			// get that,
-			// and using the max of the "min-width" css property and the
-			// designer specified min size.
-			int height = getLengthValue(style, ICSSPropertyID.ATTR_MIN_HEIGHT);
-			if (height > minHeight) {
-				minHeight = height;
-			}
-			int width = getLengthValue(style, ICSSPropertyID.ATTR_MIN_WIDTH);
-			if (width > minWidth) {
-				minWidth = width;
-			}
-			if (minHeight > _blockBox.getHeight()) {
-				_blockBox.setHeight(minHeight);
-			}
-			if (minWidth > _blockBox.getWidth()) {
-				_blockBox.setWidth(minWidth);
-			}
-		}
-
-		// reset scroll information.
-		this._needHScroll = this._needVScroll = false;
-
-		// ok, now we need to adjust the _blockBox's size according to the
-		// "overflow" setting.
-		// depends on different "overflow" style of this block, different sizing
-		// policy may apply.
-		// ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			Object overflow = style
-					.getStyleProperty(ICSSPropertyID.ATTR_OVERFLOW);
-			if (ICSSPropertyID.VAL_HIDDEN.equals(overflow)) {
-				if (_userSpecifiedWidth > 0) {
-					_blockBox.setWidth(_userSpecifiedWidth);
-				}
-				if (_userSpecifiedHeight > 0) {
-					_blockBox.setHeight(_userSpecifiedHeight);
-				}
-			} else if (ICSSPropertyID.VAL_SCROLL.equals(overflow)
-					|| ICSSPropertyID.VAL_AUTO.equals(overflow)) {
-				// adjust _needHScroll and _needVScroll
-				if (_userSpecifiedWidth > 0
-						&& _userSpecifiedWidth < _blockBox.getWidth()) {
-					_needHScroll = true;
-				}
-				if (_userSpecifiedHeight > 0
-						&& _userSpecifiedHeight < _blockBox.getHeight()) {
-					_needVScroll = true;
-				}
-				if (_needHScroll && !_needVScroll) {
-					if (_userSpecifiedHeight > 0
-							&& _blockBox.getInternalContentHeight() >= 0
-							&& _userSpecifiedHeight < _blockBox
-									.getInternalContentHeight()
-									+ _blockBox.getPaddingInsets().getHeight()
-									+ BorderUtil.SCROLL_WIDTH) {
-						_needVScroll = true;
-					}
-				}
-				if (!_needHScroll && _needVScroll) {
-					if (_userSpecifiedWidth > 0
-							&& _blockBox.getInternalContentWidth() >= 0
-							&& _userSpecifiedWidth < _blockBox
-									.getInternalContentWidth()
-									+ _blockBox.getPaddingInsets().getWidth()
-									+ BorderUtil.SCROLL_WIDTH) {
-						_needHScroll = true;
-					}
-				}
-
-				if (_userSpecifiedWidth > 0) {
-					_blockBox.setWidth(_userSpecifiedWidth);
-				}
-				if (_userSpecifiedHeight > 0) {
-					_blockBox.setHeight(_userSpecifiedHeight);
-				}
-			}
-		}
-
-		if (getFlowContext().isCurrentLineOccupied()
-				&& getFlowContext().getCurrentLine().getAvailableWidth() < _blockBox._width
-						+ _blockBox.getMarginInsets().getWidth()) {
-			getFlowContext().endLine();
-		}
-		if (!isInlineBlock()) {
-			LineBox line = getFlowContext().getCurrentLine();
-			line.setHorizonalData(getCSSStyle().getStyleProperty(
-					ICSSPropertyID.ATTR_HORIZONTAL_ALIGN));
-			line.setHtmlInitData(getCSSStyle().getHTMLelementInitValue(
-					ICSSPropertyID.ATTR_HORIZONTAL_ALIGN));
-			line.add(_blockBox);
-			// getFlowContext().addToCurrentLine(_blockBox);
-		} else {
-			getFlowContext().addToCurrentLine(_blockBox);
-		}
-		getFlowContext().getCurrentLine().getMarginInsets().bottom = getCSSStyle()
-				.getMarginInsets().bottom;
-
-		if (!isInlineBlock()) {
-			getFlowContext().endLine();
-		}
-	}
-
-	/**
-	 * @param line
-	 */
-	protected void layoutLine(LineBox line) {
-		// currentLine.x = 0; //XXX: comment out, don't understand why set to 0,
-		// because it has already
-		// been set when setupLine(). And if do need, should
-		// set to getBorderPaddingInsets().left
-		// if (!isInlineBlock() && shouldExpand())
-		// {
-		// FIXME: currently we are using getRecommendedContentWidth,
-		// what happen if after adding the new line, the new width is bigger
-		// than
-		// recommendedContentWidth? should we use getWidth() instead of
-		// recommendedcontentWidth?
-		Object textalign = line.getHorizonalData();
-		if (textalign == null
-				|| ICSSPropertyMeta.NOT_SPECIFIED.equals(textalign)) {
-			textalign = (getCSSStyle()
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN));
-		}
-		if (textalign == null
-				|| ICSSPropertyMeta.NOT_SPECIFIED.equals(textalign)) {
-			textalign = line.getHtmlInitData();
-		}
-		if (ICSSPropertyID.VAL_RIGHT.equals(textalign)) {
-			line._x = _blockBox.getContentWidth() - line.getWidth();
-		} else if (ICSSPropertyID.VAL_CENTER.equals(textalign)) {
-			line._x = (_blockBox.getContentWidth() - line.getWidth()) / 2;
-		}
-
-		if (line._x < 0) {
-			line._x = 0;
-		}
-		line.commit();
-	}
-
-	/**
-	 * Adjust all fragments in the current line to have the same baseline. Do
-	 * any additional adjustments, such as horizontal alignment.
-	 */
-	protected void addCurrentLine() {
-		// The follow code is commented out, and moved into layoutLine(line)
-		// called by endBlock().
-		// since only when endBlock is called we really know how big is this
-		// block box, and then can
-		// do horizontal alignment.
-		// // currentLine.x = 0; //XXX: comment out, don't understand why set to
-		// 0, because it has already
-		// // been set when setupLine(). And if do need, should
-		// // set to getBorderPaddingInsets().left
-		// if (!isInlineBlock() && shouldExpand())
-		// {
-		// // FIXME: currently we are using getRecommendedContentWidth,
-		// // what happen if after adding the new line, the new width is bigger
-		// than
-		// // recommendedContentWidth? should we use getWidth() instead of
-		// // recommendedcontentWidth?
-		//
-		// Object textalign =
-		// (getCSSStyle().getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN));
-		// if (textalign == ICSSPropertyID.VAL_RIGHT)
-		// {
-		// _currentLine._x = _blockBox.getContentWidth() +
-		// _blockBox.getBorderPaddingInsets().left - _currentLine.getWidth();
-		// }
-		// else if (textalign == ICSSPropertyID.VAL_CENTER)
-		// {
-		//
-		// _currentLine._x = _blockBox.getBorderPaddingInsets().left +
-		// (_blockBox.getContentWidth() - _currentLine.getWidth()) / 2;
-		// }
-		// if (_currentLine._x < 0)
-		// _currentLine._x = 0;
-		// }
-		//
-		// // FIXME: should check vertical alignment here?
-		// _currentLine.commit();
-
-		// layoutLine(_currentLine);
-		_blockBox.add(_currentLine);
-	}
-
-	/**
-	 * @see FlowContainerLayout#flush()
-	 */
-	protected void flush() {
-		if (_currentLine != null && _currentLine.isOccupied()) {
-			addCurrentLine();
-		}
-		endBlock();
-	}
-
-	/**
-	 * @see FlowContainerLayout#cleanup()
-	 */
-	protected void cleanup() {
-		_currentLine = _previousLine = null;
-		_fontMetrices = null;
-	}
-
-	// ----------------------------------------------------------------------------------
-
-	/**
-	 * Override to setup the line's x, remaining, and available width.
-	 * 
-	 * @param line
-	 *            the LineBox to set up
-	 * @param topMargin 
-	 */
-	protected void setupLine(LineBox line, int topMargin) {
-		line.clear();
-
-		// the caller of getCurrentLine() may add leftMargin and leftPadding and
-		// leftBorder to line.x
-		line._x = 0;
-
-		// FIXME: here should check the floating boxes, and minus the width of
-		// them from
-		// current line.
-		line.setRecommendedWidth(_blockBox.getRecommendedContentWidth());
-		if (_previousLine == null) {
-			line._y = 0;
-			if (topMargin != Integer.MIN_VALUE) {
-				line._y += topMargin;
-			}
-		} else {
-			if (topMargin == Integer.MIN_VALUE) {
-				line._y = _previousLine._y + _previousLine.getHeight()
-						+ getLinePadding() + _previousLine.getMarginInsets().bottom; // XXX:
-				// should
-				// add
-				// previous
-				// margin
-				// bottom?
-			} else {
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine.getMarginInsets().bottom);
-			}
-		}
-		setFontinfoForLine(line);
-		// line.validate();
-	}
-
-	private void setFontinfoForLine(LineBox line) {
-
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			if (_fontMetrices == null) {
-				// as getSwtFont is resource consuming, so we cache the
-				// _fontMetrics.
-				_fontMetrices = FigureUtilities.getFontMetrics(style
-						.getCSSFont().getSwtFont());
-			}
-			line.setFontMetrics(_fontMetrices);
-		}
-	}
-
-	/**
-	 * @see FlowContainerLayout#createNewLine()
-	 */
-	protected void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, Integer.MIN_VALUE);
-	}
-
-	protected void createNewLine(int topmargin) {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, topmargin);
-	}
-
-	/**
-	 * @see FlowContext#endLine()
-	 */
-	public void endLine() {
-		// this is called from child layouts.
-		// If there is no current line, state is equivalent to new line
-		if (_currentLine == null) {
-			return;
-		}
-		if (_currentLine.isOccupied()) {
-			addCurrentLine(); // finalize the current line layout
-		} else {
-			_currentLine = null;
-			return;
-		}
-
-		LineBox box = _currentLine;
-		// _currentLine = _previousLine; //XXX: ???? why (yang)
-		_previousLine = box;
-
-		_currentLine = null;
-		// setupLine(getCurrentLine());
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y; // FIXME: margin of previous block?
-	}
-
-	int getLinePadding() {
-		return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#useLocalCoordinates()
-	 */
-	public boolean useLocalCoordinates() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-		// 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		List r = new ArrayList(1);
-		r.add(_blockBox);
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#postValidate()
-	 */
-	public void postValidate() {
-
-		Rectangle r = new Rectangle(_blockBox._x, _blockBox._y, _blockBox
-				.getWidth(), _blockBox.getHeight());
-		getCSSFigure().setBounds(r);
-		List list = getCSSFigure().getChildren();
-		for (int i = 0; i < list.size(); i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-		int width = Math.max(0, Math.max(_blockBox.getWidth(), _blockBox
-				.getRecommendedWidth()));
-		return width;
-	}
-
-	/**
-	 * when the "overflow" is "scroll", we need to paint the scrollbar
-	 */
-	public void paintFigurePostClientArea(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			Object overflow = style
-					.getStyleProperty(ICSSPropertyID.ATTR_OVERFLOW);
-			if (ICSSPropertyID.VAL_SCROLL.equals(overflow)
-					|| ICSSPropertyID.VAL_AUTO.equals(overflow)) {
-				if (this._needHScroll || this._needVScroll) {
-					// as this is using localCoordinate, so translate to
-					// relative to left/up corder of whole
-					// blockbox.
-					g.translate(-_blockBox.getBorderPaddingInsets().left,
-							-_blockBox.getBorderPaddingInsets().top);
-
-					Rectangle rect = new Rectangle(0, 0, _blockBox.getWidth(),
-							_blockBox.getHeight());
-					rect.crop(_blockBox.getBorderInsets());
-
-					if (this._needHScroll && this._needVScroll) {
-						BorderUtil.drawScrollBar(g, BorderUtil.SCROLL_WIDTH,
-								rect, BorderUtil.BOTH);
-					} else if (this._needHScroll) {
-						BorderUtil.drawScrollBar(g, BorderUtil.SCROLL_WIDTH,
-								rect, BorderUtil.HORIZONTAL_BAR);
-					} else if (this._needVScroll) {
-						BorderUtil.drawScrollBar(g, BorderUtil.SCROLL_WIDTH,
-								rect, BorderUtil.VERTICAL_BAR);
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBrFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBrFlowLayout.java
deleted file mode 100644
index c69430d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBrFlowLayout.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class CSSBrFlowLayout extends CSSInlineFlowLayout implements ICSSPainter {
-
-	private static final String LINE_BREAK_IMAGE_FILE = "LineBreak.gif"; //$NON-NLS-1$
-
-	/**
-	 * @param flow
-	 */
-	public CSSBrFlowLayout(CSSFigure flow) {
-		super(flow);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSInlineFlowLayout#flush()
-	 */
-	protected void flush() {
-		FlowBox forcedBox = new FlowBox();
-		forcedBox.setWidth(16);
-		forcedBox.setHeight(getCSSStyle().getCSSFont().getXHeight());
-		addToCurrentLine(forcedBox);
-		endLine();
-
-		FlowBox flowbox = new FlowBox();
-		flowbox.setHeight(getCSSStyle().getCSSFont().getFontSize());
-		getCurrentLine().add(flowbox);
-
-		super.flush();
-	}
-
-	public void paintFigure(Graphics g) {
-		List fragments = getFragmentsForRead();
-		if (!fragments.isEmpty()) {
-			FlowBox box = (FlowBox) fragments.get(0);
-			g.drawImage(getSharedHTMLImage(), new Point(box._x, box._y));
-		}
-	}
-
-	private static Image getSharedHTMLImage() {
-		
-		return PDPlugin.getDefault().getImage(LINE_BREAK_IMAGE_FILE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java
deleted file mode 100644
index 580b347..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java
+++ /dev/null
@@ -1,534 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.border.CSSBorder;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.VisibilityMeta;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.css2.widget.BorderUtil;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Normally a CSSFigure is a container. It's layout will be driven by different
- * display type information from the style.
- * 
- * Each CSSFigure will be driven by ICSSStyle, the display type of the ICSSStyle
- * will decide the layout to be used for the figure.
- * 
- * @author mengbo
- */
-public class CSSFigure extends FlowFigure implements ICSSFigure {
-	private static Logger _log = PDPlugin.getLogger(CSSFigure.class);
-
-	private static final Rectangle PRIVATE_RECT = new Rectangle();
-
-	private ICSSStyle _style;
-
-	// if this field is set, then regetLayout() will still return this layout,
-	// without going through the CSS resolution
-	private CSSLayout _fixedLayout;
-
-	/**
-	 * Default constructor 
-	 * Equivalent to CSSFigure(DefaultStyle.getInstance())
-	 */
-	public CSSFigure() {
-		this(DefaultStyle.getInstance());
-	}
-
-	/**
-	 * @param style
-	 */
-	public CSSFigure(ICSSStyle style) {
-		_style = style;
-		invalidateCSS();
-	}
-
-	public ICSSStyle getCSSStyle() {
-		return _style;
-	}
-
-	/**
-	 * @param style
-	 */
-	public void setCSSStyle(ICSSStyle style) {
-		_style = style;
-		invalidateCSS();
-	}
-
-	public void revalidate() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		layout.figureRevalidate();
-		super.revalidate();
-	}
-
-	/**
-	 * this method is called when the css source noticed style change. So tell
-	 * the figure should invalidate its cached data.
-	 */
-	public void invalidateCSS() {
-		// maybe we changed from inline to block or block to inline
-		// XXX: or even to table?
-		CSSLayout layout = regetLayout(getLayoutManager());
-		this.setLayoutManager(layout);
-	}
-
-	/**
-	 * @param layout
-	 */
-	public void setFixedLayoutManager(CSSLayout layout) {
-		this._fixedLayout = layout;
-		this.setLayoutManager(regetLayout(getLayoutManager()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#setLayoutManager(org.eclipse.draw2d.LayoutManager)
-	 */
-	public void setLayoutManager(LayoutManager manager) {
-		LayoutManager old = getLayoutManager();
-		if (old != manager) {
-			FlowContext context = null;
-			if (old instanceof FlowFigureLayout) {
-				context = ((FlowFigureLayout) old).getOriginalFlowContext();
-			}
-			if (manager instanceof FlowFigureLayout) {
-				((FlowFigureLayout) manager).setOriginalFlowContext(context);
-			}
-
-			if (manager instanceof FlowContext) {
-				List list = getChildren();
-				for (int i = 0, size = list.size(); i < size; i++) {
-					try {
-						((FlowFigure) list.get(i))
-								.setOriginalFlowContext((FlowContext) manager);
-					} catch (ClassCastException classcastexception) {
-						// Error in flowContext setting.
-						_log.error("Error.CSSFigure.0", classcastexception); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		super.setLayoutManager(manager);
-	}
-
-	/**
-	 * @param old
-	 * @return the layout
-	 */
-	protected CSSLayout regetLayout(LayoutManager old) {
-		if (_fixedLayout != null) {
-			return _fixedLayout;
-		}
-		CSSLayout layout = DisplayToLayout.displayToLayout(this, getCSSStyle()
-				.getDisplay(), old);
-		if (layout != null) {
-			return layout;
-		}
-        return new CSSInlineFlowLayout(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#containsPoint(int, int)
-	 */
-	public boolean containsPoint(int x, int y) {
-		// check whether any float figure contains it.
-		// FIXME: need check floating figure here!!!
-		if (!super.containsPoint(x, y)) {
-			return false;
-		}
-		List frags = getFragmentsForRead();
-		// Here we should not get void pointer.
-		if (frags != null) {
-			for (int i = 0; i < frags.size(); i++) {
-				FlowBox box = (FlowBox) frags.get(i);
-				if (box != null && box.containsPoint(x, y)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		return layout.getFragmentsForRead();
-	}
-
-	/**
-	 * this method is a shortcut to getFragmentsForRead
-	 * 
-	 * @return fragment bounds
-	 */
-	public Rectangle[] getFragmentsBounds() {
-		List list = getFragmentsForRead();
-		if (list == null || list.size() == 0) {
-			// should not happen. but still handle it.
-			return new Rectangle[] { getBounds() };
-		}
-        Rectangle[] ret = new Rectangle[list.size()];
-        for (int i = 0, size = list.size(); i < size; i++) {
-        	FlowBox box = (FlowBox) list.get(i);
-        	ret[i] = new Rectangle(box._x, box._y, box.getWidth(), box
-        			.getHeight());
-        }
-        return ret;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#setBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r)) {
-			return;
-		}
-		boolean invalidate = getBounds().width != r.width
-				|| getBounds().height != r.height;
-		super.setBounds(r);
-
-		CSSLayout layout = (CSSLayout) this.getLayoutManager();
-		layout.setBoundsCalled(r, invalidate);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		layout.postValidateForAbsolute();
-		layout.postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#validate()
-	 */
-	public void validate() {
-		super.validate();
-		// should not call this.postValidate() here. PostValidate() should
-		// only be started from the FlowPage. Otherwise it will be called
-		// multiple times on a figure.
-		// this.postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		if (layout == null) {
-			return false;
-		}
-        return layout.useLocalCoordinates();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#paint(org.eclipse.draw2d.Graphics)
-	 */
-	public void paint(Graphics graphics) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			Object visibility = style
-					.getStyleProperty(ICSSPropertyID.ATTR_VISIBILITY);
-			// handle visibility: hidden here.
-			// TODO: "collapse" is not supported yet!
-			if (VisibilityMeta.HIDDEN.equals(visibility)) {
-				return;
-			}
-		}
-
-		CSSLayout layout = (CSSLayout) this.getLayoutManager();
-		graphics.pushState();
-		try {
-			paintFigure(graphics);
-			graphics.restoreState();
-			paintClientArea(graphics);
-			if (layout instanceof ICSSPainter2) {
-				if (useLocalCoordinates()) {
-					graphics.translate(getBounds().x + getInsets().left,
-							getBounds().y + getInsets().top);
-					((ICSSPainter2) layout).paintFigurePostClientArea(graphics);
-					graphics.restoreState();
-				} else {
-					((ICSSPainter2) layout).paintFigurePostClientArea(graphics);
-				}
-			}
-			paintBorder(graphics);
-		} finally {
-			graphics.popState();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		Color rgbColor = null;
-		boolean fillArea = false;
-		Object bg = getCSSStyle().getBackgroundColor();
-		if (bg instanceof RGB) {
-			rgbColor = new Color(null, (RGB) bg);
-			g.setBackgroundColor(rgbColor);
-			fillArea = true;
-		} else if (bg instanceof Color) {
-			g.setBackgroundColor((Color) bg);
-			fillArea = true;
-		}
-		if (fillArea) {
-			List fragments = getFragmentsForRead();
-
-			for (int i = 0, n = fragments.size(); i < n; i++) {
-				Object obj = fragments.get(i);
-				if (obj instanceof FlowBox) {
-					FlowBox box = (FlowBox) obj;
-					g.fillRectangle(box._x, box._y, box.getWidth(), box
-							.getHeight());
-				}
-			}
-		}
-		if (rgbColor != null) {
-			rgbColor.dispose();
-		}
-		g.restoreState();
-
-		//handle background-image
-		Object bgImage = getCSSStyle().getStyleProperty(ICSSPropertyID.ATTR_BACKGROUND_IMAGE);
-		if (bgImage instanceof Image) {
-			g.setClip(bounds);
-			g.drawImage((Image)bgImage, bounds.x, bounds.y);
-			g.restoreState();
-		}
-
-		LayoutManager layout = getLayoutManager();
-		if (layout instanceof ICSSPainter) {
-			if (useLocalCoordinates()) {
-				g.translate(getBounds().x + getInsets().left, getBounds().y
-						+ getInsets().top);
-				((ICSSPainter) layout).paintFigure(g);
-				g.restoreState();
-			} else {
-				((ICSSPainter) layout).paintFigure(g);
-			}
-		}
-
-		// paint selected mode here.
-		paintSelection(g);
-
-		if (Debug.DEBUG_BOX) {
-			// draw two levels of boxes. Since normally each figure will only
-			// have two levels of boxes.
-			List fragments = this.getFragmentsForRead();
-			for (int i = 0, size = fragments.size(); i < size; i++) {
-				FlowBox box = (FlowBox) fragments.get(i);
-				BoxUtil.drawBox(g, box);
-				if (box instanceof BlockBox) {
-					BlockBox compositeBox = (BlockBox) box;
-					List list = compositeBox.getFragments();
-					for (int j = 0; j < list.size(); j++) {
-						g.translate(this.getInsets().left,
-								this.getInsets().right);
-						BoxUtil.drawBox(g, (FlowBox) list.get(j));
-						g.restoreState();
-					}
-				}
-			}
-		}
-		if (Debug.DEBUG_BASELINE) {
-			List fragments = this.getFragmentsForRead();
-			for (int i = 0, size = fragments.size(); i < size; i++) {
-				Object obj = fragments.get(i);
-				if (obj instanceof LineBox) {
-					LineBox linebox = (LineBox) obj;
-					g.setForegroundColor(ColorConstants.red);
-					g.drawLine(linebox._x, linebox._y + linebox.getAscent(),
-							linebox._x + linebox.getWidth(), linebox._y
-									+ linebox.getAscent());
-				}
-			}
-		}
-
-		if (Debug.DEBUG_BORDERPADDING) {
-			if (this.getLayoutManager() instanceof CSSBlockFlowLayout) {
-				g.setLineWidth(1);
-				Rectangle rect = getBounds().getCopy().crop(getInsets());
-				g.setForegroundColor(ColorConstants.green);
-				g.drawRectangle(rect);
-				g.setForegroundColor(ColorConstants.red);
-				g.drawRectangle(getBounds());
-			}
-		}
-
-		if (Debug.DEBUG_BOX) {
-			CSSLayout csslayout = (CSSLayout) this.getLayoutManager();
-			if (csslayout.getAbsoluteContext() != null) {
-				BlockBox blockbox = csslayout.getAbsoluteContext()._blockBox;
-				g.setLineWidth(1);
-				g.setForegroundColor(ColorConstants.green);
-				g.drawRectangle(blockbox._x, blockbox._y, blockbox.getWidth(),
-						blockbox.getHeight());
-			}
-		}
-	}
-
-	/**
-	 * Paints this Figure's client area. The client area is typically defined as
-	 * the anything inside the Figure's {@link org.eclipse.draw2d.Border} or {@link org.eclipse.draw2d.geometry.Insets}, and
-	 * by default includes the children of this Figure. On return, this method
-	 * must leave the given Graphics in its initial state.
-	 * 
-	 * @param graphics
-	 *            The Graphics used to paint
-	 * @since 2.0
-	 */
-	protected void paintClientArea(Graphics graphics) {
-		if (this.getChildren().isEmpty()) {
-			return;
-		}
-
-		Object overflow = ICSSPropertyID.VAL_VISIBLE;
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			overflow = style.getStyleProperty(ICSSPropertyID.ATTR_OVERFLOW);
-		}
-
-		boolean optimizeClip = ICSSPropertyID.VAL_VISIBLE.equals(overflow);
-
-		if (useLocalCoordinates()) {
-			graphics.translate(getBounds().x + getInsets().left, getBounds().y
-					+ getInsets().top);
-			if (!optimizeClip) {
-				graphics.clipRect(getClientArea(PRIVATE_RECT));
-			}
-			graphics.pushState();
-			paintChildren(graphics);
-			graphics.popState();
-			graphics.restoreState();
-		} else {
-			if (optimizeClip) {
-				paintChildren(graphics);
-			} else {
-				graphics.clipRect(getClientArea(PRIVATE_RECT));
-				graphics.pushState();
-				paintChildren(graphics);
-				graphics.popState();
-				graphics.restoreState();
-			}
-		}
-	}
-
-	/**
-	 * @param g
-	 */
-	protected void paintSelection(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			if (style.isInSelection()) {
-				ITagEditInfo editInfo = (ITagEditInfo) style
-						.getAdapter(ITagEditInfo.class);
-				if (editInfo != null && editInfo.isWidget()) {
-					BorderUtil.maskFigure(this, g);
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintBorder(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintBorder(Graphics graphics) {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		if (layout != null && !layout.handlingBorderForBlock()) {
-			return;
-		}
-
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			CSSBorder border1 = new CSSBorder(this.getCSSStyle());
-			border1.paint(this, graphics, NO_INSETS);
-
-			// draw a border for those special elements like <h:form>, etc.
-			ITagEditInfo editInfo = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (editInfo != null && editInfo.needBorderDecorator()) {
-				BorderUtil.drawBorderDecorator(this, graphics);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#getInsets()
-	 */
-	public Insets getInsets() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		if (layout != null && !layout.handlingBorderForBlock()) {
-			return new Insets();
-		}
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			return style.getBorderInsets().getAdded(style.getPaddingInsets());
-		}
-		return new Insets();
-	}
-
-	/**
-	 * FIXME: need trace the implementation of Figure.invalidate() We want to
-	 * just mark this figure as invalid, but don't want to the layout get
-	 * invalidated.
-	 * 
-	 */
-	public void invalidate2() {
-		if (!isValid())
-			return;
-		// if (getLayoutManager() != null)
-		// getLayoutManager().invalidate();
-		setValid(false);
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSInlineFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSInlineFlowLayout.java
deleted file mode 100644
index 39ddf89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSInlineFlowLayout.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-
-/**
- * The layout manager for {@link CSSFigure}figures. This class is based on
- * InlineFlowLayout of draw2d.
- * 
- * @author mengbo
- */
-public class CSSInlineFlowLayout extends CSSLayout {
-	List _fragments = new ArrayList();
-
-	/**
-	 * Creates a new InlineFlowLayout with the given FlowFigure.
-	 * 
-	 * @param flow
-	 *            The FlowFigure
-	 */
-	public CSSInlineFlowLayout(CSSFigure flow) {
-		super(flow);
-	}
-
-	/**
-	 * Clears out all fragments prior to the call to layoutChildren().
-	 */
-	public void preLayout() {
-		super.preLayout();
-		_fragments.clear();
-		// force creating of the first line. avoid empty element don't have
-		// fragments.
-		// createFirstLine();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layoutChildren()
-	 */
-	protected void layoutChildren() {
-		// For designer, to make it to have some size. otherwise can't
-		// be found on screen.
-		// List children = getCSSFigure().getChildren();
-		// if (children.size() == 0)
-		// {
-		// FlowBox box = new FlowBox();
-		// box._height = getCSSStyle().getCSSFont().getFontSize();
-		// box._width = 2;
-		// addToCurrentLine(box);
-		//
-		// }
-		super.layoutChildren();
-	}
-
-	/**
-	 * Adds the given FlowBox to the current line of this InlineFlowLayout.
-	 * 
-	 * @param block
-	 *            the FlowBox to add to the current line
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-		// XXX: ???: will currentLine be added multiple times to fragments?
-		// (yang)
-		// _fragments.add(_currentLine);
-	}
-
-	private void createFirstLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, true);
-		_fragments.add(_currentLine);
-	}
-
-	/**
-	 * @see FlowContainerLayout#createNewLine()
-	 */
-	protected void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, false);
-		_fragments.add(_currentLine);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#createNewLine(int)
-	 */
-	protected void createNewLine(int topMargin) {
-		// inline flow don't support vertical margin.
-		createNewLine();
-	}
-
-	/**
-	 * @see FlowContainerLayout#cleanup()
-	 */
-	protected void cleanup() {
-		_currentLine = null;
-	}
-
-	/**
-	 * @see FlowContainerLayout#flush()
-	 */
-	protected void flush() {
-		if (_fragments.isEmpty()) {
-			createFirstLine();
-		} else if (_fragments.size() == 1) {
-
-			ICSSStyle style = getCSSStyle();
-			int minWidth = 0, minHeight = 0;
-			// try to see whether there is any designer specified min size
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null) {
-				minWidth = info.getMinWidth();
-				minHeight = info.getMinHeight();
-			}
-			FlowBox box = (FlowBox) _fragments.get(0);
-			if (minWidth > box._width) {
-				box._width = minWidth;
-			}
-			if (minHeight > box._height) {
-				box._height = minHeight;
-			}
-		}
-
-		if (_currentLine != null /* && _currentLine.isOccupied() */) {
-			_currentLine.getMarginInsets().right = getCSSStyle().getMarginInsets().right;
-			getFlowContext().addToCurrentLine(_currentLine);
-		}
-
-	}
-
-	/**
-	 * @see FlowContext#endLine()
-	 */
-	public void endLine() {
-		if (_currentLine == null) {
-			getFlowContext().endLine();
-			return;
-		}
-		// If nothing was ever placed in the line, ignore it. and if the line is
-		// the first line, just remove it.
-		if (_currentLine.isOccupied()) {
-			getFlowContext().addToCurrentLine(_currentLine);
-		} else if (_fragments.size() == 1) {
-			_fragments.remove(0);
-		}
-		getFlowContext().endLine();
-		_currentLine = null;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#isCurrentLineOccupied()
-	 */
-	public boolean isCurrentLineOccupied() {
-		if (_currentLine == null) {
-			return getFlowContext().isCurrentLineOccupied();
-		} else if (_currentLine.getFragments().isEmpty()) {
-			return getFlowContext().isCurrentLineOccupied();
-		} else {
-			return true;
-		}
-	}
-
-	/**
-	 * Initializes the given LineBox. Called by createNewLine().
-	 * 
-	 * @param line
-	 *            The LineBox to initialize.
-	 * @param firstline 
-	 */
-	protected void setupLine(LineBox line, boolean firstline) {
-		LineBox parent = getFlowContext().getCurrentLine();
-		line._x = 0;
-		line._y = getFlowContext().getCurrentY();
-
-		line.setRecommendedWidth(parent.getAvailableWidth());
-
-		setLineVerticalAlign(line);
-		setFontinfoForLine(line);
-
-		if (firstline && getCSSStyle() != null) {
-			ICSSStyle style = getCSSStyle();
-			int minWidth = 0, minHeight = 0;
-			// try to see whether there is any designer specified min size
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null) {
-				minWidth = info.getMinWidth();
-				minHeight = info.getMinHeight();
-			}
-
-			// // CSS also has the min-width/min-height property. We should also
-			// get that,
-			// // and using the max of the "min-width" css property and the
-			// designer specified min size.
-			// int height =
-			// getLengthValue(style,ICSSPropertyID.ATTR_MIN_HEIGHT);
-			// if(height > minHeight)
-			// {
-			// minHeight = height;
-			// }
-			// int width = getLengthValue(style,ICSSPropertyID.ATTR_MIN_WIDTH);
-			// if(width > minWidth)
-			// {
-			// minWidth = width;
-			// }
-			if (minWidth > 0) {
-				line.setWidth(minWidth);
-			}
-			int fontHeight = this.getCSSStyle().getCSSFont().getXHeight();
-			if (minHeight > 0 && minHeight > fontHeight) {
-				line.setHeight(minHeight);
-			} else {
-				line.setHeight(fontHeight);
-			}
-		}
-	}
-
-	private void setLineVerticalAlign(LineBox box) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			box.setVerticalAlignData(style
-					.getStyleProperty(ICSSPropertyID.ATTR_VERTICAL_ALIGN));
-		}
-	}
-
-	private void setFontinfoForLine(LineBox line) {
-
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			line.setFontMetrics(FigureUtilities.getFontMetrics(style
-					.getCSSFont().getSwtFont()));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-		// 
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		return _fragments;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#postValidate()
-	 */
-	public void postValidate() {
-		List list = _fragments;
-
-		FlowBox box;
-		int left = Integer.MAX_VALUE, top = left;
-		int right = Integer.MIN_VALUE, bottom = right;
-		for (int i = 0; i < list.size(); i++) {
-			box = (FlowBox) list.get(i);
-			// if (box instanceof LineBox && !((LineBox) box).isOccupied())
-			// {
-			// continue; // skip unoccupied line
-			// }
-			left = Math.min(left, box._x);
-			right = Math.max(right, box._x + box._width);
-			top = Math.min(top, box._y);
-			bottom = Math.max(bottom, box._y + box._height);
-		}
-		getCSSFigure().setBounds(
-				new Rectangle(left, top, right - left, bottom - top));
-		list = getCSSFigure().getChildren();
-		for (int i = 0; i < list.size(); i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-		// FIXME: don't really understand what means for inline
-		return this.getFlowContext().getContainerWidth();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSLayout.java
deleted file mode 100644
index d47bdbb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSLayout.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.PositionMeta;
-import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-
-/**
- * CSSLayout is the base layout manager for different CSS layouts, such as block
- * layout, inline layout (possible in the future table layout, etc)
- * 
- * @author mengbo
- */
-public abstract class CSSLayout extends FlowFigureLayout implements FlowContext {
-	private BlockFlowContext _absoluteContext;
-
-	// when doing absolute layout, and if top/left are both "auto", it will be
-	// relating to the normaly flow position. The following two fields try to
-	// catch normal flow layout position.
-	// int _xForAbsolute;
-	// int _yForAbsolute;
-	private FlowBox _boxForAbsolute;
-
-	/**
-	 * the current line
-	 */
-	protected LineBox _currentLine;
-
-	private boolean _calculatingMaxWidth = false;
-
-	/**
-	 * @param flowFigure 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#FlowFigureLayout(FlowFigure)
-	 */
-	protected CSSLayout(CSSFigure flowFigure) {
-		super(flowFigure);
-	}
-
-	/**
-	 * a shortcut method to get the style associated with the figure.
-	 * 
-	 * @return the css style
-	 */
-	public ICSSStyle getCSSStyle() {
-		return getCSSFigure().getCSSStyle();
-	}
-
-	/**
-	 * @return the absolute context
-	 */
-	protected final BlockFlowContext getAbsoluteContext() {
-        return _absoluteContext;
-    }
-
-    /**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#addToCurrentLine(FlowBox)
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-	}
-
-	/**
-	 * Used by getCurrentLine().
-	 */
-	protected abstract void createNewLine();
-
-	/**
-	 * Used by getCurrentLine(int topmargin)
-	 * 
-	 * @param topMargin
-	 */
-	protected void createNewLine(int topMargin) {
-		createNewLine();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine()
-	 */
-	public LineBox getCurrentLine() {
-		if (_currentLine == null) {
-			createNewLine();
-		}
-		return _currentLine;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine(int)
-	 */
-	public LineBox getCurrentLine(int topMargin) {
-		if (_currentLine == null) {
-			createNewLine(topMargin);
-		}
-		// if the current line only contains an empty string, reset the current
-		// line using the given margin.
-		else if (_currentLine.isEmptyStringLine()) {
-			List list = _currentLine.getFragments();
-			createNewLine(topMargin);
-			_currentLine._fragments.addAll(list);
-		}
-		return _currentLine;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCurrentLineOccupied
-	 */
-	public boolean isCurrentLineOccupied() {
-		return _currentLine != null && _currentLine.isOccupied();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layout() {
-		preLayout();
-		layoutChildren();
-		flush();
-		cleanup();
-	}
-
-	/**
-	 * @return true if is absolute position
-	 */
-	protected final boolean isAbsolutePosition() {
-		ICSSStyle style = getCSSStyle();
-
-		// FIXME: Some layout don't support absolute, need check here
-		if (style != null) {
-			Object obj = style.getStyleProperty(ICSSPropertyID.ATTR_POSITION);
-			if (PositionMeta.ABSOLUTE.equals(obj)
-					|| PositionMeta.FIXED.equals(obj)) 
-			{
-			    PDPreferences prefs = new PDPreferences();
-			    return prefs.isCssAbsolutePositioningEnabled();
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Child class could override this method.
-	 * 
-	 * @return true if supports absolute position  
-	 */
-	protected boolean supportAbsolutePosition() {
-		if (findContainingPositionedFigure() == null) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Perform a prelayout
-	 */
-	protected void preLayout() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			style.processCounters();
-		}
-
-		if (isAbsolutePosition()) {
-			FlowContext parentFigureContext = getParentFigureContext();
-			_absoluteContext = new BlockFlowContext(parentFigureContext, style);
-			_boxForAbsolute = new FlowBox();// size is 0. Just as a flag, so
-			// later we
-			// could figure out where will this figure be
-			// be put in case of not absolute
-			_boxForAbsolute.setVerticalAlignData(VerticalAlignMeta.TOP);
-			parentFigureContext.addToCurrentLine(_boxForAbsolute);
-		} else {
-			_absoluteContext = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#getFlowContext()
-	 */
-	public FlowContext getFlowContext() {
-		if (_absoluteContext != null) {
-			return _absoluteContext;
-		}
-        return getOriginalFlowContext();
-	}
-
-	/**
-	 * @return the flow context
-	 */
-	private FlowContext getParentFigureContext() {
-		return super.getFlowContext();
-	}
-
-	final void postValidateForAbsolute() {
-		if (_absoluteContext != null) {
-			ICSSStyle style = this.getCSSStyle();
-
-			_absoluteContext.endBlock();
-
-			int xOffset;
-			int yOffset;
-
-			ICSSFigure containingPositionedFigure = findContainingPositionedFigure();
-			IFigure parentFigure = this.getCSSFigure().getParent();
-
-			xOffset = calculatePositionRelativeToParent(style,
-					containingPositionedFigure, parentFigure, true);
-			yOffset = calculatePositionRelativeToParent(style,
-					containingPositionedFigure, parentFigure, false);
-			move(_absoluteContext._blockBox, xOffset, yOffset);
-		}
-	}
-
-	/**
-	 * @param style
-	 * @param containingPositionedFigure
-	 * @param parentFigure
-	 * @return
-	 */
-	private int calculatePositionRelativeToParent(ICSSStyle style,
-			ICSSFigure containingPositionedFigure, IFigure parentFigure,
-			boolean horizontal) {
-		int xOffset;
-		Object left = horizontal ? style
-				.getStyleProperty(ICSSPropertyID.ATTR_LEFT) : style
-				.getStyleProperty(ICSSPropertyID.ATTR_TOP);
-		Object right = horizontal ? style
-				.getStyleProperty(ICSSPropertyID.ATTR_RIGHT) : style
-				.getStyleProperty(ICSSPropertyID.ATTR_BOTTOM);
-
-		if (!(left instanceof Length) && !(right instanceof Length)) {
-			// _boxForAbsolute partipated the layout of the parent figure, and
-			// is already relative to parent.
-			return horizontal ? _boxForAbsolute._x : _boxForAbsolute._y;
-		}
-
-		// ok, user specified left or right. let's calculate the left
-		int leftValue;
-		if (left instanceof Length) {
-			Length leftLength = (Length) left;
-			leftValue = leftLength.getValue();
-			if (leftLength.isPercentage()) {
-				leftValue = (horizontal ? containingPositionedFigure
-						.getBounds().width : containingPositionedFigure
-						.getBounds().height)
-						* leftValue / 100;
-			}
-		} else {
-			Length rightLength = (Length) right;
-			int lengthValue = rightLength.getValue();
-			if (rightLength.isPercentage()) {
-				lengthValue = (horizontal ? containingPositionedFigure
-						.getBounds().width : containingPositionedFigure
-						.getBounds().height)
-						* lengthValue / 100;
-			}
-
-			if (horizontal) {
-				leftValue = containingPositionedFigure.getBounds().width
-						- _absoluteContext._blockBox.getWidth() - lengthValue;
-			} else {
-				leftValue = containingPositionedFigure.getBounds().height
-						- _absoluteContext._blockBox.getHeight() - lengthValue;
-			}
-
-		}
-
-		// xOffset is relative to the first box of the containing figure
-		List fragments = containingPositionedFigure
-				.getFragmentsForRead();
-		if (fragments.size() > 0) {
-			FlowBox box = (FlowBox) fragments.get(0);
-			// box._x is the x location relative to containingPositionedFigure's
-			// parent.
-			// so now xOffset is relative to containingPositionedFigure's
-			// parent.
-			xOffset = (horizontal ? box._x : box._y) + leftValue;
-		} else {
-			xOffset = leftValue; // should not happen.
-		}
-		Point p;
-		if (horizontal) {
-			p = new Point(xOffset, 0);
-		} else {
-			p = new Point(0, xOffset);
-		}
-		containingPositionedFigure.translateFromParent(p);
-		containingPositionedFigure.translateToAbsolute(p);
-		parentFigure.translateToRelative(p);
-		return horizontal ? p.x : p.y;
-	}
-
-	/**
-	 * @return
-	 */
-	private ICSSFigure findContainingPositionedFigure() {
-		IFigure figure = this.getCSSFigure().getParent();
-		while (figure instanceof ICSSFigure) {
-			return (ICSSFigure) figure;
-			// ICSSStyle style = ((ICSSFigure) figure).getCSSStyle();
-			// if (DisplayToLayout.isPositioned(style))
-			// {
-			// return (ICSSFigure) figure;
-			// }
-			// figure = figure.getParent();
-		}
-		return null;
-
-	}
-
-	/**
-	 * @param resultBox
-	 * @param x
-	 * @param y
-	 */
-	private void move(CompositeBox compBox, int x, int y) {
-		compBox._x += x;
-		compBox._y += y;
-		List list = compBox.getFragments();
-		for (int i = 0; i < list.size(); i++) {
-			FlowBox box = (FlowBox) list.get(i);
-
-			if (box instanceof CompositeBox && !(box instanceof BlockBox)) {
-				move((CompositeBox) box, x, y);
-			} else {
-				box._x += x;
-				box._y += y;
-			}
-		}
-	}
-
-	/**
-	 * Layout all children.
-	 */
-	protected void layoutChildren() {
-		List children = getFlowFigure().getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			Figure f = (Figure) children.get(i);
-			f.invalidate();
-			f.validate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getLastMarginRight()
-	 */
-	public int getLastMarginRight() {
-		if (_currentLine == null || !_currentLine.isOccupied()) {
-			return 0;
-		}
-		FlowBox box = (FlowBox) _currentLine.getFragments().get(
-				_currentLine.getFragments().size() - 1);
-		if (box != null) {
-			return box.getMarginInsets().right;
-		}
-        return 0;
-	}
-
-	/**
-	 * @param c
-	 */
-	public void setCalculatingMaxWidth(boolean c) {
-		_calculatingMaxWidth = c;
-	}
-
-	/**
-	 * @return the calculated maximum width
-	 */
-	public boolean getCalcuatingMaxWidth() {
-		return _calculatingMaxWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		if (_calculatingMaxWidth) {
-			return true;
-		} else if (this.getFlowContext() == null) {
-			return false;
-		} else {
-			return this.getFlowContext().isCalculatingMaxWidth();
-		}
-	}
-
-	/**
-	 * Called after {@link #layoutChildren()}when all children have been laid
-	 * out. This method exists to flush the last line.
-	 */
-	protected abstract void flush();
-
-	/**
-	 * Flush anything pending and free all temporary data used during layout.
-	 */
-	protected abstract void cleanup();
-
-	// ------------------------------------------------------------------------------------
-
-	/**
-	 * @return the css figure
-	 */
-	protected final CSSFigure getCSSFigure() {
-		return (CSSFigure) getFlowFigure();
-	}
-
-	/**
-	 * 
-	 * @return the fragments for read
-	 */
-	public abstract List getFragmentsForRead();
-
-	/**
-	 * postValidate the child figures of this CSSFigure. Normally layout fall
-	 * into the first category need implement this method.
-	 */
-	public abstract void postValidate();
-
-	/**
-	 * setBounds is called on the CSSFigure. Normally layout fall into the
-	 * second category need implement this method.
-	 * 
-	 * @param rect
-	 * @param invalidate
-	 */
-	public void setBoundsCalled(Rectangle rect, boolean invalidate) {
-        // TODO: dead?
-	}
-
-	/**
-	 * Child class can override this. Normally block figure will return true.
-	 * 
-	 * @return true if should use local coordinates
-	 */
-	protected boolean useLocalCoordinates() {
-		return false;
-	}
-
-	/**
-	 * If CSSLayout will call paint rountine to draw Border for its box, this
-	 * method will return true, else return false, for example,the input file
-	 * will return false.
-	 * 
-	 * @return true if handling border block
-	 */
-	protected boolean handlingBorderForBlock() {
-		return true;
-	}
-
-	/**
-	 * This method is called when the corresponding figure is revalidated.
-	 * 
-	 */
-	protected void figureRevalidate() {
-		// child class can override.
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSListItemLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSListItemLayout.java
deleted file mode 100644
index 2e25cc0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSListItemLayout.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.marker.CounterUtil;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSListItemLayout extends CSSBlockFlowLayout implements
-		ICSSPainter {
-	private static final String DEFAULT_LIST_COUNTER = "_anonymous"; //$NON-NLS-1$
-
-	private static final int CIRCLE_DIAMETER = 6;
-
-	private static final int DISC_DIAMETER = 5;
-
-	private static final int ROUNDRECT_ARC = 2;
-
-	private static final int TEXT_PADDING = 16;
-
-	private int _count;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSListItemLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	public void paintFigure(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-
-		Rectangle drawArea = null;
-		Font font = getCSSStyle().getCSSFont().getSwtFont();
-
-		// draw the marker box
-		Object styleType = style
-				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-
-		g.pushState();
-
-		Color newColor = null;
-		Object color = style.getColor();
-		if (color instanceof Color) {
-			g.setForegroundColor((Color) color);
-			g.setBackgroundColor((Color) color);
-		} else if (color instanceof RGB) {
-			newColor = new Color(Display.getCurrent(), (RGB) color);
-			g.setForegroundColor(newColor);
-			g.setBackgroundColor(newColor);
-		}
-
-		if (styleType instanceof String) {
-			int type = CounterHelper.toTypeInt((String) styleType);
-			switch (type) {
-			case CounterHelper.LIST_T_UPPER_ALPHA:
-			case CounterHelper.LIST_T_LOWER_ALPHA:
-			case CounterHelper.LIST_T_LOWER_ROMAN:
-			case CounterHelper.LIST_T_UPPER_ROMAN:
-			case CounterHelper.LIST_T_DECIMAL:
-				g.setFont(font);
-				String displayString = CounterUtil.convertCount(_count, type);
-				Point point = getDrawPointForText(displayString);
-				g.drawString(displayString, point);
-				break;
-			case CounterHelper.LIST_T_CIRCLE:
-				drawArea = getDrawAreaForGraph(CIRCLE_DIAMETER, CIRCLE_DIAMETER);
-				g.drawArc(drawArea, 0, 360);
-				break;
-			case CounterHelper.LIST_T_SQUARE:
-				drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
-				g.fillRectangle(drawArea);
-			case CounterHelper.LIST_T_DECIMAL_LEADING_ZERO:
-			case CounterHelper.LIST_T_LOWER_GREEK:
-			case CounterHelper.LIST_T_ARMENIAN:
-			case CounterHelper.LIST_T_GEORGIAN:
-			case CounterHelper.LIST_T_IMAGE:
-			case CounterHelper.LIST_T_NONE:
-			default:
-				drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
-				g.fillRoundRectangle(drawArea, ROUNDRECT_ARC, ROUNDRECT_ARC);
-				break;
-			}
-		}
-		g.popState();
-
-		if (newColor != null) {
-			newColor.dispose();
-		}
-	}
-
-	/**
-	 * @param g
-	 * @return
-	 */
-	private Rectangle getDrawAreaForGraph(int width, int height) {
-		Rectangle drawArea;
-
-		int x = 0;
-		int y = 0;
-
-		List list = _blockBox.getFragments();
-		Rectangle box = _blockBox.toRectangle().getCopy().expand(
-				_blockBox.getBorderPaddingInsets().getAdded(
-						_blockBox.getMarginInsets()));
-		if (list != null && !list.isEmpty()) {
-			LineBox line = (LineBox) list.get(0);
-			y = line.getBaseline() - CIRCLE_DIAMETER;
-			x = box.x;
-		} else {
-			x = box.x;
-			y = box.height / 2 - CIRCLE_DIAMETER;
-		}
-		drawArea = new Rectangle(x - CIRCLE_DIAMETER * 5 / 2, y, width, height);
-		return drawArea;
-	}
-
-	private Point getDrawPointForText(String displayString) {
-		Font font = getCSSStyle().getCSSFont().getSwtFont();
-
-		int x = 0;
-		int y = 0;
-
-		Rectangle box = _blockBox.toRectangle().getCopy().expand(
-				_blockBox.getBorderPaddingInsets().getAdded(
-						_blockBox.getMarginInsets()));
-
-		x = box.x - FigureUtilities.getTextWidth(displayString, font);
-		x = x
-				- (TEXT_PADDING - FigureUtilities.getFontMetrics(font)
-						.getDescent());
-
-		return new Point(x, y);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layoutChildren()
-	 */
-	protected void layoutChildren() {
-		ICounterValueGenerator counter = this.getCSSStyle().findCounter(
-				DEFAULT_LIST_COUNTER, true);
-		if (counter != null) {
-			_count = counter.getCurrentCount();
-		} else {
-			// should not happen.
-			_count = 1; // use 1 as the default value
-		}
-		super.layoutChildren();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSPageFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSPageFlowLayout.java
deleted file mode 100644
index 8662bc2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSPageFlowLayout.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * This layout if for those thigns that it's parent will decide its size. Such
- * as table cell.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CSSPageFlowLayout extends CSSBlockFlowLayout {
-	private Dimension _pageSize = new Dimension();
-
-	private int _recommendedWidth;
-
-	private int _pageSizeCacheKeys[] = new int[4];
-
-	private Dimension _pageSizeCacheValues[] = new Dimension[4];
-
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSPageFlowLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#invalidate()
-	 */
-	public void invalidate() {
-		super.invalidate();
-		_pageSizeCacheKeys = new int[4];
-		_pageSizeCacheValues = new Dimension[4];
-		_pageSize = new Dimension();
-		_recommendedWidth = 0;
-	}
-
-	protected void endBlock() {
-		layoutLines();
-	}
-
-	/**
-	 * TODO: This method is not being called.
-	 */
-	public void postValidate() {
-		Rectangle r = new Rectangle(_blockBox._x, _blockBox._y, _blockBox
-				.getWidth(), _blockBox.getHeight());
-		r = r.expand(getCSSFigure().getInsets());
-		_pageSize.width = r.width;
-		_pageSize.height = r.height;
-
-		List list = getCSSFigure().getChildren();
-		for (int i = 0; i < list.size(); i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-
-	}
-
-	/**
-	 * Setup blockBox to the initial bounds of the Page
-	 */
-	protected void setupBlock() {
-		// Remove all current Fragments
-		_blockBox.clear();
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-		int recommendedWidth = getRecommendedWidth();
-		_blockBox.setRecommendedWidth(recommendedWidth);
-
-		if (recommendedWidth > 0 && recommendedWidth != Integer.MAX_VALUE) {
-			_blockBox.setWidth(recommendedWidth);
-		}
-
-		_blockBox._x = 0;
-	}
-
-	private int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	private void setRecommendedWidth(int width) {
-		if (_recommendedWidth == width) {
-			return;
-		}
-		_recommendedWidth = width;
-		getCSSFigure().invalidate2();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#setBoundsCalled(org.eclipse.jst.pagedesigner.css2.layout.CSSFigure,
-	 *      org.eclipse.draw2d.geometry.Rectangle, boolean)
-	 */
-	public void setBoundsCalled(Rectangle r, boolean invalidate) {
-		super.setBoundsCalled(r, invalidate);
-		CSSFigure figure = getCSSFigure();
-		int newWidth = r.width - figure.getInsets().getWidth();
-		if (invalidate || getRecommendedWidth() != newWidth) {
-			setRecommendedWidth(newWidth);
-			figure.getUpdateManager().addInvalidFigure(figure);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(IFigure container, int width, int h) {
-		if (width >= 0) {
-			width = Math.max(0, width - container.getInsets().getWidth());
-		}
-
-		for (int i = 0; i < 4; i++) {
-			if (_pageSizeCacheKeys[i] == width
-					&& _pageSizeCacheValues[i] != null) {
-				return _pageSizeCacheValues[i];
-			}
-		}
-
-		_pageSizeCacheKeys[3] = _pageSizeCacheKeys[2];
-		_pageSizeCacheKeys[2] = _pageSizeCacheKeys[1];
-		_pageSizeCacheKeys[1] = _pageSizeCacheKeys[0];
-		_pageSizeCacheKeys[0] = width;
-
-		_pageSizeCacheValues[3] = _pageSizeCacheValues[2];
-		_pageSizeCacheValues[2] = _pageSizeCacheValues[1];
-		_pageSizeCacheValues[1] = _pageSizeCacheValues[0];
-
-		// Flowpage must temporarily layout to determine its preferred size
-		int oldWidth = getRecommendedWidth();
-		setRecommendedWidth(width);
-		container.validate();
-		_pageSizeCacheValues[0] = _pageSize.getExpanded(container.getInsets()
-				.getWidth(), container.getInsets().getHeight());
-
-		if (width != oldWidth) {
-			setRecommendedWidth(oldWidth);
-			container.getUpdateManager().addInvalidFigure(container);
-		}
-		return _pageSizeCacheValues[0];
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextFigure.java
deleted file mode 100644
index a78ba8f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextFigure.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.style.StyleUtil;
-import org.eclipse.jst.pagedesigner.viewer.CaretPositionResolver;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSTextFigure extends FlowFigure implements ICSSFigure {
-	private ICSSTextProvider _provider;
-
-	private List _fragments = new ArrayList(1);
-
-	/**
-	 * @param provider
-	 */
-	public CSSTextFigure(ICSSTextProvider provider) {
-		_provider = provider;
-		this.setLayoutManager(createDefaultFlowLayout());
-	}
-
-	public ICSSStyle getCSSStyle() {
-		IFigure parentFigure = this.getParent();
-		if (parentFigure instanceof ICSSFigure) {
-			ICSSStyle style = ((ICSSFigure) parentFigure).getCSSStyle();
-			if (style != null) {
-				return style;
-			}
-		}
-		return DefaultStyle.getInstance();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
-	 */
-	public boolean containsPoint(int x, int y) {
-		if (!super.containsPoint(x, y)) {
-			return false;
-		}
-		List frags = getFragments();
-		for (int i = 0, n = frags.size(); i < n; i++) {
-			if (((FlowBox) frags.get(i)).containsPoint(x, y)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return the default flow layout
-	 * 
-	 */
-	protected FlowFigureLayout createDefaultFlowLayout() {
-		return new CSSTextLayout(this);
-	}
-
-	/**
-	 * Returns the <code>LineBox</code> fragments contained in this InlineFlow
-	 * 
-	 * @return The fragments
-	 */
-	public List getFragments() {
-		return _fragments;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		return getFragments();
-	}
-
-	/**
-	 * @return the text
-	 */
-	public String getText() {
-		return _provider.getTextData();
-	}
-
-	/**
-	 * @see FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		List list = getFragments();
-		FlowBox box;
-		int left = Integer.MAX_VALUE, top = left;
-		int right = Integer.MIN_VALUE, bottom = right;
-		for (int i = 0, n = list.size(); i < n; i++) {
-			box = (FlowBox) list.get(i);
-			left = Math.min(left, box._x);
-			right = Math.max(right, box._x + box._width);
-			top = Math.min(top, box._y);
-			bottom = Math.max(bottom, box._y + box._height);
-		}
-		setBounds(new Rectangle(left, top, right - left, bottom - top));
-		list = getChildren();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintBorder(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintBorder(Graphics graphics) {
-		if (Debug.DEBUG_TEXTBORDER) {
-			if (_fragments != null) {
-				graphics.setForegroundColor(ColorConstants.darkBlue);
-				for (int i = 0, size = _fragments.size(); i < size; i++) {
-					FlowBox box = (FlowBox) _fragments.get(i);
-					BoxUtil.drawBox(graphics, box);
-				}
-				graphics.restoreState();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		Object result = this.getCSSStyle().getColor();
-		Color color;
-		if (result instanceof Color) {
-			color = (Color) result;
-		} else if (result instanceof RGB) {
-			color = new Color(null, (RGB) result);
-		} else {
-			color = null;
-		}
-		int[] range = null;
-		if (!StyleUtil.isInWidget(this.getCSSStyle())) {
-			range = _provider.getSelectedRange();
-		}
-		if (range == null || range[0] == range[1]) {
-			// we are not in selection
-			TextLayoutSupport.paintTextFigure(g, _fragments, getCSSStyle()
-					.getCSSFont().getSwtFont(), color, ((Integer) getCSSStyle()
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
-					.intValue());
-		} else {
-			//Bug 191539 - [WPE] non-standard selection color in Web Page Editor
-			TextLayoutSupport.paintTextFigureWithSelection(g, _fragments,
-					_provider.getTextData(), getCSSStyle().getCSSFont()
-							.getSwtFont(), color, ((Integer) getCSSStyle()
-							.getStyleProperty(
-									ICSSPropertyID.ATTR_TEXTDECORATION))
-							.intValue(), range[0], range[1],
-					ColorConstants.white, Display.getDefault().getSystemColor(SWT.COLOR_LIST_SELECTION));
-		}
-		if (color != result && color != null) {
-			color.dispose();
-		}
-	}
-
-	/**
-	 * Find out lines which has closer y coordinate to point, and then line
-	 * which has closer x coordinate.
-	 * 
-	 * @param relative
-	 * @return return the offset
-	 */
-    // TODO: refactoring?
-	public int getNewInsertionOffset(Point relative) {
-		TextFragmentBox closestBox = null;
-		// if there is one which are at the same line with relative, calculate
-		// that line first;
-		for (int i = 0, n = _fragments.size(); i < n; i++) {
-			TextFragmentBox box = (TextFragmentBox) _fragments.get(i);
-			if (box.containsPoint(relative.x, relative.y)) {
-				int index = FlowUtilities.getTextInWidth(box.getTextData(),
-						getCSSStyle().getCSSFont().getSwtFont(), relative.x
-								- box._x, TextLayoutSupport
-								.getAverageCharWidth(box));
-				return box._offset + index;
-			}
-            if (closestBox == null) {
-            	closestBox = box;
-            } else {
-            	// box is above point
-            	TextFragmentBox tempBox = box;
-            	int offset1 = Math
-            			.abs(CaretPositionResolver.getYDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	tempBox = closestBox;
-            	int offset2 = Math
-            			.abs(CaretPositionResolver.getYDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-            // at the same line
-            if (box.containsPoint(box._x, relative.y)) {
-            	TextFragmentBox tempBox = box;
-            	int offset1 = Math
-            			.abs(CaretPositionResolver.getXDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	tempBox = closestBox;
-            	int offset2 = Math
-            			.abs(CaretPositionResolver.getXDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-		}
-
-		if (closestBox.containsPoint(closestBox._x, relative.y)
-				|| closestBox.containsPoint(relative.x, closestBox._y)) {
-			int offset = relative.x - closestBox._x;
-			int index = FlowUtilities.getTextInWidth(closestBox.getTextData(),
-					getCSSStyle().getCSSFont().getSwtFont(), offset,
-					TextLayoutSupport.getAverageCharWidth(closestBox));
-			return closestBox._offset + index;
-		}
-        return -1;
-	}
-
-	/**
-	 * @param relative
-	 * @return the insertion offset
-	 */
-	public int getInsertionOffset(Point relative) {
-		for (int i = 0, n = _fragments.size(); i < n; i++) {
-			TextFragmentBox box = (TextFragmentBox) _fragments.get(i);
-			if (box.containsPoint(relative.x, relative.y)) {
-				int index = FlowUtilities.getTextInWidth(box.getTextData(),
-						getCSSStyle().getCSSFont().getSwtFont(), relative.x
-								- box._x, TextLayoutSupport
-								.getAverageCharWidth(box));
-				return box._offset + index;
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * the returned rectangle will be relative to this text figure.
-	 * 
-	 * @param offset
-	 * @return the caret position
-	 */
-	public Rectangle calculateCaretPosition(int offset) {
-		// search reverse order, find the latest box that has _offset small than
-		// the specified one
-		if (offset > 0) {
-			for (int i = _fragments.size() - 1; i >= 0; i--) {
-				TextFragmentBox box = (TextFragmentBox) _fragments.get(i);
-				if (box._offset <= offset) {
-					// ok, we find the box.
-					if (box._offset + box._length < offset) {
-						return new Rectangle(box._x + box._width, box._y, 1,
-								box._height);
-					}
-                    String s = box.getTextData().substring(0,
-                    		offset - box._offset);
-                    int width = FlowUtilities.getTextExtents(s,
-                    		getCSSStyle().getCSSFont().getSwtFont()).width;
-                    return new Rectangle(box._x + width, box._y, 1,
-                    		box._height);
-				}
-			}
-		} else {
-			if (_fragments.size() > 0) {
-				TextFragmentBox box = (TextFragmentBox) _fragments.get(0);
-				return new Rectangle(box._x, box._y, 1, box._height);
-			}
-		}
-		// should only reach here when there is no fragments.
-		return new Rectangle(getBounds().x, getBounds().y, 1, getBounds().height);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextLayout.java
deleted file mode 100644
index 30589f7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextLayout.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.swt.graphics.Font;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-// NOTE: CSSTextLayout does not extends CSSFlowLayout. Since text is a little
-// special,
-// we don't want to do things like "preLayout()" as in CSSFlowLayout.
-public class CSSTextLayout extends FlowFigureLayout {
-	/**
-	 * Wrapping will ONLY occur at valid line breaks
-	 */
-	public static final int WORD_WRAP_HARD = 0;
-
-	/**
-	 * Wrapping will always occur at the end of the available space, breaking in
-	 * the middle of a word.
-	 */
-	public static final int WORD_WRAP_SOFT = 1;
-
-	/**
-	 * Wrapping will always occur at the end of available space, truncating a
-	 * word if it doesn't fit.
-	 */
-	// don't support this flag
-	// public static final int WORD_WRAP_TRUNCATE = 2;
-	private int _wrappingStyle = WORD_WRAP_HARD;
-
-	/**
-	 * @param textfigure
-	 */
-	public CSSTextLayout(CSSTextFigure textfigure) {
-		super(textfigure);
-	}
-
-	// --------------------------------------------------------------------------------------------------
-	FlowBox findLastNonLineBox(LineBox box) {
-		List fragments = box.getFragments();
-		for (int i = fragments.size() - 1; i >= 0; i--) {
-			FlowBox item = (FlowBox) fragments.get(i);
-			if (item instanceof LineBox) {
-				FlowBox found = findLastNonLineBox((LineBox) item);
-				if (found != null) {
-					return found;
-				}
-			} else {
-				return item;
-			}
-		}
-		return null;
-	}
-
-	// boolean isElementContentWhitespaceEnding()
-	// {
-	// if (!this._context.isCurrentLineOccupied())
-	// return true;
-	// LineBox line = this._context.getCurrentLine();
-	// FlowBox lastNoneLinebox = findLastNonLineBox(line);
-	// if (lastNoneLinebox instanceof TextFragmentBox)
-	// return ((TextFragmentBox) lastNoneLinebox)._isLastCharWhitespace;
-	// else
-	// return true;
-	// }
-	//
-	// String normalize(String text)
-	// {
-	// text = EntityMap.translateAndCompact(text);
-	// if (text.length() > 0 &&
-	// Character.isElementContentWhitespace(text.charAt(0)) &&
-	// isElementContentWhitespaceEnding())
-	// return text.substring(1);
-	// else
-	// return text;
-	// }
-
-	private void layoutEmptyString(List fragments, Font font) {
-		// empty node! we want to create a fake fragment, so things can be
-		// consistent
-		// that all the CSSTextFigure will have something inside, also in this
-		// way, even
-		// empty text node will have a position, thus we can support showing
-		// caret associated
-		// with this text figure.
-		fragments.clear();
-		TextFragmentBox box = TextLayoutSupport.getFragment(0, fragments);
-		box._length = 0;
-		box._offset = 0;
-		box._height = 0;
-		box._width = 0;
-		box.setTextData(""); //$NON-NLS-1$
-
-		// {following comments deprecated XXX: If is empty string, we only want
-		// to this figure to have a size, but don't
-		// want to it to be added into current line. Otherwise, a line with only
-		// a empty string
-		// will also take a line's space.}
-
-		// please reference LineBox.isOccupied()
-		// now we treat a line with only an empty text as not occupied.
-		getFlowContext().getCurrentLine().add(box);
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layout() {
-		CSSTextFigure flowFigure = (CSSTextFigure) getFlowFigure();
-
-		List fragments = flowFigure.getFragments();// Reuse the previous List
-		// of fragments
-		String text = flowFigure.getText();
-		Font font = flowFigure.getCSSStyle().getCSSFont().getSwtFont();
-		Object whitespace = flowFigure.getCSSStyle().getStyleProperty(
-				ICSSPropertyID.ATTR_WHITESPACE);
-
-		if (whitespace == ICSSPropertyID.VAL_PRE) {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else
-				TextLayoutSupport.layoutNoWrap(getFlowContext(), text,
-						fragments, font);
-		} else if (whitespace == ICSSPropertyID.VAL_NOWRAP) {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else
-				TextLayoutSupport.layoutNoWrap(getFlowContext(), text,
-						fragments, font);
-		} else {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else {
-				//fix for bug #221629 - BEGIN
-				boolean useShouldTrimLeadingWSInlineMethod = false;
-				IFigure parentFigure = flowFigure.getParent();
-				if (parentFigure instanceof CSSFigure) {
-					ICSSStyle style = ((CSSFigure)parentFigure).getCSSStyle();
-					if (style instanceof AbstractStyle) {
-						Element element = ((AbstractStyle)style).getElement();
-						if (element != null &&
-								element.getNodeName().equals(IHTMLConstants.TAG_SPAN)) {
-							useShouldTrimLeadingWSInlineMethod = true;
-						}
-					}
-				}
-				boolean trimLeadingChar;
-				if (!useShouldTrimLeadingWSInlineMethod) {
-					trimLeadingChar = (text.charAt(0) == ' ' && shouldTrimLeadingWhitespace(getFlowContext()));
-				} else {
-					trimLeadingChar = (text.charAt(0) == ' ' && shouldTrimLeadingWhitespaceInline(getFlowContext()));
-				}
-				//fix for bug #221629 - END
-				TextLayoutSupport.layoutNormal(getFlowContext(), text,
-						fragments, font, _wrappingStyle, trimLeadingChar);
-			}
-		}
-	}
-
-	/**
-	 * @param context
-	 * @return true if should trim leading whitespace
-	 */
-    // XXX: maybe should move to TextSupport later.
-	public boolean shouldTrimLeadingWhitespace(FlowContext context) {
-		if (!context.isCurrentLineOccupied()) {
-			return true;
-		}
-		while (context instanceof CSSInlineFlowLayout) {
-			context = ((CSSInlineFlowLayout) context).getFlowContext();
-		}
-		LineBox line = context.getCurrentLine();
-		if (line == null || !line.isOccupied()) {
-			return true;
-		}
-		FlowBox lastNoneLinebox = findLastNonLineBox(line);
-		if (lastNoneLinebox == null || lastNoneLinebox.getWidth() == 0) {
-			return true;
-		} else if (lastNoneLinebox instanceof TextFragmentBox) {
-			return ((TextFragmentBox) lastNoneLinebox)._isLastCharWhitespace;
-		} else {
-			return false;
-		}
-	}
-
-	/**
-	 * Used instead of shouldTrimLeadingWhitespace(FlowContext) if parent
-	 * figure's style is for an appropriate in-line element, such as "span".
-	 * 
-	 * @param context FlowContext instance.
-	 * @return true if should trim leading whitespace, else false.
-	 */
-	private boolean shouldTrimLeadingWhitespaceInline(FlowContext context) {
-		if (!context.isCurrentLineOccupied()) {
-			return true;
-		}
-		LineBox line = context.getCurrentLine();
-		if (line == null || !line.isOccupied()) {
-			return true;
-		}
-		FlowBox lastNoneLinebox = findLastNonLineBox(line);
-		if (lastNoneLinebox == null || lastNoneLinebox.getWidth() == 0) {
-			return true;
-		} else if (lastNoneLinebox instanceof TextFragmentBox) {
-			return ((TextFragmentBox) lastNoneLinebox)._isLastCharWhitespace;
-		} else {
-			return false;
-		}
-	}
-
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSWidgetLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSWidgetLayout.java
deleted file mode 100644
index 8e50123..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSWidgetLayout.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-
-/**
- * @author mengbo
- */
-public class CSSWidgetLayout extends CSSBlockFlowLayout implements ICSSPainter {
-	private WidgetBox _widgetBox;
-
-	private ICSSWidgetProvider _provider;
-
-	/**
-	 * @param flowfigure
-	 * @param provider 
-	 */
-	public CSSWidgetLayout(CSSFigure flowfigure, ICSSWidgetProvider provider) {
-		super(flowfigure);
-		_provider = provider;
-	}
-
-	/**
-	 * normally this method is called directly after constructor
-	 * 
-	 * @param provider
-	 */
-	public void setProvider(ICSSWidgetProvider provider) {
-		_provider = provider;
-	}
-
-	/**
-	 * @return the provider
-	 */
-	public ICSSWidgetProvider getProvider() {
-		// return ((CSSWidgetFigure)this.getFlowFigure()).getProvider();
-		return _provider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#isInlineBlock()
-	 */
-	public boolean isInlineBlock() {
-		ICSSWidgetProvider provider = getProvider();
-		return provider.isInline();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layoutChildren() {
-		ICSSWidgetProvider provider = getProvider();
-
-		// if we did endLine, then will result in context create a new line, so
-		// we may in the new line now.
-		// passing in the top margin, and context will consider that when
-		// creating the new line.
-
-		int suggestedWith = _blockBox.getContentWidth();
-		int suggestedHeight = _blockBox.getContentHeight();
-		// int suggestedWith = getSuggestedWidth(line, style, provider);
-		// int suggestedHeight = getSuggestedHeight(line, style, provider);
-
-		DimensionInfo resultInfo = provider.getPreferredDimension(
-				suggestedWith, suggestedHeight);
-		Dimension resultSize = resultInfo.getDimension();
-
-		_widgetBox = new WidgetBox(); // ((CSSWidgetFigure)getFlowFigure()).getWidgetBox();
-		// if (provider.isHandlingBorder() || style == null)
-		// {
-		_widgetBox.setWidth(resultSize.width);
-		_widgetBox.setHeight(resultSize.height);
-		_widgetBox.setAscent(resultInfo.getAscent());
-		// }
-		// else
-		// {
-		// widgetBox.setWidth(resultSize.width +
-		// style.getBorderInsets().getWidth());
-		// widgetBox.setHeight(resultSize.height +
-		// style.getBorderInsets().getHeight());
-		// widgetBox.setAscent(resultInfo.getAscent()+style.getBorderInsets().top);
-		// }
-		this.addToCurrentLine(_widgetBox);
-		// if (!provider.isInline())
-		// {
-		// context.endLine();
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-
-	// public int getSuggestedWidth(LineBox line, ICSSStyle style,
-	// ICSSWidgetProvider provider)
-	// {
-	// if (style == null) return -1;
-	//
-	// Object width = style.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
-	// Length recommendedWidth = (width instanceof Length) ? (Length) width :
-	// null;
-	//
-	// int rw = 0;
-	// if (recommendedWidth == null || recommendedWidth.getValue() <= 0)
-	// {
-	// return -1;
-	// }
-	// else
-	// {
-	// if (recommendedWidth.isPercentage())
-	// {
-	// rw = line.getAvailableWidth() * recommendedWidth.getValue() / 100;
-	// }
-	// else
-	// {
-	// rw = recommendedWidth.getValue();
-	// }
-	//
-	// if (!style.isSizeIncludeBorderPadding() && provider.isHandlingBorder())
-	// {
-	// rw += style.getBorderInsets().getWidth() +
-	// style.getPaddingInsets().getWidth();
-	// }
-	// else if (style.isSizeIncludeBorderPadding() &&
-	// !provider.isHandlingBorder())
-	// {
-	// rw -= style.getBorderInsets().getWidth() +
-	// style.getPaddingInsets().getWidth();
-	// }
-	// }
-	//
-	// return rw;
-	// }
-	//
-	// public int getSuggestedHeight(LineBox line, ICSSStyle style,
-	// ICSSWidgetProvider provider)
-	// {
-	// if (style == null) return -1;
-	//
-	// Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-	// Length recommendedHeight = (height instanceof Length) ? (Length) height :
-	// null;
-	//
-	// int rh = 0;
-	// if (recommendedHeight == null || recommendedHeight.getValue() <= 0)
-	// {
-	// return -1;
-	// }
-	// else
-	// {
-	// if (recommendedHeight.isPercentage())
-	// {
-	// // we don't support percentage height for this version, ignore
-	// return -1;
-	// }
-	// else
-	// {
-	// rh = recommendedHeight.getValue();
-	// }
-	//
-	// if (!style.isSizeIncludeBorderPadding() && provider.isHandlingBorder())
-	// {
-	// rh += style.getBorderInsets().getHeight() +
-	// style.getPaddingInsets().getHeight();
-	// }
-	// else if (style.isSizeIncludeBorderPadding() &&
-	// !provider.isHandlingBorder())
-	// {
-	// rh -= style.getBorderInsets().getHeight() +
-	// style.getPaddingInsets().getHeight();
-	// }
-	// }
-	//
-	// return rh;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	public void paintFigure(Graphics g) {
-		ICSSWidgetProvider provider = this.getProvider();
-		if (provider != null && _widgetBox != null) {
-			provider.paintFigure(g, new Rectangle(_widgetBox._x, _widgetBox._y,
-					_widgetBox.getWidth(), _widgetBox.getHeight()));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#handlingBorderForBlock()
-	 */
-	public boolean handlingBorderForBlock() {
-		ICSSWidgetProvider provider = this.getProvider();
-		if (provider != null) {
-			return provider.isHandlingBorder();
-		}
-		return super.handlingBorderForBlock();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CompositeBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CompositeBox.java
deleted file mode 100644
index 75d6a0e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CompositeBox.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A FlowBox that can contain other BlockInfos. The contained BlockInfos are
- * called <i>fragments </i>.
- * 
- * @author mengbo
- * @since 2.1
- */
-public abstract class CompositeBox extends FlowBox {
-
-	/**
-	 * The contained fragments.
-	 */
-	protected List _fragments = new ArrayList();
-
-	int _recommendedWidth;
-
-	int _recommendedHeight;
-
-	/**
-	 * Adds the specified FlowBox. Updates the width, height, and ascent
-	 * properties.
-	 * 
-	 * @param block
-	 *            the FlowBox being added
-	 */
-	public void add(FlowBox block) {
-		// The order is critical.see the first "if" block in the unionInfo()
-		// method.
-		unionInfo(block);
-		_fragments.add(block);
-	}
-
-	/**
-	 * Removes all owned fragments and invalidates this CompositeBox.
-	 */
-	public void clear() {
-		_fragments.clear();
-		resetInfo();
-	}
-
-	/**
-	 * Overridden to ensure that the CompositeBox is valid.
-	 * 
-	 * @see FlowBox#getBounds()
-	 */
-	// public Rectangle getBounds() {
-	// validate();
-	// return this;
-	// }
-	/**
-	 * @return the List of fragments
-	 */
-	public List getFragments() {
-		return _fragments;
-	}
-
-	/**
-	 * Returns the recommended width for this CompositeBox.
-	 * 
-	 * @return the recommended width
-	 */
-	public int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	/**
-	 * resets fields before unioning the data from the fragments.
-	 */
-	protected void resetInfo() {
-		_width = _height = 0;
-	}
-
-	/**
-	 * Sets the recommended width for this CompositeBox.
-	 * 
-	 * @param w
-	 *            the width
-	 */
-	public void setRecommendedWidth(int w) {
-		_recommendedWidth = w;
-	}
-
-	/**
-	 * @param h
-	 */
-	public void setRecommendedHeight(int h) {
-		_recommendedHeight = h;
-	}
-
-	/**
-	 * unions the fragment's width, height, and ascent into this composite.
-	 * 
-	 * @param box
-	 *            the fragment
-	 */
-	protected void unionInfo(FlowBox box) {
-		int right = Math.max(_x + _width, box._x + box._width);
-		int bottom = Math.max(_y + _height, box._y + box._height);
-		_x = Math.min(_x, box._x);
-		_y = Math.min(_y, box._y);
-		_width = right - _x;
-		_height = bottom - _y;
-	}
-
-	/**
-	 * @return the content width
-	 */
-	public int getContentWidth() {
-		return getWidth() - getBorderPaddingWidth();
-	}
-
-	/**
-	 * @return the content height
-	 */
-	public int getContentHeight() {
-		return getHeight() - getBorderPaddingHeight();
-	}
-
-	/**
-	 * @return the recommended content width
-	 */
-	public int getRecommendedContentWidth() {
-		return Math.max(0, getRecommendedWidth() - getBorderPaddingWidth());
-	}
-	//
-	// public int getRecommendedContentHeight()
-	// {
-	// return Math.max(0, getRecommendedHeight() - getBorderPaddingHeight());
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/Debug.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/Debug.java
deleted file mode 100644
index f83e901..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/Debug.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * Debug constants.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class Debug {
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_BASELINE = false;
-
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_BOX = false;
-
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_BORDERPADDING = false;
-
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_TEXTBORDER = false;
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/DisplayToLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/DisplayToLayout.java
deleted file mode 100644
index ed02c84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/DisplayToLayout.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTRGroupLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTRLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableCaptionLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableCellLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.PositionMeta;
-
-/**
- * @author mengbo
- */
-public final class DisplayToLayout {
-	/**
-	 * @param figure
-	 * @param display
-	 * @param old
-	 * @return the layout
-	 */
-	public static CSSLayout displayToLayout(CSSFigure figure, String display,
-			LayoutManager old) {
-		if ("block".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSBlockFlowLayout(figure);
-		} else if ("inline".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSInlineFlowLayout(figure);
-		} else if ("table".equalsIgnoreCase(display) || "inline-table".equalsIgnoreCase(display)) //$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
-		{
-			return new CSSTableLayout2(figure);
-		} else if ("table-row".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTRLayout(figure);
-		} else if ("table-row-group".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "table-header-group".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "table-footer-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTRGroupLayout(figure);
-		} else if ("table-cell".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTableCellLayout(figure);
-		} else if (display.equalsIgnoreCase("table-caption")) //$NON-NLS-1$
-		{
-			return new CSSTableCaptionLayout(figure);
-		} else if ("inline-block".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSBlockFlowLayout(figure) {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#isInlineBlock()
-				 */
-				public boolean isInlineBlock() {
-					return true;
-				}
-			};
-		} else if (ICSSPropertyID.VAL_LIST_ITEM.equalsIgnoreCase(display)) {
-			return new CSSListItemLayout(figure);
-		}
-		return null;
-	}
-
-	/**
-	 * @param display 
-	 * @return true if is inline
-	 */
-	public static boolean isInline(String display) {
-		return "inline".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "inline-block".equalsIgnoreCase(display); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param style
-	 * @return true if is positioned
-	 */
-	public static boolean isPositioned(ICSSStyle style) {
-		Object position = style.getStyleProperty(ICSSPropertyID.ATTR_POSITION);
-		if (PositionMeta.STATIC.equalsIgnoreCase((String) position)) {
-			return false;
-		}
-        return true;
-	}
-	
-	private DisplayToLayout()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FigureUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FigureUtil.java
deleted file mode 100644
index 56d775c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FigureUtil.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Translatable;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public  final class FigureUtil {
-	/**
-	 * @param figure
-	 * @param t
-	 */
-    // XXX:
-    // seemed Figure.translateToRelative is bug?
-	public static final void translateToRelative(IFigure figure, Translatable t) {
-		if (figure.getParent() != null) {
-			translateToRelative(figure.getParent(), t);
-			// figure.getParent().translateToRelative(t);
-			figure.translateFromParent(t);
-		}
-	}
-
-	/**
-	 * @param figure
-	 * @param t
-	 */
-    // XXX:
-    // seemed Figure.translateToAbsolute is bug?
-	public static final void translateToAbsolute(IFigure figure, Translatable t) {
-		if (figure.getParent() != null) {
-			figure.translateToParent(t);
-			translateToAbsolute(figure.getParent(), t);
-			// figure.getParent().translateToAbsolute(t);
-		}
-
-	}
-	
-	private FigureUtil()
-	{
-	    // util class.  No instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowBox.java
deleted file mode 100644
index 52b3765..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowBox.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * This class represents the CSS box model. See chapter 8 of CSS2 spec.
- * 
- * see http://www.w3.org/TR/REC-CSS2/box.html
- * 
- */
-public class FlowBox {
-	private Object _verticalAlignData = null;
-
-	/**
-	 * The x location
-	 */
-	protected int _x;
-
-	/**
-	 * The y location
-	 */
-	protected int _y;
-
-	int _width;
-
-	int _height;
-
-	private Insets _marginInsets = new Insets();
-
-	private Insets _borderInsets = new Insets();
-
-	private Insets _paddingInsets = new Insets();
-
-	/**
-	 * This method must be called on a block that is completely positioned and
-	 * committed.
-	 * 
-	 * @param x
-	 *            X
-	 * @param y
-	 *            Y
-	 * @return <code>true</code> if the FlowBox contains the point
-	 */
-	public boolean containsPoint(int x, int y) {
-		return x >= this._x && y >= this._y && x < this._x + this._width
-				&& y < this._y + this._height;
-	}
-
-	/**
-	 * By default, a FlowBox is all ascent, and no descent, so the height is
-	 * returned.
-	 * 
-	 * @return the <i>ascent </i> in pixels above the baseline
-	 */
-	public int getAscent() {
-		return getHeight();
-	}
-
-
-	/**
-	 * By default, a simple FlowBox is all ascent, and no descent. Zero is
-	 * returned.
-	 * 
-	 * @return the <i>descent </i> in pixels below the baseline
-	 */
-	public final int getDescent() {
-		return getHeight() - getAscent();
-	}
-
-	/**
-	 * Returns the height
-	 * 
-	 * @return height
-	 */
-	public int getHeight() {
-		return _height;
-	}
-
-	/**
-	 * Returns the width
-	 * 
-	 * @return width
-	 */
-	public int getWidth() {
-		return _width;
-	}
-
-	/**
-	 * @param w
-	 */
-	public void setWidth(int w) {
-		_width = w;
-	}
-
-	/**
-	 * @param h
-	 */
-	public void setHeight(int h) {
-		_height = h;
-	}
-
-	/**
-	 * Used to set the baseline of this FlowBox to the specified value.
-	 * 
-	 * @param value
-	 *            the new baseline
-	 */
-	public void makeBaseline(int value) {
-		_y = (value - getAscent());
-	}
-
-	/**
-	 * @return the border padding width
-	 */
-	public int getBorderPaddingWidth() {
-		return _borderInsets.getWidth() + _paddingInsets.getWidth();
-	}
-
-	/**
-	 * @return the border padding height
-	 */
-	public int getBorderPaddingHeight() {
-		return _borderInsets.getHeight() + _paddingInsets.getHeight();
-	}
-
-	/**
-	 * @return the border padding insets
-	 */
-	public Insets getBorderPaddingInsets() {
-		Insets temp = new Insets(_borderInsets);
-		return temp.add(_paddingInsets);
-	}
-
-	/**
-	 * @param rect
-	 */
-	public void setXYWidthHeight(Rectangle rect) {
-		this._x = rect.x;
-		this._y = rect.y;
-		this.setWidth(rect.width);
-		this.setHeight(rect.height);
-	}
-
-	/**
-	 * @return Returns the _verticalAlignData.
-	 */
-	public Object getVerticalAlignData() {
-		return _verticalAlignData;
-	}
-
-	/**
-	 * @param alignData
-	 *            The _verticalAlignData to set.
-	 */
-	public void setVerticalAlignData(Object alignData) {
-		_verticalAlignData = alignData;
-	}
-
-	/**
-	 * @return a copy of the rectangle
-	 * TODO: use getCopy() ?
-	 */
-	public Rectangle getRectangle() {
-		return new Rectangle(this._x, this._y, this.getWidth(), this
-				.getHeight());
-	}
-
-    /**
-     * @return the x coordinate
-     */
-    public final int getX() {
-        return _x;
-    }
-
-    /**
-     * @return the y coordinate
-     */
-    public final int getY() {
-        return _y;
-    }
-
-    /**
-     * @param y
-     */
-    protected void setY(int y)
-    {
-        _y = y;
-    }
-    
-    /**
-     * @return the margin insets
-     */
-    public final Insets getMarginInsets() {
-        return _marginInsets;
-    }
-
-    final void setMarginInsets(Insets marginInsets) {
-        _marginInsets = marginInsets;
-    }
-
-    final Insets getBorderInsets() {
-        return _borderInsets;
-    }
-
-    final void setBorderInsets(Insets borderInsets)
-    {
-        _borderInsets = borderInsets;
-    }
-    
-    final Insets getPaddingInsets() {
-        return _paddingInsets;
-    }
-	
-	final void setPaddingInsets(Insets paddingInsets)
-	{
-	    _paddingInsets = paddingInsets;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContainerLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContainerLayout.java
deleted file mode 100644
index ca43353..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContainerLayout.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-
-/**
- * A layout for FlowFigures with children.
- * <P>
- * WARNING: This class is not intended to be subclassed by clients.
- * 
- * @author mengbo
- * @since 2.1
- */
-public abstract class FlowContainerLayout extends FlowFigureLayout implements
-		FlowContext {
-//	private static Logger _log = PDPlugin.getLogger(FlowContainerLayout.class);
-
-	/**
-	 * the current line
-	 */
-	protected LineBox _currentLine;
-
-	private boolean _calculatingMaxWidth;
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#FlowFigureLayout(FlowFigure)
-	 */
-	protected FlowContainerLayout(FlowFigure flowFigure) {
-		super(flowFigure);
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#addToCurrentLine(FlowBox)
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-	}
-
-	/**
-	 * Used by getCurrentLine().
-	 */
-	protected abstract void createNewLine();
-
-	/**
-	 * Used by getCurrentLine(int topmargin)
-	 * 
-	 * @param topMargin
-	 */
-	protected void createNewLine(int topMargin) {
-		createNewLine();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine()
-	 */
-	public LineBox getCurrentLine() {
-		if (_currentLine == null)
-			createNewLine();
-		return _currentLine;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine(int)
-	 */
-	public LineBox getCurrentLine(int topMargin) {
-		if (_currentLine == null) {
-			createNewLine(topMargin);
-		}
-		// if the current line only contains an empty string, reset the current
-		// line using the given margin.
-		else if (_currentLine.isEmptyStringLine()) {
-			List list = _currentLine.getFragments();
-			createNewLine(topMargin);
-			_currentLine._fragments.addAll(list);
-		}
-		return _currentLine;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCurrentLineOccupied
-	 */
-	public boolean isCurrentLineOccupied() {
-		return _currentLine != null && _currentLine.isOccupied();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layout() {
-		preLayout();
-		layoutChildren();
-		flush();
-		cleanup();
-	}
-
-	/**
-	 * Layout all children.
-	 */
-	protected void layoutChildren() {
-		List children = getFlowFigure().getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			Figure f = (Figure) children.get(i);
-			f.invalidate();
-			f.validate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getLastMarginRight()
-	 */
-	public int getLastMarginRight() {
-		if (_currentLine == null || !_currentLine.isOccupied()) {
-			return 0;
-		}
-		FlowBox box = (FlowBox) _currentLine.getFragments().get(
-				_currentLine.getFragments().size() - 1);
-		if (box != null) {
-			return box.getMarginInsets().right;
-		}
-        return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		if (_calculatingMaxWidth) {
-			return true;
-		} else if (this.getFlowContext() == null) {
-			return false;
-		} else {
-			return this.getFlowContext().isCalculatingMaxWidth();
-		}
-	}
-
-	/**
-	 * Called before layoutChildren() to setup any necessary state.
-	 */
-	protected abstract void preLayout();
-
-	/**
-	 * Called after {@link #layoutChildren()}when all children have been laid
-	 * out. This method exists to flush the last line.
-	 */
-	protected abstract void flush();
-
-	/**
-	 * Flush anything pending and free all temporary data used during layout.
-	 */
-	protected abstract void cleanup();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContext.java
deleted file mode 100644
index bdd4e51..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContext.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * Copied from draw2d. Enhanced to meet page designer's needs. The context that
- * a {@link FlowFigureLayout}uses to perform its layout.
- * <P>
- * WARNING: This interface is not intended to be implemented by clients. It
- * exists to define the API between the layout and its context.
- */
-public interface FlowContext {
-
-	/**
-	 * Adds the given box into the current line.
-	 * 
-	 * @param box
-	 *            the FlowBox to add
-	 */
-	void addToCurrentLine(FlowBox box);
-
-	/**
-	 * The current line should be committed if it is occupied, and then set to
-	 * <code>null</code>. Otherwise, do nothing.
-	 */
-	void endLine();
-
-	/**
-	 * Obtains the current line, creating a new line if there is no current
-	 * line. if create a new line, the new line's x will be set correctly
-	 * without considering the new element's left margin. Also, if create new
-	 * line, it will treat as the new line's top margin is 0.
-	 * 
-	 * @return the current line
-	 */
-	LineBox getCurrentLine();
-
-	/**
-	 * if create a new line, the new line's x will be set correctly without
-	 * considering the new element's left margin.
-	 * 
-	 * @param topMargin
-	 * @return the current line
-	 */
-	LineBox getCurrentLine(int topMargin);
-
-	/**
-	 * Returns the current Y value.
-	 * 
-	 * @return the current Y value
-	 */
-	int getCurrentY();
-
-	/**
-	 * @return <code>true</code> if the current line contains any fragments
-	 */
-	boolean isCurrentLineOccupied();
-
-	/**
-	 * @return the last margin right coord
-	 */
-	int getLastMarginRight();
-
-	/**
-	 * when layout table, we need to calculate max width of a cell. This is done
-	 * by don't break line (other than explicit required). Currently, the
-	 * solution is to make the recommended width to be very big, and when create
-	 * block element we don't set the block element's size to be recommended
-	 * width. Please see CSSBlockFlowLayout
-	 * 
-	 * @return true if is calculating max width
-	 */
-	boolean isCalculatingMaxWidth();
-
-	/**
-	 * when calculating percentage width, we need the container width
-	 * 
-	 * @return container width
-	 */
-	int getContainerWidth();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigure.java
deleted file mode 100644
index 7b52ca5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigure.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * The base implementation for text flow figures. A flow figure is used to
- * render a document in which elements are laid out horizontally within a "line"
- * until that line is filled. Layout continues on the next line.
- * <p>
- * WARNING: This class is not intended to be subclassed by clients. Future
- * versions may contain additional abstract methods.
- * 
- * @author mengbo
- * @since 2.1
- */
-public abstract class FlowFigure extends Figure {
-
-	// static final boolean SHOW_BASELINE = true;
-
-	/**
-	 * Constructs a new FlowFigure.
-	 */
-	public FlowFigure() {
-		// setLayoutManager(createDefaultFlowLayout());
-	}
-
-	/**
-	 * If the child is a <code>FlowFigure</code>, its FlowContext is passed
-	 * to it.
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#add(IFigure, Object, int)
-	 */
-	public void add(IFigure child, Object constraint, int index) {
-		super.add(child, constraint, index);
-		if (child instanceof FlowFigure) {
-			FlowFigure ff = (FlowFigure) child;
-			if (getLayoutManager() instanceof FlowContext) {
-				ff.setOriginalFlowContext((FlowContext) getLayoutManager());
-			} else {
-				PDPlugin.getLogger(this.getClass()).error("layout is not FlowContext", new Throwable("This exception is artificial so  we can get a stack trace")); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-	}
-
-	/**
-	 * Creates the default layout manager
-	 * 
-	 * @return The default layout
-	 */
-	// protected abstract FlowFigureLayout createDefaultFlowLayout();
-	/**
-	 * @see Figure#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		super.paintFigure(g);
-		// g.drawRectangle(getBounds().getResized(-1,-1));
-	}
-
-	/**
-	 * Called after validate has occurred. This is used to update the bounds of
-	 * the FlowFigure to encompass its new flow boxed created during validate.
-	 */
-	public abstract void postValidate();
-
-	/**
-	 * FlowFigures override setBounds() to prevent translation of children.
-	 * "bounds" is a derived property for FlowFigures, calculated from the
-	 * fragments that make up the FlowFigure.
-	 * 
-	 * @see Figure#setBounds(Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r))
-			return;
-		erase();
-		bounds.x = r.x;
-		bounds.y = r.y;
-		bounds.width = r.width;
-		bounds.height = r.height;
-		fireFigureMoved();
-		repaint();
-	}
-
-	/**
-	 * Sets the flow context.
-	 * 
-	 * @param flowContext
-	 *            the flow context for this flow figure
-	 */
-	public void setOriginalFlowContext(FlowContext flowContext) {
-		((FlowFigureLayout) getLayoutManager())
-				.setOriginalFlowContext(flowContext);
-	}
-
-	public String toString() {
-		if (_displayString == null)
-        {
-			return super.toString();
-        }
-        return _displayString + " " + getClass().getName(); //$NON-NLS-1$
-	}
-
-	private String _displayString; // for debug
-
-	/**
-	 * @return the flow context
-	 */
-	public FlowContext getFlowContext() {
-		return ((FlowFigureLayout) getLayoutManager()).getFlowContext();
-	}
-
-	// ----------------------------------------------------------------------
-	// as absolute positioning and relative positioning may have children
-	// out-side
-	// of parent bounds, so we want to disable clipping when drawing figures
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintChildren(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintChildren(Graphics graphics) {
-		IFigure child;
-
-		Rectangle clip = Rectangle.SINGLETON;
-		List children = this.getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			child = (IFigure) children.get(i);
-			if (child.isVisible() && child.intersects(graphics.getClip(clip))) {
-				// graphics.clipRect(child.getBounds());
-				child.paint(graphics);
-				graphics.restoreState();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintClientArea(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintClientArea(Graphics graphics) {
-		if (this.getChildren().isEmpty())
-			return;
-
-		// boolean optimizeClip = getBorder() == null || getBorder().isOpaque();
-
-		if (useLocalCoordinates()) {
-			graphics.translate(getBounds().x + getInsets().left, getBounds().y
-					+ getInsets().top);
-			// if (!optimizeClip)
-			// graphics.clipRect(getClientArea(PRIVATE_RECT));
-			graphics.pushState();
-			paintChildren(graphics);
-			graphics.popState();
-			graphics.restoreState();
-		} else {
-			// if (optimizeClip)
-			paintChildren(graphics);
-			// else {
-			// graphics.clipRect(getClientArea(PRIVATE_RECT));
-			// graphics.pushState();
-			// paintChildren(graphics);
-			// graphics.popState();
-			// graphics.restoreState();
-			// }
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigureLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigureLayout.java
deleted file mode 100644
index 4a77597..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigureLayout.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.AbstractLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-
-/**
- * Layout for flow figures
- *
- */
-public abstract class FlowFigureLayout extends AbstractLayout {
-
-	/**
-	 * <code>true</code> if the context has changed, and a layout is needed.
-	 */
-	protected boolean _invalid = true;
-
-	/**
-	 * The flow context in which this LayoutManager exists.
-	 */
-	private FlowContext _context;
-
-	/**
-	 * The figure passed by layout(Figure) is held for convenience.
-	 */
-	private final FlowFigure _flowFigure;
-
-	/**
-	 * Constructs a new FlowFigureLayout with the given FlowFigure.
-	 * 
-	 * @param flowfigure
-	 *            the FlowFigure
-	 */
-	protected FlowFigureLayout(FlowFigure flowfigure) {
-		this._flowFigure = flowfigure;
-	}
-
-	/**
-	 * TextFlowLayouts do not calculate a preferred size because it is too
-	 * expensive. {@link FlowPage}will actually layout itself in order to
-	 * calculate preferredSize.
-	 * 
-	 * @see AbstractLayout#calculatePreferredSize(IFigure)
-	 */
-	public Dimension calculatePreferredSize(IFigure f, int w, int h) {
-		return null;
-	}
-
-	/**
-	 * @return the FlowFigure
-	 */
-	protected FlowFigure getFlowFigure() {
-		return _flowFigure;
-	}
-
-	/**
-	 * Marks this layout as invalid.
-	 * 
-	 * @see org.eclipse.draw2d.LayoutManager#invalidate()
-	 */
-	public void invalidate() {
-		_invalid = true;
-		super.invalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.LayoutManager#layout(IFigure)
-	 */
-	public final void layout(IFigure figure) {
-		layout();
-		_invalid = false;
-	}
-
-	/**
-	 * Called during {@link #layout(IFigure)}. The {@link  #_invalid}flag is
-	 * reset after this method is called.
-	 */
-	protected abstract void layout();
-
-	/**
-	 * Sets the context for this layout manager.
-	 * 
-	 * @param flowContext
-	 *            the context of this layout
-	 */
-	public void setOriginalFlowContext(FlowContext flowContext) {
-		_context = flowContext;
-	}
-
-	/**
-	 * @return the original flow context
-	 */
-	protected final FlowContext getOriginalFlowContext() {
-		return _context;
-	}
-
-	/**
-	 * get flow context.
-	 * 
-	 * @return the flow context
-	 */
-	public FlowContext getFlowContext() {
-		return _context;
-	}
-
-	public String toString() {
-		// for debug purpose.
-		return _flowFigure.toString();
-	}
-
-	/**
-	 * Called to dispose the layout
-	 */
-	abstract public void dispose();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowPage.java
deleted file mode 100644
index cd81a03..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowPage.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * The root of a Flow hierarchy. A flow page can be treated as a normal figure,
- * but contains FlowFigures.
- * <P>
- * A FlowPage will not have a defined width unless it is inside a figure whose
- * layout provides width hints when calling
- * {@link org.eclipse.draw2d.IFigure#getPreferredSize(int, int)}.
- * <P>
- * WARNING: This class is not intended to be subclassed by clients.
- */
-public class FlowPage extends BlockFlow {
-
-	private Dimension _pageSize = new Dimension();
-
-	private int _recommendedWidth;
-
-	private int _pageSizeCacheKeys[] = new int[4];
-
-	private Dimension _pageSizeCacheValues[] = new Dimension[4];
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.BlockFlow#createDefaultFlowLayout()
-	 */
-	protected FlowFigureLayout createDefaultFlowLayout() {
-		return new PageFlowLayout(this);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getMinimumSize()
-	 */
-	public Dimension getMinimumSize(int w, int h) {
-		return getPreferredSize(w, h);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#invalidate()
-	 */
-	public void invalidate() {
-		_pageSizeCacheValues = new Dimension[4];
-		super.invalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(int width, int h) {
-		if (width >= 0)
-			width = Math.max(0, width - getInsets().getWidth());
-
-		for (int i = 0; i < 4; i++) {
-			if (_pageSizeCacheKeys[i] == width
-					&& _pageSizeCacheValues[i] != null)
-				return _pageSizeCacheValues[i];
-		}
-
-		_pageSizeCacheKeys[3] = _pageSizeCacheKeys[2];
-		_pageSizeCacheKeys[2] = _pageSizeCacheKeys[1];
-		_pageSizeCacheKeys[1] = _pageSizeCacheKeys[0];
-		_pageSizeCacheKeys[0] = width;
-
-		_pageSizeCacheValues[3] = _pageSizeCacheValues[2];
-		_pageSizeCacheValues[2] = _pageSizeCacheValues[1];
-		_pageSizeCacheValues[1] = _pageSizeCacheValues[0];
-
-		// Flowpage must temporarily layout to determine its preferred size
-		int oldWidth = getRecommendedWidth();
-		setRecommendedWidth(width);
-		validate();
-		_pageSizeCacheValues[0] = _pageSize.getExpanded(getInsets().getWidth(),
-				getInsets().getHeight());
-
-		if (width != oldWidth) {
-			setRecommendedWidth(oldWidth);
-			getUpdateManager().addInvalidFigure(this);
-		}
-		return _pageSizeCacheValues[0];
-	}
-
-	int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	/**
-	 * @see BlockFlow#postValidate()
-	 */
-	public void postValidate() {
-		Rectangle r = getBlockBox().toRectangle();
-		_pageSize.width = r.width;
-		_pageSize.height = r.height;
-		for (final Iterator it = getChildren().iterator(); it.hasNext();)
-        {
-            ((FlowFigure)it.next()).postValidate();            
-        }
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#setBounds(Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r))
-			return;
-		boolean invalidate = getBounds().width != r.width
-				|| getBounds().height != r.height;
-		super.setBounds(r);
-		int newWidth = r.width - getInsets().getWidth();
-		if (invalidate || getRecommendedWidth() != newWidth) {
-			setRecommendedWidth(newWidth);
-			getUpdateManager().addInvalidFigure(this);
-		}
-	}
-
-	private void setRecommendedWidth(int width) {
-		if (_recommendedWidth == width)
-			return;
-		_recommendedWidth = width;
-		super.invalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#validate()
-	 */
-	public void validate() {
-		if (isValid())
-			return;
-		super.validate();
-		postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#setValid(boolean)
-	 */
-	public void setValid(boolean value) {
-		super.setValid(value);
-	}
-
-	public Insets getInsets() {
-		return new Insets(8);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowUtilities.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowUtilities.java
deleted file mode 100644
index 6cd9e19..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowUtilities.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.text.BreakIterator;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * Utility class for FlowFigures.
- * 
- */
-public final class FlowUtilities extends FigureUtilities {
-	/**
-	 * Returns the number of characters from the specified String that will fit
-	 * in the available amount of space. An average character width can be
-	 * provided as a hint for faster calculation.
-	 * 
-	 * @param frag
-	 *            the TextFragmentBox
-	 * @param string
-	 *            the String
-	 * @param font
-	 *            the Font used for measuring
-	 * @param availableWidth
-	 *            the available width in pixels
-	 * @param avg
-	 *            0.0, or an avg character width to use during calculation
-	 * @param wrapping
-	 *            the word wrap style
-	 * @return the number of characters that will fit in the space
-	 */
-	public static int setupFragmentBasedOnTextSpace(TextFragmentBox frag,
-			String string, Font font, int availableWidth, float avg,
-			int wrapping) {
-		int result = getTextForSpace(string, font, availableWidth, avg,
-				wrapping);
-		frag._length = result;
-		setupFragment(frag, font, string);
-		return result;
-	}
-
-	/**
-	 * given the text string, font and available width and wrapping mode.
-	 * Calculate how much text can fit into.
-	 * 
-	 * @param string
-	 * @param font
-	 * @param availableWidth
-	 * @param avg
-	 * @param wrapping
-	 * @return how much text can fit into
-	 */
-	public static int getTextForSpace(String string, Font font,
-			int availableWidth, float avg, int wrapping) {
-		if (string.length() == 0) {
-			return 0;
-		}
-
-		FontMetrics metrics = getFontMetrics(font);
-		BreakIterator breakItr = BreakIterator.getLineInstance();
-		breakItr.setText(string);
-		int MIN, min, max;
-		if (avg == 0.0) {
-			avg = metrics.getAverageCharWidth();
-		}
-
-		int firstBreak = breakItr.next();
-
-		int winNL = string.indexOf("\r\n"); //$NON-NLS-1$
-		int macNL = string.indexOf('\r');
-		int unixNL = string.indexOf('\n');
-
-		MIN = min = (wrapping == CSSTextLayout.WORD_WRAP_HARD) ? firstBreak : 1;
-		if (macNL == winNL) {
-			macNL = -1; // If the Mac newline is just the prefix to the win NL,
-			// ignore it
-		}
-
-		max = string.length() + 1;
-
-		if (winNL != -1) {
-			max = Math.min(max, winNL);
-			min = Math.min(min, winNL);
-		}
-		if (unixNL != -1) {
-			max = Math.min(max, unixNL);
-			min = Math.min(min, unixNL);
-		}
-		if (macNL != -1) {
-			max = Math.min(max, macNL);
-			min = Math.min(min, macNL);
-		}
-
-		int origMax = max;
-		// The size of the current guess
-		int guess = 0, guessSize = 0;
-
-		while ((max - min) > 1) {
-			// Pick a new guess size
-			// New guess is the last guess plus the missing width in pixels
-			// divided by the average character size in pixels
-			guess = guess + (int) ((availableWidth - guessSize) / avg);
-
-			if (guess >= max) {
-				guess = max - 1;
-			}
-			if (guess <= min) {
-				guess = min + 1;
-			}
-
-			// Measure the current guess
-			guessSize = getStringExtents2(string.substring(0, guess), font).width;
-
-			if (guessSize <= availableWidth) {
-				// We did not use the available width
-				min = guess;
-			} else {
-				// We exceeded the available width
-				max = guess;
-			}
-		}
-
-		int result = string.length();
-		switch (wrapping) {
-		case CSSTextLayout.WORD_WRAP_HARD:
-			if (min == string.length() || min == winNL || min == unixNL
-					|| min == macNL) {
-				result = min;
-			} else if (max == origMax
-					&& getStringExtents2(string.substring(0, max), font).width <= availableWidth) {
-				result = max;
-			} else {
-				result = Math.max(MIN, breakItr.preceding(Math.min(max, string
-						.length() - 1)));
-			}
-			break;
-
-		case CSSTextLayout.WORD_WRAP_SOFT:
-			if (min == string.length() || min == winNL || min == unixNL
-					|| min == macNL) {
-				result = min;
-			} else if (max == origMax
-					&& getStringExtents2(string.substring(0, max), font).width <= availableWidth) {
-				result = max;
-			} else if (breakItr.isBoundary(min)) {
-				result = min;
-			} else if (breakItr.isBoundary(Math.min(max, string.length() - 1))) {
-				result = max;
-			} else {
-				result = breakItr.preceding(Math.min(max, string.length() - 1));
-			}
-			if (result <= 0) {
-				result = min;
-			}
-			break;
-		// case CSSTextLayout.WORD_WRAP_TRUNCATE:
-		// if (min == string.length() || min == winNL || min == unixNL || min ==
-		// macNL)
-		// {
-		// result = frag._length = min;
-		// setupFragment(frag, font, string);
-		// if (frag.getWidth() <= availableWidth)
-		// return result;
-		// min -= 1;
-		// }
-		// else if (max == origMax && getStringExtents(string.substring(0, max),
-		// font).width <= availableWidth)
-		// {
-		// result = frag._length = max;
-		// setupFragment(frag, font, string);
-		// return result;
-		// }
-		// result = breakItr.preceding(Math.min(max + 1, string.length() - 1));
-		// if (result <= 0)
-		// {
-		// ELLIPSIS_SIZE =
-		// FigureUtilities.getStringExtents(CSSTextFigure.ELLIPSIS, font);
-		// getTextForSpace(frag, string, font, availableWidth -
-		// ELLIPSIS_SIZE.width, avg, CSSTextLayout.WORD_WRAP_SOFT);
-		// //frag.length = min;
-		// frag._truncated = true;
-		// result = breakItr.following(min);
-		// if (result == BreakIterator.DONE)
-		// result = string.length();
-		// }
-		// else
-		// {
-		// frag._length = result;
-		// }
-		}
-
-		return result;
-	}
-
-	/**
-	 * @param string
-	 * @param font
-	 * @param availableWidth
-	 * @param avg
-	 * @return the text width
-	 */
-	public static int getTextInWidth(String string, Font font,
-			int availableWidth, float avg) {
-		if (string.length() == 0) {
-			return 0;
-		}
-		int guess = 0;
-		while (true) {
-			Dimension a = getTextExtents(string.substring(0, guess), font);
-			if (a.width >= availableWidth) {
-				return guess;
-			}
-			guess++;
-			if (guess == string.length()) {
-				return guess;
-			}
-		}
-	}
-
-	/**
-	 * change the parent implementation of getStringExtents(). Don't expend the
-	 * 1 width. So empty string will not have any width.
-	 * 
-	 * @param s
-	 * @param f
-	 * @return the dimension
-	 */
-	public static Dimension getStringExtents2(String s, Font f) {
-		return new Dimension(getStringDimension(s, f));
-	}
-
-	static void setupFragment(TextFragmentBox frag, Font f, String s) {
-		// if (frag.length != s.length())
-		// we don't skip whitespace here. since already truncated in
-		// CSSTextLayout
-
-		// while (frag.length > 0 &&
-		// Character.isElementContentWhitespace(s.charAt(frag.length - 1)))
-		// frag.length--;
-		frag.setTextData(s.substring(0, frag._length));
-		Dimension d = getStringExtents2(s.substring(0, frag._length), f);
-		FontMetrics fm = getFontMetrics(f);
-		frag.setHeight(fm.getHeight());
-		frag.setAscent(fm.getAscent() + fm.getLeading());
-		if (frag._length > 0
-				&& Character.isWhitespace(s.charAt(frag._length - 1))) {
-			frag._isLastCharWhitespace = true;
-		} else {
-			frag._isLastCharWhitespace = false;
-		}
-		frag.setWidth(d.width);
-	}
-
-	private FlowUtilities()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSFigure.java
deleted file mode 100644
index cecf650..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSFigure.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- */
-public interface ICSSFigure extends IFigure {
-	/**
-	 * get fragments of this figure. Each item of the list will be a FlowBox.
-	 * Note, this method is for read only, caller should not change the returned
-	 * list and items in the returned list.
-	 * 
-	 * @return the list of fragments
-	 */
-	public List getFragmentsForRead();
-
-	/**
-	 * get the CSSStyle of this CSS figure.
-	 * 
-	 * @return the css style
-	 */
-	public ICSSStyle getCSSStyle();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSLayout.java
deleted file mode 100644
index f17c54a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSLayout.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.LayoutManager;
-
-/**
- * There are several kinds of layout involved. 1. the layout need let the child
- * figures do certain layouting of themselves first, then decide the final
- * result based on child information. 2. the layout could decide the size
- * information of this figure without child information.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ICSSLayout extends LayoutManager {
-	/**
-	 * Each ICSSLayout is dedicated to a single CSSFigure.
-	 * 
-	 * @return the figure
-	 */
-	public ICSSFigure getICSSFigure();
-
-	/**
-	 * 
-	 * @return
-	 */
-	// public List getFragmentsForRead();
-	/**
-	 * postValidate the child figures of this CSSFigure. Normally layout fall
-	 * into the first category need implement this method.
-	 */
-	// public void postValidate();
-	/**
-	 * setBounds is called on the CSSFigure. Normally layout fall into the
-	 * second category need implement this method.
-	 * 
-	 * @param rect
-	 * @param invalidate
-	 */
-	// public void setBoundsCalled(Rectangle rect, boolean invalidate);
-	/**
-	 * @return
-	 */
-	// public boolean useLocalCoordinates();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter.java
deleted file mode 100644
index 5f83cb8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.Graphics;
-
-/**
- * @author mengbo
- */
-public interface ICSSPainter {
-	/**
-	 * this method is called in the figure's <code>paintFigure</code> method,
-	 * before <code>paintClientArea</code>. So it is called before children.
-	 * Thus, children may override its effects.
-	 * 
-	 * @param g
-	 */
-	public void paintFigure(Graphics g);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter2.java
deleted file mode 100644
index f93fb84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter2.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.Graphics;
-
-/**
- * If the layout implements this interface, then it will have chance to paint
- * something to override children effect.
- * 
- * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter
- * @see org.eclipse.jst.pagedesigner.css2.layout.CSSFigure
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ICSSPainter2 {
-	/**
-	 * this method is called after <code>paintClientArea</code>. So it is
-	 * called after children. Thus, it could override some children effects.
-	 * 
-	 * @param g
-	 */
-	public void paintFigurePostClientArea(Graphics g);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/LineBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/LineBox.java
deleted file mode 100644
index fcfe8b4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/LineBox.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * A composite box representing a single line. LineBox calculates its ascent and
- * descent from the child boxes it contains. Clients can call
- * {@link #getAscent()} at any time and expect valid
- * values. The child boxes that are added to a line have unspecied locations
- * until {@link #commit()}is called, at which time the child boxes are layed
- * out in left-to-right order, and their baselines are all aligned vertically.
- * 
- */
-public class LineBox extends CompositeBox {
-	private final static int BASELINE = 0;
-
-	private final static int MIDDLE = 1;
-
-	private final static int SUB = 2;
-
-	private final static int SUPER = 3;
-
-	private final static int TEXT_TOP = 4;
-
-	private final static int TEXT_BOTTOM = 5;
-
-	private final static int TOP = 6;
-
-	private final static int BOTTOM = 7;
-
-	private final static int LENGTH = 8;
-
-	private int _ascent = 0;
-
-	private int _descent = 0;
-
-	private int _fontAscent = 0;
-
-	private int _fontDescent = 0;
-
-	private int _fontLeading = 0;
-
-	private Object _horizonalData = null;
-
-	private Object _htmlInitData = null;
-
-	private int _accumlatedWidth = 0;
-
-	/**
-	 * Removes all owned fragments and invalidates this CompositeBox.
-	 */
-	public void clear() {
-		super.clear();
-		_horizonalData = null;
-		_htmlInitData = null;
-	}
-
-	/**
-	 * Committing a LineBox will position its children correctly. All children
-	 * boxes are made to have the same baseline, and are layed out from
-	 * left-to-right.
-	 */
-	public void commit() {
-		int baseline = getBaseline();
-		int xLocation = _x;
-		for (int i = 0; i < _fragments.size(); i++) {
-			FlowBox block = (FlowBox) _fragments.get(i);
-			block._x = xLocation + block.getMarginInsets().left;
-			xLocation = block._x + block._width + block.getMarginInsets().right;
-
-			if (_fragments.size() > 1 && block instanceof TextFragmentBox) {
-				TextFragmentBox textBox = (TextFragmentBox) block;
-				if (textBox.getTextData().length() == 0) {
-					textBox._height = _fontAscent + _fontDescent + _fontLeading;
-					textBox.setAscent(_fontAscent + _fontLeading);
-					block._y = this._y;
-					continue;
-				}
-			}
-
-			switch (getVerticalAlignType(block)) {
-			case TOP:
-				block._y = this._y;
-				break;
-			case BOTTOM:
-				block._y = this.getBaseline() - (block.getHeight() - _descent);
-				break;
-			case MIDDLE:
-				int halfXHeight = getHalfXHeight();
-				block._y = this.getBaseline() - halfXHeight
-						- (block.getHeight() + 1) / 2;
-				break;
-			case TEXT_TOP:
-				block._y = this.getBaseline() - _fontAscent - _fontLeading;
-				break;
-			case TEXT_BOTTOM:
-				block._y = this.getBaseline() - (block._height - _fontDescent);
-				break;
-			case LENGTH:
-				block._y = this.getBaseline() + getIncrement(block);
-				break;
-			case SUPER:
-				block._y = this.getBaseline() - getHalfXHeight() * 2
-						- block._height;
-				break;
-			case SUB:
-				block._y = this.getBaseline() - block._height * _fontLeading
-						/ getFontHeight();
-				break;
-			case BASELINE:
-			default:
-				block.makeBaseline(baseline);
-				break;
-			}
-			if (block instanceof LineBox) {
-				((LineBox) block).commit();
-			}
-		}
-	}
-
-	private int getVerticalAlignType(FlowBox box) {
-		Object data = box.getVerticalAlignData();
-
-		if (data != null) {
-			if (data instanceof Length) {
-				return LENGTH;
-			} else if (VerticalAlignMeta.BASELINE.equals(data)) {
-				return BASELINE;
-			} else if (VerticalAlignMeta.MIDDLE.equals(data)) {
-				return MIDDLE;
-			} else if (VerticalAlignMeta.SUB.equals(data)) {
-				return SUB;
-			} else if (VerticalAlignMeta.SUPER.equals(data)) {
-				return SUPER;
-			} else if (VerticalAlignMeta.TEXT_TOP.equals(data)) {
-				return TEXT_TOP;
-			} else if (VerticalAlignMeta.TEXT_BOTTOM.equals(data)) {
-				return TEXT_BOTTOM;
-			} else if (VerticalAlignMeta.TOP.equals(data)) {
-				return TOP;
-			} else if (VerticalAlignMeta.BOTTOM.equals(data)) {
-				return BOTTOM;
-			}
-			return BASELINE;
-		}
-		return BASELINE;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowBox#getAscent()
-	 */
-	public int getAscent() {
-		// because at initial, ascent is 0. And the linebox
-		// could have some size setting without children. In
-		// that case, we need handle differently.
-		if (_ascent == 0 && _fragments.isEmpty()) {
-			return getHeight();
-		}
-		return _ascent;
-	}
-
-	/**
-	 * Returns the width available to child fragments.
-	 * 
-	 * @return the width in pixels
-	 */
-	public int getAvailableWidth() {
-		if (_recommendedWidth < 0) {
-			return Integer.MAX_VALUE;
-		}
-		int availableWidth = _recommendedWidth - _accumlatedWidth;
-		if (availableWidth < 0) {
-			availableWidth = 0;
-		}
-		return availableWidth;
-	}
-
-	/**
-	 * Returns the baseline of this LineBox, which is the y value plus the
-	 * ascent.
-	 * 
-	 * @return the baseline value.
-	 */
-	public int getBaseline() {
-		return _y + getAscent();
-	}
-
-	/**
-	 * @see CompositeBox#resetInfo()
-	 */
-	protected void resetInfo() {
-		super.resetInfo();
-		_accumlatedWidth = 0;
-		_ascent = 0;
-	}
-
-	/**
-	 * @see CompositeBox#unionInfo(FlowBox)
-	 */
-	protected void unionInfo(FlowBox blockInfo) {
-		if (blockInfo instanceof TextFragmentBox) {
-			if (((TextFragmentBox) blockInfo).getTextData().length() == 0) {
-				return;
-			}
-		}
-
-		if (_fragments == null || _fragments.isEmpty()) {
-			this._ascent = 0;
-			this._descent = 0;
-			this._height = 0;
-		}
-
-		int valign = getVerticalAlignType(blockInfo);
-
-		if (valign == BASELINE) {
-			_ascent = Math.max(_ascent, blockInfo.getAscent());
-			if (blockInfo instanceof WidgetBox) {
-				_descent = 0;
-			} else {
-				_descent = Math.max(_descent, blockInfo.getDescent());
-			}
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == MIDDLE) {
-			int halfXHeight = getHalfXHeight();
-			_ascent = Math.max(_ascent, (blockInfo.getHeight() + 1) / 2
-					+ halfXHeight);
-			_descent = Math.max(_descent, blockInfo.getHeight() / 2
-					- halfXHeight);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == TEXT_TOP) {
-			_ascent = Math.max(_ascent, _fontAscent + _fontLeading);
-			_descent = Math.max(_descent, blockInfo.getHeight() - _fontAscent
-					- _fontLeading);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == TEXT_BOTTOM) {
-			_ascent = Math.max(_ascent, blockInfo.getHeight() - _fontDescent);
-			_descent = Math.max(_descent, _fontDescent);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == SUB) {
-			int blockTop = blockInfo._height * _fontLeading / getFontHeight();
-			_ascent = Math.max(_ascent, blockTop);
-			_descent = Math.max(_descent, blockInfo.getHeight() - blockTop);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == SUPER) {
-			int blockTop = blockInfo._height;
-			_ascent = Math.max(_ascent, getHalfXHeight() * 2 + blockTop);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == LENGTH) {
-			int increment = getIncrement(blockInfo);
-			_ascent = Math.max(_ascent, blockInfo.getAscent() + increment);
-			_descent = Math.max(_descent, blockInfo.getDescent() - increment);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == TOP) {
-			_descent = Math.max(_descent, blockInfo.getHeight() - _ascent);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == BOTTOM) {
-			// XXX:the render of IE is not consistent with spec, mozilla is. so
-			// we follow mozilla's implementation.
-			_ascent = Math.max(_ascent, blockInfo.getHeight() - _descent);
-			_height = Math.max(_height, _ascent + _descent);
-		} else {
-			_ascent = Math.max(_ascent, blockInfo.getAscent());
-			_descent = Math.max(_descent, blockInfo.getDescent());
-			_height = Math.max(_height, blockInfo.getHeight());
-		}
-
-		_accumlatedWidth += blockInfo._width
-				+ blockInfo.getMarginInsets().getWidth();
-		if (_accumlatedWidth > _width) {
-			_width = _accumlatedWidth;
-		}
-	}
-
-	private int getIncrement(FlowBox blockInfo) {
-		int valign = getVerticalAlignType(blockInfo);
-		if (valign == LENGTH) {
-			int increment = 0;
-			Length length = (Length) blockInfo.getVerticalAlignData();
-			if (length.isPercentage()) {
-				increment = length.getValue() * getFontHeight() / 100;
-			} else {
-				increment = length.getValue();
-			}
-			return increment;
-		}
-		return 0;
-	}
-
-	/**
-	 * @return true if is occupied
-	 * @see org.eclipse.draw2d.geometry.Rectangle#isEmpty()
-	 */
-	public boolean isOccupied() {
-		if (_width > 0) {
-			return true;
-		}
-
-		if (_fragments.isEmpty()) {
-			return false;
-		}
-		// int size = _fragments.size();
-		// if (size > 1)
-		// {
-		// return true;
-		// }
-		// ok, we have one segment
-		// FlowBox box = (FlowBox) _fragments.get(0);
-		// if (box instanceof TextFragmentBox)
-		// {
-		// if (((TextFragmentBox) box).getTextData().length() == 0)
-		// {
-		// // this is an empty string text box.
-		// return false;
-		// }
-		// }
-		return true;
-	}
-
-	/**
-	 * @return true if is empty string line
-	 */
-	public boolean isEmptyStringLine() {
-		// if(this.getWidth() == 0)
-		// {
-		// return true;
-		// }
-		// else
-		// {
-		// return false;
-		// }
-		if (_fragments.size() == 1) {
-			FlowBox box = (FlowBox) _fragments.get(0);
-			if (box instanceof TextFragmentBox) {
-				if (box instanceof TextFragmentBox) {
-					if (((TextFragmentBox) box).getTextData().length() == 0) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param fontMetrics
-	 */
-	public void setFontMetrics(FontMetrics fontMetrics) {
-		if (fontMetrics != null) {
-			_fontAscent = fontMetrics.getAscent();
-			_fontDescent = fontMetrics.getDescent();
-			_fontLeading = fontMetrics.getLeading();
-			// if (_fragments == null || _fragments.isEmpty())
-			// {
-			// this._ascent = _fontAscent + _fontLeading;
-			// this._descent = _fontDescent;
-			// if (this._height < this._ascent + this._descent)
-			// {
-			// this._height = this._ascent + this._descent;
-			// }
-			// }
-		} else {
-			_fontAscent = 0;
-			_fontDescent = 0;
-			_fontLeading = 0;
-		}
-	}
-
-	private int getHalfXHeight() {
-		return (_fontAscent + _fontDescent + _fontLeading) / 5;
-	}
-
-	private int getFontHeight() {
-		return _fontAscent + _fontDescent + _fontLeading;
-	}
-
-	/**
-	 * @return Returns the horizonalData.
-	 */
-	public Object getHorizonalData() {
-		return _horizonalData;
-	}
-
-	/**
-	 * @param horizonalData
-	 *            The horizonalData to set.
-	 */
-	public void setHorizonalData(Object horizonalData) {
-		this._horizonalData = horizonalData;
-	}
-
-	/**
-	 * @return Returns the htmlInitData.
-	 */
-	public Object getHtmlInitData() {
-		return _htmlInitData;
-	}
-
-	/**
-	 * @param htmlInitData
-	 *            The htmlInitData to set.
-	 */
-	public void setHtmlInitData(Object htmlInitData) {
-		this._htmlInitData = htmlInitData;
-	}
-
-    @Override
-    public void setY(int y) {
-        // make set y public
-        super.setY(y);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/MultiLineLabel.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/MultiLineLabel.java
deleted file mode 100644
index e49872c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/MultiLineLabel.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * A multi-line label
- *
- */
-public class MultiLineLabel extends Label {
-	private static String ELLIPSIS = "..."; //$NON-NLS-1$
-
-	protected void paintFigure(Graphics graphics) {
-		if (isOpaque()) {
-			graphics.fillRectangle(getBounds());
-		}
-		Rectangle bounds1 = getBounds();
-		graphics.translate(bounds1.x, bounds1.y);
-		drawText(graphics);
-		graphics.translate(-bounds1.x, -bounds1.y);
-	}
-
-	private void drawText(Graphics graphics) {
-		String[] strings = splitString(getText());
-		int y = 0;
-		int lineHeight = FigureUtilities.getFontMetrics(getFont()).getHeight();
-		for (int i = 0; i < strings.length; i++) {
-			graphics.drawText(getSubStringText(strings[i]), 0, y);
-			y += lineHeight;
-		}
-
-	}
-
-	private String[] splitString(String text) {
-		String[] lines = new String[1];
-		int start = 0, pos;
-		do {
-			pos = text.indexOf('\n', start);
-			if (pos == -1) {
-				lines[lines.length - 1] = text.substring(start);
-			} else {
-				boolean crlf = (pos > 0) && (text.charAt(pos - 1) == '\r');
-				lines[lines.length - 1] = text.substring(start, pos
-						- (crlf ? 1 : 0));
-				start = pos + 1;
-				String[] newLines = new String[lines.length + 1];
-				System.arraycopy(lines, 0, newLines, 0, lines.length);
-				lines = newLines;
-			}
-		} while (pos != -1);
-		return lines;
-	}
-
-	/**
-	 * @param text
-	 * @return the substring text
-	 */
-	private String getSubStringText(String text) {
-		String subStringText = text;
-
-		Font currentFont = getFont();
-		int textWidth = FigureUtilities.getTextWidth(text, currentFont);
-		if (textWidth - getSize().width <= 0) {
-			return subStringText;
-		}
-
-		Dimension effectiveSize = new Dimension(getSize().width, 0);
-
-		int dotsWidth = FigureUtilities.getTextWidth(ELLIPSIS, currentFont);
-
-		if (effectiveSize.width < dotsWidth) {
-			effectiveSize.width = dotsWidth;
-		}
-
-		int subStringLength = getLargestSubstringConfinedTo(text, currentFont,
-				effectiveSize.width - dotsWidth);
-		subStringText = new String(text.substring(0, subStringLength)
-				+ ELLIPSIS);
-		return subStringText;
-	}
-
-	int getLargestSubstringConfinedTo(String s, Font f, int availableWidth) {
-		FontMetrics metrics = FigureUtilities.getFontMetrics(f);
-		int min, max;
-		float avg = metrics.getAverageCharWidth();
-		min = 0;
-		max = s.length() + 1;
-
-		// The size of the current guess
-		int guess = 0, guessSize = 0;
-		while ((max - min) > 1) {
-			// Pick a new guess size
-			// New guess is the last guess plus the missing width in pixels
-			// divided by the average character size in pixels
-			guess = guess + (int) ((availableWidth - guessSize) / avg);
-
-			if (guess >= max) {
-				guess = max - 1;
-			}
-			if (guess <= min) {
-				guess = min + 1;
-			}
-
-			// Measure the current guess
-			guessSize = FigureUtilities
-					.getTextExtents(s.substring(0, guess), f).width;
-
-			if (guessSize < availableWidth) {
-				// We did not use the available width
-				min = guess;
-			} else {
-				// We exceeded the available width
-				max = guess;
-			}
-		}
-		return min;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/PageFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/PageFlowLayout.java
deleted file mode 100644
index 33ff6a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/PageFlowLayout.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFont;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * A block layout which requires no FlowContext to perform its layout. This
- * class is used by {@link FlowPage}.
- * <p>
- * WARNING: This class is not intended to be subclassed by clients.
- */
-public class PageFlowLayout extends BlockFlowLayout {
-
-	/**
-	 * Creates a new PageFlowLayout with the given FlowPage
-	 * 
-	 * @param page
-	 *            the FlowPage
-	 */
-	public PageFlowLayout(FlowPage page) {
-		super(page);
-	}
-
-	/**
-	 * @see BlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-        // do nothing
-	}
-
-	/**
-	 * 
-	 */
-	public void postValidate() {
-       // TODO: This method is not being called.
-	}
-
-	protected void setupLine(LineBox line, int topMargin) {
-		super.setupLine(line, topMargin);
-
-		CSSFontManager fontManager = CSSFontManager.getInstance();
-		Font font = fontManager.getSwtFont((CSSFont) fontManager
-				.createDefaultFont());
-		line.setFontMetrics(FigureUtilities.getFontMetrics(font));
-	}
-
-	/**
-	 * Setup blockBox to the initial bounds of the Page
-	 */
-	protected void setupBlock() {
-		// Remove all current Fragments
-		_blockBox.clear();
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-		_blockBox.setRecommendedWidth(((FlowPage) getFlowFigure())
-				.getRecommendedWidth());
-		_blockBox._x = 0;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextFragmentBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextFragmentBox.java
deleted file mode 100644
index 58776e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextFragmentBox.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * A Geometric object for representing a TextFragment region on a line of Text.
- */
-public class TextFragmentBox extends FlowBox {
-
-	/** The offset in pixels * */
-	public int _offset;
-
-	/** The length in pixels * */
-	public int _length;
-
-	private int _ascent;
-
-	// boolean _truncated;
-
-	/*package*/ boolean _isLastCharWhitespace = false;
-
-	private String _textData;
-
-	/**
-	 * Creates a new TextFragmentBox
-	 */
-	public TextFragmentBox() {
-        // do nothgin
-	}
-
-	/**
-	 * Returns the ascent of this TextFragmentBox
-	 * 
-	 * @return the ascent
-	 */
-	public int getAscent() {
-		return _ascent;
-	}
-
-	/**
-	 * Sets the ascent of this TextFragmentBox to the given value
-	 * 
-	 * @param a
-	 *            the ascent
-	 */
-	public void setAscent(int a) {
-		_ascent = a;
-	}
-
-	/**
-	 * Sets the height of this TextFragmentBox to the given value
-	 * 
-	 * @param h
-	 *            the height
-	 */
-	public void setHeight(int h) {
-		_height = h;
-	}
-
-	/**
-	 * Sets the width of this TextFragmentBox to the given value
-	 * 
-	 * @param w
-	 *            the width
-	 */
-	public void setWidth(int w) {
-		_width = w;
-	}
-
-	/**
-	 * @return the text data
-	 */
-	public String getTextData() {
-		return _textData;
-	}
-
-	/**
-	 * @param txt
-	 */
-	public void setTextData(String txt) {
-		_textData = txt;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextLayoutSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextLayoutSupport.java
deleted file mode 100644
index 7b31c90..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextLayoutSupport.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.TextDecorationMeta;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * @author mengbo
- */
-public class TextLayoutSupport {
-	private static final Logger _log = PDPlugin
-			.getLogger(TextLayoutSupport.class);
-
-	private static final String[] DELIMITERS = { "\r\n", //$NON-NLS-1$
-			"\n", //$NON-NLS-1$
-			"\r" //$NON-NLS-1$
-	};
-
-	static private int delimeterLength;
-
-	/**
-	 * Reuses an existing <code>TextFragmentBox</code>, or creates a new one.
-	 * 
-	 * @param i
-	 *            the index
-	 * @param fragments
-	 *            the original list of fragments
-	 * @return a TextFragmentBox
-	 */
-	// copied from TextLayout
-	protected static TextFragmentBox getFragment(int i, List fragments) {
-		if (fragments.size() > i) {
-			return (TextFragmentBox) fragments.get(i);
-		}
-		TextFragmentBox box = new TextFragmentBox();
-		fragments.add(box);
-		return box;
-	}
-
-	/**
-	 * Returns the average character width of given TextFragmentbox
-	 * 
-	 * @param fragment
-	 *            the TextFragmentBox
-	 * @return the average character width
-	 */
-	public static float getAverageCharWidth(TextFragmentBox fragment) {
-		if (fragment._width != 0 && fragment._length != 0) {
-			return fragment._width / (float) fragment._length;
-		}
-		return 0.0f;
-	}
-
-	// ----------------------------------------------------------------------------------------
-	/**
-	 * this method will create a set of TextFragment. Each fragment will offset
-	 * to the original text (whole text for the text figure).
-	 * @param context 
-	 * @param text 
-	 * @param fragments 
-	 * @param font 
-	 * @param wrappingStyle 
-	 * @param trimLeading 
-	 */
-	public static void layoutNormal(FlowContext context, String text,
-			List fragments, Font font, int wrappingStyle, boolean trimLeading) {
-		int i = 0; // The index of the current fragment;
-		int offset = 0;
-		if (trimLeading) {
-			offset = 1;
-			text = text.substring(1);
-		}
-
-		int length = 0; // The length of the current fragment
-		float prevAvgCharWidth;
-		LineBox currentLine;
-		TextFragmentBox fragment;
-
-		while (text.length() > 0) {
-			fragment = null;
-			prevAvgCharWidth = 0f;
-			fragment = getFragment(i, fragments);
-			prevAvgCharWidth = getAverageCharWidth(fragment);
-
-			// Check for newline, if it exists, call context.endLine and skip
-			// over the newline
-			// Exccept for first time through, don't do this.
-			if (i != 0) {
-				boolean changed = false;
-				if (text.charAt(0) == '\r') {
-					text = text.substring(1);
-					changed = true;
-					offset += 1;
-				}
-				if (text.length() != 0 && text.charAt(0) == '\n') {
-					text = text.substring(1);
-					changed = true;
-					offset += 1;
-				}
-				if (changed) {
-					context.endLine();
-				}
-			}
-
-			fragment._offset = offset;
-
-			// This loop is done at most twice.
-			// The second time through, a context.endLine()
-			// was requested, and the loop will break.
-			while (true) {
-				currentLine = context.getCurrentLine();
-				length = FlowUtilities.setupFragmentBasedOnTextSpace(fragment,
-						text, font, currentLine.getAvailableWidth(),
-						prevAvgCharWidth, wrappingStyle);
-
-				if (fragment._width <= currentLine.getAvailableWidth()
-						|| !context.isCurrentLineOccupied()) {
-					break;
-				}
-				context.endLine();
-			}
-			// fragment.x = context.getCurrentX();
-			context.addToCurrentLine(fragment);
-			text = text.substring(length);
-			offset += length;
-			if (text.length() > 0) {
-				context.endLine();
-			}
-			i++;
-		}
-
-		// Remove the remaining unused fragments.
-		while (i < fragments.size()) {
-			fragments.remove(fragments.size() - 1);
-		}
-	}
-
-	/**
-	 * @param context
-	 * @param text
-	 * @param fragments
-	 * @param font
-	 */
-	public static void layoutNoWrap(FlowContext context, String text,
-			List fragments, Font font) {
-		TextFragmentBox fragment;
-		int i = 0;
-		int offset = 0;
-
-		while (offset < text.length()) {
-			int result = nextLineBreak(text, offset);
-			fragment = getFragment(i++, fragments);
-			fragment._length = result - offset;
-			fragment._offset = offset;
-			FlowUtilities.setupFragment(fragment, font, text.substring(offset));
-			context.getCurrentLine().add(fragment);
-			offset = result + delimeterLength;
-			if (delimeterLength != 0) {
-				// in nextLineBreak we fo
-				context.endLine();
-			}
-
-		}
-		// Remove the remaining unused fragments.
-		while (i < fragments.size()) {
-			fragments.remove(i++);
-		}
-	}
-
-	private static int nextLineBreak(String text, int offset) {
-		int result = text.length();
-		delimeterLength = 0;
-		int current;
-		for (int i = 0; i < DELIMITERS.length; i++) {
-			current = text.indexOf(DELIMITERS[i], offset);
-			if (current != -1 && current < result) {
-				result = current;
-				delimeterLength = DELIMITERS[i].length();
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param g
-	 * @param fragments
-	 * @param font
-	 * @param textDecoration
-	 */
-	public static void paintTextFigure(Graphics g, List fragments, Font font,
-			int textDecoration) {
-		paintTextFigure(g, fragments, font, null, textDecoration);
-	}
-
-	/**
-	 * @param g
-	 * @param rect
-	 * @param textDecoration
-	 */
-	public static void paintTextDecoration(Graphics g, Rectangle rect,
-			int textDecoration) {
-		if ((textDecoration & TextDecorationMeta.UNDERLINE) != 0) {
-			g.drawLine(rect.x, rect.y + rect.height - 1, rect.x + rect.width
-					- 1, rect.y + rect.height - 1);
-		}
-		if ((textDecoration & TextDecorationMeta.OVERLINE) != 0) {
-			g.drawLine(rect.x, rect.y + 1, rect.x + rect.width - 1, rect.y + 1);
-		}
-		if ((textDecoration & TextDecorationMeta.LINETHROUGH) != 0) {
-			g.drawLine(rect.x, rect.y + rect.height / 2, rect.x + rect.width
-					- 1, rect.y + rect.height / 2);
-		}
-	}
-
-	/**
-	 * @param g
-	 * @param fragments
-	 * @param font
-	 * @param color
-	 * @param textDecoration
-	 */
-	public static void paintTextFigure(Graphics g, List fragments, Font font,
-			Color color, int textDecoration) {
-		// FIXME: It happens there is problem in this method's parameters. what
-		// exception should be catched?
-		try {
-			TextFragmentBox frag;
-			// XXX: adjust font. Here is not using setFont(), because that will
-			// result in revalidate
-			g.setFont(font);
-
-			for (int i = 0; i < fragments.size(); i++) {
-				frag = (TextFragmentBox) fragments.get(i);
-				// if (!g.getClip(Rectangle.SINGLETON).intersects(frag))
-				// continue;
-				String draw;
-				draw = frag.getTextData();
-
-				if (color != null) {
-					g.setForegroundColor(color);
-				}
-				g.drawText(draw, frag._x, frag._y);
-				if ((textDecoration & TextDecorationMeta.UNDERLINE) != 0) {
-					g.drawLine(frag._x, frag._y + frag.getHeight() - 1, frag._x
-							+ frag.getWidth(), frag._y + frag.getHeight() - 1);
-				}
-				if ((textDecoration & TextDecorationMeta.OVERLINE) != 0) {
-					g.drawLine(frag._x, frag._y, frag._x + frag.getWidth(),
-							frag._y);
-				}
-				if ((textDecoration & TextDecorationMeta.LINETHROUGH) != 0) {
-					g.drawLine(frag._x, frag._y + frag.getHeight() / 2, frag._x
-							+ frag.getWidth(), frag._y + frag.getHeight() / 2);
-				}
-
-				if (Debug.DEBUG_BASELINE) {
-					g.drawLine(frag._x, frag._y + frag.getAscent(), frag._x
-							+ frag.getWidth(), frag._y + frag.getAscent());
-				}
-			}
-		} catch (Exception e) {
-			// "Error in text painting:"
-			_log.info("TextLayoutSupport.Info.1", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * 
-	 * @param g
-	 * @param fragments
-	 * @param text
-	 *            all the text in the Text figure.
-	 * @param font
-	 * @param color
-	 * @param textDecoration
-	 * @param start
-	 * @param end
-	 * @param selectionForeColor
-	 * @param selectionBackColor
-	 */
-	public static void paintTextFigureWithSelection(Graphics g, List fragments,
-			String text, Font font, Color color, int textDecoration, int start,
-			int end, Color selectionForeColor, Color selectionBackColor) {
-		// FIXME: It happens there is problem in this method's parameters. what
-		// exception should be catched?
-		try {
-			TextFragmentBox frag;
-
-			Color originalForeground = g.getForegroundColor();
-			Color originalBackgroud = g.getBackgroundColor();
-
-			// XXX: adjust font. Here is not using setFont(), because that will
-			// result in revalidate
-			g.setFont(font);
-
-			for (int i = 0, n = fragments.size(); i < n; i++) {
-				frag = (TextFragmentBox) fragments.get(i);
-
-				// to make things simpler, we always draw the line using default
-				// color
-				if (color != null) {
-					g.setForegroundColor(color);
-				}
-
-				// if (!g.getClip(Rectangle.SINGLETON).intersects(frag))
-				// continue;
-				String draw;
-				draw = frag.getTextData();
-				if (frag._offset >= end || frag._offset + frag._length <= start) {
-					// we are not in selection. no need to change color
-					g.drawText(draw, frag._x, frag._y);
-					paintTextDecoration(g, frag.getRectangle(), textDecoration);
-				} else if (frag._offset >= start
-						&& frag._offset + frag._length <= end) {
-					// we are fully in selection
-					g.setForegroundColor(selectionForeColor);
-					g.setBackgroundColor(selectionBackColor);
-					g
-							.fillRectangle(frag._x, frag._y, FlowUtilities
-									.getTextExtents(draw, font).width, frag
-									.getHeight());
-					g.drawText(draw, frag._x, frag._y);
-					paintTextDecoration(g, frag.getRectangle(), textDecoration);
-				} else {
-					// partial of the fragment's text is in selection.
-
-					// draw the original string first
-					g.drawText(draw, frag._x, frag._y);
-					// then override with the selected parts.
-					g.setForegroundColor(selectionForeColor);
-					g.setBackgroundColor(selectionBackColor);
-					int partialStart = frag._offset > start ? frag._offset
-							: start;
-					int partialEnd = (frag._offset + frag._length > end) ? end
-							: (frag._offset + frag._length);
-					int x = 0;
-					String skip = text.substring(frag._offset, partialStart);
-					x = FlowUtilities.getTextExtents(skip, font).width;
-					String todraw = text.substring(partialStart, partialEnd);
-					if (todraw.length() > 0) {
-						Dimension dimension = FlowUtilities.getTextExtents(skip
-								+ todraw, font);
-						g.fillRectangle(frag._x + x, frag._y, dimension.width
-								- x, dimension.height);
-						g.drawText(skip + todraw, frag._x, frag._y);
-						if (color != null) {
-							g.setForegroundColor(color);
-						} else {
-							g.setForegroundColor(originalForeground);
-						}
-						g.drawText(skip, frag._x, frag._y);
-						paintTextDecoration(g, frag.getRectangle(),
-								textDecoration);
-						g.setForegroundColor(selectionForeColor);
-						paintTextDecoration(g,
-								new Rectangle(frag._x + x, frag._y,
-										dimension.width - x, dimension.height),
-								textDecoration);
-					}
-				}
-
-				// we do this in each loop, to make sure we are using correct
-				// color
-				g.setForegroundColor(originalForeground);
-				g.setBackgroundColor(originalBackgroud);
-
-			}
-		} catch (Exception e) {
-			// "Error in text painting:"
-			_log.info("TextLayoutSupport.Info.1", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param textAlign
-	 * @param rect
-	 * @param textWidth
-	 * @return the x value
-	 */
-	public static int getBeginX(Object textAlign, Rectangle rect, int textWidth) {
-		int x = rect.x;
-		if (textAlign != null) {
-			String align = textAlign.toString();
-			if ("left".equalsIgnoreCase(align)) //$NON-NLS-1$
-			{
-				x = rect.x + 1;
-			} else if ("right".equalsIgnoreCase(align)) //$NON-NLS-1$
-			{
-				x = rect.x + rect.width - textWidth - 1;
-				if (x < 1) {
-					x = 1;
-				}
-			} else if ("center".equalsIgnoreCase(align)) //$NON-NLS-1$
-			{
-				int offset = (rect.width - textWidth) / 2;
-				if (offset <= 0) {
-					offset = 0;
-				}
-				x = x + offset + 1;
-			}
-		}
-		return x;
-	}
-	
-	private TextLayoutSupport()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/WidgetBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/WidgetBox.java
deleted file mode 100644
index 220d61c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/WidgetBox.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * Simple box support ascent.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class WidgetBox extends FlowBox {
-	private int _ascent = -1;
-
-	public int getAscent() {
-		if (_ascent < 0) {
-			return super.getAscent();
-		}
-        return _ascent;
-	}
-
-	/*package*/ void setAscent(int ascent) {
-		_ascent = ascent;
-	}
-
-	/**
-	 * @return true if supports ascent
-	 */
-	public boolean supportAscent() {
-		return _ascent > 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRGroupLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRGroupLayout.java
deleted file mode 100644
index 0a3cd40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRGroupLayout.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSTRGroupLayout extends CSSBlockFlowLayout {
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTRGroupLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * @return the parent figure of TRGroup should be table figure. If so, return the
-     * corresponding table layout. 
-	 */
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTableLayout2) {
-				return (CSSTableLayout2) parentLayout;
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#postValidate()
-	 */
-	public void postValidate() {
-		CSSTableLayout2 tableLayout = getTableLayoutContext();
-		if (tableLayout == null) {
-			super.postValidate();
-		} else {
-			Rectangle r = getTRGroupRect(tableLayout);
-			if (r != null) {
-				_blockBox.setXYWidthHeight(r);
-				getCSSFigure().setBounds(r);
-				List list = getCSSFigure().getChildren();
-				for (int i = 0; i < list.size(); i++) {
-					((FlowFigure) list.get(i)).postValidate();
-				}
-			} else {
-				super.postValidate();
-			}
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	private Rectangle getTRGroupRect(CSSTableLayout2 tableLayout) {
-		TableRowGroupInfo groupinfo = tableLayout.getGroupInfo(this
-				.getCSSFigure());
-		int rowIndex = groupinfo.getRowIndex();
-		int rowCount = groupinfo.getRowCount();
-		int y = (rowIndex + 1) * tableLayout.getVSpacing();
-		for (int k = 0; k < rowIndex; k++) {
-			y += tableLayout.getRowHeights()[k];
-		}
-		if (tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			y += tableLayout.getCaptionSize().height;
-		}
-
-		int height = (rowCount - 1) * tableLayout.getVSpacing();
-		for (int k = 0; k < rowCount; k++) {
-			height += tableLayout.getRowHeights()[rowIndex + k];
-		}
-		//ICSSFigure figure = groupinfo.getFigure();
-		return new Rectangle(tableLayout.getRowX(), y, tableLayout
-				.getRowWidth(), height);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#useLocalCoordinates()
-	 */
-	public boolean useLocalCoordinates() {
-		// if is in table, we don't use local coordinates.
-		return getTableLayoutContext() == null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-		if (getTableLayoutContext() == null) {
-			super.endBlock();
-		} else {
-			layoutLines();
-		}
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layout()
-	// */
-	// protected void layout()
-	// {
-	// CSSTableLayout2 tableLayout = getTableLayoutContext();
-	// if (tableLayout == null)
-	// {
-	// // we are not in table? treat as block.
-	// super.layout();
-	// }
-	// else
-	// {
-	// // ok, we are in table. we need to layout our children.
-	// TableRowGroupInfo groupInfo =
-	// tableLayout.getGroupInfo(this.getCSSFigure());
-	// int[] rowHeights = tableLayout.getRowHeights();
-	// int vspacing = tableLayout.getVSpacing();
-	// int rowwidth = getCSSFigure().getBounds().width;// XXX: get from table
-	// layout?
-	// int grouprowindex = groupInfo.getRowIndex();
-	// List rows = groupInfo.getRowList();
-	// for (int i=0, size=rows.size(); i<size; i++)
-	// {
-	// TableRowInfo rowinfo = (TableRowInfo) rows.get(i);
-	// ICSSFigure figure = rowinfo.getFigure();
-	//                
-	// int y = 0;
-	// int rowindex = rowinfo.getRowIndex();
-	// for (int row=grouprowindex; row<rowindex; row++)
-	// {
-	// y += rowHeights[row];
-	// y += vspacing;
-	// }
-	// int height = rowHeights[rowindex];
-	// Rectangle rect = new Rectangle(0, y, rowwidth, height);
-	// figure.setBounds(rect);
-	// }
-	// }
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#handlingBorderForBlock()
-	 */
-	public boolean handlingBorderForBlock() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRLayout.java
deleted file mode 100644
index 12590c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRLayout.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSTRLayout extends CSSBlockFlowLayout {
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTRLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * @return the parent figure of TRGroup should be table figure. If so, return the
-     * corresponding table layout.
-	 */
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTableLayout2) {
-				return (CSSTableLayout2) parentLayout;
-			} else if (parentLayout instanceof CSSTRGroupLayout) {
-				return ((CSSTRGroupLayout) parentLayout)
-						.getTableLayoutContext();
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @return the group layout or null
-	 */
-	public CSSTRGroupLayout getTRGroupLayout() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTRGroupLayout) {
-				return ((CSSTRGroupLayout) parentLayout);
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#postValidate()
-	 */
-	public void postValidate() {
-		CSSTableLayout2 tableLayout = getTableLayoutContext();
-		if (tableLayout == null) {
-			// we are not in table? treat as block.
-			super.postValidate();
-		} else {
-			Rectangle r = getTRRect(tableLayout, getTRGroupLayout());
-			if (r != null) {
-				_blockBox.setXYWidthHeight(r);
-				getCSSFigure().setBounds(r);
-				List list = getCSSFigure().getChildren();
-				for (int i = 0; i < list.size(); i++) {
-					((FlowFigure) list.get(i)).postValidate();
-				}
-			} else {
-				super.postValidate();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-		if (this.getTableLayoutContext() == null) {
-			super.endBlock();
-		} else {
-			layoutLines();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#useLocalCoordinates()
-	 */
-	public boolean useLocalCoordinates() {
-		return this.getTableLayoutContext() == null;
-	}
-
-	private Rectangle getTRRect(CSSTableLayout2 tableLayout,
-			CSSTRGroupLayout groupLayout) {
-		TableRowInfo rowinfo = tableLayout.getRowInfo(this.getCSSFigure());
-		int rowIndex = rowinfo.getRowIndex();
-		int y = (rowIndex + 1) * tableLayout.getVSpacing();
-		for (int k = 0; k < rowIndex; k++) {
-			y += tableLayout.getRowHeights()[k];
-		}
-		if (tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			y += tableLayout.getCaptionSize().height;
-		}
-
-		int height = tableLayout.getRowHeights()[rowIndex];
-		//ICSSFigure figure = rowinfo.getFigure();
-		return new Rectangle(tableLayout.getRowX(), y, tableLayout
-				.getRowWidth(), height);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#handlingBorderForBlock()
-	 */
-	public boolean handlingBorderForBlock() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCaptionLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCaptionLayout.java
deleted file mode 100644
index 3d42a50..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCaptionLayout.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSTableCaptionLayout extends CachedTableCellLayout {
-	private CSSTableLayout2 _tableLayout;
-
-	private TableCaptionInfo _caption;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTableCaptionLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#invalidate()
-	 */
-	public void invalidate() {
-		super.invalidate();
-
-		_tableLayout = null;
-		_caption = null;
-	}
-
-	public Rectangle getCellRect() {
-		int x = 0;
-
-		int[] rowHeights = _tableLayout.getRowHeights();
-		int vspacing = _tableLayout.getVSpacing();
-		int y = vspacing;
-		if (_caption != null && "bottom".equalsIgnoreCase(_caption.getAlign())) //$NON-NLS-1$
-		{
-			for (int row = 0; row < rowHeights.length; row++) {
-				y += rowHeights[row];
-				y += vspacing;
-			}
-		}
-
-		int height = 0;
-		height = _tableLayout.getCaptionSize().height;
-		int width = _tableLayout.getCaptionSize().width;
-		Rectangle rect = new Rectangle(x, y, width, height);
-		return rect;
-	}
-
-	/**
-	 * the parent figure of TRGroup should be table figure. If so, return the
-	 * corresponding table layout.
-	 * 
-	 * @return the css table layout context or null if none.
-	 */ 
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTableLayout2) {
-				return (CSSTableLayout2) parentLayout;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @return true if the table has a caption
-	 */
-	public boolean initializeTableInfo() {
-		_caption = null;
-		_tableLayout = getTableLayoutContext();
-		if (_tableLayout != null) {
-			_caption = _tableLayout.getCaptionInfo();
-			return _caption != null;
-		}
-		return false;
-	}
-
-	/**
-	 * @return the table layout
-	 */
-	public CSSTableLayout2 getTableLayout() {
-		return _tableLayout;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCellLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCellLayout.java
deleted file mode 100644
index 1eb62e8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCellLayout.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.css2.layout.LineBox;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta;
-
-/**
- * This layout is for those thigns that it's parent will decide its size. Such
- * as table cell.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CSSTableCellLayout extends CachedTableCellLayout {
-	private CSSTableLayout2 _tableLayout;
-
-	private TableRowInfo _rowinfo;
-
-	private TableCellInfo _cellinfo;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTableCellLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#invalidate()
-	 */
-	public void invalidate() {
-		super.invalidate();
-
-		_tableLayout = null;
-		_rowinfo = null;
-		_cellinfo = null;
-	}
-
-	protected void endBlock() {
-		if (isTable()) {
-			verticalLayoutLines();
-			layoutLines();
-		} else {
-			super.endBlock();
-		}
-	}
-
-	/**
-	 * process the vertical layout lines
-	 */
-	protected void verticalLayoutLines() {
-		List lines = _blockBox.getFragments();
-
-		String verticalStyle = getVerticalAlign();
-		int linesHeight = 0;
-
-		if (lines != null && !lines.isEmpty()) {
-			FlowBox bottomBox = ((FlowBox) lines.get(lines.size() - 1));
-			FlowBox topBox = ((FlowBox) lines.get(0));
-			linesHeight = bottomBox.getY() + bottomBox.getHeight() - topBox.getY();
-		}
-		int movement = 0;
-		if (VerticalAlignMeta.BOTTOM.equals(verticalStyle)) {
-			movement = _blockBox.getHeight() - linesHeight
-					- _blockBox.getBorderPaddingHeight() / 2;
-		} else if (VerticalAlignMeta.TOP.equals(verticalStyle)) {
-			movement = 0;
-		}
-		// else if (VerticalAlignMeta.BASELINE.equals(verticalStyle))
-		// {
-		// movement = _blockBox.getHeight() - linesHeight;
-		// }
-		else // if (VerticalAlignMeta.MIDDLE.equals(verticalStyle))
-		{
-			movement = (_blockBox.getHeight() - linesHeight - _blockBox
-					.getBorderPaddingHeight()) / 2;
-		}
-		// VerticalAlignMeta.TOP, ICSSPropertyID.VAL_AUTO and others
-		// else
-		// {
-		// movement = 0;
-		// }
-		if (lines != null) {
-			for (int i = 0, n = lines.size(); i < n; i++) {
-				if (lines.get(i) instanceof LineBox) {
-					LineBox lineBox = (LineBox) lines.get(i);
-					int LineMovement = Math.max(lineBox.getMarginInsets()
-							.getHeight(), movement);
-					lineBox.setY(lineBox.getY() + LineMovement
-							- lineBox.getMarginInsets().getHeight());
-				}
-			}
-		}
-	}
-
-	private String getVerticalAlign() {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			return style.getStyleProperty(ICSSPropertyID.ATTR_VERTICAL_ALIGN)
-					.toString();
-		}
-		return VerticalAlignMeta.MIDDLE;
-	}
-
-	public Rectangle getCellRect() {
-		int columnIndex = _cellinfo.getColumnIndex();
-		int rowIndex = _cellinfo.getRowIndex();
-		int[] columnWidths = _tableLayout.getColumnWidths();
-		int hspacing = _tableLayout.getHSpacing();
-		int x = hspacing;
-		for (int col = 0; col < columnIndex; col++) {
-			x += columnWidths[col];
-			x += hspacing;
-		}
-
-		int[] rowHeights = _tableLayout.getRowHeights();
-		int vspacing = _tableLayout.getVSpacing();
-		int y = vspacing;
-		for (int row = 0; row < rowIndex; row++) {
-			y += rowHeights[row];
-			y += vspacing;
-		}
-		if (_tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(_tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			y += _tableLayout.getCaptionSize().height;
-		}
-
-		int width = _tableLayout.getCellWidth(_cellinfo, columnWidths);
-		int height = _tableLayout.getCellHeight(_cellinfo, rowHeights);
-
-		Rectangle rect = new Rectangle(x, y, width, height);
-		return rect;
-	}
-
-	/**
-	 * the parent figure of TRGroup should be table figure. If so, return the
-	 * corresponding table layout.
-	 * 
-	 * @return the table layout context
-	 */
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTRLayout) {
-				return ((CSSTRLayout) parentLayout).getTableLayoutContext();
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @return true if the table layout has cell info
-	 */
-	public boolean initializeTableInfo() {
-		_rowinfo = null;
-		_cellinfo = null;
-		_tableLayout = getTableLayoutContext();
-		if (_tableLayout != null) {
-			_rowinfo = _tableLayout.getRowInfo((CSSFigure) this.getCSSFigure()
-					.getParent());
-			if (_rowinfo != null) {
-				_cellinfo = _rowinfo.getCellInfo(this.getCSSFigure());
-				if (_cellinfo != null) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return the table layout or nul if none
-	 */
-	public CSSTableLayout2 getTableLayout() {
-		return _tableLayout;
-	}
-
-	/**
-	 * @return the table cell info or null
-	 */
-	public TableCellInfo getTableCellInfo() {
-		return _cellinfo;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableLayout2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableLayout2.java
deleted file mode 100644
index 77a3877..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableLayout2.java
+++ /dev/null
@@ -1,707 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.swt.SWT;
-
-/**
- * see also http://www.w3.org/TR/REC-CSS2/tables.html
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CSSTableLayout2 extends CSSBlockFlowLayout implements ICSSPainter {
-	static Logger _log = PDPlugin.getLogger(CSSTableLayout2.class);
-
-	int _hspacing;
-
-	int _vspacing;
-
-	int[] _columnWidths;
-
-	int[] _rowHeights;
-
-	Dimension _captionSize;
-
-	// _tableInfo will be initialized in preLayout
-	TableInfo _tableInfo;
-
-	private int _internalTableWidth;
-
-	private int _internalTableHeight;
-
-	private int _rowx;
-
-	private int _rowwidth;
-
-	/**
-	 * @param flowfigure
-	 */
-	public CSSTableLayout2(CSSFigure flowfigure) {
-		super(flowfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#preLayout()
-	 */
-	protected void preLayout() {
-		// super.preLayout will setup the block box.
-		super.preLayout();
-
-		ICSSStyle style = this.getCSSStyle();
-
-		_hspacing = _vspacing = 3; // default value
-
-		if (style != null) {
-			Object borderspacing = style
-					.getStyleProperty(ICSSPropertyID.ATTR_BORDER_SPACING);
-			if (borderspacing instanceof int[]) {
-				int[] intvalues = (int[]) borderspacing;
-				_hspacing = intvalues[0];
-				_vspacing = intvalues[1];
-			} else {
-				ITagEditInfo info = (ITagEditInfo) style
-						.getAdapter(ITagEditInfo.class);
-				if (info != null && info.needTableDecorator()) {
-					// default decorating value. to make things look more
-					// separated.
-					if (_hspacing < 5) {
-						_hspacing = 5;
-					}
-					if (_vspacing < 5) {
-						_vspacing = 5;
-					}
-				}
-			}
-		}
-
-		// TODO: support caption
-		_tableInfo = new TableInfo(getCSSFigure());
-
-		// construct the table structure.
-		_tableInfo.constructTable();
-
-		// calculate the user specified width/height for table and cells.
-		// contentWidth is the user specified content width. If <= 0 means no
-		// user
-		// specification.
-		int contentWidth = this._blockBox.getContentWidth();
-		int availableWidth = this._blockBox.getRecommendedContentWidth();
-		int contentHeight = this._blockBox.getContentHeight();
-
-		_tableInfo.calculateWidth(contentWidth, availableWidth);
-		_tableInfo.calculateHeight(contentHeight);
-
-		int columnCount = _tableInfo.getColumnCount();
-
-		int columnMinWidths[] = new int[columnCount];
-		int columnMaxWidths[] = new int[columnCount];
-
-		// For each column, determine a maximum and minimum column width from
-		// the cells that span only that column. The minimum is that required by
-		// the cell with the largest minimum cell width (or the column 'width',
-		// whichever is larger). The maximum is that required by the cell with
-		// the
-		// largest maximum cell width (or the column 'width', whichever is
-		// larger).
-		List cells = _tableInfo.getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			if (cellinfo.getColSpan() == 1) {
-				int column = cellinfo.getColumnIndex();
-				Dimension mincw = cellinfo.getMinCWDimension();
-				Dimension maxcw = cellinfo.getMaxCWDimension();
-				if (maxcw.width < mincw.width) {
-					maxcw.width = mincw.width;
-				}
-				if (mincw.width > columnMinWidths[column]) {
-					columnMinWidths[column] = mincw.width;
-				}
-				if (maxcw.width > columnMaxWidths[column]) {
-					columnMaxWidths[column] = maxcw.width;
-				}
-			}
-		}
-		// For caption, determine a maximum and minimum width from it.
-		int captionWidth = 0;
-		if (_tableInfo.getCaption() != null) {
-			captionWidth = _tableInfo.getCaption().getDimension().width;
-		}
-
-		// For each cell that spans more than one column, increase the
-		// minimum widths of the columns it spans so that together, they
-		// are at least as wide as the cell. Do the same for the maximum
-		// widths. If possible, widen all spanned columns by approximately
-		// the same amount.
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			int colspan = cellinfo.getColSpan();
-			if (colspan > 1) {
-				int column = cellinfo.getColumnIndex();
-				Dimension mincw = cellinfo.getMinCWDimension();
-				Dimension maxcw = cellinfo.getMaxCWDimension();
-
-				adjustWidth(column, colspan, mincw.width, columnMinWidths);
-				adjustWidth(column, colspan, maxcw.width, columnMaxWidths);
-			}
-		}
-
-		int sigmaMinWidth = 0;
-		int sigmaMaxWidth = 0;
-		for (int i = 0; i < columnMinWidths.length; i++) {
-			sigmaMinWidth += columnMinWidths[i];
-			if (columnMaxWidths[i] == Integer.MAX_VALUE) {
-				sigmaMaxWidth = Integer.MAX_VALUE;
-			} else if (sigmaMaxWidth != Integer.MAX_VALUE) {
-				sigmaMaxWidth += columnMaxWidths[i];
-				if (sigmaMaxWidth < 0) {
-					sigmaMaxWidth = Integer.MAX_VALUE;
-				}
-			}
-		}
-		int spacingall = (columnMinWidths.length + 1) * _hspacing;
-		sigmaMinWidth += spacingall;
-		if (sigmaMaxWidth != Integer.MAX_VALUE) {
-			sigmaMaxWidth += spacingall;
-			if (sigmaMaxWidth < 0) {
-				sigmaMaxWidth = Integer.MAX_VALUE;
-			}
-		}
-
-		int tableWidth = _tableInfo.getTableWidth();
-		if (tableWidth > 0) {
-			// If the 'table' or 'inline-table' element's 'width' property has a
-			// specified value (W) other than 'auto', the property's computed
-			// value
-			// is the greater of W and the minimum width required by all the
-			// columns
-			// plus cell spacing or borders (MIN). If W is greater than MIN, the
-			// extra
-			// width should be distributed over the columns.
-			int maxMin = Math.max(captionWidth, sigmaMinWidth);
-			if (maxMin >= tableWidth) {
-				tableWidth = maxMin;
-			}
-			distribute(tableWidth - sigmaMinWidth, columnMinWidths,
-					columnMaxWidths);
-		} else {
-			// If the 'table' or 'inline-table' element has 'width: auto', the
-			// computed
-			// table width is the greater of the table's containing block width
-			// and MIN.
-			// However, if the maximum width required by the columns plus cell
-			// spacing or
-			// borders (MAX) is less than that of the containing block, use MAX.
-			// int availableWidth = this.getCurrentLine().getAvailableWidth();
-			int maxMin = Math.max(captionWidth, sigmaMaxWidth);
-			if (maxMin <= availableWidth) {
-				// TODO: if _tableInfo.hasWidthPercentage, then we need take
-				// that into consideration
-				// to distribute the column width. Left to next version.
-				tableWidth = maxMin;
-				// columnMinWidths = columnMaxWidths;
-			} else {
-				tableWidth = availableWidth;
-			}
-			distribute(tableWidth - sigmaMinWidth, columnMinWidths,
-					columnMaxWidths);
-		}
-
-		// now columnMinWidths contains width for each column
-		_columnWidths = columnMinWidths;
-
-		// ok, we have finished calculating column width.
-		// next we need to find out row heights.
-		_rowHeights = new int[_tableInfo.getRowCount()];
-
-		// first find out those TR that has height settings and use them.
-		List rows = _tableInfo.getRows();
-		for (int i = 0, size = rows.size(); i < size && i < _rowHeights.length; i++) {
-			TableRowInfo rowInfo = (TableRowInfo) rows.get(i);
-			if (rowInfo.getSpecifiedRowHeight() > 0) {
-				_rowHeights[i] = rowInfo.getSpecifiedRowHeight();
-			}
-		}
-
-		// First the cells don't span multiple rows.
-		cells = _tableInfo.getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			IFigure figure = cellinfo.getFigure();
-			int rowspan = cellinfo.getRowSpan();
-			if (rowspan == 1) {
-				int cellWidth = getCellWidth(cellinfo, _columnWidths);
-				Dimension d = figure.getPreferredSize(cellWidth, cellinfo
-						.getHeight());
-				if (d.height > _rowHeights[cellinfo.getRowIndex()]) {
-					_rowHeights[cellinfo.getRowIndex()] = d.height;
-				}
-			}
-		}
-
-		// Next those cells span multiple rows.
-		cells = _tableInfo.getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			IFigure figure = cellinfo.getFigure();
-			int rowspan = cellinfo.getRowSpan();
-			if (rowspan > 1) {
-				int cellWidth = getCellWidth(cellinfo, _columnWidths);
-				Dimension d = figure.getPreferredSize(cellWidth, cellinfo
-						.getHeight());
-				if (d.height > getCellHeight(cellinfo, _rowHeights)) {
-					adjustHeight(cellinfo.getRowIndex(), rowspan, d.height,
-							_rowHeights);
-				}
-			}
-		}
-
-		// Next we may need distribute height.
-		int sigmaHeight = (_tableInfo.getRowCount() + 1) * _vspacing;
-		for (int i = 0; i < _rowHeights.length; i++) {
-			sigmaHeight += _rowHeights[i];
-		}
-		if (sigmaHeight < contentHeight) {
-			distributeHeights(contentHeight - sigmaHeight, _rowHeights);
-		}
-
-		// now we have calculated the width and height of all cells.
-		// FIXME: border?
-		Insets insets = (style == null ? new Insets() : style.getBorderInsets()
-				.getAdded(style.getPaddingInsets()));
-		_internalTableWidth = (_tableInfo.getColumnCount() + 1) * _hspacing;
-		for (int i = 0; i < _columnWidths.length; i++) {
-			_internalTableWidth += _columnWidths[i];
-		}
-		int minWidth = getLengthValue(style, ICSSPropertyID.ATTR_MIN_WIDTH);
-		_internalTableWidth = _internalTableWidth > minWidth ? _internalTableWidth
-				: minWidth;
-
-		_blockBox.setWidth(_internalTableWidth + insets.getWidth());
-		_internalTableHeight = (_tableInfo.getRowCount() + 1) * _vspacing;
-		for (int i = 0; i < _rowHeights.length; i++) {
-			_internalTableHeight += _rowHeights[i];
-		}
-		int minHeight = getLengthValue(style, ICSSPropertyID.ATTR_MIN_HEIGHT);
-		_internalTableHeight = _internalTableHeight > minHeight ? _internalTableHeight
-				: minHeight;
-
-		int captionHeight = 0;
-		if (_tableInfo.getCaption() != null) {
-			_captionSize = _tableInfo.getCaption().getFigure().getPreferredSize(
-					_internalTableWidth, SWT.DEFAULT);
-			captionHeight = _captionSize.height;
-		} else {
-			_captionSize = null;
-		}
-		_internalTableHeight += captionHeight;
-
-		_blockBox.setHeight(_internalTableHeight + insets.getHeight());
-
-		_rowwidth = _internalTableWidth - 2 * _hspacing;
-		_rowx = _hspacing; // XXX: table border width left?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-		_blockBox.setWidth(_internalTableWidth
-				+ _blockBox.getBorderPaddingWidth());
-		_blockBox.setHeight(_internalTableHeight
-				+ _blockBox.getBorderPaddingHeight());
-		super.endBlock();
-	}
-
-	//
-	// /**
-	// * when some of the column has percentage width, and sigmaMax smaller than
-	// container,
-	// * @param containerWidth
-	// * @param columnMinWidths
-	// * @param columnMaxWidths
-	// * @return
-	// */
-	// private int distribute2(int containerWidth, int[] columnMinWidths, int[]
-	// columnMaxWidths)
-	// {
-	//        
-	// }
-	//    
-	/**
-	 * Distribute the additional width to columnMinWidths, using max width as a
-	 * possible reference on how to distribute.
-	 * 
-	 * @param toDistribute
-	 * @param columnMinWidths
-	 * @param columnMaxWidths
-	 */
-	private void distribute(int toDistribute, int[] columnMinWidths,
-			int[] columnMaxWidths) {
-		if (toDistribute <= 0)
-			return;
-		if (columnMinWidths.length == 0)
-			return;
-
-		int[] delta = new int[columnMinWidths.length];
-		int sigmaDelta = 0;
-		for (int i = 0; i < columnMinWidths.length; i++) {
-			if (_tableInfo.getWidthSpecified()[i]) {
-				delta[i] = 0;
-			} else {
-				delta[i] = columnMaxWidths[i] - columnMinWidths[i];
-				if (delta[i] <= 0) {
-					delta[i] = 0;
-				}
-				sigmaDelta += delta[i];
-			}
-		}
-
-		// re-calculate the width of columns that use a percentage
-		int[] widthPercentages = _tableInfo.getWidthPercentages();
-		int[] calculatedWidths = new int[columnMaxWidths.length];
-		int percentageWidthsTotal = 0;
-		for (int i=0; i < widthPercentages.length; i++) {
-			if (widthPercentages[i] > 0) {
-				// add the widths of the percent width columns
-				// back into the available pool
-				toDistribute += columnMinWidths[i];
-			}
-		}
-
-		for (int i=0; i < widthPercentages.length; i++) {
-			if (widthPercentages[i] > 0) {
-				double val = toDistribute * (widthPercentages[i] / 100.0);
-				calculatedWidths[i] = (int) val;
-				if (calculatedWidths[i] < columnMinWidths[i]) {
-					// percent width is too small, so use
-					// the columnMinWidth instead
-					calculatedWidths[i] = columnMinWidths[i];
-				}
-				percentageWidthsTotal += calculatedWidths[i];
-			} else {
-				calculatedWidths[i] = 0;
-			}
-		}
-
-		if (percentageWidthsTotal > toDistribute) {
-			// calculated width is too large, so shrink the columns
-			// to fit the available space
-			int widthColumnCount = 0;
-			for (int i=0; i < widthPercentages.length; i++) {
-				if (widthPercentages[i] > 0) {
-					widthColumnCount++;
-				}
-			}
-
-			int extraSpace = percentageWidthsTotal - toDistribute;
-			int shrinkBy = (int)
-				Math.ceil((double) extraSpace / (double) widthColumnCount);
-
-			for (int i=0; i < calculatedWidths.length; i++) {
-				if (calculatedWidths[i] > 0) {
-					calculatedWidths[i] -= shrinkBy;
-				}
-			}
-		}
-
-		// adjust the columnMinWidth values to compensate for the
-		// calculated percentages
-		for (int i=0; i < calculatedWidths.length; i++) {
-			// if column size was calculated, then re-calculate the delta
-			if (calculatedWidths[i] > 0) {
-				// remove the previous calculation from the sigmaDelta
-				int len = columnMaxWidths[i] - columnMinWidths[i];
-				delta[i] = 0;
-				if (len <= 0) {
-					len = 0;
-				}
-				sigmaDelta -= len;
-
-				// change the minSize to the calculated size
-				columnMinWidths[i] = calculatedWidths[i];
-				toDistribute -= columnMinWidths[i];
-			}
-		}
-
-		if (sigmaDelta == 0) {
-			// may happen with percent width column calculations.
-			// find out how much space is left and distribute it
-			// equally to all columns that are not fixed-width.
-			int extraSpace = toDistribute;
-			for (int i=0; i < columnMinWidths.length; i++) {
-				extraSpace -= columnMinWidths[i];
-			}
-
-			averageDeltaToCell(columnMinWidths, extraSpace);
-		} else {
-			int left = toDistribute;
-			for (int i = 0; i < columnMinWidths.length - 1; i++) {
-				if (delta[i] > 0) {
-					int add = delta[i] * toDistribute / sigmaDelta;
-					left -= add;
-					columnMinWidths[i] += add;
-				}
-			}
-			columnMinWidths[columnMinWidths.length - 1] += left;
-		}
-	}
-
-	private void averageDeltaToCell(int[] columnMinWidths, int toDistribute) {
-
-		if (toDistribute <= 0) {
-			return;
-		}
-		ArrayList list = new ArrayList();
-		for (int i = 0; i < columnMinWidths.length; i++) {
-			if (!_tableInfo.getWidthSpecified()[i]) {
-				list.add(new Integer(i));
-			}
-		}
-		if (list.size() == 0) {
-			for (int i = 0; i < columnMinWidths.length; i++) {
-				list.add(new Integer(i));
-			}
-		}
-		int padding = toDistribute / list.size();
-		int left = toDistribute % list.size();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			columnMinWidths[((Integer) list.get(i)).intValue()] += padding;
-		}
-		if (left > 0) {
-			for (int i = 0; i < left; i++) {
-				columnMinWidths[((Integer) list.get(i)).intValue()] += 1;
-			}
-		}
-	}
-
-	/**
-	 * @param i
-	 * @param heights
-	 */
-	private void distributeHeights(int toDistribute, int[] heights) {
-		if (heights.length == 0)
-			return;
-		int eachDelta = toDistribute / heights.length;
-		for (int i = 0; i < heights.length - 1; i++) {
-			heights[i] += eachDelta;
-		}
-		heights[heights.length - 1] += toDistribute - (heights.length - 1)
-				* eachDelta;
-	}
-
-	/**
-	 * @param cellinfo
-	 * @param heights
-	 * @return the cell height
-	 */
-	public int getCellHeight(TableCellInfo cellinfo, int[] heights) {
-		int rowIndex = cellinfo.getRowIndex();
-		int rowspan = cellinfo.getRowSpan();
-		int h = 0;
-		for (int i = 0; i < rowspan; i++) {
-			h += heights[rowIndex + i];
-		}
-		h += (rowspan - 1) * _vspacing;
-		return h;
-	}
-
-	/**
-	 * @param cellinfo
-	 * @param widths
-	 * @return the cell width
-	 */
-	public int getCellWidth(TableCellInfo cellinfo, int[] widths) {
-		int columnIndex = cellinfo.getColumnIndex();
-		int colspan = cellinfo.getColSpan();
-		int w = 0;
-		for (int i = 0; i < colspan; i++) {
-			w += widths[columnIndex + i];
-		}
-		w += (colspan - 1) * _hspacing;
-		return w;
-	}
-
-	/**
-	 * @param column
-	 *            the start column
-	 * @param colspan
-	 *            number of columns
-	 * @param width
-	 *            desired width
-	 * @param columnWidths
-	 *            current columns widths. After the adjust, need make sure the
-	 *            columnWidths to be bigger than desired width
-	 */
-	private void adjustWidth(int column, int colspan, int width,
-			int[] columnWidths) {
-		adjustSpan(column, colspan, width, columnWidths, _hspacing);
-	}
-
-	/**
-	 * @see #adjustWidth(int, int, int, int[])
-	 */
-	private void adjustHeight(int rowIndex, int rowspan, int height,
-			int[] heights) {
-		adjustSpan(rowIndex, rowspan, height, heights, _vspacing);
-	}
-
-	static private void adjustSpan(int column, int colspan, int width,
-			int[] columnWidths, int spacing) {
-		int spanwidth = 0;
-		for (int i = 0; i < colspan; i++) {
-			spanwidth += columnWidths[column + i];
-		}
-		// XXX: vspacing here?
-		spanwidth += (colspan - 1) * spacing;
-
-		if (spanwidth >= width) {
-			return;
-		}
-        int delta = width - spanwidth;
-        int deltaeach = delta / colspan;
-        for (int i = 0; i < colspan - 1; i++) {
-        	columnWidths[column + i] += deltaeach;
-        }
-        columnWidths[column + colspan - 1] += (delta - (colspan - 1)
-        		* deltaeach);
-	}
-
-	/**
-	 * @return the row heights
-	 */
-	public int[] getRowHeights() {
-		return _rowHeights;
-	}
-
-	/**
-	 * @return the column widths
-	 */
-	public int[] getColumnWidths() {
-		return _columnWidths;
-	}
-
-	/**
-	 * @return the vertical spacing value
-	 */
-	public int getVSpacing() {
-		return _vspacing;
-	}
-
-	/**
-	 * @return the horizontal spacing value
-	 */
-	public int getHSpacing() {
-		return _hspacing;
-	}
-
-	/**
-	 * @param figure
-	 * @return the table row info for the figure
-	 */
-	public TableRowInfo getRowInfo(CSSFigure figure) {
-		return _tableInfo.findRowInfo(figure);
-	}
-
-	/**
-	 * @return the table caption info
-	 */
-	public TableCaptionInfo getCaptionInfo() {
-		return _tableInfo.getCaption();
-	}
-
-	/**
-	 * @param figure
-	 * @return the table row group info for the figure
-	 */
-	public TableRowGroupInfo getGroupInfo(CSSFigure figure) {
-		return _tableInfo.findGroupInfo(figure);
-	}
-
-	/**
-	 * @return the row's x
-	 */
-	public int getRowX() {
-		return _rowx;
-	}
-
-	/**
-	 * @return the row's width
-	 */
-	public int getRowWidth() {
-		return _rowwidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#shouldExpand()
-	 */
-	public boolean shouldExpand() {
-		return false;
-	}
-
-	/**
-	 * @return the rendered dimensions of the table caption
-	 */
-	public Dimension getCaptionSize() {
-		return _captionSize;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	public void paintFigure(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null && info.needTableDecorator()) {
-				List cells = _tableInfo.getCells();
-				for (int i = 0, size = cells.size(); i < size; i++) {
-					TableCellInfo cellInfo = (TableCellInfo) cells.get(i);
-					IFigure cellfigure = cellInfo.getFigure();
-					Rectangle rect = cellfigure.getBounds().getCopy();
-					rect = rect.expand(1, 1);
-					g.setLineStyle(Graphics.LINE_SOLID);
-					g.setLineWidth(1);
-					g.setForegroundColor(ColorConstants.lightGray);
-					g.drawRectangle(rect);
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CachedTableCellLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CachedTableCellLayout.java
deleted file mode 100644
index 24e2be8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CachedTableCellLayout.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.BoxUtil;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class CachedTableCellLayout extends CSSBlockFlowLayout 
-{
-	private Dimension _pageSize = new Dimension();
-
-	private boolean _calculatingSize = false;
-
-	private int _pageSizeCacheKeys[] = new int[4];
-
-	private Dimension _pageSizeCacheValues[] = new Dimension[4];
-
-	private int _recommendedWidth;
-
-	private Dimension _cacheMaxWidthSize = null;
-
-	private boolean _isTable;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CachedTableCellLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * when figure revalidated, means some child or itself get changed somehow,
-	 * so clear the cache information here.
-	 */
-	public void figureRevalidate() {
-		super.figureRevalidate();
-		_pageSizeCacheKeys = new int[4];
-		_pageSizeCacheValues = new Dimension[4];
-		_pageSize = new Dimension();
-		_recommendedWidth = 0;
-		_cacheMaxWidthSize = null;
-		_isTable = false;
-	}
-
-	/**
-	 * TODO: This method is not being called.
-	 */
-	public void postValidate() {
-		if (_isTable) {
-			if (_calculatingSize) {
-				_pageSize.width = _blockBox.getWidth();
-				_pageSize.height = _blockBox.getHeight();
-			} else {
-				if (_isTable) {
-					Rectangle rect = getCellRect();
-					_blockBox.setXYWidthHeight(rect);
-					this.getCSSFigure().setBounds(rect);
-				}
-			}
-			List list = getCSSFigure().getChildren();
-			for (int i = 0, n = list.size(); i < n; i++) {
-				((FlowFigure) list.get(i)).postValidate();
-			}
-		} else {
-			super.postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#preLayout()
-	 */
-	protected void preLayout() {
-		_isTable = initializeTableInfo();
-		if (_isTable) {
-			if (!_calculatingSize) {
-				// XXX: I don't know why need to call setValid(false) here, if I
-				// don't call
-				// it, the layout will be wrong.
-				getCSSFigure().setValid(false);
-			}
-		}
-		super.preLayout();
-	}
-
-	/**
-	 * @return the cell rectangle
-	 */
-	protected abstract Rectangle getCellRect();
-
-	/**
-	 * @return true if initialized
-	 */
-	protected abstract boolean initializeTableInfo();
-
-	protected void setupBlock() {
-		if (_isTable) {
-			// Remove all current Fragments
-			_blockBox.clear();
-
-			if (_calculatingSize) {
-				// we are not in the real layout
-				// Setup the one fragment for this Block with the correct X and
-				// available width
-				int recommendedWidth = getRecommendedWidth();
-				_blockBox.setRecommendedWidth(recommendedWidth);
-
-				if (recommendedWidth > 0
-						&& recommendedWidth != Integer.MAX_VALUE) {
-					_blockBox.setWidth(recommendedWidth);
-				}
-			} else {
-				Rectangle rect = getCellRect();
-				_blockBox.setWidth(rect.width);
-				_blockBox.setRecommendedWidth(rect.width);
-				_blockBox.setHeight(rect.height);
-				_blockBox.setRecommendedHeight(rect.height);
-			}
-
-			BoxUtil.setupBorderPaddingMargin(_blockBox, getCSSStyle());
-		} else {
-			super.setupBlock();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(IFigure container, int width, int h) {
-		if (this.isCalculatingMaxWidth()) {
-			return getMaxContentWidthSize(container, width, h);
-		}
-		try {
-			_calculatingSize = true;
-			// if (width >= 0)
-			// {
-			// width = Math.max(0, width - container.getInsets().getWidth());
-			// }
-
-			for (int i = 0; i < 4; i++) {
-				if (_pageSizeCacheKeys[i] == width
-						&& _pageSizeCacheValues[i] != null) {
-					if (h > _pageSizeCacheValues[i].height) {
-						return new Dimension(_pageSizeCacheValues[i].width, h);
-					}
-					return _pageSizeCacheValues[i];
-				}
-			}
-
-			_pageSizeCacheKeys[3] = _pageSizeCacheKeys[2];
-			_pageSizeCacheKeys[2] = _pageSizeCacheKeys[1];
-			_pageSizeCacheKeys[1] = _pageSizeCacheKeys[0];
-			_pageSizeCacheKeys[0] = width;
-
-			_pageSizeCacheValues[3] = _pageSizeCacheValues[2];
-			_pageSizeCacheValues[2] = _pageSizeCacheValues[1];
-			_pageSizeCacheValues[1] = _pageSizeCacheValues[0];
-
-			// Flowpage must temporarily layout to determine its preferred size
-			int oldWidth = getRecommendedWidth();
-			setRecommendedWidth(width);
-			((CSSFigure) container).setValid(false);
-			container.validate();
-			((CSSFigure) container).postValidate();
-			_pageSizeCacheValues[0] = new Dimension(_pageSize);
-
-			if (width != oldWidth) {
-				setRecommendedWidth(oldWidth);
-				// container.getUpdateManager().addInvalidFigure(container);
-			}
-			if (h > _pageSizeCacheValues[0].height) {
-				return new Dimension(_pageSizeCacheValues[0].width, h);
-			}
-            return _pageSizeCacheValues[0];
-		} finally {
-			_calculatingSize = false;
-		}
-	}
-
-	private int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	private void setRecommendedWidth(int width) {
-		if (_recommendedWidth == width) {
-			return;
-		}
-		_recommendedWidth = width;
-	}
-
-	/**
-	 * @param container
-	 * @param width
-	 * @param height
-	 * @return max width size
-	 */
-	public Dimension getMaxContentWidthSize(IFigure container, int width,
-			int height) {
-		try {
-			_calculatingSize = true;
-
-			if (this._cacheMaxWidthSize == null) {
-				boolean b = getCalcuatingMaxWidth();
-				setCalculatingMaxWidth(true);
-
-				// Flowpage must temporarily layout to determine its preferred
-				// size
-				int oldWidth = getRecommendedWidth();
-				if (width <= 0) {
-					setRecommendedWidth(Integer.MAX_VALUE);
-				} else {
-					setRecommendedWidth(width);
-				}
-				((CSSFigure) container).setValid(false);
-				container.validate();
-
-				((CSSFigure) container).postValidate();
-				_cacheMaxWidthSize = new Dimension(_pageSize);
-				if (height > _pageSize.height) {
-					_cacheMaxWidthSize.height = height;
-				}
-
-				if (0 != oldWidth) {
-					setRecommendedWidth(oldWidth);
-					// container.getUpdateManager().addInvalidFigure(container);
-				}
-
-				setCalculatingMaxWidth(b);
-			}
-			return _cacheMaxWidthSize;
-		} finally {
-			_calculatingSize = false;
-		}
-	}
-
-	/**
-	 * @return Returns the _isTable.
-	 */
-	protected boolean isTable() {
-		return _isTable;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCaptionInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCaptionInfo.java
deleted file mode 100644
index 010cbc5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCaptionInfo.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.swt.SWT;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableCaptionInfo extends TableItemInfo {
-	String _align;
-
-	/**
-	 * @param figure
-	 */
-	public TableCaptionInfo(ICSSFigure figure) {
-		super(figure);
-		ICSSStyle style = figure.getCSSStyle();
-		if (style != null) {
-			_align = style.getStyleProperty(
-					ICSSPropertyID.ATTR_HORIZONTAL_ALIGN).toString();
-		}
-	}
-
-	/**
-	 * @param width 
-	 * @param height 
-	 * @return the preferred dimension of the figure
-	 */
-	public Dimension getDimension(int width, int height) {
-		return getFigure().getPreferredSize(width, height);
-	}
-
-	/**
-	 * @return getDimension(width, height)
-	 */
-	public Dimension getDimension() {
-		return getDimension(SWT.DEFAULT, SWT.DEFAULT);
-	}
-
-	/**
-	 * @return Returns the align.
-	 */
-	public String getAlign() {
-		// TODO:We do not support left/right align of caption currently. so we
-		// treat them as top.
-		if ("bottom".equalsIgnoreCase(_align)) //$NON-NLS-1$
-		{
-			return _align;
-		}
-        return "top"; //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCellInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCellInfo.java
deleted file mode 100644
index 286462a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCellInfo.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.IntFlexArray;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableCellInfo extends TableItemInfo {
-	int _rowSpan = 1;
-
-	int _colSpan = 1;
-
-	int _colIndex;
-
-	int _rowIndex;
-
-	int _cellWidth = 0;
-
-	int _cellHeight = 0;
-
-	/**
-	 * @param childfigure
-	 */
-	public TableCellInfo(ICSSFigure childfigure) {
-		super(childfigure);
-	}
-
-	/**
-	 * @return column span
-	 */
-	public int getColSpan() {
-		return _colSpan;
-	}
-
-	/**
-	 * @return row span
-	 */
-	public int getRowSpan() {
-		return _rowSpan;
-	}
-
-	/**
-	 * @return the row index
-	 */
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-
-	/**
-	 * @return the column index
-	 */
-	public int getColumnIndex() {
-		return _colIndex;
-	}
-
-	/**
-	 * @return the minimum cell dimensions
-	 */
-	public Dimension getMinCWDimension() {
-		return getFigure().getPreferredSize(_cellWidth, _cellHeight);
-	}
-
-	/**
-	 * @return the max cell dimensions
-	 */
-	public Dimension getMaxCWDimension() {
-		ICSSFigure figure = getFigure();
-		LayoutManager layout = figure.getLayoutManager();
-		if (layout instanceof CSSTableCellLayout) {
-			Dimension d = ((CSSTableCellLayout) layout).getMaxContentWidthSize(
-					figure, _cellWidth, _cellHeight);
-			return d;
-		}
-
-        // should not happen
-        return getMinCWDimension();
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateCellInfo(TableInfoContext context) {
-		ICSSStyle style = this.getStyle();
-		_rowSpan = style.getRowSpan();
-		_colSpan = style.getColSpan();
-
-		// FIXME: we don't support rowspan and colspan to be 0.
-		// by spec, 0 means span from current col/row to end.
-		if (_rowSpan <= 0) {
-			_rowSpan = 1;
-		}
-		if (_colSpan <= 0) {
-			_colSpan = 1;
-		}
-
-		_rowIndex = context.getCurrentRow();
-
-		IntFlexArray array = context.getIntFlexArray();
-		int currentCol = context.getCurrentCol();
-
-		// find a cell that is not occupied by cells in previous rows.
-		while (array.getAt(currentCol) > 0) {
-			currentCol++;
-		}
-
-		// ok, now array.getAt(currentCol) == 0
-		_colIndex = currentCol;
-
-		for (int i = 0; i < _colSpan; i++, currentCol++) {
-			array.setAt(currentCol, _rowSpan);
-		}
-		context.setCurrentCol(currentCol);
-	}
-
-	/**
-	 * @param tableInfo 
-	 * @param tablewidth
-	 *            table width
-	 */
-	public void calculateWidth(TableInfo tableInfo, int tablewidth) {
-		ICSSStyle style = this.getFigure().getCSSStyle();
-		if (style == null) {
-			_cellWidth = -1;
-		} else {
-			Object width = style.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
-			Length recommendedWidth = (width instanceof Length) ? (Length) width
-					: null;
-
-			int rw = 0;
-			if (recommendedWidth == null || recommendedWidth.getValue() <= 0) {
-				rw = 0;
-			} else {
-				if (recommendedWidth.isPercentage()) {
-					// percentage width is used for remaining width
-					// distribution, so not used here.
-					int colspan = this.getColSpan();
-					for (int i = 0; i < colspan; i++) {
-						tableInfo.setWidthPercentage(this.getColumnIndex() + i,
-								recommendedWidth.getValue() / colspan);
-					}
-				} else {
-					rw = recommendedWidth.getValue();
-					if (!style.isSizeIncludeBorderPadding()) {
-						rw += style.getBorderInsets().getWidth()
-								+ style.getPaddingInsets().getWidth();
-					}
-					if (this.getColSpan() == 1) {
-						tableInfo.getWidthSpecified()[this.getColumnIndex()] = true;
-					}
-				}
-
-			}
-			_cellWidth = rw;
-		}
-
-	}
-
-	/**
-	 * @param tableInfo 
-	 * @param tableheight 
-	 */
-	public void calculateHeight(TableInfo tableInfo, int tableheight) {
-		ICSSStyle style = this.getFigure().getCSSStyle();
-		if (style == null) {
-			_cellHeight = -1;
-		} else {
-			Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			Length recommendedHeight = (height instanceof Length) ? (Length) height
-					: null;
-
-			int rh = 0;
-			if (recommendedHeight == null || recommendedHeight.getValue() <= 0) {
-				rh = 0;
-			} else {
-				if (recommendedHeight.isPercentage()) {
-					int rowspan = this.getRowSpan();
-					for (int i = 0; i < rowspan; i++) {
-						tableInfo.setHeightPercentage(this.getRowIndex() + i,
-								recommendedHeight.getValue() / rowspan);
-					}
-				} else {
-					rh = recommendedHeight.getValue();
-				}
-				if (!style.isSizeIncludeBorderPadding()) {
-					rh += style.getBorderInsets().getHeight()
-							+ style.getPaddingInsets().getHeight();
-				}
-			}
-			_cellHeight = rh;
-		}
-
-	}
-
-	/**
-	 * @return the height
-	 */
-	public int getHeight() {
-		return _cellHeight;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfo.java
deleted file mode 100644
index 06e135c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfo.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableInfo extends TableItemInfo {
-	private List _tableHeaderGroups = new ArrayList();
-
-	private List _tableTRandTRGs = new ArrayList();
-
-	private List _tableFooterGroups = new ArrayList();
-
-	private TableCaptionInfo _caption;
-
-	private int _columnCount;
-
-	private int _rowCount;
-
-	private List _cells = null;
-
-	private List _rows = null;
-
-	private int _tableWidth; // calculated table width, valid after calling to
-
-	// calculateTableWidth
-
-	private int _tableHeight;
-
-	private int[] _widthPercentage;
-
-	private int[] _heightPercentage;
-
-	private boolean[] _widthSpecified;
-
-	/**
-	 * @param figure
-	 */
-	public TableInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-
-	/**
-	 * @return the column count
-	 */
-	public int getColumnCount() {
-		return _columnCount;
-	}
-
-	/**
-	 * @return the row count
-	 */
-	public int getRowCount() {
-		return _rowCount;
-	}
-
-	final TableCaptionInfo getCaption() {
-        return _caption;
-    }
-
-
-    /**
-     * @return width specified
-     */
-    final boolean[] getWidthSpecified() {
-        return _widthSpecified;
-    }
-
-
-    void constructTable() {
-		List child = getFigure().getChildren();
-		for (int i = 0, size = child.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) child.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle style = ((ICSSFigure) childfigure).getCSSStyle();
-				if (style != null) {
-					String display = style.getDisplay();
-					if ("table-caption".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						_caption = new TableCaptionInfo(
-								(ICSSFigure) childfigure);
-					} else if ("table-row".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowInfo rowInfo = new TableRowInfo(
-								(ICSSFigure) childfigure);
-						_tableTRandTRGs.add(rowInfo);
-					} else if ("table-row-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowGroupInfo groupInfo = new TableRowGroupInfo(
-								(ICSSFigure) childfigure);
-						_tableTRandTRGs.add(groupInfo);
-					} else if ("table-header-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowGroupInfo groupInfo = new TableRowGroupInfo(
-								(ICSSFigure) childfigure);
-						_tableHeaderGroups.add(groupInfo);
-					} else if ("table-footer-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowGroupInfo groupInfo = new TableRowGroupInfo(
-								(ICSSFigure) childfigure);
-						_tableFooterGroups.add(groupInfo);
-					} else {
-						// something unexpected inside table
-					}
-				} else {
-					// something unexpected inside table
-				}
-			} else {
-				// something unexpected inside table
-			}
-		}
-
-		TableInfoContext context = new TableInfoContext();
-		// now we have the rows ordered, need to calculate row details now.
-		for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-					.get(i);
-			groupInfo.calculateRowGroup(context);
-		}
-		for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-			Object obj = _tableTRandTRGs.get(i);
-			if (obj instanceof TableRowGroupInfo) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-				groupInfo.calculateRowGroup(context);
-			} else {
-				TableRowInfo rowInfo = (TableRowInfo) obj;
-				rowInfo.calculateRow(context);
-			}
-		}
-		for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-					.get(i);
-			groupInfo.calculateRowGroup(context);
-		}
-		context.finishTable();
-
-		_columnCount = context.getColumnCount();
-		_rowCount = context.getRowCount();
-
-		this._widthPercentage = new int[_columnCount];
-		this._heightPercentage = new int[_rowCount];
-
-		this._widthSpecified = new boolean[_columnCount];
-		for (int i = 0; i < _columnCount; i++) {
-			this._widthSpecified[i] = false;
-		}
-	}
-
-	/**
-	 * @param columnIndex
-	 * @param percentageValue
-	 */
-	void setWidthPercentage(int columnIndex, int percentageValue) {
-		if (percentageValue > this._widthPercentage[columnIndex]) {
-			this._widthPercentage[columnIndex] = percentageValue;
-		}
-	}
-
-	void setHeightPercentage(int rowIndex, int percentageValue) {
-		if (percentageValue > this._heightPercentage[rowIndex]) {
-			this._heightPercentage[rowIndex] = percentageValue;
-		}
-	}
-
-	/**
-	 * width percentage will be used to calculate remaining width distribution.
-	 * 
-	 * @return the width percentages
-	 */
-	public int[] getWidthPercentages() {
-		return this._widthPercentage;
-	}
-
-	int[] getHeightPercentages() {
-		return this._heightPercentage;
-	}
-
-	List getRows() {
-		if (_rows == null) {
-			this._rows = new ArrayList();
-
-			for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-						.get(i);
-				_rows.addAll(groupInfo.getRowList());
-			}
-			for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-				Object obj = _tableTRandTRGs.get(i);
-				if (obj instanceof TableRowGroupInfo) {
-					TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-					_rows.addAll(groupInfo.getRowList());
-				} else {
-					TableRowInfo rowInfo = (TableRowInfo) obj;
-					_rows.add(rowInfo);
-				}
-			}
-			for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-						.get(i);
-				_rows.addAll(groupInfo.getRowList());
-			}
-		}
-		return _rows;
-	}
-
-	List getCells() {
-		if (_cells == null) {
-			_cells = new ArrayList();
-
-			for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-						.get(i);
-				groupInfo.getCells(_cells);
-			}
-			for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-				Object obj = _tableTRandTRGs.get(i);
-				if (obj instanceof TableRowGroupInfo) {
-					TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-					groupInfo.getCells(_cells);
-				} else {
-					TableRowInfo rowInfo = (TableRowInfo) obj;
-					rowInfo.getCells(_cells);
-				}
-			}
-			for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-						.get(i);
-				groupInfo.getCells(_cells);
-			}
-		}
-		return _cells;
-	}
-
-	/**
-	 * @param contentWidth
-	 *            if the width specification is percentage, then will use
-	 *            container width.
-	 * @param availableWidth 
-	 */
-	public void calculateWidth(int contentWidth, int availableWidth) {
-		_tableWidth = contentWidth;
-		//_availableWidth = availableWidth;
-
-		// next calculate cell width
-		List cells = getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			cellinfo.calculateWidth(this, _tableWidth);
-		}
-	}
-
-	void calculateHeight(int contentHeight) {
-		_tableHeight = contentHeight;
-
-		List rows = getRows();
-		for (int i = 0, size = rows.size(); i < size; i++) {
-			TableRowInfo rowinfo = (TableRowInfo) rows.get(i);
-			rowinfo.calculateHeight(this, _tableHeight);
-		}
-
-		// next calculate cell width
-		List cells = getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			cellinfo.calculateHeight(this, _tableHeight);
-		}
-	}
-
-	/**
-	 * @return table width
-	 */
-	public int getTableWidth() {
-		return _tableWidth;
-	}
-
-	/**
-	 * @param figure
-	 * @return find the group info
-	 */
-	public TableRowGroupInfo findGroupInfo(CSSFigure figure) {
-		for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-					.get(i);
-			if (figure == groupInfo.getFigure()) {
-				return groupInfo;
-			}
-		}
-		for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-			Object obj = _tableTRandTRGs.get(i);
-			if (obj instanceof TableRowGroupInfo) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-				if (figure == groupInfo.getFigure()) {
-					return groupInfo;
-				}
-
-			}
-		}
-		for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-					.get(i);
-			if (figure == groupInfo.getFigure()) {
-				return groupInfo;
-			}
-		}
-		return null; // should not happen.
-	}
-
-	/**
-	 * @param figure
- 	 * @return the row info
-	 */
-	public TableRowInfo findRowInfo(CSSFigure figure) {
-		for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-					.get(i);
-			TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
-			if (rowinfo != null) {
-				return rowinfo;
-			}
-		}
-		for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-			Object obj = _tableTRandTRGs.get(i);
-			if (obj instanceof TableRowGroupInfo) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-				TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
-				if (rowinfo != null) {
-					return rowinfo;
-				}
-			} else if (obj instanceof TableRowInfo) {
-				TableRowInfo info = (TableRowInfo) obj;
-				if (figure == info.getFigure()) {
-					return info;
-				}
-			}
-		}
-		for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-					.get(i);
-			TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
-			if (rowinfo != null) {
-				return rowinfo;
-			}
-		}
-		return null; // should not happen.
-	}
-
-	/**
-	 * 
-	 * @return the width percentage
-	 */
-	public boolean hasWidthPercentage() {
-		for (int i = 0; i < this._widthPercentage.length; i++) {
-			if (this._widthPercentage[i] > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfoContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfoContext.java
deleted file mode 100644
index f28d3e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfoContext.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.IntFlexArray;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableInfoContext {
-	static Logger _log = PDPlugin.getLogger(TableInfoContext.class);
-
-	int _currentCol = 0;
-
-	int _currentRow = 0;
-
-	IntFlexArray _array = new IntFlexArray();
-
-	int _colCount = 0;
-
-	int _rowCount = 0;
-
-	/**
-	 * 
-	 */
-	public TableInfoContext() {
-        // do nothing
-	}
-
-	/**
-	 * @return the flex array
-	 */
-	public IntFlexArray getIntFlexArray() {
-		return _array;
-	}
-
-	/**
-	 * @return the current column
-	 */
-	public int getCurrentCol() {
-		return _currentCol;
-	}
-
-	/**
-	 * @param currentcol
-	 */
-	public void setCurrentCol(int currentcol) {
-		_currentCol = currentcol;
-	}
-
-	/**
-	 * @return the current row
-	 */
-	public int getCurrentRow() {
-		return _currentRow;
-	}
-
-	/**
-	 * @return the column count
-	 */
-	public int getColumnCount() {
-		return _colCount;
-	}
-
-	/**
-	 * 
-	 */
-	public void finishRow() {
-		if (_currentCol > _colCount) {
-			_colCount = _currentCol;
-		}
-		_currentCol = 0;
-		_currentRow++;
-		for (int i = 0; i < _colCount; i++) {
-			if (_array.getAt(i) > 0) {
-				_array.setAt(i, _array.getAt(i) - 1);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void finishTable() {
-		// do some checking here.
-		int additionalRow = 0;
-		for (int i = 0; i < _colCount; i++) {
-			if (_array.getAt(i) > additionalRow) {
-				additionalRow = _array.getAt(i);
-			}
-		}
-		_rowCount = _currentRow + additionalRow;
-	}
-
-	/**
-	 * 
-	 */
-	public void finishRowGroup() {
-        // TODO: does nothing; only called in one places
-	}
-
-	/**
-	 * @return the row count
-	 */
-	public int getRowCount() {
-		return _rowCount;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableItemInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableItemInfo.java
deleted file mode 100644
index 9f39064..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableItemInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableItemInfo 
-{
-	private ICSSFigure _figure;
-
-	/**
-	 * @param figure 
-	 */
-	public TableItemInfo(ICSSFigure figure) {
-		_figure = figure;
-	}
-
-	/**
-	 * @return the figure
-	 */
-	public ICSSFigure getFigure() {
-		return _figure;
-	}
-
-	/**
-	 * @return the style
-	 */
-	public ICSSStyle getStyle() {
-		return _figure.getCSSStyle();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowGroupInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowGroupInfo.java
deleted file mode 100644
index 98a9c1b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowGroupInfo.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableRowGroupInfo extends TableItemInfo {
-	List _rowList = new ArrayList();
-
-	private int _rowIndex;
-
-	private int _rowCount;
-
-	/**
-	 * @param figure
-	 */
-	public TableRowGroupInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-	List getRowList() {
-		return _rowList;
-	}
-
-	int getRowIndex() {
-		return _rowIndex;
-	}
-
-	int getRowCount() {
-		return this._rowCount;
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateRowGroup(TableInfoContext context) {
-		this._rowIndex = context.getCurrentRow();
-		List children = getFigure().getChildren();
-		for (int i = 0, size = children.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) children.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle childstyle = ((ICSSFigure) childfigure).getCSSStyle();
-				if (childstyle != null
-						&& "table-row" //$NON-NLS-1$
-								.equalsIgnoreCase(childstyle.getDisplay())) {
-					TableRowInfo rowInfo = new TableRowInfo(
-							(ICSSFigure) childfigure);
-					_rowList.add(rowInfo);
-					rowInfo.calculateRow(context);
-				} else {
-					// skip
-				}
-			} else {
-				// skip
-			}
-		}
-		context.finishRowGroup();
-		this._rowCount = context.getCurrentRow() - this._rowIndex;
-	}
-
-	/**
-	 * @param _cells
-	 */
-	public void getCells(List _cells) {
-		for (int i = 0, size = _rowList.size(); i < size; i++) {
-			TableRowInfo rowInfo = (TableRowInfo) _rowList.get(i);
-			rowInfo.getCells(_cells);
-		}
-	}
-
-	/**
-	 * @param figure
-	 * @return the table row info
-	 */
-	public TableRowInfo findRowInfo(CSSFigure figure) {
-		for (int i = 0, size = _rowList.size(); i < size; i++) {
-			TableRowInfo rowInfo = (TableRowInfo) _rowList.get(i);
-			if (figure == rowInfo.getFigure()) {
-				return rowInfo;
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowInfo.java
deleted file mode 100644
index 8083cf8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowInfo.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableRowInfo extends TableItemInfo {
-	List _cells = new ArrayList();
-
-	int _rowIndex;
-
-	private int _rowHeight;
-
-	/**
-	 * @param figure
-	 */
-	public TableRowInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-	List getCells() {
-		return _cells;
-	}
-
-	int getRowIndex() {
-		return _rowIndex;
-	}
-
-	int getSpecifiedRowHeight() {
-		return _rowHeight;
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateRow(TableInfoContext context) {
-		this._rowIndex = context.getCurrentRow();
-
-		List children = getFigure().getChildren();
-		for (int i = 0, size = children.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) children.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle childstyle = ((ICSSFigure) childfigure).getCSSStyle();
-				if (childstyle != null) {
-					String display = childstyle.getDisplay();
-					if ("table-cell".equalsIgnoreCase(display)) { //$NON-NLS-1$
-						TableCellInfo cellInfo = new TableCellInfo(
-								(ICSSFigure) childfigure);
-						cellInfo.calculateCellInfo(context);
-						_cells.add(cellInfo);
-					} else {
-						// skip
-					}
-				}
-			} else {
-				// skip
-			}
-		}
-		// ok, we have finished a row
-		context.finishRow();
-	}
-
-	/**
-	 * @param cells
-	 */
-	public void getCells(List cells) {
-		cells.addAll(this._cells);
-	}
-
-	/**
-	 * @param figure
-	 * @return the table cell info
-	 */
-	public TableCellInfo getCellInfo(CSSFigure figure) {
-		for (int i = 0, size = _cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) _cells.get(i);
-			if (cellinfo.getFigure() == figure) {
-				return cellinfo;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param info
-	 * @param tableHeight
-	 */
-	public void calculateHeight(TableInfo info, int tableHeight) {
-		ICSSStyle style = this.getFigure().getCSSStyle();
-		if (style == null) {
-			this._rowHeight = -1;
-		} else {
-			Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			Length recommendedHeight = (height instanceof Length) ? (Length) height
-					: null;
-
-			int rh = 0;
-			if (recommendedHeight == null || recommendedHeight.getValue() <= 0) {
-				rh = 0;
-			} else {
-				if (recommendedHeight.isPercentage()) {
-					// not supported.
-				} else {
-					rh = recommendedHeight.getValue();
-				}
-				if (rh > 0 && !style.isSizeIncludeBorderPadding()) {
-					rh += style.getBorderInsets().getHeight()
-							+ style.getPaddingInsets().getHeight();
-				}
-			}
-			this._rowHeight = rh;
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSHtmlListStyleData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSHtmlListStyleData.java
deleted file mode 100644
index e559433..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSHtmlListStyleData.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class CSSHtmlListStyleData {
-	/**
-	 * Image
-	 */
-	public final static int LIST_T_IMAGE = 0;
-
-	/**
-	 * Disc
-	 */
-	public final static int LIST_T_DISC = 1;
-
-	/**
-	 * Circle
-	 */
-	public final static int LIST_T_CIRCLE = 2;
-
-	/**
-	 * Square
-	 */
-	public final static int LIST_T_SQUARE = 3;
-
-	/**
-	 * Decimal
-	 */
-	public final static int LIST_T_DECIMAL = 0x11;
-
-	/**
-	 * Decimial w/ leading zero
-	 */
-	public final static int LIST_T_DECIMAL_LEADING_ZERO = 0x12;
-
-	/**
-	 * Lower alpha
-	 */
-	public final static int LIST_T_LOWER_ALPHA = 0x13;
-
-	/**
-	 * Lower Roman
-	 */
-	public final static int LIST_T_LOWER_ROMAN = 0x14;
-
-	/**
-	 * Upper alpha
-	 */
-	public final static int LIST_T_UPPER_ALPHA = 0x15;
-
-	/**
-	 * Upper Roman
-	 */
-	public final static int LIST_T_UPPER_ROMAN = 0x16;
-
-	//private CSSMarkerStyleData _markerStyleData;
-
-	private Image _markerImage;
-
-	private int _type;
-
-	/**
-	 * @return if is a default picture type
-	 */
-	public boolean isDefaultPicture() {
-		return (_type & 0xf) != 0;
-	}
-
-	private String getResolvedURL() {
-		//String textValue = _markerStyleData.getTextContent();
-		// TODO: when I found this, resolver was not being set and would either
-        // have thrown NPE or returned "".. so I've "improved it :)
-        //URIResolver resolver = null;// FIXME: this is not implemented yet.
-		// DesignerPropertyTool.getModel().getResolver();
-		//if (textValue != null && textValue.length() > 0) {
-		//	return resolver.getLocationByURI(textValue);
-		//}
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * @return Returns the markerImage.
-	 */
-	public Image getMarkerImage() {
-		if (!this.isImage()) {
-			return null;
-		}
-		if (_markerImage == null) {
-			String uri = this.getResolvedURL();
-			_markerImage = new Image(null, uri);
-		}
-		return _markerImage;
-	}
-
-	/**
-	 * @return Returns the type.
-	 */
-	public int getType() {
-		return _type;
-	}
-
-	/**
-	 * @param type
-	 */
-	public void setType(String type) {
-
-		this._type = toTypeInt(type);
-	}
-
-	/**
-	 * @param index 
-	 * @return Returns the markerString.
-	 */
-	public String getTextValue(int index) {
-		if (!this.isText()) {
-			return null;
-		}
-		// ICounter counter = CounterFactory.getInstance().getCounter(_type);
-		return ""; //$NON-NLS-1$
-
-	}
-
-	/**
-	 * @return true if is a text type
-	 */
-	public boolean isText() {
-		return (_type & 0xf0) != 0;
-	}
-
-	/**
-	 * @return true if is an image type
-	 */
-	public boolean isImage() {
-		return (_type == LIST_T_IMAGE);
-	}
-
-	/**
-	 * @param type
-	 * @return convert the 'type' String to one of LIST_T_*
-	 */
-	public static int toTypeInt(String type) {
-		if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL)) {
-			return LIST_T_DECIMAL;
-		} else if (type
-				.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL_LEADING_ZERO)) {
-			return LIST_T_DECIMAL_LEADING_ZERO;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DISC)) {
-			return LIST_T_DISC;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_CIRCLE)) {
-			return LIST_T_CIRCLE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SQUARE)) {
-			return LIST_T_SQUARE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_IMAGE)) {
-			return LIST_T_IMAGE;
-		}
-
-		return 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSMarkerStyleData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSMarkerStyleData.java
deleted file mode 100644
index 0383b52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSMarkerStyleData.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import java.util.Vector;
-
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-
-/**
- * @author mengbo
- */
-public class CSSMarkerStyleData {
-	private Vector _content;
-
-	private String _textContent;
-
-	private int _Offset;
-
-	private boolean _isOutside;
-
-	/**
-	 * @return Returns the isBefore.
-	 */
-	public boolean isOutside() {
-		return _isOutside;
-	}
-
-	/**
-	 * @param position
-	 *            The isBefore to set.
-	 */
-	public void setPosition(String position) {
-		if (position == ICSSPropertyID.VAL_INSIDE) {
-			_isOutside = false;
-		} else if (position == ICSSPropertyID.VAL_OUTSIDE) {
-			_isOutside = true;
-		}
-	}
-
-	/**
-	 * @return Returns the _Offset.
-	 */
-	public int getOffset() {
-		return _Offset;
-	}
-
-	/**
-	 * @param offset
-	 *            The _Offset to set.
-	 */
-	public void setOffset(int offset) {
-		_Offset = offset;
-	}
-
-	/**
-	 * @return Returns the _textValue.
-	 */
-	public String getTextContent() {
-		return _textContent;
-	}
-
-	/**
-	 * @param value
-	 *            The _textValue to set.
-	 */
-	public void setTextContent(String value) {
-		_textContent = value;
-	}
-
-	/**
-	 * @return the next element.  removes it from the content vector.  Returns
-	 * null if the content is empty
-	 */
-	public Object getNextElement() {
-		if (_content == null || _content.size() == 0) {
-			return null;
-		}
-		return _content.remove(0);
-	}
-
-	/**
-	 * @param content
-	 */
-	public void setContent(Vector content) {
-		_content = content;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ContentObject.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ContentObject.java
deleted file mode 100644
index ad32149..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ContentObject.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * A simple template objec, when we resole content in detail, we will create
- * more complicated object reference structure.
- * 
- * @author mengbo
- */
-public class ContentObject {
-	private ICounterValueGenerator _counter;
-
-	/**
-	 * @return Returns the _counter.
-	 */
-	public ICounterValueGenerator getCounter() {
-		return _counter;
-	}
-
-	/**
-	 * @param counter
-	 *            The _counter to set.
-	 */
-	public void setCounter(ICounterValueGenerator counter) {
-		this._counter = counter;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterHelper.java
deleted file mode 100644
index b6913d7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterHelper.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSPrimitiveValue;
-
-/**
- * @author mengbo
- */
-public final class CounterHelper {
-	/**
-	 * Image
-	 */
-	public final static int LIST_T_IMAGE = 0;
-
-	/**
-	 * Disc
-	 */
-	public final static int LIST_T_DISC = 1;
-
-	/**
-	 * Circle
-	 */
-	public final static int LIST_T_CIRCLE = 2;
-
-	/**
-	 * Square
-	 */
-	public final static int LIST_T_SQUARE = 3;
-
-	/**
-	 * Decimal
-	 */
-	public final static int LIST_T_DECIMAL = 0x11;
-
-	/**
-	 * Leading-zero decimal
-	 */
-	public final static int LIST_T_DECIMAL_LEADING_ZERO = 0x12;
-
-	/**
-	 * Lower alpha
-	 */
-	public final static int LIST_T_LOWER_ALPHA = 0x13;
-
-	/**
-	 * Lower roman
-	 */
-	public final static int LIST_T_LOWER_ROMAN = 0x14;
-
-	/**
-	 * Upper alpha
-	 */
-	public final static int LIST_T_UPPER_ALPHA = 0x15;
-
-	/**
-	 * Upper roman
-	 */
-	public final static int LIST_T_UPPER_ROMAN = 0x16;
-
-	/**
-	 * Lower greek
-	 */
-	public final static int LIST_T_LOWER_GREEK = 0x21;
-
-	/**
-	 * Armenian
-	 */
-	public final static int LIST_T_ARMENIAN = 0x22;
-
-	/**
-	 * Georgian
-	 */
-	public final static int LIST_T_GEORGIAN = 0x23;
-
-	/**
-	 * None
-	 */
-	public final static int LIST_T_NONE = 0x24;
-	/**
-	 * @param style
-	 * @param counters
-	 */
-	public static void processCounterReset(ICSSStyle style, HashMap counters) {
-		Assert.isTrue(style != null && counters != null);
-		// counter-reset will create new one.
-		Object counterResets = style
-				.getStyleProperty(ICSSPropertyID.ATTR_COUNTER_RESET);
-		if ((counterResets) != null
-				&& counterResets != ICSSPropertyMeta.NOT_SPECIFIED) {
-			if (counterResets instanceof List) {
-				List crList = (List) counterResets;
-				for (int i = 0, n = crList.size(); i < n; i++) {
-					ResetObject rObject = (ResetObject) crList.get(i);
-					String name = rObject.getCounterName();
-					Object counter = null;
-					if (counters.size() > 0 && counters.containsKey(name)) {
-						// Already resolved
-						counter = counters.get(name);
-					}
-					if (counter != null) {
-						if (rObject.getInitial() != null) {
-							((ICounterValueGenerator) counter)
-									.resetCount(rObject.getInitial().intValue());
-						} else {
-							counter = ((ICounterValueGenerator) counter)
-									.resetCount();
-						}
-						counters.put(((ICounterValueGenerator) counter)
-								.getIdentifier(), counter);
-					} else {
-						// create new one
-						Object listStyle = style
-								.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-						if (listStyle instanceof String) {
-							counter = new CounterValueGenerator(name,
-									(String) listStyle, null, style);
-							if (rObject.getInitial() != null) {
-								((ICounterValueGenerator) counter)
-										.resetCount(rObject.getInitial()
-												.intValue());
-							} else {
-								counter = ((ICounterValueGenerator) counter)
-										.resetCount();
-							}
-						}
-						counters.put(((ICounterValueGenerator) counter)
-								.getIdentifier(), counter);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param style
-	 */
-	public static void processCounterIncrement(ICSSStyle style) {
-		Object counterIncrements = style
-				.getStyleProperty(ICSSPropertyID.ATTR_COUNTER_INCREMENT);
-		if (counterIncrements != null
-				&& counterIncrements != ICSSPropertyMeta.NOT_SPECIFIED) {
-			if (counterIncrements instanceof List) {
-				List crList = (List) counterIncrements;
-				for (int i = 0, n = crList.size(); i < n; i++) {
-					IncrementObject rObject = (IncrementObject) crList.get(i);
-					String name = rObject.getCounterName();
-					Object counter = null;
-					counter = style.findCounter(name, true);
-					if (counter != null) {
-						if (HTMLListInfoHelper.getValueInt(style) == null) {
-							if (rObject.getIncrement() != null) {
-								((ICounterValueGenerator) counter)
-										.increase(rObject.getIncrement()
-												.intValue());
-							} else {
-								((ICounterValueGenerator) counter).increase();
-							}
-						} else {
-							((ICounterValueGenerator) counter)
-									.setCount(HTMLListInfoHelper
-											.getValueInt(style));
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param style
-	 * @return true if the style is a text style
-	 */
-	public static boolean isText(ICSSStyle style) {
-		String display = style.getDisplay();
-		Object styleType = style
-				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-		return (display
-				.equalsIgnoreCase(ICSSPropertyID.VAL_LIST_ITEM) //
-				&& styleType instanceof String //
-		&& !CounterValueGenerator.NON_STRING_TYPES.contains(styleType));
-	}
-
-	/**
-	 * @param style
-	 * @return the type of the style.  One of the LIST_T_* values, or -1 if the
-	 * style is unknown
-	 */
-	public static int getType(ICSSStyle style) {
-		Object type = style
-				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-		if (type instanceof String) {
-			return toTypeInt((String) type);
-		}
-        return -1;
-	}
-
-	/**
-	 * @param type
-	 * @return the type enumeration for the  type string
-	 */
-	public static int toTypeInt(String type) {
-
-		if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL)) {
-			return LIST_T_DECIMAL;
-		} else if (type
-				.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL_LEADING_ZERO)) {
-			return LIST_T_DECIMAL_LEADING_ZERO;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DISC)) {
-			return LIST_T_DISC;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_CIRCLE)) {
-			return LIST_T_CIRCLE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SQUARE)) {
-			return LIST_T_SQUARE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_IMAGE)) {
-			return LIST_T_IMAGE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_UPPER_LATIN)) {
-			return LIST_T_UPPER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_UPPER_ALPHA)) {
-			return LIST_T_UPPER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_LATIN)) {
-			return LIST_T_LOWER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_ALPHA)) {
-			return LIST_T_LOWER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_UPPER_ROMAN)) {
-			return LIST_T_UPPER_ROMAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_ROMAN)) {
-			return LIST_T_LOWER_ROMAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_GREEK)) {
-			return LIST_T_LOWER_GREEK;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_ARMENIAN)) {
-			return LIST_T_ARMENIAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_GEORGIAN)) {
-			return LIST_T_GEORGIAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_NONE)) {
-			return LIST_T_NONE;
-		}
-		return 0;
-	}
-
-	/**
-	 * @param cssValue
-	 * @return true if the cssValue is an IDENT
-	 */
-	public static boolean isIdentifier(Object cssValue) {
-		return (cssValue instanceof ICSSPrimitiveValue)
-				&& ((ICSSPrimitiveValue) cssValue).getPrimitiveType() == CSSPrimitiveValue.CSS_IDENT;
-	}
-
-	/**
-	 * @param cssValue
-	 * @return true if the css value is a number
-	 */
-	public static boolean isNumber(Object cssValue) {
-		return cssValue instanceof ICSSPrimitiveValue
-				&& ((ICSSPrimitiveValue) cssValue).getPrimitiveType() == ICSSPrimitiveValue.CSS_INTEGER;
-	}
-	
-	private  CounterHelper()
-	{
-	    //  util class; no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterValueGenerator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterValueGenerator.java
deleted file mode 100644
index 326b188..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterValueGenerator.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-
-/**
- * The counter is used to generate automatic conters and numbering for list
- * item. XXX: what do we deal with psedo? and we need to refer to web tools
- * content to consult for style content.
- * 
- * @author mengbo
- */
-public class CounterValueGenerator implements ICounterValueGenerator {
-	private final static int DEFAULT_INITIAL_VALUE = 0;
-
-	private static final Set STRING_TYPES = new HashSet();
-
-	static final Set NON_STRING_TYPES = new HashSet();
-	static {
-		NON_STRING_TYPES.add("disc"); //$NON-NLS-1$
-		NON_STRING_TYPES.add("circle"); //$NON-NLS-1$
-		NON_STRING_TYPES.add("square"); //$NON-NLS-1$
-		STRING_TYPES.add("decimal"); //$NON-NLS-1$
-		STRING_TYPES.add("decimal-leading-zero"); //$NON-NLS-1$
-		STRING_TYPES.add("lower-roman"); //$NON-NLS-1$
-		STRING_TYPES.add("upper-roman"); //$NON-NLS-1$
-		STRING_TYPES.add("lower-greek"); //$NON-NLS-1$
-		STRING_TYPES.add("lower-alpha"); //$NON-NLS-1$
-		STRING_TYPES.add("lower-latin"); //$NON-NLS-1$
-		STRING_TYPES.add("upper-alpha"); //$NON-NLS-1$
-		STRING_TYPES.add("upper-latin"); //$NON-NLS-1$
-		STRING_TYPES.add("hebrew"); //$NON-NLS-1$
-		STRING_TYPES.add("armenian"); //$NON-NLS-1$
-		STRING_TYPES.add("georgian"); //$NON-NLS-1$
-		STRING_TYPES.add("cjk-ideographic"); //$NON-NLS-1$
-		STRING_TYPES.add("hiragana"); //$NON-NLS-1$
-		STRING_TYPES.add("katakana"); //$NON-NLS-1$
-		STRING_TYPES.add("hiragana-iroha"); //$NON-NLS-1$
-		STRING_TYPES.add("katakana-iroha"); //$NON-NLS-1$
-	}
-
-	private final static int DEFAULT_INCREMENT = 1;
-
-	private boolean _first = true;
-
-	private Integer _initial;
-
-	private List _visitors;
-
-	private int _count;
-
-	private String _identifier;
-
-	private String _styleType;
-
-	private String _seperator;
-
-	private ICSSStyle _style;
-
-	/**
-	 * @param identifier
-	 * @param styleType
-	 * @param seperator
-	 * @param style
-	 */
-	public CounterValueGenerator(String identifier, String styleType,
-			String seperator, ICSSStyle style) {
-		_identifier = identifier;
-		_styleType = styleType;
-		_seperator = seperator;
-		_style = style;
-		if (HTMLListInfoHelper.getStartInt(style) != null) {
-			_count = HTMLListInfoHelper.getStartInt(style).intValue();
-		} else {
-			_count = DEFAULT_INITIAL_VALUE;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.w3c.dom.css.Counter#getIdentifier()
-	 */
-	public String getIdentifier() {
-		return _identifier;
-	}
-
-	/**
-	 * @return the style  type 
-	 * @see org.w3c.dom.css.Counter#getListStyle()
-	 */
-	public String getListStyle() {
-		return _styleType;
-	}
-
-	/**
-	 * @return the separator
-	 * 
-	 * @see org.w3c.dom.css.Counter#getSeparator()
-	 */
-	public String getSeparator() {
-		return _seperator;
-	}
-
-	// /**
-	// * @return Returns the type.
-	// */
-	// public String getType()
-	// {
-	// return _styleType;
-	// }
-
-	// /**
-	// * @return Returns the markerString.
-	// */
-	// public String getTextValue()
-	// {
-	// Assert.isTrue(this.isText());
-	// _index = getDeclaredIndex();
-	// Node container = findParentComtainer();
-	// if (container == null)
-	// {
-	// // what condition?
-	// return "";
-	// }
-	// String exp = "";
-	// int startIndex = getStartIndex(container);
-	// int maxLength = calculateMaxlength(container, 0) + startIndex - 1;
-	// Assert.isTrue(maxLength > 0);
-	// if (_index == -1)
-	// {
-	// // no declared value
-	// calculateIndex(container);
-	// Assert.isTrue(_index > -1);
-	// exp = Integer.toString(_index + startIndex);
-	// }
-	// else
-	// {
-	// exp = Integer.toString(_index);
-	// }
-	// if (getType() == CounterHelper.LIST_T_DECIMAL)
-	// {
-	// exp = appendSuffix(exp, Integer.toString(maxLength).length() -
-	// exp.length());
-	// }
-	// else if (getType() == CounterHelper.LIST_T_DECIMAL_LEADING_ZERO)
-	// {
-	// exp = addPrefix(exp, maxLength - exp.length());
-	// }
-	// return exp + ".";
-	//
-	// }
-
-	// private String addPrefix(String exp, int length)
-	// {
-	// while (length > 0)
-	// {
-	// exp = "0" + exp;
-	// length--;
-	// }
-	// return exp;
-	// }
-	//
-	// private String appendSuffix(String exp, int length)
-	// {
-	// while (length > 0)
-	// {
-	// exp = exp + " ";
-	// length--;
-	// }
-	// return exp;
-	// }
-
-	// private boolean calculateIndex(Node node)
-	// {
-	// if (node == _node)
-	// {
-	// _index++;
-	// return true;
-	// }
-	// String name = node.getNodeName();
-	// if (name != null && name.equalsIgnoreCase("li"))
-	// {
-	// _index++;
-	// }
-	// if (!node.hasChildNodes())
-	// {
-	// return false;
-	// }
-	// node = node.getFirstChild();
-	// while (node != null)
-	// {
-	// name = node.getNodeName();
-	// if (name != null && !(name.equalsIgnoreCase("ul") ||
-	// name.equalsIgnoreCase("ol")))
-	// {
-	// if (calculateIndex(node))
-	// {
-	// return true;
-	// }
-	// }
-	// node = node.getNextSibling();
-	// }
-	// return false;
-	// }
-
-	// This method may be refered for the zero-leading calculation.
-	// private int calculateMaxlength(Node node, int index)
-	// {
-	// String name = node.getNodeName();
-	// if (name != null && name.equalsIgnoreCase("li"))
-	// {
-	// index++;
-	// }
-	// if (!node.hasChildNodes())
-	// {
-	// return index;
-	// }
-	// node = node.getFirstChild();
-	// while (node != null)
-	// {
-	// name = node.getNodeName();
-	// if (name != null && !(name.equalsIgnoreCase("ul") ||
-	// name.equalsIgnoreCase("ol")))
-	// {
-	// index = calculateMaxlength(node, index);
-	// }
-	// node = node.getNextSibling();
-	// }
-	// return index;
-	// }
-	//
-
-	// private int getStartIndex(Node container)
-	// {
-	// String value = ((Element) container).getAttribute("start");
-	// try
-	// {
-	// int index = Integer.parseInt(value);
-	// if (index < 0)
-	// {
-	// return 1;
-	// }
-	// return index;
-	// }
-	// catch (Exception e)
-	// {
-	// return 1;
-	// }
-	// }
-
-	// private boolean isStringTyped(ICSSStyle style)
-	// {
-	// style.getStyleProperty("list-style-type");
-	// return true;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#clone()
-	 */
-	protected Object clone() throws CloneNotSupportedException {
-		CounterValueGenerator newInstance = new CounterValueGenerator(
-				_identifier, _styleType, _seperator, _style);
-		return newInstance;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.Counter2#increase()
-	 */
-	public void increase(int increment) {
-		if (!_first || HTMLListInfoHelper.getStartInt(_style) == null) {
-			_count += increment;
-		}
-		_first = false;
-	}
-
-	public void increase() {
-		increase(DEFAULT_INCREMENT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.Counter2#setCount()
-	 */
-	public ICounterValueGenerator resetCount() {
-		try {
-			ICounterValueGenerator counter = (ICounterValueGenerator) this
-					.clone();
-			_initial = null;
-			_count = HTMLListInfoHelper.getStartInt(_style) != null ? HTMLListInfoHelper
-					.getStartInt(_style).intValue()
-					: DEFAULT_INITIAL_VALUE;
-			return counter;
-		} catch (CloneNotSupportedException e) {
-			return null;
-		}
-	}
-
-	/**
-	 * @return Returns the _initial.
-	 */
-	public int getInitial() {
-		if (HTMLListInfoHelper.getStartInt(_style) != null) {
-			return HTMLListInfoHelper.getStartInt(_style).intValue();
-		}
-        return _initial != null ? _initial.intValue()
-        		: DEFAULT_INITIAL_VALUE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.Counter2#setCount()
-	 */
-	public ICounterValueGenerator resetCount(int initial) {
-		try {
-			CounterValueGenerator counter = (CounterValueGenerator) this
-					.clone();
-			_initial = new Integer(initial);
-			_count = initial;
-			return counter;
-		} catch (CloneNotSupportedException e) {
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator#setCount(org.eclipse.jst.pagedesigner.css2.list.HTMLListInfo)
-	 */
-	public void setCount(Integer value) {
-		if (value != null) {
-			_count = value.intValue();
-			_first = false;
-		}
-	}
-
-	// /**
-	// * The clients of this counter need to regist them.
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.list.Counter2#regist(java.lang.Object)
-	// */
-	// public void regist(Object caller)
-	// {
-	// Assert.isTrue(caller instanceof ICSSStyle);
-	// if (_visitors == null)
-	// {
-	// _visitors = new LinkedList();
-	// }
-	// if (!_visitors.contains(caller))
-	// {
-	// _visitors.add(caller);
-	// }
-	// }
-	//
-	// /**
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.list.Counter2#unregist(java.lang.Object)
-	// */
-	// public void unregist(Object caller)
-	// {
-	// if (_visitors.contains(caller))
-	// {
-	// _visitors.remove(caller);
-	// }
-	// }
-
-	/**
-	 * Return the int value.
-	 * 
-	 * @author mengbo
-	 */
-	public int getCurrentCount() {
-		return _count;
-	}
-
-	/**
-	 * Currently we recalculate the count, to enhance the performance, we may
-	 * use _count, but this requires delicate synchronization when the
-	 * calculation is looped.
-	 */
-	public Integer getCount(Object oCaller) {
-		Assert.isTrue(oCaller instanceof ICSSStyle && _visitors != null
-				&& _visitors.size() > 0);
-		ICSSStyle caller = (ICSSStyle) oCaller;
-		if (!_visitors.contains(caller)) {
-			return null;
-		}
-		int result = getInitial();
-
-		for (int i = 0, n = _visitors.size(); i < n; i++) {
-			ICSSStyle style = (ICSSStyle) _visitors.get(i);
-			// get the count;
-			Object counterIncrements = style
-					.getStyleProperty(ICSSPropertyID.ATTR_COUNTER_INCREMENT);
-			if (counterIncrements != null
-					&& counterIncrements != ICSSPropertyMeta.NOT_SPECIFIED) {
-				if (counterIncrements instanceof List) {
-					List crList = (List) counterIncrements;
-					for (int j = 0, nn = crList.size(); j < nn; j++) {
-						IncrementObject rObject = (IncrementObject) crList
-								.get(j);
-						String name = rObject.getCounterName();
-						if (getIdentifier().equalsIgnoreCase(name)) {
-							if (rObject.getIncrement() != null) {
-								result += rObject.getIncrement().intValue();
-							} else {
-								result += DEFAULT_INCREMENT;
-							}
-						}
-					}
-				}
-			}
-			if (style == caller) {
-				return new Integer(result);
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/HTMLListInfoHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/HTMLListInfoHelper.java
deleted file mode 100644
index c352f96..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/HTMLListInfoHelper.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Resolve the attrbites 'start' on 'ol' and 'value' on 'li'.
- * 
- * @author mengbo
- */
-/*package*/ final class HTMLListInfoHelper {
-	/**
-	 * @return Returns the start.
-	 */
-	private static String getStart(ICSSStyle _style) {
-		if (_style instanceof AbstractStyle) {
-			Element element = ((AbstractStyle) _style).getElement();
-			Node parent = null;
-			if ((parent = EditModelQuery.getParent(IHTMLConstants.TAG_OL,
-					element, true)) != null) {
-				return ((Element) parent)
-						.getAttribute(IHTMLConstants.ATTR_START);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param style
-	 * @return the start int
-	 */
-	public static Integer getStartInt(ICSSStyle style) {
-		try {
-			return new Integer(getStart(style));
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	/**
-	 * @return Returns the value.
-	 */
-	private static String getValue(ICSSStyle _style) {
-		if (_style instanceof AbstractStyle) {
-			Element element = ((AbstractStyle) _style).getElement();
-			if (element != null) {
-				return element.getAttribute(IHTMLConstants.ATTR_VALUE);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param style
-	 * @return the Integer value or null if not parsable
-	 */
-	public static Integer getValueInt(ICSSStyle style) {
-		try {
-			return Integer.valueOf(getValue(style));
-		} catch (NumberFormatException ex) {
-			return null;
-		}
-	}
-	
-	private HTMLListInfoHelper()
-	{
-	    // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ICounterValueGenerator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ICounterValueGenerator.java
deleted file mode 100644
index 67d0197..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ICounterValueGenerator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public interface ICounterValueGenerator {
-	/**
-	 * @return the identifier
-	 */
-	public String getIdentifier();
-
-	/**
-	 * @param initial
-	 * @return the reset count
-	 */
-	public ICounterValueGenerator resetCount(int initial);
-
-	/**
-	 * @return the generator
-	 */
-	public ICounterValueGenerator resetCount();
-
-	/**
-	 * Set the counter based on value.
-	 * @param value 
-	 */
-	public void setCount(Integer value);
-
-	// public void regist(Object caller);
-	// public void unregist(Object caller);
-
-	/**
-	 * Increase counter based on declared increment number
-	 * @param increment 
-	 */
-	public void increase(int increment);
-
-	/**
-	 * Increase counter with default increment number(1)
-	 */
-	public void increase();
-
-	/**
-	 * @param caller
-	 * @return the count
-	 */
-	public Integer getCount(Object caller);
-
-	/**
-	 * @return the current count
-	 */
-	public int getCurrentCount();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IIndexConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IIndexConverter.java
deleted file mode 100644
index 5e220a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IIndexConverter.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public interface IIndexConverter {
-	/**
-	 * @param index
-	 * @return the string at index
-	 */
-	String getString(int index);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IncrementObject.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IncrementObject.java
deleted file mode 100644
index 71c9140..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IncrementObject.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public class IncrementObject {
-	private String _counterName;
-
-	private Integer _increment;
-
-	/**
-	 * @param name
-	 * @param increment
-	 */
-	public IncrementObject(String name, Integer increment) {
-		_counterName = name;
-		_increment = increment;
-	}
-
-	/**
-	 * @return Returns the _counterName.
-	 */
-	public String getCounterName() {
-		return _counterName;
-	}
-
-	/**
-	 * @param name
-	 *            The _counterName to set.
-	 */
-	public void setCounterName(String name) {
-		_counterName = name;
-	}
-
-	/**
-	 * @return Returns the _increment.
-	 */
-	public Integer getIncrement() {
-		return _increment;
-	}
-
-	/**
-	 * @param _increment
-	 *            The _increment to set.
-	 */
-	public void setIncrement(Integer _increment) {
-		this._increment = _increment;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ListStyleUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ListStyleUtil.java
deleted file mode 100644
index ccab58f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ListStyleUtil.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-/*package*/ final class ListStyleUtil {
-	/**
-	 * @param type
-	 * @param index
-	 * @return the type as a string
-	 */
-	public static String convertTypeToString(int type, int index) {
-		if (type == CSSHtmlListStyleData.LIST_T_LOWER_ROMAN
-				|| type == CSSHtmlListStyleData.LIST_T_UPPER_ROMAN) {
-			// TODO: to implement roman.
-			// return decimalToRoman(index);
-		} else if (type == CSSHtmlListStyleData.LIST_T_DECIMAL
-				|| type == CSSHtmlListStyleData.LIST_T_DECIMAL_LEADING_ZERO) {
-			return Integer.toString(index);
-		}
-		return null;
-	}
-
-	private ListStyleUtil()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ResetObject.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ResetObject.java
deleted file mode 100644
index 0cc1138..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ResetObject.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public class ResetObject {
-	private String _counterName;
-
-	private Integer _initial;
-
-	/**
-	 * @param name
-	 * @param initial
-	 */
-	public ResetObject(String name, Integer initial) {
-		_counterName = name;
-		_initial = initial;
-	}
-
-	/**
-	 * @return Returns the _counterName.
-	 */
-	public String getCounterName() {
-		return _counterName;
-	}
-
-	/**
-	 * @param name
-	 *            The _counterName to set.
-	 */
-	public void setCounterName(String name) {
-		_counterName = name;
-	}
-
-	/**
-	 * @return Returns the _increment.
-	 */
-	public Integer getInitial() {
-		return _initial;
-	}
-
-	/**
-	 * @param _initial
-	 *            The _increment to set.
-	 */
-	public void setInitial(Integer _initial) {
-		this._initial = _initial;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterFactory.java
deleted file mode 100644
index 32dec84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-public class CounterFactory {
-	private static DecimalCounter _decimalCounterInstance;
-
-	private static RomanCounter _romanCounterInstance;
-
-	private static CounterFactory _instance;
-
-	/**
-	 * @return the factory singelton
-	 */
-	public static CounterFactory getInstance() {
-		if (_instance == null) {
-			_instance = new CounterFactory();
-		}
-		return _instance;
-	}
-
-	/**
-	 * @param type
-	 * @return the counter for type
-	 */
-	public ICounter getCounter(int type) {
-		switch (type) {
-		case CSSHtmlListStyleData.LIST_T_DECIMAL:
-		case CSSHtmlListStyleData.LIST_T_DECIMAL_LEADING_ZERO:
-			if (_decimalCounterInstance == null) {
-				_decimalCounterInstance = new DecimalCounter();
-			}
-			return _decimalCounterInstance;
-		case CSSHtmlListStyleData.LIST_T_LOWER_ROMAN:
-		case CSSHtmlListStyleData.LIST_T_UPPER_ROMAN:
-			if (_romanCounterInstance == null) {
-				_romanCounterInstance = new RomanCounter();
-			}
-			return _romanCounterInstance;
-		default:
-			return null;
-
-		}
-	}
-	
-	private CounterFactory()
-	{
-	    // singleton, no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterUtil.java
deleted file mode 100644
index f22f17f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-
-/**
- * @author mengbo
- */
-public final class CounterUtil {
-	/**
-	 * @param count
-	 * @param type
-	 * @return the converter count
-	 */
-	public static String convertCount(int count, int type) {
-		// XXX: currently we only support style that IE supported.for type that
-		// does not
-		// support we return an empty String.
-		StringBuffer buffer = new StringBuffer();
-		switch (type) {
-		case CounterHelper.LIST_T_DECIMAL:
-			buffer.append(count);
-			buffer.append('.');
-			break;
-		case CounterHelper.LIST_T_UPPER_ALPHA:
-		case CounterHelper.LIST_T_LOWER_ALPHA:
-			char charA = 'a';
-			if (type == CounterHelper.LIST_T_UPPER_ALPHA) {
-				charA = 'A';
-			}
-			int index = count;
-			while (index > 0 && index > 26) {
-				buffer.append((char) (charA + (index / 26) - 1));
-				index = index % 26;
-			}
-			buffer.append((char) (charA + (index - 1)));
-			buffer.append("."); //$NON-NLS-1$
-			break;
-		case CounterHelper.LIST_T_UPPER_ROMAN:
-		case CounterHelper.LIST_T_LOWER_ROMAN:
-			String string = new RomanCounter().getString(count);
-			if (type == CounterHelper.LIST_T_LOWER_ROMAN) {
-				buffer.append(string.toLowerCase());
-			} else {
-				buffer.append(string);
-			}
-			buffer.append("."); //$NON-NLS-1$
-			break;
-		case CounterHelper.LIST_T_ARMENIAN:
-			break;
-		case CounterHelper.LIST_T_DECIMAL_LEADING_ZERO:
-			break;
-		case CounterHelper.LIST_T_LOWER_GREEK:
-			break;
-		case CounterHelper.LIST_T_GEORGIAN:
-			break;
-		default:
-			break;
-		}
-		return buffer.toString();
-	}
-	
-	private CounterUtil()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/DecimalCounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/DecimalCounter.java
deleted file mode 100644
index ddce690..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/DecimalCounter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-/*package*/ class DecimalCounter extends EnumerableCounter 
-{
-	
-    DecimalCounter() 
-    {
-	    // do nothing; only nee
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.EnumerableCounter#getString(int)
-	 */
-	public String getNextString(int index, int type) {
-		//String result;
-		switch (type) {
-		case CSSHtmlListStyleData.LIST_T_DECIMAL:
-			return Integer.toString(index);
-
-		case CSSHtmlListStyleData.LIST_T_DECIMAL_LEADING_ZERO:
-			StringBuffer sb = new StringBuffer();
-			int count = 1;
-			for (int i = sb.length(); i < count; i++) {
-				sb.append('0');
-			}
-			sb.append(Integer.toString(index));
-			return sb.toString();
-		default:
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/EnumerableCounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/EnumerableCounter.java
deleted file mode 100644
index 3dfbef8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/EnumerableCounter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public abstract class EnumerableCounter implements ICounter {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.ICounter#getNextObject(org.w3c.dom.Element,
-	 *      java.lang.String)
-	 */
-	public final Object getNextObject(Element element, int type) {
-		int index = calculateIndex(element);
-		return getNextString(index, type);
-	}
-
-	/**
-	 * @param element
-	 * @return the index of the element in its parent
-	 */
-	public final int calculateIndex(Element element) {
-		final String tag = element.getLocalName();
-		final Node parent = element.getParentNode();
-		final NodeList children = parent.getChildNodes();
-		int index = 1;
-		for (int i = 0; i < children.getLength(); i++) {
-			final Node child = children.item(i);
-			if (child == element) {
-				break;
-			}
-			if (child.getLocalName().equalsIgnoreCase(tag)) {
-				index++;
-			}
-		}
-		return index;
-	}
-
-	/**
-	 * @param index
-	 * @param type
-	 * @return the string for the next index
-	 */
-	public abstract String getNextString(int index, int type);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/ICounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/ICounter.java
deleted file mode 100644
index cc06af3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/ICounter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public interface ICounter {
-	/**
-	 * @param element
-	 * @param type
-	 * @return the next object for element, type
-	 */
-	public Object getNextObject(Element element, int type);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/RomanCounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/RomanCounter.java
deleted file mode 100644
index f8a91bd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/RomanCounter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-/*package*/ class RomanCounter extends EnumerableCounter {
-	RomanCounter() 
-	{
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.EnumerableCounter#getString(int,
-	 *      boolean)
-	 */
-	public String getNextString(int index, int type) {
-		switch (type) {
-		case CSSHtmlListStyleData.LIST_T_LOWER_ROMAN:
-			return getString(index).toLowerCase();
-		case CSSHtmlListStyleData.LIST_T_UPPER_ROMAN:
-			return getString(index);
-		default:
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.NumberCounter#getString(int)
-	 */
-	/*package*/ String getString(int index) {
-		// FIXME: Need to enhance more.
-		StringBuffer roman = new StringBuffer();
-		int a, b, c, d;
-		a = (index / 1000) * 1000;
-		b = ((index / 100) % 10) * 100;
-		c = ((index / 10) % 10) * 10;
-		d = ((index / 1) % 10) * 1;
-
-		if (a == 1000)
-			roman.append("M"); //$NON-NLS-1$
-		else if (a == 2000)
-			roman.append("MM"); //$NON-NLS-1$
-		else if (a == 3000)
-			roman.append("MMM"); //$NON-NLS-1$
-
-		if (b == 100)
-			roman.append("C"); //$NON-NLS-1$
-		else if (b == 200)
-			roman.append("CC"); //$NON-NLS-1$
-		else if (b == 300)
-			roman.append("CCC"); //$NON-NLS-1$
-		else if (b == 400)
-			roman.append("CD"); //$NON-NLS-1$
-		else if (b == 500)
-			roman.append("D"); //$NON-NLS-1$
-		else if (b == 600)
-			roman.append("DC"); //$NON-NLS-1$
-		else if (b == 700)
-			roman.append("DCC"); //$NON-NLS-1$
-		else if (b == 800)
-			roman.append("DCCC"); //$NON-NLS-1$
-		else if (b == 900)
-			roman.append("CM"); //$NON-NLS-1$
-
-		if (c == 10)
-			roman.append("X"); //$NON-NLS-1$
-		else if (c == 20)
-			roman.append("XX"); //$NON-NLS-1$
-		else if (c == 30)
-			roman.append("XXX"); //$NON-NLS-1$
-		else if (c == 40)
-			roman.append("XL"); //$NON-NLS-1$
-		else if (c == 50)
-			roman.append("L"); //$NON-NLS-1$
-		else if (c == 60)
-			roman.append("LX"); //$NON-NLS-1$
-		else if (c == 70)
-			roman.append("LXX"); //$NON-NLS-1$
-		else if (c == 80)
-			roman.append("LXXX"); //$NON-NLS-1$
-		else if (c == 90)
-			roman.append("XC"); //$NON-NLS-1$
-
-		if (d == 1)
-			roman.append("I"); //$NON-NLS-1$
-		else if (d == 2)
-			roman.append("II"); //$NON-NLS-1$
-		else if (d == 3)
-			roman.append("III"); //$NON-NLS-1$
-		else if (d == 4)
-			roman.append("IV"); //$NON-NLS-1$
-		else if (d == 5)
-			roman.append("V"); //$NON-NLS-1$
-		else if (d == 6)
-			roman.append("VI"); //$NON-NLS-1$
-		else if (d == 7)
-			roman.append("VII"); //$NON-NLS-1$
-		else if (d == 8)
-			roman.append("VIII"); //$NON-NLS-1$
-		else if (d == 9)
-			roman.append("IX"); //$NON-NLS-1$
-
-		return roman.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java
deleted file mode 100644
index f738c47..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.color.CSSColorManager;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class BackgroundColorMeta extends CSSPropertyMeta {
-	private static final String[] _keywords = new String[] { ICSSPropertyID.VAL_TRANSPARENT };
-
-	/**
-	 */
-	public BackgroundColorMeta() {
-		super(false, ICSSPropertyID.VAL_TRANSPARENT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		Object result = CSSColorManager.getInstance().getColor(text);
-		if (result != null) {
-			return result;
-		}
-        return getInitialValue(propertyName, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		Object result;
-		String colorAttr = null;
-		if (ICSSPropertyID.ATTR_BACKGROUND_COLOR.equalsIgnoreCase(propertyName)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_BGCOLOR);
-		}
-		if (colorAttr != null && colorAttr.trim().length() != 0) {
-			colorAttr = colorAttr.trim();
-			result = CSSColorManager.getInstance().getColor(colorAttr);
-			return result;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundImageMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundImageMeta.java
deleted file mode 100644
index ac1acac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundImageMeta.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * Provides metadata for the "background-image" CSS property.
- * 
- * @author Ian Trimble - Oracle
- */
-public class BackgroundImageMeta extends CSSPropertyMeta {
-
-	private static final String[] _keywords = {ICSSPropertyID.VAL_NONE};
-
-	/**
-	 * Construct an instance.
-	 */
-	public BackgroundImageMeta() {
-		super(false, ICSSPropertyID.VAL_NONE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue, java.lang.String, org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	@Override
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		Object ret = null;
-		String valueText = value.getCssText();
-		if (valueText != null && valueText.length() > 0) {
-			valueText = stripURLSyntax(valueText);
-			ret = getImage(valueText, null);
-		}
-		if (ret == null) {
-			ret = getInitialValue(propertyName, style);
-		}
-		return ret;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element, java.lang.String, java.lang.String, org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	@Override
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		Image image = null;
-		if (
-				element != null &&
-				element.getNodeName() != null &&
-				element.getNodeName().equalsIgnoreCase(IHTMLConstants.TAG_BODY)) {
-			if (ICSSPropertyID.ATTR_BACKGROUND_IMAGE.equalsIgnoreCase(propertyName)) {
-				String attrValue = DOMUtil.getAttributeIgnoreCase(element, IHTMLConstants.ATTR_BACKGROUND);
-				if (attrValue != null && attrValue.trim().length() > 0) {
-					image = getImage(attrValue.trim(), element);
-				}
-			}
-		}
-		return image;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	@Override
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-	private String stripURLSyntax(String input) {
-		String output = null;
-		if (input != null) {
-			//strip "url(...)"
-			int startPos = input.indexOf("url(") + 4; //$NON-NLS-1$
-			if (startPos > -1 && startPos < input.length() - 1) {
-				int endPos = input.indexOf(')', startPos);
-				if (endPos > startPos) {
-					String insideURL = input.substring(startPos, endPos).trim();
-					//strip double-quotes
-					if (insideURL.startsWith("\"") && insideURL.endsWith("\"")) { //$NON-NLS-1$ //$NON-NLS-2$
-						output = insideURL.substring(1, insideURL.length() - 1);
-					//strip single-quotes
-					} else if (insideURL.startsWith("'") && insideURL.endsWith("'")) { //$NON-NLS-1$ //$NON-NLS-2$
-						output = insideURL.substring(1, insideURL.length() - 1);
-					} else {
-						output = insideURL;
-					}
-				}
-			}
-		}
-		return output != null ? output : input;
-	}
-
-	/* Image instances returned from this method should not be disposed because
-	 * they are cached in the plug-in's ImageRegistry and will be disposed of
-	 * by the registry.
-	 */
-	private Image getImage(String imagePath, Element element) {
-		Image image = null;
-		if (imagePath != null && imagePath.length() > 0) {
-			ImageRegistry registry = PDPlugin.getDefault().getImageRegistry();
-			image = registry.get(imagePath);
-			if (image == null) {
-				try {
-					URL imageURL = new URL(imagePath);
-					ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(imageURL);
-					image = imageDescriptor.createImage();
-					if (image != null) {
-						registry.put(imagePath, image);
-					}
-				} catch(MalformedURLException mue) {
-					//attempt to resolve as relative to document
-					if (element instanceof IDOMNode) {
-						IDOMModel model = ((IDOMNode)element).getModel();
-						if (model != null) {
-							String baseLocation = model.getBaseLocation();
-							if (baseLocation != null && baseLocation.length() > 0) {
-								IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
-								if (wsRoot != null) {
-									IResource jspRes = wsRoot.findMember(baseLocation);
-									if (jspRes != null) {
-										IContainer jspFolder = jspRes.getParent();
-										if (jspFolder != null) {
-											IResource imageRes = jspFolder.findMember(imagePath);
-											if (imageRes != null) {
-												URI imageURI = imageRes.getLocationURI();
-												if (imageURI != null) {
-													try {
-														URL imageURL = imageURI.toURL();
-														ImageDescriptor imageDescriptor = ImageDescriptor.createFromURL(imageURL);
-														image = imageDescriptor.createImage();
-														if (image != null) {
-															registry.put(imagePath, image);
-														}
-													} catch(MalformedURLException mue2) {
-														//ignore - what else can be done?
-													}
-												}
-											}
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			} else if (image.isDisposed()) {
-				//shouldn't be able to get here from there, but...just in case
-				registry.remove(imagePath);
-				image = getImage(imagePath, element);
-			}
-		}
-		return image;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java
deleted file mode 100644
index f2cbe1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class BorderCollapseMeta extends CSSPropertyMeta {
-	static String[] keywords = new String[] { ICSSPropertyID.VAL_COLLAPSE,
-			ICSSPropertyID.VAL_SEPARATE };
-
-	/**
-	 */
-	public BorderCollapseMeta() {
-		// XXX: the spec says COLLAPSE is initial value, but seemed that IE
-		// is using separate as default
-		super(true, ICSSPropertyID.VAL_SEPARATE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return keywords;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderColorMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderColorMeta.java
deleted file mode 100644
index d493a71..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderColorMeta.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.color.CSSColorManager;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class BorderColorMeta extends CSSPropertyMeta {
-
-	private static final String[] _keywords = new String[] { ICSSPropertyID.VAL_TRANSPARENT };
-
-	/**
-	 */
-	public BorderColorMeta() {
-		super(false, ICSSPropertyID.VAL_TRANSPARENT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		Object result = CSSColorManager.getInstance().getColor(text);
-		if (result != null) {
-			return result;
-		}
-        return getInitialValue(propertyName, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		Object result;
-		String colorAttr = null;
-		if (IHTMLConstants.TAG_HR.equalsIgnoreCase(htmltag)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_COLOR);
-		} else if (ICSSPropertyID.ATTR_BACKGROUND_COLOR
-				.equalsIgnoreCase(propertyName)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_BGCOLOR);
-		}
-		if (colorAttr != null && colorAttr.trim().length() != 0) {
-			colorAttr = colorAttr.trim();
-			result = CSSColorManager.getInstance().getColor(colorAttr);
-			return result;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderSpacingMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderSpacingMeta.java
deleted file mode 100644
index 22313c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderSpacingMeta.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-import org.w3c.dom.css.CSSValueList;
-
-/**
- * The value will always be of type int[2]
- * 
- * @author mengbo
- */
-public class BorderSpacingMeta extends CSSPropertyMeta {
-	private static final int[] INITIAL_SPACING = new int[] { 3, 3 };
-
-	/**
-	 */
-	public BorderSpacingMeta() {
-		// the specification says "border-spacing" is inherited. But seemed
-		// browse is not treating it as inherited. So we treat is as not
-		// inherited.
-		super(false, INITIAL_SPACING);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return EMPTY_KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		if (value == null || value.getCssValueType() == CSSValue.CSS_CUSTOM) {
-			return INITIAL_SPACING;
-		}
-		if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
-			int intvalue = toIntValue(value.getCssText(), style);
-			if (intvalue >= 0) {
-				return new int[] { intvalue, intvalue };
-			}
-            return INITIAL_SPACING;
-		} else if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
-			CSSValueList list = (CSSValueList) value;
-			if (list.getLength() >= 2) {
-				int i1 = toIntValue(list.item(0).getCssText(), style);
-				int i2 = toIntValue(list.item(1).getCssText(), style);
-				if (i1 < 0) {
-					i1 = 0;
-				}
-				if (i2 < 0) {
-					i2 = 0;
-				}
-				return new int[] { i1, i2 };
-			}
-            return INITIAL_SPACING;
-		} else {
-			return INITIAL_SPACING;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			String spacing = DOMUtil.getAttributeIgnoreCase(element,
-					IHTMLConstants.ATTR_CELLSPACING);
-			if (spacing != null) {
-				int intvalue = toIntValue(spacing, style);
-				if (intvalue >= 0) {
-					return new int[] { intvalue, intvalue };
-				}
-			}
-		}
-
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param valuetext
-	 * @param style
-	 * @return the integer value for value text
-	 */
-	protected int toIntValue(String valuetext, ICSSStyle style) {
-		Object length = LengthMeta.toLength(valuetext, style, PERCENTAGE_NONE,
-				style.getCSSFont());
-		if (length instanceof Length && !((Length) length).isPercentage()) {
-			return ((Length) length).getValue();
-		}
-        return Integer.MIN_VALUE;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderStyleMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderStyleMeta.java
deleted file mode 100644
index 3998634..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderStyleMeta.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class BorderStyleMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NONE,
-			ICSSPropertyID.VAL_HIDDEN, ICSSPropertyID.VAL_DOTTED,
-			ICSSPropertyID.VAL_DASHED, ICSSPropertyID.VAL_SOLID,
-			ICSSPropertyID.VAL_DOUBLE, ICSSPropertyID.VAL_GROOVE,
-			ICSSPropertyID.VAL_RIDGE, ICSSPropertyID.VAL_INSET,
-			ICSSPropertyID.VAL_OUTSET };
-
-	/**
-	 */
-	public BorderStyleMeta() {
-		super(false, ICSSPropertyID.VAL_NONE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			return calculateTableOverride(element, propertyName);
-		} else if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			return calculateTDOverride(element, propertyName, style);
-		} else if (IHTMLConstants.TAG_IMG.equalsIgnoreCase(htmltag)) {
-			String border = DOMUtil.getAttributeIgnoreCase(element,
-					IHTMLConstants.ATTR_BORDER);
-			if (border != null) {
-				return ICSSPropertyID.VAL_SOLID;
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTDOverride(Element element, String propertyName,
-			ICSSStyle style) {
-		// if element is empty, and "empty-cells" property is hide, then we
-		// don't display border.
-		Object obj = style.getStyleProperty(ICSSPropertyID.ATTR_EMPTY_CELLS);
-		if (EmptyCellsMeta.HIDE.equals(obj) && TableUtil.isEmptyCell(element)) {
-			return ICSSPropertyID.VAL_NONE;
-		}
-
-		// find containing table first
-		Node parent = element;
-		Element tableEle = null;
-		while ((parent = parent.getParentNode()) != null
-				&& parent instanceof Element) {
-			if (((Element) parent).getTagName().equalsIgnoreCase(
-					IHTMLConstants.TAG_TABLE)) {
-				tableEle = (Element) parent;
-				break;
-			}
-
-		}
-		if (tableEle != null) {
-			String rules = DOMUtil.getAttributeIgnoreCase(tableEle,
-					IHTMLConstants.ATTR_RULES);
-			String borderstr = DOMUtil.getAttributeIgnoreCase(tableEle,
-					IHTMLConstants.ATTR_BORDER);
-			if (rules == null || rules.length() == 0) {
-				if (borderstr == null || "0".equals(borderstr.trim())) { //$NON-NLS-1$
-					return ICSSPropertyID.VAL_NONE;
-				}
-                return ICSSPropertyID.VAL_TDBORDERSTYLE;
-			}
-            // ok, we got a value for rules
-            if (TableUtil.matchRules(extractEdge(propertyName), rules)) {
-            	return ICSSPropertyID.VAL_TDBORDERSTYLE;
-            }
-            return ICSSPropertyID.VAL_NONE;
-		}
-        return null;
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTableOverride(Element element, String propertyName) {
-		String frame = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_FRAME);
-		String borderstr = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_BORDER);
-		// border="0" implies frame="void"
-		if ("0".equals(borderstr)) { //$NON-NLS-1$
-			return ICSSPropertyID.VAL_NONE;
-		}
-		if (frame == null || frame.length() == 0) {
-			if (borderstr == null) {
-				return ICSSPropertyID.VAL_NONE;
-			} else if (borderstr.trim().length() == 0) {
-				frame = IHTMLConstants.ATTR_BORDER;
-			} else {
-				try {
-					Integer.parseInt(borderstr);
-					frame = IHTMLConstants.ATTR_BORDER;
-				} catch (Exception ex) {
-					frame = borderstr;
-				}
-			}
-		}
-		// ok, we got a value for frame.
-		if (TableUtil.matchFrame(extractEdge(propertyName), frame)) {
-			return ICSSPropertyID.VAL_OUTSET;
-		}
-        return ICSSPropertyID.VAL_NONE;
-	}
-
-	static String extractEdge(String propertyName) {
-		if (ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "bottom"; //$NON-NLS-1$
-		} else if (ICSSPropertyID.ATTR_BORDER_LEFT_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "left"; //$NON-NLS-1$
-		} else if (ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "right"; //$NON-NLS-1$
-		} else {
-			return "top"; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param propertyName
-	 * @return true if property name is a border style
-	 */
-	public static boolean isBorderStyle(String propertyName) {
-		return ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE
-				.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_LEFT_STYLE
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_TOP_STYLE
-						.equalsIgnoreCase(propertyName);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderWidthMeta.java
deleted file mode 100644
index d731699..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderWidthMeta.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * 
- * @author mengbo
- */
-// FIXME: when the border-style is none, how should we treat border-width?
-public class BorderWidthMeta extends LengthMeta {
-
-	private static final Length LENGTH_4 = new Length(4, false);
-
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_AUTO,
-			ICSSPropertyID.VAL_THIN, ICSSPropertyID.VAL_MEDIUM,
-			ICSSPropertyID.VAL_THICK };
-
-	/**
-	 */
-	public BorderWidthMeta() {
-		super(false, LENGTH_4); // medium length.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getPercentageType()
-	 */
-	public int getPercentageType() {
-		return PERCENTAGE_NONE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		// Computed value: absolute length; '0' if the border style is 'none' or
-		// 'hidden'
-		Object stylevalue = style.getStyleProperty("border-" //$NON-NLS-1$
-				+ extractEdge(propertyName) + "-style"); //$NON-NLS-1$
-		if (ICSSPropertyID.VAL_NONE.equals(stylevalue)
-				|| ICSSPropertyID.VAL_HIDDEN.equals(stylevalue)) {
-			return Length.LENGTH_0;
-		}
-
-		Object obj = super.calculateCSSValueResult(value, propertyName, style);
-		if (ICSSPropertyID.VAL_THIN.equals(obj)) {
-			return Length.LENGTH_1;
-		} else if (ICSSPropertyID.VAL_MEDIUM.equals(obj)) {
-			return Length.LENGTH_3;
-		} else if (ICSSPropertyID.VAL_THICK.equals(obj)) {
-			return Length.LENGTH_8;
-		}
-		return obj;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if ("table".equalsIgnoreCase(htmltag)) { //$NON-NLS-1$
-			return calculateTableOverride(element, propertyName);
-		} else if ("td".equalsIgnoreCase(htmltag) //$NON-NLS-1$
-				|| "th".equalsIgnoreCase(htmltag)) { //$NON-NLS-1$
-			return calculateTDOverride(element, propertyName);
-		} else if ("img".equalsIgnoreCase(htmltag)) { //$NON-NLS-1$
-			String border = DOMUtil.getAttributeIgnoreCase(element, "border");// ICSSPropertyID.ATTR_BORDERSIZE); //$NON-NLS-1$
-			if (border != null) {
-				try {
-					return new Length(Integer.parseInt(border), false);
-				} catch (Exception ex) {
-					// Integer processing, no need to report.
-				}
-			}
-		}
-
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTDOverride(Element element, String propertyName) {
-		// find containing table first
-		Node parent = element;
-		Element tableEle = null;
-		while ((parent = parent.getParentNode()) != null
-				&& parent instanceof Element) {
-			if (((Element) parent).getTagName().equalsIgnoreCase("table")) { //$NON-NLS-1$
-				tableEle = (Element) parent;
-				break;
-			}
-
-		}
-		if (tableEle != null) {
-			String rules = DOMUtil.getAttributeIgnoreCase(tableEle, "rules"); //$NON-NLS-1$
-			String borderstr = DOMUtil.getAttributeIgnoreCase(tableEle,
-					"border"); //$NON-NLS-1$
-			if (rules == null || rules.length() == 0) {
-				if (borderstr == null || "0".equals(borderstr.trim())) { //$NON-NLS-1$
-					return null;
-				}
-                return Length.LENGTH_1;
-			}
-            // ok, we got a value for rules
-            if (TableUtil.matchRules(extractEdge(propertyName), rules)) {
-            	return Length.LENGTH_1;
-            }
-            return Length.LENGTH_0;
-		}
-        return Length.LENGTH_0;
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTableOverride(Element element, String propertyName) {
-		String frame = DOMUtil.getAttributeIgnoreCase(element, "frame"); //$NON-NLS-1$
-		String borderstr = DOMUtil.getAttributeIgnoreCase(element, "border"); //$NON-NLS-1$
-		// border="0" implies frame="void"
-		if ("0".equals(borderstr)) { //$NON-NLS-1$
-			return Length.LENGTH_0;
-		}
-		if (frame == null || frame.length() == 0) {
-			if (borderstr == null) {
-				return null;
-			} else if (borderstr.trim().length() == 0) {
-				return Length.LENGTH_1;
-			} else {
-				try {
-					return new Length(Integer.parseInt(borderstr), false);
-				} catch (Exception ex) {
-					frame = borderstr;
-				}
-			}
-		}
-		// ok, we got a value for frame.
-		if (TableUtil.matchFrame(extractEdge(propertyName), frame)) {
-			if (borderstr != null) {
-				try {
-					return new Length(Integer.parseInt(borderstr), false);
-				} catch (Exception ex) {
-					// ignore. pass through to return length_1
-				}
-			}
-			return Length.LENGTH_1;
-		}
-        return Length.LENGTH_0;
-	}
-
-	static String extractEdge(String propertyName) {
-		if (ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "bottom"; //$NON-NLS-1$
-		} else if (ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "left"; //$NON-NLS-1$
-		} else if (ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "right"; //$NON-NLS-1$
-		} else {
-			return "top"; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param propertyName
-	 * @return true if property name is a border width
-	 */
-	public static boolean isBorderWidth(String propertyName) {
-		return ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH
-				.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_TOP_WIDTH
-						.equalsIgnoreCase(propertyName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getInitialValue(java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style) {
-		// Computed value: absolute length; '0' if the border style is 'none' or
-		// 'hidden'
-		Object stylevalue = style.getStyleProperty("border-" //$NON-NLS-1$
-				+ extractEdge(propertyName) + "-style"); //$NON-NLS-1$
-		if (ICSSPropertyID.VAL_NONE.equals(stylevalue)
-				|| ICSSPropertyID.VAL_HIDDEN.equals(stylevalue)) {
-			return Length.LENGTH_0;
-		}
-		return super.getInitialValue(propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java
deleted file mode 100644
index da55ec5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-
-/**
- * @author mengbo
- */
-public class CSSMetaRegistry {
-	Map _map = new HashMap();
-
-	private static CSSMetaRegistry _instance;
-
-	private CSSMetaRegistry() {
-		initialize();
-	}
-
-	/**
-	 * class initializer
-	 */
-	private void initialize() 
-	{
-	    final PDPreferences prefs = new PDPreferences();
-		_map.put(ICSSPropertyID.ATTR_DISPLAY, new DisplayMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTALIGN, new TextAlignMeta());
-		_map.put(ICSSPropertyID.ATTR_HORIZONTAL_ALIGN, new HorizontalAlignMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTDECORATION, new TextDecorationMeta());
-		_map.put(ICSSPropertyID.ATTR_WHITESPACE, new WhiteSpaceMeta());
-		_map.put(ICSSPropertyID.ATTR_WIDTH, new WidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MIN_WIDTH, new WidthMeta());
-		_map.put(ICSSPropertyID.ATTR_HEIGHT, new HeightMeta());
-		_map.put(ICSSPropertyID.ATTR_MIN_HEIGHT, new HeightMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH, new BorderWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH, new BorderWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH, new BorderWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_WIDTH, new BorderWidthMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_STYLE, new BorderStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE, new BorderStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE, new BorderStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_STYLE, new BorderStyleMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_COLOR, new BorderColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_COLOR, new BorderColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_COLOR, new BorderColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_COLOR, new BorderColorMeta());
-
-		_map.put(ICSSPropertyID.ATTR_PADDING_LEFT, new PaddingWidthMeta(prefs));
-		_map.put(ICSSPropertyID.ATTR_PADDING_RIGHT, new PaddingWidthMeta(prefs));
-		_map.put(ICSSPropertyID.ATTR_PADDING_BOTTOM, new PaddingWidthMeta(prefs));
-		_map.put(ICSSPropertyID.ATTR_PADDING_TOP, new PaddingWidthMeta(prefs));
-
-		_map.put(ICSSPropertyID.ATTR_MARGIN_LEFT, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_RIGHT, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_BOTTOM, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_TOP, new MarginWidthMeta());
-
-		_map.put(ICSSPropertyID.ATTR_FONT_FAMILY, new FontFamilyMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_SIZE, new FontSizeMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_STYLE, new FontStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_WEIGHT, new FontWeightMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BACKGROUND_COLOR, new BackgroundColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BACKGROUND_IMAGE, new BackgroundImageMeta());
-		_map.put(ICSSPropertyID.ATTR_COLOR, new ColorPropertyMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTCOLOR, new ColorPropertyMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_COLLAPSE, new BorderCollapseMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_SPACING, new BorderSpacingMeta());
-
-		_map.put(ICSSPropertyID.ATTR_LIST_STYLE_TYPE, new ListStyleTypeMeta());
-		_map.put(ICSSPropertyID.ATTR_LIST_STYLE_IMAGE, new ListStyleImageMeta());
-		_map.put(ICSSPropertyID.ATTR_LIST_STYLE_POSITION, new ListStylePositionMeta());
-		_map.put(ICSSPropertyID.ATTR_COUNTER_RESET, new CounterResetMeta());
-		_map.put(ICSSPropertyID.ATTR_COUNTER_INCREMENT, new CounterIncrementMeta());
-
-		_map.put(ICSSPropertyID.ATTR_TOP, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_RIGHT, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_BOTTOM, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_LEFT, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_POSITION, new PositionMeta());
-
-		_map.put(ICSSPropertyID.ATTR_EMPTY_CELLS, new EmptyCellsMeta());
-		_map.put(ICSSPropertyID.ATTR_VISIBILITY, new VisibilityMeta());
-		_map.put(ICSSPropertyID.ATTR_VERTICAL_ALIGN, new VerticalAlignMeta());
-
-		_map.put(ICSSPropertyID.ATTR_OVERFLOW, new OverflowMeta());
-	}
-
-	/**
-	 * @param property
-	 * @return the meta
-	 */
-	public ICSSPropertyMeta getMeta(String property) {
-		return (ICSSPropertyMeta) _map.get(property);
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static final CSSMetaRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new CSSMetaRegistry();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSPropertyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSPropertyMeta.java
deleted file mode 100644
index ad426a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSPropertyMeta.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public abstract class CSSPropertyMeta implements ICSSPropertyMeta {
-	static final String[] EMPTY_KEYWORDS = new String[0];
-
-	boolean _inherited;
-
-	Object _initialValue;
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public CSSPropertyMeta(boolean inherit, Object initvalue) {
-		this._inherited = inherit;
-		this._initialValue = initvalue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#isInherited()
-	 */
-	public boolean isInherited() {
-		return _inherited;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getHTMLElementInitialValue(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public Object getHTMLElementInitialValue(Element element, String htmltag,
-			String propertyName) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getInitialValue()
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style) {
-		return _initialValue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getPercentageType()
-	 */
-	public int getPercentageType() {
-		return PERCENTAGE_NONE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		// child class should override this method!!!
-		return null;
-	}
-
-	/**
-	 * for many properties, they have a set of keyword property values.
-	 * 
-	 * @return the keyword values
-	 */
-	protected abstract String[] getKeywordValues();
-
-	/**
-	 * @param value
-	 * @return null if is not a keyword.
-	 */
-	protected String checkKeywordValues(String value) {
-		if (value == null)
-			return null;
-		String[] keywords = getKeywordValues();
-		if (keywords != null) {
-			for (int i = 0; i < keywords.length; i++) {
-				if (keywords[i].equalsIgnoreCase(value)) {
-					return keywords[i];
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String s = checkKeywordValues(value.getCssText());
-		if (s != null) {
-			return s;
-		}
-        return this.getInitialValue(propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ColorPropertyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ColorPropertyMeta.java
deleted file mode 100644
index 8562288..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ColorPropertyMeta.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.Arrays;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.color.CSSColorManager;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * "color" will be in this type
- * 
- * @author mengbo
- */
-public class ColorPropertyMeta extends CSSPropertyMeta {
-	private static final Object DEFAULT_COLOR = ColorConstants.black;
-
-	private static final String[] KEYWORDS = new String[] {};
-
-	private final static String[] NOTSUPPORT_TAG = { IHTMLConstants.TAG_H1,
-			IHTMLConstants.TAG_H2, IHTMLConstants.TAG_H3,
-			IHTMLConstants.TAG_H4, IHTMLConstants.TAG_H5, IHTMLConstants.TAG_H6 };
-
-	/**
-	 */
-	public ColorPropertyMeta() {
-		super(true, DEFAULT_COLOR);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-
-		String text = value.getCssText();
-		Object result = CSSColorManager.getInstance().getColor(text);
-		if (result != null) {
-			return result;
-		}
-        return this.getInitialValue(propertyName, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (Arrays.asList(NOTSUPPORT_TAG).contains(htmltag.toLowerCase())) {
-			return null;
-		}
-		Object result;
-		String colorAttr = null;
-		// There are some conditions need to be dealt with hyperlink and text
-		// properties.
-		if (ICSSPropertyID.ATTR_COLOR.equalsIgnoreCase(propertyName)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_COLOR);
-			if (colorAttr == null
-					&& element.getLocalName().equalsIgnoreCase(
-							IHTMLConstants.TAG_BODY)) {
-				colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-						ICSSPropertyID.ATTR_TEXT);
-			}
-		}
-		if (colorAttr != null) {
-			colorAttr = colorAttr.trim();
-			result = CSSColorManager.getInstance().getColor(colorAttr);
-			return result;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ContentMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ContentMeta.java
deleted file mode 100644
index 0b190e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ContentMeta.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class ContentMeta extends CSSPropertyMeta {
-	/**
-	 */
-	public ContentMeta() {
-		// why inherit this??
-		super(false, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterIncrementMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterIncrementMeta.java
deleted file mode 100644
index 660c822..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterIncrementMeta.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.IncrementObject;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * For CounterIncrementMeta, the valid value could be the following: 1. NULL 2.
- * NOT_SPECIFIED 3. a List of IncrementObject.
- * 
- * @author mengbo
- */
-public class CounterIncrementMeta extends CSSPropertyMeta {
-	/**
-	 * 
-	 */
-	public CounterIncrementMeta() {
-		super(false, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		return getCounter(value);
-	}
-
-	/**
-	 * @param value
-	 * @return the counter
-	 */
-	public List getCounter(CSSValue value) {
-		if (value == null) {
-			return null;
-		}
-		List result = new ArrayList();
-		IncrementObject incrementObject = null;
-		String identifier = null;
-		Integer increment = null;
-		ICSSNode cssValue = (ICSSNode) value;
-		while (cssValue != null) {
-			// find next idetifier.
-			while (cssValue != null && !CounterHelper.isIdentifier(cssValue)) {
-				cssValue = cssValue.getNextSibling();
-			}
-			if (cssValue == null) {
-				return null;
-			}
-            // identifier:
-            identifier = ((ICSSPrimitiveValue) value).getStringValue();
-            cssValue = cssValue.getNextSibling();
-            // value:
-            if (CounterHelper.isNumber(cssValue)) {
-            	increment = new Integer((int) ((ICSSPrimitiveValue) value)
-            			.getFloatValue(ICSSPrimitiveValue.CSS_INTEGER));
-            }
-
-			if (identifier != null) {
-				incrementObject = new IncrementObject(identifier, increment);
-				result.add(incrementObject);
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterResetMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterResetMeta.java
deleted file mode 100644
index ac51249..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterResetMeta.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.ResetObject;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class CounterResetMeta extends CSSPropertyMeta {
-	/**
-	 * 
-	 */
-	public CounterResetMeta() {
-		super(false, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		return getCounter(value);
-	}
-
-	/**
-	 * @param value
-	 * @return the counter
-	 */
-	public List getCounter(CSSValue value) {
-		if (value == null) {
-			return null;
-		}
-		List result = new ArrayList();
-		ResetObject resetObject = null;
-		String identifier = null;
-		Integer initial = null;
-		ICSSNode cssValue = (ICSSNode) value;
-		while (cssValue != null) {
-			// find next idetifier.
-			while (cssValue != null && !CounterHelper.isIdentifier(cssValue)) {
-				cssValue = cssValue.getNextSibling();
-			}
-			if (cssValue == null) {
-				return null;
-			}
-            // identifier:
-            identifier = ((ICSSPrimitiveValue) value).getStringValue();
-            cssValue = cssValue.getNextSibling();
-            // value:
-            if (CounterHelper.isNumber(cssValue)) {
-            	initial = new Integer((int) ((ICSSPrimitiveValue) value)
-            			.getFloatValue(ICSSPrimitiveValue.CSS_INTEGER));
-            }
-
-			if (identifier != null) {
-				resetObject = new ResetObject(identifier, initial);
-				result.add(resetObject);
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/DisplayMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/DisplayMeta.java
deleted file mode 100644
index 8997129..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/DisplayMeta.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class DisplayMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_INLINE,
-			ICSSPropertyID.VAL_BLOCK, ICSSPropertyID.VAL_INLINE_BLOCK,
-			ICSSPropertyID.VAL_LIST_ITEM, ICSSPropertyID.VAL_RUN_IN,
-			ICSSPropertyID.VAL_COMPACT, ICSSPropertyID.VAL_MARKER,
-			ICSSPropertyID.VAL_TABLE, ICSSPropertyID.VAL_INLINE_TABLE,
-			ICSSPropertyID.VAL_TABLE_ROW_GROUP,
-			ICSSPropertyID.VAL_TABLE_HEADER_GROUP,
-			ICSSPropertyID.VAL_TABLE_FOOTER_GROUP,
-			ICSSPropertyID.VAL_TABLE_ROW,
-			ICSSPropertyID.VAL_TABLE_COLUMN_GROUP,
-			ICSSPropertyID.VAL_TABLE_COLUMN, ICSSPropertyID.VAL_TABLE_CELL,
-			ICSSPropertyID.VAL_TABLE_CAPTION, ICSSPropertyID.VAL_NONE };
-
-	/**
-	 */
-	public DisplayMeta() {
-		super(false, ICSSPropertyID.VAL_INLINE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		if (text == null)
-			return ICSSPropertyID.VAL_INLINE;
-		String key = this.checkKeywordValues(text);
-		if (key != null)
-			return key;
-        return ICSSPropertyID.VAL_INLINE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/EmptyCellsMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/EmptyCellsMeta.java
deleted file mode 100644
index f56c78f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/EmptyCellsMeta.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class EmptyCellsMeta extends CSSPropertyMeta {
-	private static final String SHOW = "show"; //$NON-NLS-1$
-
-	static final String HIDE = "hide"; //$NON-NLS-1$
-
-	private static final String[] _keywords = new String[] { SHOW, HIDE };
-
-	/**
-	 */
-	public EmptyCellsMeta() {
-		// FIXME: on CSS spec, initial value should be "show".
-		// but seemed IE's default is hide.
-		super(true, HIDE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FloatInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FloatInfo.java
deleted file mode 100644
index 92daafb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FloatInfo.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSPrimitiveValue;
-
-/**
- * copied from wtp's internal code.
- * 
- * @author mengbo
- */
-public final class FloatInfo {
-	/**
-	 * @param text 
-	 */
-	public FloatInfo(String text) {
-		parse(text);
-	}
-
-	/**
-	 * 
-	 */
-	void parse(String text) {
-		StringBuffer bufValue = new StringBuffer();
-		StringBuffer bufIdent = new StringBuffer();
-		boolean bNum = true;
-		int len = text.length();
-		for (int i = 0; i < len; i++) {
-			char c = text.charAt(i);
-			if (bNum) {
-				if ('0' <= c && c <= '9' || c == '.' || c == '+' || c == '-') {
-					bufValue.append(c);
-				} else {
-					bufIdent.append(c);
-					bNum = false;
-				}
-			} else {
-				bufIdent.append(c);
-			}
-		}
-		String valueStr = bufValue.toString();
-		_value = Float.valueOf(valueStr).floatValue();
-		_identifier = bufIdent.toString();
-		_type = getFloatValueType(valueStr, _identifier);
-	}
-
-	/**
-	 * @return the value
-	 * 
-	 */
-	public float getValue() {
-		return _value;
-	}
-
-	/**
-	 * 
-	 */
-	String getIdentifier() {
-		return _identifier;
-	}
-
-	/**
-	 * @return the value type
-	 */
-	public short getValueType() {
-		return _type;
-	}
-
-	/**
-	 * 
-	 */
-	static short getFloatValueType(String value, String ident) {
-		ident = ident.toLowerCase();
-		short valueType;
-		if (ident.length() == 0) {
-			if (0 <= value.indexOf('.')) {
-				valueType = CSSPrimitiveValue.CSS_NUMBER;
-			} else {
-				valueType = ICSSPrimitiveValue.CSS_INTEGER;
-			}
-		} else if (ident.equals("%")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PERCENTAGE;
-		} else if (ident.equalsIgnoreCase("em")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_EMS;
-		} else if (ident.equalsIgnoreCase("ex")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_EXS;
-		} else if (ident.equalsIgnoreCase("px")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PX;
-		} else if (ident.equalsIgnoreCase("cm")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_CM;
-		} else if (ident.equalsIgnoreCase("mm")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_MM;
-		} else if (ident.equalsIgnoreCase("in")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_IN;
-		} else if (ident.equalsIgnoreCase("pt")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PT;
-		} else if (ident.equalsIgnoreCase("pc")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PC;
-		} else if (ident.equalsIgnoreCase("deg")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_DEG;
-		} else if (ident.equalsIgnoreCase("rad")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_RAD;
-		} else if (ident.equalsIgnoreCase("grad")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_GRAD;
-		} else if (ident.equalsIgnoreCase("ms")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_MS;
-		} else if (ident.equalsIgnoreCase("s")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_S;
-		} else if (ident.equalsIgnoreCase("hz")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_HZ;
-		} else if (ident.equalsIgnoreCase("khz")) { //$NON-NLS-1$
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_KHZ;
-		} else {
-			valueType = CSSPrimitiveValue.CSS_DIMENSION;
-		}
-		return valueType;
-	}
-
-	private float _value = 0.0f;
-
-	private String _identifier = null;
-
-	private short _type = CSSPrimitiveValue.CSS_UNKNOWN;
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java
deleted file mode 100644
index 0589c41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Display;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-import org.w3c.dom.css.CSSValueList;
-
-/**
- * @author mengbo
- */
-public class FontFamilyMeta extends CSSPropertyMeta {
-	/**
-	 * the default font name
-	 */
-	public static final String DEFAULT_FONT = "Times New Roman"; //$NON-NLS-1$
-
-	private static FontData[] _FontData;
-
-	private static FontData[] getFontData() {
-		if (_FontData == null) {
-			ArrayList list = new ArrayList();
-			list.addAll(Arrays.asList(Display.getCurrent().getFontList(null,
-					false)));
-			list.addAll(Arrays.asList(Display.getCurrent().getFontList(null,
-					true)));
-			_FontData = (FontData[]) list.toArray(new FontData[list.size()]);
-		}
-		return _FontData;
-	}
-
-	/**
-	 */
-	public FontFamilyMeta() {
-		super(true, DEFAULT_FONT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
-			CSSValueList valueList = (CSSValueList) value;
-			for (int i = 0, count = valueList.getLength(); i < count; i++) {
-				String name = valueList.item(i).getCssText();
-				name = trimPadding(name);
-				if (isSupportedFont(name)) {
-					return name;
-				}
-			}
-		}
-		return trimPadding(value.getCssText());
-	}
-
-	private String trimPadding(String name) {
-		String value = name;
-		if (value != null) {
-			value = value.replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			value = value.replaceAll("'", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return value;
-	}
-
-	private boolean isSupportedFont(String name) {
-		FontData[] fontData = getFontData();
-		for (int i = 0; i < fontData.length; i++) {
-			if (fontData[i].getName().equalsIgnoreCase(name)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if ("FONT".equalsIgnoreCase(htmltag) //$NON-NLS-1$
-				|| "BASEFONT".equalsIgnoreCase(htmltag)) { //$NON-NLS-1$
-			String face = DOMUtil.getAttributeIgnoreCase(element, "face"); //$NON-NLS-1$
-			if (face != null) {
-				String[] names = getFontNameList(face);
-				for (int i = 0; i < names.length; i++) {
-					if (isSupportedFont(names[i])) {
-						return names[i];
-					}
-				}
-			} else {
-				return null;
-			}
-		}
-		return null;
-	}
-
-	private String[] getFontNameList(String face) {
-		StringTokenizer tokenizer = new StringTokenizer(face, ","); //$NON-NLS-1$
-		String[] names = new String[tokenizer.countTokens()];
-		for (int i = 0; i < names.length; i++) {
-			names[i] = trimPadding(tokenizer.nextToken());
-		}
-		return names;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java
deleted file mode 100644
index 498e52a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * The result value should be Length object only.
- * 
- * @author mengbo
- */
-// XXX: in the future, we may add "unit" into Length, the one unit will be
-// "MEDIUM"
-// and specific for font. Means the relative size to MEDIUM. Then it is possible
-// for
-// the caller to decide the actual font size based on the style specific MEDIUM
-// size.
-public class FontSizeMeta extends LengthMeta {
-	private static final String[] KEYWORDS = { ICSSPropertyID.VAL_XX_SMALL,
-			ICSSPropertyID.VAL_X_SMALL, ICSSPropertyID.VAL_SMALL,
-			ICSSPropertyID.VAL_MEDIUM, ICSSPropertyID.VAL_LARGE,
-			ICSSPropertyID.VAL_X_LARGE, ICSSPropertyID.VAL_XX_LARGE,
-			ICSSPropertyID.VAL_LARGER, ICSSPropertyID.VAL_SMALLER };
-
-	/**
-	 * font size
-	 */
-	public static final double MEDIUM_VAL_INT = 16;
-
-	private static final double SCALING_FACTOR = 1.2;
-
-	private static final double FACTORS[] = { 0.6, 0.89, 1, 1.2, 1.5, 2.0, 3.0 };
-
-	// The scaling factors in IE is different from CSS definition. Here we
-	// follow IE.
-	private static final double CSS_ABSOLUTE_FACTORS[] = { 0.63, 0.82, 1, 1.12,
-			1.5, 2.0, 3.0 };
-
-	private static final int MIN_SIZE_FOR_SMALLER = 1;
-
-	private static final int MIN_SIZE_FOR_LARGER = 9;
-
-	/**
-	 * Default constructor
-	 */
-	public FontSizeMeta() {
-		super(true, new Length((int) MEDIUM_VAL_INT, false));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#getBaseFont(org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	protected ICSSFont getBaseFont(ICSSStyle style) {
-		return style.getParentStyle().getCSSFont();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getPercentageType()
-	 */
-	public int getPercentageType() {
-		return PERCENTAGE_FONT;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		Object obj = super.calculateCSSValueResult(value, propertyName, style);
-		if (obj instanceof Length) {
-			return obj;
-		}
-		// otherwise, it is keyword.
-		return convertKeyword(obj, style);
-	}
-
-	/**
-	 * @param fontsizeobj
-	 * @param style
-	 * @return the length
-	 */
-	protected Length convertKeyword(Object fontsizeobj, ICSSStyle style) {
-		int fontsize;
-		int parentfontsize = style.getParentStyle().getCSSFont().getFontSize();
-		if (fontsizeobj instanceof Length) {
-			fontsize = ((Length) fontsizeobj).getValue();
-		} else if (ICSSPropertyID.VAL_XX_SMALL.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[0]);
-		} else if (ICSSPropertyID.VAL_X_SMALL.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[1]);
-		} else if (ICSSPropertyID.VAL_SMALL.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[2]);
-		} else if (ICSSPropertyID.VAL_MEDIUM.equals(fontsizeobj)) {
-			fontsize = (int) Math.round(MEDIUM_VAL_INT
-					* CSS_ABSOLUTE_FACTORS[3]);
-		} else if (ICSSPropertyID.VAL_LARGE.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[4]);
-		} else if (ICSSPropertyID.VAL_X_LARGE.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[5]);
-		} else if (ICSSPropertyID.VAL_XX_LARGE.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[6]);
-		} else if (ICSSPropertyID.VAL_SMALLER.equals(fontsizeobj)) {
-			fontsize = (int) (parentfontsize / SCALING_FACTOR);
-			if (fontsize < MIN_SIZE_FOR_SMALLER) {
-				fontsize = MIN_SIZE_FOR_SMALLER;
-			}
-		} else if (ICSSPropertyID.VAL_LARGER.equals(fontsizeobj)) {
-			fontsize = (int) (parentfontsize * SCALING_FACTOR);
-			if (fontsize < MIN_SIZE_FOR_LARGER) {
-				fontsize = MIN_SIZE_FOR_LARGER;
-			}
-		} else {
-			fontsize = parentfontsize;
-		}
-
-		return new Length(fontsize, false);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_FONT.equalsIgnoreCase(htmltag)
-				|| ICSSPropertyID.ATTR_BASEFONT.equalsIgnoreCase(htmltag)) {
-			String size = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_SIZE);
-			if (size != null) {
-				size = size.trim();
-				try {
-					int fontSize = 0;
-					if (size.startsWith("+")) //$NON-NLS-1$
-					{
-						fontSize = Integer.parseInt(size.substring(1)) + 3;
-					} else if (size.startsWith("-")) //$NON-NLS-1$
-					{
-						fontSize = 3 - Integer.parseInt(size.substring(1));
-					} else {
-						fontSize = Integer.parseInt(size);
-					}
-					if (fontSize < 1) {
-						fontSize = 1;
-					}
-					if (fontSize > 7) {
-						fontSize = 7;
-					}
-					return new Length((int) (Math.round(FACTORS[fontSize - 1]
-							* MEDIUM_VAL_INT)), false);
-				} catch (Exception ex) {
-					// Error in tag font attr calculating.
-					// _log.error("Error.FontSizeMeta.0", ex); //$NON-NLS-1$
-					return null;
-				}
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontStyleMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontStyleMeta.java
deleted file mode 100644
index 7d46ab2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontStyleMeta.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class FontStyleMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_ITALIC, ICSSPropertyID.VAL_OBLIQUE };
-
-	/**
-	 * Default constructor
-	 */
-	public FontStyleMeta() {
-		super(true, ICSSPropertyID.VAL_NORMAL);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontWeightMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontWeightMeta.java
deleted file mode 100644
index 3b333e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontWeightMeta.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * The result value will always be integer, range 100-900 This class has already
- * translate things like "normal", "bold", "bolder", "lighter" into integer
- * value.
- * 
- * @author mengbo
- */
-public class FontWeightMeta extends CSSPropertyMeta {
-
-	/**
-	 * normal weight value
-	 */
-	public static final Integer NORMAL_WEIGHT = new Integer(400);
-
-	private static final Integer BOLD_WEIGHT = new Integer(700);
-
-	private static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_BOLD, ICSSPropertyID.VAL_BOLDER,
-			ICSSPropertyID.VAL_LIGHTER };
-
-
-	/**
-	 * Default constructor
-	 */
-	public FontWeightMeta() {
-		super(true, NORMAL_WEIGHT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		String result = checkKeywordValues(text);
-		if (result == null) {
-			try {
-				int i = Integer.parseInt(text);
-				if (i < 100) {
-					i = 100;
-				}
-				if (i > 900) {
-					i = 900;
-				}
-				return new Integer(i);
-			} catch (Exception ex) {
-				// Error in integer processing
-				return NORMAL_WEIGHT;
-			}
-		} else if (ICSSPropertyID.VAL_NORMAL.equals(result)) {
-			return NORMAL_WEIGHT;
-		} else if (ICSSPropertyID.VAL_BOLD.equals(result)) {
-			return BOLD_WEIGHT;
-		} else if (ICSSPropertyID.VAL_BOLDER.equals(result)) {
-			// int i = style.getParentStyle().getCSSFont().getWeight() + 100;
-			// if (i < 100)
-			// i = 100;
-			// if (i > 900)
-			// i = 900;
-			// return new Integer(i);
-			return BOLD_WEIGHT;
-		} else if (ICSSPropertyID.VAL_LIGHTER.equals(result)) {
-			int i = style.getParentStyle().getCSSFont().getWeight() - 100;
-			if (i < 100) {
-				i = 100;
-			}
-			if (i > 900) {
-				i = 900;
-			}
-			return new Integer(i);
-		}
-		return NORMAL_WEIGHT;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HeightMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HeightMeta.java
deleted file mode 100644
index fcc6527..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HeightMeta.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class HeightMeta extends LengthMeta {
-	/**
-	 * Default constructor
-	 */
-	public HeightMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (!"input".equalsIgnoreCase(htmltag)) //$NON-NLS-1$
-		{
-			String attributeName = ICSSPropertyID.ATTR_HEIGHT;
-			if ("hr".equalsIgnoreCase(htmltag)) { //$NON-NLS-1$
-				attributeName = ICSSPropertyID.ATTR_SIZE;
-			}
-
-			String height = DOMUtil.getAttributeIgnoreCase(element,
-					attributeName);
-			if (height != null) {
-				return LengthMeta.toLength(height, style, this
-						.getPercentageType(), getBaseFont(style));
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java
deleted file mode 100644
index 6dd075c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class HorizontalAlignMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_LEFT,
-			"bottom", "top", //$NON-NLS-1$ //$NON-NLS-2$
-			ICSSPropertyID.VAL_RIGHT, ICSSPropertyID.VAL_CENTER,
-			ICSSPropertyID.VAL_JUSTIFY };
-
-	private static final String[] HOR_SLIGN_HTMLTAGS = new String[] {
-			"TABLE", "HR", "LEGEND", "APPLET", "IFRAME", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			"IMG", "INPUT", "OBJECT", "CAPTION" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-	};
-
-	/**
-	 * default constructor
-	 */
-	public HorizontalAlignMeta() {
-		super(true, NOT_SPECIFIED);
-	}
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public HorizontalAlignMeta(boolean inherit, Object initvalue) {
-		super(inherit, initvalue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-
-		if (Arrays.asList(HOR_SLIGN_HTMLTAGS).contains(htmltag.toUpperCase())) {
-			String align = DOMUtil.getAttributeIgnoreCase(element, "align"); //$NON-NLS-1$
-			return checkKeywordValues(align);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getHTMLElementInitialValue(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public Object getHTMLElementInitialValue(Element element, String htmltag,
-			String propertyName) {
-		if ("HR".equalsIgnoreCase(htmltag.toUpperCase())) //$NON-NLS-1$
-		{
-			return ICSSPropertyID.VAL_CENTER;
-		} else if (Arrays.asList(HOR_SLIGN_HTMLTAGS).contains(
-				htmltag.toUpperCase())) {
-			return ICSSPropertyID.VAL_LEFT;
-		}
-
-		return super.getHTMLElementInitialValue(element, htmltag, propertyName);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyID.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyID.java
deleted file mode 100644
index 4930fab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyID.java
+++ /dev/null
@@ -1,927 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public interface ICSSPropertyID {
-	/**
-	 * display attribute name
-	 */
-	public static final String ATTR_DISPLAY = "display"; //$NON-NLS-1$
-
-	/**
-	 * whitespace attribute name
-	 */
-	public static final String ATTR_WHITESPACE = "white-space"; //$NON-NLS-1$
-
-	/**
-	 * text decoration attribute name
-	 */
-	public static final String ATTR_TEXTDECORATION = "text-decoration"; //$NON-NLS-1$
-
-	/**
-	 * text align attribute name
-	 */
-	public static final String ATTR_TEXTALIGN = "text-align"; //$NON-NLS-1$
-
-	/**
-	 * width attribute name
-	 */
-	public static final String ATTR_WIDTH = "width"; //$NON-NLS-1$
-
-	/**
-	 * min-width attribute name
-	 */
-	public static final String ATTR_MIN_WIDTH = "min-width"; //$NON-NLS-1$
-
-	/**
-	 * height attribute name
-	 */
-	public static final String ATTR_HEIGHT = "height"; //$NON-NLS-1$
-
-	/**
-	 * min height attribute name
-	 */
-	public static final String ATTR_MIN_HEIGHT = "min-height"; //$NON-NLS-1$
-
-	/**
-	 * border-left-width attribute name
-	 */
-	public static final String ATTR_BORDER_LEFT_WIDTH = "border-left-width"; //$NON-NLS-1$
-
-	/**
-	 * border-right-width attribute name
-	 */
-	public static final String ATTR_BORDER_RIGHT_WIDTH = "border-right-width"; //$NON-NLS-1$
-
-	/**
-	 * border bottom width
-	 */
-	public static final String ATTR_BORDER_BOTTOM_WIDTH = "border-bottom-width"; //$NON-NLS-1$
-
-	/**
-	 * css style attribute
-	 */
-	public static final String ATTR_BORDER_TOP_WIDTH = "border-top-width"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_FAMILY = "font-family"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_SIZE = "font-size"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_STYLE = "font-style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_WEIGHT = "font-weight"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_LEFT_STYLE = "border-left-style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_RIGHT_STYLE = "border-right-style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_BOTTOM_STYLE = "border-bottom-style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_TOP_STYLE = "border-top-style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_LEFT_COLOR = "border-left-color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_RIGHT_COLOR = "border-right-color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_BOTTOM_COLOR = "border-bottom-color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_TOP_COLOR = "border-top-color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_RIGHT = "padding-right"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_BOTTOM = "padding-bottom"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_LEFT = "padding-left"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_TOP = "padding-top"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_RIGHT = "margin-right"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_BOTTOM = "margin-bottom"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_LEFT = "margin-left"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_TOP = "margin-top"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BACKGROUND_COLOR = "background-color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BACKGROUND_IMAGE = "background-image"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLOR = "color"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TEXTCOLOR = "text"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_COLLAPSE = "border-collapse"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_SPACING = "border-spacing"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LIST_STYLE_TYPE = "list-style-type"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LIST_STYLE_POSITION = "list-style-position"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LIST_STYLE_IMAGE = "list-style-image"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COUNTER_RESET = "counter-reset"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COUNTER_INCREMENT = "counter-increment"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_EMPTY_CELLS = "empty-cells"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_VISIBILITY = "visibility"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_VERTICAL_ALIGN = "vertical-align"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_HORIZONTAL_ALIGN = "horizontal-align"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_CONTENT = "content"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BGCOLOR = "bgcolor"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TEXT = "text"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_MULTIPLE = "multiple"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_ITEMLABEL = "itemLabel"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_BINDING = "binding"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_ITEMVALUE = "itemValue"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_VALUE = "value"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_URI = "uri"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PREFIX = "prefix"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_STYLECLASS = "styleClass"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_SIZE = "size"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BASEFONT = "basefont"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_ROWSPAN = "rowSpan"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLSPAN = "colSpan"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TYPE = "type"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_URL = "url"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_SRC = "src"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TAGLIB_LOCATION = "taglib-location"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TAGLIB_URI = "taglib-uri"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_IMAGE = "image"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_RESET = "reset"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FOOTER = "footer"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_HEADER = "header"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLUMNS = "columns"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLUMNCLASSES = "columnClasses"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_CLASS = "class"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_STYLE = "style"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PAGE = "page"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_HREF = "href"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_NAME = "name"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BASENAME = "basename"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_ACTION = "action"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TARGET = "target"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TOP = "top"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BOTTOM = "bottom"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LEFT = "left"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_RIGHT = "right"; //$NON-NLS-1$
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_POSITION = "position"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TRANSPARENT = "transparent"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_COLLAPSE = "collapse"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SEPARATE = "separate"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String ATTR_OVERFLOW = "overflow"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	// border style values
-	public static final String VAL_HIDDEN = "hidden"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_DOTTED = "dotted"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_DASHED = "dashed"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SOLID = "solid"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_DOUBLE = "double"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_GROOVE = "groove"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RIDGE = "ridge"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INSET = "inset"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OUTSET = "outset"; //$NON-NLS-1$
-
-	// XXX: we introduce a new style for TD default border style, since it
-	// seemed IE
-	// is using none of the above style for td.
-    /**
-     * css style value
-     */
-	public static final String VAL_TDBORDERSTYLE = "__td_border_style__"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_THIN = "thin"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_THICK = "thick"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INLINE = "inline"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BLOCK = "block"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INLINE_BLOCK = "inline-block"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LIST_ITEM = "list-item"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RUN_IN = "run-in"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_COMPACT = "compact"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_MARKER = "marker"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE = "table"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INLINE_TABLE = "inline-table"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_ROW_GROUP = "table-row-group"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_HEADER_GROUP = "table-header-group"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_FOOTER_GROUP = "table-footer-group"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_ROW = "table-row"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_COLUMN_GROUP = "table-column-group"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_COLUMN = "table-column"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_CELL = "table-cell"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_CAPTION = "table-caption"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_NONE = "none"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_XX_SMALL = "xx-small"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_X_SMALL = "x-small"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SMALL = "small"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_MEDIUM = "medium"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LARGE = "large"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_X_LARGE = "x-large"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_XX_LARGE = "xx-large"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LARGER = "larger"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SMALLER = "smaller"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_ITALIC = "italic"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OBLIQUE = "oblique"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_NORMAL = "normal"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BOLD = "bold"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BOLDER = "bolder"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LIGHTER = "lighter"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_AUTO = "auto"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OUTSIDE = "outside"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INSIDE = "inside"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LEFT = "left"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RIGHT = "right"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_CENTER = "center"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_JUSTIFY = "justify"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_UNDERLINE = "underline"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OVERLINE = "overline"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LINETHROUGH = "line-through"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BLINK = "blink"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_PRE = "pre"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_NOWRAP = "nowrap"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_DISC = "disc"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_CIRCLE = "circle"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_DECIMAL = "decimal"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_CJK_IDEOGRAPHIC = "cjk-ideographic"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_DECIMAL_LEADING_ZERO = "decimal-leading-zero"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_ARMENIAN = "armenian"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_ALPHA = "lower-alpha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_GREEK = "lower-greek"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_LATIN = "lower-latin"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_ROMAN = "lower-roman"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_UPPER_ALPHA = "upper-alpha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_UPPER_LATIN = "upper-latin"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_UPPER_ROMAN = "upper-roman"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_HIRAGANA = "hiragana"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_HIRAGANA_IROHA = "hiragana-iroha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_HEBREW = "hebrew"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_GEORGIAN = "georgian"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_KATAKANA = "katakana"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_KATAKANA_IROHA = "katakana-iroha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_SQUARE = "square"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_IMAGE = "image"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_MULTIPLE = "multiple"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BUTTON = "button"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_CHECKBOX = "checkbox"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RADIO = "radio"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_FILE = "file"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RESET = "reset"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SUBMIT = "submit"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_PASSWORD = "password"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TEXT = "text"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_VISIBLE = "visible"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SCROLL = "scroll"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String TAG_TAGLIB = "taglib"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java
deleted file mode 100644
index 1ce1d12..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public interface ICSSPropertyMeta {
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_NONE = 0;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_BOXSIZE = 1;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_HEIGHT_CONTAININGBLOCK = 2;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_FONT = 3;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_WIDTH_CONTAININGBLOCK = 4;
-
-	/**
-	 * 
-	 */
-	static final Object NOT_SPECIFIED = "NOT_SPECIFIED"; //$NON-NLS-1$
-
-	/**
-	 * whether default inherit.
-	 * 
-	 * @return true if is inherited
-	 */
-	public boolean isInherited();
-
-	/**
-	 * @param propertyName 
-	 * @param style 
-	 * 
-	 * @return the initial value object
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style);
-
-	/**
-	 * @param element
-	 * @param htmltag
-	 * @param propertyName
-	 * @return the initial value object
-	 */
-	public Object getHTMLElementInitialValue(Element element, String htmltag,
-			String propertyName);
-
-	/**
-	 * what's percentage value based on.
-	 * 
-	 * @return the percentage value
-	 */
-	public int getPercentageType();
-
-	/**
-	 * for many CSS property, there is corresponding HTML attribute can also
-	 * specify value for them. This method should check whether the element has
-	 * corresponding HTML attribute provide value.
-	 * 
-	 * @param element
-	 *            the element
-	 * @param htmltag
-	 *            the html tag name. This is for in case element is jsp/jsf
-	 *            element, and have non html tag name.
-	 * @param propertyName
-	 *            the property name.
-	 * @param style
-	 *            the style
-	 * @return null if no attribute override.
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style);
-
-	/**
-	 * @param value
-	 * @param propertyName
-	 * @param style
-	 * @return the value result
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/LengthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/LengthMeta.java
deleted file mode 100644
index ec9f9e5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/LengthMeta.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.swt.widgets.Display;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.css.CSSPrimitiveValue;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class LengthMeta extends CSSPropertyMeta {
-	private static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_AUTO };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public LengthMeta(boolean inherit, Object initvalue) {
-		super(inherit, initvalue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		if (value == null || value.getCssValueType() == CSSValue.CSS_VALUE_LIST
-				|| value.getCssValueType() == CSSValue.CSS_CUSTOM) {
-			return ICSSPropertyID.VAL_AUTO;
-		}
-		if (value.getCssValueType() == CSSValue.CSS_INHERIT) {
-			return ICSSPropertyID.VAL_AUTO;
-		}
-		CSSPrimitiveValue primitive = (CSSPrimitiveValue) value;
-		String key = checkKeywordValues(primitive.getCssText());
-		if (key != null) {
-			return key;
-		}
-		short unitType = primitive.getPrimitiveType();
-		float fvalue;
-		try {
-			fvalue = primitive.getFloatValue(unitType);
-		} catch (DOMException ex) {
-// Hide this info.   Consider adding DEBUG option			
-//			_log.info("Get length failed, use auto value instead ("
-//					+ value.getCssText() + ")");
-			return ICSSPropertyID.VAL_AUTO;
-		}
-		return toLength(fvalue, unitType, style, this.getPercentageType(),
-				getBaseFont(style));
-	}
-
-	/**
-	 * @param lengthStr
-	 * @param style
-	 * @param percenttype
-	 * @param font
-	 * @return the object
-	 */
-	public static Object toLength(String lengthStr, ICSSStyle style,
-			int percenttype, ICSSFont font) {
-		try {
-			FloatInfo floatinfo = new FloatInfo(lengthStr);
-			return toLength(floatinfo.getValue(), floatinfo.getValueType(),
-					style, percenttype, font);
-		} catch (Exception e) {
-			return ICSSPropertyID.VAL_AUTO;
-		}
-	}
-
-	/**
-	 * Will not calculate percentage value. Used for calculate the "width" and
-	 * "height" css property
-	 * @param result 
-	 * @param unitType 
-	 * @param style 
-	 * @param percenttype 
-	 * @param font
-	 * @return an object?
-	 */
-	public static Object toLength(float result, short unitType,
-			ICSSStyle style, int percenttype, ICSSFont font) {
-		switch (unitType) {
-		case CSSPrimitiveValue.CSS_PERCENTAGE:
-			if (percenttype == PERCENTAGE_FONT) {
-				result = (int) ((result * font.getFontSize()) / 100.0);
-				break;
-			}
-			return new Length((int) result, true);
-		case CSSPrimitiveValue.CSS_PX: // no more calculation needed
-		case CSSPrimitiveValue.CSS_NUMBER:
-			break;
-		case CSSPrimitiveValue.CSS_EMS:
-			result *= font.getFontSize();
-			break;
-		case CSSPrimitiveValue.CSS_EXS:
-			result *= font.getXHeight();
-			break;
-		case CSSPrimitiveValue.CSS_CM:
-			result = cmToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_IN:
-			result = inToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_MM:
-			result = mmToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_PT:
-			result = ptToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_PC:
-			result = pcToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_STRING:
-			return ICSSPropertyID.VAL_AUTO;
-			// FIXME:every thing is delt with?
-		}
-		// ok, when reach here, means we get the float value "result"
-		return new Length((int) result, false);
-	}
-
-	/**
-	 * child class can override this method. e.g: font-size style's base font is
-	 * parent style's font.
-	 * 
-	 * @param style
-	 * @return the base font
-	 */
-	protected ICSSFont getBaseFont(ICSSStyle style) {
-		return style.getCSSFont();
-	}
-
-	private static float pcToPixel(float value) {
-		return ptToPixel(12 * value);
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float ptToPixel(float floatValue) {
-		// the points used by CSS 2.1 are equal to 1/72th of an inch.
-		return inToPixel(floatValue / 72);
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float mmToPixel(float floatValue) {
-		return cmToPixel(floatValue / 10);
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float inToPixel(float floatValue) {
-		return getDPI() * floatValue;
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float cmToPixel(float floatValue) {
-		// 1 inch is equal to 2.54 centimeters
-		return inToPixel((float) (floatValue / 2.54));
-	}
-
-	/**
-	 * @return
-	 */
-	private static float getDPI() {
-		// XXX: cache the value?
-		return Display.getCurrent().getDPI().x;
-	}
-
-	/**
-	 * @param result
-	 * @return true if is auto
-	 */
-	public static boolean isAuto(Object result) {
-		if (result == ICSSPropertyID.VAL_AUTO) {
-			return true;
-		}
-		if (result instanceof Length && ((Length) result).getValue() <= 0) {
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleImageMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleImageMeta.java
deleted file mode 100644
index c275340..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleImageMeta.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class ListStyleImageMeta extends CSSPropertyMeta {
-	private static final String INITIAL_VALUE = ICSSPropertyID.VAL_NONE;
-
-	/**
-	 * Default constructor
-	 */
-	public ListStyleImageMeta() {
-		super(true, INITIAL_VALUE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		return DOMUtil.getAttributeIgnoreCase(element,
-				ICSSPropertyID.ATTR_LIST_STYLE_IMAGE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStylePositionMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStylePositionMeta.java
deleted file mode 100644
index 355a173..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStylePositionMeta.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class ListStylePositionMeta extends CSSPropertyMeta {
-	private static final String INITIAL_VALUE = ICSSPropertyID.VAL_OUTSIDE;
-
-	/**
-	 * Default constructor
-	 */
-	public ListStylePositionMeta() {
-		super(true, INITIAL_VALUE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleTypeMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleTypeMeta.java
deleted file mode 100644
index 641bd39..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleTypeMeta.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class ListStyleTypeMeta extends CSSPropertyMeta {
-	private static final String INITIAL_VALUE = ICSSPropertyID.VAL_DISC;
-
-	/**
-	 * Default constructor
-	 */
-	public ListStyleTypeMeta() {
-		super(true, INITIAL_VALUE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		return value.getCssText();
-	}
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	// java.lang.String, java.lang.String,
-	// org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	// */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		String listStyle = DOMUtil.getAttributeIgnoreCase(element, "type"); //$NON-NLS-1$
-		if (listStyle == null && element != null
-				&& element.getParentNode() != null) {
-			listStyle = DOMUtil.getAttributeIgnoreCase((Element) element
-					.getParentNode(), "type"); //$NON-NLS-1$
-		}
-		if (listStyle != null) {
-			listStyle = listStyle.trim();
-			if (listStyle.equals("1")) { //$NON-NLS-1$
-				return ICSSPropertyID.VAL_DECIMAL;
-			} else if (listStyle.equals("a")) { //$NON-NLS-1$
-				return ICSSPropertyID.VAL_LOWER_ALPHA;
-			} else if (listStyle.equals("A")) { //$NON-NLS-1$
-				return ICSSPropertyID.VAL_UPPER_ALPHA;
-			} else if (listStyle.equals("i")) { //$NON-NLS-1$
-				return ICSSPropertyID.VAL_LOWER_ROMAN;
-			} else if (listStyle.equals("I")) { //$NON-NLS-1$
-				return ICSSPropertyID.VAL_UPPER_ROMAN;
-			}
-			return listStyle;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java
deleted file mode 100644
index fddf276..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class MarginWidthMeta extends LengthMeta {
-
-	/**
-	 * Default constructor
-	 */
-	public MarginWidthMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/**
-	 * @param propertyName
-	 * @return true if the property is the margin width
-	 */
-	public static boolean isMarginWidth(String propertyName) {
-		return ICSSPropertyID.ATTR_MARGIN_BOTTOM.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_TOP
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_LEFT
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_RIGHT
-						.equalsIgnoreCase(propertyName);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/Messages.java
deleted file mode 100644
index 50dcc39..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * String resource handler
- *
- */
-public class Messages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.css2.property.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	/**
-	 * @param key
-	 * @return nls'ed string
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java
deleted file mode 100644
index 95712c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-public class OverflowMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_VISIBLE,
-			ICSSPropertyID.VAL_HIDDEN, ICSSPropertyID.VAL_SCROLL,
-			ICSSPropertyID.VAL_AUTO };
-
-	/**
-	 * Default constructor
-	 */
-	public OverflowMeta() {
-		super(false, ICSSPropertyID.VAL_VISIBLE);
-	}
-
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String display = style.getDisplay();
-		// we only support overflow for "block". Which means we don't support it
-		// for table/inline-block, etc.
-		if (!"block".equalsIgnoreCase(display)) { //$NON-NLS-1$
-			return ICSSPropertyID.VAL_VISIBLE;
-		}
-		return super.calculateCSSValueResult(value, propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.java
deleted file mode 100644
index aec17e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class PaddingWidthMeta extends LengthMeta {
-    
-	private final PDPreferences _prefs;
-
-    /**
-	 * Default constructor
-     * @param prefs 
-	 */
-	public PaddingWidthMeta(final PDPreferences prefs) 
-	{
-		super(false, ICSSPropertyID.VAL_AUTO);
-		_prefs = prefs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			Node parent = element;
-			Element tableEle = null;
-			while ((parent = parent.getParentNode()) != null
-					&& parent instanceof Element) {
-				if (((Element) parent).getTagName().equalsIgnoreCase(
-						IHTMLConstants.TAG_TABLE)) {
-					tableEle = (Element) parent;
-					break;
-				}
-			}
-			if (tableEle != null) 
-			{
-			    int artificialCellPadding = _prefs.getCssArtificialCellPadding(); 
-				//TODO:  Why is only cellpadding being checked?  Why does this class even exist?  What is difference with BorderWidthMeta?   
-				String padding = DOMUtil.getAttributeIgnoreCase(tableEle,
-						"cellpadding");//$NON-NLS-1$
-				if (padding != null && padding.trim().length() > 0) {//fix for 200592						
-					Object length = LengthMeta.toLength(padding, style, this
-								.getPercentageType(), getBaseFont(style));
-                    if (length instanceof Length && ((Length)length).getValue() >= artificialCellPadding)                    
-                        return length;
-                    
-				}
-                return new Length(artificialCellPadding, false);
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java
deleted file mode 100644
index 4f19af9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositionMeta extends CSSPropertyMeta {
-	/**
-	 * static keyword
-	 */
-	public static final String STATIC = "static"; //$NON-NLS-1$
-
-	/**
-	 * absolute keyword
-	 */
-	public static final String ABSOLUTE = "absolute"; //$NON-NLS-1$
-
-	private static final String RELATIVE = "relative"; //$NON-NLS-1$
-
-	/**
-	 * fixed keyword
-	 */
-	public static final String FIXED = "fixed"; //$NON-NLS-1$
-
-	private static final String[] _keywords = new String[] { STATIC, ABSOLUTE,
-			RELATIVE, FIXED };
-
-	/**
-	 * Default constructor
-	 */
-	public PositionMeta() {
-		super(false, STATIC);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionOffsetMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionOffsetMeta.java
deleted file mode 100644
index 81147cc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionOffsetMeta.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositionOffsetMeta extends LengthMeta {
-	/**
-	 * Default constructor
-	 */
-	public PositionOffsetMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TableUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TableUtil.java
deleted file mode 100644
index a5705fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TableUtil.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableUtil {
-	static final String TOP = "top"; //$NON-NLS-1$
-
-	static final String BOTTOM = "bottom"; //$NON-NLS-1$
-
-	static final String LEFT = "left"; //$NON-NLS-1$
-
-	static final String RIGHT = "right"; //$NON-NLS-1$
-
-	/**
-	 * @param edge
-	 * @param frame
-	 * @return true if there is a match
-	 */
-	public static boolean matchFrame(String edge, String frame) {
-		if ("above".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return TOP.equalsIgnoreCase(edge);
-		} else if ("below".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return BOTTOM.equalsIgnoreCase(edge);
-		} else if ("hsides".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return TOP.equalsIgnoreCase(edge) || BOTTOM.equalsIgnoreCase(edge);
-		} else if ("vsides".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return LEFT.equalsIgnoreCase(edge) || RIGHT.equalsIgnoreCase(edge);
-		} else if ("lhs".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return LEFT.equalsIgnoreCase(edge);
-		} else if ("rhs".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return RIGHT.equalsIgnoreCase(edge);
-		} else if ("box".equalsIgnoreCase(frame) //$NON-NLS-1$
-				|| "border".equalsIgnoreCase(frame)) { //$NON-NLS-1$
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	/**
-	 * @param edge 
-	 * @param rules
-	 * @return true if rules match
-	 */
-	public static boolean matchRules(String edge, String rules) {
-		// TODO: "groups" not supported.
-
-		if ("rows".equalsIgnoreCase(rules)) { //$NON-NLS-1$
-			return TOP.equalsIgnoreCase(edge) || BOTTOM.equalsIgnoreCase(edge);
-		} else if ("cols".equalsIgnoreCase(rules)) { //$NON-NLS-1$
-			return LEFT.equalsIgnoreCase(edge) || RIGHT.equalsIgnoreCase(edge);
-		} else if ("all".equalsIgnoreCase(rules)) { //$NON-NLS-1$
-			return true;
-		} else {
-			return false;
-		}
-
-	}
-
-	/**
-	 * @param element
-	 * @return true if cell is empty
-	 * see http://www.w3.org/TR/CSS21/tables.html#empty-cells
-	 */
-	public static boolean isEmptyCell(Element element) {
-		NodeList children = element.getChildNodes();
-		if (children.getLength() == 0) {
-			return true;
-		}
-		// we only do simple checking here. When the element has one child
-		// and is text and is whitespace only, then we also treat as empty cell
-		if (children.getLength() == 1) {
-			Node child = children.item(0);
-			if (child instanceof Text) {
-				String text = child.getNodeValue();
-				if (HTMLUtil.isHTMLWhitespaceString(text)) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextAlignMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextAlignMeta.java
deleted file mode 100644
index 5c3e8d5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextAlignMeta.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class TextAlignMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_LEFT,
-			ICSSPropertyID.VAL_RIGHT, ICSSPropertyID.VAL_CENTER,
-			ICSSPropertyID.VAL_JUSTIFY };
-
-	private static final String[] HOR_SLIGN_HTMLTAGS = new String[] {
-			IHTMLConstants.TAG_TABLE, IHTMLConstants.TAG_HR,
-			IHTMLConstants.TAG_LEGEND, IHTMLConstants.TAG_APPLET,
-			IHTMLConstants.TAG_IFRAME, IHTMLConstants.TAG_IMG,
-			IHTMLConstants.TAG_INPUT, IHTMLConstants.TAG_OBJECT,
-			IHTMLConstants.TAG_CAPTION };
-
-	/**
-	 * Default constructor
-	 */
-	public TextAlignMeta() {
-		super(true, NOT_SPECIFIED);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		// /for td, it may look for the attribute value up to tr, but must stop
-		// at table.
-		// so for table,set _inherited=false to stop it.
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			this._inherited = false;
-		} else {
-			this._inherited = true;
-		}
-		if (Arrays.asList(HOR_SLIGN_HTMLTAGS).contains(htmltag.toLowerCase())) {
-			return null;
-		}
-
-		String align = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_ALIGN);
-		String value = checkKeywordValues(align);
-		if (value != null) {
-			return value;
-		}
-		if ("middle".equalsIgnoreCase(align)) { //$NON-NLS-1$
-			return ICSSPropertyID.VAL_CENTER;
-		}
-
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java
deleted file mode 100644
index 7813463..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-import org.w3c.dom.css.CSSValueList;
-
-/**
- * @author mengbo
- */
-public class TextDecorationMeta extends CSSPropertyMeta {
-	private static final int NONE = 0;
-
-	/**
-	 * 
-	 */
-	public static final int UNDERLINE = 1;
-
-	/**
-	 * 
-	 */
-	public static final int OVERLINE = 1 << 1;
-
-	/**
-	 * 
-	 */
-	public static final int LINETHROUGH = 1 << 2;
-
-	private static final int BLINK = 1 << 3;
-
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NONE,
-			ICSSPropertyID.VAL_UNDERLINE, ICSSPropertyID.VAL_OVERLINE,
-			ICSSPropertyID.VAL_LINETHROUGH, ICSSPropertyID.VAL_BLINK };
-
-	/**
-	 * Default constructor
-	 */
-	public TextDecorationMeta() {
-		// the spec say text-decoration is not inherited. but the description
-		// seemed to make use inherit easier.
-		// It seems that the property is inherited in IE and Mozilla.
-		super(true, new Integer(NONE));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String[] decorations = null;
-		if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
-			CSSValueList valueList = (CSSValueList) value;
-			decorations = new String[valueList.getLength()];
-			for (int i = 0; i < decorations.length; i++) {
-				decorations[i] = valueList.item(i).getCssText();
-			}
-		} else {
-			decorations = new String[1];
-			decorations[0] = value.getCssText();
-		}
-
-		int intvalue = 0;
-		for (int i = 0; i < decorations.length; i++) {
-			String key = super.checkKeywordValues(decorations[i]);
-			if (key == ICSSPropertyID.VAL_NONE) {
-				intvalue = NONE;
-			} else if (key == ICSSPropertyID.VAL_UNDERLINE) {
-				intvalue |= UNDERLINE;
-			} else if (key == ICSSPropertyID.VAL_OVERLINE) {
-				intvalue |= OVERLINE;
-			} else if (key == ICSSPropertyID.VAL_LINETHROUGH) {
-				intvalue |= LINETHROUGH;
-			} else if (key == ICSSPropertyID.VAL_BLINK) {
-				intvalue |= BLINK;
-			}
-		}
-
-		return new Integer(intvalue);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VerticalAlignMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VerticalAlignMeta.java
deleted file mode 100644
index d4bb569..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VerticalAlignMeta.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class VerticalAlignMeta extends LengthMeta {
-	/**
-	 * baseline keyword
-	 */
-	public static final String BASELINE = "baseline"; //$NON-NLS-1$
-
-	/**
-	 * middle keyword
-	 */
-	public static final String MIDDLE = "middle"; //$NON-NLS-1$
-
-	/**
-	 * sub keyword
-	 */
-	public static final String SUB = "sub"; //$NON-NLS-1$
-
-	/**
-	 * super keyword
-	 */
-	public static final String SUPER = "super"; //$NON-NLS-1$
-
-	/**
-	 * text-top keyword
-	 */
-	public static final String TEXT_TOP = "text-top"; //$NON-NLS-1$
-
-	/**
-	 * text-bottom keyword
-	 */
-	public static final String TEXT_BOTTOM = "text-bottom"; //$NON-NLS-1$
-
-	/**
-	 * top keyword
-	 */
-	public static final String TOP = "top"; //$NON-NLS-1$
-
-	/**
-	 * bottom keyword
-	 */
-	public static final String BOTTOM = "bottom"; //$NON-NLS-1$
-
-	/**
-	 * center keyword
-	 */
-	public static final String CENTER = "center"; //$NON-NLS-1$
-
-	/**
-	 * default vertical align
-	 */
-	public static final String DEFAULT_VERTICAL_ALIGN = BASELINE;
-
-	private static final String[] KEYWORDS = new String[] { BASELINE, MIDDLE,
-			SUB, SUPER, TEXT_TOP, TEXT_BOTTOM, TOP, BOTTOM };
-
-	private static final String[] htmlAttributes = new String[] { IHTMLConstants.ATTR_VALIGN };
-
-	/**
-	 * Default constructor
-	 */
-	public VerticalAlignMeta() {
-		super(true, DEFAULT_VERTICAL_ALIGN);
-	}
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public VerticalAlignMeta(boolean inherit, Object initvalue) {
-		super(inherit, initvalue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		for (int i = 0; i < htmlAttributes.length; i++) {
-			String align = DOMUtil.getAttributeIgnoreCase(element,
-					htmlAttributes[i]);
-			if (TOP.equalsIgnoreCase(align)) {
-				return TOP;
-			}
-			if (MIDDLE.equalsIgnoreCase(align)) {
-				return MIDDLE;
-			}
-			if (BOTTOM.equalsIgnoreCase(align)) {
-				return BOTTOM;
-			}
-			if (BASELINE.equalsIgnoreCase(align)) {
-				return BASELINE;
-			}
-			if (CENTER.equalsIgnoreCase(align)) {
-				return MIDDLE;
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VisibilityMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VisibilityMeta.java
deleted file mode 100644
index e6f3ae5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VisibilityMeta.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class VisibilityMeta extends CSSPropertyMeta {
-	/**
-	 * visible keyword
-	 */
-	public static final String VISIBLE = "visible"; //$NON-NLS-1$
-
-	/**
-	 * hidden keyword
-	 */
-	public static final String HIDDEN = "hidden"; //$NON-NLS-1$
-
-	/**
-	 * collapse keyword
-	 */
-	public static final String COLLAPSE = "collapse"; //$NON-NLS-1$
-
-	private static final String[] KEYWORDS = new String[] { VISIBLE, HIDDEN,
-			COLLAPSE };
-
-	/**
-	 * Default constructor
-	 */
-	public VisibilityMeta() {
-		super(true, VISIBLE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WhiteSpaceMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WhiteSpaceMeta.java
deleted file mode 100644
index c94481f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WhiteSpaceMeta.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class WhiteSpaceMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_PRE, ICSSPropertyID.VAL_NOWRAP };
-
-	/**
-	 * Default constructor
-	 */
-	public WhiteSpaceMeta() {
-		super(true, ICSSPropertyID.VAL_NORMAL);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			String noWrap = DOMUtil.getAttributeIgnoreCase(element,
-					IHTMLConstants.ATTR_NOWRAP);
-			if (Boolean.TRUE.toString().equalsIgnoreCase(noWrap)) {
-				return ICSSPropertyID.VAL_NOWRAP;
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WidthMeta.java
deleted file mode 100644
index f38e765..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WidthMeta.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class WidthMeta extends LengthMeta {
-	/**
-	 * Default constructor
-	 */
-	public WidthMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (!IHTMLConstants.TAG_INPUT.equalsIgnoreCase(htmltag)
-				&& !IHTMLConstants.TAG_BUTTON.equalsIgnoreCase(htmltag)) {
-			String width = DOMUtil
-					.getAttributeIgnoreCase(element, propertyName);
-			if (width != null) {
-				return LengthMeta.toLength(width, style, this
-						.getPercentageType(), getBaseFont(style));
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/DimensionInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/DimensionInfo.java
deleted file mode 100644
index 4531ace..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/DimensionInfo.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.provider;
-
-import org.eclipse.draw2d.geometry.Dimension;
-
-/**
- * This is a struct, include a dimension and a ascent info.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DimensionInfo {
-	private final Dimension _dimension;
-
-	private final int _ascent;
-
-	/**
-	 * 
-	 * @param d
-	 * @param ascent
-	 *            -1 means ascent is same as dimension height
-	 */
-	public DimensionInfo(Dimension d, int ascent) {
-		this._dimension = d;
-		this._ascent = ascent;
-	}
-
-	/**
-	 * @param width
-	 * @param height
-	 * @param i
-	 */
-	public DimensionInfo(int width, int height, int i) {
-		this(new Dimension(width, height), i);
-	}
-
-	/**
-	 * @return the dimension
-	 */
-	public Dimension getDimension() {
-		return _dimension;
-	}
-
-	/**
-	 * @return the ascent
-	 */
-	public int getAscent() {
-		return _ascent;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSTextProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSTextProvider.java
deleted file mode 100644
index c646cc9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSTextProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.provider;
-
-/**
- * This class behave as the information provider of CSSTextFigure.
- * 
- * @author mengbo
- */
-public interface ICSSTextProvider {
-	/**
-	 * get the style.
-	 * 
-	 * @return can't be null
-	 */
-	// public ICSSStyle getCSSStyle();
-	/**
-	 * this is the final data to be displayed. There is no need for the
-	 * CSSTextFigure to normalize it.
-	 * 
-	 * @return the text data
-	 */
-	public String getTextData();
-
-	/**
-	 * get the selected information.
-	 * 
-	 * @return the selected range
-	 */
-	public int[] getSelectedRange();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSWidgetProvider.java
deleted file mode 100644
index 81e7b9c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSWidgetProvider.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.provider;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- */
-public interface ICSSWidgetProvider {
-	/**
-	 * can be null
-	 * 
-	 * @return the style
-	 */
-	public ICSSStyle getCSSStyle();
-
-	/**
-	 * @return true if is handling border
-	 */
-	public boolean isHandlingBorder();
-
-	/**
-	 * whether the parameter and return value includes border depends on the
-	 * isHandlingBorder
-	 * 
-	 * @param width
-	 *            -1 means no suggested value
-	 * @param height
-	 *            -1 means no suggested value
-	 * @return the dimension info
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height);
-
-	/**
-	 * if isHandlingBorder return false, then "rect" will be the rect without
-	 * border, and this method should not paint border.
-	 * 
-	 * If isHandlingBorder returns true, then "rect" include border, and this
-	 * method should also paint its own border.
-	 * @param g 
-	 * @param rect
-	 */
-	public void paintFigure(Graphics g, Rectangle rect);
-
-	/**
-	 * @return true if is inline
-	 */
-	public boolean isInline();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/AbstractStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/AbstractStyle.java
deleted file mode 100644
index b642b4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/AbstractStyle.java
+++ /dev/null
@@ -1,716 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.CounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.property.CSSMetaRegistry;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.css.CSSStyleDeclaration;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class AbstractStyle implements ICSSStyle 
-{
-	private final Element _element;
-
-	private Map _cachedValues = new HashMap();
-
-	private ICSSFont _font = null;
-
-	private CSSStyleDeclaration _cache;
-
-	private CSSStyleDeclaration _defaultCache;
-
-	private boolean _cssDeclareWasSearched = false;
-
-	private boolean _cssDefaultDeclareWasSearched = false;
-
-	private Insets _borderInsets, _marginInsets, _paddingInsets;
-
-	private ICSSStyle _parentStyle;
-
-	private HashMap _counters = null;
-
-    private final PDPreferences _prefs;
-
-	/**
-	 * @return the element this style if for
-	 */
-	public Element getElement() {
-		return _element;
-	}
-
-	/**
-	 * @param element
-	 * @param prefs 
-	 */
-	public AbstractStyle(Element element, PDPreferences prefs) {
-		_element = element;
-		_prefs = prefs;
-	}
-
-	/**
-	 * reset all the cache.
-	 */
-	public void reset() {
-		_cachedValues.clear();
-		_font = null;
-		_cache = null;
-		_defaultCache = null;
-		_cssDeclareWasSearched = false;
-		_cssDefaultDeclareWasSearched = false;
-		// if (_counters != null)
-		// {
-		// unregistCounter();
-		// _counters.clear();
-		// _counters = null;
-		// }
-		_borderInsets = _marginInsets = _paddingInsets = null;
-	}
-
-	/**
-	 * this is a hook method so caller can use it to override default
-	 * calculation. Note, after the call to <code>reset</code>, it will be
-	 * lost.
-	 * 
-	 * @param property
-	 * @param value
-	 */
-	public void setStyleProperty(String property, Object value) {
-		_cachedValues.put(property, value);
-	}
-
-	/**
-	 * get a style property value.
-	 * 
-	 * @param property
-	 * @return the style property
-	 */
-	public Object getStyleProperty(String property) {
-		Object value = _cachedValues.get(property);
-		if (value == null) {
-			value = calculateProperty(property);
-			if (value != null) {
-				_cachedValues.put(property, value);
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * in this method, should first check the "style" attribute, then combine
-	 * that with document style.
-	 * 
-	 * @return the style
-	 */
-	protected CSSStyleDeclaration calculateDeclaration() {
-		String name = getHtmlElement().getAttribute("id"); //$NON-NLS-1$
-		if (name == null || name.length() == 0) {
-			name = getHtmlElement().getAttribute("name"); //$NON-NLS-1$
-		}
-		return CSSUtil.getCSSDeclaration(this.getHtmlElement(), name);
-	}
-
-	/**
-	 * @return the style
-	 */
-	protected CSSStyleDeclaration calculateDefaultDeclaration() {
-		return CSSUtil.getDefaultCSSDeclaration(this.getHtmlElement(), null);
-	}
-
-	/**
-	 * @return the style declaration
-	 */
-	public CSSStyleDeclaration getDeclaration() {
-		// FIXME:may need to be change, boolean variable is not a best way.
-		if (!_cssDeclareWasSearched) {
-			_cache = calculateDeclaration();
-			_cssDeclareWasSearched = true;
-		}
-		return _cache;
-	}
-
-	/**
-	 * @return the default declaration
-	 */
-	public CSSStyleDeclaration getDefaultDeclaration() {
-		// FIXME:may need to be change, boolean variable is not a best way.
-		if (!_cssDefaultDeclareWasSearched) {
-			_defaultCache = calculateDefaultDeclaration();
-			_cssDefaultDeclareWasSearched = true;
-		}
-		return _defaultCache;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getHTMLelementInitValue(java.lang.String)
-	 */
-	public Object getHTMLelementInitValue(String propertyName) {
-		ICSSPropertyMeta meta = getPropertyMeta(propertyName);
-		if (meta != null) {
-			Object obj = meta.getHTMLElementInitialValue(_element,
-					getHTMLTag(), propertyName);
-			if (obj == null) {
-				obj = meta.getInitialValue(propertyName, this);
-			}
-			return obj;
-		}
-		return ICSSPropertyMeta.NOT_SPECIFIED;
-	}
-
-	/**
-	 * @param propertyName
-	 * @return the property
-	 */
-	protected Object calculateProperty(String propertyName) {
-		ICSSPropertyMeta meta = getPropertyMeta(propertyName);
-		Object result = null;
-		// get declaration
-		CSSStyleDeclaration decl = getDeclaration();
-		CSSValue value = decl == null ? null : decl
-				.getPropertyCSSValue(propertyName);
-		if (value == null) {
-			if (meta != null) {
-				result = meta.calculateHTMLAttributeOverride(_element,
-						getHTMLTag(), propertyName, this);
-				if (result != null) {
-					return result;
-				}
-			}
-			decl = getDefaultDeclaration();
-		}
-		value = decl == null ? null : decl.getPropertyCSSValue(propertyName);
-
-		if (value != null && value.getCssValueType() == CSSValue.CSS_INHERIT) {
-			result = getParentResultValue(meta, propertyName);
-		} else if (value == null) {
-			if (meta != null) {
-				result = meta.calculateHTMLAttributeOverride(_element,
-						getHTMLTag(), propertyName, this);
-			}
-			if (result == null) {
-				result = calculateLocalOverride(meta, propertyName);
-			}
-			if (result == null) {
-				if (meta == null) {
-					result = ICSSPropertyMeta.NOT_SPECIFIED;
-				} else {
-					if (meta.isInherited()) {
-						result = getParentResultValue(meta, propertyName);
-					} else {
-						result = meta.getInitialValue(propertyName, this);
-					}
-				}
-			}
-		} else {
-			result = calculateCSSValueResult(meta, value, propertyName);
-		}
-		return result;
-	}
-
-	/**
-	 * get the corresponding HTML tag for this style. This is for certain HTML
-	 * tag can also provide style information.
-	 * 
-	 * @return the html tag
-	 */
-	protected String getHTMLTag() {
-		return _element.getTagName();
-	}
-
-	/**
-	 * @param propertyName
-	 * @return the property meta for property name
-	 */
-	protected ICSSPropertyMeta getPropertyMeta(String propertyName) {
-		return CSSMetaRegistry.getInstance().getMeta(propertyName);
-	}
-
-	/**
-	 * convert the CSSValue to the property type specified data result.
-	 * 
-	 * @param meta 
-	 * @param value
-	 * @param propertyName
-	 * @return should not return null.
-	 */
-	protected Object calculateCSSValueResult(ICSSPropertyMeta meta,
-			CSSValue value, String propertyName) {
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.calculateCSSValueResult(value, propertyName, this);
-	}
-
-	/**
-	 * it is possible that some attribute of the element may provide style
-	 * information. child class should override this method. Also, some element
-	 * type may have internally build style, such as input-submit may use
-	 * special border. NOTE: it is very important that in calculateLocalOverride
-	 * you don't directly or indirectly call getStyleProperty() to avoid
-	 * deadloop.
-	 * 
-	 * @param meta 
-	 * @param propertyName
-	 * @return null means no style information in other attributes. Otherwise
-	 *         return property specific data result -- normally will use meta to
-	 *         convert the attribute.
-	 */
-	protected Object calculateLocalOverride(ICSSPropertyMeta meta,
-			String propertyName) {
-		// // do some default margin thing.
-		// if (ICSSPropertyID.ATTR_MARGIN_RIGHT.equalsIgnoreCase(propertyName)
-		// || ICSSPropertyID.ATTR_MARGIN_BOTTOM.equalsIgnoreCase(propertyName))
-		// {
-		// return MARGIN_LENGTH;
-		// }
-		// else if
-		// (ICSSPropertyID.ATTR_MARGIN_LEFT.equalsIgnoreCase(propertyName))
-		// {
-		// // to make a little room, so it is possible for user to position the
-		// // mouse before the first element in a block.
-		// return MARGIN_LEFT;
-		// }
-		return null;
-	}
-
-	/**
-	 * This is only called when inherit value from parent.
-	 * 
-	 * @param meta 
-	 * @param propertyName
-	 * @return the result value
-	 */
-	protected Object getParentResultValue(ICSSPropertyMeta meta,
-			String propertyName) {
-		ICSSStyle style = getParentStyle();
-		return style.getStyleProperty(propertyName);
-	}
-
-	/**
-	 * @param parentStyle
-	 */
-	public void setParentStyle(ICSSStyle parentStyle) {
-		this._parentStyle = parentStyle;
-		reset();
-	}
-
-	public ICSSStyle getParentStyle() {
-		if (_parentStyle != null) {
-			return _parentStyle;
-		}
-		Node node = _element.getParentNode();
-		while (node instanceof Element && node instanceof INodeNotifier) {
-			ICSSStyle parentStyle = (ICSSStyle) ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (parentStyle != null) {
-				return parentStyle;
-			}
-            node = node.getParentNode();
-		}
-		return DefaultStyle.getInstance();
-	}
-
-	/**
-	 * Will not return null
-	 * 
-	 * @return the font
-	 */
-	public ICSSFont getCSSFont() {
-		if (_font == null) {
-			_font = getFontManager().createFont(this);
-		}
-		return _font;
-	}
-
-	/**
-	 * @return
-	 */
-	private ICSSFontManager getFontManager() {
-		return CSSFontManager.getInstance();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getMarginInsets()
-	 */
-	public Insets getMarginInsets() {
-		if (_marginInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_TOP);
-			int left = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_LEFT);
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_BOTTOM);
-			int right = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_RIGHT);
-			_marginInsets = new Insets(top, left, bottom, right);
-		}
-		return _marginInsets;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getPaddingInsets()
-	 */
-	public Insets getPaddingInsets() {
-		if (_paddingInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_PADDING_TOP);
-			int left = getInsetProperty(ICSSPropertyID.ATTR_PADDING_LEFT);
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_PADDING_BOTTOM);
-			int right = getInsetProperty(ICSSPropertyID.ATTR_PADDING_RIGHT);
-			//add extra padding only for the top element of a source tag's rendering
-			if (elementIsTagConverted()) {
-			    final int borderOffset = _prefs.getCssArtificialCellPadding();
-				top += borderOffset;
-				left += borderOffset;
-				bottom += borderOffset;
-				right += borderOffset;
-			}
-			_paddingInsets = new Insets(top, left, bottom, right);
-		}
-		return _paddingInsets;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBorderInsets()
-	 */
-	public Insets getBorderInsets() {
-		if (_borderInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_BORDER_TOP_WIDTH);
-			int left = getInsetProperty(ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH);
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH);
-			int right = getInsetProperty(ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH);
-			_borderInsets = new Insets(top, left, bottom, right);
-		}
-		return _borderInsets;
-	}
-
-	/**
-	 * @param border_top_width
-	 * @return
-	 */
-	private int getInsetProperty(String propertyName) {
-		Object obj = this.getStyleProperty(propertyName);
-		if (obj instanceof Length) {
-			Length l = (Length) obj;
-			if (l.isPercentage()) {
-				return 0; // FIXME:
-			}
-            return l.getValue();
-		}
-
-		return 0;
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return (type == ICSSStyle.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isSizeIncludeBorderPadding()
-	 */
-	public boolean isSizeIncludeBorderPadding() {
-		String display = this.getDisplay();
-		if ("table-cell".equalsIgnoreCase(display)) { //$NON-NLS-1$
-			return false;
-		}
-		String tag = this.getHTMLTag();
-		if ("img".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBackgroundColor()
-	 */
-	public Object getColor() {
-		Object _color = null;
-		if (_color == null) {
-			_color = getStyleProperty(ICSSPropertyID.ATTR_COLOR);
-			if (_color == null) {
-				_color = getStyleProperty(ICSSPropertyID.ATTR_TEXTCOLOR);
-			}
-		}
-		return _color;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColor()
-	 */
-	public Object getBackgroundColor() {
-		Object _backgroundColor = null;
-		if (_backgroundColor == null) {
-			_backgroundColor = getStyleProperty(ICSSPropertyID.ATTR_BACKGROUND_COLOR);
-		}
-		return _backgroundColor;
-	}
-
-	/**
-	 * @return the html element
-	 */
-	public Element getHtmlElement() {
-		// if (_element instanceof IDOMElement)
-		// {
-		// EditPart part = (EditPart) ((IDOMElement)
-		// _element).getAdapterFor(EditPart.class);
-		// if (part instanceof ElementEditPart)
-		// {
-		// ElementEditPart elementPart = (ElementEditPart) part;
-		// ITagHandler h = elementPart.getTagHandler();
-		// if (h != null)
-		// {
-		// return h.mapCustomElement(_element);
-		// }
-		// }
-		//
-		// }
-		return _element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getDisplay()
-	 */
-	public String getDisplay() {
-		Object display = this.getStyleProperty(ICSSPropertyID.ATTR_DISPLAY);
-		String displayStr;
-		if (display == null) {
-			displayStr = ICSSPropertyID.VAL_INLINE;
-		} else if (display instanceof String) {
-			displayStr = (String) display;
-		} else {
-			displayStr = display.toString();
-		}
-		if (ICSSPropertyID.VAL_INLINE.equalsIgnoreCase(displayStr)
-				&& IHTMLConstants.TAG_TABLE.equalsIgnoreCase(getHTMLTag())) {
-			return ICSSPropertyID.VAL_INLINE_TABLE;
-		}
-		if (ICSSPropertyID.VAL_INLINE.equalsIgnoreCase(displayStr)) {
-			Object width = this.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
-			if (width instanceof Length) {
-				return ICSSPropertyID.VAL_INLINE_BLOCK;
-			}
-			Object height = this.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			if (height instanceof Length) {
-				return ICSSPropertyID.VAL_INLINE_BLOCK;
-			}
-			return displayStr;
-		}
-        return displayStr;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getListStyle()
-	 */
-	public Map getCounters() {
-		if (_counters == null) {
-			_counters = new HashMap();
-			CounterHelper.processCounterReset(this, _counters);
-		}
-		return _counters;
-	}
-
-	/**
-	 * Get named counter from counters.
-	 * 
-	 * see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCounter(java.lang.String)
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must) {
-		Map counters = getCounters();
-		if (counters == null || !counters.containsKey(name)) {
-			if (getParentStyle() != null
-					&& !(getParentStyle() instanceof DefaultStyle)) {
-				// ensure it is registered somewhere.
-				return getParentStyle().findCounter(name, must);
-			}
-			// must is called by counter-increment
-			else if (must) {
-				// the caller should do the other setting.
-				ICounterValueGenerator counter = new CounterValueGenerator(
-						name, null, null, this);
-				counter.resetCount();
-				counters.put(name, counter);
-			}
-		}
-		return (ICounterValueGenerator) counters.get(name);
-	}
-
-	/**
-	 * @param buffer
-	 */
-	public void dumpDebugInfo(StringBuffer buffer) {
-		if (_cache != null) {
-			buffer.append("cache:\n"); //$NON-NLS-1$
-			buffer.append(_cache.getCssText()).append("\n"); //$NON-NLS-1$
-		}
-		if (_defaultCache != null) {
-			buffer.append("default cache:\n"); //$NON-NLS-1$
-			buffer.append(_defaultCache.getCssText()).append("\n"); //$NON-NLS-1$
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColSpan()
-	 */
-	public int getColSpan() {
-		int colspan = DOMUtil.getIntAttributeIgnoreCase(getHtmlElement(),
-				"colspan", 1); //$NON-NLS-1$
-		// if span == 0, means span all col from the current column to end
-		// colume
-		if (colspan < 0) {
-			return 1;
-		}
-        return colspan;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getRowSpan()
-	 */
-	public int getRowSpan() {
-		int rowspan = DOMUtil.getIntAttributeIgnoreCase(getHtmlElement(),
-				"rowspan", 1); //$NON-NLS-1$
-		if (rowspan < 0) {
-			return 1;
-		}
-        return rowspan;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isInSelection()
-	 */
-	public boolean isInSelection() {
-		IRangeSelectionProxy proxy = (IRangeSelectionProxy) getAdapter(IRangeSelectionProxy.class);
-		if (proxy != null) {
-			return proxy.isRangeSelected();
-		}
-		ICSSStyle parentStyle = getParentStyle();
-		if (parentStyle != null) {
-			return parentStyle.isInSelection();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (this._element instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _element).getAdapterFor(adapter);
-			if (ret != null && adapter.isInstance(ret)) {
-				return ret;
-			}
-		}
-		return null;
-	}
-
-	// private void unregistCounter()
-	// {
-	// if (_counters != null)
-	// {
-	// Collection c = _counters.values();
-	// Iterator iter = c.iterator();
-	// while (iter.hasNext())
-	// {
-	// Counter2 counter = (Counter2) iter.next();
-	// counter.unregist(this);
-	// }
-	// }
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#resetCounters()
-	 */
-	public void processCounters() {
-		this._counters = null;
-		CounterHelper.processCounterIncrement(this);
-	}
-
-	private boolean elementIsTagConverted() {
-		boolean isTagConverted = false;
-		if (_element instanceof INodeNotifier) {
-			Collection nodeAdapters = ((INodeNotifier)_element).getAdapters();
-			for (Object nodeAdapter: nodeAdapters) {
-				if (nodeAdapter instanceof ITagConverter) {
-					isTagConverted = true;
-					break;
-				}
-			}
-		}
-		return isTagConverted;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/DefaultStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/DefaultStyle.java
deleted file mode 100644
index 7e23150..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/DefaultStyle.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import java.util.Map;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.property.CSSMetaRegistry;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * 
- * TODO: why doesn't this sub-class AbstractStyle
- */
-public class DefaultStyle implements ICSSStyle {
-
-	private static final Insets EMPTY_INSETS = new Insets();
-	/**
-	 * A default preferences object.
-	 */
-	protected static final PDPreferences PREFS = new PDPreferences();
-    private final PDPreferences _prefs;
-
-	/**
-	 * @param prefs
-	 */
-	public DefaultStyle(final PDPreferences prefs)
-	{
-	    _prefs = prefs;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#reset()
-	 */
-	public void reset() {
-        // TODO: dead?        
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getStyleProperty(java.lang.String)
-	 */
-	public Object getStyleProperty(String property) {
-		ICSSPropertyMeta meta = CSSMetaRegistry.getInstance().getMeta(property);
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.getInitialValue(property, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getMarginInsets()
-	 */
-	public Insets getMarginInsets() {
-		return EMPTY_INSETS;
-        //return new Insets(0, 0, 0, 0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBorderInsets()
-	 */
-	public Insets getBorderInsets() {
-		return EMPTY_INSETS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getPaddingInsets()
-	 */
-	public Insets getPaddingInsets() {
-	    int offset = _prefs.getCssArtificialCellPadding();
-        return new Insets(offset, offset, offset, offset);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isSizeIncludeBorderPadding()
-	 */
-	public boolean isSizeIncludeBorderPadding() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type == ICSSStyle.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // TODO: do nothing?
-	}
-
-	private ICSSFont defaultFont = CSSFontManager.getInstance().createDefaultFont();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCSSFont()
-	 */
-	public ICSSFont getCSSFont() {
-		return defaultFont;
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static ICSSStyle getInstance() {
-		if (_instance == null) {
-			_instance = new DefaultStyle(PREFS);
-		}
-		return _instance;
-	}
-
-	static DefaultStyle _instance;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getParentStyle()
-	 */
-	public ICSSStyle getParentStyle() {
-		// return this;
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBackgroundColor()
-	 */
-	public Object getBackgroundColor() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColor()
-	 */
-	public Object getColor() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getDisplay()
-	 */
-	public String getDisplay() {
-		return "inline"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getListStyle()
-	 */
-	public Map getCounters() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCounter(java.lang.String)
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColSpan()
-	 */
-	public int getColSpan() {
-		return 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getRowSpan()
-	 */
-	public int getRowSpan() {
-		return 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isInSelection()
-	 */
-	public boolean isInSelection() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#resetCounters()
-	 */
-	public void processCounters() {
-		// do nothing.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getHTMLelementValue(java.lang.String)
-	 */
-	public Object getHTMLelementInitValue(String propertyName) {
-		ICSSPropertyMeta meta = CSSMetaRegistry.getInstance().getMeta(
-				propertyName);
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.getInitialValue(propertyName, this);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java
deleted file mode 100644
index 21693e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import org.eclipse.jst.pagedesigner.parts.EditProxyAdapter;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-
-/**
- * A style for hidden elements
- *
- */
-public class HiddenElementStyle extends DefaultStyle {
-	private EditProxyAdapter _editProxyAdapter;
-
-	private Element _convertedElement;
-
-	private static ITagEditInfo _tagEditInfo = new ITagEditInfo() {
-
-		public boolean isWidget() {
-			return true;
-		}
-
-		public boolean needBorderDecorator() {
-			return false;
-		}
-
-		public boolean needTableDecorator() {
-			return false;
-		}
-
-		public int getMinWidth() {
-			return 0;
-		}
-
-		public int getMinHeight() {
-			return 0;
-		}
-	};
-
-	/**
-	 * @param adapter
-	 * @param prefs 
-	 */
-	public HiddenElementStyle(EditProxyAdapter adapter, PDPreferences prefs) 
-	{
-	    super(prefs);
-		this._editProxyAdapter = adapter;
-	}
-
-	/**
-	 * @param convertedElement
-	 * @param prefs 
-	 */
-	public HiddenElementStyle(Element convertedElement, PDPreferences prefs) 
-	{
-        super(prefs);
-		this._convertedElement = convertedElement;
-	}
-
-	public boolean isInSelection() {
-		if (_convertedElement instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _convertedElement)
-					.getAdapterFor(AbstractStyle.class);
-			if (ret instanceof AbstractStyle) {
-				return ((AbstractStyle) ret).isInSelection();
-			}
-		}
-
-		if (_editProxyAdapter != null) {
-			return _editProxyAdapter.isRangeSelected();
-		}
-
-		return false;
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (_convertedElement instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _convertedElement)
-					.getAdapterFor(AbstractStyle.class);
-			if (ret instanceof AbstractStyle) {
-				return ((AbstractStyle) ret).getAdapter(adapter);
-			}
-		}
-		if (_editProxyAdapter != null && adapter == ITagEditInfo.class) {
-			return _tagEditInfo;
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java
deleted file mode 100644
index 5bf6fb8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IRangeSelectionProxy {
-
-	/**
-	 * @return true if the range is selected
-	 */
-	boolean isRangeSelected();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ITagEditInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ITagEditInfo.java
deleted file mode 100644
index e2ac601..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ITagEditInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-/**
- * TODO: TagConversion decorator should augment/replace
- * @author mengbo
- * @version 1.5
- */
-public interface ITagEditInfo 
-{
-	/**
-	 * @return true if is a widget
-	 */
-	public boolean isWidget();
-
-	/**
-	 * @return true if a border decorator is needed
-	 */
-	public boolean needBorderDecorator();
-
-	/**
-	 * @return true if a table decorator is needed
-	 */
-	public boolean needTableDecorator();
-
-	/**
-	 * for some element in design mode we want to them to have a default min
-	 * size.
-	 * 
-	 * @return positive value means an expected min size.
-	 */
-	public int getMinWidth();
-
-	/**
-	 * @return the minimum height
-	 */
-	public int getMinHeight();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/StyleUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/StyleUtil.java
deleted file mode 100644
index 635576f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/StyleUtil.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class StyleUtil {
-	/**
-	 * @param style
-	 * @return true if the style is in a widget
-	 */
-	public static boolean isInWidget(ICSSStyle style) {
-		while (style != null && style != DefaultStyle.getInstance()) {
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null && info.isWidget()) {
-				return true;
-			}
-
-			style = style.getParentStyle();
-		}
-		return false;
-	}
-	
-	private StyleUtil()
-	{
-	    // util class
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/value/Length.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/value/Length.java
deleted file mode 100644
index be19387..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/value/Length.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.value;
-
-/**
- * @author mengbo
- */
-public class Length {
-	/**
-	 * Constant for 0 length
-	 */
-	public static final Length LENGTH_0 = new Length(0, false);
-
-	/**
-	 * Constant for 1 length
-	 */
-	public static final Length LENGTH_1 = new Length(1, false);
-
-	/**
-	 * Constant for 2 length
-	 */
-	public static final Length LENGTH_2 = new Length(2, false);
-
-	/**
-	 * Constant for 3 length
-	 */
-	public static final Length LENGTH_3 = new Length(3, false);
-
-	/**
-	 * Constant for 8 length
-	 */
-	public static final Length LENGTH_8 = new Length(8, false);
-
-	private final boolean _percentage;
-
-	private final int _value;
-
-	/**
-	 * @param value
-	 * @param percentage
-	 */
-	public Length(int value, boolean percentage) {
-		_value = value;
-		_percentage = percentage;
-	}
-
-	/**
-	 * @return true if value is a percentage
-	 */
-	public boolean isPercentage() {
-		return _percentage;
-	}
-
-	/**
-	 * @return the length value
-	 */
-	public int getValue() {
-		return _value;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/AbstractWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/AbstractWidgetProvider.java
deleted file mode 100644
index c29d39f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/AbstractWidgetProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractWidgetProvider implements ICSSWidgetProvider {
-	final static int BORDERTHICK = 2;
-
-	private final ICSSStyle _style;
-
-	/**
-	 * @param style
-	 */
-	public AbstractWidgetProvider(ICSSStyle style) {
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getCSSStyle()
-	 */
-	public ICSSStyle getCSSStyle() {
-		return _style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isInline()
-	 */
-	public boolean isInline() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/BorderUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/BorderUtil.java
deleted file mode 100644
index 65659f6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/BorderUtil.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class BorderUtil {
-	/**
-	 * vertical bar style
-	 */
-	public final static int VERTICAL_BAR = 0;
-
-	/**
-	 * horizontal bar style
-	 */
-	public final static int HORIZONTAL_BAR = 1;
-
-	/**
-	 * both scroll bar style
-	 */
-	public final static int BOTH = 2;
-
-	/**
-	 * The scroll width
-	 */
-	public final static int SCROLL_WIDTH = 16;
-
-	/**
-	 * the border thickness
-	 */
-	public final static int BORDER_THICK = 2;
-
-	/**
-	 * draw a mask to a rectangle
-	 * 
-	 * @param g 
-	 * @param rect 
-	 * @param color 
-	 * 
-	 */
-	public static void maskRectangle(Graphics g, Rectangle rect, Color color) {
-		// set default if one not provided
-		if (color == null) {
-			color = ColorConstants.blue;
-		}
-
-		// get old information and keep them
-		int lineStyle = g.getLineStyle();
-		Color foregroundColor = g.getForegroundColor();
-
-		g.setLineStyle(SWT.LINE_SOLID);
-		g.setForegroundColor(color);
-		for (int i = 0, n = rect.height; i < n; i++, i++) {
-			for (int j = 0, m = rect.width; j < m; j++, j++) {
-				g.drawLine(rect.x + j, rect.y + i, rect.x + j, rect.y + i);
-			}
-		}
-
-		// restore to the old state
-		g.setLineStyle(lineStyle);
-		g.setForegroundColor(foregroundColor);
-	}
-
-	/**
-	 * @param g
-	 * @param rect
-	 * @param thick
-	 * @param inset
-	 */
-	public static void drawBorder(Graphics g, Rectangle rect, int thick,
-			boolean inset) {
-		drawBorder(g, rect.x, rect.y, rect.width, rect.height, thick, inset);
-	}
-
-	/**
-	 * draw a standard border.
-	 * 
-	 * @param g
-	 * @param left
-	 * @param top
-	 * @param width
-	 * @param height
-	 * @param thick
-	 * @param inset
-	 */
-	public static void drawBorder(Graphics g, int left, int top, int width,
-			int height, int thick, boolean inset) {
-		Color[] ltColors = new Color[] {
-				Display.getCurrent().getSystemColor(
-						SWT.COLOR_WIDGET_LIGHT_SHADOW),
-				Display.getCurrent().getSystemColor(
-						SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW) };
-		if (inset) {
-			ltColors = new Color[] { ColorConstants.buttonDarker,
-					ColorConstants.buttonDarkest };
-		}
-		for (int i = 0; i < thick; i++) {
-			g.setForegroundColor(ltColors[ltColors.length * i / thick]);
-			g.drawLine(left + i, top + i, left + width - 1 - i, top + i);
-			g.drawLine(left + i, top + i, left + i, top + height - i - i);
-		}
-
-		Color[] rbColors = new Color[] {
-				Display.getCurrent().getSystemColor(
-						SWT.COLOR_WIDGET_DARK_SHADOW),
-				Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY) };
-		if (inset) {
-			rbColors = new Color[] { ColorConstants.buttonLightest,
-					ColorConstants.button };
-		}
-		for (int i = 0; i < thick; i++) {
-			g.setForegroundColor(rbColors[ltColors.length * i / thick]);
-			g.drawLine(left + i, top - i + height - 1, left + width - 1 - i,
-					top - i + height - 1);
-			g.drawLine(left + width - 1 - i, top + i, left + width - 1 - i, top
-					+ height - 1 - i);
-		}
-	}
-
-	/**
-	 * @param g
-	 * @param scrollWidth
-	 * @param rect
-	 * @param style
-	 */
-	public static void drawScrollBar(Graphics g, int scrollWidth,
-			Rectangle rect, int style) {
-		drawScrollBar(g, scrollWidth, BORDER_THICK, rect, style);
-	}
-
-	/**
-	 * @param g
-	 * @param scrollWidth
-	 * @param borderThick
-	 * @param rect
-	 * @param style
-	 */
-	public static void drawScrollBar(Graphics g, int scrollWidth,
-			int borderThick, Rectangle rect, int style) {
-		if (style == BOTH) {
-			int width = scrollWidth;
-			int left = rect.x + rect.width - width;
-			int top = rect.y;
-			int height = rect.height;
-			Rectangle barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			barRect = new Rectangle(left, top, width, height - scrollWidth);
-			drawVerticalPart(g, scrollWidth, borderThick, barRect);
-
-			left = rect.x + borderThick;
-			top = top + height - scrollWidth;
-			width = rect.width;
-			height = scrollWidth;
-			barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			barRect = new Rectangle(left, top, width - scrollWidth - 2, height);
-			drawHorizontalPart(g, scrollWidth, borderThick, barRect);
-		} else if (style == VERTICAL_BAR) {
-			int width = scrollWidth;
-			int left = rect.x + rect.width - width;
-			int top = rect.y;
-			int height = rect.height;
-			Rectangle barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			drawVerticalPart(g, scrollWidth, borderThick, barRect);
-		} else if (style == HORIZONTAL_BAR) {
-			int left = rect.x + borderThick;
-			int top = rect.y + rect.height - scrollWidth;
-			int width = rect.width;
-			int height = scrollWidth;
-			Rectangle barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			drawHorizontalPart(g, scrollWidth, borderThick, barRect);
-		}
-	}
-
-	private static void fillBar(Graphics g, Rectangle rect) {
-		g.setBackgroundColor(ColorConstants.button);
-		g.fillRectangle(rect);
-	}
-
-	private static void drawVerticalPart(Graphics g, int arrawLength,
-			int borderThick, Rectangle rect) {
-		int left = rect.x;
-		int top = rect.y;
-		int width = Math.min(arrawLength, rect.width);
-		int height = Math.min(arrawLength, rect.height / 2);
-
-		Rectangle borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		g.setForegroundColor(ColorConstants.black);
-		int decoratorWidth = (width - borderThick * 2) / 2;
-		int length = decoratorWidth / 2 + 1;
-		int leftX = rect.x + (width - decoratorWidth) / 2 - 1;
-		int bottomY = rect.y + (height + length) / 2 - 1;
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, bottomY - i, leftX - i + decoratorWidth,
-					bottomY - i);
-		}
-
-		top = rect.y + rect.height - height;
-		borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		int topY = top + (height - length) / 2;
-		g.setForegroundColor(ColorConstants.black);
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, topY + i, leftX - i + decoratorWidth, topY
-					+ i);
-		}
-	}
-
-	private static void drawHorizontalPart(Graphics g, int arrawLength,
-			int borderThick, Rectangle rect) {
-		int left = rect.x;
-		int top = rect.y;
-		int width = Math.min(arrawLength, rect.width / 2);
-		int height = Math.min(arrawLength, rect.height);
-
-		Rectangle borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		g.setForegroundColor(ColorConstants.black);
-		int decoratorHeight = (height - borderThick * 2) / 2;
-		int length = decoratorHeight / 2 + 1;
-		int leftX = rect.x + (width + length) / 2 - 1;
-		int bottomY = rect.y + (height - length) / 2 - 1;
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX - i, bottomY + i, leftX - i, bottomY - i
-					+ decoratorHeight);
-		}
-
-		left = rect.x + rect.width - width;
-		borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		leftX = left + (width - length) / 2;
-		g.setForegroundColor(ColorConstants.black);
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, bottomY + i, leftX + i, bottomY - i
-					+ decoratorHeight);
-		}
-	}
-
-	/**
-	 * @param g
-	 * @param arrawWidth
-	 * @param arrawHeight
-	 * @param borderThick
-	 * @param rect
-	 */
-	public static void drawVertialBar(Graphics g, int arrawWidth,
-			int arrawHeight, int borderThick, Rectangle rect) {
-		drawScrollBar(g, arrawWidth, borderThick, rect, VERTICAL_BAR);
-	}
-
-	/**
-	 * @param figure
-	 * @param graphics
-	 */
-	public static void drawBorderDecorator(CSSFigure figure, Graphics graphics) {
-		graphics.setLineWidth(1);
-		graphics.setLineStyle(Graphics.LINE_DASH);
-		graphics.setForegroundColor(ColorConstants.lightGray);
-		List fragments = figure.getFragmentsForRead();
-		for (int i = 0, size = fragments.size(); i < size; i++) {
-			FlowBox box = (FlowBox) fragments.get(i);
-			// XXX: why -1?
-			graphics.drawRectangle(box.getX(), box.getY(), box.getWidth() - 1, box
-					.getHeight() - 1);
-		}
-		graphics.restoreState();
-	}
-
-	/**
-	 * @param figure
-	 * @param g
-	 */
-	public static void maskFigure(CSSFigure figure, Graphics g) {
-		List fragments = figure.getFragmentsForRead();
-		for (int i = 0, size = fragments.size(); i < size; i++) {
-			FlowBox box = (FlowBox) fragments.get(i);
-			maskRectangle(g, new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-					.getHeight()), null);
-		}
-	}
-	
-	private BorderUtil()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ButtonWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ButtonWidgetProvider.java
deleted file mode 100644
index b6d33a2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ButtonWidgetProvider.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import java.util.StringTokenizer;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * For ButtonWidget, it displays some text value in it. And lays the text with
- * nowrap.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ButtonWidgetProvider extends AbstractWidgetProvider {
-	// The button width should include the label length and padding,
-	// to let the button looks fine, we set the padding 0.46 width as the label
-	// length.
-	private final static double HORIZONTAL_RATE = 1.46;
-
-	// The button height should include the label height and padding,
-	// to let the button looks fine, we set the padding 0.36 height as the
-	// character height.
-	private final static double VERTICAL_PADDING_RATE = 0.36;
-
-	private static final String[] DEFAULTLINES = new String[] { "  " }; //$NON-NLS-1$
-
-	private String _value = ""; //$NON-NLS-1$
-
-	private String[] _lines = DEFAULTLINES;
-
-	/**
-	 * @param style
-	 */
-	public ButtonWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(new Dimension(width, height), -1);
-	}
-
-	/**
-	 * by default, the combo's width will be calculated from the longest option
-	 * value.
-	 * 
-	 * @return the default width value
-	 */
-	public int getDefaultWidth() {
-		int longestStringWidth = 0;
-		if (_lines != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			Font swtFont = font.getSwtFont();
-			for (int i = 0; i < _lines.length; i++) {
-				int width = FigureUtilities.getTextWidth(_lines[i], swtFont);
-				if (width > longestStringWidth) {
-					longestStringWidth = width;
-				}
-			}
-		}
-		// text area width + padding
-		return (int) ((longestStringWidth) * HORIZONTAL_RATE);
-	}
-
-	/**
-	 * 
-	 * @return the default height value
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return (int) ((fontHeight) * (_lines.length + VERTICAL_PADDING_RATE));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		Object textAlign = style
-				.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
-		if (ICSSPropertyMeta.NOT_SPECIFIED == textAlign) {
-			textAlign = "center"; //$NON-NLS-1$
-		}
-		Font font = style.getCSSFont().getSwtFont();
-		g.setFont(font);
-		int fontHeight = FigureUtilities.getFontMetrics(font).getHeight();
-
-		Color newColor = null;
-		Object color = style.getColor();
-		if (color instanceof Color) {
-			g.setForegroundColor((Color) color);
-		} else if (color instanceof RGB) {
-			newColor = new Color(Display.getCurrent(), (RGB) color);
-			g.setForegroundColor(newColor);
-		} else {
-			g.setForegroundColor(ColorConstants.black);
-		}
-
-		g.clipRect(rect);
-
-		int y = rect.y + (int) (fontHeight * VERTICAL_PADDING_RATE / 2);
-		if (rect.height > fontHeight * _lines.length) {
-			y = rect.y + (rect.height - fontHeight * _lines.length) / 2;
-		}
-
-		for (int i = 0; i < _lines.length && y < rect.y + rect.height; i++) {
-			int width = FigureUtilities.getTextWidth(_lines[i], font);
-			int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
-			g.drawString(_lines[i], x, y);
-			TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y, width,
-					fontHeight), ((Integer) getCSSStyle().getStyleProperty(
-					ICSSPropertyID.ATTR_TEXTDECORATION)).intValue());
-			y += fontHeight;
-		}
-
-		if (newColor != null) {
-			newColor.dispose();
-		}
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		if (value == null) {
-			value = ""; //$NON-NLS-1$
-		}
-		_value = value;
-		_lines = splitValue(_value);
-	}
-
-	/**
-	 * Split the value to multiple lines.
-	 * 
-	 * @param _value2
-	 * @return
-	 */
-	private String[] splitValue(String _value2) {
-		if (_value2 == null || "".equals(_value2)) { //$NON-NLS-1$
-			return DEFAULTLINES;
-		}
-
-		StringTokenizer tokenizer = new StringTokenizer(_value2, "\r\n"); //$NON-NLS-1$
-		String[] result = new String[tokenizer.countTokens()];
-		for (int i = 0; i < result.length; i++) {
-			result[i] = tokenizer.nextToken().replaceAll("\t", "    "); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java
deleted file mode 100644
index 54e319e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CheckboxWidgetProvider extends AbstractWidgetProvider {
-	private boolean isChecked;
-
-	/**
-	 * @param style
-	 */
-	public CheckboxWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultWidth();
-		}
-		return new DimensionInfo(new Dimension(width, height), height * 4 / 5);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		int centerX = rect.x + rect.width / 2;
-		int centerY = rect.y + rect.height / 2;
-
-		// we always draw it as a square.
-		int width = Math.min(rect.width, rect.height);
-		int innerWidth = width * 4 / 5;
-
-		int left = centerX - innerWidth / 2;
-		int top = centerY - innerWidth / 2;
-		BorderUtil.drawBorder(g, left, top, innerWidth, innerWidth, 2, true);
-		if (isChecked()) {
-			g.pushState();
-			Display display = Display.getCurrent();
-			g.setForegroundColor(display.getSystemColor(SWT.COLOR_BLACK));
-			g.drawLine(left + 3, top + 2, left + innerWidth - 3, top
-					+ innerWidth - 4);
-			g.drawLine(left + 2, top + 2, left + innerWidth - 3, top
-					+ innerWidth - 3);
-
-			g.drawLine(left + innerWidth - 4, top + 2, left + 2, top
-					+ innerWidth - 4);
-			g.drawLine(left + innerWidth - 3, top + 2, left + 2, top
-					+ innerWidth - 3);
-			g.popState();
-		}
-	}
-
-	/**
-	 * @return the default width
-	 */
-	private int getDefaultWidth() {
-		// FIXME: don't know the how to define the default width yet.
-		return 15;
-	}
-
-	/**
-	 * @return Returns the checked.
-	 */
-	public boolean isChecked() {
-		return isChecked;
-	}
-
-	/**
-	 * @param checked
-	 */
-	public void setChecked(boolean checked) {
-		this.isChecked = checked;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ComboWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ComboWidgetProvider.java
deleted file mode 100644
index 632a8a0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ComboWidgetProvider.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ComboWidgetProvider extends AbstractWidgetProvider {
-	private static final int VERTICAL_PADDING = 6;
-
-	private static final int HORIZONTAL_PADDING = 12;
-
-	private static int ARRAWWIDTH = 16;
-
-	//private static int ARROWHEIGHT = 16;
-
-	private String _firstString;
-
-	private String _longestString;
-
-	private String _label;
-
-	/**
-	 * @param style
-	 */
-	public ComboWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(new Dimension(width, height), -1);
-	}
-
-	/**
-	 * by default, the combo's width will be calculated from the longest option
-	 * value.
-	 * 
-	 * @return the default width
-	 */
-	private int getDefaultWidth() {
-		int textareaWidth;
-		if (this._longestString == null || this._longestString.length() == 0) {
-			textareaWidth = 20;
-		} else {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-
-			textareaWidth = FigureUtilities.getTextWidth(_longestString, font
-					.getSwtFont());
-		}
-		return textareaWidth + ARRAWWIDTH + HORIZONTAL_PADDING;
-	}
-
-	/**
-	 * 
-	 * @return the default height
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontSize = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return fontSize + VERTICAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		if (this._firstString != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			g.setFont(font.getSwtFont());
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			g.clipRect(rect);
-			String label = _label != null ? _label : _firstString;
-			label = label.replaceAll("[ \r\n]+", " "); //$NON-NLS-1$ //$NON-NLS-2$
-			if (label.endsWith(" ")) { //$NON-NLS-1$
-				label = label.substring(0, label.length() - 1);
-			}
-			g.drawString(label, rect.x + HORIZONTAL_PADDING / 2, rect.y
-					+ VERTICAL_PADDING / 2);
-			if (newColor != null) {
-				newColor.dispose();
-			}
-
-		}
-
-		BorderUtil.drawBorder(g, rect.x, rect.y, rect.width, rect.height,
-				BORDERTHICK, true);
-		// next the drop down button
-		int width = ARRAWWIDTH;
-		int left = rect.x + rect.width - width - BORDERTHICK;
-		int top = rect.y + BORDERTHICK;
-		int height = rect.height - BORDERTHICK * 2;
-		g.setBackgroundColor(ColorConstants.button);
-		g.fillRectangle(left, top, width, height);
-
-		Rectangle borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect.x, borderRect.y, borderRect.width,
-				borderRect.height, BORDERTHICK, false);
-
-		g.setForegroundColor(ColorConstants.black);
-
-		int decoratorWidth = (width - BORDERTHICK * 2) / 2;
-		int length = decoratorWidth / 2 + 1;
-		int leftX = left + (width - decoratorWidth) / 2 - 1;
-		int topY = top + (height - length) / 2 + 1;
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, topY + i, leftX - i + decoratorWidth, topY
-					+ i);
-		}
-	}
-
-	/**
-	 * set the options to be displayed in this combo box. Will calculate out the
-	 * first string and the longest string.
-	 * 
-	 * @param options
-	 */
-	public void setOptions(String[] options) {
-		if (options == null || options.length == 0) {
-			this._firstString = null;
-			this._longestString = null;
-		} else {
-			this._firstString = options[0];
-			this._longestString = (options[0] == null ? "" : options[0]); //$NON-NLS-1$
-			for (int i = 1; i < options.length; i++) {
-				if (options[i] == null) {
-					continue;
-				}
-				if (options[i].length() > this._longestString.length()) {
-					this._longestString = options[i];
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param label
-	 */
-	public void setSelectedLabel(String label) {
-		this._label = label;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/HiddenProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/HiddenProvider.java
deleted file mode 100644
index bfd79cf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/HiddenProvider.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.HiddenElementStyle;
-import org.eclipse.jst.pagedesigner.parts.EditProxyAdapter;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class HiddenProvider extends ImageWidgetProvider {
-	private final static int GAP = 3;
-
-	private String _label = null;
-
-	private boolean _labelVisible = true;
-
-	private FontMetrics _fontMetrics;
-    
-	/**
-	 * @param image
-	 * @param convertedElement 
-	 */
-	public HiddenProvider(Image image, Element convertedElement) {
-		super(image, new HiddenElementStyle(convertedElement, new PDPreferences()));
-	}
-
-	/**
-	 * @param image
-	 * @param editPart
-	 */
-	public HiddenProvider(Image image, ElementEditPart editPart) {
-		super(image, new HiddenElementStyle(new EditProxyAdapter(editPart), new PDPreferences()));
-	}
-
-	// public HiddenProvider(Image image, String label)
-	// {
-	// this(image);
-	// this._label = label;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		int preWidth = width;
-		int preHeight = height;
-		_fontMetrics = getFontMetrics();
-		if (width <= 0) {
-			preWidth = getLabelWidth() + _imageWidth;
-		}
-		if (height <= 0) {
-			preHeight = Math.max(getLabelHeight(), _imageHeight);
-		}
-		return new DimensionInfo(preWidth, preHeight, -1);
-	}
-
-	private FontMetrics getFontMetrics() {
-		Font swtfont = Display.getCurrent().getSystemFont();
-		return FigureUtilities.getFontMetrics(swtfont);
-	}
-
-	private int getLabelHeight() {
-		if (_labelVisible && (_label != null) && (!_label.equals("")) //$NON-NLS-1$
-				&& (_fontMetrics != null)) {
-			return _fontMetrics.getHeight();
-		}
-		return 0;
-	}
-
-	/**
-	 * @return the label width
-	 */
-	public int getLabelWidth() {
-		if (_labelVisible && _label != null && !_label.equals("") //$NON-NLS-1$
-				&& _fontMetrics != null) {
-			Font swtfont = Display.getCurrent().getSystemFont();
-			return FigureUtilities.getTextWidth(_label, swtfont) + GAP;
-		}
-		return 0;
-	}
-
-	public void paintFigure(Graphics g,
-			org.eclipse.draw2d.geometry.Rectangle rect) {
-		g.fillRectangle(rect);
-		g.setClip(rect);
-		int imageAreaWidth = Math.min(rect.width, _imageWidth);
-		int imageAreaHeight = Math.min(rect.height, _imageHeight);
-		if (_image != null && !_image.isDisposed()) {
-			g.drawImage(_image, 0, 0, _imageWidth, _imageHeight, rect.x, rect.y
-					+ (rect.height - imageAreaHeight) / 2, imageAreaWidth,
-					imageAreaHeight);
-		}
-		if (_label != null && _labelVisible) {
-			int leading = 0;
-			if (_fontMetrics != null) {
-				leading = _fontMetrics.getLeading();
-			}
-            // TODO: adapt to bg: go lighter on colors that darker() would make black
-			// TODO: color registry
-            Color fg = FigureUtilities.darker(g.getBackgroundColor());
-            g.setForegroundColor(fg);
-            g.drawString(_label, imageAreaWidth + GAP, rect.y
-					+ (rect.height - getLabelHeight()) / 2 + leading);
-            fg.dispose();
-		}
-	}
-
-	/**
-	 * @return the label text
-	 */
-	public String getLabel() {
-		return _label;
-	}
-
-	/**
-	 * @param label
-	 */
-	public void setLabel(String label) {
-		this._label = label;
-	}
-
-	/**
-	 * @return whether the label is visible
-	 */
-	public boolean isLabelVisible() {
-		return _labelVisible;
-	}
-
-	/**
-	 * @param labelVisible
-	 */
-	public void setLabelVisible(boolean labelVisible) {
-		this._labelVisible = labelVisible;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ImageWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ImageWidgetProvider.java
deleted file mode 100644
index a88caab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ImageWidgetProvider.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class ImageWidgetProvider extends AbstractWidgetProvider {
-	private static final String NOPIC_IMAGE_NAME = "PD_nopic.jpg"; //$NON-NLS-1$
-
-	private static Image _noPicImage;
-
-	private static int _noPicWidth;
-
-	private static int _noPicHeight;
-
-	/**
-	 * the image
-	 */
-	protected Image _image;
-
-	/**
-	 * image width
-	 */
-	protected int _imageWidth;
-
-	/**
-	 * image height
-	 */
-	protected int _imageHeight;
-
-	/**
-	 * @param image
-	 * @param style
-	 */
-	public ImageWidgetProvider(Image image, ICSSStyle style) {
-		super(style);
-
-		// set up image and image width/height
-		org.eclipse.swt.graphics.Rectangle rect = null;
-		if (image != null) {
-			rect = image.getBounds();
-			if (rect.width <= 0 || rect.height <= 0) {
-				useNoPicImage();
-			} else {
-				_image = image;
-				_imageWidth = rect.width;
-				_imageHeight = rect.height;
-			}
-		} else {
-			useNoPicImage();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void useNoPicImage() {
-		if (_noPicImage == null || _noPicImage.isDisposed()) {
-			ImageDescriptor noPicImageDesc = PDPlugin.getDefault()
-					.getImageDescriptor(NOPIC_IMAGE_NAME);
-			_noPicImage = noPicImageDesc.createImage();
-			org.eclipse.swt.graphics.Rectangle rect = _noPicImage.getBounds();
-			_noPicWidth = rect.width;
-			_noPicHeight = rect.height;
-		}
-		_image = _noPicImage;
-		_imageWidth = _noPicWidth;
-		_imageHeight = _noPicHeight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0 && height <= 0) {
-			// we are free, so use image size
-			org.eclipse.swt.graphics.Rectangle a = _image.getBounds();
-			return new DimensionInfo(a.width, a.height, -1);
-		} else if (width > 0 && height > 0) {
-			return new DimensionInfo(width, height, -1);
-		} else if (height > 0) {
-			width = (int) ((double) _imageWidth * height / _imageHeight);
-			return new DimensionInfo(width, height, -1);
-		} else {
-			height = (int) ((double) _imageHeight * width / _imageWidth);
-			return new DimensionInfo(width, height, -1);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		if (_image != null) {
-			g.drawImage(_image, 0, 0, _imageWidth, _imageHeight, rect.x,
-					rect.y, rect.width, rect.height);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/InputFileWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/InputFileWidgetProvider.java
deleted file mode 100644
index 6b5dbf5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/InputFileWidgetProvider.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.border.CSSBorder;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.MessageFormater;
-
-/**
- * @author mengbo
- */
-public class InputFileWidgetProvider extends AbstractWidgetProvider {
-	private static final String BODER_QUERY_TEMPLETE = "border-{0}-style"; //$NON-NLS-1$
-
-	private static final int GAP = 2;
-
-	private ICSSWidgetProvider _sub1;
-
-	private ICSSWidgetProvider _sub2;
-
-	/**
-	 * @param style
-	 * @param sub1 
-	 * @param sub2 
-	 */
-	public InputFileWidgetProvider(ICSSStyle style, ICSSWidgetProvider sub1,
-			ICSSWidgetProvider sub2) {
-		super(style);
-		_sub1 = sub1;
-		_sub2 = sub2;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		Insets borderInset = new Insets();
-		Insets borderPaddingInset = new Insets();
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			borderInset = style.getBorderInsets();
-			borderPaddingInset = borderInset.getAdded(style.getPaddingInsets());
-		}
-
-		Dimension d1 = _sub1.getPreferredDimension(-1, -1).getDimension();
-		Dimension d2 = _sub2.getPreferredDimension(-1, -1).getDimension();
-
-		int minWidth = d2.width + 2 * (borderInset.left + borderInset.right)
-				+ GAP;
-		int prefWidth = d1.width + d2.width + 2
-				* (borderPaddingInset.left + borderPaddingInset.right) + GAP;
-		int minHeight = borderInset.top + borderInset.bottom;
-		int prefHeight = Math.max(d1.height, d2.height)
-				+ borderPaddingInset.top + borderPaddingInset.bottom;
-
-		if (width > 0 && minWidth > width) {
-			prefWidth = minWidth;
-		} else if (width != 0) {
-			prefWidth = width;
-		}
-
-		if (height > 0 && minHeight > height) {
-			prefHeight = minHeight;
-		} else if (height != 0) {
-			prefHeight = height;
-		}
-		return new DimensionInfo(prefWidth, prefHeight, -1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		Rectangle rect1, rect2;
-
-		Insets borderInset = new Insets();
-		Insets paddingInset = new Insets();
-		Insets borderPaddingInset = new Insets();
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			borderInset = style.getBorderInsets();
-			paddingInset = style.getPaddingInsets();
-			borderPaddingInset.add(borderInset).add(paddingInset);
-		}
-
-		Dimension d1 = _sub1.getPreferredDimension(-1, -1).getDimension();
-		Dimension d2 = _sub2.getPreferredDimension(-1, -1).getDimension();
-		int prefWidth = d1.width + d2.width + 2 * borderPaddingInset.left + 2
-				* borderPaddingInset.right + GAP;
-		if (rect.width < prefWidth) {
-			paddingInset.left = 0;
-			paddingInset.right = 0;
-		}
-		int prefHeight = Math.max(d1.height, d2.height)
-				+ borderPaddingInset.top + borderPaddingInset.bottom;
-		if (rect.height < prefHeight) {
-			paddingInset.top = 0;
-			paddingInset.bottom = 0;
-		}
-
-		int width = rect.width
-				- d2.width
-				- (borderInset.left + borderInset.right + paddingInset.left + paddingInset.right)
-				- GAP;
-		rect1 = new Rectangle(rect.x - 1, rect.y, width, rect.height);
-		rect2 = new Rectangle(rect.x + rect1.width + 2, rect.y, rect.width
-				- rect1.width - 3, rect.height);
-		Rectangle innerRect1 = rect1.getCopy().crop(borderInset);
-		Rectangle innerRect2 = rect2.getCopy().crop(borderInset);
-
-		g.pushState();
-		g.setBackgroundColor(ColorConstants.button);
-		g.fillRectangle(innerRect2);
-		g.popState();
-
-		CSSBorder cssBorder = new CSSBorder(style);
-		String[] edges = new String[] { ICSSStyle.LEFT, ICSSStyle.RIGHT,
-				ICSSStyle.TOP, ICSSStyle.BOTTOM };
-		for (int i = 0; i < edges.length; i++) {
-			cssBorder.paintEdge(g, rect1, innerRect1, edges[i],
-					getBorderStyle(edges[i]));
-		}
-		for (int i = 0; i < edges.length; i++) {
-			String borderStyle = getBorderStyle(edges[i]);
-			if (ICSSPropertyID.VAL_INSET.equals(borderStyle)) {
-				borderStyle = ICSSPropertyID.VAL_OUTSET;
-			}
-			cssBorder.paintEdge(g, rect2, innerRect2, edges[i], borderStyle);
-		}
-
-		_sub2.paintFigure(g, innerRect2.getCopy().crop(paddingInset));
-		// _sub1.paintFigure(g, innerRect1.crop(paddingInset));
-	}
-
-	private String getBorderStyle(String edge) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			String property = MessageFormater
-					.format(BODER_QUERY_TEMPLETE, edge);
-			String borderStyle = style.getStyleProperty(property).toString();
-			return borderStyle;
-		}
-		return ICSSPropertyID.VAL_HIDDEN;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ListWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ListWidgetProvider.java
deleted file mode 100644
index 39e27b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ListWidgetProvider.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ListWidgetProvider extends AbstractWidgetProvider {
-	private static int DEFAULTSIZE = 4;
-
-	private static final int VERTICAL_PADDING = 6;
-
-	private static final int HORIZONTAL_PADDING = 12;
-
-	private static int ARRAWWIDTH = 16;
-
-	private static int ARROWHEIGHT = 16;
-
-	private String[] _options;
-
-	private int _rows = DEFAULTSIZE;
-
-	/**
-	 * @param style
-	 */
-	public ListWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(width, height, -1);
-	}
-
-	/**
-	 * by default, the combo's width will be calculated from the longest option
-	 * value.
-	 * 
-	 * @return the default width
-	 */
-	public int getDefaultWidth() {
-		int longestStringWidth = 0;
-		if (_options != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			Font swtFont = font.getSwtFont();
-			for (int i = 0; i < _options.length; i++) {
-				int width = FigureUtilities.getTextWidth(_options[i], swtFont);
-				if (width > longestStringWidth) {
-					longestStringWidth = width;
-				}
-			}
-		}
-		// text area width + borderWidth + vertical scroll width
-		return (longestStringWidth) + HORIZONTAL_PADDING + ARRAWWIDTH;
-	}
-
-	/**
-	 * 
-	 * @return the default height
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return (fontHeight) * _rows + VERTICAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		BorderUtil.drawBorder(g, rect.x, rect.y, rect.width, rect.height,
-				BORDERTHICK, true);
-		if (_options != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			Font swtfont = font.getSwtFont();
-			g.setFont(swtfont);
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			int fontHeight = FigureUtilities.getFontMetrics(swtfont)
-					.getHeight();
-			int x = rect.x + HORIZONTAL_PADDING / 2;
-			int y = rect.y + VERTICAL_PADDING / 2;
-
-			g.clipRect(rect);
-			for (int i = 0; i < _options.length
-					&& (i * fontHeight < rect.height - VERTICAL_PADDING); i++) {
-				g.drawString(_options[i], x, y);
-				y += fontHeight;
-			}
-			if (newColor != null) {
-				newColor.dispose();
-			}
-
-			int borderThick = 2;
-			Rectangle barRect = new Rectangle(rect.x, rect.y + borderThick,
-					rect.width - borderThick, rect.height - 2 * borderThick);
-			BorderUtil.drawVertialBar(g, ARRAWWIDTH, ARROWHEIGHT, borderThick,
-					barRect);
-		}
-	}
-
-	/**
-	 * @param string
-	 * @param x
-	 * @param y
-	 * @return
-	 */
-	private String normalize(String string) {
-		if (string == null) {
-			return ""; //$NON-NLS-1$
-		}
-		int index = string.indexOf('\r');
-		if (index >= 0) {
-			string = string.substring(0, index);
-		}
-		index = string.indexOf('\n');
-		if (index >= 0) {
-			string = string.substring(0, index);
-		}
-		return string;
-	}
-
-	/**
-	 * set the options to be displayed in this combo box.
-	 * 
-	 * @param options
-	 */
-	public void setOptions(String[] options) {
-		this._options = options;
-		if (_options != null) {
-			for (int i = 0; i < _options.length; i++) {
-				_options[i] = normalize(_options[i]);
-			}
-		}
-	}
-
-	/**
-	 * set the default number of rows to be displayed.
-	 * 
-	 * @param rows
-	 */
-	public void setRows(int rows) {
-		_rows = (rows > 0 ? rows : DEFAULTSIZE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java
deleted file mode 100644
index 980171f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RadioWidgetProvider extends AbstractWidgetProvider {
-	private boolean isChecked;
-
-	/**
-	 * @param style
-	 */
-	public RadioWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultWidth();
-		}
-		return new DimensionInfo(width, height, height * 4 / 5);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		int centerX = rect.x + rect.width / 2;
-		int centerY = rect.y + rect.height / 2;
-
-		// we always draw it as a circle.
-		int width = Math.min(rect.width, rect.height);
-		int cycleWidth = width * 3 / 5;
-
-		// FIXME: when the size of the radio is big, the line width may need
-		// calculate to be bigger.
-		int lineWidth = 2;
-		g.setLineWidth(lineWidth);
-
-		g.setForegroundColor(ColorConstants.buttonDarker);
-		g.drawArc(centerX - cycleWidth / 2, centerY - cycleWidth + 1,
-				cycleWidth, cycleWidth, 45, 180);
-
-		g.setForegroundColor(ColorConstants.button);
-		g.drawArc(centerX - cycleWidth / 2, centerY - cycleWidth + 1,
-				cycleWidth, cycleWidth, 225, 180);
-
-		// since the two cycle may not overlap very well, some space between
-		// them will be displayed.
-		// so we make the bigger cycle to be a little thicker.
-		cycleWidth += (2 * lineWidth - 2);
-		lineWidth += 1;
-
-		if (cycleWidth < width) {
-			g.setForegroundColor(ColorConstants.buttonDarkest);
-			g.drawArc(centerX - cycleWidth / 2, centerY - cycleWidth + 1,
-					cycleWidth, cycleWidth, 45, 180);
-		}
-
-		if (isChecked()) {
-			g.setBackgroundColor(ColorConstants.black);
-			g.fillArc(centerX - 1, centerY - cycleWidth / 2 - 1, 4, 4, 0, 360);
-		}
-	}
-
-	/**
-	 * @return the default width
-	 */
-	public final int getDefaultWidth() {
-		// FIXME: don't know the how to define the default width yet.
-		return 15;
-	}
-
-	/**
-	 * @return Returns the checked.
-	 */
-	public boolean isChecked() {
-		return isChecked;
-	}
-
-	/**
-	 * @param checked
-	 */
-	public void setChecked(boolean checked) {
-		this.isChecked = checked;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextAreaWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextAreaWidgetProvider.java
deleted file mode 100644
index 77aea65..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextAreaWidgetProvider.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextAreaWidgetProvider extends AbstractWidgetProvider {
-	private static final int DEFAULTCOLUMN = 20;
-
-	private static final int DEFAULTROWS = 2;
-
-	private static final int VERTICAL_PADDING = 2;
-
-	private static final int HORIZONTAL_PADDING = 2;
-
-	private static int ARRAWWIDTH = 16;
-
-	private static int ARROWHEIGHT = 16;
-
-	private int _columns = DEFAULTCOLUMN;
-
-	private int _rows = DEFAULTROWS;
-
-	private String _value;
-
-	/**
-	 * @param style
-	 */
-	public TextAreaWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(width, height, -1);
-	}
-
-	/**
-	 * @return
-	 */
-	private int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-
-		return (fontHeight) * _rows + VERTICAL_PADDING;
-	}
-
-	/**
-	 * @return
-	 */
-	private int getDefaultWidth() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-
-		int fontWidth = FigureUtilities.getFontMetrics(font.getSwtFont())
-				.getAverageCharWidth();
-		return _columns * fontWidth + ARRAWWIDTH + HORIZONTAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		if (_value != null) {
-			g.clipRect(rect);
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			int decoration = ((Integer) style
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
-					.intValue();
-			ICSSFont font = style.getCSSFont();
-			g.setFont(font.getSwtFont());
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-
-			Object textAlign = style
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
-			int begin = 0;
-			int end = 0;
-			int fontHeight = FigureUtilities.getFontMetrics(font.getSwtFont())
-					.getHeight();
-
-			int fontWidth = FigureUtilities.getFontMetrics(font.getSwtFont())
-					.getAverageCharWidth();
-			int columns = (rect.width - HORIZONTAL_PADDING) / fontWidth;
-
-			int i = 0;
-			while (true) {
-				int y = rect.y + VERTICAL_PADDING / 2 + fontHeight * i;
-				if (y >= rect.bottom()) {
-					break;
-				}
-				end += columns;
-				if (end > _value.length()) {
-					end = _value.length();
-				}
-				end = getTextCount(begin, end, g.getFont(), rect.width
-						- ARRAWWIDTH);
-
-				String text = _value.substring(begin, end);
-
-				int width = FigureUtilities.getTextWidth(text, g.getFont());
-				int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
-				g.drawString(text, x, y);
-
-				TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y,
-						width, fontHeight), decoration);
-				begin = end;
-
-				if (end == _value.length()) {
-					break;
-				}
-				i++;
-			}
-			if (newColor != null) {
-				newColor.dispose();
-			}
-		}
-		int borderThick = 2;
-		BorderUtil
-				.drawVertialBar(g, ARRAWWIDTH, ARROWHEIGHT, borderThick, rect);
-	}
-
-	private int getTextCount(int begin, int end, Font swtFont, int textWidth) {
-		while (FigureUtilities.getTextWidth(_value.substring(begin, end),
-				swtFont) > textWidth) {
-			end--;
-		}
-		return end;
-	}
-
-	/**
-	 * @param columns
-	 */
-	public void setColumns(int columns) {
-		this._columns = (columns > 0 ? columns : DEFAULTCOLUMN);
-	}
-
-	/**
-	 * @param rows
-	 */
-	public void setRows(int rows) {
-		this._rows = (rows > 0 ? rows : DEFAULTROWS);
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this._value = value;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextInputWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextInputWidgetProvider.java
deleted file mode 100644
index 966c5b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextInputWidgetProvider.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextInputWidgetProvider extends AbstractWidgetProvider {
-	private static final int VERTICAL_INCREMENT = 2;
-
-	/**
-	 * password size
-	 */
-	public static final int PWD_SIZE = 18;
-
-	private int DEFAULTSIZE = 20;
-
-	private int _size = DEFAULTSIZE;
-
-	private String _value;
-
-	/**
-	 * @param style
-	 */
-	public TextInputWidgetProvider(ICSSStyle style) {
-		this(style, 20);
-	}
-
-	/**
-	 * @param style
-	 * @param size
-	 */
-	public TextInputWidgetProvider(ICSSStyle style, int size) {
-		super(style);
-		DEFAULTSIZE = size;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(width, height, -1);
-	}
-
-	/**
-	 * @return
-	 */
-	private int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontSize = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return fontSize + VERTICAL_INCREMENT;
-	}
-
-	/**
-	 * @return the default width
-	 */
-	public int getDefaultWidth() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		return computeWidth(style.getCSSFont());
-	}
-
-	private int computeWidth(ICSSFont font) {
-		int fontWidth = FigureUtilities
-				.getTextWidth("abcde", font.getSwtFont());//$NON-NLS-1$
-		return (fontWidth + 1) * _size / 5;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		String value = getValue();
-		if (value != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			Object textAlign = style
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
-
-			Font font = style.getCSSFont().getSwtFont();
-			g.setFont(font);
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			g.clipRect(rect);
-			int width = FigureUtilities.getTextWidth(value, g.getFont());
-			int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
-			int y = rect.y + VERTICAL_INCREMENT / 2;
-
-			g.drawString(value, x, y);
-			TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y, width,
-					g.getFontMetrics().getHeight()), ((Integer) getCSSStyle()
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
-					.intValue());
-			if (newColor != null) {
-				newColor.dispose();
-			}
-		}
-	}
-
-	/**
-	 * set the value in this text input control
-	 * 
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this._value = value;
-	}
-
-	/**
-	 * @param size
-	 */
-	public void setSize(int size) {
-		this._size = (size <= 0 ? DEFAULTSIZE : size);
-	}
-
-	/**
-	 * get current value in this text input control
-	 * 
-	 * @return the value
-	 */
-	public String getValue() {
-		return _value;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/FeedBackInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/FeedBackInfo.java
deleted file mode 100644
index f405bbc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/FeedBackInfo.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd;
-
-/**
- * @author mengbo
- */
-public class FeedBackInfo {
-	private String _description;
-
-	private int _order;
-
-	/**
-	 * @param desc 
-	 * @param order 
-	 */
-	public FeedBackInfo(String desc, int order) {
-		this._description = desc;
-	}
-
-	/**
-	 * the description may be used in tooltip or wizard dialog selection to tell
-	 * user the effect of the drop.
-	 * 
-	 * @return the description
-	 */
-	public String getDescription() {
-		return _description;
-	}
-
-	/**
-	 * how important this feedback is. This information may be used when we
-	 * ordering the choices in the wizard.
-	 * 
-	 * range from 0-10, the bigger, the more important.
-	 * 
-	 * @return the order
-	 */
-	public int getOrder() {
-		return _order;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/ILocalDropHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/ILocalDropHandler.java
deleted file mode 100644
index 11378a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/ILocalDropHandler.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd;
-
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public interface ILocalDropHandler {
-	/**
-	 * whether this handler will use wizard for user to config detail
-	 * 
-	 * @return true if should use wizard
-	 */
-	public boolean useWizard();
-
-	/**
-	 * @param localData
-	 * @param viewer
-	 * @return true if should use wizard
-	 */
-	public boolean useWizard(Object localData, IHTMLGraphicalViewer viewer);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param widget
-	 * @return the feed back info
-	 */
-	public FeedBackInfo supportUpdateWidget(Object localData, Node widget);
-
-	/**
-	 * This method will only be called when <code>supportUpdateWidget</code>
-	 * return true and <code>useWizard</code> return true.
-	 * 
-	 * @param localData
-	 * @param widget
-	 * @param viewer
-	 * @return the wizard
-	 */
-	public IWizard getWizard(Object localData, Node widget,
-			IHTMLGraphicalViewer viewer);
-
-	/**
-	 * this method is called when the handler don't support wizard.
-	 * 
-	 * @param localData
-	 * @param widget
-	 * @param viewer
-	 */
-	public void doUpdateWidget(Object localData, Node widget,
-			IHTMLGraphicalViewer viewer);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param position
-	 * @return the feedback info
-	 */
-	public FeedBackInfo supportInsertElements(Object localData,
-			IDOMPosition position);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param position
-	 * @param viewer
-	 * @return the wizard
-	 */
-	public IWizard getWizard(Object localData, IDOMPosition position,
-			IHTMLGraphicalViewer viewer);
-
-	/**
-	 * @param localData
-	 * @param position
-	 * @param viewer
-	 */
-	public void doInsertElements(Object localData, IDOMPosition position,
-			IHTMLGraphicalViewer viewer);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/LocalDropRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/LocalDropRequest.java
deleted file mode 100644
index 47d140c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/LocalDropRequest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-
-/**
- * @author mengbo
- */
-public class LocalDropRequest extends Request implements DropRequest {
-	// XXX: need move this constant to somewhere else.
-	/**
-	 * the request name for local drops
-	 */
-	public static final String REQ_LOCAL_DROP = "Local Drop"; //$NON-NLS-1$
-
-	private Point _location;
-
-	private Object _localObject;
-
-	/**
-	 * 
-	 */
-	public LocalDropRequest() {
-		super(REQ_LOCAL_DROP);
-	}
-
-	/**
-	 * Returns the location of the object to be created.
-	 * 
-	 * @return the location
-	 */
-	public Point getLocation() {
-		return _location;
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		this._location = location;
-	}
-
-	/**
-	 * @return the  local object
-	 */
-	public Object getLocalObject() {
-		return _localObject;
-	}
-
-	/**
-	 * @param local
-	 */
-	public void setLocalObject(Object local) {
-		this._localObject = local;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceDropTargetListener.java
deleted file mode 100644
index 20af244..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceDropTargetListener.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.commands.PaletteDropInsertCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorDropTargetAdapter;
-
-/**
- * @author mengbo
- */
-public class DesignerSourceDropTargetListener extends
-		ExtendedEditorDropTargetAdapter implements
-		ITextEditorDropTargetListener {
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	/**
-	 * @param textEditor
-	 */
-	public DesignerSourceDropTargetListener(StructuredTextEditor textEditor) {
-		super(false);
-		_textEditor = textEditor;
-		setTextViewer(_textEditor.getTextViewer());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.ITextEditorDropTargetListener#getTransfers()
-	 */
-	public Transfer[] getTransfers() {
-		return new Transfer[] { TemplateTransfer.getInstance(),
-				TextTransfer.getInstance() };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOver(DropTargetEvent event) {
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-			if (TemplateTransfer.getInstance().isSupportedType(
-					event.currentDataType)) {
-				if (_textEditor.getTextViewer() != null) {
-						Point p = new Point(event.x, event.y);
-						SourceViewerDragDropHelper.getInstance().updateCaret(
-								_textEditor, p);
-						_location = text.getCaretOffset();
-						if (TemplateTransfer.getInstance().isSupportedType(
-								event.currentDataType)) {
-							_location = SourceViewerDragDropHelper.getInstance()
-									.getValidLocation(_textEditor, _location);
-						}
-						SourceViewerDragDropHelper.getInstance().showCaret(
-								_textEditor, _location);
-				    }
-		
-			} else if (TextTransfer.getInstance().isSupportedType(
-					event.currentDataType)) {
-				super.dragOver(event);
-				_location = text.getCaretOffset();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-		}
-		text.setCaretOffset(_location);
-		Command command = getCommand(event);
-		if (command == null) {
-			return;
-		}
-		command.execute();
-	}
-
-	private Command getCommand(DropTargetEvent event) {
-		if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
-			Object data = event.data;
-			if (data instanceof String) {
-				SourceViewLocalDropCommand command = new SourceViewLocalDropCommand(
-						_textEditor, data, _location);
-				return command;
-			}
-		} else if (TemplateTransfer.getInstance().isSupportedType(
-				event.currentDataType)) {
-			Object data = event.data;
-			PaletteDropInsertCommand command = null;
-			if (data instanceof IDropSourceData) {
-			    final IDropSourceData dropSourceData = (IDropSourceData) data;
-					// "Create new item"
-				command = new PaletteDropInsertCommand(
-						PageDesignerResources
-								.getInstance()
-								.getString(
-										"DesignerSourceDropTargetListener.InserCommandLabel"), _textEditor, dropSourceData, _location); //$NON-NLS-1$
-		    
-			}
-			return command;
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java
deleted file mode 100644
index a39dce5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.commands.PaletteDropInsertCommand;
-import org.eclipse.jst.pagedesigner.commands.SourceViewerCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceDataProvider;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorDropTargetAdapter;
-
-/**
- * @author mengbo
- */
-public class DesignerSourceMouseTrackAdapter extends
-		ExtendedEditorDropTargetAdapter implements MouseListener,
-		MouseMoveListener {
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	private EditDomain _domain;
-
-	/**
-	 * @param textEditor
-	 * @param domain
-	 */
-	public DesignerSourceMouseTrackAdapter(StructuredTextEditor textEditor,
-			EditDomain domain) {
-		super(false);
-		_textEditor = textEditor;
-		_domain = domain;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseMove(MouseEvent event) {
-		//Feedback is handled by DesignerSourceDropTargetListener - commenting out below
-		Object object = getPaletteObject();
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-		} else {
-			return;
-		}
-		if (object == null) {
-            // set to default cusror
-			text.setCursor(null);
-			return;
-		}
-		Point p = new Point(event.x, event.y);
-		p = _textEditor.getTextViewer().getTextWidget().toDisplay(p);
-		SourceViewerDragDropHelper.getInstance().updateCaret(_textEditor, p);
-		_location = text.getCaretOffset();
-		_location = SourceViewerDragDropHelper.getInstance().getValidLocation(
-				_textEditor, _location);
-		_location = SourceViewerDragDropHelper.getInstance().showCaret(
-				_textEditor, _location);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseUp(MouseEvent event) {
-		if (event.button != 1) {
-			if (_domain.getPaletteViewer() != null) {
-				_domain.getPaletteViewer().setActiveTool(null);
-			}
-			return;
-		}
-        SourceViewerCommand command = getCommand(event);
-        if (command != null) {
-        	command.execute();
-        	resetPalette();
-        }
-        _location = 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.palette.PaletteListener#activeToolChanged(org.eclipse.gef.ui.palette.PaletteViewer,
-	 *      org.eclipse.gef.palette.ToolEntry)
-	 */
-	private IDropSourceDataProvider getPaletteObject() {
-		if (_domain.getPaletteViewer() != null) {
-			Object tool = _domain.getPaletteViewer().getActiveTool();
-			if (tool instanceof IDropSourceDataProvider) {
-				return (IDropSourceDataProvider) tool;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseDoubleClick(MouseEvent e) {
-       // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseDown(MouseEvent e) {
-        // do nothing
-	}
-
-	private PaletteDropInsertCommand getCommand(MouseEvent event) {
-	    IDropSourceDataProvider data = getPaletteObject();
-		PaletteDropInsertCommand command = null;
-		if (data != null) {
-			// "Create new item"
-			command = new PaletteDropInsertCommand(
-					PageDesignerResources
-							.getInstance()
-							.getString(
-									"DesignerSourceDropTargetListener.InserCommandLabel"), //$NON-NLS-1$
-					_textEditor, data.getDropSourceData(), _location);
-		}
-		return command;
-	}
-
-	private void resetPalette() {
-		if (_domain.getPaletteViewer() != null) {
-			ToolEntry tool = _domain.getPaletteViewer().getPaletteRoot()
-					.getDefaultEntry();
-			if (tool != null) {
-				_domain.getPaletteViewer().setActiveTool(tool);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java
deleted file mode 100644
index 9b0cfbf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.Map;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DropSelectionWizard extends Wizard {
-	private final String INTIAL_DEFAULT_PAGE_IMAGE = "newsuade_wiz.gif"; //$NON-NLS-1$
-
-	private Object _localData;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private Map _feedbackToHandlers;
-
-	private boolean _updateWidget;
-
-	private Node _widget;
-
-	private IDOMPosition _position;
-
-	private SimpleWizardSelectionPage _firstPage;
-
-	private DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers) {
-		this.setWindowTitle(Messages.getString("DropSelectionWizard.Title")); //$NON-NLS-1$
-		ImageDescriptor desc = PDPlugin.getDefault().getImageDescriptor(
-				INTIAL_DEFAULT_PAGE_IMAGE);
-		setDefaultPageImageDescriptor(desc);
-		this._viewer = viewer;
-		this._localData = localData;
-		this._feedbackToHandlers = handlers;
-
-		_firstPage = new SimpleWizardSelectionPage(_viewer, _localData,
-				_feedbackToHandlers);
-	}
-
-	/**
-	 * @param viewer 
-	 * @param localData 
-	 * @param handlers 
-	 * @param widget 
-	 */
-	public DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers, Node widget) {
-		this(viewer, localData, handlers);
-		_updateWidget = true;
-		_widget = widget;
-
-		_firstPage.setWidget(widget);
-	}
-
-	/**
-	 * @param viewer
-	 * @param localData
-	 * @param handlers
-	 * @param position
-	 */
-	public DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers, IDOMPosition position) {
-		this(viewer, localData, handlers);
-		_updateWidget = false;
-		_position = position;
-
-		_firstPage.setPosition(position);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		addPage(_firstPage);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#needsPreviousAndNextButtons()
-	 */
-	public boolean needsPreviousAndNextButtons() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#canFinish()
-	 */
-	public boolean canFinish() {
-		if (getContainer().getCurrentPage() == _firstPage) {
-			Object obj = _firstPage.getCurrentHandler();
-			if (obj instanceof ILocalDropHandler)
-            {
-				return true;
-            }
-            return false;
-		}
-        return super.canFinish();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		if (getContainer().getCurrentPage() == _firstPage) {
-			Object obj = _firstPage.getCurrentHandler();
-			if (obj instanceof ILocalDropHandler) {
-				ILocalDropHandler handler = (ILocalDropHandler) obj;
-				if (_updateWidget) {
-					handler.doUpdateWidget(_localData, _widget, _viewer);
-				} else {
-					handler.doInsertElements(_localData, _position, _viewer);
-				}
-				return true;
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropCommand.java
deleted file mode 100644
index d1eaf86..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropCommand.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.Map;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.w3c.dom.Node;
-
-/**
- * This is the command that performs the drop operation. There is no need for
- * this command to go into command stack, it simply open wizards, and let
- * wizards to handle the remaining things.
- * 
- * @author mengbo
- */
-public class LocalDropCommand extends Command {
-	/**
-	 * the map from feedback to ILocalDropHandler
-	 */
-	private Map _feedbackToHandlers;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private Object _localObject;
-
-	private Node _widget;
-
-	private IDOMPosition _position;
-
-	/**
-	 * constructor
-	 * @param viewer 
-	 * @param localObject 
-	 * @param feedbackHandlers 
-	 */
-	public LocalDropCommand(IHTMLGraphicalViewer viewer, Object localObject,
-			Map feedbackHandlers) {
-		_viewer = viewer;
-		_localObject = localObject;
-		_feedbackToHandlers = feedbackHandlers;
-	}
-
-	/**
-	 * @param widget
-	 */
-	public void setWidget(Node widget) {
-		_widget = widget;
-	}
-
-	/**
-	 * @param position
-	 */
-	public void setDOMPosition(IDOMPosition position) {
-		_position = position;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		if (_feedbackToHandlers.size() == 1) {
-			// only have one choice.
-			ILocalDropHandler handler = (ILocalDropHandler) _feedbackToHandlers
-					.values().toArray()[0];
-			if (handler.useWizard(_localObject, _viewer)) {
-				IWizard wizard;
-				if (_widget != null) {
-					wizard = handler.getWizard(_localObject, _widget, _viewer);
-				} else {
-					wizard = handler
-							.getWizard(_localObject, _position, _viewer);
-				}
-				CommonWizardDialog wizardDialog = new CommonWizardDialog(
-						getShell(), wizard);
-				wizardDialog.setTitle(Messages
-						.getString("LocalDropCommand.DropHandler")); //$NON-NLS-1$
-				wizardDialog.create();
-				wizardDialog.open();
-			} else {
-				if (_widget != null) {
-					handler.doUpdateWidget(_localObject, _widget, _viewer);
-				} else {
-					handler.doInsertElements(_localObject, _position, _viewer);
-				}
-			}
-		} else {
-			CommonWizardDialog wizardDialog = new CommonWizardDialog(
-					getShell(), getWizard());
-			wizardDialog.setTitle(Messages
-					.getString("LocalDropCommand.DropHandler")); //$NON-NLS-1$
-			wizardDialog.setBlockOnOpen(false);
-			wizardDialog.create();
-			wizardDialog.open();
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	private IWizard getWizard() {
-		if (_widget != null) {
-			return new DropSelectionWizard(_viewer, _localObject,
-					_feedbackToHandlers, _widget);
-		}
-        return new DropSelectionWizard(_viewer, _localObject,
-        		_feedbackToHandlers, _position);
-	}
-
-	/**
-	 * @return
-	 */
-	private Shell getShell() {
-		return _viewer.getControl().getShell();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java
deleted file mode 100644
index 5076d6c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.jst.pagedesigner.dnd.FeedBackInfo;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editpolicies.LocationHelper;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * This is the editpolicy to handle LocalSelectionDrop
- * 
- * @author mengbo
- */
-public class LocalDropEditPolicy extends GraphicalEditPolicy {
-	private RectangleFigure _feedbackFigure;
-
-	// indicate whether update is checked
-	private static boolean _checkUpdate = true;
-
-	/**
-	 * @param widgetEditPart
-	 * @param request
-	 * @param results
-	 * @return true if should update widget
-	 */
-	public boolean checkUpdateWidget(EditPart widgetEditPart,
-			LocalDropRequest request, Map results) {
-		if (!(widgetEditPart instanceof ElementEditPart)) {
-			return false;
-		}
-		Node widget = ((ElementEditPart) widgetEditPart).getIDOMNode();
-		ILocalDropHandler[] handlers = RegistryReader.getAllHandlers();
-		Object localData = request.getLocalObject();
-		for (int i = 0; i < handlers.length; i++) {
-			FeedBackInfo feedback = handlers[i].supportUpdateWidget(localData,
-					widget);
-			if (feedback != null) {
-				results.put(feedback, handlers[i]);
-			}
-		}
-		return !results.isEmpty();
-	}
-
-	/**
-	 * @param request
-	 * @param host
-	 * @param results
-	 * @param dpHolder
-	 * @param position
-	 * @return true if should insert element
-	 */
-	public boolean checkInsertElement(LocalDropRequest request,
-			EditPart[] host, Map results, DesignPosition[] dpHolder,
-			IDOMPosition[] position) {
-		DesignPosition designPosition = EditPartPositionHelper
-		    .findEditPartPosition(host[0], request.getLocation(),
-		        new DnDPositionValidator(new ActionData(
-		            ActionData.DATABINDING_DND, request)));
-		dpHolder[0] = designPosition;
-		if (designPosition == null) {
-			return false;
-		}
-
-		host[0] = designPosition.getContainerPart();
-		position[0] = DOMPositionHelper.toDOMPosition(designPosition);
-		ILocalDropHandler[] handlers = RegistryReader.getAllHandlers();
-		Object localData = request.getLocalObject();
-		for (int i = 0; i < handlers.length; i++) {
-			FeedBackInfo feedback = handlers[i].supportInsertElements(
-					localData, position[0]);
-			if (feedback != null) {
-				results.put(feedback, handlers[i]);
-			}
-		}
-		return !results.isEmpty();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof LocalDropRequest) {
-			LocalDropRequest r = (LocalDropRequest) request;
-			EditPart host = getHost();
-			if (_checkUpdate && checkUpdateWidget(host, r, new HashMap())) {
-				return host;
-			}
-			EditPart[] hostHolder = new EditPart[] { host };
-			if (checkInsertElement(r, hostHolder, new HashMap(),
-					new DesignPosition[1], new IDOMPosition[1])) {
-				return hostHolder[0];
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof LocalDropRequest) {
-			LocalDropRequest r = (LocalDropRequest) request;
-			EditPart host = getHost();
-
-			Map result = new HashMap();
-			if (_checkUpdate && checkUpdateWidget(host, r, result)) {
-				LocalDropCommand command = new LocalDropCommand(
-						getViewer(host), r.getLocalObject(), result);
-				command.setWidget(((NodeEditPart) host).getIDOMNode());
-				return command;
-			}
-			result.clear();
-
-			EditPart[] hostHolder = new EditPart[] { host };
-			IDOMPosition[] positionHolder = new IDOMPosition[1];
-			if (checkInsertElement(r, hostHolder, result,
-					new DesignPosition[1], positionHolder)) {
-				LocalDropCommand command = new LocalDropCommand(
-						getViewer(host), r.getLocalObject(), result);
-				command.setDOMPosition(positionHolder[0]);
-				return command;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param host
-	 * @return
-	 */
-	private IHTMLGraphicalViewer getViewer(EditPart host) {
-		return (IHTMLGraphicalViewer) ((GraphicalEditPart) host).getViewer();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void eraseTargetFeedback(Request request) {
-		if (_feedbackFigure != null) {
-			removeFeedback(_feedbackFigure);
-			_feedbackFigure = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) {
-		if (request instanceof LocalDropRequest) {
-			LocalDropRequest r = (LocalDropRequest) request;
-			EditPart host = getHost();
-			if (_checkUpdate && checkUpdateWidget(host, r, new HashMap())) {
-				Rectangle rect = LocationHelper
-						.getAbsoluteBounds((GraphicalEditPart) host);
-				showFeedbackRect(rect);
-				return;
-			}
-			EditPart[] hostHolder = new EditPart[] { host };
-			DesignPosition[] holder = new DesignPosition[1];
-			if (checkInsertElement(r, hostHolder, new HashMap(), holder,
-					new IDOMPosition[1])) {
-				Rectangle rect = EditPartPositionHelper
-						.convertToAbsoluteCaretRect(holder[0]);
-				showFeedbackRect(rect);
-				if (getHost() instanceof GraphicalEditPart) {
-					ExposeHelper exposeHelper = new ExposeHelper(
-							getViewer(getHost()));
-					exposeHelper.adjustVertical(r.getLocation());
-				}
-				return;
-			}
-		}
-	}
-
-	/**
-	 * @return the feedback figure
-	 */
-	protected RectangleFigure getFeedbackFigure() {
-		if (_feedbackFigure == null) {
-			_feedbackFigure = new RectangleFigure();
-			_feedbackFigure.setFill(true);
-			_feedbackFigure.setOutline(true);
-			_feedbackFigure.setLineWidth(1);
-			_feedbackFigure.setForegroundColor(ColorConstants.red);
-			_feedbackFigure.setBounds(new Rectangle(0, 0, 0, 0));
-			_feedbackFigure.setXOR(true);
-			addFeedback(_feedbackFigure);
-		}
-		return _feedbackFigure;
-	}
-
-	/**
-	 * @param rect
-	 */
-	protected void showFeedbackRect(Rectangle rect) {
-		RectangleFigure pf = getFeedbackFigure();
-		pf.translateToRelative(rect);
-		pf.setBounds(rect);
-	}
-
-	/**
-	 * @return Returns the _forUpdate.
-	 */
-	public static boolean isCheckUpdate() {
-		return _checkUpdate;
-	}
-
-	/**
-	 * @param update
-	 *            The _forUpdate to set.
-	 */
-	public static void setCheckUpdate(boolean update) {
-		_checkUpdate = update;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java
deleted file mode 100644
index e09ff35..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-
-
-/**
- * @author mengbo
- */
-public class LocalSelectionDropTargetListener extends
-		AbstractTransferDropTargetListener {
-	/**
-	 * @param viewer
-	 */
-	public LocalSelectionDropTargetListener(EditPartViewer viewer) {
-		super(viewer, LocalSelectionTransfer.getTransfer());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		LocalDropRequest request = new LocalDropRequest();
-		request.setLocation(getDropLocation());
-		request.setLocalObject(getCurrentLocalObject());
-		return request;
-	}
-
-	/**
-	 * @return the current local object
-	 */
-	private Object getCurrentLocalObject() {
-		ISelection sel = LocalSelectionTransfer.getTransfer().getSelection();
-		if (sel instanceof IStructuredSelection) {
-			return ((IStructuredSelection) sel).getFirstElement();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		LocalDropRequest dropRequest = (LocalDropRequest) getTargetRequest();
-		dropRequest.setLocation(getDropLocation());
-		dropRequest.setLocalObject(getCurrentLocalObject());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#setCurrentEvent(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void setCurrentEvent(DropTargetEvent currentEvent) {
-		super.setCurrentEvent(currentEvent);
-		if (currentEvent != null) {
-			if (currentEvent.detail != DND.DROP_NONE) {
-				currentEvent.detail = DND.DROP_COPY;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		// switch the insert or update
-		if ((event.detail & (DND.DROP_COPY)) != 0) {
-			LocalDropEditPolicy.setCheckUpdate(false);
-		} else {
-			LocalDropEditPolicy.setCheckUpdate(true);
-		}
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		String path = ((IHTMLGraphicalViewer) getViewer()).getModel()
-				.getBaseLocation();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRoot root = workspace.getRoot();
-		IPath filePath = new Path(path);
-		if (root.getFile(filePath).exists()) {
-			getViewer().getControl().setFocus();
-			super.drop(event);
-			LocalDropEditPolicy.setCheckUpdate(true);
-		} else {
-			Alerts alert = PDPlugin.getAlerts();
-			alert.info("LocalSelectionDropTargetListener.MessageDialog.Title", //$NON-NLS-1$
-					"LocalSelectionDropTargetListener.MessageDialog.Message"); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java
deleted file mode 100644
index f7baa6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * A message bundle for dnd
- *
- */
-/*package*/ class Messages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.dnd.internal.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private Messages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the message for key
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java
deleted file mode 100644
index 8e85193..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.DropCustomizationController;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PDTemplateTransferDropTargetListener extends
-		AbstractTransferDropTargetListener {
-
-	/**
-	 * @param viewer
-	 */
-	public PDTemplateTransferDropTargetListener(EditPartViewer viewer) {
-		super(viewer, TemplateTransfer.getInstance());
-	}
-
-	/**
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		ItemCreationRequest request = new ItemCreationRequest();
-		/*TODO: nothing is done with this var.  Does the method have a side-effect? TagToolPaletteEntry tagItem =*/TemplateTransfer.getInstance().getTemplate();
-		return request;
-	}
-
-	/**
-	 * A helper method that casts the target Request to a CreateRequest.
-	 * 
-	 * @return CreateRequest
-	 */
-	protected final Request getCreateRequest() {
-		return getTargetRequest();
-	}
-
-	/**
-	 * The purpose of a template is to be copied. Therefore, the drop operation
-	 * can't be anything but <code>DND.DROP_COPY</code>.
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDragOperationChanged()
-	 */
-	protected void handleDragOperationChanged() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		super.handleDragOperationChanged();
-	}
-
-	/**
-	 * The purpose of a template is to be copied. Therefore, the Drop operation
-	 * is set to <code>DND.DROP_COPY</code> by default.
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#handleDragOver()
-	 */
-	protected void handleDragOver() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
-		super.handleDragOver();
-	}
-
-	/**
-	 * Assumes that the target request is a {@link org.eclipse.gef.requests.CreateRequest}.
-	 */
-	protected void updateTargetRequest() {
-		// We should never see request that is not of ItemCreationRequest type,
-		// but there is an error case that Eclipse send out other types
-		// requests.
-		// Add this test to avoid potential error.
-		if (getCreateRequest() instanceof ItemCreationRequest) {
-			ItemCreationRequest request = (ItemCreationRequest) getCreateRequest();
-            Object transferObj = TemplateTransfer.getInstance().getObject();
-            
-            if (transferObj instanceof IDropSourceData)
-            {
-                request.setTagCreationProvider((IDropSourceData) transferObj);
-                request.setLocation(getDropLocation());
-            }
-            else
-            {
-                PDPlugin.getLogger(this.getClass()).error("Unexpected transfer object on palette drag:"+transferObj, new Throwable("Artificial throwable for stack tracing")); //$NON-NLS-1$ //$NON-NLS-2$
-            }
-		}
-	}
-
-	public void drop(DropTargetEvent event) {
-		if (getCreateRequest() instanceof ItemCreationRequest) {
-			getViewer().getControl().setFocus();
-			super.drop(event);
-		}
-	}
-
-    @Override
-    protected void handleDrop()
-    {
-        // copied from AbstractTransferDropListener and modified for drop 
-        // customization
-        updateTargetRequest();
-        updateTargetEditPart();
-
-        if (getTargetEditPart() != null) {
-            Command command = getCommand();
-            if (command != null && command.canExecute())
-                if (customizeAndCheckExecute(command))
-                {
-                    getViewer().getEditDomain().getCommandStack().execute(command);
-                }
-            else
-                getCurrentEvent().detail = DND.DROP_NONE;
-        } else
-            getCurrentEvent().detail = DND.DROP_NONE;
-    }
-
-    private boolean customizeAndCheckExecute(final Command command)
-    {
-        if (command instanceof CreateItemCommand)
-        {
-            final ItemCreationRequest request = (ItemCreationRequest) getCreateRequest();
-            final CreateItemCommand createCommand = (CreateItemCommand) command;
-            final IStatus status  = 
-                new DropCustomizationController(createCommand, request.getTagCreationProvider(), createCommand.getDocument(), createCommand.getPosition())
-                    .performCustomization();
-            
-            return status.getSeverity() == IStatus.OK;
-        }
-        // don't block a drop if the command is not customizable
-        return true;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java
deleted file mode 100644
index 9b38e70..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-
-/**
- * Read the registry to find out all the LocalDropHandlers.
- * 
- * @author mengbo
- */
-public class RegistryReader {
-	final private static Logger _log = PDPlugin.getLogger(RegistryReader.class);
-
-	private static ILocalDropHandler[] _handlers = null;
-
-	/**
-	 * @return all registered drop handlers
-	 */
-	public static synchronized ILocalDropHandler[] getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return _handlers;
-
-	}
-
-	private static ILocalDropHandler[] readAllHandlers() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] dropHandlers = ext
-					.getConfigurationElements();
-
-			for (int j = 0; j < dropHandlers.length; j++) {
-				if (dropHandlers[j].getName().equals(
-						IJMTConstants.LOCAL_DROP_HANDLER)) {
-					dropHandlers[j].getAttribute("class"); //$NON-NLS-1$
-					Object obj;
-					try {
-						obj = dropHandlers[j]
-								.createExecutableExtension("class"); //$NON-NLS-1$
-
-						if (obj instanceof ILocalDropHandler) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						_log.info("CoreException", e); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		ILocalDropHandler[] ret = new ILocalDropHandler[result.size()];
-		result.toArray(ret);
-		return ret;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java
deleted file mode 100644
index 873c641..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.FileTransfer;
-
-/**
- * The drop target listener for DnD from Windows explorer.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ResouceDropTargetListener extends
-		AbstractTransferDropTargetListener {
-
-	/**
-	 * @param viewer
-	 */
-	public ResouceDropTargetListener(EditPartViewer viewer) {
-		super(viewer, FileTransfer.getInstance());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		LocalDropRequest request = new LocalDropRequest();
-		request.setLocation(getDropLocation());
-		request.setLocalObject(getCurrentLocalObject());
-		return request;
-	}
-
-	private Object getCurrentLocalObject() {
-		Object result = null;
-		try {
-			Object data = ((FileTransfer) getTransfer())
-					.nativeToJava(getCurrentEvent().currentDataType);
-			if (data instanceof String[]) {
-				result = ((String[]) data)[0];
-			}
-		} catch (Exception e) {
-			// Don't know the tag type.
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		LocalDropRequest dropRequest = (LocalDropRequest) getTargetRequest();
-		dropRequest.setLocation(getDropLocation());
-		dropRequest.setLocalObject(getCurrentLocalObject());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#setCurrentEvent(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void setCurrentEvent(DropTargetEvent currentEvent) {
-		super.setCurrentEvent(currentEvent);
-		if (currentEvent != null) {
-			if (currentEvent.detail != DND.DROP_NONE) {
-				currentEvent.detail = DND.DROP_COPY;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		// switch the insert or update
-		if ((event.detail & (DND.DROP_COPY)) != 0) {
-			LocalDropEditPolicy.setCheckUpdate(false);
-		} else {
-			LocalDropEditPolicy.setCheckUpdate(true);
-		}
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		getViewer().getControl().setFocus();
-		super.drop(event);
-		LocalDropEditPolicy.setCheckUpdate(true);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SimpleWizardSelectionPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SimpleWizardSelectionPage.java
deleted file mode 100644
index c507c2a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SimpleWizardSelectionPage.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardNode;
-import org.eclipse.jface.wizard.WizardSelectionPage;
-import org.eclipse.jst.pagedesigner.dnd.FeedBackInfo;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.w3c.dom.Node;
-
-/**
- * UI wizard selection page. To let user select which ILocalDropHandler to use
- * to handle the drop.
- * 
- * @author mengbo
- */
-public class SimpleWizardSelectionPage extends WizardSelectionPage implements
-		ISelectionChangedListener {
-	private Object _localData;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private boolean _updateWidget;
-
-	private Node _widget;
-
-	private IDOMPosition _position;
-
-	/**
-	 * for those handler that support wizard, then map to WizardNode, otherwise
-	 * still map to the handler
-	 */
-	private Map _objToWizardNodeOrHandler = new HashMap();
-
-	private Map _feedbackToHandlers;
-
-	private Object _currentHandler = null; // IWizardNode or a
-
-	// ILocalDropHandler that don't
-	// useWizard.
-
-	/**
-	 * @param viewer 
-	 * @param localData 
-	 * @param handlers 
-	 */
-	public SimpleWizardSelectionPage(IHTMLGraphicalViewer viewer,
-			Object localData, Map handlers) {
-		super(Messages.getString("SimpleWizardSelectionPage.PageName")); //$NON-NLS-1$
-		this.setTitle(Messages.getString("SimpleWizardSelectionPage.Title")); //$NON-NLS-1$
-		this.setDescription(Messages
-				.getString("SimpleWizardSelectionPage.Description")); //$NON-NLS-1$
-		this
-				.setMessage(Messages
-						.getString("SimpleWizardSelectionPage.Message")); //$NON-NLS-1$
-
-		this._viewer = viewer;
-		this._localData = localData;
-		this._feedbackToHandlers = handlers;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.verticalSpacing = 10;
-		container.setLayout(layout);
-		container.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		Label label = new Label(container, SWT.NONE);
-		label
-				.setText(Messages
-						.getString("SimpleWizardSelectionPage.Operation")); //$NON-NLS-1$
-		GridData gd = new GridData();
-		label.setLayoutData(gd);
-
-		final ListViewer listViewer = new ListViewer(container);
-		listViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		listViewer.setContentProvider(new IStructuredContentProvider() {
-			public Object[] getElements(Object inputElement) {
-				return ((List) inputElement).toArray();
-			}
-
-			public void dispose() {
-                // nothing to dispose
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-                // no input changing
-			}
-		});
-		listViewer.setLabelProvider(new LabelProvider() {
-			public String getText(Object element) {
-				return SimpleWizardSelectionPage.this.getText(element);
-			}
-		});
-		listViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				selectionChanged(new SelectionChangedEvent(listViewer,
-						listViewer.getSelection()));
-				advanceToNextPage();
-			}
-		});
-		listViewer.setSorter(new ViewerSorter());
-		listViewer.setInput(getElements());
-		listViewer.addSelectionChangedListener(this);
-		Dialog.applyDialogFont(container);
-		setControl(container);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		ISelection sel = event.getSelection();
-		if (sel instanceof IStructuredSelection) {
-			Object obj = ((IStructuredSelection) sel).getFirstElement();
-			if (obj != null) {
-				_currentHandler = this._objToWizardNodeOrHandler.get(obj);
-				if (_currentHandler == null) {
-					_currentHandler = getWizardNodeOrHandler(obj);
-					this._objToWizardNodeOrHandler.put(obj, _currentHandler);
-				}
-
-				if (_currentHandler instanceof IWizardNode) {
-					this.setSelectedNode((IWizardNode) _currentHandler);
-				} else {
-					this.getWizard().getContainer().updateButtons();
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param obj
-	 * @return
-	 */
-	private Object getWizardNodeOrHandler(Object obj) {
-		final ILocalDropHandler dropHandler = (ILocalDropHandler) _feedbackToHandlers
-				.get(obj);
-		if (dropHandler.useWizard(_localData, _viewer)) {
-			return new IWizardNode() {
-				IWizard _wizard = null;
-
-				public void dispose() {
-                    // nothing to dispose
-				}
-
-				public Point getExtent() {
-					return null;
-				}
-
-				public IWizard getWizard() {
-					if (_wizard == null) {
-						if (_updateWidget) {
-							_wizard = dropHandler.getWizard(_localData,
-									_widget, _viewer);
-						} else {
-							_wizard = dropHandler.getWizard(_localData,
-									_position, _viewer);
-						}
-					}
-					return _wizard;
-				}
-
-				public boolean isContentCreated() {
-					return _wizard != null;
-				}
-			};
-		}
-        return dropHandler;
-	}
-
-	/**
-	 * could be have next page or just directly perform the action.
-	 * 
-	 */
-	public void advanceToNextPage() {
-
-		getContainer().showPage(getNextPage());
-	}
-
-	/**
-	 * @param element
-	 * @return the text
-	 */
-	protected String getText(Object element) {
-		return ((FeedBackInfo) element).getDescription();
-	}
-
-	/**
-	 * @return the elements
-	 */
-	protected List getElements() {
-		return new ArrayList(this._feedbackToHandlers.keySet());
-	}
-
-	/**
-	 * @param widget
-	 */
-	public void setWidget(Node widget) {
-		_updateWidget = true;
-		_widget = widget;
-	}
-
-	/**
-	 * @param position
-	 */
-	public void setPosition(IDOMPosition position) {
-		_updateWidget = false;
-		_position = position;
-	}
-
-	/**
-	 * @return the current handler
-	 */
-	public Object getCurrentHandler() {
-		return _currentHandler;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.WizardSelectionPage#canFlipToNextPage()
-	 */
-	public boolean canFlipToNextPage() {
-		return getCurrentHandler() instanceof IWizardNode
-				&& super.canFlipToNextPage();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewLocalDropCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewLocalDropCommand.java
deleted file mode 100644
index b4e7fd4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewLocalDropCommand.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.jst.pagedesigner.commands.SourceViewerCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * @author mengbo
- */
-public class SourceViewLocalDropCommand extends SourceViewerCommand {
-	/**
-	 * the map from feedback to ILocalDropHandler
-	 */
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	private Object _data;
-
-	/**
-	 * @param textEditor 
-	 * @param data 
-	 * @param location 
-	 * 
-	 */
-	public SourceViewLocalDropCommand(StructuredTextEditor textEditor,
-			Object data, int location) {
-		super(PageDesignerResources.getInstance().getString(
-				"SourceViewLocalDropCommand.Label.InsertSyntax"), textEditor); //$NON-NLS-1$
-		_textEditor = textEditor;
-		_data = data;
-		_location = location;
-	}
-
-	public void doExecute() {
-		_textEditor.getTextViewer().getTextWidget().insert((String) _data);
-	}
-
-	public void setSelection() {
-		_textEditor.getTextViewer().setSelectedRange(_location,
-				((String) _data).length());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewerDragDropHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewerDragDropHelper.java
deleted file mode 100644
index dc44b11..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewerDragDropHelper.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ST;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * This class will 1. determine it's insertion or update 2. call validator
- * corresponding helper to resolve it.
- * 
- * @author mengbo
- */
-public final class SourceViewerDragDropHelper {
-	private static SourceViewerDragDropHelper _instance;
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static SourceViewerDragDropHelper getInstance() {
-		if (_instance == null) {
-			_instance = new SourceViewerDragDropHelper();
-		}
-		return _instance;
-	}
-
-	private SourceViewerDragDropHelper()
-	{
-	    // singleton, no external instantiation
-	}
-	
-	private Point toControl(TextViewer textViewer, Point point) {
-		return (textViewer != null ? textViewer.getTextWidget()
-				.toControl(point) : point);
-	}
-
-	private int getDropOffset(StructuredTextEditor ste, Point pt) {
-		StyledText st = ste.getTextViewer().getTextWidget();
-		int offset = st.getCaretOffset();
-		try {
-			offset = st.getOffsetAtLocation(pt);
-		} catch (IllegalArgumentException e) {
-			boolean found = false;
-			Point p = new Point((pt.x > 0 ? pt.x : 0), pt.y);
-			// search nearest character
-			for (; p.x > -1; p.x--) {
-				try {
-					offset = st.getOffsetAtLocation(p);
-
-					/*
-					 * Now that a valid offset has been found, try to place at
-					 * the end of the line
-					 */
-					if (ste.getTextViewer() != null
-							&& ste.getTextViewer().getDocument() != null) {
-						IRegion lineInfo = null;
-						try {
-							lineInfo = ste.getTextViewer().getDocument()
-									.getLineInformationOfOffset(offset);
-						} catch (BadLocationException e1) {
-                            // ignore exception and fall-through with lineInfo == null
-						}
-						if (lineInfo != null)
-							offset = lineInfo.getOffset()
-									+ lineInfo.getLength();
-					}
-
-					found = true;
-					break;
-				} catch (IllegalArgumentException ex) {
-					// for trying location, no need to catch.
-				}
-			}
-			if (!found) {
-				offset = st.getCharCount();
-			}
-		}
-		return offset;
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 * @param caret
-	 */
-	public void updateCaret(StructuredTextEditor textEditor, Point location,
-			Point caret) {
-		TextViewer textViewer = textEditor.getTextViewer();
-		if (textViewer != null) {
-			Point pt = toControl(textViewer, location);
-			StyledText st = textViewer.getTextWidget();
-
-			// auto scroll
-			Rectangle ca = st.getClientArea();
-			int margin = st.getLineHeight();
-
-			if (pt.y < margin) { // up
-				st.invokeAction(ST.LINE_UP);
-			} else if (pt.y > ca.height - margin) { // down
-				st.invokeAction(ST.LINE_DOWN);
-			}
-
-			// draw insertion point
-			int offset = getDropOffset(textEditor, pt);
-			if (offset != st.getCaretOffset()) {
-				st.setCaretOffset(offset);
-				st.setSelection(offset);
-			}
-
-			Point newCaret = st.getLocationAtOffset(offset);
-			if (newCaret.equals(caret)) {
-				return;
-			}
-
-			Caret ct = st.getCaret();
-			Point size = ct.getSize();
-
-			GC gc = new GC(st);
-			//gc.setXORMode(true);
-			gc.setLineWidth(size.x);
-
-			// erase old caret
-			if (caret != null) {
-				Color originalForeground = gc.getForeground();
-				gc.setForeground(st.getBackground());
-				gc.drawLine(caret.x, caret.y, caret.x, caret.y + size.y);
-				gc.setForeground(originalForeground);
-			}
-
-			st.redraw();
-			st.update();
-
-			// draw new caret
-			if (caret == null) {
-				caret = newCaret;
-			} else {
-				caret.x = newCaret.x;
-				caret.y = newCaret.y;
-			}
-			if (ct.getImage() != null) {
-				gc.drawImage(ct.getImage(), caret.x, caret.y);
-			} else {
-				gc.drawLine(caret.x, caret.y, caret.x, caret.y + size.y);
-			}
-
-			gc.dispose();
-		}
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 */
-	public void updateCaret(StructuredTextEditor textEditor, Point location) {
-		TextViewer textViewer = textEditor.getTextViewer();
-		if (textViewer != null) {
-			Point pt = toControl(textViewer, location);
-			StyledText st = textViewer.getTextWidget();
-
-			// auto scroll
-			Rectangle ca = st.getClientArea();
-			int margin = st.getLineHeight();
-
-			if (pt.y < margin) { // up
-				st.invokeAction(ST.LINE_UP);
-			} else if (pt.y > ca.height - margin) { // down
-				st.invokeAction(ST.LINE_DOWN);
-			}
-
-			// draw insertion point
-			int offset = getDropOffset(textEditor, pt);
-			if (offset != st.getCaretOffset()) {
-				st.setCaretOffset(offset);
-				st.setSelection(offset);
-			}
-		}
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 * @return the caret offset
-	 */
-	public int showCaret(StructuredTextEditor textEditor, int location) {
-		StyledText text = textEditor.getTextViewer().getTextWidget();
-		text.setCursor(SharedCursors.CURSOR_TREE_ADD);
-		text.setCaretOffset(location);
-		if (!text.isFocusControl()) {
-			text.setFocus();
-		}
-		return text.getCaretOffset();
-	}
-
-	/**
-	 * @param node
-	 * @return the model query for the node or null if not available
-	 */
-	protected ModelQuery getModelQuery(Node node) {
-		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-			return ModelQueryUtil.getModelQuery((Document) node);
-		}
-        return ModelQueryUtil.getModelQuery(node.getOwnerDocument());
-	}
-
-	/**
-	 * @param caretPos
-	 * @param element
-	 * @return the position 
-	 */
-	public IDOMPosition findPosition(int caretPos, Node element) {
-		EditValidateUtil.validNode(element);
-		IDOMPosition position = EditModelQuery.getInstance().createDomposition(
-				((IDOMNode) element).getModel(), caretPos, false);
-		return position;
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 */
-	public void format(TextViewer viewer, Node node) {
-		if (node == null) {
-			return;
-		}
-		Node tmp;
-		int start, offset;
-		if (node.getPreviousSibling() != null) {
-			tmp = node.getPreviousSibling();
-			start = ((IndexedRegion) tmp).getEndOffset();
-		} else {
-			tmp = node;
-			start = ((IndexedRegion) tmp).getStartOffset();
-		}
-		if (node.getNextSibling() != null) {
-			tmp = node.getNextSibling();
-			offset = ((IndexedRegion) tmp).getStartOffset() - start;
-		} else {
-			tmp = node;
-			offset = ((IndexedRegion) tmp).getEndOffset() - start;
-		}
-		viewer.setSelectedRange(start, offset);
-		viewer.doOperation(ISourceViewer.FORMAT);
-	}
-
-	/**
-	 * @param textEditor
-	 * @param reset
-	 */
-	public void changeCaret(StructuredTextEditor textEditor, boolean reset) {
-		if (reset) {
-			StyledText text = textEditor.getTextViewer().getTextWidget();
-			text.setCursor(new Cursor(null, SWT.CURSOR_IBEAM));
-		}
-	}
-
-	/**
-	 * @param textEditor
-	 * @param locationOffset
-	 * @return the location offset
-	 */
-	/*package*/ int getValidLocation(StructuredTextEditor textEditor,
-			int locationOffset) {
-		Node node = getCaretNode(textEditor, locationOffset);
-		if (node == null) {
-			// empty page?
-			return 0;
-		}
-		if (node.getNodeType() == Node.TEXT_NODE) {
-			return locationOffset;
-		}
-		return calculateCaretLocation(node, locationOffset);
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 * @return the offset
-	 */
-	public int getOffset(StructuredTextEditor textEditor, Point location) {
-		StyledText text = textEditor.getTextViewer().getTextWidget();
-		return text.getOffsetAtLocation(location);
-	}
-
-	// private IStructuredModel getModel(StructuredTextEditor textEditor)
-	// {
-	// IStructuredModel model = null;
-	// if (textEditor.getDocumentProvider() != null)
-	// {
-	// if (textEditor.getDocumentProvider() instanceof IModelProvider)
-	// {
-	// model = ((IModelProvider)
-	// textEditor.getDocumentProvider()).getModel(textEditor.getEditorInput());
-	// }
-	// else
-	// {
-	// IDocument doc =
-	// textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
-	// if (doc instanceof IDocument)
-	// {
-	// model =
-	// StructuredModelManager.getModelManager().getExistingModelForEdit(doc);
-	// if (model == null)
-	// {
-	// model =
-	// StructuredModelManager.getModelManager().getExistingModelForEdit((IDocument)
-	// doc);
-	// }
-	// }
-	// }
-	// }
-	// return model;
-	// }
-
-	/**
-	 * @param textEditor
-	 * @param pos
-	 * @return the node
-	 */
-	private Node getCaretNode(StructuredTextEditor textEditor, int pos) {
-        // TODO: getModel is deprecated
-		IStructuredModel model = textEditor.getModel();
-		// getModel(textEditor);
-		if (model == null) {
-			return null;
-		}
-		IndexedRegion inode = model.getIndexedRegion(pos);
-		if (inode == null) {
-			inode = model.getIndexedRegion(pos - 1);
-		}
-		return (inode instanceof Node) ? (Node) inode : null;
-	}
-
-	/**
-	 * Calculate and adjust the location in compare with Node.
-	 * 
-	 * @param node
-	 * @param location
-	 * @return the location
-	 */
-	public int calculateCaretLocation(Node node, int location) {
-		int pos[][] = new int[2][2];
-		pos[0][0] = EditModelQuery.getNodeStartIndex(node);
-		pos[0][1] = EditModelQuery.getNodeStartNameEndIndex(node);
-		pos[1][0] = EditModelQuery.getNodeEndNameStartIndex(node);
-		pos[1][1] = EditModelQuery.getNodeEndIndex(node);
-		if (pos[0][0] >= location || pos[1][0] == location
-				|| pos[1][1] <= location) {
-			return location;
-		} else if (pos[0][0] <= location && pos[0][1] >= location) {
-			if (((pos[0][1] + pos[0][0]) / 2) >= location) {
-				return pos[0][0];
-			}
-            return pos[0][1];
-		} else if (pos[1][0] <= location && pos[1][1] >= location) {
-			if (((pos[1][1] + pos[1][0]) / 2) >= location) {
-				return pos[1][0];
-			}
-            return pos[1][1];
-		}
-		return location;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/TextEditorDropTargetListenerFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/TextEditorDropTargetListenerFactory.java
deleted file mode 100644
index 538bb97..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/TextEditorDropTargetListenerFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.jst.pagedesigner.editors.DesignerStructuredTextEditorJSP;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * @author mengbo
- */
-public class TextEditorDropTargetListenerFactory implements IAdapterFactory {
-
-	/**
-	 * 
-	 */
-	public TextEditorDropTargetListenerFactory() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (ITextEditorDropTargetListener.class.equals(adapterType)) {
-			if (adaptableObject instanceof DesignerStructuredTextEditorJSP) {
-				DesignerSourceDropTargetListener listener = new DesignerSourceDropTargetListener(
-						(StructuredTextEditor) adaptableObject);
-				return listener;
-			}
-
-		}
-		return null;
-
-	}
-
-	public Class[] getAdapterList() {
-		Class[] classes = new Class[1];
-		classes[0] = ITextEditorDropTargetListener.class;
-		return classes;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/messages.properties
deleted file mode 100644
index 654d9ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/messages.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-DropSelectionWizard.Title=Drop Operation Handling
-SimpleWizardSelectionPage.PageName=Select Operation
-SimpleWizardSelectionPage.Title=Select Operation
-SimpleWizardSelectionPage.Description=Select Action
-SimpleWizardSelectionPage.Message=Select the operation you want to perform from the following list
-SimpleWizardSelectionPage.Operation=Operations:
-LocalDropCommand.DropHandler=Drop Handler
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/CaretMoveIterator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/CaretMoveIterator.java
deleted file mode 100644
index 695c3f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/CaretMoveIterator.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-import org.w3c.dom.traversal.NodeIterator;
-
-/**
- * @author mengbo
- */
-public class CaretMoveIterator {
-	private final static Logger _log = PDPlugin
-			.getLogger(CaretMoveIterator.class);
-
-	private final boolean INNER_DEBUG = false;
-
-	private NodeIterator _nodeIterator;
-
-	private IMovementMediator _validator;
-
-	private IDOMPosition _currentPosition;
-
-	private boolean _forward;
-
-	/**
-	 * @param nodeIterator 
-	 * @param validator 
-	 * @param position 
-	 * @param forward 
-	 */
-	public CaretMoveIterator(NodeIterator nodeIterator,
-			IMovementMediator validator, IDOMPosition position, boolean forward) {
-		super();
-		_nodeIterator = nodeIterator;
-		_validator = validator;
-		_currentPosition = position;
-		_forward = forward;
-	}
-
-	/**
-	 * @return the node iterator
-	 */
-	public NodeIterator getNodeIterator() {
-		return _nodeIterator;
-	}
-
-	/**
-	 * @return Returns the _currentPosition.
-	 */
-	public IDOMPosition getCurrentPosition() {
-		return _currentPosition;
-	}
-
-	/**
-	 * @param position
-	 *            The _currentPosition to set.
-	 */
-	public void setCurrentPosition(IDOMPosition position) {
-		_currentPosition = position;
-	}
-
-	// assume the currentPosition is invalid
-	private IDOMPosition moveOut(Node container) {
-		IDOMPosition result = new DOMRefPosition(container, _forward);
-		String name = container.getNodeName();
-		if (name != null
-				&& EditModelQuery.HTML_STYLE_NODES.contains(name.toLowerCase())) {
-			result = moveToNextPosition(result, _validator);
-		}
-		return result;
-	}
-
-	/**
-	 * @param node
-	 * @return the dom position
-	 */
-	public IDOMPosition moveIn(Node node) {
-		IDOMPosition result = null;
-		if (INNER_DEBUG) {
-			_log.info("- Move into: " + node.getLocalName()); //$NON-NLS-1$
-		}
-		if (_validator.isEditable(new Target(node))) {
-			int index;
-			// Transparent text is not editable, so this is not transparent.
-			if (EditModelQuery.isText(node)) {
-				index = (_forward) ? 0 : ((Text) node).getData().length();
-				result = new DOMPosition(node, index);
-				// move ahead one pos.
-				IDOMPosition pos = getNextTextPosition(result);
-				if (pos != null) {
-					result = pos;
-				}
-			} else {
-				if (node.hasChildNodes()) {
-					index = _forward ? 0 : node.getChildNodes().getLength();
-					result = new DOMPosition(node, index); // DOMRefPosition(next,
-					// !_forward);
-				} else {
-					result = new DOMPosition(node, 0);
-				}
-			}
-		} else {
-			if (node.hasChildNodes()) {
-				Node child = _forward ? node.getFirstChild() : node
-						.getLastChild();
-				result = new DOMRefPosition(child, _forward);
-				while (child != null) {
-					if (_validator.allowsMoveIn(new Target(child))) {
-						result = moveIn(child);
-						break;
-					}
-					child = _forward ? child.getNextSibling() : child
-							.getPreviousSibling();
-				}
-			} else {
-				// Should be impposible to reach here.
-				result = new DOMPosition(node, 0);
-			}
-		}
-		return result;
-	}
-
-	private IDOMPosition getNextTextPosition(IDOMPosition position) {
-		IDOMPosition result = null;
-		String value = position.getContainerNode().getNodeValue();
-		int i = position.getOffset();
-		if (_forward) {
-			if (i < value.length()) {
-				if (HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-					while (i < value.length()
-							&& HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-						i++;
-					}
-					result = new DOMPosition(position.getContainerNode(), i);
-				} else if (i < value.length()) {
-					result = new DOMPosition(position.getContainerNode(), i + 1);
-				}
-			}
-		} else {
-			if (i > 0) {
-				if (HTMLUtil.isHTMLWhitespace(value.charAt(i - 1))) {
-					while (i > 0
-							&& HTMLUtil.isHTMLWhitespace(value.charAt(i - 1))) {
-						i--;
-					}
-					result = new DOMPosition(position.getContainerNode(), i);
-				} else if (i > 0) {
-					result = new DOMPosition(position.getContainerNode(), i - 1);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Assume the original position are valid.
-	 * 
-	 * @param position
-	 * @param validator
-	 * @param _forward
-	 * @param referenceImediatly
-	 * @return
-	 */
-	private IDOMPosition moveToNextPosition(IDOMPosition position,
-			IMovementMediator validator) {
-		IDOMPosition currentPosition = null;
-		if (validator.isValidPosition(position) && position.isText()) {
-			currentPosition = getNextTextPosition(position);
-		}
-		if (currentPosition == null) {
-			Node nextNode = EditModelQuery.getInstance().getSibling(position,
-					_forward);
-			while (EditModelQuery.isText(nextNode)
-					&& ((Text) nextNode).getData().length() == 0) {
-				nextNode = EditModelQuery.getInstance().getSibling(nextNode,
-						_forward);
-			}
-			if (nextNode != null) {
-				// move in?
-				if (validator.allowsMoveIn(new Target(nextNode))) {
-					currentPosition = moveIn(nextNode);
-					// Stop when it is in table. For others we continue search
-					// for text.
-					if (!canStopHere(nextNode) && //
-							EditModelQuery.getInstance().getSibling(
-									currentPosition, _forward) != null) {
-						currentPosition = moveToNextPosition(currentPosition,
-								validator);
-					}
-				}
-				// not allowed to move in. e.g. it's empty string.
-				else {
-					currentPosition = new DOMRefPosition(nextNode, _forward);// skip(position);
-				}
-			} else {
-				if (validator.allowsMoveOut(new Target(
-						getNaviContainer(position)))) {
-					currentPosition = moveOut(getNaviContainer(position));
-				}
-			}
-		}
-		currentPosition = EditHelper.ensureDOMPosition(currentPosition);
-		if (currentPosition != null
-				&& !validator.isValidPosition(currentPosition)) {
-			currentPosition = moveToNextPosition(currentPosition, validator);
-		}
-		return currentPosition;
-	}
-
-	/**
-	 * When the tag starts from new line, or in table, then caret can be put at
-	 * 0 offset.
-	 * 
-	 * @param node
-	 * @return
-	 */
-	private boolean canStopHere(Node node) {
-		boolean result = false;
-		if (EditModelQuery.isText(node)) {
-			result = true;
-		} else if (node != null && node.getNodeName() != null) {
-			result |= node.getNodeName().equals(IHTMLConstants.TAG_TD);
-			result |= EditModelQuery.isBlockNode(node);
-		}
-		return result;
-	}
-
-	/**
-	 * Move operation position to next edit position. We may need rule to valid
-	 * it based on operation ID and direction. We need to pack transparent
-	 * string.
-	 * 
-	 * @param currentPosition
-	 * @param forward
-	 * @param validator
-	 * @return the dom position
-	 */
-	public IDOMPosition moveToNextEditPosition(IDOMPosition currentPosition,
-			boolean forward, IMovementMediator validator) {
-		IDOMPosition result = null;
-		if ((currentPosition = moveToNextPosition(currentPosition, validator)) != null) {
-			result = currentPosition;
-		} else {
-			result = _currentPosition;
-		}
-		return result;
-	}
-
-	private Node getNaviContainer(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getParentNode();
-		}
-        return position.getContainerNode();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPosition.java
deleted file mode 100644
index 750b6de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPosition.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMPosition implements IDOMPosition {
-	Node _containerNode;
-
-	int _offset;
-
-	/**
-	 * @param containerNode
-	 * @param offset
-	 */
-	public DOMPosition(Node containerNode, int offset) {
-		_containerNode = containerNode;
-		_offset = offset;
-	}
-
-	/**
-	 * this is the offset in the DOM tree. When parent node is text node, the
-	 * offset if the offset into the actual displayed data of the text node.
-	 * 
-	 * when parent is not text node, then the offset is the index in
-	 * getIDOMNode().getChildNodes()
-	 * 
-	 * @return the offset
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		if (isText())
-			return null;
-		NodeList children = _containerNode.getChildNodes();
-		int length = children.getLength();
-		if (_offset >= length || _offset < 0)
-			return null;
-        return children.item(_offset);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		if (isText())
-			return null;
-		NodeList children = _containerNode.getChildNodes();
-		int length = children.getLength();
-		if (_offset > length || _offset <= 0)
-			return null;
-        return children.item(_offset - 1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _containerNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return _containerNode instanceof Text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward)
-			return getNextSiblingNode();
-        return getPreviousSiblingNode();
-	}
-
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (original == this._containerNode) {
-			return new DOMPosition(replacement, this._offset);
-		}
-        return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "DOMPosition: (" + _containerNode + " : " + _offset + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java
deleted file mode 100644
index d0e77f8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMPositionHelper {
-	/**
-	 * @param position
-	 * @return the design position
-	 */
-	public static DesignPosition toDesignRefPosition(DOMRefPosition position) {
-		Node node = position.getReferenceNode();
-		do {
-			IDOMNode container = (IDOMNode) node.getParentNode();
-			EditPart part = (EditPart) container.getAdapterFor(EditPart.class);
-			if (part != null) {
-				// XXX: what if the node has not corresponding part?
-				EditPart child = DOMPositionHelper.findEditPart(part, node);
-				if (child != null) {
-					return new DesignRefPosition(child, position.isForward());
-				}
-                return DesignPosition.INVALID;
-			}
-            node = node.getParentNode();
-		} while (true);
-	}
-
-	/**
-	 * 
-	 * @param position
-	 *            if it is null, then will return null
-	 * @return null if position is null or invalid.
-	 */
-	public static DesignPosition toDesignPosition(IDOMPosition position) {
-		if (position == null) {
-			return null;
-		}
-		if (position instanceof DOMRefPosition) {
-			return toDesignRefPosition((DOMRefPosition) position);
-		}
-		do {
-			IDOMNode container = (IDOMNode) position.getContainerNode();
-			EditPart part = (EditPart) container.getAdapterFor(EditPart.class);
-			if (part != null) {
-				if (container instanceof Text) {
-					String textData = ((Text) container).getData();
-					String displayData = ((TextEditPart) part).getTextData();
-					return new DesignPosition(part,
-							textDataOffsetToDisplayOffset(textData,
-									displayData, position.getOffset()));
-				}
-                Node pre = position.getPreviousSiblingNode();
-                while (pre != null) {
-                	int index = findChildEditPartIndex(part, pre);
-                	if (index != -1) {
-                		return new DesignPosition(part, index + 1);
-                	}
-                	pre = pre.getPreviousSibling();
-                }
-                return new DesignPosition(part, 0);
-			}
-            position = new DOMRefPosition(position.getContainerNode(),
-            		false);
-		} while (true);
-	}
-
-	/**
-	 * Here is the position is not currect, currently it will returns invalid
-	 * pos.
-	 * 
-	 * @param position
-	 * @return the design position
-	 */
-	public static DesignPosition toDesignPosition1(IDOMPosition position) {
-		if (position instanceof DOMRefPosition) {
-			return toDesignRefPosition((DOMRefPosition) position);
-		}
-		do {
-			IDOMNode container = (IDOMNode) position.getContainerNode();
-			EditPart part = (EditPart) container.getAdapterFor(EditPart.class);
-			if (part != null) {
-				if (container instanceof Text) {
-					String textData = ((Text) container).getData();
-					String displayData = ((TextEditPart) part).getTextData();
-					return new DesignPosition(part,
-							textDataOffsetToDisplayOffset(textData,
-									displayData, position.getOffset()));
-				}
-                Node pre = position.getPreviousSiblingNode();
-                while (pre != null) {
-                	int index = findChildEditPartIndex(part, pre);
-                	if (index != -1) {
-                		return new DesignPosition(part, index + 1);
-                	}
-                	pre = pre.getPreviousSibling();
-                }
-                return new DesignPosition(part, 0);
-			}
-            return DesignPosition.INVALID;
-		} while (true);
-	}
-
-	static int findChildEditPartIndex(EditPart parent, Node node) {
-		List children = parent.getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			if (((EditPart) children.get(i)).getModel() == node) {
-				return i;
-			}
-		}
-		return -1;
-	}
-
-	static EditPart findEditPart(EditPart parent, Node node) {
-		List children = parent.getChildren();
-		EditPart part;
-		for (int i = 0; i < children.size(); i++) {
-			if ((part = (EditPart) children.get(i)).getModel() == node) {
-				return part;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * convert a DesignPosition into DOMPosition.
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition toDOMRefPosition(DesignRefPosition position) {
-		// ok, it is not text.
-		EditPart sibling = position.getRefPart();
-		if (sibling != null) {
-			return new DOMRefPosition((Node) sibling.getModel(), position
-					.caretIsAtRight());
-		}
-		// should never happens
-		Assert.isTrue(false);
-		return null;
-	}
-
-	/**
-	 * convert a DesignPosition into DOMPosition.
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition toDOMPosition(DesignPosition position) {
-		if (!EditValidateUtil.validPosition(position)) {
-			return null;
-		} else if (position instanceof DesignRefPosition) {
-			return toDOMRefPosition((DesignRefPosition) position);
-		}
-		EditPart part = position.getContainerPart();
-		if (part instanceof TextEditPart) {
-			Text text = (Text) ((TextEditPart) part).getIDOMNode();
-			int offset = position.getOffset();
-			if (offset == 0) {
-				return new DOMPosition(text, 0);
-			}
-            String displayData = ((TextEditPart) part).getTextData();
-            String nodeData = text.getData();
-            if (offset >= displayData.length()) {
-            	// point to end of the text node.
-            	return new DOMPosition(text, nodeData.length());
-            }
-            // we need to calculate it out.
-            int index = displayOffsetToTextDataOffset(displayData,
-            		nodeData, offset);
-            return new DOMPosition(text, index);
-		}
-        // ok, it is not text.
-        EditPart sibling = position.getSiblingEditPart(true);
-        if (sibling instanceof NodeEditPart) {
-        	return new DOMRefPosition(((NodeEditPart) sibling).getDOMNode(), false);
-        }
-
-        sibling = position.getSiblingEditPart(false);
-        if (sibling instanceof NodeEditPart) {
-        	return new DOMRefPosition(((NodeEditPart) sibling).getDOMNode(), true);
-        }
-
-        // no previous sibling, no next sibling, the parent node must be
-        // empty
-        return new DOMPosition(((NodeEditPart) part).getDOMNode(), 0);
-	}
-
-	/**
-	 * if "position" is inside a text node, then split the text node and return
-	 * a new IDOMPosition semantically equal to the position in the two
-	 * splitted text. If the "position" is not a text position, then no action
-	 * will be taken and will return the original position.
-	 * 
-	 * @param position
-	 * @return IDOMPosition
-	 */
-	public static IDOMPosition splitText(IDOMPosition position) {
-		Node container = position.getContainerNode();
-		if (container instanceof Text) {
-			int offset = position.getOffset();
-			if (offset <= 0) {
-				// at beginning of text node. no need to split
-				return new DOMRefPosition(container, false);
-			}
-			String textData = ((Text) container).getData();
-			if (offset >= textData.length()) {
-				// at end of text node. no need to split
-				return new DOMRefPosition(container, true);
-			}
-			// ok, we need split
-			((Text) container).splitText(offset);
-			return new DOMRefPosition(container, true);
-		}
-        return position;
-	}
-
-	/**
-	 * Remove all the content in the range. And return the new position.
-	 * 
-	 * @param range
-	 * @return the dom position
-	 */
-	public static IDOMPosition removeRange(DOMRange range) {
-		boolean ordered = range.isOrdered();
-//		IDOMPosition start = ordered ? range.getStartPosition() : range
-//				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		// FIXME: Not DONE:
-		return end;
-	}
-
-	/**
-	 * try to merge the position in adjacent text node (if it is not already in)
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition mergeIntoText(IDOMPosition position) {
-		if (position.getContainerNode() instanceof Text)
-			return position;
-		Node pre = position.getPreviousSiblingNode();
-		if (pre instanceof Text) {
-			return new DOMPosition(pre, ((Text) pre).getData().length());
-		}
-		Node after = position.getNextSiblingNode();
-		if (after instanceof Text) {
-			return new DOMPosition(after, 0);
-		}
-		return position;
-	}
-
-	/**
-	 * @param displayData
-	 * @param nodeData
-	 * @param offset
-	 * @return the offset
-	 */
-	// FIXME: this method is still buggy
-	public static int displayOffsetToTextDataOffset(String displayData,
-			String nodeData, int offset) {
-		char[] display = displayData.toCharArray();
-		if (offset >= display.length) {
-			// offset is already at end
-			return nodeData.length();
-		}
-		char[] node = nodeData.toCharArray();
-		int nodeDataLength = node.length;
-		int displayIndex = 0;
-		int nodeIndex = 0;
-
-		while (displayIndex < offset && nodeIndex < nodeDataLength) {
-			if (display[displayIndex] == node[nodeIndex]) {
-				displayIndex++;
-				nodeIndex++;
-				continue;
-			}
-			if (HTMLUtil.isHTMLWhitespace(node[nodeIndex])) {
-				if (HTMLUtil.isHTMLWhitespace(display[displayIndex])) {
-					displayIndex++;
-					nodeIndex++;
-				} else {
-					nodeIndex++;
-				}
-				continue;
-			}
-            // should not happen!
-            displayIndex++;
-            nodeIndex++;
-		}
-
-		if (nodeIndex >= nodeDataLength)
-			return nodeDataLength;
-		// else means displayIndex == offset
-		// since we already checked that offset < displayLength, so we can get
-		// the next char
-		if (display[offset] != ' ') {
-			// we may need to skip whitespaces after nodeIndex
-			while (nodeIndex < nodeDataLength
-					&& HTMLUtil.isHTMLWhitespace(node[nodeIndex])) {
-				nodeIndex++;
-			}
-		}
-		return nodeIndex;
-	}
-
-	/**
-	 * @param nodeData 
-	 * @param displayData
-	 * @param offset
-	 * @return the offset
-	 */
-	// FIXME: this method is still buggy
-	public static int textDataOffsetToDisplayOffset(String nodeData,
-			String displayData, int offset) {
-		if (offset >= nodeData.length()) {
-			return displayData.length();
-		}
-		char[] node = nodeData.toCharArray();
-		char[] display = displayData.toCharArray();
-
-		int displayIndex = 0;
-		int nodeIndex = 0;
-		int displayDataLength = display.length;
-
-		while (nodeIndex < offset && displayIndex < displayDataLength) {
-			if (display[displayIndex] == node[nodeIndex]) {
-				displayIndex++;
-				nodeIndex++;
-				continue;
-			}
-			if (HTMLUtil.isHTMLWhitespace(node[nodeIndex])) {
-				if (HTMLUtil.isHTMLWhitespace(display[displayIndex])) {
-					displayIndex++;
-					nodeIndex++;
-				} else {
-					nodeIndex++;
-				}
-				continue;
-			}
-            // should not happen!
-            displayIndex++;
-            nodeIndex++;
-		}
-		return displayIndex;
-	}
-
-	/**
-	 * Convert a IDOMPosition to IDOMRefPosition. If can't convert to
-	 * IDOMRefPosition, will return the original one.
-	 * 
-	 * @param position
-	 * @return IDOMPosition
-	 */
-	public static IDOMPosition toDOMRefPosition(IDOMPosition position) {
-		if (position.isText()) {
-			return position; // can't convert Text node.
-		}
-		if (position instanceof IDOMRefPosition) {
-			return position;
-		}
-		if (position.getNextSiblingNode() != null) {
-			return new DOMRefPosition(position.getNextSiblingNode(), false);
-		}
-		if (position.getPreviousSiblingNode() != null) {
-			return new DOMRefPosition(position.getPreviousSiblingNode(), true);
-		}
-        return new DOMRefPosition2(position.getContainerNode(), true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRange.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRange.java
deleted file mode 100644
index f35dfda..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRange.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DOMRange {
-	IDOMPosition _start;
-
-	IDOMPosition _end;
-
-	/**
-	 * @param p1
-	 * @param p2
-	 */
-	public DOMRange(IDOMPosition p1, IDOMPosition p2) {
-		_start = p1;
-		_end = p2;
-	}
-
-	/**
-	 * @return the start position
-	 */
-	public IDOMPosition getStartPosition() {
-		return _start;
-	}
-
-	/**
-	 * @return the end position
-	 */
-	public IDOMPosition getEndPosition() {
-		return _end;
-	}
-
-	/**
-	 * @return true if is empty
-	 */
-	public boolean isEmpty() {
-		return _start.getContainerNode() == _end.getContainerNode()
-				&& _start.getOffset() == _end.getOffset();
-	}
-
-	/**
-	 * @return true if is ordered
-	 */
-	public boolean isOrdered() {
-		Node common = DOMUtil.findCommonAncester(_start.getContainerNode(),
-				_end.getContainerNode());
-		if (common == null) {
-			return true;
-		}
-		IDOMPosition s = moveUp(_start, common);
-		IDOMPosition e = moveUp(_end, common);
-		return e.getOffset() >= s.getOffset();
-	}
-
-	private IDOMPosition moveUp(IDOMPosition p, Node ancester) {
-		while (p.getContainerNode() != ancester) {
-			p = new DOMRefPosition(p.getContainerNode(), false);
-		}
-		return p;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRangeHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRangeHelper.java
deleted file mode 100644
index 1c7a33c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRangeHelper.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final class DOMRangeHelper {
-	/**
-	 * @param range
-	 * @return the dom range
-	 */
-	public static DOMRange toDOMRange(DesignRange range) {
-		if (range.getStartPosition() == range.getEndPosition()) {
-			IDOMPosition dp = DOMPositionHelper.toDOMPosition(range
-					.getStartPosition());
-			return new DOMRange(dp, dp);
-		}
-        return new DOMRange(DOMPositionHelper.toDOMPosition(range
-        		.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-        		.getEndPosition()));
-	}
-
-	/**
-	 * @param range
-	 * @return the design range
-	 */
-	public static DesignRange toDesignRange(DOMRange range) {
-		if (range.getStartPosition() == range.getEndPosition()) {
-			DesignPosition dp = DOMPositionHelper.toDesignPosition(range
-					.getStartPosition());
-			return new DesignRange(dp, dp);
-		}
-		return new DesignRange(DOMPositionHelper.toDesignPosition(range
-				.getStartPosition()), DOMPositionHelper.toDesignPosition(range
-				.getEndPosition()));
-	}
-
-	/**
-	 * @param range
-	 * @param original
-	 * @param replacement
-	 * @return the dom range
-	 */
-	public static DOMRange handleReplacement(DOMRange range, Node original,
-			Node replacement) {
-		if (range.getStartPosition() == range.getEndPosition()) {
-			IDOMPosition pos = range.getStartPosition().handleReplacement(
-					original, replacement);
-			return new DOMRange(pos, pos);
-		}
-        return new DOMRange(range.getStartPosition().handleReplacement(
-        		original, replacement), range.getEndPosition()
-        		.handleReplacement(original, replacement));
-	}
-	
-	private DOMRangeHelper()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition.java
deleted file mode 100644
index b94c8a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * DOMRefPosition is another way to identify a position in the document tree. It
- * has the advantage against the DOMPosition, that even something change in the
- * document, DOMRefPosition may still reference the correct position.
- * 
- * @author mengbo
- */
-public class DOMRefPosition implements IDOMRefPosition {
-	Node _refNode;
-
-	boolean _forward;
-
-	/**
-	 * @param refNode
-	 * @param forward
-	 *            true means the position after refNode. false means the
-	 *            position before refNode
-	 */
-	public DOMRefPosition(Node refNode, boolean forward) {
-		_refNode = refNode;
-		_forward = forward;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward != _forward)
-        {
-		    return _refNode;
-        }
-		if (forward)
-        {
-			return _refNode.getNextSibling();
-        }
-        return _refNode.getPreviousSibling();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		return getSibling(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		return getSibling(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _refNode.getParentNode();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getOffset()
-	 */
-	public int getOffset() {
-		Node parent = _refNode.getParentNode();
-		if (parent == null) {
-			return _forward ? 1 : 0;
-		}
-        NodeList list = parent.getChildNodes();
-        for (int i = 0, n = list.getLength(); i < n; i++) {
-        	if (list.item(i) == _refNode) {
-        		return _forward ? (i + 1) : i;
-        	}
-        }
-        // should not happen.
-        return -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return false;
-	}
-
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (this._refNode == original) {
-			return new DOMRefPosition(replacement, this._forward);
-		}
-        return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "DOMRefPosition: (" + (_forward ? "after " : "before ") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				+ _refNode + ")"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMRefPosition#getReferenceNode()
-	 */
-	public Node getReferenceNode() {
-		return _refNode;
-	}
-
-	/**
-	 * @return true if is forward
-	 */
-	public boolean isForward() {
-		return _forward;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition2.java
deleted file mode 100644
index 3da9127..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition2.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * This ref position use a parent node as reference. And provide whether this
- * location is at the beginning of its parent or last of its parent.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DOMRefPosition2 implements IDOMRefPosition {
-	Node _parentNode;
-
-	boolean _last;
-
-	/**
-	 * @param parent 
-	 * @param last 
-	 */
-	public DOMRefPosition2(Node parent, boolean last) {
-		_parentNode = parent;
-		_last = last;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMRefPosition#getReferenceNode()
-	 */
-	public Node getReferenceNode() {
-		return _parentNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward) {
-			if (_last) {
-				return null;
-			}
-            return _parentNode.getFirstChild();
-		} else if (_last) {
-        	return _parentNode.getLastChild();
-        } else {
-        	return null;
-        }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		return getSibling(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		return getSibling(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _parentNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getOffset()
-	 */
-	public int getOffset() {
-		if (!_last) {
-			return 0;
-		}
-        return _parentNode.getChildNodes().getLength();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#handleReplacement(org.w3c.dom.Node,
-	 *      org.w3c.dom.Node)
-	 */
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (original == _parentNode) {
-			return new DOMRefPosition2(replacement, _last);
-		}
-        return this;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMStyleUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMStyleUtil.java
deleted file mode 100644
index 243f372..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMStyleUtil.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSStyleDeclaration;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class DOMStyleUtil {
-	/**
-	 * @param original
-	 * @param cssProperty
-	 * @return the inline style property
-	 */
-	public static String getInlineStyleProperty(Element original,
-			String cssProperty) {
-		if (original instanceof ElementCSSInlineStyle) {
-			CSSStyleDeclaration styledecl = ((ElementCSSInlineStyle) original)
-					.getStyle();
-			if (styledecl == null) {
-				if (original.getAttribute("style") == null) { //$NON-NLS-1$
-					return null;
-				}
-				// else mean it has style attribute.
-			}
-
-			if (styledecl != null) {
-				return styledecl.getPropertyValue(cssProperty);
-			}
-		}
-
-		// when we reach here, means we can't use the CSSStyleDeclaration API to
-		// get style, we'll take the
-		// pain to do the parsing and replacing.
-		// normally should not happen. But anyway, we need to have a fail safe
-		// path.
-
-		String oldstyle = original.getAttribute("style"); //$NON-NLS-1$
-		if (oldstyle == null || oldstyle.length() == 0) {
-			return null;
-		}
-		StringTokenizer tokenizer = new StringTokenizer(oldstyle, ";"); //$NON-NLS-1$
-
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken().trim();
-			if (token.length() == 0) {
-				continue;
-			}
-			int index = token.indexOf(':');
-			if (index == -1) {
-				continue;
-			}
-			String propertyName = token.substring(0, index).trim();
-			if (cssProperty.equals(propertyName)) {
-				// ok, we found the property
-				return token.substring(index + 1).trim();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * insert style into element
-	 * 
-	 * @param original
-	 * @param map
-	 */
-	public static void insertStyle(Element original, Map map) {
-		if (original instanceof ElementCSSInlineStyle) {
-			CSSStyleDeclaration styledecl = ((ElementCSSInlineStyle) original)
-					.getStyle();
-			if (styledecl == null) {
-				if (original.getAttribute("style") == null) { //$NON-NLS-1$
-					original.setAttribute("style", ""); //$NON-NLS-1$ //$NON-NLS-2$
-					styledecl = ((ElementCSSInlineStyle) original).getStyle();
-				}
-			}
-
-			if (styledecl != null) {
-				for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
-					String key = (String) iter.next();
-					String value = (String) map.get(key);
-					if (value == null) {
-						styledecl.removeProperty(key);
-					} else {
-						styledecl.setProperty(key, value, null);
-					}
-				}
-
-				return;
-			}
-		}
-
-		// when we reach here, means we can't use the CSSStyleDeclaration API to
-		// change style, we'll take the
-		// pain to do the parsing and replacing.
-		// normally should not happen. But anyway, we need to have a fail safe
-		// path.
-
-		String oldstyle = original.getAttribute("style"); //$NON-NLS-1$
-		if (oldstyle == null) {
-			oldstyle = ""; //$NON-NLS-1$
-		}
-		StringTokenizer tokenizer = new StringTokenizer(oldstyle, ";"); //$NON-NLS-1$
-
-		StringBuffer buffer = new StringBuffer();
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken().trim();
-			if (token.length() == 0) {
-				continue;
-			}
-			int index = token.indexOf(':');
-			if (index == -1) {
-				// wrong property? ignore.
-				buffer.append(token).append("; "); //$NON-NLS-1$
-				continue;
-			}
-			String propertyName = token.substring(0, index).trim();
-
-			if (map.containsKey(propertyName)) {
-				String propertyValue = (String) map.remove(propertyName);
-				if (propertyValue == null) {
-					// we want to remove this css property. so don't append
-					// anything here
-				} else {
-					buffer.append(propertyName).append(": ").append( //$NON-NLS-1$
-							propertyValue).append("; "); //$NON-NLS-1$
-				}
-			} else {
-				buffer.append(token).append("; "); //$NON-NLS-1$
-			}
-		}
-		// ok, we have loop through existing properties and did replacement.
-		// now _styleProperties only contain those new CSS properties we need to
-		for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
-			String key = (String) iter.next();
-			String value = (String) map.get(key);
-			if (value != null) {
-				buffer.append(key).append(": ").append(value).append("; "); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-		original.setAttribute("style", buffer.toString()); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param ele
-	 * @return true if supports the style attribute
-	 */
-	public static boolean supportStyleAttribute(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl != null && decl.getAttributes().getNamedItem("style") != null) { //$NON-NLS-1$
-			return true;
-		}
-        return false;
-	}
-	
-	private DOMStyleUtil()
-	{
-	    // util class, no external instantiation
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMUtil.java
deleted file mode 100644
index c34e388..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMUtil.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMUtil {
-	private static Logger _logger = PDPlugin.getLogger(DOMUtil.class);
-
-	/**
-	 * Get a list of ancester nodes starting from the Document till the node.
-	 * 
-	 * @param node
-	 * @return
-	 */
-	private static List getAncesters(Node node) {
-		List list = new ArrayList();
-		while (node != null) {
-			list.add(node);
-			if (node instanceof Document) {
-				break;
-			}
-            node = node.getParentNode();
-		}
-		if (node == null) {
-			// if part ==null, means we didn't find a DocumentEditPart,
-			// something must be wrong.
-			return null;
-		}
-		// reverse to make it starting from the docuemnteditpart node.
-		Collections.reverse(list);
-		list.add(null); // add an null terminator.
-		return list;
-	}
-
-	/**
-	 * find the smallest common ancester of two edit part.
-	 * 
-	 * @param node1
-	 * @param node2
-	 * @return the common ancestor
-	 */
-	public static Node findCommonAncester(Node node1, Node node2) {
-		List list1 = getAncesters(node1);
-		if (list1 == null) {
-			return null;
-		}
-		List list2 = getAncesters(node2);
-		if (list2 == null) {
-			return null;
-		}
-		if (list1.get(0) != list2.get(0)) {
-			return null;
-		}
-		Node common = (Node) list1.get(0);
-		for (int i = 1;; i++) {
-			Node p1 = (Node) list1.get(i);
-			Node p2 = (Node) list2.get(i);
-			if (p1 == null || p2 == null) {
-				return common;
-			}
-			if (p1 != p2) {
-				return common;
-			}
-			common = p1;
-		}
-
-	}
-
-	/**
-	 * this method is almost same as <code>cloneNodeDeep()</code>. The
-	 * difference is that this method will try to ignore all kinds of error.
-	 * 
-	 * In SSE, if the document model enforce some kinds of validation, then the
-	 * clone may fail. During some cases, we want to ignore the validation
-	 * errors.
-	 * 
-	 * @param destDoc
-	 * @param sourceNode
-	 * @return the node
-	 */
-	public static Node cloneNodeDeepIgnoreError(Document destDoc,
-			Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				try {
-					resultEle.setAttribute(a.getName(), a.getValue());
-				} catch (Exception ex) {
-					// ignore
-					_logger.info("Exception", ex); //$NON-NLS-1$
-				}
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeepIgnoreError(destDoc, n);
-				if (d != null) {
-					try {
-						resultEle.appendChild(d);
-					} catch (Exception ex) {
-						// ignore
-						_logger.info("Exception", ex); //$NON-NLS-1$
-					}
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-
-	/**
-	 * @param destDoc
-	 * @param sourceNode
-	 * @return the node
-	 */
-	public static Node cloneNodeDeep(Document destDoc, Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				resultEle.setAttribute(a.getName(), a.getValue());
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeep(destDoc, n);
-				if (d != null) {
-					resultEle.appendChild(d);
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-					_logger.info("Exception", ex); //$NON-NLS-1$
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-
-	/**
-	 * check whether the ancester relationship exist for the two nodes.
-	 * 
-	 * @param ancester
-	 * @param child
-	 * @return true if ancester is an ancestor of child
-	 */
-	public static boolean isAncester(Node ancester, Node child) {
-		while (child != null) {
-			if (child == ancester) {
-				return true;
-			}
-			child = child.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * insert the node at specified position.
-	 * 
-	 * @param domPosition 
-	 * @param node 
-	 * @return null if fail, otherwise return the inserted node.
-	 */
-	public static Node insertNode(IDOMPosition domPosition, Node node) {
-		IDOMPosition position = DOMPositionHelper.splitText(domPosition);
-		if (position == null || position.getContainerNode() == null) {
-			return null;
-		}
-		if (position.getNextSiblingNode() == null) {
-			position.getContainerNode().appendChild(node);
-		} else {
-			position.getContainerNode().insertBefore(node,
-					position.getNextSiblingNode());
-		}
-
-		return node;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditHelper.java
deleted file mode 100644
index 72f763a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditHelper.java
+++ /dev/null
@@ -1,504 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.List;
-import java.util.Stack;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.range.WorkNode;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class EditHelper {
-//	public final static boolean INNER_DEBUG = false;
-
-	private final static int OUT_OF_LEFT = 1;
-
-	private final static int LEFT_NAME = 2;
-
-	/**
-	 * indicates a position in the middle
-	 */
-	public final static int IN_MIDDLE = 3;
-
-	private final static int RIGHT_NAME = 4;
-
-	private final static int OUT_OF_RIGHT = 5;
-
-	private static final EditHelper _instance = new EditHelper();
-
-	//private static Logger _log = PDPlugin.getLogger(EditHelper.class);
-
-	private EditHelper() {
-        //  no external instantiation
-	}
-
-	/**
-	 * Move operation position in front of next non-blank and non-transparent
-	 * char. The caller should ensure position's container node is not
-	 * transparent text node.
-	 * 
-	 * @param position
-	 * @param forward
-	 * @param forEmpty
-	 * @return the offset
-	 */
-	public int getTextNextOffset(IDOMPosition position, boolean forward,
-			boolean forEmpty) {
-		EditValidateUtil.validPosition(position);
-		Assert.isTrue(!EditModelQuery.isTransparentText(position
-				.getContainerNode()));
-		Text text = (Text) position.getContainerNode();
-		int offset = position.getOffset();
-		String data = text.getNodeValue();
-		if (forward) {
-			while (offset < data.length()
-					&& HTMLUtil.isHTMLWhitespace(data.charAt(offset))) {
-				offset++;
-			}
-		} else {
-			while (offset > 0
-					&& HTMLUtil.isHTMLWhitespace(data.charAt(offset - 1))) {
-				offset--;
-			}
-		}
-		return offset;
-
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static EditHelper getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * This caret from current operation position to next position, this method
-	 * will convert DesignPosition in to DOMPosition, then call dom function to
-	 * move dom position. Here we might insert some complex rules to see whether
-	 * move is valid.
-	 * 
-	 * @param action
-	 * @param currentPosition
-	 * @param forward
-	 * @return the dom position
-	 */
-	public static DesignPosition moveToNextEditPosition(int action,
-			DesignPosition currentPosition, boolean forward) {
-		IDOMPosition position;
-		position = DOMPositionHelper.toDOMPosition(currentPosition);
-		position = moveToNextEditPosition(position, forward,
-				new InlineEditingNavigationMediator(
-						new ActionData(action, null)));
-		if (position == null) {
-			return currentPosition;
-		}
-
-		EditValidateUtil.validPosition(position);
-		return DOMPositionHelper.toDesignPosition(position);
-	}
-
-	/**
-	 * Move operation position to next edit position. We may need rule to valid
-	 * it based on operation ID and direction. We need to pack transparent
-	 * string.
-	 * 
-	 * @param currentPosition
-	 * @param forward
-	 * @param validator
-	 * @return the dom position
-	 */
-	public static IDOMPosition moveToNextEditPosition(
-			IDOMPosition currentPosition, boolean forward,
-			IMovementMediator validator) {
-		IDOMPosition result = null;
-		CaretMoveIterator moveIterator = new CaretMoveIterator(null, validator,
-				currentPosition, forward);
-		if ((result = moveIterator.moveToNextEditPosition(currentPosition,
-				forward, validator)) == null) {
-			result = currentPosition;
-		}
-		return result;
-	}
-
-	/**
-	 * Delete a node, in case it is 'body' or 'html', it won't perform delete.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public static Node deleteNode(Node node) {
-		if (node == null || node.getNodeName() == null) {
-			return null;
-		}
-		String name = node.getLocalName();
-
-		if (name != null
-				&& (name.equalsIgnoreCase(IHTMLConstants.TAG_BODY)
-						|| name.equalsIgnoreCase(IHTMLConstants.TAG_HEAD)
-						|| name.equalsIgnoreCase(IHTMLConstants.TAG_HTML))) {
-			return null;
-		}
-		Node parent = node.getParentNode();
-		name = parent.getNodeName();
-		if (parent != null
-				&& name != null
-				&& parent.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_HEAD)) {
-			return null;
-		}
-		return parent.removeChild(node);
-	}
-
-	/**
-	 * Order the IDOMPositions in a range in ascending order.
-	 * 
-	 * @param range
-	 * @return the dom range
-	 */
-	public static DOMRange normal(DOMRange range) {
-		EditValidateUtil.validRange(range);
-		IDOMPosition p1 = range.getStartPosition();
-		IDOMPosition p2 = range.getEndPosition();
-		if (EditModelQuery.getIndexedRegionLocation(p1) > EditModelQuery
-				.getIndexedRegionLocation(p2)) {
-			return new DOMRange(p2, p1);
-		}
-        return range;
-	}
-
-	/**
-	 * Move position in to node from its outside, the node should be breakble.
-	 * 
-	 * @param node
-	 * @param validator 
-	 * @param forward
-	 * @return the dom position
-	 */
-	public static IDOMPosition moveInto(Node node, IMovementMediator validator,
-			boolean forward) {
-		CaretMoveIterator moveIterator = new CaretMoveIterator(null, validator,
-				new DOMRefPosition(node, !forward), forward);
-		return moveIterator.moveIn(node);
-	}
-
-	/**
-	 * Convert a DomRefPosition into DOMPosition.
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition ensureDOMPosition(IDOMPosition position) {
-		if (position instanceof DOMRefPosition) {
-			return new DOMPosition(position.getContainerNode(), position
-					.getOffset());
-		}
-		return position;
-	}
-
-	/**
-	 * @param currentNode
-	 * @param pos1
-	 * @param pos2
-	 * @param top
-	 * @param workNode
-	 */
-	public void processText(Text currentNode, final int pos1, final int pos2,
-			Node top, Stack workNode) {
-		// the text could be tranparent, or 0 length.
-		Assert.isTrue(pos1 <= pos2);
-		if (pos1 == pos2) {
-			return;
-		}
-		// int left = EditModelQuery.getNodeStartIndex(currentNode);
-		// int right = EditModelQuery.getNodeEndIndex(currentNode);
-		int location1 = getLocation(currentNode, pos1, false);
-		int location2 = getLocation(currentNode, pos2, false);
-		if (location1 <= IN_MIDDLE && location2 >= IN_MIDDLE) {
-			workNode.push(new WorkNode(currentNode, pos1, pos2));
-		}
-	}
-
-	/**
-	 * @param currentNode
-	 * @param pos1
-	 * @param pos2
-	 * @param top
-	 * @param result
-	 */
-	public void collectNodes(Node currentNode, final int pos1, final int pos2,
-			Node top, Stack result) {
-		Assert.isTrue(pos1 <= pos2);
-		if (pos1 == pos2) {
-			return;
-		}
-		if (EditModelQuery.isText(currentNode)) {
-			processText((Text) currentNode, pos1, pos2, top, result);
-		} else {
-			int location1 = getLocation(currentNode, pos1, false);
-			int location2 = getLocation(currentNode, pos2, false);
-			if (location1 < IN_MIDDLE && location2 > IN_MIDDLE) {
-				// TODO: push the node into result.--
-				result.push(new WorkNode(currentNode, pos1, pos2));
-			} else if (location1 <= IN_MIDDLE && location2 >= IN_MIDDLE) {
-				if (currentNode.hasChildNodes()) {
-					Node child = currentNode.getFirstChild();
-					Stack myResult = new Stack();
-					while (child != null) {
-						collectNodes(child, pos1, pos2, top, myResult);
-						child = child.getNextSibling();
-					}
-					if (location1 < IN_MIDDLE && location2 >= IN_MIDDLE
-							|| location1 <= IN_MIDDLE && location2 > IN_MIDDLE) {
-						WorkNode workNode = new WorkNode(currentNode, pos1,
-								pos2);
-						while (myResult.size() > 0) {
-							WorkNode w = (WorkNode) myResult.remove(0);
-							if (w.getNode().getParentNode() == workNode
-									.getNode()) {
-								w.setParent(workNode);
-							}
-							result.push(w);
-						}
-						// TODO: push parent into result.--
-						result.push(workNode);
-					}
-				} else {
-					if (!(location1 == IN_MIDDLE && location2 == IN_MIDDLE)) {
-						// TODO: push this node into result.
-						result.push(new WorkNode(currentNode, pos1, pos2));
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param currentNode
-	 * @param pos
-	 * @param isOffset
-	 * @return the location
-	 */
-	public int getLocation(Node currentNode, int pos, boolean isOffset) {
-		if (EditModelQuery.getInstance().isSingleRegionNode(currentNode)) {
-			// if (EditModelQuery.isText(currentNode))
-			{
-
-				int left = EditModelQuery.getNodeStartIndex(currentNode);
-				int right = EditModelQuery.getNodeEndIndex(currentNode);
-				if (isOffset) {
-					pos += left;
-				}
-				if (pos <= left) {
-					return OUT_OF_LEFT;
-				} else if (left < pos && pos < right) {
-					return IN_MIDDLE;
-				} else {
-					return OUT_OF_RIGHT;
-				}
-			}
-		}
-        int left = EditModelQuery.getNodeStartIndex(currentNode);
-        int left1 = EditModelQuery.getNodeStartNameEndIndex(currentNode);
-        int right = EditModelQuery.getNodeEndNameStartIndex(currentNode);
-        int right1 = EditModelQuery.getNodeEndIndex(currentNode);
-        if (isOffset) {
-        	pos += left;
-        }
-        if (pos <= left) {
-        	return OUT_OF_LEFT;
-        } else if (left < pos && pos < left1) {
-        	return LEFT_NAME;
-        } else if (left1 <= pos && pos <= right) {
-        	return IN_MIDDLE;
-        } else if (right < pos && pos < right1) {
-        	return RIGHT_NAME;
-        } else {
-        	return OUT_OF_RIGHT;
-        }
-
-	}
-
-    // TODO: dead?
-//	private Node cutCurrentNode(int pos[], Node currentNode,
-//			IDOMPosition position) {
-//		// at right edge
-//		int curpos = EditModelQuery.getIndexedRegionLocation(position);
-//		if (pos[0] <= curpos) {
-//			pos[1] = EditModelQuery.getNodeStartIndex(currentNode);
-//			currentNode = deleteNode(currentNode);
-//			if (INNER_DEBUG) {
-//				_log.info("cut:" + currentNode);
-//			}
-//			return currentNode;
-//		} else if (pos[1] >= curpos) {
-//			pos[0] = EditModelQuery.getNodeEndIndex(currentNode);
-//			currentNode = deleteNode(currentNode);
-//			if (INNER_DEBUG) {
-//				_log.info("cut:" + currentNode);
-//			}
-//			return currentNode;
-//		}
-//		return null;
-//	}
-
-    //TODO: dead?
-//	private int getPos(DOMRange range, boolean forStart) {
-//		if (forStart) {
-//			return EditModelQuery.getIndexedRegionLocation(range
-//					.getStartPosition());
-//		} else {
-//			return EditModelQuery.getIndexedRegionLocation(range
-//					.getEndPosition());
-//		}
-//	}
-
-	/**
-	 * @param position
-	 * @param forward
-	 * @return the edit part for position
-	 */
-	public EditPart getEditPart(DesignPosition position, boolean forward) {
-		if (position instanceof DesignRefPosition) {
-			return ((DesignRefPosition) position).getRefPart();
-		}
-		EditPart container = position.getContainerPart();
-		if (container instanceof TextEditPart) {
-			return container;
-		}
-		if (container != null) {
-			List children = container.getChildren();
-			for (int i = 0, n = children.size(); i < n; i++) {
-				if (i == position.getOffset()) {
-					int index = (forward) ? i - 1 : i + 1;
-					if (index < 0) {
-						index = 0;
-					}
-					if (index >= children.size()) {
-						index = children.size() - 1;
-					}
-
-					return (EditPart) children.get(index);
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param position
-	 * @return the resulting dom position
-	 */
-	public static IDOMPosition splitNode(IDOMPosition position) {
-		if (EditValidateUtil.validPosition(position)) {
-			Node container = null;
-			// Avoid to split tag at its edge
-			if (position.getOffset() > 0) {
-				if (position.isText()) {
-					container = position.getContainerNode();
-					if (position.getOffset() < ((Text) container).getLength()) {
-						position = DOMPositionHelper.splitText(position);
-					} else {
-						// position = new
-						// DOMRefPosition(position.getContainerNode(), true);
-					}
-				} else {
-					if (position.getNextSiblingNode() != null) {
-						container = position.getContainerNode();
-						Node parent = container.getParentNode();
-
-						Document document = EditModelQuery
-								.getDocumentNode(container);
-						Node newContainer = document.createElement(container
-								.getNodeName());
-						Node node = position.getPreviousSiblingNode();
-						Node refNode = null;
-						while (node != null) {
-							Node prev = node.getPreviousSibling();
-							node = node.getParentNode().removeChild(node);
-
-							newContainer.insertBefore(node, refNode);
-							refNode = node;
-							node = prev;
-						}
-						parent.insertBefore(newContainer, container);
-						// set the newContainer node align attribute to the
-						// original align attribue
-						// copy nodes under container node to container node's
-						// parent node
-						if (container.getNodeName().equalsIgnoreCase(
-								IHTMLConstants.TAG_P)) {
-							Element pNode = (Element) container;
-							String align = pNode
-									.getAttribute(IHTMLConstants.ATTR_ALIGN);
-							if (align != null && !"".equalsIgnoreCase(align)) { //$NON-NLS-1$
-								((Element) newContainer).setAttribute(
-										IHTMLConstants.ATTR_ALIGN, align);
-							}
-							NodeList nodeList = pNode.getChildNodes();
-							for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-								Node tempNode = nodeList.item(i);
-								parent.insertBefore(tempNode, container);
-							}
-						}
-						return new DOMRefPosition(newContainer, true);
-					}
-//                    position = new
-//                    DOMRefPosition(position.getContainerNode(), true);
-				}
-			} else {
-				// container = position.getContainerNode();
-				// position = new DOMRefPosition(container, false);
-			}
-		}
-		return position;
-	}
-
-	/**
-	 * @param position 
-	 * @return the position of this 'position' in relative to it's container.
-	 */
-	public static int getLocation(IDOMPosition position) {
-		if (position.getOffset() == 0) {
-			return -1;
-		}
-        if (position.isText()) {
-        	if (position.getOffset() == ((Text) position.getContainerNode())
-        			.getLength()) {
-        		return 1;
-        	}
-            return 0;
-        }
-        if (position.getOffset() == position.getContainerNode()
-        		.getChildNodes().getLength()) {
-        	return 1;
-        }
-        return 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditModelQuery.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditModelQuery.java
deleted file mode 100644
index acbc7a7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditModelQuery.java
+++ /dev/null
@@ -1,1816 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.HTMLEditPartsFactory;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.swt.SWT;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public final class EditModelQuery {
-	private static Logger _log = PDPlugin.getLogger(EditModelQuery.class);
-
-	private static EditModelQuery _instance;
-
-	private static final int START_INDEX_BEFORE_TAG = 1;
-
-	private static final int END_INDEX_WITHIN_TAG = 2;
-
-	private static final HashSet SPECIAL_EMPTY_CHARS = new HashSet();
-
-	/**
-	 * Maps unicode Characters to html equivalents
-	 */
-	public static final HashMap CHAR_NODE_MAP = new HashMap();
-
-	// Cursor can't go outside of these container.
-	private static final HashSet HTML_CONSTRAINED_CONTAINERS = new HashSet();
-
-	/**
-	 * HTML tags that control style
-	 */
-	public static final HashSet HTML_STYLE_NODES = new HashSet();
-
-	static final HashSet UNREMOVEBLE_TAGS = new HashSet();
-
-	static {
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_HTML);
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_HEAD);
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_BODY);
-		EditModelQuery.CHAR_NODE_MAP.put(new Character(SWT.CR),
-				IHTMLConstants.TAG_BR);
-		EditModelQuery.CHAR_NODE_MAP.put(new Character(SWT.LF),
-				IHTMLConstants.TAG_BR);
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add(" "); //$NON-NLS-1$
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\t"); //$NON-NLS-1$
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\r"); //$NON-NLS-1$
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\n"); //$NON-NLS-1$
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS.add(IHTMLConstants.TAG_TD);
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS.add(IHTMLConstants.TAG_TR);
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS
-				.add(IHTMLConstants.TAG_TABLE);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_B);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_EM);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H1);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H2);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H3);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H4);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H5);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H6);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_A);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_U);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_I);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_S);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_STRONG);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_TT);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_BIG);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_SMALL);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_FONT);
-	}
-
-	private EditModelQuery() {
-        // no  external instantiation
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static EditModelQuery getInstance() {
-		if (_instance == null) {
-			_instance = new EditModelQuery();
-		}
-		return _instance;
-	}
-
-	/**
-	 * Get previous sibling, or if sibling is null then get previous neighbor.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getPreviousNeighbor(Node node) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getPreviousSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getPreviousSibling()
-				: null;
-	}
-
-	/**
-	 * Get privous sibling, or if sibling is null then get previous neighor's
-	 * rightmost child, which is adjacent to 'node'.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getPreviousLeafNeighbor(Node node) {
-		return getLastLeafChild(getPreviousNeighbor(node));
-	}
-
-	/**
-	 * Get next sibling, or if sibling is null get next neighbor.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getNextNeighbor(Node node) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getNextSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getNextSibling()
-				: null;
-	}
-
-	/**
-	 * Get next sibling, or if sibling is null get next neighbor's leftmost leaf
-	 * child which will be adjacent to 'node'.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getNextLeafNeighbor(Node node) {
-		return getFirstLeafChild(getNextNeighbor(node));
-	}
-
-	/**
-	 * Get node's rightmost leaf child.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	private Node getLastLeafChild(Node node) {
-		if (node == null) {
-			return null;
-		}
-		if (node.getLastChild() != null) {
-			return getLastLeafChild(node.getLastChild());
-		}
-        return node;
-	}
-
-	/**
-	 * Get node's leftmost leaf child.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	private Node getFirstLeafChild(Node node) {
-		if (node == null) {
-			return null;
-		}
-
-		if (node.getFirstChild() != null) {
-			return getFirstLeafChild(node.getFirstChild());
-		}
-        return node;
-	}
-
-	/**
-	 * To see if node is within a indexed region that is started from 'start',
-	 * ended at 'end'
-	 */
-	static boolean within(int start, int end, Node theNode) {
-		return getNodeStartIndex(theNode) >= start
-				&& getNodeEndIndex(theNode) <= end;
-	}
-
-	/**
-	 * To see whether the 'position' is within indexed location (start, end)
-	 * 
-	 * @param start
-	 * @param end
-	 * @param position
-	 * @return
-	 */
-	 boolean within(int start, int end, IDOMPosition position) {
-		int pos = getIndexedRegionLocation(position);
-		return start <= pos && pos <= end;
-	}
-
-	/**
-	 * To see whether the 'theNode' is not within indexed region (start, end)
-	 * 
-	 * @param start
-	 * @param end
-	 * @param theNode
-	 * @return
-	 */
-	static boolean outOf(int start, int end, Node theNode) {
-		if (getNodeLenth(theNode) > 0) {
-			return getNodeStartIndex(theNode) >= end
-					|| getNodeEndIndex(theNode) <= start;
-		}
-        return !((getNodeStartIndex(theNode) >= start && getNodeEndIndex(theNode) <= end));
-	}
-
-	/**
-	 * Determine whether the position is at node's edge. When the offset is at
-	 * edge, it is in the leftmost or rightmost offset of node's region.
-	 * 
-	 * @param position 
-	 * @param forward 
-	 * @return true if at edge
-	 */
-	boolean atEdge(IDOMPosition position, boolean forward) {
-		Node node = position.getContainerNode();
-		int offset = position.getOffset();
-		if (forward) {
-			if (EditModelQuery.isText(node)) {
-				return offset == node.getNodeValue().length();
-			}
-            return offset == node.getChildNodes().getLength();
-		}
-        return offset == 0;
-	}
-
-	/**
-	 * Get node's neighbor on the node tree, if forward, then get next,
-	 * otherwise go backward.
-	 * 
-	 * @param node
-	 * @param forward
-	 * @return the node
-	 */
-	Node getNeighbor(Node node, boolean forward) {
-		if (forward) {
-			return getNextNeighbor(node);
-		}
-        return getPreviousNeighbor(node);
-	}
-
-	/**
-	 * Get neighbor which is descendent of root.
-	 * 
-	 * @param node
-	 * @param root
-	 * @return the node
-	 */
-	Node getPreviousNeighbor(Node node, Node root) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-		while (node != null && node != root
-				&& node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getPreviousSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node != root && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getPreviousSibling()
-				: null;
-	}
-
-	/**
-	 * Get neighbor which is descendent of root.
-	 * 
-	 * @param node
-	 * @param root
-	 * @return the node
-	 */
-	Node getNextNeighbor(Node node, Node root) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-
-		while (node != null && node != root
-				&& node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getNextSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node != root && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getNextSibling()
-				: null;
-	}
-
-	/**
-	 * Get neighbor which is descendent of root.
-	 * 
-	 * @param node
-	 * @param forward
-	 * @param root
-	 * @return the node
-	 */
-	 Node getNeighbor(Node node, boolean forward, Node root) {
-		Assert.isTrue(root != null);
-		if (forward) {
-			return getNextNeighbor(node, root);
-		}
-        return getPreviousNeighbor(node, root);
-	}
-
-	/**
-	 * Get node's leaf child which is adjacent to 'node', according to
-	 * 'forward', it will search backward or forward.
-	 * 
-	 * @param node
-	 * @param forward
-	 * @return the node
-	 */
-	Node getLeafNeighbor(Node node, boolean forward) {
-		if (node == null) {
-			return null;
-		}
-		if (forward) {
-			return getNextLeafNeighbor(node);
-		}
-        return getPreviousLeafNeighbor(node);
-	}
-
-	/**
-	 * Get neighbor's leaf child, which is adjacent to 'node'
-	 * 
-	 * @param node
-	 * @param childIndex
-	 * @param forward
-	 * @return the node
-	 */
-	 Node getLeafNeighbor(Node node, int childIndex, boolean forward) {
-		if (node == null) {
-			return null;
-		}
-		Node neighbor = getNeighbor(node, childIndex, forward);
-		if (neighbor != null) {
-			if (forward) {
-				return getFirstLeafChild(neighbor);
-			}
-            return getLastLeafChild(neighbor);
-		}
-		return null;
-	}
-
-	/**
-	 * First try sibling, if it retruns null, try search neighbor.
-	 * 
-	 * @param parent
-	 * @param childIndex
-	 * @param forward
-	 * @return the node
-	 */
-	 Node getNeighbor(Node parent, int childIndex, boolean forward) {
-		if (!EditValidateUtil.validNode(parent)) {
-			return null;
-		}
-
-		NodeList nodeList = parent.getChildNodes();
-		if (nodeList != null && nodeList.getLength() > 0) {
-			if (nodeList.getLength() < childIndex) {
-				return null;
-			}
-			Node childNode = null;
-			if (!forward) {
-				--childIndex;
-			}
-			childNode = nodeList.item(childIndex);
-			if (childNode != null) {
-				return childNode;
-			}
-            return getNeighbor(parent, forward);
-		}
-        if (parent.getNodeType() == Node.TEXT_NODE) {
-        	return getNeighbor(parent, forward);
-        }
-        return null;
-	}
-
-	/**
-	 * To see whether the textSelection start and end are on the same.
-	 * 
-	 * @param model
-	 * @param textSelection
-	 * @return the node
-	 */
-	 static boolean isSame(IStructuredModel model,
-			TextSelection textSelection) {
-		if (model != null && textSelection != null) {
-			int t1 = textSelection.getOffset();
-			int t2 = textSelection.getLength() + t1;
-			return model.getIndexedRegion(t1) == model.getIndexedRegion(t2);
-		}
-		return false;
-	}
-
-	/**
-	 * To see if the range and text selection covered the same range.
-	 * 
-	 * @param model
-	 * @param range
-	 * @param textSelection
-	 * @return true if same
-	 */
-	static boolean isSame(IStructuredModel model, DesignRange range,
-			TextSelection textSelection) {
-		if (model != null && range != null && textSelection != null) {
-			int t1 = textSelection.getOffset();
-			int t2 = textSelection.getLength() + t1;
-			int r1 = getIndexedRegionLocation(DOMRangeHelper.toDOMRange(range)
-					.getStartPosition());
-			int r2 = getIndexedRegionLocation(DOMRangeHelper.toDOMRange(range)
-					.getEndPosition());
-			return (model.getIndexedRegion(t1) == model.getIndexedRegion(r1) && //
-					model.getIndexedRegion(t2) == model.getIndexedRegion(r2))
-					|| (model.getIndexedRegion(t2) == model
-							.getIndexedRegion(r1) && //
-					model.getIndexedRegion(t1) == model.getIndexedRegion(r2));
-		}
-		return false;
-	}
-
-	/**
-	 * To see whether the selection is single point.
-	 * 
-	 * @param textSelection
-	 * @return true if same point
-	 */
-	 static boolean isSamePoint(TextSelection textSelection) {
-		return textSelection.getLength() == 0;
-	}
-
-	/**
-	 * To see whether two IDOMPosition are pointed to a same location.
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return true if same
-	 */
-	public static boolean isSame(IDOMPosition p1, IDOMPosition p2) {
-		if (p1 == p2
-				|| (p1.getContainerNode() == p2.getContainerNode() && p1
-						.getOffset() == p2.getOffset())) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * To see whether the range's start and end position are pointed to a same
-	 * location.
-	 * 
-	 * @param range
-	 * @return true if is same
-	 */
-	public static boolean isSame(DOMRange range) {
-		EditValidateUtil.validRange(range);
-		return isSame(range.getStartPosition(), range.getEndPosition());
-	}
-
-	/**
-	 * @param range
-	 * @return true if same
-	 */
-	public static boolean isSame(DesignRange range) {
-		return isSame(range.getStartPosition(), range.getEndPosition());
-	}
-
-	/**
-	 * @param p1
-	 * @param p2
-	 * @return true if same
-	 */
-	public static boolean isSame(DesignPosition p1, DesignPosition p2) {
-		if (p1 == p2) {
-			return true;
-		}
-		if (p1.getContainerNode() == p2.getContainerNode()
-				&& p1.getOffset() == p2.getOffset()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param p1
-	 * @param p2
-	 * @return true if p1 and p2 are within same text node
-	 */
-	final boolean isWithinSameText(IDOMPosition p1, IDOMPosition p2) {
-		if (p1 == null || p2 == null) {
-			return false;
-		}
-		return p1.isText() && p2.isText()
-				&& p1.getContainerNode() == p2.getContainerNode();
-	}
-
-	/**
-	 * Get the node absolute start location in its residing IStructuredModel.
-	 * 
-	 * @param p
-	 * @return the location
-	 */
-	public static int getIndexedRegionLocation(IDOMPosition p) {
-		if (!EditValidateUtil.validPosition(p)) {
-			return -1;
-		}
-		Node parent = p.getContainerNode();
-		if (p.isText()) {
-			return ((IndexedRegion) parent).getStartOffset() + p.getOffset();
-		}
-        int index = p.getOffset();
-        if (!parent.hasChildNodes()) {
-        	// Element:
-        	if (!isDocument(parent)) {
-        		IStructuredDocumentRegion region = ((IDOMNode) parent)
-        				.getStartStructuredDocumentRegion();
-        		return region.getEnd();
-        	}
-            // Document node:
-            int offset = ((IndexedRegion) parent).getStartOffset();
-            return offset;
-        }
-        NodeList children = parent.getChildNodes();
-        // After rightmost child
-        if (children.getLength() == index) {
-        	if (!isDocument(parent)) {
-        		int pos = getNodeEndNameStartIndex(parent);
-        		return pos;
-        	}
-            int offset = ((IndexedRegion) parent).getEndOffset();
-            return offset;
-        }
-        Node node = children.item(index);
-        return ((IndexedRegion) node).getStartOffset();
-	}
-
-	/**
-	 * To determine whether the position is at the edge of a node. TODO: temp
-	 * func for later combination
-	 * @param nodePos 
-	 * 
-	 * @param position
-	 * @param left 
-	 * @return true if linked
-	 */
-	boolean isLinked(IDOMPosition nodePos, IDOMPosition position,
-			boolean left) {
-		int index = getIndexedRegionLocation(position);
-		if (left) {
-			int pos = getIndexedRegionLocation(nodePos);
-			return pos == index;
-		}
-        Node node = null;
-        int end;
-        if (nodePos.isText()) {
-        	node = nodePos.getContainerNode();
-        	end = ((IndexedRegion) node).getEndOffset();
-        } else {
-        	node = nodePos.getNextSiblingNode();
-        	Assert.isTrue(node != null);
-        	end = ((IndexedRegion) node).getEndOffset();
-        }
-        return end == index;
-	}
-
-	/**
-	 * To see if the location is at the node's indexed pos, posType can be
-	 * START_INDEX_BEFORE_TAG, END_INDEX_WITHIN_TAG When location is at these
-	 * two position, webtools returns the container tag name, so we need to know
-	 * these.
-	 * 
-	 * @param location
-	 * @param node
-	 * @return true if at edge
-	 */
-	boolean isAtNodeNameEdge(int location, Node node, int posType) {
-		int start = getNodeEndNameStartIndex(node);
-		return location == start;
-	}
-
-	/**
-	 * @param location
-	 * @param node
-	 * @return true if at edge
-	 */
-	public boolean isAtNodeNameEdge(int location, Node node) {
-		return isAtNodeNameEdge(location, node, START_INDEX_BEFORE_TAG)
-				|| isAtNodeNameEdge(location, node, END_INDEX_WITHIN_TAG);
-	}
-
-	/**
-	 * If text only contains chars '\r' or '\n', it is considered to be
-	 * transparent.
-	 * 
-	 * @param node
-	 * @return true if transparent text
-	 */
-	 public static boolean isTransparentText(Node node) {
-		// should valid non null?
-		Assert.isTrue(node != null);
-		if (node == null || !isText(node)) {
-			return false;
-		}
-		if (!EditValidateUtil.validText(node)) {
-			return false;
-		}
-
-		Text text = (Text) node;
-		if (text.getLength() == 0) {
-			return true;
-		}
-		String value = text.getNodeValue();
-		int i = 0;
-		while (i < value.length() && HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-			i++;
-		}
-		return i == value.length();
-	}
-
-	/**
-	 * Get node index in its parent's children.
-	 * 
-	 * @param node
-	 * @return the node index or -1 if not found
-	 */
-	 static int getNodeIndex(Node node) {
-		EditValidateUtil.validNode(node);
-		Node parent = node.getParentNode();
-		int index = 0;
-		for (Node child = parent.getFirstChild(); child != null; child = child
-				.getNextSibling()) {
-			if (child == node) {
-				return index;
-			}
-			index++;
-		}
-		return -1; // error
-	}
-
-	/**
-	 * If parent has more than one children of which each node's localName is
-	 * the same as of 'node', return the index of 'node' in the same type
-	 * children list.
-	 * 
-	 * @param node
-	 * @return the index
-	 */
-	 public int getSameTypeNodeIndex(Node node) {
-		EditValidateUtil.validNode(node);
-		int i = 0;
-		while (node != null) {
-			Node sibling = node.getPreviousSibling();
-			if (sibling != null && sibling.getLocalName() != null
-					&& sibling.getLocalName().equals(node.getLocalName())) {
-				i++;
-			}
-			node = sibling;
-		}
-		return i; // error
-	}
-
-	/**
-	 * Start from position, skip transparent chars, and returns the first
-	 * non-transparent char's index. based on 'forward', go previously or next .
-	 * 
-	 * @param value
-	 * @param position
-	 * @param forward
-	 * @return the position
-	 */
-	 int getNextConcretePosition(String value, int position,
-			boolean forward) {
-		if (value == null) {
-			return -1;
-		}
-		if (value.length() == 0) {
-			return 0;
-		}
-		// validate
-		Assert.isTrue(position >= 0 && position <= value.length());
-		int i = -1;
-		if (forward) {
-			i = position;
-			while (i < value.length()
-					&& (value.charAt(i) == SWT.CR || value.charAt(i) == SWT.LF)) {
-				i++;
-			}
-			return i;
-		}
-        i = position - 1;
-        while (i >= 0
-        		&& (value.charAt(i) == SWT.CR || value.charAt(i) == SWT.LF)) {
-        	i--;
-        }
-        return i + 1;
-	}
-
-	/**
-	 * Get two nodes' lowest common ancestor.
-	 * 
-	 * @param node1
-	 * @param node2
-	 * @return the node
-	 */
-	 public Node getCommonAncestor(Node node1, Node node2) {
-		if (node1 == null || node2 == null) {
-			return null;
-		}
-
-		for (Node na = node1; na != null; na = na.getParentNode()) {
-			for (Node ta = node2; ta != null; ta = ta.getParentNode()) {
-				if (ta == na)
-					return ta;
-			}
-		}
-		return null; // not found
-	}
-
-	/**
-	 * Get lowest common ancestor of two IDOMPositions' container nodes..
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return the nodeh
-	 */
-	public Node getCommonAncestor(IDOMPosition p1, IDOMPosition p2) {
-		Node n1 = p1.getContainerNode();
-		Node n2 = p2.getContainerNode();
-		return getCommonAncestor(n1, n2);
-	}
-
-	/**
-	 * Get lowest ancestor of a 'node' which is block type.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	 Node getBlockAncestor(Node node) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-		while (node != null && isChild(IHTMLConstants.TAG_BODY, node, true)) {
-			if (isBlockNode(node)) {
-				return node;
-			}
-			node = node.getParentNode();
-		}
-		return null;
-	}
-
-	/**
-	 * To see whether a node is block type.
-	 * 
-	 * @param node
-	 * @return true if is a block node
-	 */
-	public static boolean isBlockNode(Node node) {
-		return !isInline(node);
-	}
-
-	/**
-	 * @param node
-	 * @return true if is table cell
-	 */
-	static boolean isTableCell(Node node) {
-		if (node instanceof INodeNotifier) {
-			Object adapter = ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (adapter != null) {
-				ICSSStyle style = (ICSSStyle) adapter;
-				String display = style.getDisplay();
-				return display.equalsIgnoreCase(ICSSPropertyID.VAL_TABLE_CELL);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * To see if a node's display type is inline.
-	 * 
-	 * @param refNode 
-	 * @return true if is inline
-	 */
-	public static boolean isInline(Node refNode) {
-		Node node = refNode;
-		EditPart part = Target.resolvePart(node);
-		if (part instanceof ElementEditPart) {
-			node = ((ElementEditPart) part).getTagConvert().getResultElement();
-		}
-		if (isText(node)) {
-			return true;
-		} else if (node instanceof INodeNotifier) {
-			Object adapter = ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (adapter != null) {
-				ICSSStyle style = (ICSSStyle) adapter;
-				String display = style.getDisplay();
-				return (display.equalsIgnoreCase(ICSSPropertyID.VAL_INLINE)
-						|| //
-						display
-								.equalsIgnoreCase(ICSSPropertyID.VAL_INLINE_TABLE)
-						|| //
-						display.equalsIgnoreCase(ICSSPropertyID.VAL_COMPACT) || //
-				display.equalsIgnoreCase(ICSSPropertyID.VAL_RUN_IN));
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param node
-	 * @return true if is list item
-	 */
-	public static boolean isListItem(Node node) {
-		if (node instanceof INodeNotifier) {
-			Object adapter = ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (adapter != null) {
-				ICSSStyle style = (ICSSStyle) adapter;
-				String display = style.getDisplay();
-				return (display.equalsIgnoreCase(ICSSPropertyID.VAL_LIST_ITEM));
-			}
-		}
-		return false;
-	}
-
-	/**
-     * The net effect of this method is that (subject to flags), true
-     * is returned if 'node' is the descendant (not really a child)
-     * of a tag with a local name in the list of 'names'.
-     * 
-     * TODO C.B: I hate method.  Need to rename and possibly rewrite
-     * 
-	 * @param names -- check this list for valid local names
-	 * @param node -- the node to check
-	 * @param ignoreCase -- if true, each node name has toLowerCase applied to
-     * it before checking for it names.  NOTE: this assumes that names is already
-     * in lowercase.  TODO: this is crappy assumption
-	 * @param noSame -- if true, then node is skipped and only its parent nodes are
-     * checked
-	 * @return true if the local name of node or one of its parents
-     * is in the array of Strings called names.
-	 */
-	public static boolean isChild(final String names[], Node node,
-			boolean ignoreCase, boolean noSame) {
-		if (node == null) {
-			return false;
-		}
-		if (noSame) {
-			node = node.getParentNode();
-		}
-        
-        final List namesAsList = Arrays.asList(names);
-        
-		while (node != null && !isDocument(node)) {
-			String nodeName = node.getLocalName();
-
-			if (nodeName != null)
-            {
-			    if (ignoreCase)
-                {
-			        nodeName = nodeName.toLowerCase();
-                }
-                
-                if (namesAsList.contains(nodeName))
-                {
-                    return true;
-                }
-			}
-            Node oldNode = node;
-			node = node.getParentNode();
-            if (oldNode == node)
-            {
-                throw new IllegalStateException("Infinite loop discovered in DOM tree"); //$NON-NLS-1$
-            }
-		}
-		return false;
-	}
-
-	/**
-	 * Determine whether a node is a child of node that is named as 'name', if
-	 * the node itself is named as 'name' return true also.
-	 * 
-	 * @param name
-	 * @param node
-	 * @param ignoreCase 
-	 * @return true if is child
-	 */
-	public static boolean isChild(String name, Node node, boolean ignoreCase) {
-		if (node == null) {
-			return false;
-		}
-
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
-			String nodeName = node.getLocalName();
-			if (nodeName != null
-					&& (ignoreCase && name.equalsIgnoreCase(nodeName) || !ignoreCase
-							&& name.equalsIgnoreCase(nodeName))) {
-				return true;
-			}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * To see whether 'node' is 'ancestor's child.
-	 * 
-	 * @param ancestor
-	 * @param node
-	 * @return true if is child
-	 */
-	public static boolean isChild(Node ancestor, Node node) {
-		if (node == null || ancestor == null) {
-			return false;
-		}
-
-		if (isDocument(ancestor)) {
-			return true;
-		}
-		while (node != null && !isDocument(ancestor)) {
-			if (node == ancestor) {
-				return true;
-			}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * Get next sibling node to position's container node.
-	 * 
-	 * @param position
-	 * @return the node
-	 */
-	Node getNextSibling(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getNextSibling();
-		}
-        return position.getNextSiblingNode();
-	}
-
-	/**
-	 * Get previous sibling node to position's container node.
-	 * 
-	 * @param position
-	 * @return the node
-	 */
-	Node getPreviousSibling(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getPreviousSibling();
-		}
-        return position.getPreviousSiblingNode();
-	}
-
-	/**
-	 * Get position's container node's parent.
-	 * 
-	 * @param position
-	 * @return the parent node
-	 */
-	Node getParent(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getParentNode();
-		}
-        return position.getContainerNode();
-	}
-
-	/**
-	 * Get node's sibling according to 'forward' direction
-	 * 
-	 * @param node
-	 * @param forward
-	 * @return the node
-	 */
-	public Node getSibling(Node node, boolean forward) {
-		EditValidateUtil.validNode(node);
-		if (forward) {
-			return node.getNextSibling();
-		}
-        return node.getPreviousSibling();
-	}
-
-	/**
-	 * Get position's container node's sibling.
-	 * 
-	 * @param position
-	 * @param forward
-	 * @return the node
-	 */
-	public Node getSibling(IDOMPosition position, boolean forward) {
-		if (forward) {
-			return getNextSibling(position);
-		}
-        return getPreviousSibling(position);
-	}
-
-	/**
-	 * Get position's container node's editable items number. this is temp
-	 * functions for future use.
-	 * 
-	 * @param position
-	 * @return the size
-	 */
-	int getSize(IDOMPosition position) {
-		EditValidateUtil.validPosition(position);
-		if (position.isText()) {
-			return ((Text) position.getContainerNode()).getLength();
-		}
-        if (position.getContainerNode().hasChildNodes()) {
-        	return position.getContainerNode().getChildNodes().getLength();
-        }
-        return 0;
-	}
-
-	/**
-	 * Valid position and return text, if it contains text node.
-	 * 
-	 * @param position
-	 * @return the text
-	 */
-	public Text getText(IDOMPosition position) {
-		if (position.isText()) {
-			if (position.getContainerNode() != null) {
-				return (Text) position.getContainerNode();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param node
-	 * @return the document for  node
-	 */
-	public static Document getDocumentNode(Node node) {
-		if (node != null) {
-			return isDocument(node) ? (Document) node : node.getOwnerDocument();
-		}
-		return null;
-	}
-
-	/**
-	 * To see whether a node is empty, here we can insert rules to see whether
-	 * it is empty, for delete operation, it could be deleted.
-	 * 
-	 * @param node
-	 * @return true if node empty
-	 */
-	static boolean isEmptyNode(Node node) {
-		if (node.getNodeType() == Node.TEXT_NODE) {
-			return isTransparentText(node);
-		}
-		if (node.getChildNodes() == null
-				|| node.getChildNodes().getLength() == 0) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * To see whther a node is text node.
-	 * 
-	 * @param node
-	 * @return true if the node is a text node
-	 */
-	public static boolean isText(Node node) {
-		return node != null && node.getNodeType() == Node.TEXT_NODE;
-	}
-
-	/**
-	 * To see whether a node is Document node.
-	 * 
-	 * @param node
-	 * @return true if the node is a doc node
-	 */
-	public static boolean isDocument(Node node) {
-		return node != null && node.getNodeType() == Node.DOCUMENT_NODE;
-	}
-
-	/**
-	 * Get style from parent node. from first paret 'firstF', we will traverse
-	 * the tree up untile reaching Document node, get all style node's, we may
-	 * insert rules here to stop the search at a before paricular node. Style
-	 * nodes could <b>, <u>...
-	 * 
-	 * @param children
-	 * @param firstF
-	 */
-	void assignFather(Vector children, Node firstF) {
-		if (children.size() == 0) {
-			return;
-		}
-		if (firstF != null && !isDocument(firstF)) {
-			String name = firstF.getNodeName();
-			// To see whether it is a style node that is our anticipated node.
-			if (name != null && HTML_STYLE_NODES.contains(name.toLowerCase())) {
-				Node newParent = firstF.cloneNode(false);
-				while (children.size() > 0) {
-					newParent.appendChild((Node) children.remove(0));
-				}
-				children.add(newParent);
-			}
-			assignFather(children, firstF.getParentNode());
-		}
-	}
-
-	/**
-	 * Get a node that is at Indexed position 'pos' in 'model'.
-	 * 
-	 * @param model
-	 * @param pos
-	 * @return the
-	 */
-	IndexedRegion getPosNode(IStructuredModel model, int pos) {
-		IndexedRegion inode = model.getIndexedRegion(pos);
-		return inode;
-	}
-
-	/**
-	 * If the pos is at right edge within container.
-	 * 
-	 * @param node
-	 * @param pos
-	 * @return true is at right edge
-	 */
-	boolean isAtRightMostWithin(Node node, int pos) {
-		return getNodeEndNameStartIndex(node) == pos;
-	}
-
-	/**
-	 * Create the node, if 'refNode' is null, then position is at the edge of
-	 * 'container'. otherwize calculate refNode's related index in its parent's
-	 * children list and return DOMPosition.
-	 * 
-	 * @param container
-	 * @param refNode
-	 * @param forward  
-	 * @return the dom position
-	 */
-	IDOMPosition createDomposition(Node container, Node refNode,
-			boolean forward) {
-		if (refNode == null) {
-			if (forward && container.hasChildNodes()) {
-				return new DOMPosition(container, container.getChildNodes()
-						.getLength());
-			}
-            return new DOMPosition(container, 0);
-		}
-        Assert.isTrue(refNode.getParentNode() == container);
-        int index = getNodeIndex(refNode);
-        if (!forward) {
-        	index++;
-        }
-        return new DOMPosition(container, index);
-	}
-
-	/**
-	 * @param fModel
-	 * @param textSelection
-	 * @return the design range
-	 */
-	static DesignRange convertToDesignRange(IStructuredModel fModel,
-			TextSelection textSelection) {
-		int start = textSelection.getOffset();
-		int end = textSelection.getLength() + start;
-		IDOMPosition startDomPos = EditModelQuery.getInstance()
-				.createDomposition((IDOMModel) fModel, start, false);
-		IDOMPosition endDomPos = EditModelQuery.getInstance()
-				.createDomposition((IDOMModel) fModel, end, false);
-		if (startDomPos == null) {
-			startDomPos = endDomPos;
-		} else if (endDomPos == null) {
-			endDomPos = startDomPos;
-		}
-		if (startDomPos != null) {
-			DesignPosition startPos = null, endPos = null;
-			startPos = DOMPositionHelper.toDesignPosition(startDomPos);
-			endPos = DOMPositionHelper.toDesignPosition(endDomPos);
-			if (startPos != null) {
-				return new DesignRange(startPos, endPos);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Create IDOMPosition based on Indexed 'position' in model. If node at
-	 * position is text, use position to calculate DOMPosition offset,
-	 * otherwize, simply create position pointed to container's children list's
-	 * edge.
-	 * 
-	 * @param model
-	 * @param position
-	 * @param adjust 
-	 * @return the dom position
-	 */
-	public IDOMPosition createDomposition(IDOMModel model, int position,
-			boolean adjust) {
-		return createDomposition1(model, position, adjust);
-	}
-
-	/**
-	 * Create IDOMPosition based on Indexed 'position' in model. If node at
-	 * position is text, use position to calculate DOMPosition offset,
-	 * otherwize, simply create position pointed to container's children list's
-	 * edge.
-	 * 
-	 * @param model
-	 * @param position
-	 * @param adjust 
-	 * @return the dom position
-	 */
-	public IDOMPosition createDomposition1(IDOMModel model, int position,
-			boolean adjust) {
-		try {
-			// get the container
-			Object object = getPosNode(model, position);
-			if (object == null && position > 0) {
-				// The end of file?
-				object = getPosNode(model, position - 1);
-			}
-			Node container = null;
-			if (object == null) {
-				// empty file?
-				return new DOMPosition(model.getDocument(), 0);
-			}
-			container = (Node) object;
-			Object oppNode = getPosNode(model, position - 1);
-			if (oppNode != null
-					&& !EditModelQuery.isChild((Node) oppNode, container)
-					&& //
-					!EditModelQuery.isInline(container)
-					&& EditModelQuery.isInline((Node) oppNode)) {
-				container = (Node) oppNode;
-			}
-			int location = EditHelper.getInstance().getLocation(container,
-					position, false);
-			IDOMPosition result = null;
-			switch (location) {
-			case 1:
-			case 2:
-				result = new DOMRefPosition(container, false);
-				break;
-			case 4:
-			case 5:
-				result = new DOMRefPosition(container, true);
-				break;
-			case 3:
-				if (EditModelQuery.isText(container)) {
-					result = new DOMPosition(container, position
-							- EditModelQuery.getNodeStartIndex(container));
-				} else {
-					result = new DOMPosition(container, container
-							.getChildNodes().getLength());
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// "Error in position creation"
-			_log.error("Error.EditModelQuery.0" + e); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-	/**
-	 * Calculate node's Indexed length in model.
-	 * 
-	 * @param node
-	 * @return the node length
-	 */
-	public static int getNodeLenth(Node node) {
-		if (node != null
-               && EditValidateUtil.validNode(node)) {
-			return ((IndexedRegion) node).getEndOffset()
-					- ((IndexedRegion) node).getStartOffset();
-		}
-        return 0;
-	}
-
-	/**
-	 * Return 'node' indexed start position Example: |<a></a>, the position is
-	 * indicated by '|'
-	 * 
-	 * @param node
-	 * @return the start index
-	 */
-	public static int getNodeStartIndex(Node node) {
-		if (EditValidateUtil.validNode(node) && node instanceof IndexedRegion) {
-			return ((IndexedRegion) node).getStartOffset();
-		}
-		return -1;
-	}
-
-	/**
-	 * Return 'node' indexed end position Example: <a></a>|, the position is
-	 * indicated by '|'
-	 * 
-	 * @param node
-	 * @return the end index
-	 */
-	public static int getNodeEndIndex(Node node) {
-		if (EditValidateUtil.validNode(node) && node instanceof IndexedRegion) {
-			return ((IndexedRegion) node).getEndOffset();
-		}
-		return -1;
-	}
-
-	/**
-	 * Get node at indexed position.
-	 * 
-	 * @param model 
-	 * @param position
-	 * @return the node at position
-	 */
-	static Node getNodeAt(IStructuredModel model, int position) {
-		try {
-			IndexedRegion region = model.getIndexedRegion(position);
-			if (region instanceof Node) {
-				return (Node) region;
-			}
-			return null;
-		} catch (Exception e) {
-			// "Error in region node creation"
-			_log.error("Error.EditModelQuery.1", e); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-	/**
-	 * Return 'node' indexed start name's end position Example: <a>|aaa </a>,
-	 * the position is indicated by '|'
-	 * 
-	 * @param node
-	 * @return the index
-	 */
-	public static int getNodeStartNameEndIndex(Node node) {
-		if (isText(node)) {
-			return getNodeStartIndex(node);
-		}
-		if (EditValidateUtil.validNode(node) && node instanceof IDOMNode) {
-			IStructuredDocumentRegion region = ((IDOMNode) node)
-					.getStartStructuredDocumentRegion();
-			if (region != null) {
-				return region.getEndOffset();
-			}
-			// else
-			// {
-			// // if (node.hasChildNodes())
-			// // {
-			// // // Node should always have start name, so this part should
-			// never reach,
-			// // // the assert is for inner debug.
-			// // Assert.isTrue(false);
-			// // return getNodeStartIndex(node);
-			// // }
-			// }
-		}
-		// This should never happen.
-		return getNodeStartIndex(node);
-	}
-
-	/**
-	 * Return 'node' indexed end name' start position Example: <a>aaa| </a>, the
-	 * position is indicated by '|' If node is <a /> style or there is no </a>
-	 * to pair with <a>, the function return -1.
-	 * 
-	 * @param node
-	 * @return the start index
-	 */
-	public static int getNodeEndNameStartIndex(Node node) {
-		if (isText(node)) {
-			return getNodeEndIndex(node);
-		}
-		if (EditValidateUtil.validNode(node) && node instanceof IDOMNode) {
-			IStructuredDocumentRegion region = ((IDOMNode) node)
-					.getEndStructuredDocumentRegion();
-			if (region != null) {
-				return region.getStartOffset();
-			}
-			// else
-			// {
-			// if (node.hasChildNodes())
-			// {
-			// return getNodeEndIndex(node);
-			// }
-			// }
-		}
-		return getNodeEndIndex(node);
-	}
-
-	/**
-	 * To see if a node is <a/>style.
-	 * 
-	 * @param node
-	 * @return the single region node
-	 */
-	public boolean isSingleRegionNode(Node node) {
-		if (getNodeEndNameStartIndex(node) == getNodeEndIndex(node)
-				&& !node.hasChildNodes()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * To see if a node has child that is not transparent child only.
-	 * 
-	 * @param node
-	 * @return true if node has transparent children
-	 */
-	boolean hasNonTransparentChild(Node node) {
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-        	Object child = children.item(i);
-        	if (isText((Node) child)) {
-        		if (!isTransparentText((Node) child)) {
-        			return true;
-        		}
-        	} else {
-        		return true;
-        	}
-        }
-		return false;
-	}
-
-	/**
-	 * To see if a node has child that is not transparent child only.
-	 * 
-	 * @param node
-	 * @param excludes 
-	 * @return true if has transparent child
-	 */
-	public boolean hasNonTransparentChild(Node node, String[] excludes) {
-		if (!node.hasChildNodes()) {
-			return false;
-		}
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-        	Object child = children.item(i);
-        	if (isText((Node) child)) {
-        		if (!isTransparentText((Node) child)) {
-        			return true;
-        		}
-        	} else if (!Arrays.asList(excludes).contains(
-        			((Node) child).getLocalName())) {
-        		return true;
-        	}
-        }
-		return false;
-	}
-
-	/**
-	 * To see whether tag has whitespace char.
-	 * 
-	 * @param node
-	 * @return true if has whitespace neighbor
-	 */
-	public boolean hasWhitespaceNeighbor(Node node) {
-		node = getNeighbor(node, true);
-		if (isWidget(node)) {
-			return false;
-		}
-        node = getFirstLeafChild(node);
-        return isTransparentText(node);
-
-	}
-
-	/**
-	 * @param host
-	 * @return true if host is a widget
-	 */
-	public static boolean isWidget(Object host) {
-		boolean result = false;
-		EditPart part = null;
-		if (host instanceof EditPart) {
-			part = (EditPart) host;
-		} else if (host instanceof Node) {
-			part = Target.resolvePart((Node) host);
-			if (part == null) {
-				part = new HTMLEditPartsFactory(
-						(IDOMDocument) getDocumentNode((Node) host))
-						.createEditPart(null, host);
-			}
-		}
-		if (part instanceof NodeEditPart) {
-			result = ((NodeEditPart) part).isWidget();
-		}
-		return result;
-	}
-
-	/**
-	 * To combind whitespace chars, only one whitespace string should be create.
-	 * 
-	 * @param node
-	 * @return true if node is  redundant whitespace
-	 */
-	boolean isRedundantWightspaces(Node node) {
-		if (isTransparentText(node) && hasWhitespaceNeighbor(node)) {
-			return true;
-		}
-        return false;
-	}
-
-	/**
-	 * @param node
-	 * @param names
-	 * @param ignoreCase
-	 * @return true if node has ancestors in the name list
-	 * TODO: bad practice
-	 */
-	public static boolean hasAncestor(Node node, String names[],
-			boolean ignoreCase) {
-		Assert.isTrue(names != null);
-		while (node != null && !EditModelQuery.isDocument(node)) {
-			if (isElement(node))
-				if (containItem(names, node, ignoreCase)) {
-					return true;
-				}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * To see if 'node' has ancestor that has name as 'name'
-	 * 
-	 * @param node
-	 * @param name
-	 * @param ignoreCase
-	 * @return true if node has the named ancestor
-	 */
-	public static boolean hasAncestor(Node node, String name, boolean ignoreCase) {
-		Assert.isTrue(name != null);
-		while (node != null && !EditModelQuery.isDocument(node)) {
-			if (node.getNodeName() != null)
-				if ((ignoreCase && name.equalsIgnoreCase(node.getNodeName())) || //
-						(!ignoreCase && name.equals(node.getNodeName()))) {
-					return true;
-				}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * To see if 'node' has direct ancestors that has names listed in 'name[]'
-	 * 
-	 * @param node
-	 * @param top
-	 * @param ignoreCase
-	 * @return the list of ancestors
-	 */
-	public static List getAncestors(Node node, String top, boolean ignoreCase) {
-		List result = new ArrayList();
-		Assert.isTrue(node != null);
-		while (node != null && !EditModelQuery.isDocument(node)) {
-			result.add(node);
-			String name = node.getLocalName();
-			if (ignoreCase && top.equalsIgnoreCase(name) || //
-					(!ignoreCase && top.equals(name))) {
-				break;
-			}
-			node = node.getParentNode();
-		}
-		return result;
-	}
-
-	/**
-	 * Copy old node's children to newNode.If the newNode is the father of the
-	 * old node,then the old node's children will be inserted before the old
-	 * node,otherwise,the old node's children just append to the newNode.
-	 * 
-	 * @param old
-	 * @param newNode
-	 */
-	public static void copyChildren(Node old, Node newNode) {
-		Node child = old.getFirstChild();
-		while (child != null) {
-			Node next = child.getNextSibling();
-			child = old.removeChild(child);
-			if (old.getParentNode() == newNode) {
-				newNode.insertBefore(child, old);
-			} else {
-				newNode.appendChild(child);
-			}
-			child = next;
-		}
-	}
-
-	/**
-	 * @param node
-	 * @return true if node is an element
-	 */
-	private static boolean isElement(Node node) {
-		return node.getNodeType() == Node.ELEMENT_NODE;
-	}
-
-	/**
-	 * Return a offspring of ancestor, the offsprint has a name listed in
-	 * childrenNames.
-	 * 
-	 * @param ancestor
-	 * @param childrenNames
-	 * @param maxLevelToSearch
-	 *            the max level from ancestor to the offspring in family tree.
-	 * @param ignoreCase
-	 * @return the node
-	 */
-	public static Node getChild(Node ancestor, String childrenNames[],
-			int maxLevelToSearch, boolean ignoreCase) {
-		if (ancestor == null || maxLevelToSearch < 0) {
-			return null;
-		}
-        if (ancestor.getLocalName() != null
-        		&& ignoreCase
-        		&& Arrays.asList(childrenNames).contains(
-        				ancestor.getLocalName().toLowerCase())
-        		|| !ignoreCase
-        		&& Arrays.asList(childrenNames).contains(
-        				ancestor.getLocalName())) {
-        	return ancestor;
-        }
-		NodeList children = ancestor.getChildNodes();
-		for (int i = 0, n = children.getLength(); i < n; i++) {
-			Node result = getChild(children.item(i), childrenNames,
-					maxLevelToSearch - 1, ignoreCase);
-			if (result != null) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Return a offspring of ancestor, the nodes on the tree are type of
-	 * DeferredElementImpl, the offsprint has a name listed in childrenNames.
-	 * 
-	 * @param ancestor
-	 * @param childrenNames
-	 * @param maxLevelToSearch
-	 *            the max level from ancestor to the offspring in family tree.
-	 * @param ignoreCase
-	 * @return the node
-	 */
-	static Node getChildDeferredNode(Node ancestor,
-			String childrenNames[], int maxLevelToSearch, boolean ignoreCase) {
-		if (ancestor == null || maxLevelToSearch < 0) {
-			return null;
-		}
-        String nodeName = ancestor.getNodeName();
-        if (nodeName != null && ignoreCase
-        		&& Arrays.asList(childrenNames).contains(nodeName)
-        		|| !ignoreCase
-        		&& Arrays.asList(childrenNames).contains(nodeName)) {
-        	return ancestor;
-        }
-		NodeList children = ancestor.getChildNodes();
-		for (int i = 0, n = children.getLength(); i < n; i++) {
-			Node result = getChildDeferredNode(children.item(i), childrenNames,
-					maxLevelToSearch - 1, ignoreCase);
-			if (result != null) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param node
-	 * @return if has tranparent node only
-	 */
-	public static boolean hasTransparentNodeOnly(Node node) {
-		NodeList children = node.getChildNodes();
-		for (int i = 0, n = children.getLength(); i < n; i++) {
-			if (!EditModelQuery.isTransparentText(children.item(i))) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @param name
-	 * @param node
-	 * @param ignoreCase
-	 * @return the node
-	 */
-	public static Node getParent(String name, Node node, boolean ignoreCase) {
-		if (node == null) {
-			return null;
-		}
-
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
-			String nodeName = node.getLocalName();
-			if (nodeName != null
-					&& (ignoreCase && name.equalsIgnoreCase(nodeName) || !ignoreCase
-							&& name.equalsIgnoreCase(nodeName))) {
-				return node;
-			}
-			node = node.getParentNode();
-		}
-		return null;
-	}
-
-	/**
-	 * get Elements with the same localName as the input localName under the
-	 * rootNode,it is a recursive computation.
-	 * 
-	 * @param rootNode
-	 * @param localName
-	 * @param caseSensitive
-	 * @param list
-	 *            The input list to hold the matched elements.
-	 */
-	public static void getElementByLocalName(Node rootNode, String localName,
-			boolean caseSensitive, List list) {
-		if (list == null) {
-			return;
-		}
-		NodeList nodeList = rootNode.getChildNodes();
-		if (nodeList != null && nodeList.getLength() > 0) {
-			for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-				Node node = nodeList.item(i);
-				if (node.getNodeType() == Node.ELEMENT_NODE) {
-					String nodeLocalName = node.getLocalName();
-					if (caseSensitive && localName.equals(nodeLocalName)) {
-						list.add(node);
-					} else if (!caseSensitive
-							&& localName.equalsIgnoreCase(nodeLocalName)) {
-						list.add(node);
-					}
-					getElementByLocalName(node, localName, true, list);
-				}
-
-			}
-		}
-	}
-
-	/**
-	 * @param tags
-	 * @param node
-	 * @param ignoreCase
-	 * @return the true if contains item
-	 */
-	public static boolean containItem(String[] tags, Node node,
-			boolean ignoreCase) {
-		if (ignoreCase) {
-			for (int i = 0, size = tags.length; i < size; i++) {
-				if (tags[i] == null) {
-					continue;
-				}
-				if (tags[i].equalsIgnoreCase(node.getNodeName())) {
-					return true;
-				}
-			}
-		} else {
-			for (int i = 0, size = tags.length; i < size; i++) {
-				if (tags[i] == null) {
-					continue;
-				}
-				if (tags[i].equals(node.getNodeName())) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditValidateUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditValidateUtil.java
deleted file mode 100644
index 46409de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditValidateUtil.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This class is used for debug purpose, and can be used to test some invalid
- * status in the functions. Generally all the methods here will throw exception
- * when invalid status happens.
- * 
- * @author mengbo
- */
-public final class EditValidateUtil {
-	private static final Logger _logger = PDPlugin
-			.getLogger(EditValidateUtil.class);
-
-	private static final boolean ALERT = false;
-
-	private static final boolean REPORT = false;
-
-	/**
-	 * A valid position means container node, offset are all valid.
-	 * 
-	 * @param position
-	 * @return true if the position is valid
-	 */
-	public static boolean validPosition(IDOMPosition position) {
-		try {
-			boolean result = true;
-			Assert.isTrue(position != null
-					&& position.getContainerNode() != null
-					&& position.getOffset() >= 0);
-			Node container = position.getContainerNode();
-			result &= validNode(container);
-			int offset = position.getOffset();
-			if (position.isText()) {
-				int length = ((Text) container).getLength();
-				Assert.isTrue(offset <= length);
-			} else {
-				if (position instanceof DOMPosition && offset > 0) {
-					Assert.isTrue(container.hasChildNodes()
-							&& container.getChildNodes().getLength() >= offset);
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// "error", "Error in validPosition"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Position", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid position:"
-				_logger.error("Error.EditValidateUtil.Position", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param position
-	 * @return true if position is valid
-	 */
-	public static boolean validPosition(DesignPosition position) {
-		try {
-			boolean result = true;
-			Assert.isTrue(position != null
-					&& position.getContainerPart() != null
-					&& position.getContainerNode() != null
-					&& position.getOffset() >= 0);
-			Node container = position.getContainerNode();
-			result &= validNode(container);
-			int offset = position.getOffset();
-			if (EditModelQuery.isText(container)) {
-				int length = ((Text) container).getLength();
-				Assert.isTrue(offset <= length);
-			} else {
-				if (position instanceof DesignRefPosition && offset > 0) {
-					Assert.isTrue(container.hasChildNodes()
-							&& container.getChildNodes().getLength() >= offset);
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// "error", "Error in validPosition"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Position", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid position:"
-				_logger.error("Error.EditValidateUtil.Position", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * Valid node is TextNode and it's valid node.
-	 * 
-	 * @param node
-	 * @return true if node is valid
-	 */
-	public static boolean validText(Node node) {
-		try {
-			boolean result = true;
-			Assert.isTrue(node.getNodeType() == Node.TEXT_NODE);
-			Assert.isTrue(((Text) node).getData() != null);
-			result &= validNode(node);
-			return result;
-		} catch (Exception e) {
-			// "Error", "Error in validText"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Text", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid Text:"
-				_logger.error("Error.EditValidateUtil.Text", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * A valid node is resided in the model tree
-	 * 
-	 * @param node
-	 * @return true if node is valid
-	 */
-	public static boolean validNode(Node node) {
-		try {
-			Assert.isTrue(node instanceof IDOMNode);
-			Assert.isTrue((node.getNodeType() == Node.DOCUMENT_NODE)
-					|| (node.getParentNode() != null));
-			// What's this?
-			return true;
-		} catch (Exception e) {
-			// "Error", "Error in validNode"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Node", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid node:"
-				_logger.error("Error.EditValidateUtil.Node", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * A valid DOMRange contains valid IDOMPosition, and it should not be within
-	 * node like 'HEAD'. The later one might not be suitble to valid in this
-	 * util, it should be checked by some edit valid helper.
-	 * 
-	 * @param range
-	 * @return true if range is valid
-	 */
-	public static boolean validRange(DOMRange range) {
-		try {
-			// TODO: never read EditModelQuery modelQuery = EditModelQuery.getInstance();
-			boolean result = true;
-			IDOMPosition start = range.getStartPosition();
-			IDOMPosition end = range.getEndPosition();
-			result &= validPosition(start);
-			result &= validPosition(end);
-            // TODO: never read
-//			Node startContainer = start.getContainerNode();
-//			Node endContainer = end.getContainerNode();
-			// Assert.isTrue(isValidForEditing(modelQuery.getCommonAncestor(startContainer,
-			// endContainer)));
-			return result;
-		} catch (Exception e) {
-			// "Error", "Error in validRange"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Range", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid Range:"
-				_logger.error("Error.EditValidateUtil.Range", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param text
-	 * @param index
-	 * @return true if the index is valid
-	 */
-	public static boolean validStringIndex(Node text, int index) {
-		try {
-			Assert.isTrue(index >= 0 && ((Text) text).getLength() >= index);
-			return validText(text);
-		} catch (Exception e) {
-			// "Error", "Error in validStringIndex"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.StringIndex", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid Index in String:"
-				_logger.error("Error.EditValidateUtil.StringIndex", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param text
-	 * @param index
-	 * @param offset
-	 * @return true if the index offset is valid
-	 */
-	public static boolean validStringIndexOffset(Node text, int index,
-			int offset) {
-		try {
-			Assert.isTrue(index >= 0 && (index + offset) >= 0
-					&& ((Text) text).getLength() >= (index + offset)
-					&& ((Text) text).getLength() >= index);
-			return validText(text);
-		} catch (Exception e) {
-			// "error", "Error in validStringIndex"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.IndexOffset", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid index or offset in String:"
-				_logger.error("Error.EditValidateUtil.IndexOffset", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-//	private static void dumpPosition(String message, IDOMPosition position,
-//			boolean forward) {
-		// for future internal debug
-		// message(message);
-		// _logger.debug("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
-		// if (position != null)
-		// {
-		// Node container = position.getContainerNode();
-		// Node node = null;
-		// String text = null;
-		// if (getContainerLength(container) > 0)
-		// {
-		// if (!position.isText())
-		// {
-		// int index = forward ? position.getOffset() : position.getOffset() -
-		// 1;
-		// node = container.getChildNodes().item(index);
-		// }
-		// else
-		// {
-		// int index = forward ? position.getOffset() : position.getOffset() -
-		// 1;
-		// if (index >= 0 && index < getContainerLength(container))
-		// {
-		// text = ((Text) container).substringData(index, 1);
-		// }
-		// else
-		// {
-		// text = null;
-		// }
-		// }
-		// }
-		// _logger.debug("DOMPosition type?:" + (position instanceof
-		// DOMPosition) + " container name: " +
-		// position.getContainerNode().getLocalName() + " offset:" +
-		// position.getOffset()
-		// + " length:" + getContainerLength(position.getContainerNode()));
-		// if (node != null)
-		// {
-		// _logger.debug("node to operate:" + node.getLocalName());
-		// }
-		// if (text != null)
-		// {
-		// _logger.debug("text to operate:\"" + text + "\" length:" +
-		// text.length());
-		// }
-		// }
-		// _logger.debug("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
-//	}
-	
-	/**
-	 * @param pos
-	 * @param forward
-	 * @return true if the position if vallid for editing relative to forward (true) or backward  (false)
-	 */
-	public static boolean isValidForEditing(IDOMPosition pos, boolean forward) {
-		if (pos == null) {
-			return false;
-		}
-		if (pos.isText()) {
-			return true;
-		}
-        Node container = pos.getContainerNode();
-        // only head can't be edited
-        if (EditModelQuery.isChild(IHTMLConstants.TAG_HEAD, container,
-        		true)) {
-        	return false;
-        }
-        Node sibling = EditModelQuery.getInstance().getSibling(pos,
-        		forward);
-        if (sibling != null) {
-        	if (EditModelQuery.isText(sibling)) {
-        		return true;
-        	}
-        	Assert.isTrue(sibling.getLocalName() != null);
-        	if (EditModelQuery.UNREMOVEBLE_TAGS.contains(sibling
-        			.getLocalName().toLowerCase())) {
-        		return false;
-        	}
-        }
-        return true;
-	}
-
-	/**
-	 * @param node
-	 * @return true if node is valid for editing
-	 */
-	public static boolean isValidForEditing(Node node) {
-		if (EditModelQuery.isChild(IHTMLConstants.TAG_HEAD, node, true)) {
-			return false;
-		}
-		return true;
-	}
-
-	private EditValidateUtil()
-	{
-	    // do nothing
-	}
-	// Reserved for inner use.
-	//
-	// private static void errorNotice()
-	// {
-	// try
-	// {
-	// // FileInputStream fileau = new
-	// FileInputStream("C:\\WINNT\\Media\\ringout.wav");
-	// // AudioStream as = new AudioStream(fileau);
-	// // AudioPlayer.player.start(as);
-	// }
-	// catch (Exception e)
-	// {
-	// System.out.println("error in file open");
-	// }
-	//
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMPosition.java
deleted file mode 100644
index fa3169d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMPosition.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * An IDOMPosition represents a position in the DOM tree. There are multiple
- * ways of identify a position in the tree, such as by saying a offset in
- * parent, or before/after a particular node.
- * 
- * NOTE: IDOMPosition and its child class should be implemented as literal. that
- * is, they should not be changed after it is constructed.
- * 
- * @author mengbo
- */
-public interface IDOMPosition {
-	/**
-	 * 
-	 * @param forward
-	 *            if true, same as getNextSiblingNode(), if false, same as
-	 *            getPreviousSiblingNode
-	 * @return the sibling
-	 */
-	public Node getSibling(boolean forward);
-
-	/**
-	 * @return the next sibling node
-	 */
-	public Node getNextSiblingNode();
-
-	/**
-	 * @return the previous sibling node
-	 */
-	public Node getPreviousSiblingNode();
-
-	/**
-	 * @return the container node
-	 */
-	public Node getContainerNode();
-
-	/**
-	 * @return the offset
-	 */
-	public int getOffset();
-
-	/**
-	 * @return true if is text
-	 */
-	public boolean isText();
-
-	/**
-	 * "original" has been replace by "replacement" in the model. If this
-	 * replacement will affect this IDOMPosition, then this method should return
-	 * a new position that is valid after the replacement. If this replacement
-	 * won't affect this position, then the original position should be
-	 * returned.
-	 * 
-	 * @param original
-	 * @param replacement
-	 * @return the dom position
-	 */
-	public IDOMPosition handleReplacement(Node original, Node replacement);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMRefPosition.java
deleted file mode 100644
index 5a841df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMRefPosition.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * A IDOMRefPosition locate a position by reference a node in the dom tree. It
- * mean a position after node, before a node, or before anything in a node, or
- * after anything in a node.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IDOMRefPosition extends IDOMPosition {
-	/**
-	 * 
-	 * @return the reference (wrapped) node
-	 */
-	public Node getReferenceNode();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java
deleted file mode 100644
index 215f93f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.adapters.internal.BodyInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Simple utility class.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ValidatorSupport 
-{
-	/**
-	 * Equivalent to checkContainer(position new QName[]{qname}
-	 * 
-	 * @param position
-	 * @param qname
-	 * @return true if the tag identified by qname is found as a parent
-     * of position.
-	 */
-	public static boolean checkContainer(IDOMPosition position, QName qname) {
-		return checkContainer(position, new QName[] { qname });
-	}
-
-	/**
-	 * Check for any of the containers listed in qname starting from qname and working
-	 * up the DOM parent chain.
-	 * 
-	 * @param position
-	 * @param qname
-	 * @return true if one of the tags identified by qname is found as a parent
-	 * of position.
-	 */
-	public static boolean checkContainer(IDOMPosition position, QName qname[]) {
-		Node node = position.getContainerNode();
-		while (node != null) {
-			if (node instanceof Text) {
-				node = node.getParentNode();
-				continue;
-			}
-			if (node instanceof Element) {
-				Element ele = (Element) node;
-				String url = CMUtil.getElementNamespaceURI(ele);
-				String tag = ele.getLocalName();
-
-				for (int i = 0; i < qname.length; i++) {
-					if (tag.equalsIgnoreCase(qname[i].getLocalPart())) {
-						if (url == null) {
-							// this means something wrong. To be error tolerant,
-							// we treat it
-							// as if url is same
-							return true;
-						} else if (url.equalsIgnoreCase(qname[i].getNamespaceURI())) {
-							return true;
-						}
-					}
-				}
-
-				node = node.getParentNode();
-				continue;
-			}
-			break;
-		}
-		return false;
-	}
-
-    /**
-     * @param position
-     * @param model 
-     * @param creationProvider 
-     * @param customizationData
-     * @return the new dom position for the inserted container or null if could
-     *         not insert
-     */
-    public static IDOMPosition insertContainer(final IDOMPosition position,
-            final IDOMModel model,
-            final ITagDropSourceData creationProvider, final IAdaptable customizationData)
-    {
-        final Element newContainer = CommandUtil.executeInsertion(
-                creationProvider, model, position, customizationData);
-        if (newContainer != null)
-        {
-            DOMPosition pos = new DOMPosition(newContainer, 0);
-            return pos;
-        }
-        return null;
-    }
-
-	/**
-	 * @return the body info
-	 */
-	public static IBodyInfo getBodyInfo() {
-	    //TODO: change this to be meta-data driven.
-		return BodyInfo.getInstance();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java
deleted file mode 100644
index 2f4f9c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom.html;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class ColStructure implements Comparable {
-	private final int _column;
-
-	private final int _colSpan;
-
-	/**
-	 * @param column
-	 * @param colSpan
-	 */
-	public ColStructure(int column, int colSpan) {
-		this._column = column;
-		this._colSpan = colSpan;
-	}
-
-	/**
-	 * @return the column span
-	 */
-	public int getColSpan() {
-		return _colSpan;
-	}
-
-	/**
-	 * @return the column
-	 */
-	public int getColumn() {
-		return _column;
-	}
-
-	public int compareTo(Object o) {
-		ColStructure cs = (ColStructure) o;
-		if (this._column > cs.getColumn()) {
-			return 1;
-		} else if (this._column == cs.getColumn()) {
-			return 0;
-		} else {
-			return -1;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableChildElementPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableChildElementPosition.java
deleted file mode 100644
index 1b290ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableChildElementPosition.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom.html;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableChildElementPosition {
-	private int _rowIndex = -10;
-
-	private int _columnIndex = -10;
-
-	/**
-	 * @return Returns the _columnIndex.
-	 */
-	public int getColumnIndex() {
-		return _columnIndex;
-	}
-
-	/**
-	 * @param index
-	 *            The _columnIndex to set.
-	 */
-	public void setColumnIndex(int index) {
-		_columnIndex = index;
-	}
-
-	/**
-	 * @return Returns the _rowIndex.
-	 */
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-
-	/**
-	 * @param index
-	 *            The _rowIndex to set.
-	 */
-	public void setRowIndex(int index) {
-		_rowIndex = index;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableUtil.java
deleted file mode 100644
index 2f0b663..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableUtil.java
+++ /dev/null
@@ -1,534 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom.html;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableUtil {
-	private Element _fakeCell = null;
-
-	private Element _table = null;
-
-	private List[] _trCellLists = null;
-
-	/**
-	 * judge whether there is rowspan>1 cell in the tr
-	 * 
-	 * @param tr
-	 *            TR element in a table
-	 * @return true if there is rowspan>1 cell in the tr
-	 */
-	public static boolean hasRowSpanElement(Element tr) {
-		List list = DOMUtil.getElementChildren(tr);
-		Iterator itr = list.iterator();
-		while (itr.hasNext()) {
-			Element ele = (Element) itr.next();
-			int value = DOMUtil.getIntAttributeIgnoreCase(ele,
-					IHTMLConstants.ATTR_ROWSPAN, 1);
-			if (value > 1) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * judge whether a tr is affected by row span cell in the previous trs.
-	 * 
-	 * @param trList
-	 *            list holds all tr elements in a table
-	 * @param tr
-	 * @param index
-	 *            tr index in the DOM tree
-	 * @return true if tr is affected by row span cell in the previous trs
-	 */
-	public static boolean isAffectedByRowSpan(List trList, Element tr, int index) {
-		Node parent = tr.getParentNode();
-		int dex = index;
-		while (--dex >= 0) {
-			Element preTr = (Element) trList.get(dex);
-			if (preTr.getParentNode() != parent) {
-				break;
-			}
-            int maxRowSpan = countMaxRowSpan(preTr);
-            if (maxRowSpan > (index - dex)) {
-            	return true;
-            }
-		}
-		return false;
-	}
-
-	/**
-	 * count all tr in the table
-	 * 
-	 * @param element
-	 *            table
-	 * @param list
-	 *            list to hold tr elements
-	 */
-	public static void getTrElements(Element element, List list) {
-		NodeList nodeList = element.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element ele = (Element) node;
-				if (ele.getNodeName().equalsIgnoreCase(IHTMLConstants.TAG_TR)) {
-					list.add(ele);
-				} else if (ele.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_THEAD)
-						|| ele.getNodeName().equalsIgnoreCase(
-								IHTMLConstants.TAG_TBODY)
-						|| ele.getNodeName().equalsIgnoreCase(
-								IHTMLConstants.TAG_TFOOT)) {
-					getTrElements(ele, list);
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * count row index in the code DOM tree according to the display index
-	 * 
-	 * @param table
-	 * @param displayIndex
-	 * @return the row index
-	 */
-	public static int countRowIndexInDOMTree(Element table, int displayIndex) {
-
-		int footRows = countSectionRows(table, IHTMLConstants.TAG_TFOOT);
-		if (footRows == 0) {
-			return displayIndex;
-		}
-		int headRows = countSectionRows(table, IHTMLConstants.TAG_THEAD);
-		List list = new ArrayList();
-		getTrElements(table, list);
-		int bodyRows = list.size() - headRows - footRows;
-		// if display index is in TFOOT area
-		if (displayIndex >= (list.size() - footRows)) {
-			int index = displayIndex - bodyRows;
-			return index;
-		}
-		// if display index is in TBODY area
-		else if (displayIndex >= headRows) {
-			int index = displayIndex + footRows;
-			return index;
-		}
-		// if display index is in THEAD area
-		else {
-			return displayIndex;
-		}
-	}
-
-	/**
-	 * get row count in the specified section
-	 * 
-	 * @param table
-	 * @param sectionName
-	 *            child element name of table, like THEAD or TFOOT
-	 * @return the row count in the section
-	 */
-	public static int countSectionRows(Element table, String sectionName) {
-		NodeList nodeList = table.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element ele = (Element) node;
-				if (node.getNodeName().equalsIgnoreCase(sectionName)) {
-					List list = DOMUtil.getChildElementsByTagIgnoreCase(ele,
-							IHTMLConstants.TAG_TR);
-					if (list != null) {
-						return list.size();
-					}
-				}
-			}
-
-		}
-		return 0;
-	}
-
-	/**
-	 * constructor
-	 * 
-	 * @param table
-	 */
-	public TableUtil(Element table) {
-		this._table = table;
-		this._trCellLists = fillTrCells();
-	}
-
-	/**
-	 * get tr cells list
-	 * 
-	 * @return the list of tr cells
-	 */
-	public List[] getTrCellLists() {
-		return this._trCellLists;
-	}
-
-	/**
-	 * calculate row and column index for tr or td/th
-	 * 
-	 * @param node
-	 *            tr or td/th
-	 * @return the position
-	 */
-	public TableChildElementPosition getPosition(Node node) {
-		TableChildElementPosition position = new TableChildElementPosition();
-		if (node == null) {
-			return position;
-		}
-		String tagName = node.getLocalName();
-		if (IHTMLConstants.TAG_TR.equalsIgnoreCase(tagName)) {
-			List list = new ArrayList();
-			getTrElements(this._table, list);
-			for (int i = 0, size = list.size(); i < size; i++) {
-				Element tr = (Element) list.get(i);
-				if (tr == node) {
-					position.setRowIndex(i);
-					break;
-				}
-			}
-		} else if (IHTMLConstants.TAG_TD.equalsIgnoreCase(tagName)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(tagName)) {
-			Element tr = (Element) node.getParentNode();
-			TableChildElementPosition pos = getPosition(tr);
-			position.setRowIndex(pos.getRowIndex());
-			List[] lists = getTrCellLists();
-			List list = lists[pos.getRowIndex()];
-			for (int i = 0, size = list.size(); i < size; i++) {
-				Element td = (Element) list.get(i);
-				if (td == node) {
-					position.setColumnIndex(i);
-					break;
-				}
-			}
-		} else {
-			boolean hasTDParent = false;
-			Node childBackup = node;
-			while (!IHTMLConstants.TAG_TABLE.equalsIgnoreCase(childBackup
-					.getParentNode().getLocalName())) {
-				childBackup = childBackup.getParentNode();
-				String localName = childBackup.getLocalName();
-				if (IHTMLConstants.TAG_TD.equalsIgnoreCase(localName)
-						|| IHTMLConstants.TAG_TH.equalsIgnoreCase(localName)) {
-					hasTDParent = true;
-					break;
-				}
-			}
-			if (hasTDParent) {
-				position = getPosition(childBackup);
-			}
-		}
-		return position;
-	}
-
-	/**
-	 * get column count
-	 * 
-	 * @return the column count
-	 */
-	public int getColumnCount() {
-		List[] lists = this._trCellLists;
-		if (lists != null) {
-			int max = 0;
-			for (int i = 0, size = lists.length; i < size; i++) {
-				List list = lists[i];
-				if (list.size() > max) {
-					max = list.size();
-				}
-			}
-			return max;
-		}
-		return 0;
-	}
-
-	/**
-	 * judge whether there is columnspan>1 cell in the column
-	 * 
-	 * @param columnIndex
-	 *            column index in a table
-	 * @return true if there is columnspan>1 cell in the column
-	 */
-	public boolean hasColumnSpanElement(int columnIndex) {
-		List cells = getColumnCells(columnIndex);
-		if (cells != null) {
-			Iterator itr = cells.iterator();
-			while (itr.hasNext()) {
-				Element cell = (Element) itr.next();
-				int value = DOMUtil.getIntAttributeIgnoreCase(cell,
-						IHTMLConstants.ATTR_COLSPAN, 1);
-				if (value > 1) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * judge whether the column has cell affected by column span cell in
-	 * privious columns
-	 * 
-	 * @param columnIndex
-	 * @return true if the column has cell affected by column span cell in
-     * privious columns 
-	 */
-	public boolean isAffectedByColSpan(int columnIndex) {
-		int index = columnIndex;
-		while (--index >= 0) {
-			List cells = getColumnCells(index);
-			int max = countMaxColSpan(cells);
-			if (max > (columnIndex - index)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * get cells in the specified column of the table
-	 * 
-	 * @param columnIndex
-	 * @return the column cells
-	 */
-	public List getColumnCells(int columnIndex) {
-		List list = new ArrayList();
-
-		List[] lists = this._trCellLists;
-		for (int i = 0; i < lists.length; i++) {
-			List tempList = lists[i];
-			if (tempList.size() <= columnIndex) {
-				continue;
-			}
-			list.add(tempList.get(columnIndex));
-		}
-		return list;
-	}
-
-	/**
-	 * count max row span in the tr
-	 * 
-	 * @param tr
-	 * @return
-	 */
-	private static int countMaxRowSpan(Element tr) {
-		List list = DOMUtil.getElementChildren(tr);
-		int max = countMaxValue(list, IHTMLConstants.ATTR_ROWSPAN);
-		return max;
-	}
-
-	/**
-	 * count max attr value
-	 * 
-	 * @param list
-	 * @param attr
-	 * @return
-	 */
-	private static int countMaxValue(List list, String attr) {
-		int max = 1;
-		Iterator itr = list.iterator();
-		while (itr.hasNext()) {
-			Element ele = (Element) itr.next();
-			int value = DOMUtil.getIntAttributeIgnoreCase(ele, attr, 1);
-			if (value > max) {
-				max = value;
-			}
-		}
-		return max;
-	}
-
-	/**
-	 * count max col span in a column
-	 * 
-	 * @param list
-	 * @return
-	 */
-	private int countMaxColSpan(List list) {
-		int max = countMaxValue(list, IHTMLConstants.ATTR_COLSPAN);
-		return max;
-	}
-
-	/**
-	 * get fake element to fill tr cell
-	 * 
-	 * @return
-	 */
-	private Element getFakeElement() {
-		if (_fakeCell != null) {
-			return _fakeCell;
-		}
-		_fakeCell = this._table.getOwnerDocument().createElement("fake"); //$NON-NLS-1$
-		return _fakeCell;
-	}
-
-	/**
-	 * initial every tr cells according to th and td under each tr element
-	 * 
-	 * @param trList
-	 * @return
-	 */
-	private List[] initialTrCells(List trList) {
-		int size = trList.size();
-		List[] lists = new ArrayList[size];
-
-		if (trList != null) {
-			for (int i = 0, n = trList.size(); i < n; i++) {
-				lists[i] = new ArrayList();
-				Element tr = (Element) trList.get(i);
-				List domCells = DOMUtil.getElementChildren(tr);
-				Iterator itr = domCells.iterator();
-				while (itr.hasNext()) {
-					Element cell = (Element) itr.next();
-					lists[i].add(cell);
-					int colSpan = DOMUtil.getIntAttributeIgnoreCase(cell,
-							IHTMLConstants.ATTR_COLSPAN, 1);
-					while (--colSpan > 0) {
-						Element fakeElement = getFakeElement();
-						lists[i].add(fakeElement);
-					}
-				}
-			}
-
-		}
-
-		return lists;
-
-	}
-
-	/**
-	 * after initial tr cells,fill tr with fake cells if necessary.
-	 * 
-	 * @return
-	 */
-	private List[] fillTrCells() {
-		List list = new ArrayList();
-		getTrElements(this._table, list);
-
-		List[] lists = initialTrCells(list);
-		int size = lists.length;
-
-		int headRows = countSectionRows(this._table, IHTMLConstants.TAG_THEAD);
-		if (headRows > 0) {
-			List[] headList = new ArrayList[headRows];
-			for (int i = 0; i < headRows; i++) {
-				headList[i] = lists[i];
-			}
-			fillSectionTrCells(headList);
-		}
-
-		int footRows = countSectionRows(this._table, IHTMLConstants.TAG_TFOOT);
-		if (footRows > 0) {
-			List[] footList = new ArrayList[footRows];
-			for (int i = 0; i < footRows; i++) {
-				footList[i] = lists[headRows + i];
-			}
-			fillSectionTrCells(footList);
-		}
-
-		int bodyRows = size - headRows - footRows;
-		if (bodyRows > 0) {
-			int bodyCount = 1;
-			int k = 0;
-			List bodys = new ArrayList();
-			Element tr = (Element) list.get(headRows + footRows);
-			Node node = tr.getParentNode();
-			for (int i = 1; i < bodyRows; i++) {
-				Element tempTr = (Element) list.get(headRows + footRows + i);
-				if (tempTr.getParentNode() != node) {
-					node = tempTr.getParentNode();
-					bodys.add(new Integer(i - k));
-					k = i;
-					bodyCount++;
-				}
-			}
-			bodys.add(new Integer(bodyRows - k));
-
-			for (int j = 0; j < bodyCount; j++) {
-				int num = ((Integer) bodys.get(j)).intValue();
-				List[] bodyList = new ArrayList[num];
-				int m = headRows + footRows;
-
-				for (int i = 0; i < num; i++) {
-					bodyList[i] = lists[m + i];
-				}
-				fillSectionTrCells(bodyList);
-				m = m + num;
-			}
-
-		}
-
-		return lists;
-	}
-
-	/**
-	 * fill tr cells under each table section,like THEAD,TFOOT,TBODY.
-	 * 
-	 * @param lists
-	 */
-	private void fillSectionTrCells(List[] lists) {
-		Element cell = null;
-
-		if (lists != null) {
-			for (int i = 1, size = lists.length; i < size; i++) {
-				List insertPoints = new ArrayList();
-
-				for (int j = 0; j < i; j++) {
-					List list = lists[j];
-					for (int column = 0; column < list.size(); column++) {
-						cell = (Element) list.get(column);
-						if (cell.getTagName().equalsIgnoreCase("fake")) { //$NON-NLS-1$
-							continue;
-						}
-						int rowSpan = DOMUtil.getIntAttributeIgnoreCase(cell,
-								IHTMLConstants.ATTR_ROWSPAN, 1);
-						if (rowSpan > (i - j)) {
-							int colSpan = DOMUtil.getIntAttributeIgnoreCase(
-									cell, IHTMLConstants.ATTR_COLSPAN, 1);
-							insertPoints.add(new ColStructure(column, colSpan));
-						}
-					}
-				}
-				// there are fake column cell need to be inserted into this tr
-				if (insertPoints.size() > 0) {
-					Collections.sort(insertPoints);
-					List trCells = lists[i];
-
-					Iterator itr = insertPoints.iterator();
-					while (itr.hasNext()) {
-						ColStructure cls = (ColStructure) itr.next();
-						int loop = cls.getColSpan();
-						int column = cls.getColumn();
-						while (loop-- != 0) {
-							trCells.add(column++, getFakeElement());
-						}
-
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
deleted file mode 100644
index f62e2a5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.converter.ConverterFactoryRegistry;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.DTTagConverterFactory;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-
-/**
- * DTManager is the top-level entry point for design-time (DT) services, such
- * as tag converters and design-time information.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTManager {
-
-	private static DTManager instance;
-	private IDTInfoFactory _dtInfoFactory;
-
-	private DTManager() {
-        // no external instantiation
-	}
-
-	/**
-	 * Gets the singleton DTManager instance.
-	 * 
-	 * @return The singleton DTManager instance.
-	 */
-	public static synchronized DTManager getInstance() {
-		if (instance == null) {
-			instance = new DTManager();
-		}
-		return instance;
-	}
-
-	/**
-	 * Gets an ITagConverter instance for the specified Element and mode.
-	 * 
-	 * @param element Element instance for which to locate and return an
-	 * ITagConverter instance.
-	 * @param mode Mode flag (use IConverterFactory constants).
-	 * @param document Target IDOMDocument instance.
-	 * @return An ITagConverter instance for the specified Element and mode.
-	 */
-	public ITagConverter getTagConverter(Element element, int mode, IDOMDocument document) {
-		ITagConverter tagConverter = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		//try MD-driven approach
-		IConverterFactory tagConverterFactory = getTagConverterFactory(nsURI);
-		if (tagConverterFactory != null) {
-			tagConverter = tagConverterFactory.createConverter(element, mode);
-			if (tagConverter != null) {
-				tagConverter.setDestDocument(document);
-			} else {
-				//fallback to contributed (non-MD-driven) approach
-				tagConverter = ConverterFactoryRegistry.getInstance().createTagConverter(element, mode, document);
-			}
-		}
-		return tagConverter;
-	}
-
-	/**
-	 * Gets an IConverterFactory instance for the specified namespace URI.
-	 * 
-	 * @param nsURI Namespace URI.
-	 * @return An IConverterFactory instance for the specified namespace URI.
-	 */
-	protected IConverterFactory getTagConverterFactory(String nsURI) {
-		//TODO: future - expand to first look for registered factories
-		return new DTTagConverterFactory();
-	}
-
-	/**
-	 * Gets an IDTInfo instance for the specified Element.
-	 * 
-	 * @param element Element instance for which to locate and return IDTInfo
-	 * instance.
-	 * @return An IDTInfo instance for the specified Element.
-	 */
-	public IDTInfo getDTInfo(Element element) {
-		IDTInfo dtInfo = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		IDTInfoFactory dtInfoFactory = getDTInfoFactory(nsURI);
-		if (dtInfoFactory != null) {
-			dtInfo = dtInfoFactory.getDTInfo(element);
-		}
-		return dtInfo;
-	}
-
-	/**
-	 * Gets an IDTInfoFactory instance for the specified namespace URI.
-	 * 
-	 * @param nsURI Namespace URI.
-	 * @return An IDTInfoFactory instance for the specified namespace URI.
-	 */
-	protected IDTInfoFactory getDTInfoFactory(String nsURI) {
-		if (_dtInfoFactory == null) {
-			_dtInfoFactory = new DefaultDTInfoFactory();
-		}
-		return _dtInfoFactory;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java
deleted file mode 100644
index 6d57cfc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * Default IDTInfo implementation.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTInfo implements IDTInfo {
-
-	private DTInfo dtInfo = null;
-	private Trait trait = null;
-
-	/**
-	 * Constructs an instance that wraps the specified DTInfo instance.
-	 * 
-	 * @param dtInfo DTInfo (EMF model object) instance.
-	 * @param trait Trait instance that was queried to load this data.
-	 */
-	public DefaultDTInfo(DTInfo dtInfo, Trait trait) {
-		this.dtInfo = dtInfo;
-		this.trait = trait;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagConvertInfo()
-	 */
-	public TagConvertInfo getTagConvertInfo() {
-		return dtInfo.getTagConvertInfo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagDecorateInfos()
-	 */
-	public List getTagDecorateInfos() {
-		return dtInfo.getTagDecorateInfos();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagDecorateInfo(java.lang.String)
-	 */
-	public TagDecorateInfo getTagDecorateInfo(String id) {
-		TagDecorateInfo tdInfo = null;
-		EList tdInfos = dtInfo.getTagDecorateInfos();
-		Iterator itTDInfos = tdInfos.iterator();
-		while (itTDInfos.hasNext()) {
-			TagDecorateInfo curTDInfo = (TagDecorateInfo)itTDInfos.next();
-			if (curTDInfo.getId().equals(id)) {
-				tdInfo = curTDInfo;
-				break;
-			}
-		}
-		return tdInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTrait()
-	 */
-	public Trait getTrait() {
-		return trait;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java
deleted file mode 100644
index e65f5dc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * Default IDTInfoFactory implementation.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTInfoFactory implements IDTInfoFactory {
-
-	/**
-	 * Key (in metadata) of IDTInfo trait.
-	 */
-	public static final String DTINFO_TRAIT_KEY = "dt-info"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfoFactory#getDTInfo(org.w3c.dom.Element)
-	 */
-	public IDTInfo getDTInfo(Element element) {
-		IDTInfo dtInfo = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		IProject project = getProject(element);
-		if (project != null) {
-			ITaglibDomainMetaDataModelContext context = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsURI);
-			if (context != null) {
-				Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(context, element.getLocalName(), DTINFO_TRAIT_KEY);
-				if (trait != null) {
-					DTInfo dtInfoModelObject = (DTInfo)trait.getValue();
-					if (dtInfoModelObject != null) {
-						dtInfo = new DefaultDTInfo(dtInfoModelObject, trait);
-					}
-				}
-			}
-		}
-		return dtInfo;
-	}
-
-	/**
-	 * Gets the IProject instance that contains the model of the specified
-	 * Element.
-	 * 
-	 * @param element Element instance.
-	 * @return IProject instance that contains the model of the specified
-	 * Element.
-	 */
-	protected IProject getProject(Element element) {
-		IProject project = null;
-		if (element instanceof IDOMNode) {
-			IDOMModel model = ((IDOMNode)element).getModel();
-			if (model != null) {
-				project = StructuredModelUtil.getProjectFor(model);
-			}
-		}
-		return project;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java
deleted file mode 100644
index 9ce9e07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * Encapsulates design-time (DT) information.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTInfo {
-
-	/**
-	 * Gets the encapsulated TagConvertInfo instance.
-	 * 
-	 * @return TagConvertInfo instance.
-	 */
-	public TagConvertInfo getTagConvertInfo();
-
-	/**
-	 * Gets the collection of encapsulated TagDecorateInfo instances.
-	 * 
-	 * @return Collection of TagDecorateInfo instances.
-	 */
-	public List getTagDecorateInfos();
-
-	/**
-	 * Gets an encapsulated TagDecorateInfo instance matching specified ID.
-	 * 
-	 * @param id ID of desired TagDecorateInfo instance.
-	 * @return TagDecorateInfo instance matching specified ID.
-	 */
-	public TagDecorateInfo getTagDecorateInfo(String id);
-
-	/**
-	 * Gets the Trait instance that was queried to load the metadata.
-	 * 
-	 * @return Trait instance that was queried to load the metadata.
-	 */
-	public Trait getTrait();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java
deleted file mode 100644
index 80f3b6d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.w3c.dom.Element;
-
-/**
- * Factory that provides IDTInfo instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTInfoFactory {
-
-	/**
-	 * Gets an IDTInfo instance for the specified Element.
-	 * 
-	 * @param element Element instance for which to locate and return IDTInfo
-	 * instance.
-	 * @return An IDTInfo instance for the specified Element.
-	 */
-	public IDTInfo getDTInfo(Element element);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java
deleted file mode 100644
index b37242b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Abstract ITagConverter implementation of ITagConverterContext.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractTagConverterContext implements ITagConverterContext {
-
-	/**
-	 * ITagConverter instance.
-	 */
-	protected ITagConverter tagConverter;
-
-	/**
-	 * Instantiates an instance for the specified ITagConverter instance. 
-	 * @param tagConverter ITagConverter instance.
-	 */
-	public AbstractTagConverterContext(ITagConverter tagConverter) {
-		this.tagConverter = tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#addChild(org.w3c.dom.Node, org.eclipse.jst.pagedesigner.converter.ConvertPosition)
-	 */
-	public abstract void addChild(Node childNode, ConvertPosition position);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#copyChildren(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public abstract void copyChildren(Element srcElement, Element destElement);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createElement(java.lang.String)
-	 */
-	public abstract Element createElement(String tag);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createText(java.lang.String)
-	 */
-	public abstract Text createText(String content);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#getHostElement()
-	 */
-	public Element getHostElement() {
-		Element element = null;
-		if (tagConverter != null) {
-			element = tagConverter.getHostElement(); 
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java
deleted file mode 100644
index 30263d7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * Produces output rendering for ITagConverter instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IOutputRenderer {
-
-	/**
-	 * Uses the ITagConverterContext argument to produce output rendering.
-	 * 
-	 * @param tagConverterContext ITagConverterContext instance providing
-	 * ITagConverter-specific context and functionality.
-	 * @return Element instance representing top Element in resulting output
-	 * tree.
-	 * 
-     * TODO: let's parameterize the return type either with a generic type
-     * or with Object so that sub-classes can co-vary
-	 */
-	public Element render(ITagConverterContext tagConverterContext);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java
deleted file mode 100644
index b857c4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Represents ITagConverter-specific context and functionality.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITagConverterContext {
-
-	/**
-	 * Gets ITagConverter instance's host Element instance.
-	 * 
-	 * @return ITagConverter instance's host Element instance.
-	 */
-	public Element getHostElement();
-
-	/**
-	 * Creates an Element instance to be used in ITagConverter's Document
-	 * instance.
-	 * 
-	 * @param tag Name of element to be created.
-	 * @return Element instance to be used in ITagConverter's Document
-	 * instance.
-	 */
-	public Element createElement(String tag);
-
-	/**
-	 * Creates a Text node instance to be used in ITagConverter's Document
-	 * instance.
-	 * 
-	 * @param content Textual content of the created text node.
-	 * @return Text node instance to be used in ITagConverter's Document
-	 * instance.
-	 */
-	public Text createText(String content);
-
-	/**
-	 * Adds a child Node instance to ITagConverter's collection of Nodes
-	 * requiring subsequent processing.
-	 * 
-	 * @param childNode Child Node instance requiring subsequent processing.
-	 * @param position ConvertPosition instance describing child Node
-	 * instance's position, relative to another Node instance.
-	 */
-	public void addChild(Node childNode, ConvertPosition position);
-
-	/**
-	 * Add all child Element instances of srcElement to ITagConverter's
-	 * collection of Nodes requiring subsequent processing.
-	 * 
-	 * @param srcElement Source Element instance from which child Elements are
-	 * copied.
-	 * @param destElement Destination Element instance to which child Elements
-	 * will be relative.
-	 */
-	public void copyChildren(Element srcElement, Element destElement);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java
deleted file mode 100644
index 713245f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-
-/**
- * Decorates an ITagConverter instance as appropriate (generally
- * client-specific decoration performed after tag conversion).
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITagConverterDecorator {
-
-	/**
-	 * Decorates the ITagConverter instance as appropriate.
-	 * 
-	 * @param tagConverter ITagConverter instance to be decorated.
-	 */
-	public void decorate(ITagConverter tagConverter);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java
deleted file mode 100644
index dfb847a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * Defines an operation used during transformation of input Element instances
- * to output Element instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- * 
- * TODO: as with ITransformer, I'd like to consider
- * ITransfomOperation<SRC, RESULT>
- */
-public interface ITransformOperation {
-
-	/**
-	 * Transforms an input element instance to an output Element instance.
-	 * 
-	 * @param srcElement Original input Element instance.
-	 * @param curElement Current Element instance.
-	 * @return Resulting transformed Element instance.
-	 */
-	public Element transform(Element srcElement, Element curElement);
-
-	/**
-	 * Sets the ITagConverterContext instance allowing access to context and
-	 * functionality of the current ITagConverter instance.
-	 * 
-	 * @param tagConverterContext ITagConverterContext instance allowing access
-	 * to context and functionality of the current ITagConverter instance.
-     * 
-	 */
-	public void setTagConverterContext(ITagConverterContext tagConverterContext);
-
-	/**
-	 * Appends a child ITransformOperation instance.
-	 * 
-	 * @param operation Child ITransformOperation instance to be appended.
-	 */
-	public void appendChildOperation(ITransformOperation operation);
-
-	/**
-	 * Gets collection of child ITransformOperation instances.
-	 * 
-	 * @return Collection of child ITransformOperation instances (may be null).
-	 */
-	public List getChildOperations();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java
deleted file mode 100644
index 49e99f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * Transforms an original input Element instance to an output Element instance
- * by invoking a collection of ITransformOperation instances.  
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITransformer {
-
-	/**
-	 * Appends an ITransformOperation instance to the collection.
-	 * 
-	 * @param operation ITransformOperation instance to be appended.
-     * API: does this need to be on the interface or could it be pushed
-     * into the instance constructor (i.e. factory).
-	 */
-	public void appendTransformOperation(ITransformOperation operation);
-
-	/**
-	 * Transforms an original input Element instance to an output Element
-	 * instance, typically by invoking each ITransformOperation instance in
-	 * this instance's collection.
-	 * 
-	 * @param srcElement Original input Element instance.
-	 * @return Transformed output Element instance.
-	 * 
-     * TODO: I'd like to consider templating the generic ITransformer
-     * interface to ITransformer<I,O> and making this a normative instance
-     * case of ITransformer<Element, Element>
-	 */
-	public Element transform(Element srcElement);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AbstractAttributeValueResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AbstractAttributeValueResolver.java
deleted file mode 100644
index 3fbfae5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AbstractAttributeValueResolver.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.w3c.dom.Element;
-
-/**
- *
- *
- */
-public abstract class AbstractAttributeValueResolver implements
-        IAttributeValueResolver
-{
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.dtmanager.converter.internal.IAttributeValueResolver#canResolve(org.w3c.dom.Element, org.w3c.dom.Element, java.lang.String)
-     */
-    public abstract boolean canResolve(Element originalElement,
-            Element convertedElement, String convertedAttrName,
-            final String convertedAttrValue);
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.dtmanager.converter.internal.IAttributeValueResolver#resolveAttribute(org.w3c.dom.Element, org.w3c.dom.Element, java.lang.String)
-     */
-    public abstract String resolveAttribute(Element originalElement,
-            Element convertedElement, String convertedAttrName,
-            final String convertedAttrValue);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AttributeValueResolverRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AttributeValueResolverRegistryReader.java
deleted file mode 100644
index 5e171d1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/AttributeValueResolverRegistryReader.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.internal.pde.AbstractSimpleClassExtensionRegistryReader;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AttributeValueResolverRegistryReader extends
-        AbstractSimpleClassExtensionRegistryReader<IAttributeValueResolver>
-{
-    private final static AttributeValueResolverRegistryReader INSTANCE = new AttributeValueResolverRegistryReader();
-
-    /**
-     * Not externally instantiable.
-     */
-    private AttributeValueResolverRegistryReader()
-    {
-        super(PDPlugin.getPluginId(),
-                IJMTConstants.EXTENSION_POINT_PAGEDESIGNER,
-                "attributeValueResolver", //$NON-NLS-1$
-                "class", //$NON-NLS-1$
-                new CompareOrgEclipseJstContributorsLastComparator<IAttributeValueResolver>()
-        );
-    }
-
-    /**
-     * @return singleton instance.
-     */
-    public static AttributeValueResolverRegistryReader getInstance()
-    {
-        return INSTANCE;
-    }
-
-    @Override
-    protected void handleLoadFailure(CoreException ce)
-    {
-        PDPlugin.log("Loading Attribute Value Resolver extensions", ce); //$NON-NLS-1$
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java
deleted file mode 100644
index b546750..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.IOutputRenderer;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.w3c.dom.Element;
-
-/**
- * Design-time metadata-driven HTML IOutputRenderer implementation.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTHTMLOutputRenderer implements IOutputRenderer {
-
-	private ITagConverterContext tagConverterContext;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.IOutputRenderer#render(org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext)
-	 */
-	public Element render(ITagConverterContext newTagConverterContext) {
-		this.tagConverterContext = newTagConverterContext;
-		Element srcElement = newTagConverterContext.getHostElement();
-		Element resultElement = null;
-		if (srcElement != null) {
-			ITransformer transformer = createTransformerFromDTInfo(srcElement);
-			if (transformer != null) {
-				resultElement = transformer.transform(srcElement);
-			}
-		}
-		return resultElement;
-	}
-
-	/**
-	 * Configures and returns an ITransformer instance for the specified source
-	 * Element.
-	 * 
-	 * @param element Element for which to configure and return an ITransformer
-	 * instance.
-	 * @return Configured ITransformer instance for the specified Element.
-	 */
-	protected ITransformer createTransformerFromDTInfo(Element element) {
-		ITransformer transformer = null;
-		DTManager dtManager = DTManager.getInstance();
-		IDTInfo dtInfo = dtManager.getDTInfo(element);
-		if (dtInfo != null) {
-			TagConvertInfo tcInfo = dtInfo.getTagConvertInfo();
-			if (tcInfo != null) {
-				transformer = new DefaultTransformer(tagConverterContext);
-				EList operations = tcInfo.getOperations();
-				if (!appendOperationsToTransformer(transformer, operations, dtInfo)) {
-					transformer = null;
-				}
-			}
-		}
-		return transformer;
-	}
-
-	private boolean appendOperationsToTransformer(ITransformer transformer, EList operations, IDTInfo dtInfo) {
-		Iterator itOperations = operations.iterator();
-		while (itOperations.hasNext()) {
-			Operation operation = (Operation)itOperations.next();
-			ITransformOperation currentTransformOperation = null;
-			String opID = operation.getId();
-			String[] params = getParamsArray(operation);
-			currentTransformOperation =
-				TransformOperationFactory.getInstance().getTransformOperation(opID, params);
-			if (currentTransformOperation != null) {
-				transformer.appendTransformOperation(currentTransformOperation);
-				EList childOperations = operation.getOperations();
-				if (childOperations != null && childOperations.size() > 0) {
-					if (!appendChildOperations(currentTransformOperation, childOperations, dtInfo)) {
-						return false;
-					}
-				}
-			} else {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	private boolean appendChildOperations(ITransformOperation parentOperation, EList operations, IDTInfo dtInfo) {
-		Iterator itOperations = operations.iterator();
-		while (itOperations.hasNext()) {
-			Operation operation = (Operation)itOperations.next();
-			ITransformOperation currentTransformOperation = null;
-			String opID = operation.getId();
-			String[] params = getParamsArray(operation);
-			currentTransformOperation =
-				TransformOperationFactory.getInstance().getTransformOperation(opID, params);
-			if (currentTransformOperation != null) {
-				parentOperation.appendChildOperation(currentTransformOperation);
-				EList childOperations = operation.getOperations();
-				if (childOperations != null && childOperations.size() > 0) {
-					if (!appendChildOperations(currentTransformOperation, childOperations, dtInfo)) {
-						return false;
-					}
-				}
-				
-			} else {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	private String[] getParamsArray(Operation operation) {
-		EList paramsList = operation.getParameters();
-		if (paramsList != null) {
-			Iterator itParamsList = paramsList.iterator();
-			String[] paramsArray = new String[paramsList.size()];
-			int index = 0;
-			while (itParamsList.hasNext()) {
-				Parameter param = (Parameter)itParamsList.next();
-				paramsArray[index++] = param.getValue();
-			}
-			return paramsArray;
-		}
-		//fall through - no params
-		return new String[0];
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverter.java
deleted file mode 100644
index f0d5099..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverter.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IDOMFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * Design-Time metadata-driven tag converter.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverter implements
-	ITagConverter, ITagEditInfo, INodeAdapter, IDOMFactory {
-
-	private Element hostElement;
-	private Element resultElement;
-	private Image visualImage;
-	private ImageDescriptor visualImageDescriptor;
-	private IDOMDocument destDocument;
-	private List childNodeList = Collections.EMPTY_LIST;
-	private NodeConvertPositionMap childVisualPositionMap;
-	private List nonVisualChildElementList = Collections.EMPTY_LIST;
-	private boolean isMultiLevel = false;
-	private boolean isVisualByHTML = true;
-	private boolean isWidget = false;
-	private int mode;
-	private int minHeight;
-	private int minWidth;
-	private boolean needBorderDecorator = false;
-	private boolean needTableDecorator = false;
-
-	/**
-	 * Constructs an instance for the specified source Element.
-	 * 
-	 * @param hostElement Source Element instance.
-	 */
-	public DTTagConverter(Element hostElement) {
-		this.hostElement = hostElement;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#convertRefresh(java.lang.Object)
-	 */
-	public void convertRefresh(Object context) {
-		childNodeList = new ArrayList();
-		childVisualPositionMap = new NodeConvertPositionMap();
-		nonVisualChildElementList = new ArrayList();
-		resultElement = new DTHTMLOutputRenderer().render(new DTTagConverterContext(this));
-		new DTTagConverterDecorator().decorate(this);
-		if (resultElement instanceof INodeNotifier) {
-			((INodeNotifier)resultElement).addAdapter(this);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#dispose()
-	 */
-	public void dispose() {
-		visualImage = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getChildModeList()
-	 */
-	public List getChildModeList() {
-		//need to reset the NodeConvertPositionMap at this time
-		childVisualPositionMap.reset();
-		return childNodeList;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getChildVisualPosition(org.w3c.dom.Node)
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel) {
-		return childVisualPositionMap.get(childModel);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getHostElement()
-	 */
-	public Element getHostElement() {
-		return hostElement;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getNonVisualChildren()
-	 */
-	public List getNonVisualChildren() {
-		return nonVisualChildElementList;
-	}
-
-	/**
-	 * Sets the result Element instance; allows decorators to set an "unknown
-	 * tag" Element when tag conversion has not produced a result.
-	 * 
-	 * @param resultElement Result Element instance to be set.
-	 */
-	public void setResultElement(Element resultElement) {
-		this.resultElement = resultElement;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getResultElement()
-	 */
-	public Element getResultElement() {
-		return resultElement;
-	}
-
-	/**
-	 * Sets the visual Image instance.
-	 * 
-	 * @param visualImage Visual Image instance.
-	 */
-	public void setVisualImage(Image visualImage) {
-		this.visualImage = visualImage;
-	}
-
-	/**
-	 * Sets the visual ImageDescriptor instance.
-	 * 
-	 * @param imageDescriptor Visual ImageDescriptor instance.
-	 */
-	public void setVisualImageDescriptor(ImageDescriptor imageDescriptor) {
-		this.visualImageDescriptor = imageDescriptor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getVisualImage()
-	 */
-	public Image getVisualImage() {
-		if (visualImage == null && visualImageDescriptor != null) {
-			visualImage = TagImageManager.getOrCreateImage(visualImageDescriptor);
-		}
-		return visualImage;
-	}
-
-	/**
-	 * Sets the "isMultiLevel" flag; allows decorators to manipulate this
-	 * setting.
-	 * 
-	 * @param isMultiLevel Sets the "isMultiLevel" flag to true or false.
-	 */
-	public void setMultiLevel(boolean isMultiLevel) {
-		this.isMultiLevel = isMultiLevel;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return isMultiLevel;
-	}
-
-	/**
-	 * Sets the "isVisualByHTML" flag; allows decorators to manipulate this
-	 * setting.
-	 * 
-	 * @param isVisualByHTML Sets the "isVisualByHTML" flag to true or false.
-	 */
-	public void setVisualByHTML(boolean isVisualByHTML) {
-		this.isVisualByHTML = isVisualByHTML;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isVisualByHTML()
-	 */
-	public boolean isVisualByHTML() {
-		return isVisualByHTML;
-	}
-
-	/**
-	 * Sets the "isWidget" flag; allows decorators to manipulate this setting.
-	 * 
-	 * @param isWidget Sets the "isWidget" flag to true or false.
-	 */
-	public void setWidget(boolean isWidget) {
-		this.isWidget = isWidget;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return isWidget;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setDestDocument(org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument)
-	 */
-	public void setDestDocument(IDOMDocument destDocument) {
-		this.destDocument = destDocument;
-	}
-
-	/**
-	 * Gets the IDOMDocument instance on which new Nodes are created.
-	 * 
-	 * @return IDOMDocument instance.
-	 */
-	public IDOMDocument getDestDocument() {
-		IDOMDocument document = null;
-		if (destDocument != null) {
-			document = destDocument;
-		} else {
-			document = (IDOMDocument)hostElement.getOwnerDocument();
-		}
-		return document;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setMode(int)
-	 */
-	public void setMode(int mode) {
-		this.mode = mode;
-	}
-
-	/**
-	 * Gets this instance's "mode", as set by setMode(int mode).
-	 * 
-	 * @return This instance's "mode".
-	 */
-	public int getMode() {
-		return mode;
-	}
-
-	/**
-	 * Sets the desired minimum height of the visual representation; allows
-	 * decorators to manipulate this setting.
-	 * 
-	 * @param minHeight The desired minimum height of the visual
-	 * representation.
-	 */
-	public void setMinHeight(int minHeight) {
-		this.minHeight = minHeight;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinHeight()
-	 */
-	public int getMinHeight() {
-		return minHeight;
-	}
-
-	/**
-	 * Sets the desired minimum width of the visual representation; allows
-	 * decorators to manipulate this setting.
-	 * 
-	 * @param minWidth The desired minimum width of the visual
-	 * representation.
-	 */
-	public void setMinWidth(int minWidth) {
-		this.minWidth = minWidth;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinWidth()
-	 */
-	public int getMinWidth() {
-		return minWidth;
-	}
-
-	/**
-	 * Sets the "needBorderDecorator" flag; allows decorators to manipulate
-	 * this setting.
-	 * 
-	 * @param needBorderDecorator Sets the "needBorderDecorator" flag to true
-	 * or false.
-	 */
-	public void setNeedBorderDecorator(boolean needBorderDecorator) {
-		this.needBorderDecorator = needBorderDecorator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return needBorderDecorator;
-	}
-
-	/**
-	 * Sets the "needTableDecorator" flag; allows decorators to manipulate
-	 * this setting.
-	 * 
-	 * @param needTableDecorator Sets the "needTableDecorator" flag to true
-	 * or false.
-	 */
-	public void setNeedTableDecorator(boolean needTableDecorator) {
-		this.needTableDecorator = needTableDecorator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needTableDecorator()
-	 */
-	public boolean needTableDecorator() {
-		return needTableDecorator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		if (type == ITagEditInfo.class) {
-			return true;
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier, int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		//do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IDOMFactory#createElement(java.lang.String)
-	 */
-	public Element createElement(String tag) {
-		return getDestDocument().createElement(tag);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IDOMFactory#createText(java.lang.String)
-	 */
-	public Text createText(String content) {
-		return getDestDocument().createTextNode(content);
-	}
-
-	/**
-	 * Adds a child Node to the collection of Nodes requiring subsequent tag
-	 * conversion.
-	 * 
-	 * @param childNode Node instance to be added.
-	 * @param position ConvertPosition instance describing indexed position
-	 * relative to another Node in the Document.
-	 */
-	public void addChild(Node childNode, ConvertPosition position) {
-		childNodeList.add(childNode);
-		childVisualPositionMap.put(childNode, position);
-	}
-
-	/**
-	 * Adds all child Nodes to the collection of Nodes requiring subsequent tag
-	 * conversion.
-	 * 
-	 * @param srcElement Source Element for which all child Nodes should be
-	 * added.
-	 * @param destElement Element to which added Nodes are relative.
-	 */
-	public void copyChildren(Element srcElement, Element destElement) {
-		int index = 0;
-		NodeList childNodes = srcElement.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node curNode = childNodes.item(i); 
-			if (
-					curNode.getNodeType() == Node.ELEMENT_NODE ||
-					curNode.getNodeType() == Node.TEXT_NODE ||
-					curNode.getNodeType() == Node.CDATA_SECTION_NODE) {
-				addChild(curNode, new ConvertPosition(destElement, index++));
-			}
-		}
-	}
-
-	/**
-	 * Adds a non-visual child Element to the collection of non-visual
-	 * children (subsequently retrieved via a call to "getNonVisualChildren".
-	 * 
-	 * @param childElement Child Element to be added.
-	 */
-	public void addNonVisualChildElement(Element childElement) {
-		nonVisualChildElementList.add(childElement);
-	}
-
-	/**
-	 * Supports multiple ConvertPosition instances associated with a single
-	 * Node instance.
-	 */
-	private class NodeConvertPositionMap {
-
-		private Map mapOfConvertPositions = new HashMap();
-		private Map mapOfIndexes = new HashMap();
-
-		/**
-		 * Puts a ConvertPosition instance for the specified Node instance into
-		 * the map.
-		 * 
-		 * @param node Node instance for which the ConvertPosition is to be
-		 * applied.
-		 * @param convertPosition ConvertPosition instance for the specified
-		 * Node instance.
-		 */
-		public void put(Node node, ConvertPosition convertPosition) {
-			List convertPositions = (List)mapOfConvertPositions.get(node);
-			if (convertPositions == null) {
-				convertPositions = new ArrayList();
-				mapOfConvertPositions.put(node, convertPositions);
-			}
-			convertPositions.add(convertPosition);
-		}
-
-		/**
-		 * Gets the current ConvertPosition instance for the specified Node
-		 * instance. Note that each time this is called without a reset having
-		 * occurred, the next ConvertPosition instance mapped to the Node
-		 * instance is returned.
-		 * 
-		 * @param node Node instance for which a ConvertPosition instance is
-		 * being requested.
-		 * @return the current ConvertPosition instance for the specified Node
-		 * instance.
-		 */
-		public ConvertPosition get(Node node) {
-			ConvertPosition convertPosition = null;
-			List convertPositions = (List)mapOfConvertPositions.get(node);
-			if (convertPositions != null) {
-				int index;
-				Object obj = mapOfIndexes.get(node);
-				if (obj != null) {
-					index = ((Integer)obj).intValue();
-				} else {
-					index = 0;
-				}
-				convertPosition = (ConvertPosition)convertPositions.get(index);
-				mapOfIndexes.put(node, new Integer(++index));
-			}
-			return convertPosition;
-		}
-
-		/**
-		 * Resets the concept of "current" ConvertPosition instance for all
-		 * Node instances. Typically called when the List of child Nodes is
-		 * retrieved.
-		 */
-		public void reset() {
-			mapOfIndexes.clear();
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterContext.java
deleted file mode 100644
index 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 124c1ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterDecorator.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.net.URL;
-
-import javax.servlet.jsp.el.ELException;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IResourceURLProvider;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterDecorator;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-import org.eclipse.jst.pagedesigner.preview.PageExpressionContext;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * ITagConverterDecorator implementation for DTTagConverter.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverterDecorator implements ITagConverterDecorator
-{
-
-    private static final String DECORATE_INFO_ID_DESIGN = "vpd-decorate-design"; //$NON-NLS-1$
-    private static final String DECORATE_INFO_ID_PREVIEW = "vpd-decorate-preview"; //$NON-NLS-1$
-    private static final String MD_PLUGIN_LOCATION = "$metadata-plugin-location$"; //$NON-NLS-1$
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see
-     * org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterDecorator
-     * #decorate(org.eclipse.jst.pagedesigner.converter.ITagConverter)
-     */
-    public void decorate(ITagConverter tagConverter)
-    {
-        if (!(tagConverter instanceof DTTagConverter))
-        {
-            throw new IllegalArgumentException(
-                    "ITagConverter argument must be an instance of DTTagConverter"); //$NON-NLS-1$
-        }
-        DTTagConverter dtTagConverter = (DTTagConverter) tagConverter;
-
-        if (dtTagConverter.getMode() == IConverterFactory.MODE_DESIGNER)
-        {
-            decorateFromDTInfo(dtTagConverter, DECORATE_INFO_ID_DESIGN);
-        } else if (dtTagConverter.getMode() == IConverterFactory.MODE_PREVIEW)
-        {
-            decorateFromDTInfo(dtTagConverter, DECORATE_INFO_ID_PREVIEW);
-        }
-
-        if (tagConverter.getResultElement() == null
-                && tagConverter.isVisualByHTML())
-        {
-            createUnknownTagRepresentation(dtTagConverter);
-        }
-    }
-
-    /**
-     * Performs decoration of the specified DTTagConverter instance from IDTInfo
-     * (metadata) for the specified (by ID) TagDecorateInfo.
-     * 
-     * @param dtTagConverter
-     *            DTTagConverter instance.
-     * @param tagDecorateInfoID
-     *            ID of the TagDecorateInfo to be located in metadata.
-     */
-    protected void decorateFromDTInfo(DTTagConverter dtTagConverter,
-            String tagDecorateInfoID)
-    {
-        Element srcElement = dtTagConverter.getHostElement();
-        DTManager dtManager = DTManager.getInstance();
-        IDTInfo dtInfo = dtManager.getDTInfo(srcElement);
-        if (dtInfo != null)
-        {
-            TagDecorateInfo tdInfo = dtInfo
-                    .getTagDecorateInfo(tagDecorateInfoID);
-            if (tdInfo != null)
-            {
-                dtTagConverter.setMultiLevel(tdInfo.isMultiLevel());
-                dtTagConverter.setNeedBorderDecorator(tdInfo
-                        .isNeedBorderDecorator());
-                dtTagConverter.setNeedTableDecorator(tdInfo
-                        .isNeedTableDecorator());
-                if (tdInfo.isNonVisual())
-                {
-                    setNonVisual(dtTagConverter, dtInfo, tdInfo
-                            .getNonVisualImagePath());
-                }
-                if (tdInfo.isResolveChildText())
-                {
-                    resolveChildText(dtTagConverter.getResultElement(), dtInfo);
-                }
-                if (tdInfo.isSetNonVisualChildElements())
-                {
-                    setNonVisualChildElements(dtTagConverter, srcElement);
-                }
-                dtTagConverter.setWidget(tdInfo.isWidget());
-                dtTagConverter.setMinHeight(tdInfo.getMinHeight());
-                dtTagConverter.setMinWidth(tdInfo.getMinWidth());
-                ResolveAttributeValue resAttrValue = tdInfo
-                        .getResolveAttributeValue();
-                if (resAttrValue != null)
-                {
-                    String attributeName = resAttrValue.getAttributeName();
-                    if (attributeName != null && attributeName.length() > 0)
-                    {
-                        resolveAttributeValue(dtTagConverter.getHostElement(),
-                                dtTagConverter.getResultElement(),
-                                attributeName, dtInfo, tagDecorateInfoID);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Creates a visual representation result Element for an unknown tag.
-     * 
-     * @param dtTagConverter
-     *            DTTagConverter instance.
-     */
-    protected void createUnknownTagRepresentation(DTTagConverter dtTagConverter)
-    {
-        Element element = dtTagConverter.createElement("span"); //$NON-NLS-1$
-        element.setAttribute("style", "color:red;font-weight:bold;"); //$NON-NLS-1$ //$NON-NLS-2$
-        Text text = dtTagConverter
-                .createText("<" + dtTagConverter.getHostElement().getTagName() + "/>"); //$NON-NLS-1$ //$NON-NLS-2$
-        element.appendChild(text);
-        dtTagConverter.setResultElement(element);
-        dtTagConverter.setWidget(true);
-    }
-
-    /**
-     * Adds child Elements of the specified source Element to the specified
-     * DTTagConverter instance's collection of non-visual children.
-     * 
-     * @param dtTagConverter
-     *            DTTagConverter instance.
-     * @param srcElement
-     *            Source Element for which child Elements are to be added.
-     */
-    protected void setNonVisualChildElements(DTTagConverter dtTagConverter,
-            Element srcElement)
-    {
-        NodeList childNodes = srcElement.getChildNodes();
-        for (int i = 0; i < childNodes.getLength(); i++)
-        {
-            Node curNode = childNodes.item(i);
-            if (curNode.getNodeType() == Node.ELEMENT_NODE)
-            {
-                dtTagConverter.addNonVisualChildElement((Element) curNode);
-            }
-        }
-    }
-
-    /**
-     * Performs simple EL resolution for the child Text Node of the specified
-     * source Element instance.
-     * 
-     * @param srcElement
-     *            Source Element for which child Text Node EL resolution is to
-     *            be performed.
-     * @param dtInfo
-     *            IDTInfo instance.
-     */
-    protected void resolveChildText(Element srcElement, IDTInfo dtInfo)
-    {
-        if (srcElement != null)
-        {
-            NodeList childNodes = srcElement.getChildNodes();
-            for (int i = 0; i < childNodes.getLength(); i++)
-            {
-                Node childNode = childNodes.item(i);
-                if (childNode.getNodeType() == Node.TEXT_NODE)
-                {
-                    Text textNode = (Text) childNode;
-                    String textNodeValue = textNode.getNodeValue();
-                    try
-                    {
-                        String newTextNodeValue;
-                        if (textNodeValue.contains(MD_PLUGIN_LOCATION))
-                        {
-                            newTextNodeValue = resolveMDPluginLocation(
-                                    textNodeValue, dtInfo);
-                        } else
-                        {
-                            newTextNodeValue = (String) PageExpressionContext
-                                    .getCurrent().evaluateExpression(
-                                            textNodeValue, String.class, null);
-                        }
-                        if (newTextNodeValue != null
-                                && !textNodeValue.equals(newTextNodeValue))
-                        {
-                            textNode.setNodeValue(newTextNodeValue);
-                        }
-                    } catch (Exception ex)
-                    {
-                        // ignore - could not resolve, do not change existing
-                        // value
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Performs simple EL resolution for the value of the specified attribute of
-     * the specified Element.
-     * 
-     * @param srcElement
-     * 
-     * @param targetElement
-     *            Source Element instance.
-     * @param attributeName
-     *            Name of attribute for which the value should be resolved.
-     * @param dtInfo
-     *            IDTInfo instance.
-     * @param tagDecorateInfoID 
-     */
-    protected void resolveAttributeValue(Element srcElement,
-            Element targetElement, String attributeName, IDTInfo dtInfo, 
-            String tagDecorateInfoID)
-    {
-        if (targetElement != null)
-        {
-            String oldAttributeValue = null;
-            String targetAttributeName = attributeName;
-            // determine if attributeName is XPath and re-target as appropriate
-            if (attributeName.contains("/")) { //$NON-NLS-1$
-                int lastSlashPos = attributeName.lastIndexOf("/"); //$NON-NLS-1$
-                String xPathExpression = attributeName.substring(0,
-                        lastSlashPos);
-                XPath xPath = XPathFactory.newInstance().newXPath();
-                try
-                {
-                    Object resultObject = xPath.evaluate(xPathExpression,
-                            targetElement, XPathConstants.NODE);
-                    if (resultObject instanceof Element)
-                    {
-                        targetElement = (Element) resultObject;
-                        targetAttributeName = attributeName
-                                .substring(lastSlashPos + 1);
-                    }
-                    else if (resultObject instanceof Text)
-                    {
-                        Node parentNode = ((Text)resultObject).getParentNode();
-                        if (parentNode instanceof Element)
-                        {
-                            parentNode.normalize();
-                            targetAttributeName = IAttributeValueResolver.TEXT_NODE_KEY;
-                            oldAttributeValue = ((Text)resultObject).getNodeValue();
-                        }
-                    }
-                }
-                catch (XPathExpressionException xee)
-                {
-                    // could not evaluate - leave targetElement and
-                    // targetAttributeName unchanged
-                }
-            }
-
-            
-            if (!IAttributeValueResolver.TEXT_NODE_KEY.equals(targetAttributeName))
-            {
-                oldAttributeValue = targetElement.getAttribute(targetAttributeName);
-            }
-
-            if (oldAttributeValue != null && oldAttributeValue.length() > 0)
-            {
-                String newAttributeValue;
-                if (oldAttributeValue.contains(MD_PLUGIN_LOCATION))
-                {
-                    newAttributeValue = resolveMDPluginLocation(
-                            oldAttributeValue, dtInfo);
-                }
-                else
-                {
-                    newAttributeValue = resolveAttributeValue(srcElement,
-                            targetElement, targetAttributeName,
-                            oldAttributeValue, tagDecorateInfoID);
-                }
-                if (newAttributeValue != null
-                        && !oldAttributeValue.equals(newAttributeValue))
-                {
-                    if (IAttributeValueResolver.TEXT_NODE_KEY
-                            .equals(targetAttributeName))
-                    {
-                        for (int i = targetElement.getChildNodes().getLength()-1; i >= 0; i--)
-                        {
-                            Node childNode = targetElement.getChildNodes().item(i);
-                            if (childNode.getNodeType() == Node.TEXT_NODE)
-                            {
-                                targetElement.removeChild(childNode);
-                            }
-                        }
-                        targetElement.appendChild(targetElement.getOwnerDocument().createTextNode(newAttributeValue));
-                    }
-                    else
-                    {
-                        targetElement.setAttribute(targetAttributeName,
-                                newAttributeValue);
-                    }
-                }
-            }
-        }
-    }
-
-    private String resolveAttributeValue(final Element originalElement,
-            final Element convertedElement,
-            final String convertedAttributeName, final String oldAttributeValue,
-            final String tagDecorateInfoID)
-    {
-        String newValue = null;
-        boolean valueResolved = false;
-        final String[] result = new String[1];
-
-        for (final IAttributeValueResolver resolver : AttributeValueResolverRegistryReader
-                .getInstance().getExtensions())
-        {
-            SafeRunner.run(new ISafeRunnable()
-            {
-                public void handleException(Throwable exception)
-                {
-                    PDPlugin
-                            .log(
-                                    "While resolving attribute in converter decorator", exception); //$NON-NLS-1$
-                }
-
-                public void run() throws Exception
-                {
-                    if (resolver.canResolve(originalElement,
-                            convertedElement, convertedAttributeName, oldAttributeValue))
-                    {
-                        result[0] = resolver.resolveAttribute(
-                                originalElement, convertedElement,
-                                convertedAttributeName, oldAttributeValue);
-                    }
-                }
-            });
-            if (result[0] != null)
-            {
-                newValue = result[0];
-                valueResolved = true;
-                break;
-            }
-        }
-
-        if (!valueResolved &&
-                // maintain backward compatibility: only do this default
-                // behaviour for the preview
-                tagDecorateInfoID.equals(DECORATE_INFO_ID_PREVIEW))
-        {
-            // fall- through to default case.
-            try
-            {
-                
-                PageExpressionContext current = PageExpressionContext.getCurrent();
-                if (current != null)
-                {
-                    return (String) current
-                            .evaluateExpression(oldAttributeValue, String.class,
-                                    null);
-                }
-            } catch (ELException e)
-            {
-                // ignore. we will just return null since couldn't resolve
-            }
-        }
-        return newValue;
-    }
-
-    /**
-     * Resolves any instance of MD_PLUGIN_LOCATION in input String.
-     * 
-     * @param input
-     *            Input String.
-     * @param dtInfo
-     *            IDTInfo instance.
-     * @return Input String with any instance of MD_PLUGIN_LOCATION resolved.
-     */
-    protected String resolveMDPluginLocation(String input, IDTInfo dtInfo)
-    {
-        String output = input;
-        if (input != null && input.contains(MD_PLUGIN_LOCATION))
-        {
-            int tokenStart = input.indexOf(MD_PLUGIN_LOCATION);
-            int tokenEnd = tokenStart + MD_PLUGIN_LOCATION.length();
-            String prefix = input.substring(0, tokenStart);
-            String suffix = input.substring(tokenEnd);
-            Trait trait = dtInfo.getTrait();
-            IMetaDataSourceModelProvider mdSourceModelProvider = trait
-                    .getSourceModelProvider();
-            IResourceURLProvider resourceURLProvider = (IResourceURLProvider) mdSourceModelProvider
-                    .getAdapter(IResourceURLProvider.class);
-            URL url = resourceURLProvider.getResourceURL("/META-INF/"); //$NON-NLS-1$
-            String resolvedToken = url.toExternalForm();
-            resolvedToken = resolvedToken.substring(0,
-                    resolvedToken.length() - 10);
-            output = prefix + resolvedToken + suffix;
-        }
-        return output;
-    }
-
-    /**
-     * Sets DTTagConverter instance as non-visual as HTML and sets the
-     * ImageDescriptor instance that DTTagConverter will use to return an Image
-     * for rendering.
-     * 
-     * @param dtTagConverter
-     *            DTTagConverter instance.
-     * @param dtInfo
-     *            IDTInfo instance.
-     * @param imagePath
-     *            Image path, relative to declaring plug-in.
-     */
-    protected void setNonVisual(DTTagConverter dtTagConverter, IDTInfo dtInfo,
-            String imagePath)
-    {
-        dtTagConverter.setVisualByHTML(false);
-        if (imagePath != null && imagePath.length() > 0)
-        {
-            Trait trait = dtInfo.getTrait();
-            IImageDescriptorProvider imgDescProvider = (IImageDescriptorProvider) trait
-                    .getSourceModelProvider().getAdapter(
-                            IImageDescriptorProvider.class);
-            if (imgDescProvider != null)
-            {
-                ImageDescriptor imageDescriptor = imgDescProvider
-                        .getImageDescriptor(imagePath);
-                dtTagConverter.setVisualImageDescriptor(imageDescriptor);
-            }
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java
deleted file mode 100644
index df40831..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
-import org.w3c.dom.Element;
-
-/**
- * Produces DTTagConverter instances.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverterFactory implements IConverterFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element, int)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		ITagConverter tagConverter = null;
-		IDTInfo dtInfo = DTManager.getInstance().getDTInfo(element);
-		if (dtInfo != null) {
-			tagConverter = new DTTagConverter(element);
-			tagConverter.setMode(mode);
-		}
-		return tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java
deleted file mode 100644
index 4e6ce62..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer;
-import org.w3c.dom.Element;
-
-/**
- * Default ITransformer implementation.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultTransformer implements ITransformer {
-
-	private ITagConverterContext tagConverterContext;
-    // synchronization occurs on this object, so it must never
-    // be allowed to be null
-	private final Collection transformOperations = new ArrayList();
-
-	/**
-	 * Instantiates an instance.
-	 * 
-	 * @param context ITagConverterContext instance.
-	 */
-	public DefaultTransformer(ITagConverterContext context) {
-		this.tagConverterContext = context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer#appendTransformOperation(org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation)
-	 */
-	public void appendTransformOperation(ITransformOperation operation) {
-		synchronized(transformOperations) {
-			if (operation != null) {
-				operation.setTagConverterContext(tagConverterContext);
-				transformOperations.add(operation);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITransformer#transform(org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement) {
-		Element curElement = null;
-		if (srcElement != null) {
-			synchronized(transformOperations) {
-				if (transformOperations.size() > 0) {
-					curElement = srcElement;
-					Iterator itOperations = transformOperations.iterator();
-					while (itOperations.hasNext()) {
-						ITransformOperation operation = (ITransformOperation)itOperations.next();
-						curElement = operation.transform(srcElement, curElement);
-					}
-				}
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/IAttributeValueResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/IAttributeValueResolver.java
deleted file mode 100644
index e654f5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/IAttributeValueResolver.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.w3c.dom.Element;
-
-/**
- * Marks an object that can resolve the runtime value of an attribute at 
- * design time.  The "runtime" value may be a best-guess or simulated value.
- * 
- * @author cbateman
- *
- */
-public interface IAttributeValueResolver
-{
-    /**
-     * Passed as convertedAttrName if the convertedElement's text content 
-     * is the 'attribute' to be resolved.
-     */
-    public static final String TEXT_NODE_KEY = "#text"; //$NON-NLS-1$
-
-    /**
-     * @param originalElement
-     * @param convertedElement 
-     * @param convertedAttrName 
-     * @param convertedAttrValue 
-     * 
-     * @return true if this resolver can resolve the value of attrName on domNode
-     */
-    public abstract boolean canResolve(final Element originalElement,
-            final Element convertedElement,
-            final String convertedAttrName,
-            final String convertedAttrValue);
-
-    /**
-     * @param originalElement 
-     * @param convertedElement 
-     * @param convertedAttrName 
-     * @param convertedAttrValue 
-     * @return the resolved String value of attrName.  A value of null does not necessarily
-     * mean that the value couldn't be resolved.
-     */
-    public abstract String resolveAttribute(final Element originalElement,
-            final Element convertedElement, final String convertedAttrName,
-            final String convertedAttrValue);
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
deleted file mode 100644
index dc2ab99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Abstract ITransformOperation implementation. Maintains ITagConverterContext
- * instance and collection of child ITransformOperation instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractTransformOperation implements ITransformOperation {
-
-	/**
-	 * ITagConverterContext instance.
-	 */
-	protected ITagConverterContext tagConverterContext;
-
-	/**
-	 * Collection of child ITransformOperation instances.
-	 */
-	protected List childOperations;
-
-	private String[] params;
-
-	private String id = "<not set>"; //$NON-NLS-1$
-	
-	/**
-	 * Zero-argument constructor
-	 */
-	public AbstractTransformOperation(){
-		//
-	}
-	
-	/**
-	 * Called by TransformOperationFactory
-	 * @param params for the operation
-	 */
-	void setParameters(String[] params) {
-		if (params != null) {
-			this.params = new String[params.length];
-			System.arraycopy(params, 0, this.params, 0, params.length);
-		}
-	}
-	
-	/**
-	 * @return parameters for the operation
-	 */
-	protected String[] getParameters(){
-		return params;
-	}
-	
-	/**
-	 * Called by TransformOperationFactory
-	 * @param id for the operation
-	 */
-	void setTransformOperationID(String id){
-		this.id = id;
-	}
-	
-	/**
-	 * @return id for the operation
-	 */
-	protected String getTransformOperationID(){
-		return id;
-	}
-	
-	/**
-	 * @return Logger
-	 */
-	protected Logger getLog() {
-		return PDPlugin.getLogger(TransformOperationFactory.class);
-	}
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public abstract Element transform(Element srcElement, Element curElement);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#setTagConverterContext(org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITagConverterContext)
-	 */
-	public void setTagConverterContext(ITagConverterContext tagConverterContext) {
-        // API: this should really be set on construction since other methods
-        // cannot be called until it is set.
-		this.tagConverterContext = tagConverterContext;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#appendChildOperation(org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITransformOperation)
-	 */
-	public void appendChildOperation(ITransformOperation operation) {
-		if (operation != null) {
-			if (childOperations == null) {
-				childOperations = new ArrayList();
-			}
-			operation.setTagConverterContext(tagConverterContext);
-			childOperations.add(operation);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#getChildOperations()
-	 */
-	public List getChildOperations() {
-		return childOperations;
-	}
-
-	/**
-	 * Convenience method to execute child ITransformOperation instances.
-	 * 
-	 * @param srcElement Source Element instance.
-	 * @param curElement Current Element instance (that is being transformed).
-	 * @return New current Element instance.
-	 */
-	protected Element executeChildOperations(Element srcElement, Element curElement) {
-		Element retElement = curElement;
-		if (childOperations != null && childOperations.size() > 0) {
-			Iterator itChildOperations = childOperations.iterator();
-			while (itChildOperations.hasNext()) {
-				ITransformOperation childOperation = (ITransformOperation)itChildOperations.next();
-				retElement = childOperation.transform(srcElement, retElement);
-			}
-		}
-		return retElement;
-	}
-
-	/**
-	 * Creates a new Element.
-	 * 
-	 * @param tagName Name of Element to be created.
-	 * @return New Element instance.
-	 */
-	protected Element createElement(String tagName) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CreateElementOperation,
-					new String[]{tagName});
-		operation.setTagConverterContext(tagConverterContext);
-		return operation.transform(null, null);
-	}
-
-	/**
-	 * Creates and appends a new child Element.
-	 * 
-	 * @param tagName Name of child Element to be created.
-	 * @param parentElement Element instance to which to append the new
-	 * Element.
-	 * @return New Element instance.
-	 */
-	protected Element appendChildElement(String tagName, Element parentElement) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_AppendChildElementOperation,
-					new String[]{tagName});
-		operation.setTagConverterContext(tagConverterContext);
-		return operation.transform(null, parentElement);
-	}
-
-	/**
-	 * Creates and appends a new child Text.
-	 * 
-	 * @param content Content of new child Text.
-	 * @param parentElement Element instance to which to append the new Text.
-	 */
-	protected void appendChildText(String content, Element parentElement) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_AppendChildTextOperation,
-					new String[]{content});
-		operation.setTagConverterContext(tagConverterContext);
-		operation.transform(null, parentElement);
-	}
-
-	/**
-	 * Gets collection of child Element instances who's local name matches
-	 * specified tag name.
-	 * 
-	 * @param srcNode Source Node instance.
-	 * @param tagName Tag local name.
-	 * @return Collection of child Element instances who's local name matches
-	 * specified tag name.
-	 */
-	protected List getChildElements(Node srcNode, String tagName) {
-		List childElements = new ArrayList();
-		NodeList childNodes = srcNode.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node curNode = childNodes.item(i);
-			if (curNode.getNodeType() == Node.ELEMENT_NODE) {
-				String curNodeName = curNode.getLocalName();
-				if (curNodeName != null && curNodeName.equals(tagName)) {
-					childElements.add(curNode);
-				}
-			}
-		}
-		return childElements;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/TransformOperationFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/TransformOperationFactory.java
deleted file mode 100644
index 0c8e6ed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/TransformOperationFactory.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.osgi.framework.Bundle;
-
-/**
- * Factory responsible for producing {@link org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation} instances from the <br>
- * <code>org.eclipse.jst.pagedesigner.pageDesignerExtension.tagTransformOperation</code> extensions 
- * <br>
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public final class TransformOperationFactory {
-	/**
-	 * AppendChildElementOperation
-	 */
-	public static final String OP_AppendChildElementOperation = PDPlugin.getPluginId()+".AppendChildElementOperation"; //$NON-NLS-1$
-	/**
-	 * AppendChildTextFromXPathOperation
-	 */
-	public static final String OP_AppendChildTextFromXPathOperation = PDPlugin.getPluginId()+".AppendChildTextFromXPathOperation"; //$NON-NLS-1$
-	/**
-	 * AppendChildTextOperation
-	 */
-	public static final String OP_AppendChildTextOperation = PDPlugin.getPluginId()+".AppendChildTextOperation"; //$NON-NLS-1$
-	/**
-	 * ConvertAttributeToTextOperation
-	 */
-	public static final String OP_ConvertAttributeToTextOperation = PDPlugin.getPluginId()+".ConvertAttributeToTextOperation"; //$NON-NLS-1$
-	/**
-	 * CopyAllAttributesOperation
-	 */
-	public static final String OP_CopyAllAttributesOperation = PDPlugin.getPluginId()+".CopyAllAttributesOperation"; //$NON-NLS-1$
-	/**
-	 * CopyAttributeOperation
-	 */
-	public static final String OP_CopyAttributeOperation = PDPlugin.getPluginId()+".CopyAttributeOperation"; //$NON-NLS-1$
-	/**
-	 * CopyAttributeWithRenameOperation
-	 */
-	public static final String OP_CopyAttributeWithRenameOperation = PDPlugin.getPluginId()+".CopyAttributeWithRenameOperation"; //$NON-NLS-1$
-	/**
-	 * CopyChildrenOperation
-	 */
-	public static final String OP_CopyChildrenOperation = PDPlugin.getPluginId()+".CopyChildrenOperation"; //$NON-NLS-1$
-	/**
-	 * CreateAttributeFromXPathOperation
-	 */
-	public static final String OP_CreateAttributeFromXPathOperation = PDPlugin.getPluginId()+".CreateAttributeFromXPathOperation"; //$NON-NLS-1$
-	/**
-	 * CreateAttributeOperation
-	 */
-	public static final String OP_CreateAttributeOperation = PDPlugin.getPluginId()+".CreateAttributeOperation"; //$NON-NLS-1$
-	/**
-	 * CreateElementOperation
-	 */
-	public static final String OP_CreateElementOperation = PDPlugin.getPluginId()+".CreateElementOperation"; //$NON-NLS-1$
-	/**
-	 * CustomTransformOperation
-	 */
-	public static final String OP_CustomTransformOperation = PDPlugin.getPluginId()+".CustomTransformOperation"; //$NON-NLS-1$
-	/**
-	 * IfNotOperation
-	 */
-	public static final String OP_IfNotOperation = PDPlugin.getPluginId()+".IfNotOperation"; //$NON-NLS-1$
-	/**
-	 * IfOperation
-	 */
-	public static final String OP_IfOperation = PDPlugin.getPluginId()+".IfOperation"; //$NON-NLS-1$
-	/**
-	 * IterateOverElementsOperation
-	 */
-	public static final String OP_IterateOverElementsOperation = PDPlugin.getPluginId()+".IterateOverElementsOperation"; //$NON-NLS-1$
-	/**
-	 * MakeParentElementCurrentOperation
-	 */
-	public static final String OP_MakeParentElementCurrentOperation = PDPlugin.getPluginId()+".MakeParentElementCurrentOperation"; //$NON-NLS-1$
-	/**
-	 * RemoveAttributeOperation
-	 */
-	public static final String OP_RemoveAttributeOperation = PDPlugin.getPluginId()+".RemoveAttributeOperation"; //$NON-NLS-1$
-	/**
-	 * RenameAttributeOperation
-	 */
-	public static final String OP_RenameAttributeOperation = PDPlugin.getPluginId()+".RenameAttributeOperation"; //$NON-NLS-1$
-
-	private static TransformOperationFactory instance;
-
-	private Logger log = PDPlugin.getLogger(TransformOperationFactory.class);
-	
-	private Map<String, Class> _tagTransformOpsRegistry;
-
-	/**
-	 * Instantiates an instance.
-	 */
-	private TransformOperationFactory() {
-		//no external instantiation
-		
-		//read extensions
-		readAllTagTransformOperations();
-	}
-
-	
-	/**
-	 * Gets the singleton instance.
-	 * 
-	 * @return The singleton instance.
-	 */
-	public static synchronized TransformOperationFactory getInstance() {
-		if (instance == null) {
-			instance = new TransformOperationFactory();
-		}
-		return instance;
-	}
-
-	/**
-	 * Gets an ITransformOperation instance for the specified operation ID and
-	 * parameters.
-	 * 
-	 * @param opID - the plugin-qualified Operation extension ID.
-	 * @param params - array of String parameters
-	 * @return ITransformOperation
-	 */
-	public ITransformOperation getTransformOperation(String opID, String[] params) {
-		Class opClass = null;
-		try {
-			opClass = _tagTransformOpsRegistry.get(opID);
-			if (opClass != null) {
-				Object opObject = opClass.newInstance();
-				if (opObject instanceof AbstractTransformOperation) {
-					((AbstractTransformOperation)opObject).setParameters(params);
-					((AbstractTransformOperation)opObject).setTransformOperationID(opID);			
-					return (AbstractTransformOperation)opObject;
-				}
-				log.error("Warning.TransformOperationFactory.NotAbstractTransformOperation", opClass.getName()); //$NON-NLS-1$
-			} else {
-				log.error("Warning.TransformOperationFactory.ExtensionNotFound", opID); //$NON-NLS-1$
-			}		
-		} catch(IllegalAccessException iae) {
-			log.error("Warning.TransformOperationFactory.IllegalAccess", opClass.getName(), iae); //$NON-NLS-1$
-		} catch(InstantiationException ie) {
-			log.error("Warning.TransformOperationFactory.Instantiation", opClass.getName(), ie); //$NON-NLS-1$
-		}
-		return null;
-	}
-	
-	/**
-	 * Reads the custom tag transform operations from WPE registry
-	 */
-	private void readAllTagTransformOperations() {
-		try {
-			_tagTransformOpsRegistry = new HashMap<String, Class>();
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(PDPlugin.getPluginId(), IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					if (ext.getConfigurationElements()[j].getName()
-							.equals(IJMTConstants.TAG_TRANSFORM_OPERATION)) {							
-						registerTransformOperation(ext.getConfigurationElements()[j]);					
-					}				
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			log.error("Warning.TransformOperationFactory.RegistryError", PDPlugin.getPluginId()+IJMTConstants.EXTENSION_POINT_PAGEDESIGNER+"."+IJMTConstants.TAG_TRANSFORM_OPERATION, e); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	private void registerTransformOperation(final IConfigurationElement element) {
-	
-		final Bundle bundle = Platform.getBundle(element.getContributor().getName());        
-		final String id = element.getContributor().getName()+"."+element.getAttribute("id"); //$NON-NLS-1$ //$NON-NLS-2$
-        if (bundle != null) {
-            try {
-                final Class transformClass = bundle.loadClass(element.getAttribute("class"));                 //$NON-NLS-1$
-                // Not checking instance type here.  Class gets checked as ITransformOperation at 
-                //instantiation time...  
-                //best to log error then rather than now.
-                _tagTransformOpsRegistry.put(id, transformClass);
-            }
-            catch (Exception e) {
-                log.error("Warning.TransformOperationFactory.CannotLoadOpClass",id,  e);  //$NON-NLS-1$
-            }
-        }		
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildElementOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildElementOperation.java
deleted file mode 100644
index 37178ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildElementOperation.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that appends a child Element and
- * optionally makes the new Element current.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class AppendChildElementOperation extends AbstractTransformOperation {
-
-	private String tagName;
-	private boolean makeChildCurrent = true;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else if (getParameters().length < 2) {
-			tagName = getParameters()[0];
-		} else {
-			tagName = getParameters()[0];
-			makeChildCurrent = Boolean.valueOf(getParameters()[1]).booleanValue();			
-		}
-		
-		Assert.isNotNull(tagName);
-		Element element = null;
-		if (tagConverterContext != null && curElement != null && tagName != null && tagName.length() > 0) {
-			Element childElement = tagConverterContext.createElement(tagName);
-			curElement.appendChild(childElement);
-			if (makeChildCurrent) {
-				element = childElement;
-			} else {
-				element = curElement;
-			}
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextFromXPathOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextFromXPathOperation.java
deleted file mode 100644
index b0a7391..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextFromXPathOperation.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation that creates a new child Text node by
- * getting a value from the specified XPath expression.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class AppendChildTextFromXPathOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		xPathExpression = getParameters()[0];		
-		Assert.isNotNull(xPathExpression);
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.STRING);
-				if (tagConverterContext != null && resultObject instanceof String && curElement != null) {
-					Text childText = tagConverterContext.createText((String)resultObject);
-					curElement.appendChild(childText);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextOperation.java
deleted file mode 100644
index 5d910c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextOperation.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation that appends a child Text.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class AppendChildTextOperation extends AbstractTransformOperation {
-
-	private String content;
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		content = getParameters()[0];		
-		Assert.isNotNull(content);
-		
-		if (tagConverterContext != null && curElement != null && content != null && content.length() > 0) {
-			Text childText = tagConverterContext.createText(content);
-			curElement.appendChild(childText);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/ConvertAttributeToTextOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/ConvertAttributeToTextOperation.java
deleted file mode 100644
index 51fdd9a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/ConvertAttributeToTextOperation.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation that converts an attribute to a child
- * Text Node and optionally removes the specified attribute.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ConvertAttributeToTextOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private boolean removeAttribute = true;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else if (getParameters().length < 2) {
-			attributeName = getParameters()[0];
-		} else {
-			attributeName = getParameters()[0];
-			removeAttribute = Boolean.valueOf(getParameters()[1]).booleanValue();
-		}		
-		
-		Assert.isNotNull(attributeName);
-		if (tagConverterContext != null && srcElement != null && curElement != null) {
-			String content = srcElement.getAttribute(attributeName);
-			if (content != null && content.length() > 0) {
-				Text text = tagConverterContext.createText(content);
-				curElement.appendChild(text);
-				if (removeAttribute) {
-					curElement.removeAttribute(attributeName);
-				}
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAllAttributesOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAllAttributesOperation.java
deleted file mode 100644
index 59b13f5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAllAttributesOperation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * ITransformOperation implementation that copies all attributes from the
- * source Element instance to the current Element instance.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyAllAttributesOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (srcElement != null && curElement != null) {
-			NamedNodeMap attributes = srcElement.getAttributes();
-			for (int i = 0; i < attributes.getLength(); i++) {
-				Attr attribute = (Attr)attributes.item(i);
-				curElement.setAttribute(attribute.getName(), attribute.getValue());
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeOperation.java
deleted file mode 100644
index a169436..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeOperation.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * Copies a single attribute from the source Element instance to the current
- * Element instance, and optionally creates a new attribute on the current
- * Element instance if no such attribute exists on the source Element instance.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyAttributeOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private boolean create;
-	private String newAttributeValue;
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else if (getParameters().length < 3) {
-			attributeName = getParameters()[0];			
-		} else {
-			attributeName = getParameters()[0];
-			create = Boolean.valueOf(getParameters()[1]).booleanValue();
-			newAttributeValue = getParameters()[2];		
-		}
-		
-		Assert.isNotNull(attributeName);
-		if (srcElement != null && curElement != null) {
-			Attr attribute = srcElement.getAttributeNode(attributeName);
-			if (attribute != null) {
-				curElement.setAttribute(attributeName, attribute.getValue());
-			} else if (create && newAttributeValue != null) {
-				curElement.setAttribute(attributeName, newAttributeValue);
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeWithRenameOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeWithRenameOperation.java
deleted file mode 100644
index 0a0a25b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeWithRenameOperation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * Copies a single attribute from the source Element instance to the current
- * Element instance, renaming the attribute on the current Element instance.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyAttributeWithRenameOperation extends AbstractTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-
-		String srcAttributeName = getParameters()[0];
-		String destAttributeName = getParameters()[1];
-		Assert.isNotNull(srcAttributeName);
-		Assert.isNotNull(destAttributeName);
-
-		if (srcElement != null && curElement != null) {
-			Attr attribute = srcElement.getAttributeNode(srcAttributeName);
-			if (attribute != null) {
-				curElement.setAttribute(destAttributeName, attribute.getValue());
-			}
-		}
-
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyChildrenOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyChildrenOperation.java
deleted file mode 100644
index 206e595..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyChildrenOperation.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that copies all child Elements as Nodes
- * requiring subsequent tag conversion.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyChildrenOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (tagConverterContext != null) {
-			tagConverterContext.copyChildren(srcElement, curElement);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeFromXPathOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeFromXPathOperation.java
deleted file mode 100644
index 31ea364..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeFromXPathOperation.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that creates a new attribute on the
- * current Element by getting a value from the specified XPath expression.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateAttributeFromXPathOperation extends AbstractTransformOperation {
-
-	private static final String DEFAULT_PREFIX = "prefix"; //$NON-NLS-1$
-
-	private String attributeName;
-	private String xPathExpression;
-	private String nsURI;
-	private String prefixedTokens;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		attributeName = getParameters()[0];
-		xPathExpression = getParameters()[1];				
-		Assert.isNotNull(attributeName);
-		Assert.isNotNull(xPathExpression);
-		if (getParameters().length > 3) {
-			nsURI = getParameters()[2];
-			Assert.isNotNull(nsURI);
-			prefixedTokens = getParameters()[3];
-			Assert.isNotNull(prefixedTokens);
-		}
-	
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.STRING);
-				if (resultObject instanceof String && curElement != null) {
-					if (((String)resultObject).equals("0")) { //$NON-NLS-1$
-						if (nsURI != null && prefixedTokens != null) {
-							xPath.setNamespaceContext(new NSContext(nsURI, DEFAULT_PREFIX));
-							resultObject = xPath.evaluate(getPrefixedExpression(DEFAULT_PREFIX), srcElement, XPathConstants.STRING);
-						}
-					}
-					curElement.setAttribute(attributeName, (String)resultObject);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return curElement;
-	}
-
-	private String getPrefixedExpression(String prefix) {
-		String prefixedExpression = xPathExpression;
-		final List<String> tokens = new ArrayList<String>();
-		final StringTokenizer tokenizer = new StringTokenizer(prefixedTokens, ","); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens()) {
-			tokens.add(tokenizer.nextToken());
-		}
-		for (String token: tokens) {
-			prefixedExpression = prefixedExpression.replace(token, prefix + ":" + token); //$NON-NLS-1$
-		}
-		return prefixedExpression;
-	}
-
-
-
-	class NSContext implements NamespaceContext {
-
-		private String _namespaceURI;
-		private String _prefix;
-
-		public NSContext(String namespaceURI, String prefix) {
-			_namespaceURI = namespaceURI;
-			_prefix = prefix;
-		}
-
-		public String getNamespaceURI(String prefix) {
-			return _namespaceURI;
-		}
-
-		public String getPrefix(String namespaceURI) {
-			return _prefix;
-		}
-
-		public Iterator getPrefixes(String namespaceURI) {
-			return Arrays.asList(new String[]{_prefix}).iterator();
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java
deleted file mode 100644
index 7ffc0bb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that creates a new attribute on the
- * current Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateAttributeOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private String attributeValue;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		attributeName = getParameters()[0];
-		attributeValue = getParameters()[1];		
-		Assert.isNotNull(attributeName);
-		Assert.isNotNull(attributeValue);
-	
-		if (curElement != null) {
-			curElement.setAttribute(attributeName, attributeValue);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateElementOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateElementOperation.java
deleted file mode 100644
index 038fec2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateElementOperation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that creates a new Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateElementOperation extends AbstractTransformOperation {
-
-	private String tagName;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} 
-		
-		tagName = getParameters()[0];
-		Assert.isNotNull(tagName);
-		
-		Element element = null;
-		if (tagConverterContext != null && tagName != null && tagName.length() > 0) {
-			element = tagConverterContext.createElement(tagName);
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfNotOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfNotOperation.java
deleted file mode 100644
index 95c62f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfNotOperation.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that executes child ITransformOperation
- * instances if the XPath expression evaluated against the source Element
- * instance returns a "false" result.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class IfNotOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		xPathExpression = getParameters()[0];
-		Assert.isNotNull(xPathExpression);
-		
-		Element retElement = curElement;
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.BOOLEAN);
-				if (!((Boolean)resultObject).booleanValue()) {
-					retElement = executeChildOperations(srcElement, retElement);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return retElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfOperation.java
deleted file mode 100644
index f617e35..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfOperation.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that executes child ITransformOperation
- * instances if the XPath expression evaluated against the source Element
- * instance returns a "true" result.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class IfOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		xPathExpression = getParameters()[0];
-		Assert.isNotNull(xPathExpression);
-		
-		Element retElement = curElement;
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.BOOLEAN);
-				if (((Boolean)resultObject).booleanValue()) {
-					retElement = executeChildOperations(srcElement, retElement);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return retElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IterateOverElementsOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IterateOverElementsOperation.java
deleted file mode 100644
index 530fa24..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IterateOverElementsOperation.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation that executes child ITransformOperation
- * instances for each Element in the NodeList returned by the XPath expression,
- * which is evaluated against the source Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class IterateOverElementsOperation extends AbstractTransformOperation {
-
-	private static final String DEFAULT_PREFIX = "prefix"; //$NON-NLS-1$
-
-	private String xPathExpression;
-	private String nsURI;
-	private String prefixedTokens;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		xPathExpression = getParameters()[0];		
-		Assert.isNotNull(xPathExpression);
-		if (getParameters().length > 2) {
-			nsURI = getParameters()[1];
-			Assert.isNotNull(nsURI);
-			prefixedTokens = getParameters()[2];
-			Assert.isNotNull(prefixedTokens);
-		}
-
-		Element retElement = curElement;
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.NODESET);
-				if (resultObject instanceof NodeList) {
-					NodeList nodes = (NodeList)resultObject;
-					if (nodes.getLength() < 1) {
-						if (nsURI != null && prefixedTokens != null) {
-							xPath.setNamespaceContext(new NSContext(nsURI, DEFAULT_PREFIX));
-							resultObject = xPath.evaluate(getPrefixedExpression(DEFAULT_PREFIX), srcElement, XPathConstants.NODESET);
-							if (resultObject instanceof NodeList) {
-								nodes = (NodeList)resultObject;
-							}
-						}
-					}
-					for (int i = 0; i < nodes.getLength(); i++) {
-						Node node = nodes.item(i);
-						if (node instanceof Element) {
-							retElement = executeChildOperations((Element)node, retElement);
-						}
-					}
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return retElement;
-	}
-
-	private String getPrefixedExpression(String prefix) {
-		String prefixedExpression = xPathExpression;
-		final List<String> tokens = new ArrayList<String>();
-		final StringTokenizer tokenizer = new StringTokenizer(prefixedTokens, ","); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens()) {
-			tokens.add(tokenizer.nextToken());
-		}
-		for (String token: tokens) {
-			prefixedExpression = prefixedExpression.replace(token, prefix + ":" + token); //$NON-NLS-1$
-		}
-		return prefixedExpression;
-	}
-
-
-
-	class NSContext implements NamespaceContext {
-
-		private String _namespaceURI;
-		private String _prefix;
-
-		public NSContext(String namespaceURI, String prefix) {
-			_namespaceURI = namespaceURI;
-			_prefix = prefix;
-		}
-
-		public String getNamespaceURI(String prefix) {
-			return _namespaceURI;
-		}
-
-		public String getPrefix(String namespaceURI) {
-			return _prefix;
-		}
-
-		public Iterator getPrefixes(String namespaceURI) {
-			return Arrays.asList(new String[]{_prefix}).iterator();
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java
deleted file mode 100644
index b0e32af..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation that makes the current Element's parent
- * Element the new current Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class MakeParentElementCurrentOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element resultElement = null;
-		if (curElement != null) {
-			Node parentNode = curElement.getParentNode();
-			while (parentNode != null && parentNode.getNodeType() != Node.DOCUMENT_NODE) {
-				if (parentNode.getNodeType() == Node.ELEMENT_NODE) {
-					resultElement = (Element)parentNode;
-					break;
-				}
-                parentNode = parentNode.getParentNode();
-			}
-		}
-		return resultElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java
deleted file mode 100644
index b217c6a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that removes an attribute from the
- * current Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class RemoveAttributeOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		attributeName = getParameters()[0];
-		Assert.isNotNull(attributeName);
-		
-		if (curElement != null) {
-			curElement.removeAttribute(attributeName);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RenameAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RenameAttributeOperation.java
deleted file mode 100644
index c924538..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RenameAttributeOperation.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that renames an attribute of the current
- * Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class RenameAttributeOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		String oldAttributeName = getParameters()[0];
-		String newAttributeName = getParameters()[1];
-		Assert.isNotNull(oldAttributeName);
-		Assert.isNotNull(newAttributeName);
-		
-		if (curElement != null) {
-			Attr oldAttribute = curElement.getAttributeNode(oldAttributeName);
-			if (oldAttribute != null) {
-				curElement.setAttribute(newAttributeName, oldAttribute.getValue());
-				curElement.removeAttribute(oldAttributeName);
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/package-info.java
deleted file mode 100644
index 0b15e7d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Basic tag conversion operations. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/package-info.java
deleted file mode 100644
index dd15b1b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Meta-data driven tag converters. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java
deleted file mode 100644
index a77dd4d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>DT Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos <em>Tag Decorate Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo()
- * @model
- * @generated
- */
-public interface DTInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Tag Convert Info</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Convert Info</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Convert Info</em>' containment reference.
-	 * @see #setTagConvertInfo(TagConvertInfo)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo_TagConvertInfo()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='tag-convert-info'"
-	 * @generated
-	 */
-	TagConvertInfo getTagConvertInfo();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tag Convert Info</em>' containment reference.
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 */
-	void setTagConvertInfo(TagConvertInfo value);
-
-	/**
-	 * Returns the value of the '<em><b>Tag Decorate Infos</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Decorate Infos</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Decorate Infos</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo_TagDecorateInfos()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.TagDecorateInfo" containment="true"
-	 *        extendedMetaData="kind='element' name='tag-decorate-info'"
-	 * @generated
-	 */
-	EList getTagDecorateInfos();
-
-} // DTInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java
deleted file mode 100644
index 2577126..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public interface DTInfoFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	DTInfoFactory eINSTANCE = org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>DT Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>DT Info</em>'.
-	 * @generated
-	 */
-	DTInfo createDTInfo();
-
-	/**
-	 * Returns a new object of class '<em>Tag Convert Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Convert Info</em>'.
-	 * @generated
-	 */
-	TagConvertInfo createTagConvertInfo();
-
-	/**
-	 * Returns a new object of class '<em>Operation</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Operation</em>'.
-	 * @generated
-	 */
-	Operation createOperation();
-
-	/**
-	 * Returns a new object of class '<em>Parameter</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Parameter</em>'.
-	 * @generated
-	 */
-	Parameter createParameter();
-
-	/**
-	 * Returns a new object of class '<em>Tag Decorate Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Decorate Info</em>'.
-	 * @generated
-	 */
-	TagDecorateInfo createTagDecorateInfo();
-
-	/**
-	 * Returns a new object of class '<em>Resolve Attribute Value</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resolve Attribute Value</em>'.
-	 * @generated
-	 */
-	ResolveAttributeValue createResolveAttributeValue();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	DTInfoPackage getDTInfoPackage();
-
-} //DTInfoFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java
deleted file mode 100644
index c42846e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java
+++ /dev/null
@@ -1,892 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoFactory
- * @model kind="package"
- * @generated
- */
-public interface DTInfoPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "dtinfo"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "dti"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	DTInfoPackage eINSTANCE = org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl <em>DT Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getDTInfo()
-	 * @generated
-	 */
-	int DT_INFO = 0;
-
-	/**
-	 * The feature id for the '<em><b>Tag Convert Info</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO__TAG_CONVERT_INFO = 0;
-
-	/**
-	 * The feature id for the '<em><b>Tag Decorate Infos</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO__TAG_DECORATE_INFOS = 1;
-
-	/**
-	 * The number of structural features of the '<em>DT Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl <em>Tag Convert Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagConvertInfo()
-	 * @generated
-	 */
-	int TAG_CONVERT_INFO = 1;
-
-	/**
-	 * The feature id for the '<em><b>Operations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CONVERT_INFO__OPERATIONS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Tag Convert Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CONVERT_INFO_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl <em>Operation</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getOperation()
-	 * @generated
-	 */
-	int OPERATION = 2;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Parameters</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__PARAMETERS = 1;
-
-	/**
-	 * The feature id for the '<em><b>Operations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__OPERATIONS = 2;
-
-	/**
-	 * The number of structural features of the '<em>Operation</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl <em>Parameter</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getParameter()
-	 * @generated
-	 */
-	int PARAMETER = 3;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARAMETER__VALUE = 0;
-
-	/**
-	 * The number of structural features of the '<em>Parameter</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARAMETER_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl <em>Tag Decorate Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagDecorateInfo()
-	 * @generated
-	 */
-	int TAG_DECORATE_INFO = 4;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Min Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MIN_HEIGHT = 1;
-
-	/**
-	 * The feature id for the '<em><b>Min Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MIN_WIDTH = 2;
-
-	/**
-	 * The feature id for the '<em><b>Multi Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MULTI_LEVEL = 3;
-
-	/**
-	 * The feature id for the '<em><b>Need Border Decorator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NEED_BORDER_DECORATOR = 4;
-
-	/**
-	 * The feature id for the '<em><b>Need Table Decorator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NEED_TABLE_DECORATOR = 5;
-
-	/**
-	 * The feature id for the '<em><b>Non Visual</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NON_VISUAL = 6;
-
-	/**
-	 * The feature id for the '<em><b>Non Visual Image Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH = 7;
-
-	/**
-	 * The feature id for the '<em><b>Resolve Child Text</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT = 8;
-
-	/**
-	 * The feature id for the '<em><b>Resolve Attribute Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE = 9;
-
-	/**
-	 * The feature id for the '<em><b>Set Non Visual Child Elements</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS = 10;
-
-	/**
-	 * The feature id for the '<em><b>Widget</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__WIDGET = 11;
-
-	/**
-	 * The number of structural features of the '<em>Tag Decorate Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO_FEATURE_COUNT = 12;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl <em>Resolve Attribute Value</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getResolveAttributeValue()
-	 * @generated
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Attribute Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME = 0;
-
-	/**
-	 * The number of structural features of the '<em>Resolve Attribute Value</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE_FEATURE_COUNT = 1;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo <em>DT Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>DT Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo
-	 * @generated
-	 */
-	EClass getDTInfo();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Tag Convert Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo()
-	 * @see #getDTInfo()
-	 * @generated
-	 */
-	EReference getDTInfo_TagConvertInfo();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos <em>Tag Decorate Infos</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Tag Decorate Infos</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos()
-	 * @see #getDTInfo()
-	 * @generated
-	 */
-	EReference getDTInfo_TagDecorateInfos();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Convert Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo
-	 * @generated
-	 */
-	EClass getTagConvertInfo();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations <em>Operations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Operations</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations()
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 */
-	EReference getTagConvertInfo_Operations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation <em>Operation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Operation</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation
-	 * @generated
-	 */
-	EClass getOperation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EAttribute getOperation_Id();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters <em>Parameters</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Parameters</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EReference getOperation_Parameters();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations <em>Operations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Operations</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EReference getOperation_Operations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter <em>Parameter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Parameter</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter
-	 * @generated
-	 */
-	EClass getParameter();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue()
-	 * @see #getParameter()
-	 * @generated
-	 */
-	EAttribute getParameter_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo <em>Tag Decorate Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Decorate Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo
-	 * @generated
-	 */
-	EClass getTagDecorateInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Min Height</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MinHeight();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Min Width</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MinWidth();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Multi Level</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MultiLevel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Need Border Decorator</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NeedBorderDecorator();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Need Table Decorator</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NeedTableDecorator();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Non Visual</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NonVisual();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Non Visual Image Path</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NonVisualImagePath();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Resolve Child Text</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_ResolveChildText();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Resolve Attribute Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EReference getTagDecorateInfo_ResolveAttributeValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Set Non Visual Child Elements</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_SetNonVisualChildElements();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Widget</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_Widget();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resolve Attribute Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue
-	 * @generated
-	 */
-	EClass getResolveAttributeValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Attribute Name</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName()
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 */
-	EAttribute getResolveAttributeValue_AttributeName();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	DTInfoFactory getDTInfoFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl <em>DT Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getDTInfo()
-		 * @generated
-		 */
-		EClass DT_INFO = eINSTANCE.getDTInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag Convert Info</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DT_INFO__TAG_CONVERT_INFO = eINSTANCE.getDTInfo_TagConvertInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag Decorate Infos</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DT_INFO__TAG_DECORATE_INFOS = eINSTANCE.getDTInfo_TagDecorateInfos();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl <em>Tag Convert Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagConvertInfo()
-		 * @generated
-		 */
-		EClass TAG_CONVERT_INFO = eINSTANCE.getTagConvertInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Operations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_CONVERT_INFO__OPERATIONS = eINSTANCE.getTagConvertInfo_Operations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl <em>Operation</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getOperation()
-		 * @generated
-		 */
-		EClass OPERATION = eINSTANCE.getOperation();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute OPERATION__ID = eINSTANCE.getOperation_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Parameters</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference OPERATION__PARAMETERS = eINSTANCE.getOperation_Parameters();
-
-		/**
-		 * The meta object literal for the '<em><b>Operations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference OPERATION__OPERATIONS = eINSTANCE.getOperation_Operations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl <em>Parameter</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getParameter()
-		 * @generated
-		 */
-		EClass PARAMETER = eINSTANCE.getParameter();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PARAMETER__VALUE = eINSTANCE.getParameter_Value();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl <em>Tag Decorate Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagDecorateInfo()
-		 * @generated
-		 */
-		EClass TAG_DECORATE_INFO = eINSTANCE.getTagDecorateInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__ID = eINSTANCE.getTagDecorateInfo_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Min Height</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MIN_HEIGHT = eINSTANCE.getTagDecorateInfo_MinHeight();
-
-		/**
-		 * The meta object literal for the '<em><b>Min Width</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MIN_WIDTH = eINSTANCE.getTagDecorateInfo_MinWidth();
-
-		/**
-		 * The meta object literal for the '<em><b>Multi Level</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MULTI_LEVEL = eINSTANCE.getTagDecorateInfo_MultiLevel();
-
-		/**
-		 * The meta object literal for the '<em><b>Need Border Decorator</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NEED_BORDER_DECORATOR = eINSTANCE.getTagDecorateInfo_NeedBorderDecorator();
-
-		/**
-		 * The meta object literal for the '<em><b>Need Table Decorator</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NEED_TABLE_DECORATOR = eINSTANCE.getTagDecorateInfo_NeedTableDecorator();
-
-		/**
-		 * The meta object literal for the '<em><b>Non Visual</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NON_VISUAL = eINSTANCE.getTagDecorateInfo_NonVisual();
-
-		/**
-		 * The meta object literal for the '<em><b>Non Visual Image Path</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH = eINSTANCE.getTagDecorateInfo_NonVisualImagePath();
-
-		/**
-		 * The meta object literal for the '<em><b>Resolve Child Text</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT = eINSTANCE.getTagDecorateInfo_ResolveChildText();
-
-		/**
-		 * The meta object literal for the '<em><b>Resolve Attribute Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE = eINSTANCE.getTagDecorateInfo_ResolveAttributeValue();
-
-		/**
-		 * The meta object literal for the '<em><b>Set Non Visual Child Elements</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS = eINSTANCE.getTagDecorateInfo_SetNonVisualChildElements();
-
-		/**
-		 * The meta object literal for the '<em><b>Widget</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__WIDGET = eINSTANCE.getTagDecorateInfo_Widget();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl <em>Resolve Attribute Value</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getResolveAttributeValue()
-		 * @generated
-		 */
-		EClass RESOLVE_ATTRIBUTE_VALUE = eINSTANCE.getResolveAttributeValue();
-
-		/**
-		 * The meta object literal for the '<em><b>Attribute Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME = eINSTANCE.getResolveAttributeValue_AttributeName();
-
-	}
-
-} //DTInfoPackage
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java
deleted file mode 100644
index 4377cc0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Operation</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters <em>Parameters</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation()
- * @model
- * @generated
- */
-public interface Operation extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Parameters</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Parameters</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Parameters</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Parameters()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Parameter" containment="true"
-	 *        extendedMetaData="kind='element' name='parameter'"
-	 * @generated
-	 */
-	EList getParameters();
-
-	/**
-	 * Returns the value of the '<em><b>Operations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Operations</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Operations</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Operations()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Operation" containment="true"
-	 *        extendedMetaData="kind='element' name='operation'"
-	 * @generated
-	 */
-	EList getOperations();
-
-} // Operation
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java
deleted file mode 100644
index 312a297..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Parameter</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getParameter()
- * @model
- * @generated
- */
-public interface Parameter extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getParameter_Value()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-} // Parameter
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java
deleted file mode 100644
index 07a4271..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resolve Attribute Value</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getResolveAttributeValue()
- * @model
- * @generated
- */
-public interface ResolveAttributeValue extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Attribute Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute Name</em>' attribute.
-	 * @see #setAttributeName(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getResolveAttributeValue_AttributeName()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getAttributeName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Name</em>' attribute.
-	 * @see #getAttributeName()
-	 * @generated
-	 */
-	void setAttributeName(String value);
-
-} // ResolveAttributeValue
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java
deleted file mode 100644
index 0f0049c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Convert Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagConvertInfo()
- * @model
- * @generated
- */
-public interface TagConvertInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Operations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Operations</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Operations</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagConvertInfo_Operations()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Operation" containment="true"
-	 *        extendedMetaData="kind='element' name='operation'"
-	 * @generated
-	 */
-	EList getOperations();
-
-} // TagConvertInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java
deleted file mode 100644
index 726e237..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Decorate Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo()
- * @model
- * @generated
- */
-public interface TagDecorateInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Min Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Min Height</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Min Height</em>' attribute.
-	 * @see #setMinHeight(int)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MinHeight()
-	 * @model
-	 * @generated
-	 */
-	int getMinHeight();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Min Height</em>' attribute.
-	 * @see #getMinHeight()
-	 * @generated
-	 */
-	void setMinHeight(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Min Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Min Width</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Min Width</em>' attribute.
-	 * @see #setMinWidth(int)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MinWidth()
-	 * @model
-	 * @generated
-	 */
-	int getMinWidth();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Min Width</em>' attribute.
-	 * @see #getMinWidth()
-	 * @generated
-	 */
-	void setMinWidth(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Multi Level</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Multi Level</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Multi Level</em>' attribute.
-	 * @see #setMultiLevel(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MultiLevel()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isMultiLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Multi Level</em>' attribute.
-	 * @see #isMultiLevel()
-	 * @generated
-	 */
-	void setMultiLevel(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Need Border Decorator</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Need Border Decorator</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Need Border Decorator</em>' attribute.
-	 * @see #setNeedBorderDecorator(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NeedBorderDecorator()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNeedBorderDecorator();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Need Border Decorator</em>' attribute.
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 */
-	void setNeedBorderDecorator(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Need Table Decorator</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Need Table Decorator</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Need Table Decorator</em>' attribute.
-	 * @see #setNeedTableDecorator(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NeedTableDecorator()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNeedTableDecorator();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Need Table Decorator</em>' attribute.
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 */
-	void setNeedTableDecorator(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Non Visual</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Non Visual</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Non Visual</em>' attribute.
-	 * @see #setNonVisual(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NonVisual()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNonVisual();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Non Visual</em>' attribute.
-	 * @see #isNonVisual()
-	 * @generated
-	 */
-	void setNonVisual(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Non Visual Image Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Non Visual Image Path</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Non Visual Image Path</em>' attribute.
-	 * @see #setNonVisualImagePath(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NonVisualImagePath()
-	 * @model
-	 * @generated
-	 */
-	String getNonVisualImagePath();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Non Visual Image Path</em>' attribute.
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 */
-	void setNonVisualImagePath(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Resolve Child Text</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resolve Child Text</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resolve Child Text</em>' attribute.
-	 * @see #setResolveChildText(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_ResolveChildText()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isResolveChildText();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resolve Child Text</em>' attribute.
-	 * @see #isResolveChildText()
-	 * @generated
-	 */
-	void setResolveChildText(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Resolve Attribute Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resolve Attribute Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resolve Attribute Value</em>' containment reference.
-	 * @see #setResolveAttributeValue(ResolveAttributeValue)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_ResolveAttributeValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='resolve-attribute-value'"
-	 * @generated
-	 */
-	ResolveAttributeValue getResolveAttributeValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resolve Attribute Value</em>' containment reference.
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 */
-	void setResolveAttributeValue(ResolveAttributeValue value);
-
-	/**
-	 * Returns the value of the '<em><b>Set Non Visual Child Elements</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Set Non Visual Child Elements</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Set Non Visual Child Elements</em>' attribute.
-	 * @see #setSetNonVisualChildElements(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_SetNonVisualChildElements()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isSetNonVisualChildElements();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Set Non Visual Child Elements</em>' attribute.
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 */
-	void setSetNonVisualChildElements(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Widget</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Widget</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Widget</em>' attribute.
-	 * @see #setWidget(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_Widget()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isWidget();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Widget</em>' attribute.
-	 * @see #isWidget()
-	 * @generated
-	 */
-	void setWidget(boolean value);
-
-} // TagDecorateInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java
deleted file mode 100644
index 32c888c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class DTInfoFactoryImpl extends EFactoryImpl implements DTInfoFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the factory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static DTInfoFactory init() {
-		try {
-			DTInfoFactory theDTInfoFactory = (DTInfoFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jsf.pagedesigner/dtinfo.ecore");  //$NON-NLS-1$
-			if (theDTInfoFactory != null) {
-				return theDTInfoFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new DTInfoFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case DTInfoPackage.DT_INFO: return createDTInfo();
-			case DTInfoPackage.TAG_CONVERT_INFO: return createTagConvertInfo();
-			case DTInfoPackage.OPERATION: return createOperation();
-			case DTInfoPackage.PARAMETER: return createParameter();
-			case DTInfoPackage.TAG_DECORATE_INFO: return createTagDecorateInfo();
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE: return createResolveAttributeValue();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfo createDTInfo() {
-		DTInfoImpl dtInfo = new DTInfoImpl();
-		return dtInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagConvertInfo createTagConvertInfo() {
-		TagConvertInfoImpl tagConvertInfo = new TagConvertInfoImpl();
-		return tagConvertInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Operation createOperation() {
-		OperationImpl operation = new OperationImpl();
-		return operation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Parameter createParameter() {
-		ParameterImpl parameter = new ParameterImpl();
-		return parameter;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagDecorateInfo createTagDecorateInfo() {
-		TagDecorateInfoImpl tagDecorateInfo = new TagDecorateInfoImpl();
-		return tagDecorateInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResolveAttributeValue createResolveAttributeValue() {
-		ResolveAttributeValueImpl resolveAttributeValue = new ResolveAttributeValueImpl();
-		return resolveAttributeValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoPackage getDTInfoPackage() {
-		return (DTInfoPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return  the package
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static DTInfoPackage getPackage() {
-		return DTInfoPackage.eINSTANCE;
-	}
-
-} //DTInfoFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoImpl.java
deleted file mode 100644
index d4533a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoImpl.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>DT Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl#getTagConvertInfo <em>Tag Convert Info</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl#getTagDecorateInfos <em>Tag Decorate Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DTInfoImpl extends EObjectImpl implements DTInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getTagConvertInfo() <em>Tag Convert Info</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 * @ordered
-	 */
-	protected TagConvertInfo tagConvertInfo;
-
-	/**
-	 * The cached value of the '{@link #getTagDecorateInfos() <em>Tag Decorate Infos</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagDecorateInfos()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList tagDecorateInfos;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DTInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.DT_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagConvertInfo getTagConvertInfo() {
-		return tagConvertInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param newTagConvertInfo 
-     * @param msgs 
-     * @return the notification chaing 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTagConvertInfo(TagConvertInfo newTagConvertInfo, NotificationChain msgs) {
-		TagConvertInfo oldTagConvertInfo = tagConvertInfo;
-		tagConvertInfo = newTagConvertInfo;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, oldTagConvertInfo, newTagConvertInfo);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTagConvertInfo(TagConvertInfo newTagConvertInfo) {
-		if (newTagConvertInfo != tagConvertInfo) {
-			NotificationChain msgs = null;
-			if (tagConvertInfo != null)
-				msgs = ((InternalEObject)tagConvertInfo).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, null, msgs);
-			if (newTagConvertInfo != null)
-				msgs = ((InternalEObject)newTagConvertInfo).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, null, msgs);
-			msgs = basicSetTagConvertInfo(newTagConvertInfo, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, newTagConvertInfo, newTagConvertInfo));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTagDecorateInfos() {
-		if (tagDecorateInfos == null) {
-			tagDecorateInfos = new EObjectContainmentEList(TagDecorateInfo.class, this, DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS);
-		}
-		return tagDecorateInfos;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				return basicSetTagConvertInfo(null, msgs);
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				return ((InternalEList)getTagDecorateInfos()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				return getTagConvertInfo();
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				return getTagDecorateInfos();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				setTagConvertInfo((TagConvertInfo)newValue);
-				return;
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				getTagDecorateInfos().clear();
-				getTagDecorateInfos().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				setTagConvertInfo((TagConvertInfo)null);
-				return;
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				getTagDecorateInfos().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				return tagConvertInfo != null;
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				return tagDecorateInfos != null && !tagDecorateInfos.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //DTInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoPackageImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoPackageImpl.java
deleted file mode 100644
index 9fa791f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoPackageImpl.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoFactory;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class DTInfoPackageImpl extends EPackageImpl implements DTInfoPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass dtInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagConvertInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass operationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass parameterEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagDecorateInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass resolveAttributeValueEClass = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private DTInfoPackageImpl() {
-		super(eNS_URI, DTInfoFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-     * @return the package 
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static DTInfoPackage init() {
-		if (isInited) return (DTInfoPackage)EPackage.Registry.INSTANCE.getEPackage(DTInfoPackage.eNS_URI);
-
-		// Obtain or create and register package
-		DTInfoPackageImpl theDTInfoPackage = (DTInfoPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof DTInfoPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new DTInfoPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theDTInfoPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theDTInfoPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theDTInfoPackage.freeze();
-
-		return theDTInfoPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDTInfo() {
-		return dtInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDTInfo_TagConvertInfo() {
-		return (EReference)dtInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDTInfo_TagDecorateInfos() {
-		return (EReference)dtInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagConvertInfo() {
-		return tagConvertInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagConvertInfo_Operations() {
-		return (EReference)tagConvertInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOperation() {
-		return operationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOperation_Id() {
-		return (EAttribute)operationEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Parameters() {
-		return (EReference)operationEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Operations() {
-		return (EReference)operationEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getParameter() {
-		return parameterEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getParameter_Value() {
-		return (EAttribute)parameterEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagDecorateInfo() {
-		return tagDecorateInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_Id() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MinHeight() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MinWidth() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MultiLevel() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NeedBorderDecorator() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NeedTableDecorator() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NonVisual() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NonVisualImagePath() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_ResolveChildText() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagDecorateInfo_ResolveAttributeValue() {
-		return (EReference)tagDecorateInfoEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_SetNonVisualChildElements() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_Widget() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getResolveAttributeValue() {
-		return resolveAttributeValueEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResolveAttributeValue_AttributeName() {
-		return (EAttribute)resolveAttributeValueEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoFactory getDTInfoFactory() {
-		return (DTInfoFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		dtInfoEClass = createEClass(DT_INFO);
-		createEReference(dtInfoEClass, DT_INFO__TAG_CONVERT_INFO);
-		createEReference(dtInfoEClass, DT_INFO__TAG_DECORATE_INFOS);
-
-		tagConvertInfoEClass = createEClass(TAG_CONVERT_INFO);
-		createEReference(tagConvertInfoEClass, TAG_CONVERT_INFO__OPERATIONS);
-
-		operationEClass = createEClass(OPERATION);
-		createEAttribute(operationEClass, OPERATION__ID);
-		createEReference(operationEClass, OPERATION__PARAMETERS);
-		createEReference(operationEClass, OPERATION__OPERATIONS);
-
-		parameterEClass = createEClass(PARAMETER);
-		createEAttribute(parameterEClass, PARAMETER__VALUE);
-
-		tagDecorateInfoEClass = createEClass(TAG_DECORATE_INFO);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__ID);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MIN_HEIGHT);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MIN_WIDTH);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MULTI_LEVEL);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NEED_BORDER_DECORATOR);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NEED_TABLE_DECORATOR);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NON_VISUAL);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT);
-		createEReference(tagDecorateInfoEClass, TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__WIDGET);
-
-		resolveAttributeValueEClass = createEClass(RESOLVE_ATTRIBUTE_VALUE);
-		createEAttribute(resolveAttributeValueEClass, RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(dtInfoEClass, DTInfo.class, "DTInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getDTInfo_TagConvertInfo(), this.getTagConvertInfo(), null, "tagConvertInfo", null, 1, 1, DTInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getDTInfo_TagDecorateInfos(), this.getTagDecorateInfo(), null, "tagDecorateInfos", null, 0, -1, DTInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(tagConvertInfoEClass, TagConvertInfo.class, "TagConvertInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getTagConvertInfo_Operations(), this.getOperation(), null, "operations", null, 0, -1, TagConvertInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(operationEClass, Operation.class, "Operation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getOperation_Id(), ecorePackage.getEString(), "id", null, 1, 1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getOperation_Parameters(), this.getParameter(), null, "parameters", null, 0, -1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getOperation_Operations(), this.getOperation(), null, "operations", null, 0, -1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(parameterEClass, Parameter.class, "Parameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getParameter_Value(), ecorePackage.getEString(), "value", null, 1, 1, Parameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(tagDecorateInfoEClass, TagDecorateInfo.class, "TagDecorateInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_Id(), ecorePackage.getEString(), "id", null, 1, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_MinHeight(), ecorePackage.getEInt(), "minHeight", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_MinWidth(), ecorePackage.getEInt(), "minWidth", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_MultiLevel(), ecorePackage.getEBoolean(), "multiLevel", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getTagDecorateInfo_NeedBorderDecorator(), ecorePackage.getEBoolean(), "needBorderDecorator", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getTagDecorateInfo_NeedTableDecorator(), ecorePackage.getEBoolean(), "needTableDecorator", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getTagDecorateInfo_NonVisual(), ecorePackage.getEBoolean(), "nonVisual", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getTagDecorateInfo_NonVisualImagePath(), ecorePackage.getEString(), "nonVisualImagePath", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_ResolveChildText(), ecorePackage.getEBoolean(), "resolveChildText", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEReference(getTagDecorateInfo_ResolveAttributeValue(), this.getResolveAttributeValue(), null, "resolveAttributeValue", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getTagDecorateInfo_SetNonVisualChildElements(), ecorePackage.getEBoolean(), "setNonVisualChildElements", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-		initEAttribute(getTagDecorateInfo_Widget(), ecorePackage.getEBoolean(), "widget", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		initEClass(resolveAttributeValueEClass, ResolveAttributeValue.class, "ResolveAttributeValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getResolveAttributeValue_AttributeName(), ecorePackage.getEString(), "attributeName", null, 1, 1, ResolveAttributeValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		 //$NON-NLS-1$
-		addAnnotation
-		  (getDTInfo_TagConvertInfo(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "tag-convert-info" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getDTInfo_TagDecorateInfos(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "tag-decorate-info" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getTagConvertInfo_Operations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "operation" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getOperation_Parameters(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "parameter" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getOperation_Operations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "operation" //$NON-NLS-1$ //$NON-NLS-2$
-		   });		
-		addAnnotation
-		  (getTagDecorateInfo_ResolveAttributeValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "resolve-attribute-value" //$NON-NLS-1$ //$NON-NLS-2$
-		   });
-	}
-
-} //DTInfoPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java
deleted file mode 100644
index 0edf240..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Operation</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getParameters <em>Parameters</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OperationImpl extends EObjectImpl implements Operation {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getParameters() <em>Parameters</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParameters()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList parameters;
-
-	/**
-	 * The cached value of the '{@link #getOperations() <em>Operations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOperations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList operations;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OperationImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.OPERATION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.OPERATION__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getParameters() {
-		if (parameters == null) {
-			parameters = new EObjectContainmentEList(Parameter.class, this, DTInfoPackage.OPERATION__PARAMETERS);
-		}
-		return parameters;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOperations() {
-		if (operations == null) {
-			operations = new EObjectContainmentEList(Operation.class, this, DTInfoPackage.OPERATION__OPERATIONS);
-		}
-		return operations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return ((InternalEList)getParameters()).basicRemove(otherEnd, msgs);
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return ((InternalEList)getOperations()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				return getId();
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return getParameters();
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return getOperations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				setId((String)newValue);
-				return;
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				getParameters().clear();
-				getParameters().addAll((Collection)newValue);
-				return;
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				getOperations().clear();
-				getOperations().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				getParameters().clear();
-				return;
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				getOperations().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return parameters != null && !parameters.isEmpty();
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return operations != null && !operations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //OperationImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java
deleted file mode 100644
index 2d6d389..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Parameter</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ParameterImpl extends EObjectImpl implements Parameter {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ParameterImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.PARAMETER;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.PARAMETER__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (value: "); //$NON-NLS-1$
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ParameterImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java
deleted file mode 100644
index 6596a56..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resolve Attribute Value</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl#getAttributeName <em>Attribute Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResolveAttributeValueImpl extends EObjectImpl implements ResolveAttributeValue {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getAttributeName() <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ATTRIBUTE_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAttributeName() <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String attributeName = ATTRIBUTE_NAME_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResolveAttributeValueImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.RESOLVE_ATTRIBUTE_VALUE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAttributeName() {
-		return attributeName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeName(String newAttributeName) {
-		String oldAttributeName = attributeName;
-		attributeName = newAttributeName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME, oldAttributeName, attributeName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				return getAttributeName();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				setAttributeName((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				setAttributeName(ATTRIBUTE_NAME_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				return ATTRIBUTE_NAME_EDEFAULT == null ? attributeName != null : !ATTRIBUTE_NAME_EDEFAULT.equals(attributeName);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (attributeName: "); //$NON-NLS-1$
-		result.append(attributeName);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ResolveAttributeValueImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java
deleted file mode 100644
index c124dcb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Convert Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagConvertInfoImpl extends EObjectImpl implements TagConvertInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getOperations() <em>Operations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOperations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList operations;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagConvertInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.TAG_CONVERT_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOperations() {
-		if (operations == null) {
-			operations = new EObjectContainmentEList(Operation.class, this, DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS);
-		}
-		return operations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return ((InternalEList)getOperations()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return getOperations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				getOperations().clear();
-				getOperations().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				getOperations().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return operations != null && !operations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //TagConvertInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java
deleted file mode 100644
index 656759a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java
+++ /dev/null
@@ -1,791 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Decorate Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getMinHeight <em>Min Height</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getMinWidth <em>Min Width</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isMultiLevel <em>Multi Level</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNeedBorderDecorator <em>Need Border Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNeedTableDecorator <em>Need Table Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNonVisual <em>Non Visual</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getNonVisualImagePath <em>Non Visual Image Path</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isResolveChildText <em>Resolve Child Text</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getResolveAttributeValue <em>Resolve Attribute Value</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isWidget <em>Widget</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagDecorateInfoImpl extends EObjectImpl implements TagDecorateInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinHeight() <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int MIN_HEIGHT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getMinHeight() <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected int minHeight = MIN_HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinWidth() <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int MIN_WIDTH_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getMinWidth() <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected int minWidth = MIN_WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isMultiLevel() <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMultiLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MULTI_LEVEL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMultiLevel() <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMultiLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean multiLevel = MULTI_LEVEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNeedBorderDecorator() <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NEED_BORDER_DECORATOR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNeedBorderDecorator() <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean needBorderDecorator = NEED_BORDER_DECORATOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNeedTableDecorator() <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NEED_TABLE_DECORATOR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNeedTableDecorator() <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean needTableDecorator = NEED_TABLE_DECORATOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNonVisual() <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNonVisual()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NON_VISUAL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNonVisual() <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNonVisual()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean nonVisual = NON_VISUAL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getNonVisualImagePath() <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NON_VISUAL_IMAGE_PATH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNonVisualImagePath() <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected String nonVisualImagePath = NON_VISUAL_IMAGE_PATH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isResolveChildText() <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResolveChildText()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RESOLVE_CHILD_TEXT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isResolveChildText() <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResolveChildText()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean resolveChildText = RESOLVE_CHILD_TEXT_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getResolveAttributeValue() <em>Resolve Attribute Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected ResolveAttributeValue resolveAttributeValue;
-
-	/**
-	 * The default value of the '{@link #isSetNonVisualChildElements() <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isSetNonVisualChildElements() <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean setNonVisualChildElements = SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isWidget() <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isWidget()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean WIDGET_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isWidget() <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isWidget()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean widget = WIDGET_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagDecorateInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.TAG_DECORATE_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getMinHeight() {
-		return minHeight;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinHeight(int newMinHeight) {
-		int oldMinHeight = minHeight;
-		minHeight = newMinHeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT, oldMinHeight, minHeight));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getMinWidth() {
-		return minWidth;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinWidth(int newMinWidth) {
-		int oldMinWidth = minWidth;
-		minWidth = newMinWidth;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH, oldMinWidth, minWidth));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMultiLevel() {
-		return multiLevel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMultiLevel(boolean newMultiLevel) {
-		boolean oldMultiLevel = multiLevel;
-		multiLevel = newMultiLevel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL, oldMultiLevel, multiLevel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNeedBorderDecorator() {
-		return needBorderDecorator;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNeedBorderDecorator(boolean newNeedBorderDecorator) {
-		boolean oldNeedBorderDecorator = needBorderDecorator;
-		needBorderDecorator = newNeedBorderDecorator;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR, oldNeedBorderDecorator, needBorderDecorator));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNeedTableDecorator() {
-		return needTableDecorator;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNeedTableDecorator(boolean newNeedTableDecorator) {
-		boolean oldNeedTableDecorator = needTableDecorator;
-		needTableDecorator = newNeedTableDecorator;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR, oldNeedTableDecorator, needTableDecorator));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNonVisual() {
-		return nonVisual;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNonVisual(boolean newNonVisual) {
-		boolean oldNonVisual = nonVisual;
-		nonVisual = newNonVisual;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL, oldNonVisual, nonVisual));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNonVisualImagePath() {
-		return nonVisualImagePath;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNonVisualImagePath(String newNonVisualImagePath) {
-		String oldNonVisualImagePath = nonVisualImagePath;
-		nonVisualImagePath = newNonVisualImagePath;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH, oldNonVisualImagePath, nonVisualImagePath));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isResolveChildText() {
-		return resolveChildText;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResolveChildText(boolean newResolveChildText) {
-		boolean oldResolveChildText = resolveChildText;
-		resolveChildText = newResolveChildText;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT, oldResolveChildText, resolveChildText));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResolveAttributeValue getResolveAttributeValue() {
-		return resolveAttributeValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param newResolveAttributeValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetResolveAttributeValue(ResolveAttributeValue newResolveAttributeValue, NotificationChain msgs) {
-		ResolveAttributeValue oldResolveAttributeValue = resolveAttributeValue;
-		resolveAttributeValue = newResolveAttributeValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, oldResolveAttributeValue, newResolveAttributeValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResolveAttributeValue(ResolveAttributeValue newResolveAttributeValue) {
-		if (newResolveAttributeValue != resolveAttributeValue) {
-			NotificationChain msgs = null;
-			if (resolveAttributeValue != null)
-				msgs = ((InternalEObject)resolveAttributeValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, null, msgs);
-			if (newResolveAttributeValue != null)
-				msgs = ((InternalEObject)newResolveAttributeValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, null, msgs);
-			msgs = basicSetResolveAttributeValue(newResolveAttributeValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, newResolveAttributeValue, newResolveAttributeValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetNonVisualChildElements() {
-		return setNonVisualChildElements;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSetNonVisualChildElements(boolean newSetNonVisualChildElements) {
-		boolean oldSetNonVisualChildElements = setNonVisualChildElements;
-		setNonVisualChildElements = newSetNonVisualChildElements;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS, oldSetNonVisualChildElements, setNonVisualChildElements));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isWidget() {
-		return widget;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWidget(boolean newWidget) {
-		boolean oldWidget = widget;
-		widget = newWidget;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__WIDGET, oldWidget, widget));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return basicSetResolveAttributeValue(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				return getId();
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				return new Integer(getMinHeight());
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				return new Integer(getMinWidth());
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				return isMultiLevel() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				return isNeedBorderDecorator() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				return isNeedTableDecorator() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				return isNonVisual() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				return getNonVisualImagePath();
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				return isResolveChildText() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return getResolveAttributeValue();
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				return isSetNonVisualChildElements() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				return isWidget() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				setId((String)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				setMinHeight(((Integer)newValue).intValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				setMinWidth(((Integer)newValue).intValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				setMultiLevel(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				setNeedBorderDecorator(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				setNeedTableDecorator(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				setNonVisual(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				setNonVisualImagePath((String)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				setResolveChildText(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				setResolveAttributeValue((ResolveAttributeValue)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				setSetNonVisualChildElements(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				setWidget(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				setMinHeight(MIN_HEIGHT_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				setMinWidth(MIN_WIDTH_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				setMultiLevel(MULTI_LEVEL_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				setNeedBorderDecorator(NEED_BORDER_DECORATOR_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				setNeedTableDecorator(NEED_TABLE_DECORATOR_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				setNonVisual(NON_VISUAL_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				setNonVisualImagePath(NON_VISUAL_IMAGE_PATH_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				setResolveChildText(RESOLVE_CHILD_TEXT_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				setResolveAttributeValue((ResolveAttributeValue)null);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				setSetNonVisualChildElements(SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				setWidget(WIDGET_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				return minHeight != MIN_HEIGHT_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				return minWidth != MIN_WIDTH_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				return multiLevel != MULTI_LEVEL_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				return needBorderDecorator != NEED_BORDER_DECORATOR_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				return needTableDecorator != NEED_TABLE_DECORATOR_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				return nonVisual != NON_VISUAL_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				return NON_VISUAL_IMAGE_PATH_EDEFAULT == null ? nonVisualImagePath != null : !NON_VISUAL_IMAGE_PATH_EDEFAULT.equals(nonVisualImagePath);
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				return resolveChildText != RESOLVE_CHILD_TEXT_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return resolveAttributeValue != null;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				return setNonVisualChildElements != SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				return widget != WIDGET_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", minHeight: "); //$NON-NLS-1$
-		result.append(minHeight);
-		result.append(", minWidth: "); //$NON-NLS-1$
-		result.append(minWidth);
-		result.append(", multiLevel: "); //$NON-NLS-1$
-		result.append(multiLevel);
-		result.append(", needBorderDecorator: "); //$NON-NLS-1$
-		result.append(needBorderDecorator);
-		result.append(", needTableDecorator: "); //$NON-NLS-1$
-		result.append(needTableDecorator);
-		result.append(", nonVisual: "); //$NON-NLS-1$
-		result.append(nonVisual);
-		result.append(", nonVisualImagePath: "); //$NON-NLS-1$
-		result.append(nonVisualImagePath);
-		result.append(", resolveChildText: "); //$NON-NLS-1$
-		result.append(resolveChildText);
-		result.append(", setNonVisualChildElements: "); //$NON-NLS-1$
-		result.append(setNonVisualChildElements);
-		result.append(", widget: "); //$NON-NLS-1$
-		result.append(widget);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TagDecorateInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java
deleted file mode 100644
index 5bbf09b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public class DTInfoAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static DTInfoPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = DTInfoPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DTInfoSwitch modelSwitch =
-		new DTInfoSwitch() {
-			public Object caseDTInfo(DTInfo object) {
-				return createDTInfoAdapter();
-			}
-			public Object caseTagConvertInfo(TagConvertInfo object) {
-				return createTagConvertInfoAdapter();
-			}
-			public Object caseOperation(Operation object) {
-				return createOperationAdapter();
-			}
-			public Object caseParameter(Parameter object) {
-				return createParameterAdapter();
-			}
-			public Object caseTagDecorateInfo(TagDecorateInfo object) {
-				return createTagDecorateInfoAdapter();
-			}
-			public Object caseResolveAttributeValue(ResolveAttributeValue object) {
-				return createResolveAttributeValueAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo <em>DT Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo
-	 * @generated
-	 */
-	public Adapter createDTInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo
-	 * @generated
-	 */
-	public Adapter createTagConvertInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation <em>Operation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation
-	 * @generated
-	 */
-	public Adapter createOperationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter <em>Parameter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter
-	 * @generated
-	 */
-	public Adapter createParameterAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo <em>Tag Decorate Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo
-	 * @generated
-	 */
-	public Adapter createTagDecorateInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue
-	 * @generated
-	 */
-	public Adapter createResolveAttributeValueAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //DTInfoAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java
deleted file mode 100644
index 82f4764..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public class DTInfoSwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static DTInfoPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoSwitch() {
-		if (modelPackage == null) {
-			modelPackage = DTInfoPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List eSuperTypes = theEClass.getESuperTypes();
-        return
-        	eSuperTypes.isEmpty() ?
-        		defaultCase(theEObject) :
-        		doSwitch((EClass)eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case DTInfoPackage.DT_INFO: {
-				DTInfo dtInfo = (DTInfo)theEObject;
-				Object result = caseDTInfo(dtInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.TAG_CONVERT_INFO: {
-				TagConvertInfo tagConvertInfo = (TagConvertInfo)theEObject;
-				Object result = caseTagConvertInfo(tagConvertInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.OPERATION: {
-				Operation operation = (Operation)theEObject;
-				Object result = caseOperation(operation);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.PARAMETER: {
-				Parameter parameter = (Parameter)theEObject;
-				Object result = caseParameter(parameter);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.TAG_DECORATE_INFO: {
-				TagDecorateInfo tagDecorateInfo = (TagDecorateInfo)theEObject;
-				Object result = caseTagDecorateInfo(tagDecorateInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE: {
-				ResolveAttributeValue resolveAttributeValue = (ResolveAttributeValue)theEObject;
-				Object result = caseResolveAttributeValue(resolveAttributeValue);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>DT Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>DT Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDTInfo(DTInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tag Convert Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Tag Convert Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagConvertInfo(TagConvertInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Operation</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Operation</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOperation(Operation object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Parameter</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Parameter</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseParameter(Parameter object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tag Decorate Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Tag Decorate Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagDecorateInfo(TagDecorateInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Resolve Attribute Value</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Resolve Attribute Value</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseResolveAttributeValue(ResolveAttributeValue object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //DTInfoSwitch
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/package-info.java
deleted file mode 100644
index 3f0ea23..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Tag conversion model. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/package-info.java
deleted file mode 100644
index 8f5fa02..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Tag conversion design time manager.  
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTResourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTResourceProvider.java
deleted file mode 100644
index fbcc62f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTResourceProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-/**
- * Abstract implementation of IDTResourceProvider that is intended for client
- * extension.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractDTResourceProvider implements IDTResourceProvider {
-
-	/**
-	 * The ID of this provider.
-	 */
-	protected String id;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param id The ID of this provider.
-	 */
-	public AbstractDTResourceProvider(String id) {
-		setId(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider#getId()
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * Sets the ID of this provider.
-	 * 
-	 * @param id The ID of this provider.
-	 */
-	public void setId(String id) {
-		this.id = id;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTSkin.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTSkin.java
deleted file mode 100644
index d018836..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/AbstractDTSkin.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-/**
- * Abstract implementation of IDTSkin that is intended for client extension.
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractDTSkin implements IDTSkin {
-
-	/**
-	 * The human-readable name of the skin.
-	 */
-	protected String name;
-
-	/**
-	 * true if this instance is considered the default for its provider.
-	 */
-	protected boolean isDefault;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 */
-	public AbstractDTSkin(String name) {
-		this(name, false);
-	}
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 * @param isDefault true if this instance is considered the default for its
-	 * provider.
-	 */
-	public AbstractDTSkin(String name, boolean isDefault) {
-		setName(name);
-		setDefault(isDefault);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin#getName()
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Sets the human-readable name of the skin.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 */
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin#isDefault()
-	 */
-	public boolean isDefault() {
-		return isDefault;
-	}
-
-	/**
-	 * Sets if this instance is considered the default for its provider.
-	 * 
-	 * @param isDefault	true if this instance is considered the default for its
-	 * provider.
-	 */
-	public void setDefault(boolean isDefault) {
-		this.isDefault = isDefault;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTResourceProviderFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTResourceProviderFactory.java
deleted file mode 100644
index c4652a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTResourceProviderFactory.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsp.core.taglib.ITaglibDescriptor;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.osgi.framework.Bundle;
-
-/**
- * Factory responsible for producing {@link IDTResourceProvider} instances from
- * <code>org.eclipse.jst.pagedesigner.pageDesignerExtension.dtResourceProvider</code>
- * extensions. 
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTResourceProviderFactory {
-
-	private static DTResourceProviderFactory instance;
-	private ProviderClassMap providerClassMap;
-	private Map<IProject, List<IDTResourceProvider>> providerMap;
-	private Logger log = PDPlugin.getLogger(DTResourceProviderFactory.class);
-
-	private DTResourceProviderFactory() {
-		//singleton - no external instantiation
-		providerClassMap = new ProviderClassMap();
-		loadExtensions();
-		providerMap = new HashMap<IProject, List<IDTResourceProvider>>();
-	}
-
-	/**
-	 * Gets the singleton instance.
-	 * 
-	 * @return The singleton instance.
-	 */
-	public static synchronized DTResourceProviderFactory getInstance() {
-		if (instance == null) {
-			instance = new DTResourceProviderFactory();
-		}
-		return instance;
-	}
-
-	/**
-	 * Returns a List of IDTResourceProvider instances that are active for the
-	 * specified IProject instance.
-	 * 
-	 * @param project IProject instance for which to get the active
-	 * IDTResourceProvider instances.
-	 * @return A List of IDTResourceProvider instances that are active for the
-	 * specified IProject instance. List may be empty, but will not be null.
-	 */
-	public List<IDTResourceProvider> getActiveDTResourceProviders(IProject project) {
-		List<IDTResourceProvider> activeProviders = new ArrayList<IDTResourceProvider>();
-		if (project != null) {
-			ITaglibRecord[] taglibRecords = TaglibIndex.getAvailableTaglibRecords(project.getFullPath());
-			if (taglibRecords != null && taglibRecords.length > 0) {
-				for (ITaglibRecord taglibRecord: taglibRecords) {
-					ITaglibDescriptor taglibDescriptor = taglibRecord.getDescriptor();
-					if (taglibDescriptor != null) {
-						String taglibURI = taglibDescriptor.getURI();
-						if (taglibURI != null) {
-							activeProviders.addAll(getDTResourceProviders(project, taglibURI));
-						}
-					}
-				}
-			}
-		}
-		return Collections.unmodifiableList(activeProviders);
-	}
-
-	/**
-	 * Convenience method to determine IProject instance from the specified
-	 * IDOMNode instance and then call {@link #getActiveDTResourceProviders(IProject)}.
-	 * 
-	 * @param domNode IDOMNode instance from which to determine IProject
-	 * instance.
-	 * @return A List of IDTResourceProvider instances that are active for the
-	 * specified IDOMNode instance's IProject instance. List may be empty, but
-	 * will not be null.
-	 */
-	public List<IDTResourceProvider> getActiveDTResourceProviders(IDOMNode domNode) {
-		IDOMModel domModel = domNode.getModel();
-		IProject project = null;
-		if (domModel != null) {
-			project = StructuredModelUtil.getProjectFor(domModel);
-		}
-		return getActiveDTResourceProviders(project);
-	}
-
-	/**
-	 * Returns a List of IDTResourceProvider instances for the specified
-	 * IProject instance and id.
-	 * 
-	 * @param project IProject instance for which a List of IDTResourceProviders
-	 * is being requested.
-	 * @param id Identifier for which a List of IDTResourceProvider instances is
-	 * being requested.
-	 * @return A List of IDTResourceProvider instances for the specified
-	 * IProject instance and id. List may be empty, but will not be null.
-	 */
-	public synchronized List<IDTResourceProvider> getDTResourceProviders(IProject project, String id) {
-		List<IDTResourceProvider> providers = new ArrayList<IDTResourceProvider>();
-		List<IDTResourceProvider> projectProviders = providerMap.get(project);
-		if (projectProviders == null) {
-			projectProviders = providerClassMap.createInstances();
-			providerMap.put(project, projectProviders);
-		}
-		for (IDTResourceProvider curProvider: projectProviders) {
-			if (curProvider.getId().equals(id)) {
-				providers.add(curProvider);
-			}
-		}
-		return providers;
-	}
-
-	private void loadExtensions() {
-		try {
-			final IExtensionPoint extPoint = Platform.getExtensionRegistry().getExtensionPoint(PDPlugin.getPluginId(), IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-			final IExtension[] extensions = extPoint.getExtensions();
-			for (int i = 0; i < extensions.length; i++) {
-				final IExtension extension = extensions[i];
-				final IConfigurationElement[] confElements = extension.getConfigurationElements();
-				for (int j = 0; j < confElements.length; j++) {
-					final IConfigurationElement confElement = confElements[j];
-					if (confElement.getName().equals(IJMTConstants.DT_RESOURCE_PROVIDER)) {
-						final String id = confElement.getAttribute("id"); //$NON-NLS-1$
-						final String providerClassName = confElement.getAttribute("class"); //$NON-NLS-1$
-						final Bundle bundle = Platform.getBundle(confElement.getContributor().getName());
-						if (bundle != null) {
-							try {
-								providerClassMap.add(id, bundle.loadClass(providerClassName));
-							} catch(ClassNotFoundException cnfe) {
-								log.error("Warning.DTResourceProviderFactory.ClassNotFound", providerClassName, id, cnfe); //$NON-NLS-1$
-							}
-						}
-					}
-				}
-			}
-		} catch(InvalidRegistryObjectException iroe) {
-			log.error("Warning.DTResourceProviderFactory.RegistryError", PDPlugin.getPluginId() + IJMTConstants.EXTENSION_POINT_PAGEDESIGNER + "." + IJMTConstants.DT_RESOURCE_PROVIDER, iroe); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTSkinManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTSkinManager.java
deleted file mode 100644
index 1055ced..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DTSkinManager.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * Manages IDTSkin instances and provides skin-related services.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTSkinManager {
-
-	private static Map<IProject, DTSkinManager> dtSkinManagerMap =
-		new HashMap<IProject, DTSkinManager>();
-
-	private Map<String, IDTSkin> currentDTSkinMap;
-
-	private IProject project;
-
-	/**
-	 * Constructs an instance (no public instantiation).
-	 * 
-	 * @param project IProject instance for which this instance applies.
-	 */
-	private DTSkinManager(IProject project) {
-		this.project = project;
-		currentDTSkinMap = new HashMap<String, IDTSkin>();
-	}
-
-	/**
-	 * Gets a DTSkinManager instance for the specified project instance.
-	 * 
-	 * @param aProject IProject instance for which a DTSkinManager is being
-	 * requested.
-	 * @return A DTSkinManager instance for the specified project instance.
-	 */
-	public static synchronized DTSkinManager getInstance(IProject aProject) {
-		DTSkinManager dtSkinManager = dtSkinManagerMap.get(aProject);
-		if (dtSkinManager == null) {
-			dtSkinManager = new DTSkinManager(aProject);
-			dtSkinManagerMap.put(aProject, dtSkinManager);
-		}
-		return dtSkinManager;
-	}
-
-	/**
-	 * Gets a DTSkinManager instance for the IProject instance associated with
-	 * the specified IDOMNode instance.
-	 * 
-	 * @param domNode IDOMNode instance for which a DTSkinManager is being
-	 * requested.
-	 * @return A DTSkinManager instance for the IProject instance associated
-	 * with the specified IDOMNode instance.
-	 */
-	public static DTSkinManager getInstance(IDOMNode domNode) {
-		IDOMModel domModel = domNode.getModel();
-		IProject aProject = null;
-		if (domModel != null) {
-			aProject = StructuredModelUtil.getProjectFor(domModel);
-		}
-		return getInstance(aProject);
-	}
-
-	/**
-	 * Returns a List of available IDTSkin instances.
-	 * 
-	 * @param id ID for which to get skins.
-	 * @return A List of available IDTSkin instances. List may be empty, but
-	 * will not be null.
-	 */
-	public List<IDTSkin> getSkins(String id) {
-		List<IDTSkin> dtSkins = new ArrayList<IDTSkin>();
-		List<IDTResourceProvider> dtResourceProviders =
-			DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project);
-		for (IDTResourceProvider dtResourceProvider: dtResourceProviders) {
-			if (dtResourceProvider.getId().equals(id)) {
-				dtSkins.addAll(dtResourceProvider.getSkins());
-			}
-		}
-		return dtSkins;
-	}
-
-	/**
-	 * Returns the current IDTSkin instance for the specified ID.
-	 * 
-	 * @param id The ID (typically nsURI) for which the current IDTSkin instance
-	 * is being requested.
-	 * @return The current IDTSkin instance for the specified ID. May return
-	 * null if there is no current IDTSkin instance for the specified ID.
-	 */
-	public IDTSkin getCurrentSkin(String id) {
-		IDTSkin dtSkin = currentDTSkinMap.get(id);
-		if (dtSkin == null) {
-			dtSkin = getDefaultSkin(id);
-			setCurrentSkin(id, dtSkin);
-		}
-		return dtSkin;
-	}
-
-	/**
-	 * Sets the current IDTSkin instance for the specified ID.
-	 * 
-	 * @param id The ID (typically nsURI) for which the current IDTSkin instance
-	 * is being set.
-	 * @param dtSkin The current IDTSkin instance to be set for the specified ID.
-	 */
-	public void setCurrentSkin(String id, IDTSkin dtSkin) {
-		if (id != null) {
-			IDTSkin existingDTSkin = currentDTSkinMap.get(id);
-			if (existingDTSkin != null) {
-				existingDTSkin.releaseResources();
-			}
-			if (dtSkin != null) {
-				currentDTSkinMap.put(id, dtSkin);
-			} else {
-				currentDTSkinMap.remove(id);
-			}
-		}
-	}
-
-	/**
-	 * Returns a List of all current DTSkin instances (one per id).
-	 * 
-	 * @return A List of all current DTSkin instances (one per id).
-	 */
-	public List<IDTSkin> getCurrentSkins() {
-		List<IDTSkin> currentDTSkins = new ArrayList<IDTSkin>(); 
-		List <IDTResourceProvider> dtResourceProviders =
-			DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project);
-		for (IDTResourceProvider dtResourceProvider: dtResourceProviders) {
-			IDTSkin dtSkin = getCurrentSkin(dtResourceProvider.getId());
-			if (dtSkin != null && !currentDTSkins.contains(dtSkin)) {
-				currentDTSkins.add(dtSkin);
-			}
-		}
-		return Collections.unmodifiableList(currentDTSkins);
-	}
-
-	/**
-	 * Returns the default IDTSkin instance for the specified ID.
-	 * 
-	 * @param id The ID (typically nsURI) for which the default IDTSkin instance
-	 * is being requested.
-	 * @return The default IDTSkin instance for the specified ID. May return
-	 * null if there is no default IDTSkin instance for the specified ID.
-	 */
-	public IDTSkin getDefaultSkin(String id) {
-		IDTSkin firstDTSkin = null;
-		IDTSkin defaultDTSkin = null;
-		for (IDTSkin dtSkin: getSkins(id)) {
-			if (firstDTSkin == null) {
-				firstDTSkin = dtSkin;
-			}
-			if (dtSkin.isDefault()) {
-				defaultDTSkin = dtSkin;
-				break;
-			}
-		}
-		if (defaultDTSkin == null) {
-			defaultDTSkin = firstDTSkin;
-		}
-		return defaultDTSkin;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTResourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTResourceProvider.java
deleted file mode 100644
index db5ad29..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTResourceProvider.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Concrete implementation of IDTResourceProvider.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTResourceProvider extends AbstractDTResourceProvider {
-
-	/**
-	 * List of IDTSkin instances.
-	 */
-	protected List<IDTSkin> skins;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param id The ID of this provider.
-	 */
-	public DefaultDTResourceProvider(String id) {
-		super(id);
-		skins = new ArrayList<IDTSkin>();
-	}
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param id The ID of this provider.
-	 * @param skins The List of IDTSkin instances.
-	 */
-	public DefaultDTResourceProvider(String id, List<IDTSkin> skins) {
-		super(id);
-		if (skins != null) {
-			this.skins = skins;
-		} else {
-			this.skins = new ArrayList<IDTSkin>();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider#getSkins()
-	 */
-	public List<IDTSkin> getSkins() {
-		return Collections.unmodifiableList(skins);
-	}
-
-	/**
-	 * Adds the specified IDTSkin instance to the List of IDTSkin instances.
-	 * 
-	 * @param skin IDTSkin instance to be added.
-	 * @return true (as per the general contract of the Collection.add method).
-	 */
-	public boolean addSkin(IDTSkin skin) {
-		boolean ret = false;
-		if (skin != null) {
-			ret = skins.add(skin);
-		}
-		return ret;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTSkin.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTSkin.java
deleted file mode 100644
index cea5e92..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/DefaultDTSkin.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.w3c.dom.stylesheets.StyleSheet;
-
-/**
- * Concrete implementation of AbstractDTSkin.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTSkin extends AbstractDTSkin {
-
-	private List<URL> styleSheetURLs;
-	private List<StyleSheet> styleSheets;
-	private List<IStructuredModel> models;
-	private Logger log = PDPlugin.getLogger(DefaultDTSkin.class);
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 */
-	public DefaultDTSkin(String name) {
-		super(name);
-	}
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 * @param isDefault true if this instance is considered the default for its
-	 * provider.
-	 */
-	public DefaultDTSkin(String name, boolean isDefault) {
-		super(name, isDefault);
-	}
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param name The human-readable name of the skin.
-	 * @param styleSheetURLs The List of URL instances that provide an absolute
-	 * reference to the stylesheets.
-	 */
-	public DefaultDTSkin(String name, List<URL> styleSheetURLs) {
-		this(name);
-		this.styleSheetURLs = styleSheetURLs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin#getStyleSheets()
-	 */
-	public List<StyleSheet> getStyleSheets() {
-		if (styleSheets == null) {
-			styleSheets = new ArrayList<StyleSheet>();
-			if (styleSheetURLs != null) {
-				for (URL currentURL: styleSheetURLs) {
-					InputStream in = null;
-					try {
-						in = currentURL.openStream();
-						if (in != null) {
-							IStructuredModel model = StructuredModelManager.getModelManager().getModelForRead(currentURL.toExternalForm(), in, null);
-							if (model instanceof ICSSModel) {
-								styleSheets.add((StyleSheet)((ICSSModel)model).getDocument());
-								if (models == null) {
-									models = new ArrayList<IStructuredModel>();
-								}
-								models.add(model);
-							} else {
-								model.releaseFromRead();
-							}
-						}
-					} catch(IOException ioe) {
-						log.error("Warning.DefaultDTSkin.FailureLoadingStyleSheet", name, currentURL.toExternalForm(), ioe); //$NON-NLS-1$
-					} finally {
-						ResourceUtils.ensureClosed(in);
-					}
-				}
-			}
-		}
-		return Collections.unmodifiableList(styleSheets);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin#getStyleSheetLocations()
-	 */
-	public List<String> getStyleSheetLocations() {
-		List<String> locations = new ArrayList<String>();
-		if (styleSheetURLs != null) {
-			for (URL currentURL: styleSheetURLs) {
-				URL fileURL;
-				try {
-					fileURL = FileLocator.toFileURL(currentURL);
-				} catch(IOException ioe) {
-					//attempt to convert to a file protocol URI failed, revert to original form
-					fileURL = currentURL;
-				}
-				locations.add(fileURL.toExternalForm());
-			}
-		}
-		return Collections.unmodifiableList(locations);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin#releaseResources()
-	 */
-	public void releaseResources() {
-		if (models != null) {
-			for (IStructuredModel model: models) {
-				model.releaseFromRead();
-			}
-			models = null;
-		}
-		styleSheets = null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTResourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTResourceProvider.java
deleted file mode 100644
index acc15be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTResourceProvider.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.List;
-
-/**
- * Defines the interface for a Design-Time (DT) "Resource Provider", which
- * offers such services as might be expected to be provided at runtime by, for
- * example, a resource servlet.
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTResourceProvider {
-
-	/**
-	 * Returns this instance's ID.
-	 * 
-	 * @return This instance's ID.
-	 */
-	public String getId();
-
-	/**
-	 * Returns a List of IDTSkin instances.
-	 * 
-	 * @return A List of IDTSkin instances. May return an empty List, but should
-	 * not return null.
-	 */
-	public List<IDTSkin> getSkins();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTSkin.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTSkin.java
deleted file mode 100644
index 01154f0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/IDTSkin.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.List;
-
-import org.w3c.dom.stylesheets.StyleSheet;
-
-/**
- * Interface that a design-time (DT) "skin" must implement.
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTSkin {
-
-	/**
-	 * Returns the human-readable name of the skin.
-	 * 
-	 * @return The human-readable name of the skin.
-	 */
-	public String getName();
-
-	/**
-	 * Returns a List of StyleSheet instances.
-	 * 
-	 * @return A List of StyleSheet instances. May return an empty List, but
-	 * should not return null.
-	 */
-	public List<StyleSheet> getStyleSheets();
-
-	/**
-	 * Returns a List of Strings representing locations (typically URIs) of
-	 * stylesheets.
-	 * 
-	 * @return List of Strings representing locations (typically URIs) of
-	 * stylesheets. May return an empty List, but should not return null.
-	 */
-	public List<String> getStyleSheetLocations();
-
-	/**
-	 * This will be called before an instance goes out of scope, allowing it to
-	 * clean up any necessary resources. The instance should still be usable,
-	 * recreating any released resources as necessary on subsequent calls to its
-	 * methods.
-	 */
-	public void releaseResources();
-
-	/**
-	 * Returns true if this skin is considered the default for its provider.
-	 * 
-	 * @return true if this skin is considered the default for its provider,
-	 * else false.
-	 */
-	public boolean isDefault();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/ProviderClassMap.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/ProviderClassMap.java
deleted file mode 100644
index a9feaa4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtresourceprovider/ProviderClassMap.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtresourceprovider;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * Used to Map a String ID to a List of Classes and provide convenient access.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ProviderClassMap {
-
-	private Map<String, List<Class>> idToClassListMap;
-	private Logger log = PDPlugin.getLogger(ProviderClassMap.class);
-
-	/**
-	 * Creates an instance.
-	 */
-	public ProviderClassMap() {
-		idToClassListMap = new HashMap<String, List<Class>>();
-	}
-
-	/**
-	 * Gets the List of Classes associated with the specified ID.
-	 * 
-	 * @param id ID for which to get the List.
-	 * @return The List of Classes associated with the specified ID. List may be
-	 * empty but will not be null.
-	 */
-	public List<Class> get(String id) {
-		List<Class> classList = idToClassListMap.get(id);
-		if (classList == null) {
-			classList = new ArrayList<Class>();
-			idToClassListMap.put(id, classList);
-		}
-		return classList;
-	}
-
-	/**
-	 * Adds the specified Class to the List associated with the specified ID.
-	 * 
-	 * @param id ID for which to associate the specified Class.
-	 * @param clazz Class to add to the List associated with the specified ID.
-	 * @return true (as per the general contract of the Collection.add method). 
-	 */
-	public boolean add(String id, Class clazz) {
-		List<Class> classList = get(id);
-		return classList.add(clazz);
-	}
-
-	/**
-	 * Instantiates all classes associated with the specified ID and returns a
-	 * List of IDTResourceProvider instances.
-	 * 
-	 * @param id ID for which to instantiate all Classes.
-	 * @return a List of IDTResourceProvider instances associated with the
-	 * specified ID. List may be empty but will not be null.
-	 */
-	public List<IDTResourceProvider> createInstances(String id) {
-		List<IDTResourceProvider> providers = new ArrayList<IDTResourceProvider>();
-		List<Class> classList = get(id);
-		for (Class providerClass: classList) {
-			try {
-				Object objProvider = providerClass.newInstance();
-				if (objProvider instanceof IDTResourceProvider) {
-					providers.add((IDTResourceProvider)objProvider);
-				} else {
-					log.error("Warning.ProviderClassMap.NotIDTResourceProvider", providerClass.getName()); //$NON-NLS-1$
-				}
-			} catch(IllegalAccessException iae) {
-				log.error("Warning.ProviderClassMap.IllegalAccess", providerClass.getName(), id, iae); //$NON-NLS-1$
-			} catch(InstantiationException ie) {
-				log.error("Warning.ProviderClassMap.Instantiation", providerClass.getName(), id, ie); //$NON-NLS-1$
-			}
-		}
-		return providers;
-	}
-
-	/**
-	 * Instantiates all registered IDTResourceProviders and returns as a List.
-	 * 
-	 * @return List of all registered IDTResourceProviders. List may be empty
-	 * but will not be null.
-	 */
-	public List<IDTResourceProvider> createInstances() {
-		List<IDTResourceProvider> providers = new ArrayList<IDTResourceProvider>();
-		Set<String> idSet = idToClassListMap.keySet();
-		for (String curId: idSet) {
-			List<IDTResourceProvider> providersForCurId = createInstances(curId);
-			providers.addAll(providersForCurId);
-		}
-		return providers;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/AbstractPropertySheetPageFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/AbstractPropertySheetPageFactory.java
deleted file mode 100644
index 849acb5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/AbstractPropertySheetPageFactory.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * Abstract class that should be extended to provide a property sheet page
- * factory.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractPropertySheetPageFactory implements
-        IPropertySheetPageFactory
-{
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.editors.IPropertySheetPageFactory#createPage(org.eclipse.core.resources.IFile)
-     */
-    public abstract IPropertySheetPage createPage(IFile file);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java
deleted file mode 100644
index 6596d8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceDropTargetListener;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * @author mengbo
- */
-public class DesignerStructuredTextEditorJSP extends StructuredTextEditor
-{
-    private ITextEditorDropTargetListener _dropTargetListener;
-    private DropTarget _dropTarget;
-
-    @Override
-    protected void initializeDrop(final ITextViewer viewer)
-    {
-        int operations = DND.DROP_COPY | DND.DROP_MOVE;
-        _dropTarget = new DropTarget(viewer.getTextWidget(), operations);
-        _dropTargetListener = 
-            new DesignerSourceDropTargetListener(this);
-        _dropTarget.setTransfer(_dropTargetListener.getTransfers());
-        _dropTarget.addDropListener(_dropTargetListener);
-    }
-
-    @Override
-    public IAction getAction(final String actionID)
-    {
-        try
-        {
-            return super.getAction(actionID);
-        } catch (final Exception e)
-        {
-            return null;
-        }
-    }
-
-    @Override
-    public Object getAdapter(final Class required)
-    {
-        if (ITextEditorDropTargetListener.class.equals(required))
-        {
-            final DesignerSourceDropTargetListener listener = new DesignerSourceDropTargetListener(
-                    this);
-            return listener;
-        }
-        return super.getAdapter(required);
-    }
-
-    @Override
-    public void dispose()
-    {
-        if (_dropTargetListener != null)
-        {
-            _dropTargetListener = null;
-        }
-        if (_dropTarget != null)
-        {
-            _dropTarget.dispose();
-            _dropTarget = null;
-        }
-        
-        super.dispose();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
deleted file mode 100644
index 2763d4b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
+++ /dev/null
@@ -1,1156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import java.io.File;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.ui.views.palette.PalettePage;
-import org.eclipse.gef.ui.views.palette.PaletteViewerPage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceMouseTrackAdapter;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.preview.PreviewHandlerNew;
-import org.eclipse.jst.pagedesigner.preview.WindowsIEBrowser;
-import org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage;
-import org.eclipse.jst.pagedesigner.tools.RangeSelectionTool;
-import org.eclipse.jst.pagedesigner.ui.common.PartActivationHandler;
-import org.eclipse.jst.pagedesigner.ui.common.sash.SashEditorPart;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.jst.pagedesigner.utils.EditorUtil;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.MultiPageEditorSite;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.ui.internal.provisional.IDOMSourceEditingTextTools;
-import org.w3c.dom.Document;
-
-/**
- * The HTMLEditor is a multi paged editor. It will use the StructuredTextEditor
- * as the chief editor, and delegate most operations to it.
- * 
- * @author mengbo
- */
-public final class HTMLEditor extends MultiPageEditorPart implements
-		IPropertyListener, ITabbedPropertySheetPageContributor {
-	// private static final String PAGE_NAME_DESIGN = "Design"; //$NON-NLS-1$
-	// private static final String PAGE_NAME_SOURCE = "Source"; //$NON-NLS-1$
-	/**
-	 * Tabbed property contributor id for WPE
-	 */
-	public final static String TABBED_PROPERTIES_CONTRIBUTOR_ID = "org.eclipse.jst.pagedesigner.tabPropertyContributor"; //$NON-NLS-1$
-
-	// four different modes for the designer when displayed in a sash editor.
-	/**
-	 * editor split is vertical
-	 */
-	public static final int MODE_SASH_VERTICAL = 0;
-
-	/**
-	 * editor split is horizontal
-	 */
-	public static final int MODE_SASH_HORIZONTAL = 1;
-
-	/**
-	 * no split, only designer canvas
-	 */
-	public static final int MODE_DESIGNER = 2;
-
-	/**
-	 * no split, only SSE source
-	 */
-	public static final int MODE_SOURCE = 3;
-
-	private Logger _log = PDPlugin.getLogger(HTMLEditor.class);
-
-	private boolean _sash = true;
-
-	private int _mode = 0;
-
-	private SashEditorPart _sashEditorPart = null;
-
-	private int _previewPageIndex;
-
-	/** The design viewer */
-	private SimpleGraphicalEditor _designViewer;
-
-	/** The text editor. */
-	private StructuredTextEditor _textEditor;
-
-	private PartActivationHandler _partListener;
-
-	private PaletteViewerPage _paletteViewerPage;
-
-	private DefaultEditDomain _editDomain;
-
-	private WindowsIEBrowser _browser;
-	
-	private Composite _previewComposite;
-
-	private List PREVIEW_FILES_LIST = new ArrayList();
-
-	private IPropertySheetPage _tabbedPropSheet;
-
-	private ISelectionChangedListener _selChangedListener;
-
-    // TODO:This class is never used locally
-//	private class TextInputListener implements ITextInputListener {
-//		public void inputDocumentAboutToBeChanged(IDocument oldInput,
-//				IDocument newInput) {
-//            // do nothing
-//		}
-//
-//		public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
-//			if (_designViewer != null && newInput != null)
-//				_designViewer.setModel(getModel());
-//		}
-//	}
-
-	/**
-	 * Default constructor
-	 */
-	public HTMLEditor() {
-		super();
-	}
-
-	/*
-	 * This method is just to make firePropertyChanged accessbible from some
-	 * (anonomous) inner classes.
-	 */
-	private void _firePropertyChange(int property) {
-		super.firePropertyChange(property);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ITabbedPropertySheetPageContributor#getContributorId()
-	 */
-	public String getContributorId() {
-		return TABBED_PROPERTIES_CONTRIBUTOR_ID;
-	}
-
-	private void connectSashPage() {
-		ISelectionProvider selectionProvider = _sashEditorPart.getSite()
-				.getSelectionProvider();
-		if (selectionProvider instanceof IPostSelectionProvider) {
-			((IPostSelectionProvider) selectionProvider)
-					.addPostSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-		} else {
-			selectionProvider
-					.addSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-		}
-	}
-	
-	private void disconnectSashPage() {
-		//attempted fix for bug 283569... was not able to repro, but should protect against NPE
-		if (_sashEditorPart != null 
-				&& _sashEditorPart.getSite() != null 
-				&& _sashEditorPart.getSite().getSelectionProvider() != null
-				&& _selChangedListener != null) {
-			
-			final ISelectionProvider selectionProvider = _sashEditorPart.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null) {
-				if (selectionProvider instanceof IPostSelectionProvider) {
-					((IPostSelectionProvider) selectionProvider)
-							.removePostSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-				} else {
-					selectionProvider
-							.removeSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-				}
-			}
-		}		
-	}
-
-	private ISelectionChangedListener getSelectionChangedListener(ISelectionProvider selectionProvider) {
-		if (_selChangedListener  == null) {
-			if (selectionProvider instanceof IPostSelectionProvider) {
-				_selChangedListener =  new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-						((MultiPageSelectionProvider) getSite()
-								.getSelectionProvider())
-								.firePostSelectionChanged(event);
-					}
-				};
-			}
-			else {
-				_selChangedListener =  new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-							((MultiPageSelectionProvider) getSite()
-									.getSelectionProvider())
-									.firePostSelectionChanged(event);
-						}
-					};
-			}
-		}
-		return _selChangedListener;
-	}
-
-	/**
-	 * Creates the source page of the multi-page editor.
-	 * @throws PartInitException 
-	 */
-	protected void sash_createAndAddDesignSourcePage() throws PartInitException {
-		// create source page
-		_textEditor = createTextEditor();
-		_textEditor.setEditorPart(this);
-		_textEditor.addPropertyListener(this);
-		// create design page
-		_designViewer = new SimpleGraphicalEditor(this, getEditDomain());
-
-		// create SashEditor
-		_sashEditorPart = new SashEditorPart() {
-			protected void createPages() throws PartInitException {
-				addPage(_designViewer, getEditorInput());
-				addPage(_textEditor, getEditorInput());
-			}
-		};
-		int sashIndex = addPage(_sashEditorPart, getEditorInput());
-
-		// Set the sash editor mode from the stored file property
-		// or the default preference
-		initDesignerMode();
-
-		setPageText(sashIndex, PDPlugin.getResourceString("HTMLEditor.Design")); //$NON-NLS-1$
-
-		// the update's critical, to get viewer selection manager and
-		// highlighting to work
-		_textEditor.update();
-
-		firePropertyChange(PROP_TITLE);
-
-		// Changes to the Text Viewer's document instance should also force an
-		// input refresh
-		// _textEditor.getTextViewer().addTextInputListener(new
-		// TextInputListener());
-		connectSashPage();
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#createSite(org.eclipse.ui.IEditorPart)
-	 */
-	protected IEditorSite createSite(IEditorPart editor) {
-		return new MultiPageEditorSite(this, editor);
-	}
-
-	private void tabbed_createAndAddDesignSourcePage()
-			throws PartInitException {
-		// create source page
-		_textEditor = createTextEditor();
-		_textEditor.setEditorPart(this);
-		_textEditor.addPropertyListener(this);
-
-		// create design page
-		SimpleGraphicalEditor editor = new SimpleGraphicalEditor(this,
-				getEditDomain());
-
-		// add design page
-		int designPageIndex = addPage(editor, null);
-
-		_designViewer = editor;
-		// // note: By adding the design page as a Control instead of an
-		// // IEditorPart, page switches will indicate
-		// // a "null" active editor when the design page is made active
-		setPageText(designPageIndex, PDPlugin
-				.getResourceString("HTMLEditor.Design")); //$NON-NLS-1$
-
-		// add source page
-		int sourcePageIndex = addPage(_textEditor, getEditorInput());
-		setPageText(sourcePageIndex, PDPlugin
-				.getResourceString("HTMLEditor.Source")); //$NON-NLS-1$
-		// the update's critical, to get viewer selection manager and
-		// highlighting to work
-		_textEditor.update();
-
-		firePropertyChange(PROP_TITLE);
-
-		// Changes to the Text Viewer's document instance should also force an
-		// input refresh
-		// _textEditor.getTextViewer().addTextInputListener(new
-		// TextInputListener());
-	}
-
-	private void createAndAddPreviewPage() {
-		_previewComposite = new Composite(getContainer(), 0);
-		FillLayout filllayout = new FillLayout();
-		_previewComposite.setLayout(filllayout);
-
-		_previewPageIndex = addPage(_previewComposite);
-		// JSPSourceEditor.Page.Preview.PageText=Preview
-		setPageText(_previewPageIndex, PageDesignerResources.getInstance()
-				.getString("JSPSourceEditor.Page.Preview.PageText")); //$NON-NLS-1$
-		
-	}
-
-	private WindowsIEBrowser getPreviewBrowser() {
-		if (_browser == null) {
-			_browser = new WindowsIEBrowser();
-			if (_browser != null) {
-				_browser.create(_previewComposite, SWT.NONE);
-				_previewComposite.layout();
-			}
-		}
-		return _browser;
-	}
-	/**
-	 * Connects the design viewer with the viewer selection manager. Should be
-	 * done after createSourcePage() is done because we need to get the
-	 * ViewerSelectionManager from the TextEditor. setModel is also done here
-	 * because getModel() needs to reference the TextEditor.
-	 */
-	protected void connectDesignPage() {
-		if (_designViewer != null) {
-			_designViewer.setModel(getModel());
-			// _designViewer.getSynchronizer().listenToModel(getModel());
-			ISelectionProvider designSelectionProvider = _designViewer
-					.getSite().getSelectionProvider();
-			if (designSelectionProvider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) designSelectionProvider)
-						.addPostSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								if (getActiveEditor() != _textEditor) {
-									_designViewer.getSynchronizer()
-											.selectionChanged(event);
-								}
-							}
-						});
-			} else {
-				designSelectionProvider
-						.addSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								if (getActiveEditor() != _textEditor) {
-									_designViewer.getSynchronizer()
-											.selectionChanged(event);
-								}
-							}
-						});
-			}
-			ISelectionProvider textSelectionProvider = _textEditor.getSite()
-					.getSelectionProvider();
-			if (textSelectionProvider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) textSelectionProvider)
-						.addPostSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								if (event.getSelection() instanceof TextSelection) {
-									TextSelection textSelection = ((TextSelection) event
-											.getSelection());
-									_designViewer
-											.getSynchronizer()
-											.textSelectionChanged(
-													textSelection.getOffset(),
-													textSelection.getOffset()
-															+ textSelection
-																	.getLength());
-								}
-							}
-						});
-			} else {
-				textSelectionProvider
-						.addSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								TextSelection textSelection = ((TextSelection) event
-										.getSelection());
-								_designViewer.getSynchronizer()
-										.textSelectionChanged(
-												textSelection.getOffset(),
-												textSelection.getOffset()
-														+ textSelection
-																.getLength());
-							}
-						});
-			}
-		}
-	}
-
-	/**
-	 * Creates the pages of this multi-page editor.
-	 * <p>
-	 * Subclasses of <code>MultiPageEditor</code> must implement this method.
-	 * </p>
-	 */
-	protected void createPages() {
-		try {
-			// source page MUST be created before design page, now
-			if (_sash) {
-				sash_createAndAddDesignSourcePage();
-			} else {
-				tabbed_createAndAddDesignSourcePage();
-			}
-			connectDesignPage();
-			createAndAddPreviewPage();
-			DesignerSourceMouseTrackAdapter adapter = new DesignerSourceMouseTrackAdapter(
-					_textEditor, getEditDomain());
-			_textEditor.getTextViewer().getTextWidget().addMouseListener(
-					adapter);
-			_textEditor.getTextViewer().getTextWidget().addMouseMoveListener(
-					adapter);
-		} catch (PartInitException exception) {
-			//$NON-NLS-1$ = "An error has occurred when initializing the input for the the editor's source page."
-			if (_log != null) {
-				// throw new SourceEditingRuntimeException(
-				// "An error has occurred when initializing the input for the
-				// the editor's source page.");
-			}
-		}
-		// TODO: add a catch block here for any exception the design
-		// page throws and convert it into a more informative message.
-	}
-
-	/**
-	 * Method createTextEditor.
-	 * 
-	 * @return StructuredTextEditor
-	 */
-	protected StructuredTextEditor createTextEditor() {
-		return new DesignerStructuredTextEditorJSP();
-	}
-
-	private void disconnectDesignPage() {
-		if (_designViewer != null) {
-			_designViewer.setModel(null);
-			_designViewer.dispose();
-		}
-	}
-
-	public void dispose() {
-		//System.out.println("dispose of HTML Editor");
-		deletePreviewFiles();
-		
-		disconnectSashPage();
-		disconnectDesignPage();
-		
-		IWorkbenchWindow window = getSite().getWorkbenchWindow();
-		window.getPartService().removePartListener(_partListener);
-		window.getShell().removeShellListener(_partListener);
-		getSite().getPage().removePartListener(_partListener);
-
-		if (_textEditor != null) {
-			_textEditor.removePropertyListener(this);
-			_textEditor.setEditorPart(null);
-			_textEditor.dispose();
-		}
-		
-		// moved to last when added window ... seems like
-		// we'd be in danger of losing some data, like site,
-		// or something.
-		_sashEditorPart = null;
-		_tabbedPropSheet = null;
-		_partListener = null;
-		_editDomain = null;
-		_designViewer = null;
-		_browser = null;
-		_previewComposite = null;
-		_paletteViewerPage = null;
-		_log = null;
-		_selChangedListener = null;
-		_textEditor = null;
-		
-		super.dispose();
-		
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		_textEditor.doSave(monitor);
-	}
-
-	/*
-	 * (non-Javadoc) Saves the contents of this editor to another object. <p>
-	 * Subclasses must override this method to implement the open-save-close
-	 * lifecycle for an editor. For greater details, see <code> IEditorPart
-	 * </code></p>
-	 * 
-	 * @see IEditorPart
-	 */
-	public void doSaveAs() {
-		_textEditor.doSaveAs();
-	}
-
-	private void editorInputIsAcceptable(IEditorInput input)
-			throws PartInitException {
-		if (input instanceof IFileEditorInput) {
-			// verify that it can be opened
-			CoreException[] coreExceptionArray = new CoreException[1];
-			if (fileDoesNotExist((IFileEditorInput) input, coreExceptionArray)) {
-				// todo use message formatter for {0}
-				Throwable coreException = coreExceptionArray[0];
-
-				// C.B: this is a strange piece of logic.  It was referenceing
-				// the internal sub-class of CoreException, ResourceException.
-				// need to review fileDoesNotExist.
-				if (coreException instanceof CoreException) {
-					// I'm assuming this is always 'does not exist'
-					// we'll refresh local go mimic behavior of default
-					// editor, where the
-					// troublesome file is refreshed (and will cause it to
-					// 'disappear' from Navigator.
-					try {
-						((IFileEditorInput) input).getFile()
-								.refreshLocal(IResource.DEPTH_ZERO,
-										new NullProgressMonitor());
-					} catch (CoreException ce) {
-						if (_log != null) {
-							_log.error("Error.HTMLEditor.0", ce); //$NON-NLS-1$
-						}
-					}
-					throw new PartInitException("Resource " + input.getName() //$NON-NLS-1$
-							+ " does not exist."); //$NON-NLS-1$
-				}
-                throw new PartInitException("Editor could not be open on " //$NON-NLS-1$
-                		+ input.getName());
-			}
-		} else if (input instanceof IStorageEditorInput) {
-			InputStream contents = null;
-			try {
-				contents = ((IStorageEditorInput) input).getStorage()
-						.getContents();
-				if (contents == null) {
-					throw new PartInitException("Editor could not be open on " //$NON-NLS-1$
-							+ input.getName());
-				}
-			} catch (CoreException noStorageExc) {
-				// Error in geting storage contents
-				_log.error("Error.HTMLEditor.1", noStorageExc); //$NON-NLS-1$
-			}
-			finally
-			{
-				ResourceUtils.ensureClosed(contents);
-			}
-		}
-	}
-
-	/**
-	 * Initializes the editor part with a site and input. <p>
-	 * Subclasses of <code> EditorPart </code> must implement this method.
-	 * Within the implementation subclasses should verify that the input type is
-	 * acceptable and then save the site and input. Here is sample code: </p><pre>
-	 * if (!(input instanceof IFileEditorInput)) throw new
-	 * PartInitException("Invalid Input: Must be IFileEditorInput");
-	 * setSite(site); setInput(editorInput); </pre>
-	 * @param input 
-	 * @param coreException 
-	 * @return true if the input doesn't exist 
-	 */
-	protected boolean fileDoesNotExist(IFileEditorInput input,
-			Throwable[] coreException) {
-		boolean result = false;
-		InputStream inStream = null;
-		if ((!(input.exists())) || (!(input.getFile().exists()))) {
-			result = true;
-		} else {
-			try 
-			{
-				inStream = input.getFile().getContents(true);
-			} 
-			catch (CoreException e) 
-			{
-				// very likely to be file not found
-				result = true;
-				coreException[0] = e;
-				// The core has exception
-				_log.error("Error.HTMLEditor.3", e); //$NON-NLS-1$
-			} 
-			finally 
-			{
-				ResourceUtils.ensureClosed(inStream);
-			}
-		}
-		return result;
-	}
-
-	public Object getAdapter(Class key) {
-		Object result = null;
-		if (key == IDesignViewer.class) {
-			result = _designViewer;
-		} else if (key == PalettePage.class) {
-			return getPaletteViewerPage();
-		} else if (key == IPropertySheetPage.class) {
-			// XXX: we can delegate this to the fTextEditor, but that use some
-			// more
-			// complicate mechanism, and don't work with page designer well, so
-			// do it simple now, fix later.
-			// return _textEditor.getAdapter(key);
-			return getPropertySheetPage();
-		} else if (key == IContentOutlinePage.class) {
-			if (_textEditor != null) {
-				result = _textEditor.getAdapter(key);
-			}
-		} else if (key == IPageVariablesProvider.class) {
-			Object obj = ((IDOMModel) getModel()).getDocument().getAdapterFor(
-					IDocumentPageVariableAdapter.class);
-			if (obj instanceof IPageVariablesProvider) {
-				return obj;
-			}
-            return null;
-		} else {
-			// DMW: I'm bullet-proofing this because
-			// its been reported (on 4.03 version) a null pointer sometimes
-			// happens here on startup, when an editor has been left
-			// open when workbench shutdown.
-			if (_textEditor != null) {
-				result = _textEditor.getAdapter(key);
-			}
-		}
-		return result;
-	}
-
-
-	/**
-	 * IExtendedSimpleEditor method
-	 * @return IDocument
-	 */
-	public IDocument getDocument() {
-		if (getTextEditor() == null) {
-			return null;
-		}
-
-		Object apapter = _textEditor.getAdapter(ISourceEditingTextTools.class);
-		if (apapter != null) {
-			return ((ISourceEditingTextTools) apapter).getDocument();
-		}
-
-		return null;
-	}
-
-	/**
-	 * IExtendedMarkupEditor method
-	 * @return the dom document
-	 */
-	public Document getDOMDocument() {
-		if (getTextEditor() == null) {
-			return null;
-		}
-
-		Object adapter = _textEditor.getAdapter(ISourceEditingTextTools.class);
-		if (adapter instanceof IDOMSourceEditingTextTools) {
-			return ((IDOMSourceEditingTextTools) adapter).getDOMDocument();
-		}
-		return null;
-	}
-
-	/**
-	 * IExtendedSimpleEditor method
-	 * @return the editor part
-	 */
-	public IEditorPart getEditorPart() {
-		return this;
-	}
-
-	/**
-	 * @return the structured model
-	 */
-	public IStructuredModel getModel() {
-		IStructuredModel model = null;
-		if (_textEditor != null) {
-			model = ((DesignerStructuredTextEditorJSP) _textEditor).getModel();
-		}
-		return model;
-	}
-
-
-	/**
-	 * @return the SSE editor delegate
-	 */
-	public StructuredTextEditor getTextEditor() {
-		return _textEditor;
-	}
-
-
-	/*
-	 * (non-Javadoc) Method declared on IWorkbenchPart.
-	 */
-	public String getTitle() {
-		String title = null;
-		if (getTextEditor() == null) {
-			if (getEditorInput() != null) {
-				title = getEditorInput().getName();
-			}
-		} else {
-			title = getTextEditor().getTitle();
-		}
-		if (title == null) {
-			title = getPartName();
-		}
-		return title;
-	}
-
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		super.init(site, input);
-		editorInputIsAcceptable(input);
-		try {
-			// super.init(site, input);
-			// setSite(site);
-			setInput(input);
-			if (_partListener == null) {
-				_partListener = new PartActivationHandler(this) {
-					public void handleActivation() {
-						safelySanityCheckState();
-					}
-				};
-			}
-			// we want to listen for our own activation
-			IWorkbenchWindow window = getSite().getWorkbenchWindow();
-			window.getPartService().addPartListener(_partListener);
-			window.getShell().addShellListener(_partListener);
-			
-			// TODO: is this the right place to do this?
-			// enable our editor context
-			IContextService contextService = (IContextService) getSite()
-			  .getService(IContextService.class);
-			contextService.activateContext("org.eclipse.jst.pagedesigner.editorContext"); //$NON-NLS-1$
-
-		} catch (Exception e) {
-			// Error in editor initialization
-			_log.error("Error.HTMLEditor.5", e); //$NON-NLS-1$
-		}
-		setPartName(input.getName());
-	}
-
-	/*
-	 * (non-Javadoc) Returns whether the "save as" operation is supported by
-	 * this editor. <p> Subclasses must override this method to implement the
-	 * open-save-close lifecycle for an editor. For greater details, see <code>
-	 * IEditorPart </code></p>
-	 * 
-	 * @see IEditorPart
-	 */
-	public boolean isSaveAsAllowed() {
-		return _textEditor != null && _textEditor.isSaveAsAllowed();
-	}
-
-	/*
-	 * (non-Javadoc) Returns whether the contents of this editor should be saved
-	 * when the editor is closed. <p> This method returns <code> true </code> if
-	 * and only if the editor is dirty ( <code> isDirty </code> ). </p>
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		// overriding super class since it does a lowly isDirty!
-		if (_textEditor != null) {
-			return _textEditor.isSaveOnCloseNeeded();
-		}
-		return isDirty();
-	}
-
-	/**
-	 * Posts the update code "behind" the running operation.
-	 */
-	private void postOnDisplayQue(Runnable runnable) {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-		if (windows != null && windows.length > 0) {
-			Display display = windows[0].getShell().getDisplay();
-			display.asyncExec(runnable);
-		} else {
-			runnable.run();
-		}
-	}
-
-	/**
-	 * Indicates that a property has changed.
-	 * 
-	 * @param source
-	 *            the object whose property has changed
-	 * @param propId
-	 *            the id of the property which has changed; property ids are
-	 *            generally defined as constants on the source class
-	 */
-	public void propertyChanged(Object source, int propId) {
-		switch (propId) {
-		// had to implement input changed "listener" so that
-		// strucutedText could tell it containing editor that
-		// the input has change, when a 'resource moved' event is
-		// found.
-		case IEditorPart.PROP_INPUT: {
-			if (source == _textEditor) {
-				if (_textEditor.getEditorInput() != getEditorInput()) {
-					setInput(_textEditor.getEditorInput());
-					// title should always change when input changes.
-					// create runnable for following post call
-					Runnable runnable = new Runnable() {
-						public void run() {
-							_firePropertyChange(IWorkbenchPart.PROP_TITLE);
-						}
-					};
-					// Update is just to post things on the display queue
-					// (thread). We have to do this to get the dirty
-					// property to get updated after other things on the
-					// queue are executed.
-					postOnDisplayQue(runnable);
-				}
-			}
-			break;
-		}
-		case IWorkbenchPart.PROP_TITLE: {
-			// // update the input if the title is changed. why? It seems input
-			// change event will be fired at last.
-			// if (source == _textEditor)
-			// {
-			// if (_textEditor.getEditorInput() != getEditorInput())
-			// {
-			// setInput(_textEditor.getEditorInput());
-			// }
-			// }
-			// break;
-		}
-		default: {
-			// propagate changes. Is this needed? Answer: Yes.
-			// PROP_PART_NAME, PROP_DIRTY etc.
-			if (source == _textEditor) {
-				firePropertyChange(propId);
-			}
-			break;
-		}
-		}
-
-	}
-
-	private void safelySanityCheckState() {
-		// If we're called before editor is created, simply ignore since we
-		// delegate this function to our embedded TextEditor
-		if (getTextEditor() == null) {
-			return;
-		}
-
-		getTextEditor().safelySanityCheckState(getEditorInput());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	protected void setInput(IEditorInput input) {
-		// If driven from the Source page, it's "model" may not be up to date
-		// with the input just yet. We'll rely on later notification from the
-		// TextViewer to set us straight
-		super.setInput(input);
-		if (_designViewer != null) {
-
-			_designViewer.setModel(getModel());
-		}
-		setPartName(input.getName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#isDirty()
-	 */
-	public boolean isDirty() {
-		if (getTextEditor() == null) {
-			return false;
-		}
-		return getTextEditor().isDirty();
-	}
-
-	private IPropertySheetPage getPropertySheetPage()
-    {
-        if (_tabbedPropSheet == null || _tabbedPropSheet.getControl() == null 
-                || _tabbedPropSheet.getControl().isDisposed())
-        {
-            IPropertySheetPageFactory factory = getPageFactory();
-            if (factory != null)
-            {
-                final IFile file = ((IFileEditorInput)getEditorInput()).getFile();
-                _tabbedPropSheet = factory.createPage(file);
-            }
-            else
-            {
-                _tabbedPropSheet = new WPETabbedPropertySheetPage(this,this);
-            }
-        }
-        return _tabbedPropSheet;
-    }
-
-    private IPropertySheetPageFactory getPageFactory()
-    {
-        //List<IElementEditFactory> result = new ArrayList<IElementEditFactory>();
-        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-                .getExtensionPoint(PDPlugin.getPluginId(),
-                        IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-        IExtension[] extensions = extensionPoint.getExtensions();
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            IExtension ext = extensions[i];
-            IConfigurationElement[] elementEditElement = ext
-                    .getConfigurationElements();
-
-            for (int j = 0; j < elementEditElement.length; j++)
-            {
-                final IConfigurationElement element = elementEditElement[j];
-                if (element.getName().equals(
-                        IJMTConstants.PROPERTY_PAGE_FACTORY))
-                {
-                    elementEditElement[j].getAttribute("class"); //$NON-NLS-1$
-                    Object obj;
-                    try
-                    {
-                        obj = elementEditElement[j]
-                                .createExecutableExtension("class"); //$NON-NLS-1$
-
-                        // TODO: we need a policy based solution here,
-                        // but this will do for now
-                        if (obj instanceof IPropertySheetPageFactory)
-                        {
-                            return (IPropertySheetPageFactory) obj;
-                        }
-                    } 
-                    catch (CoreException e)
-                    {
-                        PDPlugin.log("Problem loading element edit extension for "+element.toString(), e); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-        return null;
-    }
-       
-    /**
-     * @return PaletteViewerPage
-     */
-    private PaletteViewerPage getPaletteViewerPage()
-    {
-        if (_paletteViewerPage == null)
-        {
-            _paletteViewerPage = _designViewer.createPaletteViewerPage();
-        }
-        return _paletteViewerPage;
-    }
-
-	/**
-	 * @return the edit domain
-	 */
-	public DefaultEditDomain getEditDomain() {
-		if (_editDomain == null) {
-			_editDomain = new DefaultEditDomain(this);
-
-			// XXX: if i don't do the following line, system will default use
-			// SelectionTool. Don't know where else to set this. Since it is
-			// kind of duplicate
-			// to the DesignerPaletteRoot.
-			_editDomain.setDefaultTool(new RangeSelectionTool());
-			_editDomain.loadDefaultTool();
-
-			// next config the _editDomain
-			// _editDomain.setPaletteRoot(new JSFPaletteRoot());
-		}
-		return _editDomain;
-	}
-
-	/**
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#pageChange(int)
-	 */
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-
-		deletePreviewFiles();
-
-		if (newPageIndex == _previewPageIndex) {
-			// preview page activate, need to regenerate the preview text and
-			// display it.
-			StringBuffer result = new StringBuffer();
-			try {
-				// PreviewHandler.generatePreview(this.getModel(),
-				// this.getEditorInput(), result);
-				DocumentEditPart part = (DocumentEditPart) this._designViewer
-						.getGraphicViewer().getContents();
-				PreviewHandlerNew.generatePreview(part, result);
-			} catch (Exception ex) {
-				result = new StringBuffer();
-				result
-						.append(this.getModel().getStructuredDocument()
-								.getText());
-				// Error in page changing
-				_log.info("Error.HTMLEditor.6", ex); //$NON-NLS-1$
-				ex.printStackTrace();
-			}
-			File file = PreviewUtil.toFile(result, getEditorInput());
-			if (file != null) {
-				PREVIEW_FILES_LIST.add(file);
-				getPreviewBrowser().loadFile(file);
-			} else {
-				getPreviewBrowser().getBrowser().setUrl("about:blank"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the _designViewer.
-	 */
-	public IDesignViewer getDesignViewer() {
-		return _designViewer;
-	}
-
-	/**
-	 * @param mode
-	 */
-	public void setDesignerMode(int mode) {
-		if (_sashEditorPart != null && _mode != mode) {
-			switch (mode) {
-			case MODE_SASH_HORIZONTAL:
-				_sashEditorPart.setOrientation(SWT.HORIZONTAL);
-				break;
-			case MODE_DESIGNER:
-				_sashEditorPart.setMaximizedEditor(this._designViewer);
-				break;
-			case MODE_SOURCE:
-				_sashEditorPart.setMaximizedEditor(this._textEditor);
-				break;
-			case MODE_SASH_VERTICAL:
-			default:
-				_sashEditorPart.setOrientation(SWT.VERTICAL);
-			}
-			if (getEditorInput() != null) {
-				EditorUtil.setEditorInputDesignModeProperty(getEditorInput(), String.valueOf(mode));
-			}
-		}
-		this._mode = mode;
-	}
-
-	/*
-	 * Set the sash editor mode from the stored file property
-	 * or the default preference.
-	 */
-	private void initDesignerMode() {
-		int preferredMode = MODE_SASH_VERTICAL;
-
-		// If the user has already selected a mode for the file, use it.
-		String prop = null;
-		if (getEditorInput() != null) {
-			prop = EditorUtil.getEditorInputDesignModeProperty(getEditorInput());
-		}
-		if (prop != null) {
-			try {
-				preferredMode = Integer.parseInt(prop);
-			} catch (NumberFormatException e) {
-				// do nothing;
-			}
-		} else {
-			// Otherwise, get the default mode from preferences.
-			IPreferenceStore pStore = PDPlugin.getDefault().getPreferenceStore();
-			preferredMode = pStore.getInt(PDPreferences.SASH_EDITOR_MODE_PREF);
-		}
-
-		setDesignerMode(preferredMode);
-	}
-
-	/**
-	 * @return the current design mode
-	 */
-	public int getDesignerMode() {
-		return this._mode;
-	}
-
-	public IEditorPart getActiveEditor() {
-		IEditorPart result = null;
-		if (_sash) {
-			result = _sashEditorPart.getActiveEditor();
-		} else {
-			if (_designViewer.getGraphicViewer().getControl().isFocusControl()) {
-				result = _designViewer;
-			} else if (_textEditor.getTextViewer().getControl()
-					.isFocusControl()) {
-				result = _textEditor;
-			}
-		}
-		return result;
-	}
-
-	public String getPartName() {
-		if (_textEditor != null) {
-			return _textEditor.getPartName();
-		}
-        return super.getPartName();
-	}
-
-	private void deletePreviewFiles() {
-		Iterator itPreviewFiles = PREVIEW_FILES_LIST.iterator();
-		while (itPreviewFiles.hasNext()) {
-			File file = (File)itPreviewFiles.next();
-			if (file != null && file.exists()) {
-				file.delete();
-			}
-		}
-		PREVIEW_FILES_LIST.clear();
-	}
-
-	/**
-	 * Refreshes the design page. Allows an external action to force a refresh
-	 * after an external change, such as a DT skin change.
-	 */
-	public void refreshDesignViewer() {
-		EditPart contentEditPart = _designViewer.getGraphicViewer().getRootEditPart().getContents();
-		if (contentEditPart instanceof DocumentEditPart) {
-			((DocumentEditPart)contentEditPart).styleChanged();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java
deleted file mode 100644
index fc05338..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * This is copied from the xmleditor plugin. Represents the design viewer that
- * need can be used to show the design page.
- * 
- * @author mengbo
- */
-public interface IDesignViewer {
-	/**
-	 * @return the title
-	 */
-	String getTitle();
-
-	/**
-	 * @param model
-	 */
-	void setModel(IStructuredModel model);
-
-	// void setViewerSelectionManager(ViewerSelectionManager
-	// viewerSelectionManager);
-
-	/**
-	 * @return the graphical viewer
-	 */
-	public IHTMLGraphicalViewer getGraphicViewer();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IPropertySheetPageFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IPropertySheetPageFactory.java
deleted file mode 100644
index 3e37903..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IPropertySheetPageFactory.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-
-/**
- * A factory that can be used with the pageDesignerExtension to override
- * the default property sheet page provided by the WPE when tag elements are
- * selected by the user.
- * 
- * This interface should not be implemented or extended by clients.  Use
- * AbstractPropertySheetPageFactory instead.
- * 
- * @author cbateman
- *
- */
-public interface IPropertySheetPageFactory
-{
-    /**
-     * @param file
-     * @return the  property sheet page for the file.
-     */
-    IPropertySheetPage  createPage(final IFile file);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java
deleted file mode 100644
index d35de2d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jst.jsp.ui.views.contentoutline.JSPContentOutlineConfiguration;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-
-/**
- * the HTML editor's outline view configuration
- *
- */
-public class OutlineConfiguration extends JSPContentOutlineConfiguration {
-	private Object[] _selections = new Object[0];
-
-	public ISelection getSelection(TreeViewer viewer, ISelection selection) {
-		if ((viewer.getInput() instanceof IStructuredModel)
-				&& (selection instanceof ITextSelection)) {
-			_selections = getSelectedObjects((IStructuredModel) viewer
-					.getInput(), (ITextSelection) selection);
-			if (_selections != null) {
-				return super.getSelection(viewer, new StructuredSelection(
-						_selections));
-			}
-		}
-		else if (selection instanceof IStructuredSelection)
-		{
-		    return super.getSelection(viewer, selection);
-		}
-		return super.getSelection(viewer, new StructuredSelection(_selections));
-	}
-	
-	private Object[] getSelectedObjects(IStructuredModel model,
-			ITextSelection selection) {
-		Object[] selectedStructures = null;
-		if (model != null) {
-			IndexedRegion region = model
-					.getIndexedRegion(selection.getOffset());
-			int end = selection.getOffset() + selection.getLength();
-			if (region != null) {
-				if (end <= region.getEndOffset()) {
-					// single selection
-					selectedStructures = new Object[1];
-					selectedStructures[0] = region;
-				} else {
-					// multiple selection
-					int maxLength = model.getStructuredDocument().getLength();
-					List structures = new ArrayList(2);
-					while (region != null && region.getEndOffset() <= end
-							&& region.getEndOffset() < maxLength) {
-						structures.add(region);
-						region = model
-								.getIndexedRegion(region.getEndOffset() + 1);
-					}
-					selectedStructures = structures.toArray();
-				}
-			}
-		}
-		if (selectedStructures == null) {
-			selectedStructures = new Object[0];
-		}
-		return selectedStructures;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java
deleted file mode 100644
index cbe7381..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.ui.IWorkbenchActionConstants;
-
-/**
- * Common constants used to id specific locations in the canvas context menu.
- * 
- * @see SimpleGraphicalEditor.ContextMenuListener for construction order
- * 
- * @author mengbo
- */
-public class PageDesignerActionConstants 
-{
-    /**
-     * Id for the standard Edit sub-menu
-     */
-    public static final String EDIT_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.edit"; //$NON-NLS-1$
-    /**
-     * Id for the standard Select sub-menu
-     */
-    public static final String SELECT_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.select"; //$NON-NLS-1$
-    /**
-     * Id for the standard Insert sub-menu
-     */
-    public static final String INSERT_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.insert"; //$NON-NLS-1$
-    /**
-     * Id for the standard Navigate sub-menu
-     */
-    public static final String NAVIGATE_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.navigate"; //$NON-NLS-1$
-    /**
-     * Id for the standard Style sub-menu
-     */
-    public static final String STYLE_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.style"; //$NON-NLS-1$
-    /**
-     * Id for the standard Show(View) sub-menu
-     */
-    public static final String SHOWVIEW_SUBMENU_ID = "org.eclipse.jst.pagedesigner.viewMenuMgr"; //$NON-NLS-1$
-    
-	/**
-	 * Undo action group
-	 */
-	public static final String GROUP_UNDO = GEFActionConstants.GROUP_UNDO;
-	/**
-	 * Standard Edit sub-menu action group
-	 */
-	public static final String GROUP_EDIT = GEFActionConstants.GROUP_EDIT;
-	/**
-	 * Group for container injected actions
-	 */
-	public static final String GROUP_CONTAINER = "org.eclipse.jst.pagedesigner.container"; //$NON-NLS-1$
-	/**
-	 * Standard Style sub-menu action group
-	 */
-	public static final String GROUP_STYLE = "org.eclipse.jst.pagedesigner.style"; //$NON-NLS-1$
-	/**
-	 * Group for third-party contributed tag-specific actions
-	 */
-	public static final String GROUP_SPECIAL = "org.eclipse.jst.pagedesigner.special"; //$NON-NLS-1$
-    /**
-     * Standard Select sub-menu action group
-     */
-    public static final String GROUP_SELECT = "org.eclipse.jst.pagedesigner.select"; //$NON-NLS-1$
-    /**
-     * Standard Insert sub-menu action group
-     */
-    public static final String GROUP_INSERT = "org.eclipse.jst.pagedesigner.insert"; //$NON-NLS-1$
-    /**
-     * Standard Navigate sub-menu action group
-     */
-    public static final String GROUP_NAVIGATE = "org.eclipse.jst.pagedesigner.navigate"; //$NON-NLS-1$
-
-
-    /**
-     * Add standard group separators for the Edit sub-menu
-     * 
-     * @param menu
-     */
-    public static final void addStandardEditActionGroups(IMenuManager menu)
-    {
-        menu.add(new Separator(GROUP_UNDO));
-        menu.add(new Separator(GROUP_EDIT));
-    }
-   
-	/**
-	 * Adds standard group separators to the given MenuManager.
-	 * 
-	 * @param menu the MenuManager
-	 */
-	public static final void addStandardActionGroups(IMenuManager menu) {
-		menu.add(new Separator(GROUP_CONTAINER));
-		menu.add(new Separator(GROUP_SPECIAL));
-		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-    /**
-     * Add standard group separators for the Style sub-menu
-     * @param menu
-     */
-    public static void addStandardStyleActionGroups(IMenuManager menu) 
-    {
-        menu.add(new Separator(GROUP_STYLE));
-    }
-
-    /**
-     * Add standard group separators for the Select sub-menu
-     * @param menu
-     */
-    public static void addStandardSelectActionGroups(IMenuManager menu) {
-        menu.add(new Separator(GROUP_SELECT));
-    }
-
-    /**
-     * Add standard group separators for the Insert sub-menu
-     * @param menu
-     */
-    public static void addStandardInsertActionGroups(IMenuManager menu) {
-        menu.add(new Separator(GROUP_INSERT));
-    }
-
-    /**
-     * Add standard group separators for the Navigate sub-menu
-     * @param menu
-     */
-    public static void addStandardNavigateActionGroups(
-            IMenuManager menu) {
-        menu.add(new Separator(GROUP_NAVIGATE));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SelectionSynchronizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SelectionSynchronizer.java
deleted file mode 100644
index 33025aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SelectionSynchronizer.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.swt.custom.StyledText;
-
-/**
- * This class handles selection synchronization between the designer and other
- * parts. It listens event from both ViewerSelectionManager and the
- * IDesignerView, and convert the events to each other.
- * <p>
- * SelectionSynchronizer will be registered on the ViewerSelectionManager,
- * basically listens to selection change of other parts, and make the designer
- * sync with them.
- * <p>
- * As ViewerSelectionManager is firing out both textSelectionChange and
- * nodeSelectionChange, we only need to listen to one of them. As
- * textSelectionChange provide more information than nodeSelectionChange, so
- * we'll listen only to textSelectionChange.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class SelectionSynchronizer implements ISelectionChangedListener {
-	private boolean _firingChange = false;
-
-	private SimpleGraphicalEditor _editor;
-
-	/**
-	 * @param editor
-	 */
-	public SelectionSynchronizer(SimpleGraphicalEditor editor) {
-		_editor = editor;
-	}
-
-	/**
-	 * @return true if the status check is okay
-	 */
-	protected boolean statusCheckOk() {
-		try {
-			StyledText text = _editor.getHTMLEditor().getTextEditor()
-					.getTextViewer().getTextWidget();
-			if (text == null || text.isDisposed()) {
-				return false;
-			}
-			return true;
-		} catch (NullPointerException ex) {
-			return false;
-		}
-	}
-
-	/**
-	 * This is for event from the designer.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		ISelection selection = event.getSelection();
-
-		if (!_firingChange) {
-			// check current status
-			if (!statusCheckOk()) {
-				return;
-			}
-
-			_firingChange = true;
-			try {
-				// convert the designer selection into SSE selection
-				// (IStructureSelection of nodes
-				// or textSelection, and let the ViewerSelectionManager to
-				// handle it.
-				// if (selection instanceof IStructuredSelection)
-				// {
-				// IStructuredSelection nodeSel =
-				// SelectionHelper.convertFromDesignSelection((IStructuredSelection)selection);
-				// can't use DoubleClickEvent, since it requre a Viewer.
-				// _viewerSelectionManager.doubleClick(new
-				// DoubleClickEvent(null, nodeSel));
-				// }
-				// else if (selection instanceof DesignRange)
-				// {
-				// ITextSelection srcselection =
-				// SelectionHelper.convertFromDesignSelection((DesignRange)selection);
-				// event = new SelectionChangedEvent(_editor.getGraphicViewer(),
-				// srcselection);
-				// _viewerSelectionManager.selectionChanged(event);
-				// }
-				ITextSelection srcselection = SelectionHelper
-						.convertFromDesignSelectionToTextSelection(selection);
-
-				// ideally, we should let the text editor display the selection
-				// through calls to _viewerSelectionManager,
-				// but seemed _viewerSelectionManager don't support that, so we
-				// do workaround by calling the text editor (lium)
-				_editor.getHTMLEditor().getTextEditor().selectAndReveal(
-						srcselection.getOffset(), srcselection.getLength());
-			} finally {
-				_firingChange = false;
-			}
-		}
-	}
-
-	/**
-	 * We are listening to the selection change in ViewerSelectionManager. The
-	 * original source of the event could be source view or the outline view or
-	 * other party that participate in the ViewerSelectionManager.
-	 * @param start 
-	 * @param end 
-	 */
-	public void textSelectionChanged(int start, int end) {
-		if (!_firingChange) {
-			try {
-				_firingChange = true;
-
-				// XXX: workaround a SSE problem. In SSE, when user select a
-				// range, it will fire two textSelectionChange event
-				// the first one indicate the correct range, the second one is
-				// zero size for caret position.
-				// @see ViewerSelectionManagerImpl.caretMoved
-				// We try to ignore the second event by checking whether the
-				// current real selection is empty
-				if (start == end) {
-					ITextSelection sel = (ITextSelection) _editor
-							.getHTMLEditor().getTextEditor()
-							.getSelectionProvider().getSelection();
-					if (sel.getLength() != 0) {
-						return;
-					}
-				}
-
-				if (start > end) {
-					int temp = start;
-					start = end;
-					end = temp;
-				}
-				int offset = start;
-				int length = end - start;
-
-				ITextSelection oldSelection = SelectionHelper
-						.convertFromDesignSelectionToTextSelection(_editor
-								.getGraphicViewer().getSelection());
-				if (oldSelection != null && oldSelection.getOffset() == offset
-						&& oldSelection.getLength() == length) {
-					return;
-				}
-
-				ISelection selection = SelectionHelper
-						.convertToDesignerSelection(this._editor
-								.getGraphicViewer(), offset, length);
-				_editor.getGraphicViewer().setSelection(selection);
-			} finally {
-				_firingChange = false;
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java
deleted file mode 100644
index 8d3bdec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java
+++ /dev/null
@@ -1,897 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
-import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
-import org.eclipse.gef.ui.views.palette.PaletteViewerPage;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.container.ContainerActionGroup;
-import org.eclipse.jst.pagedesigner.actions.menuextension.CustomedContextMenuActionGroup;
-import org.eclipse.jst.pagedesigner.actions.range.RangeActionGroup;
-import org.eclipse.jst.pagedesigner.actions.single.SingleElementActionGroup;
-import org.eclipse.jst.pagedesigner.commands.CopyAction;
-import org.eclipse.jst.pagedesigner.commands.CutAction;
-import org.eclipse.jst.pagedesigner.commands.DeleteAction;
-import org.eclipse.jst.pagedesigner.commands.PasteAction;
-import org.eclipse.jst.pagedesigner.dnd.internal.LocalSelectionDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.internal.PDTemplateTransferDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.internal.ResouceDropTargetListener;
-import org.eclipse.jst.pagedesigner.editors.actions.ActionsMessages;
-import org.eclipse.jst.pagedesigner.editors.actions.DesignerUndoRedoAction;
-import org.eclipse.jst.pagedesigner.editors.actions.RelatedViewActionGroup;
-import org.eclipse.jst.pagedesigner.editors.actions.SkinsMenuItemBuilder;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteCustomizer;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteRootFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteViewerProvider;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteFactory;
-import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.DocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.PageVariableAdapterFactory;
-import org.eclipse.jst.pagedesigner.parts.CSSStyleAdapterFactory;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.HTMLEditPartsFactory;
-import org.eclipse.jst.pagedesigner.parts.RefresherFactory;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchCommandConstants;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.wst.sse.core.internal.PropagatingAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator;
-import org.eclipse.wst.sse.core.internal.undo.UndoDocumentEvent;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * @author mengbo
- */
-public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette implements
-		IDesignViewer, IDocumentSelectionMediator {
-
-	private HTMLEditor _delegate;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private IStructuredModel _model;
-
-	/** Palette component, holding the tools and shapes. */
-	private PaletteRoot _palette;
-	
-	private PaletteViewerPage _paletteViewerPage;
-
-	private SelectionSynchronizer _synchronizer = new SelectionSynchronizer(
-			this);
-
-	private IModelStateListener _internalModelListener = new IModelStateListener() {
-		public void modelAboutToBeChanged(IStructuredModel model) {
-            // do nothing
-		}
-
-		public void modelChanged(IStructuredModel model) {
-			updateActionsWhenModelChange();
-		}
-
-		public void modelDirtyStateChanged(IStructuredModel model,
-				boolean isDirty) {
-            // do nothing
-		}
-
-		public void modelResourceDeleted(IStructuredModel model) {
-            // do nothing
-		}
-
-		public void modelResourceMoved(IStructuredModel oldModel,
-				IStructuredModel newModel) {
-            // do nothing
-		}
-
-		public void modelAboutToBeReinitialized(IStructuredModel structuredModel) {
-            // do nothing
-		}
-
-		public void modelReinitialized(IStructuredModel structuredModel) {
-            // do nothing
-		}
-	};
-
-	private PaletteViewerProvider _paletteViewerProvider;
-
-	/**
-	 * TODO: why isn't this private?
-	 */
-	protected IPaletteFactory _paletteViewerPageFactory;
-
-	/**
-	 * @param delegate
-	 * @param editdomain
-	 */
-	public SimpleGraphicalEditor(HTMLEditor delegate,
-			DefaultEditDomain editdomain) {
-		_delegate = delegate;
-		initPaletteFactory();
-		this.setEditDomain(editdomain);		
-	}
-
-	protected void createGraphicalViewer(Composite parent) {
-		_viewer = IHTMLGraphicalViewer.Factory.createGraphicalViewer(this);
-		Control control = _viewer.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-				PDPlugin.getResourceString("SimpleGraphicalEditor.help.id")); //$NON-NLS-1$
-		setGraphicalViewer(_viewer);
-		configureGraphicalViewer();
-		hookGraphicalViewer();
-		initializeGraphicalViewer();
-		initializeContextMenu();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#dispose()
-	 */
-	public void dispose() {
-		if (_model != null) {
-			_model.getUndoManager().disconnect(this);
-		}
-
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#initializeGraphicalViewer()
-	 */
-	protected void initializeGraphicalViewer() {
-		ScalableRootEditPart rootEditPart = new ScalableRootEditPart();
-		_viewer.setRootEditPart(rootEditPart);
-
-		_viewer.getViewport().setContentsTracksWidth(true);
-
-		_viewer.setKeyHandler(new GraphicalViewerKeyHandler(_viewer));
-
-		// initialize the viewer with input
-		// IStructuredModel sModel =
-		// StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForHTML.ContentTypeID_HTML);
-		// IDOMDocument designDoc = ((IDOMModel)sModel).getDocument();
-		// HTMLEditPartsFactory factory = new HTMLEditPartsFactory(designDoc);
-		HTMLEditPartsFactory factory = new HTMLEditPartsFactory(null);
-
-		_viewer.setEditPartFactory(factory);
-
-		// for sync with source view.
-
-		_viewer.addDropTargetListener(new LocalSelectionDropTargetListener(
-				_viewer));
-		_viewer.addDropTargetListener(new PDTemplateTransferDropTargetListener(
-				_viewer));
-		_viewer.addDropTargetListener(new ResouceDropTargetListener(_viewer));
-		
-		// add double click support.
-		_viewer.getControl().addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				try {
-					getSite().getPage().showView(IPageLayout.ID_PROP_SHEET);
-				} catch (PartInitException e1) {
-					// ignore
-				}
-			}
-		});
-        
-        super.initializeGraphicalViewer();
-	}
-
-	/**
-	 * 
-	 */
-	protected void initializeContextMenu() {
-		Control gviewer = _viewer.getControl();
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.setRemoveAllWhenShown(true);
-		Menu menu = menuMgr.createContextMenu(gviewer);
-		gviewer.setMenu(menu);
-		menuMgr.addMenuListener(new ContextMenuListener());
-		getSite().registerContextMenu(
-				"HTMLVisualEditor.contextMenu", menuMgr, _viewer); //$NON-NLS-1$
-	}
-
-	private void updateActionsWhenModelChange() {
-		// update undo/redo action
-		IAction action = this.getAction(IWorkbenchCommandConstants.EDIT_UNDO);
-		((UpdateAction) action).update();
-
-		action = this.getAction(IWorkbenchCommandConstants.EDIT_REDO);
-		((UpdateAction) action).update();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#createActions()
-	 */
-	protected void createActions() {
-		super.createActions();
-		ActionRegistry registry = getActionRegistry();
-		ISharedImages sharedImages = PlatformUI.getWorkbench()
-				.getSharedImages();
-
-		IAction action;
-
-		action = new DesignerUndoRedoAction(true, this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_UNDO);
-		action.setId(IWorkbenchCommandConstants.EDIT_UNDO);
-		getSite().getKeyBindingService().registerAction(action);
-		registry.registerAction(action);
-
-		action = new DesignerUndoRedoAction(false, this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_REDO);
-		action.setId(IWorkbenchCommandConstants.EDIT_REDO);
-		getSite().getKeyBindingService().registerAction(action);
-		registry.registerAction(action);
-
-		action = new DeleteAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_DELETE);
-		action.setId(IWorkbenchCommandConstants.EDIT_DELETE);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new CopyAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_COPY);
-		action.setId(IWorkbenchCommandConstants.EDIT_COPY);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new CutAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_CUT);
-		action.setId(IWorkbenchCommandConstants.EDIT_CUT);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new PasteAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));
-		action.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_PASTE);
-		action.setId(IWorkbenchCommandConstants.EDIT_PASTE);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		if (_delegate != null) {
-			_delegate.doSave(monitor);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		if (_delegate != null) {
-			_delegate.doSaveAs();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		if (_delegate != null) {
-			return _delegate.isDirty();
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		if (_delegate != null) {
-			return _delegate.isSaveAsAllowed();
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.html.editor.IDesignViewer#setModel(com.ibm.sse.model.IStructuredModel)
-	 */
-	public void setModel(IStructuredModel model) {
-		if (_model != null) {
-			if (_model.getUndoManager() != null)
-				_model.getUndoManager().disconnect(this);
-			_model.removeModelStateListener(_internalModelListener);
-		}
-
-		this._model = model;
-
-		if (_model != null) {
-			_model.addModelStateListener(_internalModelListener);
-			if (_model.getUndoManager() != null) {
-				_model.getUndoManager().connect(this);
-				updateActionsWhenModelChange();
-			}
-		}
-
-		if (model instanceof IDOMModel) {
-			IDOMDocument doc = ((IDOMModel) model).getDocument();
-			PropagatingAdapter adapter = (PropagatingAdapter) doc
-					.getAdapterFor(PropagatingAdapter.class);
-			if (adapter != null) {
-				INodeAdapterFactory factory = RefresherFactory.getInstance();
-				adapter.addAdaptOnCreateFactory(factory);
-				adapter.initializeForFactory(factory, doc);
-				// CSSStyleAdapterFactory fac2 =
-				// CSSStyleAdapterFactory.getInstance();
-				// adapter.addAdaptOnCreateFactory(fac2);
-				// adapter.initializeForFactory(fac2, doc);
-			}
-			((IDOMModel) model).getFactoryRegistry().addFactory(
-					CSSStyleAdapterFactory.getInstance());
-
-			// _viewer.getDestDocumentForDesign().getModel().getFactoryRegistry().addFactory(CSSStyleAdapterFactory.getInstance());
-			((IDOMModel) model).getFactoryRegistry().addFactory(
-					new PageVariableAdapterFactory());
-			doc.addAdapter(new DocumentPageVariableAdapter(doc));
-			_viewer.setContents(((IDOMModel) model).getDocument());
-		} else {
-			_viewer.setContents((EditPart) null);
-		}
-	}
-
-	/**
-	 * @return the selection synchronizer
-	 */
-	protected SelectionSynchronizer getSynchronizer() {
-		return _synchronizer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#updateActions(java.util.List)
-	 */
-	protected void updateActions(List actionIds) {
-		super.updateActions(actionIds);
-	}
-
-	/**
-	 * @param id
-	 * @return the action for the id
-	 */
-	public IAction getAction(Object id) {
-		// lium: following lines commented out, see comments in
-		// DesignerUndoRedoAction
-		// if (ITextEditorActionConstants.UNDO.equals(id) ||
-		// ITextEditorActionConstants.REDO.equals(id))
-		// {
-		// return _delegate.getTextEditor().getAction((String) id);
-		// }
-		return getActionRegistry().getAction(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPalettePreferences()
-	 */
-	protected FlyoutPreferences getPalettePreferences() {
-		return DesignerPaletteRootFactory.createPalettePreferences();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPaletteRoot()
-	 */
-	protected PaletteRoot getPaletteRoot() {
-		if (_palette == null) {
-			if (_paletteViewerPageFactory != null) {
-	            _palette = _paletteViewerPageFactory.createPaletteRoot(_delegate.getEditorInput());
-	        } 
-            if (_palette == null) {
-            	_palette = DesignerPaletteRootFactory
-            		.createPaletteRoot(getCurrentFile(_delegate.getEditorInput()));
-            }
-		}
-		return _palette;
-
-	}
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#createPaletteViewerProvider()
-	 */
-    protected PaletteViewerProvider createPaletteViewerProvider() {
-    	if (_paletteViewerProvider == null) {
-    		if (_paletteViewerPageFactory != null) {
-    			_paletteViewerProvider = _paletteViewerPageFactory.createPaletteViewerProvider(getEditDomain());
-    		}
-    		if (_paletteViewerProvider == null) {//if still null
-    			return new DesignerPaletteViewerProvider(getEditDomain()) {
-    				protected void configurePaletteViewer(PaletteViewer viewer) {
-    					super.configurePaletteViewer(viewer);
-    					viewer.setCustomizer(new DesignerPaletteCustomizer());
-
-    					// create a drag source listener for this palette viewer
-    					// together with an appropriate transfer drop target listener,
-    					// this will enable
-    					// model element creation by dragging a
-    					// CombinatedTemplateCreationEntries
-    					// from the palette into the editor
-    					// @see ShapesEditor#createTransferDropTargetListener()
-    					viewer
-    							.addDragSourceListener(new TemplateTransferDragSourceListener(
-    									viewer));
-    				}
-    			};
-    		}
-    	}
-    	return _paletteViewerProvider;
-    }
-
-    /**
-     * @return the palette viewer page
-     */
-    protected PaletteViewerPage createPaletteViewerPage() {
-        if (_paletteViewerPageFactory != null) {
-        	_paletteViewerPage = _paletteViewerPageFactory.createPaletteViewerPage(createPaletteViewerProvider());
-        } 
-        if (_paletteViewerPage == null) {
-            DefaultEditDomain editDomain = getEditDomain();
-//            PaletteItemManager manager = PaletteItemManager
-//                    .getInstance(getCurrentFile(getEditorInput()));
-//            manager.reset();
-            PaletteRoot paletteRoot = getPaletteRoot();
-            editDomain.setPaletteRoot(paletteRoot);
-            
-//            _paletteViewerPage = (PaletteViewerPage) super.getAdapter(PalettePage.class);
-            // if possible, try to use the 
-            if (_paletteViewerPage == null)
-            {
-                PaletteViewerProvider provider = getPaletteViewerProvider2();
-                _paletteViewerPage = new PaletteViewerPage(provider);
-            }
-        }
-    	return _paletteViewerPage;
-    }
-    
-    PaletteViewerProvider getPaletteViewerProvider2()
-    {
-        return getPaletteViewerProvider();
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.IDesignViewer#getGraphicViewer()
-	 */
-	public IHTMLGraphicalViewer getGraphicViewer() {
-		return _viewer;
-	}
-
-	/**
-	 * @return the html editor delegate
-	 */
-	public HTMLEditor getHTMLEditor() {
-		return _delegate;
-	}
-
-//	private IProject getCurrentProject(IEditorInput input) {
-//		IProject curProject = null;
-//		IFile inputFile = null;
-//		if (input instanceof IFileEditorInput) {
-//			inputFile = ((IFileEditorInput) input).getFile();
-//			curProject = inputFile.getProject();
-//		}
-//		return curProject;
-//	}
-
-	private IFile getCurrentFile(IEditorInput input) {
-		IFile inputFile = null;
-		if (input instanceof IFileEditorInput) {
-			inputFile = ((IFileEditorInput) input).getFile();
-		}
-		return inputFile;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (_viewer != null) {
-			GraphicalViewer viewerViewer = getGraphicalViewer();
-			if (viewerViewer != null && viewerViewer.getControl() != null
-					&& viewerViewer.getControl().isFocusControl()) {
-				updateActions(getSelectionActions());
-				if (selection instanceof IStructuredSelection && //
-						!(((IStructuredSelection) selection).getFirstElement() instanceof DocumentEditPart)) {
-					((IHTMLGraphicalViewer) viewerViewer)
-							.updateRangeSelection(selection);
-				}
-			}
-		} else {
-			super.selectionChanged(part, selection);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator#getDocument()
-	 */
-	public IDocument getDocument() {
-		if (_model != null) {
-			return _model.getStructuredDocument();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator#undoOperationSelectionChanged(org.eclipse.wst.sse.core.internal.undo.UndoDocumentEvent)
-	 */
-	public void undoOperationSelectionChanged(UndoDocumentEvent event) {
-		IDocumentSelectionMediator requester = event.getRequester();
-		if (this == requester) {
-			// ok, the undo/redo operation is initialized by designer page.
-			// we should set selection in designer.
-			// However, when this method is called, the modelChanged event is
-			// not fired yet, so the
-			// editpart hasn't refreshed yet. So we register a
-			// modelStateListener, and do the selection
-			// in modelChangedEvent. (lium)
-			final int offset = event.getOffset();
-			final int length = event.getLength();
-
-			_model.addModelStateListener(new IModelStateListener() {
-				public void modelAboutToBeChanged(IStructuredModel model) {
-                    // nothing to do
-				}
-
-				public void modelChanged(IStructuredModel model) {
-					_model.removeModelStateListener(this);
-					ISelection sel = SelectionHelper
-							.convertToDesignerSelection(getGraphicViewer(),
-									offset, length);
-					if (sel != null) {
-						getGraphicViewer().setSelection(sel);
-					}
-				}
-
-				public void modelDirtyStateChanged(IStructuredModel model,
-						boolean isDirty) {
-                    // do  nothing
-				}
-
-				public void modelResourceDeleted(IStructuredModel model) {
-                    // do nothign
-				}
-
-				public void modelResourceMoved(IStructuredModel oldModel,
-						IStructuredModel newModel) {
-                    // do nothing
-				}
-
-				public void modelAboutToBeReinitialized(
-						IStructuredModel structuredModel) {
-                    // do nothing
-				}
-
-				public void modelReinitialized(IStructuredModel structuredModel) {
-                    // do nothing
-				}
-			});
-		}
-	}
- 
-    private final class ContextMenuListener implements IMenuListener 
-    {
-        public void menuAboutToShow(IMenuManager menuMgr1) 
-        {
-            // add standarized sub-menus
-            addEditSubMenu(menuMgr1);
-            addSelectSubMenu(menuMgr1);
-            addInsertSubMenu(menuMgr1);
-            /*
-             * Bug 172959 - [WPE] WPE context menu Navigate->Java->Value doesn't work..
-             * 
-            addNavigateSubMenu(menuMgr1);
-            */
-            addStyleSubMenu(menuMgr1);
-            
-            // add separators that mark standard append locations in the main
-            // context menu
-            PageDesignerActionConstants.addStandardActionGroups(menuMgr1);
-
-            // TODO: Run/Debug?
-            
-            // insert ElementEdit contributed menu items
-            final ContainerActionGroup containerActionGroup = 
-                new ContainerActionGroup();
-            ActionContext context = new ActionContext(_viewer
-                    .getSelection());
-            context.setInput(_viewer);
-            containerActionGroup.setContext(context);
-            containerActionGroup.fillContextMenu(menuMgr1);
-            containerActionGroup.setContext(null);
-
-            // TODO: TableActionGroup
-
-            // if on a text context, (instead of a ElementEditPart),
-            // add text styling actions
-            final RangeActionGroup rangeActionGroup = new RangeActionGroup();
-            context = new ActionContext(_viewer.getSelection());
-            context.setInput(_viewer);
-            rangeActionGroup.setContext(context);
-            rangeActionGroup.fillContextMenu(menuMgr1);
-            rangeActionGroup.setContext(null);
-
-            // Add actions for single ElementEditPart's that are common
-            // to all
-            final SingleElementActionGroup singleActionGroup = 
-                new SingleElementActionGroup();
-            singleActionGroup.setContext(new ActionContext(_viewer
-                    .getSelection()));
-            singleActionGroup.fillContextMenu(menuMgr1);
-            singleActionGroup.setContext(null);
-
-            // add "Show In" actions...
-            final RelatedViewActionGroup viewMenu = new RelatedViewActionGroup(getEditDomain());
-            context = new ActionContext(_viewer.getSelection());
-            viewMenu.setContext(context);
-            viewMenu.fillContextMenu(menuMgr1);
-
-            // add extension point contributed menu actions
-            CustomedContextMenuActionGroup customedMenu = new CustomedContextMenuActionGroup();
-            customedMenu.setContext(new ActionContext(_viewer
-                    .getSelection()));
-            customedMenu.setModel(_model);
-            customedMenu.setParentControl(_viewer.getControl());
-            customedMenu.fillContextMenu(menuMgr1);
-            customedMenu.setContext(null);
-            customedMenu.setParentControl(null);
-            customedMenu.setModel(null);
-
-            //add skins menu
-            IEditorInput editorInput = _delegate.getEditorInput();
-			if (editorInput instanceof IFileEditorInput) {
-				IFile file = ((IFileEditorInput)editorInput).getFile();
-				IProject project = file.getProject();
-				if (project != null) {
-					SkinsMenuItemBuilder builder = new SkinsMenuItemBuilder(project);
-					builder.buildMenuManagers(menuMgr1);
-        }
-			}
-        }
-
-        /*
-         * Bug 172959 - [WPE] WPE context menu Navigate->Java->Value doesn't work..
-         * 
-        private void addNavigateSubMenu(IMenuManager menu) {
-            final IMenuManager  navigateSubmenu = 
-                new MenuManager(ActionsMessages.getString("Navigate.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.NAVIGATE_SUBMENU_ID);
-            menu.add(navigateSubmenu);
-            PageDesignerActionConstants.addStandardNavigateActionGroups(navigateSubmenu);
-        }
-         */
-
-        private void addEditSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  editSubmenu 
-                = new MenuManager(ActionsMessages.getString("Edit.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.EDIT_SUBMENU_ID);
-            menu.add(editSubmenu);
-            PageDesignerActionConstants.addStandardEditActionGroups(editSubmenu);
-            
-            // FIXME: for UNDO/REDO, maybe need also wrap them in
-            // DesignerCommand.
-            // otherwise don't have validate() called after the source
-            // change.
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_UNDO,
-                    getAction(IWorkbenchCommandConstants.EDIT_UNDO));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_UNDO,
-                    getAction(IWorkbenchCommandConstants.EDIT_REDO));
-
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchCommandConstants.EDIT_CUT));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchCommandConstants.EDIT_COPY));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchCommandConstants.EDIT_PASTE));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchCommandConstants.EDIT_DELETE));
-
-        }
-        
-        private void addStyleSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  styleSubmenu = 
-                new MenuManager(ActionsMessages.getString("Style.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.STYLE_SUBMENU_ID);
-            menu.add(styleSubmenu);
-            PageDesignerActionConstants.addStandardStyleActionGroups(styleSubmenu);
-        }
-        private void addInsertSubMenu(IMenuManager menu) {
-            final IMenuManager  insertSubmenu = 
-                new MenuManager(ActionsMessages.getString("Insert.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.INSERT_SUBMENU_ID);
-            menu.add(insertSubmenu);
-            PageDesignerActionConstants.addStandardInsertActionGroups(insertSubmenu);
-        }
-        
-        private void addSelectSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  selectSubMenu = 
-                new MenuManager(ActionsMessages.getString("Select.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.SELECT_SUBMENU_ID);
-            menu.add(selectSubMenu);
-            PageDesignerActionConstants.addStandardSelectActionGroups(selectSubMenu);
-        }
-    }
-
-    
-    /**
-     * @return the palette viewer page
-     */
-    public PaletteViewerPage getPaletteViewerPage() {
-        if (_paletteViewerPage == null) {
-        	_paletteViewerPage = createPaletteViewerPage();
-		}
-		return _paletteViewerPage;
-	}
-
-    /**
-     * @return the palette factory
-     */
-    protected IPaletteFactory initPaletteFactory()
-    {   	
-    	if (_paletteViewerPageFactory == null) {
-	        //List<IElementEditFactory> result = new ArrayList<IElementEditFactory>();
-	        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-	                .getExtensionPoint(PDPlugin.getPluginId(),
-	                        IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-	        IExtension[] extensions = extensionPoint.getExtensions();
-	
-	        for (int i = 0; i < extensions.length; i++)
-	        {
-	            IExtension ext = extensions[i];
-	            IConfigurationElement[] elementEditElement = ext
-	                    .getConfigurationElements();
-	
-	            for (int j = 0; j < elementEditElement.length; j++)
-	            {
-	                final IConfigurationElement element = elementEditElement[j];
-	                if (element.getName().equals(
-	                        IJMTConstants.PALETTE_FACTORY))
-	                {
-	                    elementEditElement[j].getAttribute("class"); //$NON-NLS-1$
-	                    Object obj;
-	                    try
-	                    {
-	                        obj = elementEditElement[j]
-	                                .createExecutableExtension("class"); //$NON-NLS-1$
-	
-	                        // TODO: we need a policy based solution here,
-	                        // but this will do for now
-	                        if (obj instanceof IPaletteFactory)
-	                        {
-	                        	_paletteViewerPageFactory = (IPaletteFactory) obj;
-	                        }
-	                    } 
-	                    catch (CoreException e)
-	                    {
-	                        PDPlugin.log("Problem loading element edit extension for "+element.toString(), e); //$NON-NLS-1$
-	                    }
-	                }
-	            }
-	        }
-    	}
-        return _paletteViewerPageFactory;
-    }
-//    
-//    @Override
-//	public Object getAdapter(Class type) {
-//    	if (type == PalettePage.class) {
-//    		return getPaletteViewerPage();
-//    	}
-//		return super.getAdapter(type);
-//	}
-
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java
deleted file mode 100644
index b5da948..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ActionsMessages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.editors.actions.ActionsMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private ActionsMessages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the resource for the key
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
deleted file mode 100644
index d57d3c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
+++ /dev/null
@@ -1,44 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-DesignActionBarFactory.Underline=Underline
-DesignActionBarFactory.Italic=Italic
-DesignActionBarFactory.Bold=Bold
-DesignActionBarFactory.Small=Small
-DesignActionBarFactory.Big=Big
-DesignActionBarFactory.Paragraph=Paragraph
-DesignActionBarFactory.Underline.Text=Underline
-DesignActionBarFactory.Italic.Text=Italic
-DesignActionBarFactory.Bold.Text=Bold
-DesignActionBarFactory.Small.Text=Small
-DesignActionBarFactory.Big.Text=Big
-PaletteViewAction.Menu.PaletteView=Palette
-RelatedViewActionGroup.Menu.ShowView=Show
-PropertiesViewAction.Menu.Properties=Properties
-DataBindingViewAction.Menu.DataBinding=DataBinding
-OutlineViewAction.Menu.OutlineView=Outline
-DesignerStyleActionGroup.CommandLabel.V=V
-DesignerStyleActionGroup.CommandLabel.H=H
-DesignerStyleActionGroup.CommandLabel.D=D
-DesignerStyleActionGroup.CommandLabel.S=S
-DesignerStyleActionGroup.CommandLabel.V.Tooltip=Show Design Page and Source Page as Horizontal Panes
-DesignerStyleActionGroup.CommandLabel.H.Tooltip=Show Design Page and Source Page as Vertical Panes
-DesignerStyleActionGroup.CommandLabel.D.Tooltip=Only Show Design Page
-DesignerStyleActionGroup.CommandLabel.S.Tooltip=Only Show Source Page
-DesignerUndoRedoAction.UNDO=Undo
-DesignerUndoRedoAction.REDO=Redo
-DesignerUndoRedoAction.UNDO_LABEL=Undo {0}
-DesignerUndoRedoAction.REDO_LABEL=Redo {0}
-Select.Menu=Select
-Edit.Menu=Edit
-Navigate.Menu=Navigate
-Style.Menu=Style
-Insert.Menu=Insert
-ManageSkinsAction.Text=Manage Skins
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java
deleted file mode 100644
index 70e5a68..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.commands.range.ApplyStyleCommand;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewerListenenerAdapter;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * @author mengbo
- */
-public abstract class ChangeStyleAction extends Action implements IUpdate {
-	private IHTMLGraphicalViewer _viewer;
-
-	private String _expectedTag;
-
-	private IHTMLGraphicalViewerListener _listener = new HTMLGraphicalViewerListenenerAdapter() 
-	{
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionChangeFinished()
-		 */
-		public void selectionChangeFinished() {
-			update();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-			update();
-		}
-	};
-
-	/**
-	 * @param text
-	 * @param name 
-	 * @param image
-	 * @param style 
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_expectedTag = name;
-		this.setImageDescriptor(image);
-	}
-
-	/**
-	 * @param viewer
-	 */
-	public void setViewer(IHTMLGraphicalViewer viewer) {
-		if (viewer == _viewer) {
-			return;
-		}
-		if (_viewer != null) {
-			_viewer.removeHTMLViewerListener(_listener);
-		}
-		_viewer = viewer;
-		if (_viewer != null) {
-			_viewer.addHTMLViewerListener(_listener);
-		}
-		update();
-	}
-
-	/**
-	 * 
-	 */
-	public void update() 
-	{
-	    boolean update = checkForUpdateAndMaybeDisableState();
-	    
-	    if (update)
-	    {
-	        updateState();
-	    }
-	}
-
-   /**
-    * Update the state 
-    */
-	protected void updateState()
-    {
-       DesignRange range = _viewer.getRangeSelection();
-       updateStatus(RangeUtil.normalize(range));
-    }
-
-	/**
-	 * Update the checked/enabled state
-	 * @return true if we should update status
-	 */
-	protected final boolean checkForUpdateAndMaybeDisableState()
-	{
-        if (_viewer == null) {
-            this.setChecked(false);
-            this.setEnabled(false);
-            return false;
-        }
-        if (!_viewer.isInRangeMode()) {
-            // XXX: later we may support in range mode.
-            this.setChecked(false);
-            this.setEnabled(false);
-            return false;
-        }
-        DesignRange range = _viewer.getRangeSelection();
-        if (range == null || !range.isValid()) {
-            this.setChecked(false);
-            this.setEnabled(false);
-            return false;
-        }
-        return true;
-	}
-	
-
-	/**
-	 * @return the viewer's current design range
-	 */
-	protected final DesignRange getDesignRange()
-	{
-	    return _viewer.getRangeSelection();
-	}
-	/**
-	 * @param range
-	 */
-	private void updateStatus(DesignRange range) {
-		if (range.isEmpty()) {
-			this.setEnabled(false);
-			this.setChecked(false); // FIXME: not handling checked status yet.
-		} else {
-			this.setEnabled(true);
-			this.setChecked(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (_viewer == null || !_viewer.isInRangeMode()) {
-			return;
-		}
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return;
-		}
-		if (range.isEmpty())
-			return; // nothing to do to empty range.
-
-		// if currently checked, means unapply the style. If current not
-		// checked, means apply the style
-		boolean apply = !this.isChecked();
-		if (apply) {
-			applyStyle();
-		} else {
-			// not supported yet.
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void applyStyle() {
-		DesignerCommand command = new ApplyStyleCommand(_viewer,
-				getExpectedTag(), getExpectedCSSProperty(),
-				getExpectedCSSPropertyValue());
-		command.execute();
-	}
-
-	/**
-	 * @return  the expected property value
-	 */
-	protected abstract String getExpectedCSSPropertyValue();
-
-	/**
-	 * @return  the expected property
-	 */
-	protected abstract String getExpectedCSSProperty();
-
-	/**
-	 * @return the expected tag
-	 */
-	protected String getExpectedTag() {
-		return _expectedTag;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DataBindingViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DataBindingViewAction.java
deleted file mode 100644
index 1b2032d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DataBindingViewAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataBindingViewAction extends Action {
-
-	private static Logger _log = PDPlugin
-			.getLogger(DataBindingViewAction.class);
-
-	/**
-	 * Default constructor
-	 */
-	public DataBindingViewAction() {
-		setText(ActionsMessages
-				.getString("DataBindingViewAction.Menu.DataBinding")); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		try {
-			getPage().showView(
-					"org.eclipse.jst.pagedesigner.databinding.ui.views.DataBindingsView");//$NON-NLS-1$
-		} catch (PartInitException e) {
-			_log.error("Error opening the DataBindingView"); //$NON-NLS-1$
-		}
-	}
-
-	private IWorkbenchPage getPage() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-		return window.getActivePage();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java
deleted file mode 100644
index 1a3c1b4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.range.ChangeStyleAction;
-import org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction;
-import org.eclipse.jst.pagedesigner.actions.range.HTagsInsertGroupAction;
-
-/**
- * @author mengbo
- */
-public class DesignActionBarFactory {
-	
-	private static final String TOOLBAR_PARAGRAPH_IMAGE_FILE = "PD_Toolbar_paragraph.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_LARGEFONT_DISABLED_IMAGE_FILE = "PD_Toolbar_largefont_disabled.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_LARGEFONT_IMAGE_FILE = "PD_Toolbar_largefont.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_SMALLFONT_DISABLED_IMAGE_FILE = "PD_Toolbar_smallfont_disabled.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_SMALLFONT_IMAGE_FILE = "PD_Toolbar_smallfont.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_BOLD_DISABLED_IMAGE_FILE = "PD_Toolbar_bold_disabled.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_BOLD_IMAGE_FILE = "PD_Toolbar_bold.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_ITALIC_DISABLED_IMAGE_FILE = "PD_Toolbar_italic_disabled.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_ITALIC_IMAGE_FILE = "PD_Toolbar_italic.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_UNDERLINE_DISABLED_IMAGE_FILE = "PD_Toolbar_underline_disabled.gif"; //$NON-NLS-1$
-	private static final String TOOLBAR_UNDERLINE_IMAGE_FILE = "PD_Toolbar_underline.gif"; //$NON-NLS-1$
-	
-	private static DesignActionBarFactory _instance;
-
-	private DesignActionBarFactory() {
-        // no external instantiation
-	}
-
-	/**
-	 * @return get the factory singleton
-	 */
-	public static DesignActionBarFactory getInstance() {
-		if (_instance == null) {
-			_instance = new DesignActionBarFactory();
-		}
-		return _instance;
-	}
-
-	/**
-	 * @param name
-	 * @return the tool bar action
-	 */
-	public DesignerToolBarAction getStyleAction(String name) {
-		DesignerToolBarAction action = null;
-
-		if (name.equals(IHTMLConstants.TAG_U)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Underline.Text"), name, //$NON-NLS-1$
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_UNDERLINE_IMAGE_FILE), PDPlugin.getDefault()
-							.getImageDescriptor(
-									TOOLBAR_UNDERLINE_DISABLED_IMAGE_FILE),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Underline")); //$NON-NLS-1$
-		} else if (name.equals(IHTMLConstants.TAG_I)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Italic.Text"), name, //$NON-NLS-1$
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_ITALIC_IMAGE_FILE), PDPlugin.getDefault()
-							.getImageDescriptor(
-									TOOLBAR_ITALIC_DISABLED_IMAGE_FILE),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Italic")); //$NON-NLS-1$
-		} else if (name.equals(IHTMLConstants.TAG_B)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Bold.Text"), name, //$NON-NLS-1$
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_BOLD_IMAGE_FILE),
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_BOLD_DISABLED_IMAGE_FILE),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Bold")); //$NON-NLS-1$
-		} else if (name.equals(IHTMLConstants.TAG_SMALL)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Small.Text"), name, //$NON-NLS-1$
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_SMALLFONT_IMAGE_FILE), PDPlugin.getDefault()
-							.getImageDescriptor(
-									TOOLBAR_SMALLFONT_DISABLED_IMAGE_FILE),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Small")); //$NON-NLS-1$
-		} else if (name.equals(IHTMLConstants.TAG_BIG)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Big.Text"), name, //$NON-NLS-1$
-					PDPlugin.getDefault().getImageDescriptor(
-							TOOLBAR_LARGEFONT_IMAGE_FILE), PDPlugin.getDefault()
-							.getImageDescriptor(
-									TOOLBAR_LARGEFONT_DISABLED_IMAGE_FILE),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Big")); //$NON-NLS-1$
-		} else if (name
-				.equalsIgnoreCase(DesignPageActionContributor.PARAGRAPH_ACTION_ID)) {
-			action = new HTagsInsertGroupAction(PDPlugin.getDefault()
-					.getImageDescriptor(TOOLBAR_PARAGRAPH_IMAGE_FILE),
-					IAction.AS_DROP_DOWN_MENU);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Paragraph")); //$NON-NLS-1$
-		}
-
-		return action;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java
deleted file mode 100644
index a1782ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.IDesignViewer;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchCommandConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-
-/**
- * sub action contributor for the designer page.
- * 
- * @author mengbo
- */
-public class DesignPageActionContributor extends EditorActionBarContributor {
-	private static final Logger _log = PDPlugin
-			.getLogger(DesignPageActionContributor.class);
-
-	/**
-	 * paragraph
-	 */
-	public static final String PARAGRAPH_ACTION_ID = "paragraph"; //$NON-NLS-1$
-
-	private IEditorPart _editorPart;
-
-	/**
-	 * @param manager
-	 * @param id
-	 */
-	protected void doRemove(IContributionManager manager, String id) {
-		try {
-			if (manager.find(id) != null) {
-				manager.remove(id);
-			}
-		} catch (Exception e) {
-			_log.info("Error:", e); //$NON-NLS-1$
-		}
-	}
-
-	public void init(IActionBars bars, IWorkbenchPage page) {
-		super.init(bars);
-		init(bars);
-	}
-
-	public void init(IActionBars bars) {
-		IToolBarManager toolbar = bars.getToolBarManager();
-		initToolbar(toolbar);
-	}
-
-	/**
-	 * @param toolbar
-	 */
-	private void initToolbar(IToolBarManager toolbar) {
-		DesignActionBarFactory factory = DesignActionBarFactory.getInstance();
-
-		Action action = factory.getStyleAction(IHTMLConstants.TAG_U);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_B);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_I);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_SMALL);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_BIG);
-		toolbar.add(action);
-		// action = factory.getStyleAction(PARAGRAPH_ACTION_ID);
-		// toolbar.add(action);
-	}
-
-	/**
-	 * @param menuManager
-	 * @param action
-	 * @param id
-	 */
-	protected void addActionWithId(IMenuManager menuManager, Action action,
-			String id) {
-		action.setId(id);
-		menuManager.add(action);
-	}
-
-	/**
-	 * @param enabled
-	 */
-	public void setViewerSpecificContributionsEnabled(boolean enabled) {
-		HTMLEditor htmlEditor = null;
-		if (_editorPart instanceof HTMLEditor) {
-			htmlEditor = (HTMLEditor) _editorPart;
-		} else if (_editorPart instanceof SimpleGraphicalEditor) {
-			htmlEditor = ((SimpleGraphicalEditor) _editorPart).getHTMLEditor();
-		}
-
-		if (htmlEditor == null)
-			return;
-
-		SimpleGraphicalEditor graphicalEditor = (SimpleGraphicalEditor) htmlEditor
-				.getDesignViewer();
-		IWorkbenchPartSite site = htmlEditor.getSite();
-		if (site instanceof IEditorSite) {
-			IActionBars actionBars = ((IEditorSite) site).getActionBars();
-
-			if (enabled) {
-				// // we always let the text editor to handle UNDO and REDO
-				// actionBars.setGlobalActionHandler(ITextEditorActionConstants.UNDO,
-				// textEditor
-				// .getAction(ITextEditorActionConstants.UNDO));
-				// actionBars.setGlobalActionHandler(ITextEditorActionConstants.REDO,
-				// textEditor
-				// .getAction(ITextEditorActionConstants.REDO));
-				// lium: the above behavior changed, since we now use
-				// DesignerUndoRedoAction.
-				// see comments in DesignerUndoRedoAction
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, graphicalEditor
-								.getAction(IWorkbenchCommandConstants.EDIT_UNDO));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, graphicalEditor
-								.getAction(IWorkbenchCommandConstants.EDIT_REDO));
-
-				// cut/copy/paste is delegated to design actions
-				actionBars
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.DELETE,
-								graphicalEditor
-										.getAction(IWorkbenchCommandConstants.EDIT_DELETE));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.CUT, graphicalEditor
-								.getAction(IWorkbenchCommandConstants.EDIT_CUT));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.COPY, graphicalEditor
-								.getAction(IWorkbenchCommandConstants.EDIT_COPY));
-				actionBars
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.PASTE,
-								graphicalEditor
-										.getAction(IWorkbenchCommandConstants.EDIT_PASTE));
-			} else {
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, null);
-
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.DELETE, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.CUT, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.COPY, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.PASTE, null);
-			}
-		}
-	}
-
-	/**
-	 * The active editor passed in could be the following: HTMLEditor,
-	 * SimpleGraphicalEditor, null.
-	 */
-	public void setActiveEditor(IEditorPart targetEditor) {
-		_editorPart = targetEditor;
-
-		// temp code.
-		if (targetEditor instanceof SimpleGraphicalEditor) {
-			IHTMLGraphicalViewer graphicalViewer = ((SimpleGraphicalEditor) targetEditor).getGraphicViewer();
-			setViewerOnActions(graphicalViewer);
-		} else if (targetEditor instanceof HTMLEditor) {
-			//Bug 264080 - getDesignViewer may return null
-			IDesignViewer designViewer = ((HTMLEditor) targetEditor).getDesignViewer();
-			if (designViewer != null) {
-				IHTMLGraphicalViewer graphicalViewer = designViewer.getGraphicViewer();
-				setViewerOnActions(graphicalViewer);
-			}
-		} else {
-			setViewerOnActions(null);
-		}
-
-		// TODO... uncomment this and investigate NPE
-		//
-		// add the cut/copy/paste for text fields
-		// ActionHandlerPlugin.connectPart(editorPart);
-	}
-
-	private void setViewerOnActions(IHTMLGraphicalViewer viewer) {
-		IContributionItem[] items = getActionBars().getToolBarManager()
-				.getItems();
-		if (items != null) {
-			for (int i = 0; i < items.length; i++) {
-				if (items[i] instanceof ActionContributionItem) {
-					IAction action = ((ActionContributionItem) items[i])
-							.getAction();
-					if (action instanceof DesignerToolBarAction) {
-						((DesignerToolBarAction) action).setViewer(viewer);
-					}
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorActionBarContributor#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java
deleted file mode 100644
index 6c121df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.commands.ActionHandler;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DesignerStyleActionGroup extends ActionGroup
-{
-	private static HashMap IMAGE_NAMES = new HashMap();
-
-	private static final String VERTICAL = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.V"); //$NON-NLS-1$
-
-	private static final String HORIZONTAL = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.H"); //$NON-NLS-1$
-
-	private static final String DESIGN = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.D"); //$NON-NLS-1$
-
-	private static final String SOURCE = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.S"); //$NON-NLS-1$
-
-	private static final String VERTICAL_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.V.Tooltip"); //$NON-NLS-1$
-
-	private static final String HORIZONTAL_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.H.Tooltip"); //$NON-NLS-1$
-
-	private static final String DESIGN_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.D.Tooltip"); //$NON-NLS-1$
-
-	private static final String SOURCE_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.S.Tooltip"); //$NON-NLS-1$
-	static {
-		IMAGE_NAMES.put(VERTICAL, "PD_Toolbar_vsplit.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(HORIZONTAL, "PD_Toolbar_hsplit.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(DESIGN, "PD_Toolbar_designer.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(SOURCE, "PD_Toolbar_source.gif"); //$NON-NLS-1$
-	}
-
-    private class ChangeDesignerStyleAction extends Action {
-		int _mode;
-
-		ChangeDesignerStyleAction(String actionId, String text, ImageDescriptor image, int mode) {
-			super(text, IAction.AS_RADIO_BUTTON);
-			this.setImageDescriptor(image);
-			_mode = mode;
-			setId(actionId);
-		}
-
-		/**
-		 * @return the mode
-		 */
-		public int getMode() {
-			return _mode;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-		    //final IWorkbenchPart editorPart = getActivePart();
-			if (_htmlEditor != null) {
-			    _htmlEditor.setDesignerMode(_mode);
-				updateActionBars();
-			}
-		}
-
-	};
-
-	private HTMLEditor _htmlEditor;
-
-	private final ChangeDesignerStyleAction[] _actions;
-
-    private final  List<ActionHandler> _actionHandlers;
-    
-    private final List<IHandlerActivation>    _handlers;
-
-    /**
-     * constructor
-     */
-    public DesignerStyleActionGroup()
-	{
-		ChangeDesignerStyleAction verAction = new ChangeDesignerStyleAction(
-		        "org.eclipse.jst.pagedesigner.vertical", //$NON-NLS-1$
-		        VERTICAL, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(VERTICAL)),
-				HTMLEditor.MODE_SASH_VERTICAL);
-		verAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.vertical"); //$NON-NLS-1$
-		verAction.setToolTipText(VERTICAL_TOOLTIP);
-
-		ChangeDesignerStyleAction horAction = new ChangeDesignerStyleAction(
-		        "org.eclipse.jst.pagedesigner.horizotal", //$NON-NLS-1$
-				HORIZONTAL, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(HORIZONTAL)),
-				HTMLEditor.MODE_SASH_HORIZONTAL);
-		horAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.horizotal"); //$NON-NLS-1$
-		horAction.setToolTipText(HORIZONTAL_TOOLTIP);
-
-		ChangeDesignerStyleAction designAction = new ChangeDesignerStyleAction(
-		        "org.eclipse.jst.pagedesigner.design", //$NON-NLS-1$
-				DESIGN, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(DESIGN)),
-				HTMLEditor.MODE_DESIGNER);
-		designAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.design"); //$NON-NLS-1$
-		designAction.setToolTipText(DESIGN_TOOLTIP);
-
-		ChangeDesignerStyleAction sourceAction = new ChangeDesignerStyleAction(
-		        "org.eclipse.jst.pagedesigner.source", //$NON-NLS-1$
-				SOURCE, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(SOURCE)),
-				HTMLEditor.MODE_SOURCE);
-		sourceAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.source"); //$NON-NLS-1$
-		sourceAction.setToolTipText(SOURCE_TOOLTIP);
-
-		_actions = new ChangeDesignerStyleAction[] { verAction, horAction,
-				designAction, sourceAction };
-        _actionHandlers = new ArrayList<ActionHandler>();
-		for (int i = 0; i < _actions.length; i++)
-		{
-	        _actionHandlers.add(new ActionHandler(_actions[i]));
-		}
-		_handlers = new ArrayList<IHandlerActivation>();
-	}
-
-
-	public void updateActionBars() {
-		if (_htmlEditor == null) {
-			for (int i = 0; i < _actions.length; i++) {
-				_actions[i].setEnabled(false);
-			}
-		} else {
-			for (int i = 0; i < _actions.length; i++) {
-				_actions[i].setEnabled(true);
-				_actions[i].setChecked(_actions[i].getMode() == _htmlEditor
-						.getDesignerMode());
-			}
-		}
-	}
-
-    /**
-     * @param editor
-     */
-    public void setHTMLEditor(HTMLEditor editor)
-    {
-        if (_htmlEditor != editor)
-        {
-            if (_htmlEditor != null)
-            {
-                deactivateHandlers();
-            }
-
-            this._htmlEditor = editor;
-            if (_htmlEditor != null)
-            {
-                activateHandlers();
-            }
-            updateActionBars();
-        }
-    }
-
-    private void deactivateHandlers()
-    {
-        final IHandlerService service = (IHandlerService) _htmlEditor.getSite()
-                .getService(IHandlerService.class);
-        if (service != null)
-        {
-            for (final IHandlerActivation activation : _handlers)
-            {
-                service.deactivateHandler(activation);
-            }
-        }
-        _handlers.clear();
-    }
-
-    private void activateHandlers()
-    {
-        final IHandlerService service = (IHandlerService) _htmlEditor.getSite()
-                .getService(IHandlerService.class);
-        for (int i = 0; i < _actions.length; i++)
-        {
-            _handlers.add(service.activateHandler(_actions[i].getId(), _actionHandlers.get(i)));
-        }
-    }
-
-    /**
-     * @param actionBars
-     */
-    public void fillActionBars(IActionBars actionBars)
-    {
-        IToolBarManager toolbar = actionBars.getToolBarManager();
-        for (int i = 0; i < _actions.length; i++)
-        {
-            toolbar.add(_actions[i]);
-        }
-        toolbar.add(new Separator());
-    }
-
-    /**
-     * dispose the action
-     */
-    public void dispose()
-    {
-        for (final ActionHandler actionHandler : _actionHandlers)
-        {
-            actionHandler.dispose();
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java
deleted file mode 100644
index 3d563ac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.text.MessageFormat;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
-
-/**
- * SSE has a IDocumentSelectionMediator mechanism, basically it let the viewer
- * that invoke the redo/undo to reset the selection after redo/undo.
- * 
- * To utilize this feature, we can't directly use the undo/redo action of the
- * text editor for the designer, since in that way it will be the TextEditor to
- * handle selection after redo/undo.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DesignerUndoRedoAction extends Action implements UpdateAction {
-	private boolean _undo = true; // if false means redo
-
-	private final SimpleGraphicalEditor _designer;
-
-	/**
-	 * @param undo 
-	 * @param designer 
-	 * 
-	 */
-	public DesignerUndoRedoAction(boolean undo, SimpleGraphicalEditor designer) {
-		this._undo = undo;
-		this._designer = designer;
-
-		if (undo) {
-			setText(ActionsMessages.getString("DesignerUndoRedoAction.UNDO")); //$NON-NLS-1$
-		} else {
-			setText(ActionsMessages.getString("DesignerUndoRedoAction.REDO")); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		IStructuredTextUndoManager undoManager = _designer.getHTMLEditor()
-				.getModel().getUndoManager();
-		if (_undo) {
-			Command c = undoManager.getUndoCommand();
-			this.setEnabled(undoManager.undoable());
-			if (c != null) {
-				String label = c.getLabel();
-				this
-						.setText(MessageFormat
-								.format(
-										ActionsMessages
-												.getString("DesignerUndoRedoAction.UNDO_LABEL"), new Object[] { label })); //$NON-NLS-1$
-			} else {
-				this.setText(ActionsMessages
-						.getString("DesignerUndoRedoAction.UNDO")); //$NON-NLS-1$
-			}
-		} else {
-			Command c = undoManager.getRedoCommand();
-			this.setEnabled(undoManager.redoable());
-			if (c != null) {
-				String label = c.getLabel();
-				this
-						.setText(MessageFormat
-								.format(
-										ActionsMessages
-												.getString("DesignerUndoRedoAction.REDO_LABEL"), new Object[] { label })); //$NON-NLS-1$
-			} else {
-				this.setText(ActionsMessages
-						.getString("DesignerUndoRedoAction.REDO")); //$NON-NLS-1$
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		IStructuredTextUndoManager undoManager = _designer.getHTMLEditor()
-				.getModel().getUndoManager();
-		if (_undo) {
-			undoManager.undo(_designer);
-		} else {
-			undoManager.redo(_designer);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ManageSkinsAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ManageSkinsAction.java
deleted file mode 100644
index 4a9a79d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ManageSkinsAction.java
+++ /dev/null
@@ -1,181 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.dialogs.PropertyDialogAction;
-import org.eclipse.ui.internal.Workbench;
-
-/**
- * Action to change the current DT skin.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ManageSkinsAction extends Action {
-
-	/**
-	 * Constructs an instance.
-	 */
-	public ManageSkinsAction() {
-		super(ActionsMessages.getString("ManageSkinsAction.Text"), AS_DROP_DOWN_MENU); //$NON-NLS-1$
-		setImageDescriptor(PDPlugin.getDefault().getImageDescriptor("skin.png")); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	@Override
-	public void run() {
-		IEditorPart editorPart = Workbench.getInstance().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-		if (editorPart instanceof HTMLEditor) {
-			IEditorInput editorInput = editorPart.getEditorInput();
-			if (editorInput instanceof IFileEditorInput) {
-				IFile file = ((IFileEditorInput)editorInput).getFile();
-				IProject project = file.getProject();
-				if (project != null) {
-					SelectionProvider selectionProvider = new SelectionProvider();
-					selectionProvider.setSelection(new StructuredSelection(project));
-			        PropertyDialogAction propertyDialogAction = new PropertyDialogAction(editorPart.getEditorSite(), selectionProvider);
-			        PreferenceDialog dialog = propertyDialogAction.createDialog();
-			        if (dialog != null) {
-			        	dialog.setSelectedNode("org.eclipse.jst.pagedesigner.WPEPropertyPage"); //$NON-NLS-1$
-			        	//yes, we create AGAIN - cannot find another way to get the selected node to stick
-			        	dialog = propertyDialogAction.createDialog();
-			        	if (dialog != null) {
-			        		dialog.open();
-			        	}
-			        }
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getMenuCreator()
-	 */
-	@Override
-	public IMenuCreator getMenuCreator() {
-		return new MenuCreator();
-	}
-
-
-
-	/**
-	 * Simple selection provider for creation of the property dialog.
-	 */
-	private class SelectionProvider implements ISelectionProvider {
-		private ISelection selection;
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-		 */
-		public void addSelectionChangedListener(ISelectionChangedListener listener) {
-			//do nothing - we don't care here
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
-		 */
-		public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-			//do nothing - we don't care here
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
-		 */
-		public void setSelection(ISelection selection) {
-			this.selection = selection;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
-		 */
-		public ISelection getSelection() {
-			return selection;
-		}
-	}
-
-
-
-	/**
-	 * Store last created menu so we can dispose on next creation.
-	 */
-	private static Menu lastMenu;
-	/**
-	 * Menu creator for the drop-down button.
-	 */
-	private class MenuCreator implements IMenuCreator {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-		 */
-		public void dispose() {
-			if (lastMenu != null) {
-				lastMenu.dispose();
-			}
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-		 */
-		public Menu getMenu(Control control) {
-			dispose();
-			lastMenu = new Menu(control);
-			buildMenu(lastMenu);
-			return lastMenu;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-		 */
-		public Menu getMenu(Menu menu) {
-			dispose();
-			lastMenu = new Menu(menu);
-			buildMenu(lastMenu);
-			return lastMenu;
-		}
-		private void buildMenu(Menu menu) {
-			MenuItem menuItem = new MenuItem(lastMenu, SWT.PUSH);
-			menuItem.setText(ActionsMessages.getString("ManageSkinsAction.Text")); //$NON-NLS-1$
-			menuItem.addSelectionListener(new SelectionListener() {
-				public void widgetSelected(SelectionEvent event) {
-					run();
-				}
-				public void widgetDefaultSelected(SelectionEvent event) {
-					widgetSelected(event);
-				}
-			});
-			IEditorPart editorPart = Workbench.getInstance().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-			if (editorPart instanceof HTMLEditor) {
-				IEditorInput editorInput = editorPart.getEditorInput();
-				if (editorInput instanceof IFileEditorInput) {
-					IFile file = ((IFileEditorInput)editorInput).getFile();
-					IProject project = file.getProject();
-					if (project != null) {
-						SkinsMenuItemBuilder skinsMenuItemBuilder =
-							new SkinsMenuItemBuilder(project);
-						skinsMenuItemBuilder.buildMenuItems(menu);
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java
deleted file mode 100644
index b22073e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.ui.IPageLayout;
-
-/**
- * A show view action that shows the outline view
- *
- */
-public class OutlineViewAction extends ShowViewAction 
-{
-    /**
-     * the action id
-     */
-    public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.OutlineViewAction"; //$NON-NLS-1$
-
-    /**
-     * Default constructor
-     */
-    public OutlineViewAction() 
-    {
-        super(ActionsMessages
-                .getString("OutlineViewAction.Menu.OutlineView") //$NON-NLS-1$
-              , IPageLayout.ID_OUTLINE);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java
deleted file mode 100644
index b081c16..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.jst.pagedesigner.ui.common.sash.NestedEditorActionBarContributor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorActionBuilder;
-import org.eclipse.wst.sse.ui.internal.IExtendedContributor;
-import org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor;
-
-/**
- * This is the actionbar contributor for HTML Editor. As HTMLEditor is
- * multipaged, so this contributor will also handle on which page currently is
- * activated.
- * 
- * @author mengbo
- */
-public class PageDesignerActionBarContributor2 extends
-		NestedEditorActionBarContributor implements IExtendedContributor {
-
-	private DesignPageActionContributor _designViewerActionBarContributor = null;
-
-	private ISourceViewerActionBarContributor _sourceViewerActionContributor = null;
-
-	private HTMLEditor _htmlEditor = null;
-
-	// EditorExtension
-	private static final String EDITOR_ID = IJMTConstants.EDITORID_HTML;
-
-	private IExtendedContributor _extendedContributor;
-
-	private DesignerStyleActionGroup _group = new DesignerStyleActionGroup();
-
-	/**
-	 * Default constructor
-	 */
-	public PageDesignerActionBarContributor2() {
-		super();
-
-		_sourceViewerActionContributor = new SourcePageActionContributor();
-		_designViewerActionBarContributor = new DesignPageActionContributor();
-
-		// Read action extensions.
-		ExtendedEditorActionBuilder builder = new ExtendedEditorActionBuilder();
-		_extendedContributor = builder.readActionExtensions(EDITOR_ID);
-	}
-
-	public void init(IActionBars actionBars) {
-		super.init(actionBars);
-
-		if (actionBars != null) {
-			initCommonActionBarContributor(actionBars);
-			actionBars.getToolBarManager().add(new ManageSkinsAction());
-			actionBars.getToolBarManager().add(new Separator());
-			initDesignViewerActionBarContributor(actionBars);
-			initSourceViewerActionContributor(actionBars);
-		}
-	}
-
-	/**
-	 * @param actionBars
-	 */
-	private void initCommonActionBarContributor(IActionBars actionBars) {
-		_group.fillActionBars(actionBars);
-	}
-
-	/**
-	 * @param actionBars
-	 */
-	protected void initDesignViewerActionBarContributor(IActionBars actionBars) {
-		if (_designViewerActionBarContributor != null)
-			_designViewerActionBarContributor.init(actionBars, getPage());
-	}
-
-	/**
-	 * @param actionBars
-	 */
-	protected void initSourceViewerActionContributor(IActionBars actionBars) {
-		if (_sourceViewerActionContributor != null)
-			_sourceViewerActionContributor.init(actionBars, getPage());
-	}
-
-	public void dispose() {
-		super.dispose();
-		if (_designViewerActionBarContributor != null) {
-			_designViewerActionBarContributor.dispose();
-		}
-		if (_sourceViewerActionContributor != null) {
-			_sourceViewerActionContributor.dispose();
-		}
-		if (_extendedContributor != null) {
-			_extendedContributor.dispose();
-		}
-		if (_group != null) {
-			_group.dispose();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(IMenuManager)
-	 */
-	public final void contributeToMenu(IMenuManager menu) {
-		super.contributeToMenu(menu);
-		addToMenu(menu);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToMenu(menu);
-	}
-
-	private void addToMenu(IMenuManager menu) {
-		// IMenuManager menuMgr = new MenuManager(PD_EDITOR_MENU_LABEL,
-		// IJMTConstants.PD_EDITOR_MENU_ID);
-		// menu.insertBefore(IWorkbenchActionConstants.M_NAVIGATE, menuMgr);
-		//
-		// menuMgr.add(action);
-		// menuMgr.setRemoveAllWhenShown(true);
-		//
-		// menuMgr.addMenuListener(new IMenuListener()
-		// {
-		// public void menuAboutToShow(IMenuManager menuMgr)
-		// {
-		// PageDesignerActionConstants.addStandardActionGroups(menuMgr);
-		// RelatedViewActionGroup viewMenu = new RelatedViewActionGroup();
-		// viewMenu.fillContextMenu(menuMgr);
-		// updateEditorMenu(menuMgr);
-		// }
-		// });
-	}
-
-	/**
-	 * @see IExtendedContributor#contributeToPopupMenu(IMenuManager)
-	 */
-	public final void contributeToPopupMenu(IMenuManager menu) {
-		// TODO: this method is empty addToPopupMenu(menu);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToPopupMenu(menu);
-	}
-
-//	protected void addToPopupMenu(IMenuManager menu) {
-//        // do nothing
-//	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(IToolBarManager)
-	 */
-	public final void contributeToToolBar(IToolBarManager toolBarManager) {
-		super.contributeToToolBar(toolBarManager);
-		// TODO: this method is empty addToToolBar(toolBarManager);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToToolBar(toolBarManager);
-	}
-
-//	protected void addToToolBar(IToolBarManager toolBarManager) {
-//	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToStatusLine(IStatusLineManager)
-	 */
-	public final void contributeToStatusLine(IStatusLineManager manager) {
-		super.contributeToStatusLine(manager);
-		// TODO: this method does nothing addToStatusLine(manager);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToStatusLine(manager);
-	}
-
-//	protected void addToStatusLine(IStatusLineManager manager) {
-//	}
-
-	/**
-	 * @see IExtendedContributor#updateToolbarActions()
-	 */
-	public void updateToolbarActions() {
-		if (_extendedContributor != null) {
-			_extendedContributor.updateToolbarActions();
-		}
-		_group.setHTMLEditor(_htmlEditor);
-	}
-
-	public void setActiveEditor(IEditorPart targetEditor) {
-		if (targetEditor instanceof HTMLEditor) {
-			_htmlEditor = (HTMLEditor) targetEditor;
-			//StructuredTextEditor textEditor = _htmlEditor.getTextEditor();
-			// TODO: never read this._model = textEditor.getModel();
-		}
-		super.setActiveEditor(targetEditor);
-		updateToolbarActions();
-		if (_extendedContributor != null)
-			_extendedContributor.setActiveEditor(targetEditor);
-	}
-
-	public void setInnerActivePage(IEditorPart activeEditor) {
-		// This contributor is designed for StructuredTextMultiPageEditorPart.
-		// To safe-guard this from problems caused by unexpected usage by
-		// other editors, the following
-		// check is added.
-		if (_htmlEditor != null) {
-			if (activeEditor instanceof StructuredTextEditor) {
-				activateSourcePage((StructuredTextEditor) activeEditor);
-			} else if (activeEditor instanceof SimpleGraphicalEditor) {
-				//SimpleGraphicalEditor graphEditor = (SimpleGraphicalEditor) activeEditor;
-				activateDesignPage((SimpleGraphicalEditor) activeEditor);
-				// TODO: never read this._viewer = graphEditor.getGraphicViewer();
-			} else {
-				// currently we don't have special action for preview.
-				deactivateSourceAndDesignPage(activeEditor);
-				// TODO: never read this._viewer = null;
-			}
-		}
-
-		updateToolbarActions();
-
-		IActionBars actionBars = getActionBars();
-		if (actionBars != null) {
-			// update menu bar and tool bar
-			actionBars.updateActionBars();
-		}
-	}
-
-	/**
-	 * @param activeEditor 
-	 * 
-	 */
-	protected void deactivateSourceAndDesignPage(IEditorPart activeEditor) {
-		if (_designViewerActionBarContributor != null) {
-			_designViewerActionBarContributor.setActiveEditor(_htmlEditor);
-			_designViewerActionBarContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-		if (_sourceViewerActionContributor != null) {
-			_sourceViewerActionContributor.setActiveEditor(_htmlEditor);
-			_sourceViewerActionContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-	}
-
-	/**
-	 * @param activeEditor
-	 */
-	protected void activateDesignPage(SimpleGraphicalEditor activeEditor) {
-
-		if (_sourceViewerActionContributor != null /*
-													 * &&
-													 * _sourceViewerActionContributor
-													 * instanceof
-													 * ISourceViewerActionBarContributor
-													 */) {
-			// previously I was trying setActiveEditor(null) here. But as in the
-			// super class will
-			// compare the editor with original one, if same then directly
-			// return. So will not disable
-			// those actions. (lium)
-			_sourceViewerActionContributor.setActiveEditor(_htmlEditor);
-			_sourceViewerActionContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-
-		if (_designViewerActionBarContributor != null) {
-			_designViewerActionBarContributor.setActiveEditor(activeEditor);
-			_designViewerActionBarContributor
-					.setViewerSpecificContributionsEnabled(true);
-		}
-	}
-
-	/**
-	 * @param activeEditor
-	 */
-	protected void activateSourcePage(StructuredTextEditor activeEditor) {
-		if (_designViewerActionBarContributor != null /*
-														 * &&
-														 * _designViewerActionBarContributor
-														 * instanceof
-														 * IDesignViewerActionBarContributor
-														 */) {
-			// _designViewerActionBarContributor only recogonize HTMLEditor and
-			// its own GraphicEditor. so not setting source editor to it.
-			_designViewerActionBarContributor.setActiveEditor(_htmlEditor);
-			_designViewerActionBarContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-
-		if (_sourceViewerActionContributor != null /*
-													 * &&
-													 * _sourceViewerActionContributor
-													 * instanceof
-													 * ISourceViewerActionBarContributor
-													 */) {
-			_sourceViewerActionContributor.setActiveEditor(activeEditor);
-			_sourceViewerActionContributor.setViewerSpecificContributionsEnabled(true);
-		}
-	}
-
-    // TODO: dead?
-//	private void updateEditorMenu(IMenuManager menuMgr) {
-//		if (this._viewer == null) {
-//			return;
-//		} else {
-//			if (menuMgr != null) {
-//				ContainerActionGroup containerActionGroup = new ContainerActionGroup();
-//				ActionContext context = new ActionContext(this._viewer
-//						.getSelection());
-//				context.setInput(this._viewer);
-//				containerActionGroup.setContext(context);
-//				containerActionGroup.fillContextMenu(menuMgr);
-//				containerActionGroup.setContext(null);
-//
-//				RangeActionGroup rangeActionGroup = new RangeActionGroup();
-//				context = new ActionContext(this._viewer.getSelection());
-//				context.setInput(this._viewer);
-//				rangeActionGroup.setContext(context);
-//				rangeActionGroup.fillContextMenu(menuMgr);
-//				rangeActionGroup.setContext(null);
-//
-//				SingleElementActionGroup singleActionGroup = new SingleElementActionGroup();
-//				singleActionGroup.setContext(new ActionContext(this._viewer
-//						.getSelection()));
-//				singleActionGroup.fillContextMenu(menuMgr);
-//				singleActionGroup.setContext(null);
-//
-//				if (this._model != null) {
-//					CustomedContextMenuActionGroup customedMenu = new CustomedContextMenuActionGroup();
-//					customedMenu.setContext(new ActionContext(_viewer
-//							.getSelection()));
-//					customedMenu.setModel(_model);
-//					customedMenu.setParentControl(_viewer.getControl());
-//					customedMenu.fillContextMenu(menuMgr);
-//					customedMenu.setContext(null);
-//					customedMenu.setParentControl(null);
-//					customedMenu.setModel(null);
-//				}
-//			}
-//		}
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PaletteViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PaletteViewAction.java
deleted file mode 100644
index 45cd989..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PaletteViewAction.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.ui.views.palette.PaletteView;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PaletteViewAction extends ShowViewAction {
-	/**
-	 * the action id
-	 */
-	public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.PaletteViewAction"; //$NON-NLS-1$
-    
-	/**
-	 * @param element
-	 * @param editDomain
-	 */
-	public PaletteViewAction(Element element, EditDomain editDomain) {
-        super(ActionsMessages.getString("PaletteViewAction.Menu.PaletteView") //$NON-NLS-1$
-                , PaletteView.ID);
-        //_element = element;
-        //_editDomain = editDomain;
-	}
-    
-    /** 
-     * Add to default behavior because pallete view doesn't automatically track
-     * selection to currently selected edit part
-     */
-    public void run()
-    {
-        super.run();
-        
-        //TODO: for some reason getting a palette item to select doesn't work
-//        if (_element != null && _editDomain != null)
-//        {
-//            PaletteItemManager manager = PaletteItemManager
-//                                          .getInstance(getProject(_element));
-//            if (manager != null) {
-//                IPaletteItemCategory category = manager.findOrCreateCategory(CMUtil
-//                        .getElementNamespaceURI(_element), null);
-//                
-//              if (category != null) {
-//                  String name = _element.getLocalName();
-//                  if (category.getURI().equals(IJMTConstants.URI_JSP)) {
-//                      name = _element.getTagName();
-//                  }
-//                  IPaletteItemDescriptor descriptor = category
-//                      .getItemByTagName(name);
-//                  if (descriptor != null)
-//                  {
-//                      PaletteEntry paletteEntry = descriptor.getPaletteEntry();
-//                      final RootEditPart editPart = 
-//                          _editDomain.getPaletteViewer().getRootEditPart();
-//                      EditPart newSelection = findMatchingPart(editPart.getContents(), paletteEntry);
-//
-//                      if (newSelection != null)
-//                      {
-//                          _editDomain.getPaletteViewer().setSelection(new StructuredSelection(newSelection));
-//                      }
-//                   }
-//                }
-//            }
-//        }
-    }
-    
-//    private EditPart findMatchingPart(EditPart curPart, PaletteEntry paletteEntry)
-//    {
-//        EditPart match = null;
-//
-//        if (curPart.getModel() == paletteEntry)
-//        {
-//            return curPart;
-//        }
-//        
-//        for (final Iterator it = curPart.getChildren().iterator(); it.hasNext();)
-//        {
-//            match = findMatchingPart((EditPart)it.next(), paletteEntry);
-//            
-//            if (match != null)
-//            {
-//                break;
-//            }
-//        }
-//        
-//        return match;
-//    }
-//    private IProject getProject(Element element) {
-//        if (element instanceof IDOMElement) {
-//            IDOMModel model = ((IDOMElement) element).getModel();
-//            IFile file = StructuredModelUtil.getFileFor(model);
-//            if (file != null) {
-//                return file.getProject();
-//            }
-//        }
-//        return null;
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java
deleted file mode 100644
index bf4098b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.ui.IPageLayout;
-
-/**
- * @author mengbo
- */
-public class PropertiesViewAction extends ShowViewAction {
-	/**
-	 * the id
-	 */
-	public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.PropertiesViewAction"; //$NON-NLS-1$
-
-	/**
-	 * Default constructor
-	 */
-	public PropertiesViewAction() 
-    {
-		super(ActionsMessages
-				.getString("PropertiesViewAction.Menu.Properties") //$NON-NLS-1$
-              , IPageLayout.ID_PROP_SHEET);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java
deleted file mode 100644
index d4e70ad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.gef.EditDomain;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RelatedViewActionGroup extends ActionGroup 
-{
-    private final EditDomain  _editDomain;
-    
-    /**
-     * @param editDomain
-     */
-    public RelatedViewActionGroup(EditDomain editDomain)
-    {
-        _editDomain = editDomain;
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		super.fillContextMenu(menu);
-
-		final IMenuManager viewMgr = new MenuManager(ActionsMessages
-				.getString("RelatedViewActionGroup.Menu.ShowView"),//$NON-NLS-1$
-				PageDesignerActionConstants.SHOWVIEW_SUBMENU_ID);
-		viewMgr.add(new Action() {
-		    // add noop action; TODO: why?
-		});
-		viewMgr.setRemoveAllWhenShown(true);
-        final ActionContext context = getContext();
-		viewMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-                // TODO: don't like this at all
-				String[] views = { "org.eclipse.ui.views.PropertySheet", //$NON-NLS-1$
-						"org.eclipse.gef.ui.palette_view", "org.eclipse.ui.views.ContentOutline"}; //$NON-NLS-1$ //$NON-NLS-2$
-
-                Map icons = getIconForView(views);
-                // TODO: is this the best way to do this?
-				if (manager.find(PropertiesViewAction.ID) == null) {
-					Action action = new PropertiesViewAction();
-					action.setId(PropertiesViewAction.ID);
-					action.setImageDescriptor((ImageDescriptor) icons
-							.get(views[0]));
-					manager.add(action);
-				}
-                    ISelection selection = context.getSelection();
-                    if (manager.find(PaletteViewAction.ID) == null) {
-                    if (selection instanceof IStructuredSelection)
-                    {
-                        IStructuredSelection strucSelection = 
-                            (IStructuredSelection) selection;
-                        Action action = null;
-                        
-                        if (strucSelection.getFirstElement() instanceof ElementEditPart)
-                        {                      
-                            Element selectedElem = (Element)
-                                ((ElementEditPart) strucSelection.getFirstElement()).getModel();
-        					action = new PaletteViewAction(selectedElem, _editDomain);
-                        }
-                        else
-                        {
-                            // if can't determine, just default open the palette
-                            action = new PaletteViewAction(null, null);
-                        }
-                        action.setId(PaletteViewAction.ID);
-                        action.setImageDescriptor((ImageDescriptor) icons
-                                .get(views[1]));
-                        manager.add(action);
-                    }
-				}
-                if (manager.find(OutlineViewAction.ID) == null)
-                {
-                    Action action = new OutlineViewAction();
-                    action.setId(OutlineViewAction.ID);
-                    action.setImageDescriptor((ImageDescriptor) icons
-                            .get(views[2]));
-                    manager.add(action);
-                }
-                
-			}
-		});
-		menu.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, viewMgr);
-	}
-
-	private Map getIconForView(String[] viewids) {
-		List views = Arrays.asList(viewids);
-		Map icons = new HashMap();
-
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.views"); //$NON-NLS-1$
-		for (int i = 0; i < elements.length; i++) {
-			String name = elements[i].getName();
-			String id = elements[i].getAttribute("id"); //$NON-NLS-1$
-			if ("view".equals(name) && views.contains(id)) { //$NON-NLS-1$
-				String iconPath = elements[i].getAttribute("icon"); //$NON-NLS-1$
-				if (iconPath != null) {
-					icons.put(id, AbstractUIPlugin.imageDescriptorFromPlugin(
-							elements[i].getDeclaringExtension().getContributor().getName(),
-							iconPath));
-				} else {
-					icons.put(id, null);
-				}
-				if (icons.size() == viewids.length) {
-					break;
-				}
-			}
-		}
-		return icons;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java
deleted file mode 100644
index 33bc222..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * TODO: isn't there a workbench registry action for this?
- * @author cbateman
- *
- */
-public class ShowViewAction extends Action {
-    private static Logger _log = PDPlugin.getLogger(PropertiesViewAction.class);
-    private final String _viewId;
-    
-    /**
-     * @param text
-     * @param viewId
-     */
-    public ShowViewAction(String text, String viewId) 
-    {
-        _viewId = viewId;
-        setText(text);
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run() {
-        try {
-            getPage().showView(_viewId);
-        } catch (PartInitException e) {
-            _log.info("Open the view: "+_viewId, e); //$NON-NLS-1$
-        }
-
-    }
-
-    private IWorkbenchPage getPage() {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        return window.getActivePage();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SkinsMenuItemBuilder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SkinsMenuItemBuilder.java
deleted file mode 100644
index 78ea5b1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SkinsMenuItemBuilder.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTResourceProviderFactory;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
-import org.eclipse.jst.pagedesigner.utils.EditorUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.ui.IWorkbenchActionConstants;
-
-/**
- * Builds menu items for managing skins.
- * 
- * @author Ian Trimble - Oracle
- */
-public class SkinsMenuItemBuilder {
-
-	private static final String DATAKEY_DTSKIN = "DATAKEY_DTSKIN"; //$NON-NLS-1$
-	private static final String DATAKEY_NSURI = "DTATKEY_NSURI"; //$NON-NLS-1$
-
-	private static List<Menu> menuList = new ArrayList<Menu>();
-
-	private IProject project;
-
-	/**
-	 * Constructs an instance.
-	 * 
-	 * @param project IProject instance for which to get skin information.
-	 */
-	public SkinsMenuItemBuilder(IProject project) {
-		this.project = project;
-	}
-
-	/**
-	 * Builds menu items (adds a separator and then menu items to end of
-	 * specified menu.
-	 * 
-	 * @param menu Menu instance to which to add menu items.
-	 */
-	public void buildMenuItems(Menu menu) {
-		for (Menu oldMenu: menuList) {
-			oldMenu.dispose();
-		}
-		if (menu != null) {
-			List<TaglibData> taglibDataList = getTaglibDataList();
-			if (taglibDataList.size() > 0) {
-				new MenuItem(menu, SWT.SEPARATOR);
-			}
-			for (TaglibData taglibData: taglibDataList) {
-				String nsURI = taglibData.getNSURI();
-				DTSkinManager dtSkinManager = DTSkinManager.getInstance(project);
-				IDTSkin currentDTSkin = dtSkinManager.getCurrentSkin(nsURI);
-				MenuItem menuItem = new MenuItem(menu, SWT.CASCADE);
-				menuItem.setText(taglibData.getName());
-				Menu skinMenu = new Menu(menuItem);
-				menuList.add(skinMenu);
-				menuItem.setMenu(skinMenu);
-				List<IDTSkin> dtSkins = dtSkinManager.getSkins(nsURI);
-				for (IDTSkin dtSkin: dtSkins) {
-					MenuItem skinMenuItem;
-					if (currentDTSkin == dtSkin) {
-						skinMenuItem = new MenuItem(skinMenu, SWT.CHECK);
-						skinMenuItem.setSelection(true);
-					} else {
-						skinMenuItem = new MenuItem(skinMenu, SWT.PUSH);
-					}
-					skinMenuItem.setText(dtSkin.getName());
-					skinMenuItem.setData(DATAKEY_DTSKIN, dtSkin);
-					skinMenuItem.setData(DATAKEY_NSURI, nsURI);
-					skinMenuItem.addSelectionListener(new SkinSelectionListener());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Builds menu managers.
-	 * 
-	 * @param parent Parent menu manager to which to append new menu managers.
-	 */
-	public void buildMenuManagers(IMenuManager parent) {
-		List<TaglibData> taglibDataList = getTaglibDataList();
-		if (taglibDataList.size() > 0) {
-			parent.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new Separator());
-		}
-		for (TaglibData taglibData: taglibDataList) {
-			String nsURI = taglibData.getNSURI();
-			MenuManager newMgr = new MenuManager(taglibData.getName());
-			DTSkinManager dtSkinManager = DTSkinManager.getInstance(project);
-			IDTSkin currentDTSkin = dtSkinManager.getCurrentSkin(nsURI);
-			List<IDTSkin> dtSkins = dtSkinManager.getSkins(nsURI);
-			for (IDTSkin dtSkin: dtSkins) {
-				newMgr.add(new ChangeCurrentSkinAction(nsURI, dtSkin, dtSkin == currentDTSkin));
-			}
-			parent.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, newMgr);
-		}
-	}
-
-	private List<TaglibData> getTaglibDataList() {
-		List<TaglibData> taglibDataList = new ArrayList<TaglibData>();
-		List<IDTResourceProvider> dtResourceProviders =
-			DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project);
-		for (IDTResourceProvider dtResourceProvider: dtResourceProviders) {
-			TaglibData taglibData = new TaglibData(dtResourceProvider.getId());
-			if (!taglibDataList.contains(taglibData)) {
-				taglibDataList.add(taglibData);
-			}
-		}
-		return taglibDataList;
-	}
-
-
-
-	/**
-	 * Used to hold and pass taglib-related data.
-	 */
-	private class TaglibData {
-		private String nsURI;
-		private String name;
-		public TaglibData(String nsURI) {
-			this.nsURI = nsURI;
-			ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsURI);
-			Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-			Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "display-label"); //$NON-NLS-1$
-			this.name = TraitValueHelper.getValueAsString(trait);
-		}
-		public String getNSURI() {
-			return nsURI;
-		}
-		public String getName() {
-			return name;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see java.lang.Object#hashCode()
-		 */
-		public int hashCode() {
-			int nsURIHashCode = 0;
-			if (nsURI != null) {
-				nsURIHashCode = nsURI.hashCode();
-			}
-			int nameHashCode = 0;
-			if (name != null) {
-				nameHashCode = name.hashCode();
-			}
-			return nameHashCode | nsURIHashCode ;
-		}
-	}
-
-
-
-	/**
-	 * Selection listener for skin menu items.
-	 */
-	private class SkinSelectionListener implements SelectionListener {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetSelected(SelectionEvent event) {
-			String nsURI = (String)event.widget.getData(DATAKEY_NSURI);
-			IDTSkin dtSkin = (IDTSkin)event.widget.getData(DATAKEY_DTSKIN);
-			DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin);
-			EditorUtil.refreshAllWPEDesignViewers();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetDefaultSelected(SelectionEvent event) {
-			widgetSelected(event);
-		}
-	}
-
-
-
-	/**
-	 * Action for changing current skin.
-	 */
-	private class ChangeCurrentSkinAction extends Action {
-		private String nsURI;
-		private IDTSkin dtSkin;
-		/**
-		 * Creates an instance.
-		 * 
-		 * @param nsURI NSURI of taglib.
-		 * @param dtSkin IDTSkin instance.
-		 * @param checked true if IDTSkin instance is current for nsURI.
-		 */
-		public ChangeCurrentSkinAction(String nsURI, IDTSkin dtSkin, boolean checked) {
-			super(dtSkin.getName());
-			this.nsURI = nsURI;
-			this.dtSkin = dtSkin;
-			setChecked(checked);
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin);
-			EditorUtil.refreshAllWPEDesignViewers();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java
deleted file mode 100644
index 7d48737..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-import org.eclipse.wst.xml.ui.internal.actions.ActionContributorXML;
-
-/**
- * SourcePageActionContributor
- * 
- * This class is for multi page editor's source page contributor.
- * 
- * Use XMLEditorActionContributor for single page editor.
- */
-public class SourcePageActionContributor extends ActionContributorXML {
-
-	private IActionBars fBars;
-
-	/**
-	 * This method calls:
-	 * <ul>
-	 * <li><code>contributeToMenu</code> with <code>bars</code>' menu
-	 * manager</li>
-	 * <li><code>contributeToToolBar</code> with <code>bars</code>' tool
-	 * bar manager</li>
-	 * <li><code>contributeToStatusLine</code> with <code>bars</code>'
-	 * status line manager</li>
-	 * </ul>
-	 * The given action bars are also remembered and made accessible via
-	 * <code>getActionBars</code>.
-	 * 
-	 * @param bars
-	 *            the action bars
-	 * 
-	 */
-	public void init(IActionBars bars) {
-		fBars = bars;
-		contributeToMenu(bars.getMenuManager());
-		contributeToToolBar(bars.getToolBarManager());
-		contributeToStatusLine(bars.getStatusLineManager());
-	}
-
-	/**
-	 * Returns this contributor's action bars.
-	 * 
-	 * @return the action bars
-	 */
-	public IActionBars getActionBars() {
-		return fBars;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor#setViewerSpecificContributionsEnabled(boolean)
-	 */
-	public void setViewerSpecificContributionsEnabled(boolean enabled) {
-		super.setViewerSpecificContributionsEnabled(enabled);
-		IEditorPart editor = getActiveEditorPart();
-		ITextEditor targetEditor = null;
-		if (editor instanceof ITextEditor) {
-			targetEditor = (ITextEditor) editor;
-		} else if (editor instanceof HTMLEditor) {
-			targetEditor = ((HTMLEditor) editor).getTextEditor();
-		}
-		if (targetEditor != null) {
-			if (enabled) {
-				getActionBars()
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.UNDO,
-								targetEditor
-										.getAction(ITextEditorActionConstants.UNDO));
-				getActionBars()
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.REDO,
-								targetEditor
-										.getAction(ITextEditorActionConstants.REDO));
-			} else {
-				getActionBars().setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, null);
-				getActionBars().setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, null);
-			}
-
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java
deleted file mode 100644
index d67d8f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.draw2d.ScalableFigure;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.editparts.ZoomListener;
-import org.eclipse.gef.editparts.ZoomManager;
-
-/**
- * A delegating ZoomManager.
- */
-public class DelegatingZoomManager extends ZoomManager implements ZoomListener {
-	/** the current ZoomManager all work is delegated to */
-	private final static int DEFAULT_ZOOM = 1;
-
-	private final static String ZOOM_AS_TEXT = "100%"; //$NON-NLS-1$
-
-	private final static String ZOOM_LEVEL_AS_TEXT = "100%"; //$NON-NLS-1$
-
-	private ZoomManager _currentZoomManager;
-
-	/** listeners */
-	private ListenerList _zoomListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * Creates a new DelegatingZoomManager instance.
-	 */
-	public DelegatingZoomManager() {
-		super((ScalableFigure) null, (Viewport) null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomListener#zoomChanged(double)
-	 */
-	public void zoomChanged(double zoom) {
-		Object[] listeners = _zoomListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((ZoomListener) listeners[i]).zoomChanged(zoom);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#addZoomListener(org.eclipse.gef.editparts.ZoomListener)
-	 */
-	public void addZoomListener(ZoomListener listener) {
-		_zoomListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#removeZoomListener(org.eclipse.gef.editparts.ZoomListener)
-	 */
-	public void removeZoomListener(ZoomListener listener) {
-		_zoomListeners.remove(listener);
-	}
-
-	/**
-	 * Sets the ZoomManager all work should be delegated to.
-	 * 
-	 * @param zoomManager
-	 */
-	public void setCurrentZoomManager(ZoomManager zoomManager) {
-		if (null != _currentZoomManager) {
-			_currentZoomManager.removeZoomListener(this);
-		}
-
-		_currentZoomManager = zoomManager;
-		if (null != _currentZoomManager) {
-			_currentZoomManager.addZoomListener(this);
-			zoomChanged(_currentZoomManager.getZoom());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#canZoomIn()
-	 */
-	public boolean canZoomIn() {
-		if (null == _currentZoomManager) {
-			return false;
-		}
-		return _currentZoomManager.canZoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#canZoomOut()
-	 */
-	public boolean canZoomOut() {
-		if (null == _currentZoomManager) {
-			return false;
-		}
-		return _currentZoomManager.canZoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getMaxZoom()
-	 */
-	public double getMaxZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getMaxZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getMinZoom()
-	 */
-	public double getMinZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getMinZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getNextZoomLevel()
-	 */
-	public double getNextZoomLevel() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getNextZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getPreviousZoomLevel()
-	 */
-	public double getPreviousZoomLevel() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getPreviousZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getScalableFigure()
-	 */
-	public ScalableFigure getScalableFigure() {
-		if (null == _currentZoomManager) {
-			return null;
-		}
-
-		return _currentZoomManager.getScalableFigure();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getUIMultiplier()
-	 */
-	public double getUIMultiplier() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getUIMultiplier();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getViewport()
-	 */
-	public Viewport getViewport() {
-		if (null == _currentZoomManager) {
-			return null;
-		}
-
-		return _currentZoomManager.getViewport();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoom()
-	 */
-	public double getZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomAsText()
-	 */
-	public String getZoomAsText() {
-		if (null == _currentZoomManager) {
-			return ZOOM_AS_TEXT;
-		}
-		//$NON-NLS-1$
-
-		return _currentZoomManager.getZoomAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomLevels()
-	 */
-	public double[] getZoomLevels() {
-		if (null == _currentZoomManager) {
-			return new double[] { DEFAULT_ZOOM };
-		}
-
-		return _currentZoomManager.getZoomLevels();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomLevelsAsText()
-	 */
-	public String[] getZoomLevelsAsText() {
-		if (null == _currentZoomManager) {
-			return new String[] { ZOOM_LEVEL_AS_TEXT };
-		}
-
-		return _currentZoomManager.getZoomLevelsAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setUIMultiplier(double)
-	 */
-	public void setUIMultiplier(double multiplier) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setUIMultiplier(multiplier);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setViewLocation(org.eclipse.draw2d.geometry.Point)
-	 */
-	public void setViewLocation(Point p) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setViewLocation(p);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoom(double)
-	 */
-	public void setZoom(double zoom) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoom(zoom);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomAnimationStyle(int)
-	 */
-	public void setZoomAnimationStyle(int style) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomAnimationStyle(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomAsText(java.lang.String)
-	 */
-	public void setZoomAsText(String zoomString) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomAsText(zoomString);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomLevels(double[])
-	 */
-	public void setZoomLevels(double[] zoomLevels) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomLevels(zoomLevels);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomIn()
-	 */
-	public void zoomIn() {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomOut()
-	 */
-	public void zoomOut() {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomTo(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void zoomTo(Rectangle rect) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomTo(rect);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java
deleted file mode 100644
index bedef53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-/**
- * The designer constants
- * 
- * TODO: dead?
- *
- */
-interface IPageDesignerConstants {
-	/**
-	 * JSP UI Component Tag Node
-	 */
-	public static final String DEFAULT_TAG_NAME = "tagname"; //$NON-NLS-1$
-
-	/**
-	 * keyword
-	 */
-	public static final String ATTR_TYPE_CDATA = "CDATA"; //$NON-NLS-1$
-
-	/**
-	 * basename attribute
-	 */
-	public static final String ATTR_LOADBUNDLE_1 = "basename"; //$NON-NLS-1$
-
-	/**
-	 * var attribute
-	 */
-	public static final String ATTR_LOADBUNDLE_2 = "var"; //$NON-NLS-1$
-
-	/**
-	 * columns attribute
-	 */
-	public static final String ATTR_PANELGRID_1 = "columns"; //$NON-NLS-1$
-
-	/**
-	 * summary attribute
-	 */
-	public static final String ATTR_PANELGRID_2 = "summary"; //$NON-NLS-1$
-
-	/**
-	 * title attribute
-	 */
-	public static final String ATTR_PANELGRID_3 = "title"; //$NON-NLS-1$
-
-	/**
-	 * action attribute
-	 */
-	public static final String ATTR_BUTTON_1 = "action"; //$NON-NLS-1$
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_BUTTON_2 = "value"; //$NON-NLS-1$
-
-	/**
-	 * url attribute
-	 */
-	public static final String ATTR_GRAPHICIMAGE_1 = "url"; //$NON-NLS-1$
-
-	/**
-	 * binding attribute
-	 */
-	public static final String ATTR_GRAPHICIMAGE_2 = "binding"; //$NON-NLS-1$
-
-	/**
-	 * binding attribute
-	 */
-	public static final String ATTR_OUTPUTTEXT_1 = "binding"; //$NON-NLS-1$
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_OUTPUTTEXT_2 = "value"; //$NON-NLS-1$
-
-	/**
-	 * styleClass attribute
-	 */
-	public static final String ATTR_OUTPUTTEXT_3 = "styleClass"; //$NON-NLS-1$
-
-	/**
-	 * dataWindowBean attribute
-	 */
-	public static final String ATTR_DATAWINDOW_1 = "dataWindowBean"; //$NON-NLS-1$
-
-	/**
-	 * scriptName attribute
-	 */
-	public static final String ATTR_DATAWINDOW_2 = "scriptName"; //$NON-NLS-1$
-
-	/**
-	 * page attribute
-	 */
-	public static final String ATTR_INCLUDE = "page"; //$NON-NLS-1$
-
-	/**
-	 * prefix atttribute
-	 */
-	public static final String ATTR_TAGLIB_1 = "prefix"; //$NON-NLS-1$
-
-	/**
-	 * uri attribute
-	 */
-	public static final String ATTR_TAGLIB_2 = "uri"; //$NON-NLS-1$
-
-	/**
-	 * bundle attribute
-	 */
-	public static final String RESOURCE_BUNDLE_MARK = "bundle"; //$NON-NLS-1$
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_RESOURCE_BUNDLE = "value"; //$NON-NLS-1$
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_FACET = "value"; //$NON-NLS-1$
-
-	/**
-	 * view tag
-	 */
-	public static final String TAG_VIEW_TYPE = "view"; //$NON-NLS-1$
-
-	/**
-	 * for tag
-	 */
-	public static final String TAG_FORM_TYPE = "form"; //$NON-NLS-1$
-
-	/**
-	 * text tag
-	 */
-	public static final String TAG_TEXT_TYPE = "text"; //$NON-NLS-1$
-
-	/**
-	 * loadBundle tag
-	 */
-	public static final String TAG_LOADBUNDLE_TYPE = "loadBundle"; //$NON-NLS-1$
-
-	/**
-	 * panelGrid tag
-	 */
-	public static final String TAG_PANELGRID_TYPE = "panelGrid"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_IMAGE_TYPE = "image"; //$NON-NLS-1$
-
-	/**
-	 * outputText tag
-	 */
-	public static final String TAG_OUTPUTTEXT_TYPE = "outputText"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_BUTTON_TYPE = "button"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_DATAWINDOW_TYPE = "datawindow"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_TAGLIB_TYPE = "taglib"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_INCLUDE_TYPE = "include"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_OTHERS_TYPE = ""; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_VIEW = "view"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_FORM = "form"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_PANELGRID = "panelGrid"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_PANELGROUP = "panelGroup"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_FACET = "facet"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_DATAWINDOW = "dataWindow"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_OUTPUTTEXT = "outputText"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_INCLUDE = "include"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_LOADBUNDLE = "loadBundle"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_TAGLIB = "taglib"; //$NON-NLS-1$
-
-	/**
-	 * graphicImage tag
-	 */
-	public static final String TAG_NAME_GRAPHICIMAGE = "graphicImage"; //$NON-NLS-1$
-
-	/**
-	 * commandButton tag
-	 */
-	public static final String TAG_NAME_COMMANDBUTTON = "commandButton"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String REQUEST_TYPE_SELECT = "selection"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final int EOF = -1;
-
-	/**
-	 * 
-	 */
-	public static final char CHAR_TAB = '\t';
-
-	/**
-	 * 
-	 */
-	public static final char CHAR_N_RETURN = '\n';
-
-	/**
-	 * 
-	 */
-	public static final String STRING_N_RETURN = "\n"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String STRING_BLANK = " "; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final char CHAR_BLANK = ' ';
-
-	/**
-	 * 
-	 */
-	public static final String FONT_NAME_HELVETICA = "Helvetica"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties
deleted file mode 100644
index beecba5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-JSFPalette.DefaultGroup.LabelJSFPallete=Controls
-JSPSourceEditor.Page.Preview.PageText=Preview
-
-CommonResourceDialog.statusMessage=Select an image file
-ResourcesOnClasspathDialog.statusMessage=Select a property file
-TreeViewerSelectionDialog.Title=Select a file
-RangeSelectionTool.CommandLabel.Insert=Insert
-
-DesignerPaletteCustomizerDialog.label.import=Import
-DesignerPaletteCustomizerDialog.label.export=Export
-
-DesignerSourceDropTargetListener.InserCommandLabel=Create New Item
-SourceViewLocalDropCommand.Label.InsertSyntax=Insert Syntax
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/MessageFormater.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/MessageFormater.java
deleted file mode 100644
index c05fabd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/MessageFormater.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @A tool class for message format
- */
-public final class MessageFormater {
-	private static Logger _log = PDPlugin.getLogger(MessageFormater.class);
-
-	/**
-	 * 
-	 * @param message
-	 *            the parts for filling is {number}
-	 * @param o1
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o1) {
-		try {
-			Object[] args = new Object[] { o1 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e); //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param message
-	 * @param o1
-	 * @param o2
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o1, Object o2) {
-		try {
-			Object[] args = new Object[] { o1, o2 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e); //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param message
-	 * @param o1
-	 * @param o2
-	 * @param o3
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o1, Object o2, Object o3) {
-		try {
-			Object[] args = new Object[] { o1, o2, o3 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e); //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param message
-	 * @param o
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o[]) {
-		try {
-			MessageFormat formater = new MessageFormat(message);
-			return formater.format(o);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e); //$NON-NLS-1$
-			return ""; //$NON-NLS-1$
-		}
-	}
-	
-	private MessageFormater()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/PageDesignerResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/PageDesignerResources.java
deleted file mode 100644
index ec83204..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/PageDesignerResources.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class PageDesignerResources extends ResourceUtils {
-	private static Logger _log = PDPlugin
-			.getLogger(PageDesignerResources.class);
-
-	private static PageDesignerResources _resource; // singleton
-
-	/**
-	 * Empty Constructor.
-	 */
-	protected PageDesignerResources() {
-		try {
-			_resources = ResourceBundle
-					.getBundle(IJMTConstants.PAGEDESIGNER_RESOURCE_BUNDLE_FILE);
-			// NOTE: this throws a runtime "MissingResourceException".
-		} catch (MissingResourceException ee) {
-			// catch this and the error is reported in setBundle.
-			// Log.Error.PageDesignerResources.Open=Error in getting source
-			// bundle
-			_log.error("Log.Error.PageDesignerResources.Open", ee); //$NON-NLS-1$
-		}
-		setBundle(_resources, IJMTConstants.PAGEDESIGNER_RESOURCE_BUNDLE_FILE);
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static PageDesignerResources getInstance() {
-		if (_resource == null) {
-			_resource = new PageDesignerResources();
-		}
-		return _resource;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/AbstractPaletteFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/AbstractPaletteFactory.java
deleted file mode 100644
index 646bdd5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/AbstractPaletteFactory.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.views.palette.PaletteViewerPage;
-import org.eclipse.ui.IEditorInput;
-
-/**
- * Abstract class that all extenders must use to provide alternate palettes
- * to the Web Page Editor.  See also {@link IPaletteFactory}
- */
-public abstract class AbstractPaletteFactory implements IPaletteFactory {
-
-	public PaletteViewerPage createPaletteViewerPage(PaletteViewerProvider provider) {return null;}
-	public PaletteViewerProvider createPaletteViewerProvider(EditDomain domain) {return null;}
-	public PaletteRoot createPaletteRoot(IEditorInput editorInput){return null;}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java
deleted file mode 100644
index ff887fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Iterator;
-
-import javax.xml.parsers.DocumentBuilder;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jface.preference.IPersistentPreferenceStore;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.jst.pagedesigner.utils.XMLUtil;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * Helper class that all clients should use when dealing with palette customizations 
- */
-public final class DesignerPaletteCustomizationsHelper {
-	private static final String PREFS_TAGLIBHIDE_PREFIX = "hidden_taglib:"; //$NON-NLS-1$
-
-	private static Logger _log = PDPlugin.getLogger(DesignerPaletteCustomizationsHelper.class);
-	
-	/**
-	 * @return new DesignerPaletteCustomizer
-	 */
-	public static DesignerPaletteCustomizer getNewCustomizer(){
-		return new DesignerPaletteCustomizer();
-	}
-	
-	/**
-	 * @param paletteViewer
-	 * @param paletteCustomizer
-	 * @return new DesignerPaletteCustomizerDialog
-	 */
-	public static PaletteCustomizerDialog getNewCustomizerDialog(PaletteViewer paletteViewer, PaletteCustomizer paletteCustomizer){
-		return new DesignerPaletteCustomizerDialog(
-				paletteViewer.getControl().getShell(), paletteCustomizer, (DesignerPaletteRoot)paletteViewer.getPaletteRoot());
-
-	}
-	
-	/**
-	 * Save palette item customizations
-	 * @param paletteRoot
-	 */
-	public static void save(DesignerPaletteRoot paletteRoot) {
-		IPersistentPreferenceStore prefs = getPreferenceStore();
-
-		for (Iterator it=paletteRoot.getChildren().iterator();it.hasNext();){
-			PaletteEntry entry = (PaletteEntry)it.next();
-			if (entry instanceof TaglibPaletteDrawer){
-				TaglibPaletteDrawer pd = (TaglibPaletteDrawer)entry;
-				prefs.putValue(PREFS_TAGLIBHIDE_PREFIX + pd.getURI(), Boolean.toString(! pd.isVisible()));
-			}
-		}
-		PaletteItemManager.notifyPaletteItemManagersOfCustomizationsUpdate(paletteRoot.getPaletteManager());
-		
-	}
-	
-	/**
-	 * Load user customizations
-	 * @param paletteItemManager
-	 */
-	public static void loadUserCustomizations(IPaletteItemManager paletteItemManager) {
-		IPreferenceStore store = getPreferenceStore();
-		for (Iterator it=paletteItemManager.getAllCategories().iterator();it.hasNext();){
-			TaglibPaletteDrawer tld = (TaglibPaletteDrawer)it.next();
-			if (store.contains(PREFS_TAGLIBHIDE_PREFIX+tld.getURI())){
-				tld.setVisible( ! store.getBoolean(PREFS_TAGLIBHIDE_PREFIX+tld.getURI()));
-			}
-		}
-	}
-	
-	/**
-	 * Hide a category (TaglibPaletteDrawer) that will be persisted as a customization
-	 * @param taglibPaletteDrawer
-	 */
-	public static void hideTaglibDrawer(TaglibPaletteDrawer taglibPaletteDrawer){
-		IPersistentPreferenceStore prefs = getPreferenceStore();
-		taglibPaletteDrawer.setVisible(false);
-		prefs.putValue(PREFS_TAGLIBHIDE_PREFIX + taglibPaletteDrawer.getURI(), Boolean.TRUE.toString());
-		save((DesignerPaletteRoot)taglibPaletteDrawer.getParent());
-	}
-	
-	private static IPersistentPreferenceStore getPreferenceStore() {
-		return (IPersistentPreferenceStore)PDPlugin.getDefault().getPreferenceStore();
-	}
-	
-	/**
-	 * Exports the current state of customizations of the current palette instance.
-	 * 
-	 * Unsaved data will be exported.
-	 * 
-	 * Currently only the "hide" flag of a category is exported.  All categories are exported.
-	 * 
-	 * @param paletteItemManager
-	 * @param filename
-	 */
-	public static void exportCustomizations(IPaletteItemManager paletteItemManager, String filename){
-
-		Document document = XMLUtil.getDocumentBuilder().getDOMImplementation()
-			.createDocument(null, IPaletteConstants.ROOT, null);
-		try {
-			FileOutputStream ostream = null;
-			int index = filename.lastIndexOf(File.separator);
-			String foldername = filename.substring(0, index); 
-			File folder = new File(foldername);
-			if (folder != null && !folder.exists()) {
-				folder.mkdir();
-			}
-			
-			ostream = new FileOutputStream(filename);
-
-			for (Iterator iter = paletteItemManager.getAllCategories().iterator(); iter.hasNext();) {
-				TaglibPaletteDrawer category = (TaglibPaletteDrawer) iter
-						.next();	
-				if (category == null) continue;
-
-				Element categoryElement = document.createElement(IPaletteConstants.CATEGORY_TAG);
-				categoryElement.setAttribute(IPaletteConstants.ID, category.getURI());
-				categoryElement.setAttribute(IPaletteConstants.ISHIDDEN, Boolean.toString(! category.isVisible()));
-				document.getDocumentElement().appendChild(categoryElement);
-			}
-			XMLUtil.serialize(document, ostream);
-			ostream.close();
-		} catch (IOException e) {
-			_log.error("DesignerPaletteCustomizationsHelper.save.error.IOException", e); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Imports a palette customization export file.
-	 * 
-	 * If there are entries matching in the existing workspace customizations, they will be overridden.
-	 * 
-	 * @param customizer 
-	 * @param filename
-	 */
-	public static void importCustomizations(DesignerPaletteCustomizer customizer, String filename){
-		Document document = null;
-		try {
-			DocumentBuilder builder = XMLUtil.getDocumentBuilder();
-			if (builder != null) {
-				document = builder.parse(filename);
-			} else {
-				_log.error("DesignerPaletteCustomizationsHelper.importCustomizations.error.getDocumentBuilderFail");// $NON-NLS-1$ //$NON-NLS-1$
-			}
-		} catch (FileNotFoundException e) {
-			//should never get here as user chose file thru a file chooser dialog
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.FileNotFoundException");// $NON-NLS-1$ //$NON-NLS-1$
-			document = null;
-		} catch (IOException e) {
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.IOException", e.toString(), e); //$NON-NLS-1$
-		} catch (SAXException e) {
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.SAXException", e.toString(), e); //$NON-NLS-1$
-		}
-		if (document != null) {
-			Element root = document.getDocumentElement();
-			if (root != null) {
-				NodeList catetorylist = root.getChildNodes();
-				for (int i = 0, n = catetorylist.getLength(); i < n; i++) {
-					Node childNode = catetorylist.item(i);
-					if (childNode.getNodeType() == Node.ELEMENT_NODE
-							&& childNode.getNodeName().equals(
-									IPaletteConstants.CATEGORY_TAG)) {
-						
-						Element categoryElement = (Element) childNode;
-						//only checking for hidden flag currently
-						if (categoryElement.hasAttribute(IPaletteConstants.ISHIDDEN)){
-							boolean isHidden =Boolean.valueOf(categoryElement.getAttribute(IPaletteConstants.ISHIDDEN)).booleanValue();
-							
-							String uri = categoryElement.getAttribute(IPaletteConstants.ID);
-							applyImport(customizer, uri, isHidden);							
-						}
-						
-						
-					}
-				}
-			}
-		}
-	}
-
-	private static void applyImport(
-			DesignerPaletteCustomizer customizer, String uri, boolean isHidden) {
-		//apply the isHidden exported flag to the paletteRoot child if present 
-		for (Iterator it=customizer.getDesignerPaletteRoot().getChildren().iterator();it.hasNext();){
-			Object o = it.next();
-			if (o instanceof TaglibPaletteDrawer){
-				TaglibPaletteDrawer pd = (TaglibPaletteDrawer)o;
-				if (uri.equals(pd.getURI())){
-					pd.setVisible(! isHidden);
-					break;
-				}
-			}
-		}	
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java
deleted file mode 100644
index 9656cd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.customize.PaletteSeparatorFactory;
-import org.eclipse.gef.ui.palette.customize.PaletteStackFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteCustomizer extends PaletteCustomizer {
-
-	
-	private DesignerPaletteRoot root;
-
-	/**
-	 * Set the palette root.   Must be set before the customizer can be used
-	 * @param root
-	 */
-	public void setPaletteRoot(DesignerPaletteRoot root){
-		this.root = root;
-	}
-	
-	/**
-	 * Return the palette root for this customizer
-	 * @return DesignerPaletteRoot
-	 */
-	public DesignerPaletteRoot getDesignerPaletteRoot(){
-		return root;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveDown(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canMoveDown(PaletteEntry entry) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveUp(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canMoveUp(PaletteEntry entry) {
-		return false;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveDown(org.eclipse.gef.palette.PaletteEntry)
-	 */
-//	public boolean canMoveDown(PaletteEntry entry) {
-//		if (!(entry instanceof PaletteDrawer)) {
-//			return false;
-//		}
-//		return super.canMoveDown(entry);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveUp(org.eclipse.gef.palette.PaletteEntry)
-	 */
-//	public boolean canMoveUp(PaletteEntry entry) {
-//		if (!(entry instanceof PaletteDrawer)) {
-//			return false;
-//		}
-//		if (entry.getParent().getChildren().indexOf(entry) == 1) {
-//			return false;
-//		}
-//		return super.canMoveUp(entry);
-//	}
-
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#performMoveDown(org.eclipse.gef.palette.PaletteEntry)
-//	 */
-//	public void performMoveDown(PaletteEntry entry) {
-//		if (entry instanceof PaletteDrawer) {
-//			String id = entry.getId();
-//			TaglibPaletteDrawer cat = PaletteItemManager.getCurrentInstance().getTaglibPalletteDrawer(id);
-//			movedown(PaletteItemManager.getCurrentInstance(), cat);
-//			super.performMoveDown(entry);
-//		}
-//	}
-//	private void moveup(PaletteItemManager paletteItemManager, TaglibPaletteDrawer cat) {
-//		int i = paletteItemManager.getAllCategories().indexOf(cat);
-//		TaglibPaletteDrawer upCat = (TaglibPaletteDrawer) paletteItemManager.getAllCategories()
-//				.get(i - 1);
-//		movedown(paletteItemManager, upCat);
-//	}
-//
-//	private void movedown(PaletteItemManager paletteItemManager, TaglibPaletteDrawer cat) {
-//		int i = paletteItemManager.getAllCategories().indexOf(cat);
-//		paletteItemManager.getAllCategories().add(i + 2, cat);
-//		paletteItemManager.getAllCategories().remove(i);
-//	}
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#performMoveUp(org.eclipse.gef.palette.PaletteEntry)
-//	 */
-//	public void performMoveUp(PaletteEntry entry) {
-//		if (entry instanceof PaletteDrawer) {
-//			String id = entry.getId();
-//			TaglibPaletteDrawer cat = PaletteItemManager.getCurrentInstance().getTaglibPalletteDrawer(id);
-//			moveup(PaletteItemManager.getCurrentInstance(), cat);
-//			super.performMoveUp(entry);
-//		}
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canDelete(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canDelete(PaletteEntry entry) {
-		return false;
-	}
-
-	public List getNewEntryFactories() {
-		List list = new ArrayList(4);
-		list.add(new PaletteSeparatorFactory());
-		list.add(new PaletteStackFactory());
-		return list;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#revertToSaved()
-	 */
-	public void revertToSaved() {
-		//note that reset is not currently part of IPaletteItemManager interface...
-		((PaletteItemManager)root.getPaletteManager()).reset();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#save()
-	 */
-	public void save() {
-		DesignerPaletteCustomizationsHelper.save(root);
-//		PaletteItemManager.getCurrentInstance().reset();
-	}
-
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
deleted file mode 100644
index 3689e5a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PluginImageHelper;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Customization dialog for Web Page Designer palette items
- * @author mengbo
- * @version 1.5
- */
-public class DesignerPaletteCustomizerDialog extends PaletteCustomizerDialog {
-	private static final String DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME = "WPDPaletteCustomizations.xml"; //$NON-NLS-1$
-	
-	private static String DEFAULTEXTENSION = ".xml";//$NON-NLS-1$ 
-
-	/**
-	 * Constructor
-	 * @param shell
-	 * @param customizer
-	 * @param root
-	 */
-	public DesignerPaletteCustomizerDialog(Shell shell,
-			PaletteCustomizer customizer, DesignerPaletteRoot root) {
-		super(shell, customizer, root);
-
-	}
-
-	private PropertyChangeListener applyButtonUpdater = new PropertyChangeListener() {
-
-
-		public void propertyChange(PropertyChangeEvent evt) {
-			Button applyButton = getButton(PaletteCustomizerDialog.APPLY_ID);
-			if (applyButton == null) {
-				return;
-			}
-			applyButton.setEnabled(true);
-		}
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#open()
-	 */
-	public int open() {
-		// save the current state before open
-		// save();
-		return super.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#setActiveEntry(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	protected void setActiveEntry(PaletteEntry entry) {
-		//remove listener on previous entry before adding to new entry
-		PaletteEntry pre = getSelectedPaletteEntry();
-		if (pre != null) {
-			pre.removePropertyChangeListener(applyButtonUpdater);
-		} else {
-			getButton(APPLY_ID).setEnabled(false);
-		}
-		
-		if (entry != null)
-			entry.addPropertyChangeListener(applyButtonUpdater);
-		
-		super.setActiveEntry(entry);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#save()
-	 */
-	protected void save() {
-		super.save();
-		Button applyButton = getButton(PaletteCustomizerDialog.APPLY_ID);
-		if (applyButton != null) {
-			applyButton.setEnabled(false);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-		getButton(APPLY_ID).setEnabled(false);
-		// save();
-	}
-
-	/* (non-Javadoc)
-	 * Export action
-	 *
-	 */
-	private class ExportAction extends PaletteCustomizationAction {
-		
-		/**
-		 * Constructor
-		 */
-		public ExportAction() {
-			setEnabled(true);
-			setText(PageDesignerResources.getInstance().getString(
-					"DesignerPaletteCustomizerDialog.label.export")); //$NON-NLS-1$
-			setImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_ELCL_EXPORT,
-							PDPlugin.getPluginId()));
-			setDisabledImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_DLCL_EXPORT,
-							PDPlugin.getPluginId()));
-			setHoverImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_CLCL_EXPORT,
-							PDPlugin.getPluginId()));
-		}
-
-		private void handleExport() {
-			final FileDialog fileDialog = new FileDialog(PDPlugin
-					.getActiveWorkbenchShell());
-			fileDialog.setFileName(DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME);
-			String[] filterExtensions = new String[2];
-			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
-			filterExtensions[1] = "*.*"; //$NON-NLS-1$
-			fileDialog.setFilterExtensions(filterExtensions);
-			fileDialog.setText(Messages.DesignerPaletteCustomizerDialog_ExportCustomizations);
-			String filename = fileDialog.open();
-			if (filename != null) {
-				if (!filename.endsWith(DEFAULTEXTENSION)) {
-					filename = filename + DEFAULTEXTENSION;
-				}
-				final IPaletteContext context = PaletteItemManager.createPaletteContext(((DesignerPaletteRoot)getPaletteRoot()).getFile());
-				DesignerPaletteCustomizationsHelper
-					.exportCustomizations(PaletteItemManager.getInstance(context), filename);
-
-
-				updateActions();
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			handleExport();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction#update()
-		 */
-		public void update() {
-			//boolean enabled = false;
-//			PaletteEntry entry = getSelectedPaletteEntry();
-//			if (entry != null) {
-				// if (getCustomizer() instanceof DesignerPaletteCustomizer)
-				// enabled = ((DesignerPaletteCustomizer)
-				// getCustomizer()).canExport(entry);
-//			}
-			setEnabled(true);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * Import action
-	 */
-	private class ImportAction extends PaletteCustomizationAction {
-		private DesignerPaletteCustomizerDialog designerPaletteCustomizerDialog;
-		
-		/**
-		 * Constructor
-		 * @param designerPaletteCustomizerDialog
-		 */
-		public ImportAction(DesignerPaletteCustomizerDialog designerPaletteCustomizerDialog) {
-			super();
-			this.designerPaletteCustomizerDialog = designerPaletteCustomizerDialog;
-			setEnabled(true);
-			setText(PageDesignerResources.getInstance().getString(
-					"DesignerPaletteCustomizerDialog.label.import")); //$NON-NLS-1$
-			setImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_ELCL_IMPORT,
-							PDPlugin.getPluginId()));
-			setDisabledImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_DLCL_IMPORT,
-							PDPlugin.getPluginId()));
-			setHoverImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_CLCL_IMPORT,
-							PDPlugin.getPluginId()));
-			
-		}
-
-		private void handleImport() {
-//			PaletteEntry entry = designerPaletteCustomizerDialog.getSelectedPaletteEntry();
-			final FileDialog fileDialog = new FileDialog(PDPlugin
-					.getActiveWorkbenchShell());
-			fileDialog.setFileName(DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME);
-			String[] filterExtensions = new String[2];
-			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
-			filterExtensions[1] = "*.*"; //$NON-NLS-1$
-			fileDialog.setFilterExtensions(filterExtensions);
-			fileDialog.setText(Messages.DesignerPaletteCustomizerDialog_ImportCustomizations);
-			String filename = fileDialog.open();
-			if (filename != null) {		
-					//deselect current entry first
-					designerPaletteCustomizerDialog.close();		
-					
-//					getCustomizer().revertToSaved();
-					DesignerPaletteCustomizationsHelper
-						.importCustomizations((DesignerPaletteCustomizer)getCustomizer(), filename);
-					
-//					designerPaletteCustomizerDialog.setActiveEntry(entry);
-					((DesignerPaletteCustomizer)getCustomizer()).getDesignerPaletteRoot().refresh();
-					designerPaletteCustomizerDialog.open();
-//					designerPaletteCustomizerDialog.setActiveEntry(entry);
-			}
-		}
-
-		public void run() {
-			handleImport();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction#update()
-		 */
-		public void update() {
-			//nothing to do
-		}
-	}
-
-	/**
-	 * @return import action
-	 */
-	public Action getImportAction() {
-		return new ImportAction(this);
-	}
-
-	/**
-	 * @return export action
-	 */
-	public Action getExportAction() {
-		return new ExportAction();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#createOutlineActions()
-	 */
-	protected List createOutlineActions() {
-		List actions = super.createOutlineActions();
-		actions.remove(0);// remove new action
-		actions.remove(0);// remove delete action
-		actions.add(new ImportAction(this));
-		actions.add(new ExportAction());
-
-		return actions;
-	}
-	
-	@Override
-	protected TreeViewer createOutlineTreeViewer(Composite composite) {
-		TreeViewer viewer = super.createOutlineTreeViewer(composite);
-		viewer.setContentProvider(new DesignerPaletteContentProvider());
-		return viewer;
-	}
-
-	
-	/**
-	 * Content provider for dialog.
-	 * Displays only {@link TaglibPaletteDrawer}s
-	 */
-	private static class DesignerPaletteContentProvider implements ITreeContentProvider {
-
-		public Object[] getChildren(Object parentElement) {
-			if (parentElement instanceof DesignerPaletteRoot){
-				List libs = new ArrayList();
-				List children = ((DesignerPaletteRoot)parentElement).getChildren();				
-				if (!children.isEmpty()) {
-					for (Iterator it=children.iterator();it.hasNext();){
-						PaletteEntry entry = (PaletteEntry)it.next();
-						if (entry instanceof TaglibPaletteDrawer)
-							libs.add(entry);
-					}
-					if (!libs.isEmpty())
-						return libs.toArray();
-				}
-			}
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			return ((PaletteEntry)element).getParent();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return false;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			Object[] elements = new Object[0];
-			if (inputElement instanceof DesignerPaletteRoot){
-				elements = getChildren(inputElement);
-				if (elements == null) {
-					elements = new Object[0];
-				}
-			}
-			return elements;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			//nothing to do
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			//won't change			
-		}
-
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java
deleted file mode 100644
index e00e92a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Palette Image constants
- * @author mengbo
- */
-public class DesignerPaletteImages {
-	/**
-	 * Import hover image
-	 */
-	public static final String IMG_CLCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif"; //$NON-NLS-1$
-
-	/**
-	 * Export hover image
-	 */
-	public static final String IMG_CLCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif"; //$NON-NLS-1$
-
-	/**
-	 * Import disabled image
-	 */
-	public static final String IMG_DLCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif"; //$NON-NLS-1$
-
-	/**
-	 * Export disabled image
-	 */
-	public static final String IMG_DLCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif"; //$NON-NLS-1$
-
-	/**
-	 * Import image
-	 */
-	public static final String IMG_ELCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import.gif"; //$NON-NLS-1$
-
-	/**
-	 * Export image
-	 */
-	public static final String IMG_ELCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export.gif"; //$NON-NLS-1$
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java
deleted file mode 100644
index 6c6d28e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.MarqueeToolEntry;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.SelectionToolEntry;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.tools.RangeSelectionTool;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteRoot extends PaletteRoot {
-	private IPaletteItemManager _manager;
-	private IFile _file;
-	private IPaletteContext _paletteContext;
-    
-	/**
-	 * Creates a new DesignerPaletteRoot instance.
-	 * @param file 
-	 */
-	public DesignerPaletteRoot(final IFile file) {
-		// create root
-		super();
-		
-		this._paletteContext = PaletteItemManager.createPaletteContext(file);
-		this._manager = PaletteItemManager.getInstance(_paletteContext);
-		
-		setupBasicItems();
-		loadItems();
-
-		// TODO: register listener on the manager for toolpalette change event.
-
-	}
-
-	/**
-	 * @return the paletteContext 
-	 */
-	public IPaletteContext getPaletteContext() {
-		return _paletteContext;
-	}
-	
-	/**
-	 * @return the paletteContext 
-	 */
-	public IFile getFile() {
-		return _file;
-	}
-	/**
-	 * @return IPaletteItemManager instance for this root
-	 */
-	public IPaletteItemManager getPaletteManager() {
-		return this._manager;
-	}
-
-	private void setupBasicItems() {
-		// Preferences prefs = PDPlugin.getDefault().getPluginPreferences();
-		// _showAll = prefs.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-
-		// a group of default control tools
-		// JSFPalette.DefaultGroup.LabelJSFPallete=Controls
-		PaletteGroup controls = new PaletteGroup(PageDesignerResources
-				.getInstance().getString(
-						"JSFPalette.DefaultGroup.LabelJSFPallete")); //$NON-NLS-1$
-		add(controls);
-		// the selection tool
-		ToolEntry tool = new SelectionToolEntry() {
-			public Tool createTool() {
-				return new RangeSelectionTool();
-			}
-		};
-		controls.add(tool);
-
-		// use selection tool as default entry
-		setDefaultEntry(tool);
-
-		// the marquee selection tool
-		controls.add(new MarqueeToolEntry());
-	}
-
-	private void loadItems() {
-		// _showAll =
-		// PDPlugin.getDefault().getPluginPreferences().getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		// remove other things first.
-		removeItems();
-		
-		if (_manager != null) {
-			this.addAll(_manager.getAllCategories());
-		};
-	}
-
-	/**
-	 * remove everything from the paletteroot
-	 * 
-	 */
-	protected void removeItems() {
-		// we try to remove anything other than the basic
-		// group that have the selectentry and marqeeentry
-		List children1 = new ArrayList(getChildren());
-		children1.remove(0); // remove the first one
-		for (int i = 0, n = children1.size(); i < n; i++) {
-			this.remove((PaletteEntry) children1.get(i));
-		}
-	}
-
-	/**
-	 * refresh the palette, normally caused by preference change.
-	 */
-	public void refresh() {
-		loadItems();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java
deleted file mode 100644
index 77bbe64..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * Factory for creating DesignerPaletteRoots
- * @author mengbo 
- */
-public class DesignerPaletteRootFactory {
-	/** Default palette size. */
-	private static final int DEFAULT_PALETTE_SIZE = 125;
-
-	/** Preference ID used to persist the palette location. */
-	private static final String PALETTE_DOCK_LOCATION = "DesignerPaletteRootFactory.Location"; //$NON-NLS-1$
-
-	/** Preference ID used to persist the palette size. */
-	private static final String PALETTE_SIZE = "DesignerPaletteRootFactory.Size"; //$NON-NLS-1$
-
-	/** Preference ID used to persist the flyout palette's state. */
-	private static final String PALETTE_STATE = "DesignerPaletteRootFactory.State"; //$NON-NLS-1$
-
-	/**
-	 * Return a {@link FlyoutPreferences} instance used to save/load the preferences of
-	 * a flyout palette.
-	 * @return FlyoutPreferences
-	 */
-	public static FlyoutPreferences createPalettePreferences() {
-		// set default flyout palette preference values, in case the preference
-		// store
-		// does not hold stored values for the given preferences
-		getPreferenceStore().setDefault(PALETTE_DOCK_LOCATION, -1);
-		getPreferenceStore().setDefault(PALETTE_STATE, -1);
-		getPreferenceStore().setDefault(PALETTE_SIZE, DEFAULT_PALETTE_SIZE);
-
-		return new FlyoutPreferences() {
-			public int getDockLocation() {
-				return getPreferenceStore().getInt(PALETTE_DOCK_LOCATION);
-			}
-
-			public int getPaletteState() {
-				return getPreferenceStore().getInt(PALETTE_STATE);
-			}
-
-			public int getPaletteWidth() {
-				return getPreferenceStore().getInt(PALETTE_SIZE);
-			}
-
-			public void setDockLocation(int location) {
-				getPreferenceStore().setValue(PALETTE_DOCK_LOCATION, location);
-			}
-
-			public void setPaletteState(int state) {
-				getPreferenceStore().setValue(PALETTE_STATE, state);
-			}
-
-			public void setPaletteWidth(int width) {
-				getPreferenceStore().setValue(PALETTE_SIZE, width);
-			}
-		};
-	}
-
-	/**
-	 * Returns the preference store for the PDPlugin.
-	 * 
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#getPreferenceStore()
-	 */
-	private static IPreferenceStore getPreferenceStore() {
-		return PDPlugin.getDefault().getPreferenceStore();
-	}
-
-//	/**
-//	 * Creates the PaletteRoot and adds all palette elements. Use this factory
-//	 * method to create a new palette for your graphical editor.
-//	 * <p>
-//	 * <i>Note: cannot support facelets</i>
-//	 * @param project 
-//	 * @return a new PaletteRoot
-//	 * @deprecated - use createPaletteRoot(IFile file)
-//	 */
-//	public static PaletteRoot createPaletteRoot(IProject project) {
-//		PaletteItemManager manager = PaletteItemManager.getInstance(project);
-//		if (manager == null) {
-//			return null;
-//		}
-//		manager.reset();
-//		PaletteRoot palette = new DesignerPaletteRoot(manager);
-//		return palette;
-//	}
-	
-	/**
-	 * Creates the PaletteRoot and adds all palette elements. Use this factory
-	 * method to create a new palette for your graphical editor.
-	 * @param file 
-	 * @return a new PaletteRoot
-	 */
-	public static PaletteRoot createPaletteRoot(final IFile file) {
-		return new DesignerPaletteRoot(file);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java
deleted file mode 100644
index b64e26e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * XXX: currently create this class is just for add/remove listener to
- * preference change, so can refresh the palette.
- * 
- * @author mengbo
- * @author mengbo
- * @version 1.5
- */
-public class DesignerPaletteViewer extends PaletteViewer {
-
-	private PaletteCustomizerDialog _customizerDialog = null;
-
-	private DesignerPaletteCustomizer _customizer;
-
-	/**
-	 * 
-	 */
-	public DesignerPaletteViewer() {
-		super();
-
-		this.enableVerticalScrollbar(true);
-	}
-
-//	Preferences.IPropertyChangeListener listener = new Preferences.IPropertyChangeListener() {
-//		public void propertyChange(PropertyChangeEvent event) {
-//			PaletteRoot root = getPaletteRoot();
-//			if (root instanceof DesignerPaletteRoot) {
-////				((DesignerPaletteRoot) root).refresh();
-//				// XXX: setActiveTool to null to workaround GEF bug of NPE
-//				// setActiveTool(null);
-//			}
-//		}
-//	};
-	
-	final IEntryChangeListener _paletteModelListener = new IEntryChangeListener() {
-
-		public void modelChanged(List oldDefinitions, List newDefinitions) {
-			final PaletteRoot root = getPaletteRoot();
-			if (root instanceof DesignerPaletteRoot) {
-                Control viewerControl = getControl();
-                
-                if (viewerControl != null && !viewerControl.isDisposed())
-                {
-                    Display  display = viewerControl.getDisplay();
-                    
-                    if (display != null && !display.isDisposed())
-                    {
-                        // this updates the UI, so it must be run on
-                        // the display thread
-                        display.asyncExec(new Runnable()
-                        {
-                            public void run() {
-                                ((DesignerPaletteRoot) root).refresh();
-                            }
-                        });
-                    }
-                }
-			}
-		}
-
-	};
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewer#hookControl()
-	 */
-	protected void hookControl() {
-		super.hookControl();
-//		PDPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(
-//				listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewer#unhookControl()
-	 */
-	protected void unhookControl() {
-//		PDPlugin.getDefault().getPluginPreferences()
-//				.removePropertyChangeListener(listener);
-		// remove palette model change listener
-		PaletteRoot root = getPaletteRoot();
-		if (root instanceof DesignerPaletteRoot) {
-			if (_customizer != null){
-				_customizer.setPaletteRoot(null);
-			}
-			IPaletteItemManager imanager = ((DesignerPaletteRoot) root)
-					.getPaletteManager();
-			if (imanager instanceof PaletteItemManager) {
-				PaletteItemManager manager = (PaletteItemManager) imanager;
-//				ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-//						_resourceChangeListener);
-				manager.removeEntryChangeListener(_paletteModelListener);				
-//				PaletteItemManager.clearPaletteItemManager();
-				manager.release(((DesignerPaletteRoot)root).getPaletteContext());
-			}
-		}
-		super.unhookControl();
-	}
-
-	public PaletteCustomizerDialog getCustomizerDialog() {
-		if (_customizerDialog == null){
-			_customizerDialog = DesignerPaletteCustomizationsHelper.getNewCustomizerDialog(this, getCustomizer() );	
-		}
-		return _customizerDialog;
-	}
-
-	public PaletteCustomizer getCustomizer() {
-		if (_customizer == null){
-			_customizer = DesignerPaletteCustomizationsHelper.getNewCustomizer();
-			_customizer.setPaletteRoot((DesignerPaletteRoot)this.getPaletteRoot());
-		}
-		return _customizer;
-	}
-	
-	public void setPaletteRoot(PaletteRoot root) {
-		super.setPaletteRoot(root);
-		// add palette model change listener
-		// PaletteRoot root = getPaletteRoot();
-		if (root instanceof DesignerPaletteRoot) {
-			((DesignerPaletteRoot) root).getPaletteManager()
-					.addEntryChangeListener(_paletteModelListener);
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
deleted file mode 100644
index 57a8b74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
-import org.eclipse.gef.internal.ui.palette.editparts.DrawerEditPart;
-import org.eclipse.gef.ui.palette.PaletteContextMenuProvider;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteViewerProvider extends PaletteViewerProvider {
-	/**
-	 * @param graphicalViewerDomain
-	 */
-	public DesignerPaletteViewerProvider(EditDomain graphicalViewerDomain) {
-		super(graphicalViewerDomain);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewerProvider#configurePaletteViewer(org.eclipse.gef.ui.palette.PaletteViewer)
-	 */
-	protected void configurePaletteViewer(PaletteViewer viewer) {
-		// super.configurePaletteViewer(viewer);
-		viewer.setContextMenu(new PaletteContextMenuProvider(viewer) {
-			public void buildContextMenu(IMenuManager menu) {
-				StructuredSelection sel = (StructuredSelection)getViewer().getSelection();
-				if (sel != null 
-						&& sel.getFirstElement() instanceof DrawerEditPart
-						&& ((DrawerEditPart)sel.getFirstElement()).getDrawer() instanceof TaglibPaletteDrawer)
-					menu.add(new HideTagLibAction((DrawerEditPart)sel.getFirstElement(), Messages.DesignerPaletteViewerProvider_Hide));
-				super.buildContextMenu(menu);
-			}
-		});
-
-		// XXX: should only use the following when we use Template
-		viewer
-				.addDragSourceListener(new TemplateTransferDragSourceListener(
-						viewer));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewerProvider#createPaletteViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	public PaletteViewer createPaletteViewer(Composite parent) {
-		PaletteViewer pViewer = new DesignerPaletteViewer();
-		pViewer.createControl(parent);
-		configurePaletteViewer(pViewer);
-		pViewer.setCustomizer(new DesignerPaletteCustomizer());
-		hookPaletteViewer(pViewer);
-
-		PlatformUI
-				.getWorkbench()
-				.getHelpSystem()
-				.setHelp(
-						parent,
-						PDPlugin
-								.getResourceString("DesignerPaletteViewerProvider.help.id")); //$NON-NLS-1$
-
-		return pViewer;
-	}
-	
-	private static class HideTagLibAction extends Action {
-		private DrawerEditPart tagLib;
-		
-		/**
-		 * Constructor
-		 * @param tagLibDrawer
-		 * @param string
-		 */
-		public HideTagLibAction(DrawerEditPart tagLibDrawer, String string) {
-			super(string);
-			this.tagLib = tagLibDrawer;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			TaglibPaletteDrawer pd = (TaglibPaletteDrawer)tagLib.getDrawer();
-			pd.setVisible(false);
-			DesignerPaletteCustomizationsHelper.hideTaglibDrawer(pd);
-		}		
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceData.java
deleted file mode 100644
index e31a325..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceData.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Data describing a palette drop.
- * 
- * @author cbateman
- *
- */
-public interface IDropSourceData
-{
-    /**
-     * @return uri of the tag's library. MUST NOT BE NULL.
-     */
-    public String getNamespace();
-    /**
-     * @return a unique id for a tag creation provider that may be different
-     * from the uri. MUST NOT BE NULL.
-     */
-    public String getId();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceDataProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceDataProvider.java
deleted file mode 100644
index d3116d0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IDropSourceDataProvider.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Used by objects (usually palette entries) that wish provide drop source data
- * to a client.
- * 
- * @author cbateman
- *
- */
-public interface IDropSourceDataProvider
-{
-    /**
-     * @return a drop source data in context
-     */
-    IDropSourceData  getDropSourceData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java
deleted file mode 100644
index 2f4667e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-/**
- * @author mengbo
- */
-public interface IEntryChangeListener {
-	/**
-	 * @param oldDefinitions
-	 *            the old taglib definitions
-	 * @param newDefinitions
-	 *            the new taglib definitions
-	 */
-	void modelChanged(List oldDefinitions, List newDefinitions);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java
deleted file mode 100644
index dcbf651..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Constants used by palette customizations persistence
- * 
- * @author mengbo
- */
-public interface IPaletteConstants {
-	/**
-	 * 
-	 */
-	public static final String BUNDLE_ID = "org.eclipse.jst.pagedesigner"; //$NON-NLS-1$
-
-	/**
-	 * contant for palett-item element name
-	 */
-	public static final String ROOT = "palette-item"; //$NON-NLS-1$
-
-	/**
-	 * constant for uri attribute
-	 */
-	public static final String URI = "uri"; //$NON-NLS-1$
-
-	/**
-	 * Constant for hidden attribute
-	 */
-	public static final String ISHIDDEN = "hidden"; //$NON-NLS-1$
-
-	/**
-	 * constant for id attribute
-	 */
-	public static final String ID = "id"; //$NON-NLS-1$
-	
-	/**
-	 * constant for category element name
-	 */
-	public static final String CATEGORY_TAG = "category"; //$NON-NLS-1$
-	
-//OLD - no longer/currently used
-
-//	public static final String EXTENSION_POINT_ID = "ResourceContributions"; //$NON-NLS-1$
-//	public static final String FILENAME = "/tag.xml"; //$NON-NLS-1$
-//	public static final String TAGNAME = "tagName"; //$NON-NLS-1$
-//	public static final String ITEM_TAG = "item"; //$NON-NLS-1$
-//	public static final String EXPERT = "expert"; //$NON-NLS-1$
-//	public static final String LARGEICON = "largeIcon"; //$NON-NLS-1$
-//	public static final String SMALLICON = "smallIcon"; //$NON-NLS-1$
-//	public static final String LABEL = "label"; //$NON-NLS-1$
-//	public static final String INITIALSTATE = "initialState"; //$NON-NLS-1$
-//	public static final String SHORTDESC = "shortDesc"; //$NON-NLS-1$
-//	public static final String ATTRIBUTE_TAG = "attribute"; //$NON-NLS-1$
-//	public static final String NAME = "name"; //$NON-NLS-1$
-//	public static final String VALUE = "value"; //$NON-NLS-1$
-//	public static final String ICONPREFIX = "iconPrefix"; //$NON-NLS-1$
-//	public static final String TAGLIBEXT = "capability"; //$NON-NLS-1$
-//	public static final String JARPROTO = "jar:file://"; //$NON-NLS-1$
-//	public static final String FILEPROTO = "file://"; //$NON-NLS-1$
-//	public static final String REQUIREHFORM = "requireHForm"; //$NON-NLS-1$
-//	public static final String JSFCOMPONENTCATEGORY = "jsfComponentCategory"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteContext.java
deleted file mode 100644
index c8a940f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteContext.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.jsf.context.IModelContext;
-
-/**
- * Context in which the WPE palette is operating
- *
- */
-public interface IPaletteContext extends IModelContext {
-	/**
-	 * @return IFile
-	 */
-	public IFile getFile();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteFactory.java
deleted file mode 100644
index 703ccf7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteFactory.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2009 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.views.palette.PaletteViewerPage;
-import org.eclipse.ui.IEditorInput;
-
-/**
- * Create a palette parts to replace the default palette  in
- * the Web Page Editor.
- * 
- * If any of the create methods return null, the default WPE behaviour will be used.
- */
-public interface IPaletteFactory {
-	/**
-	 * @param provider
-	 * @return {@link PaletteViewerPage} - MAY return null. If null, the default palette viewer page will be used. 
-	 */
-	public PaletteViewerPage createPaletteViewerPage(PaletteViewerProvider provider) ;
-	
-	/**
-	 * @param domain
-	 * @return {@link PaletteViewerProvider} - may return null. If null, the default paletteViewerProvider will be used. 
-	 */
-	public PaletteViewerProvider createPaletteViewerProvider(EditDomain domain) ;
-
-	/**
-	 * @param editorInput
-	 * @return PaletteRoot  - may return null.   If null, the default palette root will be used. 
-	 */
-	public PaletteRoot createPaletteRoot(IEditorInput editorInput);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java
deleted file mode 100644
index 7b2b154..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory.TagRegistryIdentifier;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-
-/**
- * PaletteItemManager interface.
- * 
- * NOT intended to be implemented by clients
- * 
- * @author mengbo
- */
-public interface IPaletteItemManager {
-	/**
-	 * @return IProject
-	 */
-	public TagRegistryIdentifier getTagRegistryIdentifier();
-	
-	/**
-	 * @return list of {@link TaglibPaletteDrawer}s being managed for this project 
-	 */
-	public List/*TaglibPaletteDrawer*/ getAllCategories();
-
-	/**
-	 * Create a TaglibPaletteDrawer with given label for given id
-	 * 
-	 * @param id
-	 * @param label 
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer createTaglibPaletteDrawer(String id, String label);
-
-	/**
-	 * Retrieve the TaglibPaletteDrawer by id.  May be null.
-	 * 
-	 * @param id
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer getTaglibPalletteDrawer(String id);
-
-	/**
-	 * Locate by id, and if not found,  create a TaglibPaletteDrawer using label and id
-	 * 
-	 * @param id
-	 * @param label
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findOrCreateCategory(String id, String label);
-
-	/**
-	 * Adds a listener to the list of those notified when the model contents are
-	 * replaced
-	 * 
-	 * @param listener -
-	 *            the listener to add
-	 */
-	void addEntryChangeListener(IEntryChangeListener listener);
-
-	/**
-	 * Adds a listener to the list of those notified when the model contents are
-	 * replaced
-	 * 
-	 * @param listener -
-	 *            the listener to remove
-	 */
-	void removeEntryChangeListener(IEntryChangeListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ITagDropSourceData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ITagDropSourceData.java
deleted file mode 100644
index 16af8d8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ITagDropSourceData.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-
-/**
- * Provides generic information for tag creation from a palette drop.
- * 
- * @author cbateman
- * 
- */
-public interface ITagDropSourceData extends IDropSourceData
-{
-    /**
-     * @return tagName
-     */
-    public String getTagName();
-
-    /**
-     * Convenience method returning the tag libraries default prefix, if
-     * applicable
-     * 
-     * @return default prefix
-     */
-    public String getDefaultPrefix();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/Messages.java
deleted file mode 100644
index 0bf1737..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler	
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.editors.palette.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String DesignerPaletteCustomizerDialog_ExportCustomizations;
-	/**
-	 * see messages.properties
-	 */
-	public static String DesignerPaletteCustomizerDialog_ImportCustomizations;
-	/**
-	 * see messages.properties
-	 */
-	public static String DesignerPaletteViewerProvider_Hide;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/MetadataTagDropSourceData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/MetadataTagDropSourceData.java
deleted file mode 100644
index 64d8d40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/MetadataTagDropSourceData.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * A source data that is enhanced by metadata.
- * 
- * @author cbateman
- *
- */
-public final class MetadataTagDropSourceData implements ITagDropSourceData
-{
-    private final IDOMModel _model;
-    private final TagCreationInfo _tagCreationInfo;
-    private final ITagDropSourceData _delegate;
-
-    /**
-     * @param creationProvider
-     * @param model
-     */
-    public MetadataTagDropSourceData(
-            final ITagDropSourceData creationProvider,
-            final IDOMModel model)
-    {
-        _delegate = creationProvider;
-        _model = model;
-        _tagCreationInfo = getTagCreationInfo();
-    }
-
-    /**
-     * @return the pre-defined attributes for the tag from meta-data or
-     *  null if none.
-     */
-    public List<TagCreationAttribute> getAttributes()
-    {
-        if (_tagCreationInfo != null)
-        {
-            return _tagCreationInfo.getAttributes();
-        }
-        return null;
-    }
-
-    /**
-     * @return the template derived from metadata for tag drop or null if none.
-     */
-    public String getTemplate()
-    {
-        if (_tagCreationInfo != null)
-        {
-            return (String) _tagCreationInfo.getTemplate();
-        }
-        return null;
-    }
-
-    public String getDefaultPrefix()
-    {
-        return _delegate.getDefaultPrefix();
-    }
-
-    public String getTagName()
-    {
-        return _delegate.getTagName();
-    }
-
-    public String getNamespace()
-    {
-        return _delegate.getNamespace();
-    }
-
-    private TagCreationInfo getTagCreationInfo()
-    {
-        final ITaglibDomainMetaDataModelContext metadataContext = CommandUtil
-                .getMetadataContext(getNamespace(), _model);
-        TagCreationInfo tagCreationInfo = null;
-        String id = getId();
-        if (metadataContext != null && id != null)
-        {
-            tagCreationInfo = createCreationInfo(metadataContext, id,
-                    getTagName());
-        }
-        return tagCreationInfo;
-    }
-
-    public String getId()
-    {
-        return _delegate.getId();
-    }
-    
-    /**
-     * @param metaDataContext
-     * @param id
-     * @param tagName
-     * @return a tag creation info for the tag and id in the metadata context
-     */
-    static TagCreationInfo createCreationInfo(
-            final ITaglibDomainMetaDataModelContext metaDataContext,
-            final String id, final String tagName)
-    {
-        final Model model = TaglibDomainMetaDataQueryHelper
-                .getModel(metaDataContext);
-        if (model != null)
-        {
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model,
-                    PaletteInfos.TRAIT_ID);
-            if (trait != null)
-            {
-                final PaletteInfos pis = (PaletteInfos) trait.getValue();
-                final PaletteInfo pi = pis.findPaletteInfoById(id);
-                if (pi != null)
-                {
-                    return pi.getTagCreation();
-                }
-            }
-            // tag-creation trait on entity directly?
-            final Entity tag = getTagEntity(metaDataContext, tagName);
-            if (tag != null)
-            {// metadata exists
-                trait = TaglibDomainMetaDataQueryHelper.getTrait(tag,
-                        "tag-create"); //$NON-NLS-1$
-                if (trait != null && trait.getValue() != null)
-                {
-                    return (TagCreationInfo) trait.getValue();
-                }
-            }
-        }
-        return null;
-    }
-    /**
-     * @param metaDataContext
-     * @param tagName
-     * @return the {@link Entity} for this tag element being created
-     */
-    private static Entity getTagEntity(
-            final ITaglibDomainMetaDataModelContext metaDataContext,
-            final String tagName)
-    {
-        return TaglibDomainMetaDataQueryHelper.getEntity(metaDataContext,
-                tagName);
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java
deleted file mode 100644
index f115bfe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class ShowAllAction extends Action {
-	Preferences _preferences = null;
-
-	/**
-	 * @param pluginPreferences
-	 */
-	public ShowAllAction(Preferences pluginPreferences) {
-		super(PDPlugin.getResourceString("ShowAllAction.ActionLabel.ShowAll")); //$NON-NLS-1$
-		_preferences = pluginPreferences;
-		boolean showAll = _preferences
-				.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		this.setChecked(showAll);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		boolean showAll = _preferences
-				.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		// toggle the show all status. preference will fire out change event,
-		// and palettes
-		// receive this event will refresh
-		_preferences.setValue(IJMTConstants.PREF_PALETTE_SHOW_ALL, !showAll);
-		this.setChecked(!showAll);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagImageManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagImageManager.java
deleted file mode 100644
index fe6d5b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagImageManager.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Locates and creates Images for tags using the common metadata framework.
- * 
- * Images are cached in the PDPlugin's ImageRegistry.  
- * 
- * Some code is being duplicated in palette helper.   PaletteHelper should be re-factored to use this code
- * 
- */
-public class TagImageManager {
-	
-	private static final String PALETTE_DEFAULT_IMAGE_FILE = "palette/GENERIC/large/PD_Palette_Default.gif"; //$NON-NLS-1$
-
-	private static TagImageManager INSTANCE = null;
-	
-	private final static ImageDescriptor DEFAULT_SMALL_ICON = JSFUICommonPlugin
-	.getDefault().getImageDescriptor(
-		JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-
-	private final static ImageDescriptor DEFAULT_LARGE_ICON = PDPlugin
-		.getDefault().getImageDescriptor(
-				PALETTE_DEFAULT_IMAGE_FILE);
-
-	private static final String TRAIT_ICON_SMALL = "small-icon"; //$NON-NLS-1$
-
-	private static final String TRAIT_ICON_LARGE = "large-icon"; //$NON-NLS-1$
-	
-	/**
-	 * @return singleton instance 
-	 */
-	public synchronized static TagImageManager getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new TagImageManager();
-		}
-		return INSTANCE;
-	}	
-	
-	/**
-	 * Returns small image using metadata and may be null.  Caller should NOT dispose the image, but should call TagImageManager's dispose(image)
-	 * @param project
-	 * @param nsUri
-	 * @param tagName
-	 * @return small image using metadata.  May be null.
-	 */
-	public Image getSmallIconImage(IProject project, String nsUri, String tagName) {
-		Image image = null;
-		Model model = getModel(project, nsUri);
-		if (model != null){
-			ImageDescriptor imgDesc = getSmallIconImageDescriptor(model, tagName);
-			image = getOrCreateImage(imgDesc);
-		}
-		
-		return image;
-	}
-
-	/**
-	 * @param project
-	 * @param nsUri
-	 * @param tagName
-	 * @return large image using metadata.  May be null.
-	 */
-	public Image getLargeIconImage(IProject project, String nsUri, String tagName) {
-		Image image = null;
-		Model model = getModel(project, nsUri);
-		if (model != null){
-			ImageDescriptor imgDesc = getLargeIconImageDescriptor(model, nsUri);
-			image = getOrCreateImage(imgDesc);	
-		}
-		
-		return image;
-	}
-	
-	/**
-	 * Gets, and creates if necessary, a shared image.
-	 * @param imageDescriptor
-	 * @return Image from shared cache
-	 */
-	public static Image getOrCreateImage(ImageDescriptor imageDescriptor) {
-		Image image = null;
-		if (imageDescriptor != null){
-			image = PDPlugin.getDefault().getImageRegistry().get(imageDescriptor.toString());
-			if (image == null ){
-				image = imageDescriptor.createImage();
-				PDPlugin.getDefault().getImageRegistry().put(imageDescriptor.toString(), image);
-			} else if (image.isDisposed()){ //should not occur, but handling just in case				
-				PDPlugin.getDefault().getImageRegistry().remove(imageDescriptor.toString());
-				image = imageDescriptor.createImage();
-				PDPlugin.getDefault().getImageRegistry().put(imageDescriptor.toString(), image);
-			}
-		}
-		return image;
-	}
-	
-	private Model getModel(IProject project, String nsUri) {
-		ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsUri);
-		Model model =TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		// no caching at this time so there is no need to listen to model notifications
-//		if (model != null && !hasAdapter(model))
-//			addAdapter(model);
-		return model;
-	}
-
-
-//	private void addAdapter(Model model) {
-//		if (model != null){			
-////			model.eAdapters().add(INSTANCE);  
-//		}		
-//	}
-//
-//	private boolean hasAdapter(Model model) {
-//		for(Adapter a : model.eAdapters()){
-//			if (a == INSTANCE)
-//				return true;
-//		}
-//		return false;
-//	}
-
-	private ImageDescriptor getSmallIconImageDescriptor(Model model, String tagName) {
-		return getIconImageDescriptor(model, tagName, true);
-	}
-	
-	private ImageDescriptor getLargeIconImageDescriptor(Model model, String tagName) {
-		return getIconImageDescriptor(model, tagName, false);
-	}
-	
-	private ImageDescriptor getIconImageDescriptor(Model model, String tagName, boolean small) {		
-		ImageDescriptor icon = null;
-		
-		//use palette infos if available
-		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "paletteInfos"); //$NON-NLS-1$
-		if (trait != null){
-			PaletteInfos tags = (PaletteInfos)trait.getValue();
-			for (Iterator it=tags.getInfos().iterator();it.hasNext();){
-				PaletteInfo tag = (PaletteInfo)it.next();
-				if (tag.getId().equalsIgnoreCase(tagName)){					
-					IMetaDataSourceModelProvider sourceProvider = ((Trait)tag.eContainer().eContainer()).getSourceModelProvider();
-					if (small)
-						icon = getImageDescriptorFromString(sourceProvider, tag.getSmallIcon(), DEFAULT_SMALL_ICON);
-					else
-						icon = getImageDescriptorFromString(sourceProvider, tag.getLargeIcon(), DEFAULT_LARGE_ICON);
-					
-					break;
-				}
-			}	
-		}
-		if (icon == null) {
-			for (Iterator it=model.getChildEntities().iterator();it.hasNext();){
-				Entity tagAsEntity = (Entity)it.next();
-				if (tagAsEntity.getId().equalsIgnoreCase(tagName)){										
-					if (small)
-						icon = getImageDescriptorFromTagTraitValueAsString(tagAsEntity, TRAIT_ICON_SMALL, DEFAULT_SMALL_ICON);
-					else
-						icon = getImageDescriptorFromTagTraitValueAsString(tagAsEntity, TRAIT_ICON_LARGE, DEFAULT_LARGE_ICON);	
-					
-					break;
-				}				
-			}
-			
-		}
-
-		return icon;
-	}
-		
-	private ImageDescriptor getImageDescriptorFromString(IMetaDataSourceModelProvider sourceModelProvider,  String imgDesc, ImageDescriptor defaultValue){
-		ImageDescriptor image = defaultValue;
-		IImageDescriptorProvider imageProvider = (IImageDescriptorProvider)sourceModelProvider.getAdapter(IImageDescriptorProvider.class);			
-		if (imageProvider != null){
-			image = imageProvider.getImageDescriptor(imgDesc);
-		}
-		return image;
-	}
-	
-	private ImageDescriptor getImageDescriptorFromTagTraitValueAsString(Entity entity, String key, ImageDescriptor defaultValue){
-		Trait t = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (t != null){
-			String imgDesc = TraitValueHelper.getValueAsString(t);
-			return getImageDescriptorFromString(t.getSourceModelProvider(), imgDesc, defaultValue);
-		}
-		return defaultValue;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolCreationAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolCreationAdapter.java
deleted file mode 100644
index 2ac052e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolCreationAdapter.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * ITagDropSourceData implementation useable by TagToolPaletteEntry for its 
- * drop transfer object.
- * 
- * @author cbateman
- * 
- */
-public final class TagToolCreationAdapter implements ITagDropSourceData
-{
-    private String _uri;
-    private String _tagName;
-    private String _defaultPrefix;
-    private String _id;
-
-    /**
-     * @param uri 
-     * @param tagName 
-     * @param defaultPrefix 
-     * @param id 
-     */
-    public TagToolCreationAdapter(final String uri,  final String tagName, final String defaultPrefix,
-            final String id)
-    {
-        _uri = uri;
-        _tagName = tagName;
-        _defaultPrefix = defaultPrefix;
-        _id = id;        
-    }
-
-    public String getDefaultPrefix()
-    {
-        return _defaultPrefix;
-    }
-
-    public String getTagName()
-    {
-        return _tagName;
-    }
-
-    public String getNamespace()
-    {
-        return _uri;
-    }
-
-    public String getId()
-    {
-        return _id;
-    }
-
-    /**
-     * @param provider
-     * @param model
-     * @return a metadata tag creation adapter for an existing tag
-     * creation provider (which need not itself be a TagToolCreationAdapter)
-     * and a dom model.
-     */
-    public static MetadataTagDropSourceData createMdTagCreationProvider(final ITagDropSourceData provider, final IDOMModel model)
-    {
-        return new MetadataTagDropSourceData(provider, model);
-    }
-
-    /**
-     * @param container
-     * @param paletteContext 
-     * @return the tag creation provider
-     */
-    public static ITagDropSourceData findProviderForContainer(
-            final QName container, final IPaletteContext paletteContext)
-    {
-    	
-        return findProviderForContainer(container.getNamespaceURI(), container
-                .getLocalPart(), paletteContext);
-    }
-
-    /**
-     * @param uri
-     * @param tagName
-     * @param paletteContext
-     * @return the tag creation provider
-     */
-    public static ITagDropSourceData findProviderForContainer(
-            final String uri, final String tagName,
-            final IPaletteContext paletteContext)
-    {
-    	final PaletteItemManager itemManager = PaletteItemManager.getInstance(paletteContext);
-        if (itemManager != null) {
-	    	final TaglibPaletteDrawer category = itemManager.findCategoryByURI(uri);
-	        if (category != null)
-	        {
-	            final TagToolPaletteEntry tagItem = category
-	                    .getTagPaletteEntryByTagName(tagName);
-	            if (tagItem != null)
-	            {
-	                return tagItem.getTemplate();
-	            }
-	        }
-        }
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java
deleted file mode 100644
index 7483504..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationTool;
-
-/**
- * Represents a tag palette item entry in the web page designer palette
- * 
- */
-public class TagToolPaletteEntry extends CombinedTemplateCreationEntry
-        implements IDropSourceDataProvider
-{
-
-    /**
-     * Constructor
-     * 
-     * @param template
-     *            the template item for the drop
-     * @param label
-     * @param shortDescription
-     * @param iconSmall
-     * @param iconLarge
-     */
-    public TagToolPaletteEntry(final ITagDropSourceData template,
-            final String label, final String shortDescription,
-            final ImageDescriptor iconSmall, final ImageDescriptor iconLarge)
-    {
-        super(label, shortDescription, template, NOOP_FACTORY, iconSmall,
-                iconLarge);
-    }
-
-    /**
-     * @return tagName
-     */
-    public String getTagName()
-    {
-        return getTemplate().getTagName();
-    }
-
-    /**
-     * Convenience method returning the tag libraries default prefix, if
-     * applicable
-     * 
-     * @return default prefix
-     */
-    public String getDefaultPrefix()
-    {
-        return getTemplate().getDefaultPrefix();
-    }
-
-    /**
-     * @return uri of the tag's library
-     */
-    public String getURI()
-    {
-        return getTemplate().getNamespace();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.gef.palette.ToolEntry#createTool()
-     */
-    @Override
-    public Tool createTool()
-    {
-        return new ItemCreationTool(getTemplate());
-    }
-
-    private final static CreationFactory NOOP_FACTORY = new CreationFactory()
-    {
-        public Object getNewObject()
-        {
-            // should never get called
-            throw new UnsupportedOperationException(
-                    "createTool should be overriden, so this should never be called"); //$NON-NLS-1$
-        }
-
-        public Object getObjectType()
-        {
-            // should never get called
-            throw new UnsupportedOperationException(
-                    "createTool should be overriden, so this should never be called"); //$NON-NLS-1$
-        }
-    };
-
-    @Override
-    public ITagDropSourceData getTemplate()
-    {
-        return (ITagDropSourceData) super.getTemplate();
-    }
-
-    public IDropSourceData getDropSourceData()
-    {
-        return getTemplate();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java
deleted file mode 100644
index 83ebf27..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.MetadataTagDropSourceData;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-import org.xml.sax.SAXException;
-
-/**
- * 
- * @author mengbo
- */
-public class PaletteElementTemplateHelper {
-	//private static final String TEMPLATE_ITEM_NAME = "template";
-
-	private static final String PREFIX_ATTRIBUTE = "_uri_"; //$NON-NLS-1$
-
-//	private static Logger _log = PDPlugin
-//			.getLogger(PaletteElementTemplateHelper.class);
-
-	/**
-	 * This method is used to process template element which is read from .xmi
-	 * file and generate default element.
-	 * 
-	 * @param model
-	 * @param element
-	 * @param creationProvider 
-	 */
-	public static void applyTemplate(IDOMModel model, Element element,
-	        MetadataTagDropSourceData creationProvider) {
-		if (element == null || element.getLocalName() == null) {
-			return;
-		}
-		
-		Node[] templateNodes = getTemplateNodes(model,  creationProvider);
-		if (templateNodes != null) {
-			for (int i=0;i<templateNodes.length;i++){
-				Node anode = templateNodes[i];
-				element.appendChild(anode);				
-			}
-		}
-	}
-
-	private static Node[] getTemplateNodes(IDOMModel model,
-	        MetadataTagDropSourceData creationProvider) {
-
-		if (creationProvider == null)
-			return null;
-		
-		String template = creationProvider.getTemplate();
-		if (template != null){
-			
-			final String nodeStr = prepareNode(template);//(String)template.getTemplate();
-			final Logger logger = PDPlugin.getLogger(PaletteElementTemplateHelper.class); 
-			try {
-				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-				factory.setNamespaceAware(true);
-				factory.setValidating(false);
-				DocumentBuilder builder = factory.newDocumentBuilder();
-				Document doc = builder.parse(new ByteArrayInputStream( nodeStr.getBytes()));
-				Node beginNode = doc.getFirstChild();
-				Node templateNode = beginNode.cloneNode(true);//model.getDocument().importNode(beginNode, true);
-				Node[] templateNodes = applyPrefixes(model, templateNode.getChildNodes(), model.getDocument());
-				return templateNodes;
-			} catch (ParserConfigurationException e) {
-			    logger.error(e);
-			} catch (SAXException e) {
-                logger.error(e);
-			} catch (IOException e) {
-                logger.error(e);
-			} catch (Exception e){
-                logger.error(e);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param template
-	 * @return xml as String wrapped by a <begin> node as template may not have a single root element
-	 */
-	private static String prepareNode(String template) {
-		StringBuffer buf = new StringBuffer("<begin>"); //$NON-NLS-1$
-		buf.append(template);
-		buf.append("</begin>"); //$NON-NLS-1$
-		return buf.toString();
-	}
-
-	/**
-	 * Use the actrual prefixs of jsf html and jsf core to set the prefix of
-	 * each node declared in template.
-	 * @param model 
-	 * @param templateNodes 
-	 * @param document 
-	 * @return Node[]
-	 * 
-	 */
-	public static Node[] applyPrefixes(IDOMModel model, 
-			NodeList templateNodes, Document document) {
-		List result = new ArrayList();
-		for (int i = 0, n = templateNodes.getLength(); i < n; i++) {
-			Node node = cloneNodeDeep(model, document, templateNodes.item(i));
-			if (node instanceof Element) {
-				result.add(node);
-			}
-		}
-		return (Node[]) result.toArray(new Node[result.size()]);
-	}
-
-	/**
-	 * TODO: Later we may add some logic to reference the tld file through tag
-	 * name to resolve the prefixs directly.
-	 */
-	private static void internalApplyPrefixes(IDOMModel model, Element refNode, Element node) {
-		if (node != null && refNode != null) {
-			String uri = refNode.getAttribute(PREFIX_ATTRIBUTE);
-			if (uri != null) {
-				String prefix = JSPUtil.getOrCreatePrefix(model, uri, null);
-				node.setPrefix(prefix);
-			}
-		}
-	}
-
-
-	/**
-	 * A deep clone of the sourceNode
-	 * @param model
-	 * @param destDoc
-	 * @param sourceNode
-	 * @return Node
-	 */
-	public static Node cloneNodeDeep(IDOMModel model, Document destDoc, Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			internalApplyPrefixes(model, sourceEle, resultEle);
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				if (!PREFIX_ATTRIBUTE.equalsIgnoreCase(a.getNodeName())) {
-					resultEle.setAttribute(a.getName(), a.getValue());
-				}
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeep(model, destDoc, n);
-				if (d != null) {
-					resultEle.appendChild(d);
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java
deleted file mode 100644
index 8abec47..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java
+++ /dev/null
@@ -1,690 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolCreationAdapter;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-
-/**
- * Helper class.
- */
-public class PaletteHelper {
-
-	// pattern to strip all <x> and </x> HTML tags
-	final private static Pattern removeHTMLTags = Pattern
-			.compile("<[/?\\w\\s=\"\\.\\#]+>"); //$NON-NLS-1$
-
-	// pattern to find all runs of spaces longer than one
-	final private static Pattern trimInteriorWhitespace = Pattern
-			.compile("[ ]+"); //$NON-NLS-1$
-
-	// pattern to find all new lines for removal
-	final private static Pattern removeNewLines = Pattern.compile("[\n]"); //$NON-NLS-1$
-
-	private final static ImageDescriptor DEFAULT_SMALL_ICON = JSFUICommonPlugin
-			.getDefault().getImageDescriptor(
-					JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-
-	private final static ImageDescriptor DEFAULT_LARGE_ICON = PDPlugin
-			.getDefault().getImageDescriptor(
-					"palette/GENERIC/large/PD_Palette_Default.gif"); //$NON-NLS-1$
-
-	// how many characters to truncate a palette item's description to.
-	// TODO: add preference?
-	// the soft length is the ideal length we try to truncate to. We first
-	// try to find a period (end of sentence; TODO: should have a character
-	// class)
-	// inside the first SOFT_LENGTH chars at which to truncate a description
-	// string.
-	// if we can't find one then we search for the first one between SOFT_LENGTH
-	// and min(HARD_LENGTH, str.length()). If found, we truncate there. If not,
-	// we truncate to HARD_LENGTH-" ...".length() and append the ellipsis.
-	// In all cases the truncated description string returned should <=
-	// HARD_LENGTH.
-	// private final static int DESCRIPTION_TRUNCATE_SOFT_LENGTH = 150;
-	private final static int DESCRIPTION_TRUNCATE_HARD_LENGTH = 250;
-
-//	private PaletteItemManager _paletteManager;
-
-	/*package*/ PaletteHelper(final PaletteItemManager manager) {
-//		_paletteManager = manager;
-	}
-	/**
-	 * Creates a TaglibPaletteDrawer with TagTool palette entries for each tag
-	 * from the CMDocument
-	 * 
-	 * @param manager
-	 * @param tldRec
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer configPaletteItemsByTLD(
-			final IPaletteItemManager manager, final ITaglibRecord tldRec) {
-
-		final String tldURI = CMUtil.getURIFromTaglibRecord(tldRec, manager.getTagRegistryIdentifier().getProject());
-
-		final CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-		final TLDDocument doc = (TLDDocument) factory.createCMDocument(tldRec);
-
-		return getOrCreateTaglibPaletteDrawer(manager, doc, tldURI);
-	}
-
-	/**
-	 * @param manager
-	 * @param doc
-	 * @param tldURI
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer getOrCreateTaglibPaletteDrawer(
-			final IPaletteItemManager manager, final CMDocument doc, final String tldURI) {
-		
-		TaglibPaletteDrawer category = findCategory(manager, tldURI);
-		if (category != null)
-			return category;
-
-		final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-				.createMetaDataModelContext(manager.getTagRegistryIdentifier().getProject(), tldURI);
-		final Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		category = createTaglibPaletteDrawer(manager, doc, model);
-
-		if (category != null) {
-			loadTags(category, doc, model);
-			sortTags(category.getChildren());
-		}
-		return category;
-	}
-
-	private void sortTags(final List tags) {
-		// note that once we store ordering customizations, we will need to do
-		// something different
-		// it will also be complicated if we decide to do 181958 and 181866
-		Collections.sort(tags, new Comparator() {
-
-			public int compare(final Object o1, final Object o2) {
-				final String label1 = ((PaletteEntry) o1).getLabel();
-				final String label2 = ((PaletteEntry) o2).getLabel();
-
-				if (label1 == null) {
-					// if both null, then equal
-					if (label2 == null) {
-						return 0;
-					}
-					// otherwise, sort label 2 before
-					return 1;
-				}
-
-				if (label2 == null) {
-					// if label1 not null, then sort it first
-					return -1;
-				}
-				return label1.compareTo(label2);
-			}
-
-		});
-
-	}
-
-	private void loadTags(final TaglibPaletteDrawer category, final CMDocument doc,
-			final Model model) {
-
-		if (model != null) {// load from metadata - should always drop in here
-			final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model,
-					"paletteInfos"); //$NON-NLS-1$
-			if (trait != null) {
-				final PaletteInfos tags = (PaletteInfos) trait.getValue();
-				for (final Iterator it = tags.getInfos().iterator(); it.hasNext();) {
-					final PaletteInfo tag = (PaletteInfo) it.next();
-					createTagEntry(category, tag, doc);
-				}
-			} else {
-				for (final Iterator it = model.getChildEntities().iterator(); it
-						.hasNext();) {
-					final Entity tagAsEntity = (Entity) it.next();
-					createTagEntry(category, tagAsEntity, doc);
-				}
-			}
-		} else {// fail safe loading from cmDoc... should no longer go in here
-			loadFromCMDocument(category, doc);
-		}
-
-	}
-
-	private TaglibPaletteDrawer createTaglibPaletteDrawer(
-			final IPaletteItemManager manager, final CMDocument doc, final Model model) {
-
-		TaglibPaletteDrawer category = null;
-		if (model != null) {
-			// do we create it?
-			final boolean isHidden = getBooleanTagTraitValue(model, "hidden", false); //$NON-NLS-1$
-			if (isHidden) {
-				return null;
-			}
-
-			String label = getStringTagTraitValue(model,
-					"display-label", model.getId()); //$NON-NLS-1$
-			label = label.equals("") ? model.getId() : label; //$NON-NLS-1$
-			category = manager.createTaglibPaletteDrawer(model.getId(), label);
-
-			String desc = getStringTagTraitValue(model,
-					"description", model.getId()); //$NON-NLS-1$
-			category.setDescription(formatDescription(desc));
-
-			final ImageDescriptor largeIconImage = getImageDescriptorFromTagTraitValueAsString(
-					model, "small-icon", null); //$NON-NLS-1$
-			if (largeIconImage != null)
-				category.setLargeIcon(largeIconImage);
-
-			final String prefix = getStringTagTraitValue(model,
-					"default-prefix", null); //$NON-NLS-1$
-			category.setDefaultPrefix(prefix);
-
-			final boolean isVisible = !(getBooleanTagTraitValue(model,
-					"expert", false)); //$NON-NLS-1$
-			category.setVisible(isVisible);
-
-			category.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED);
-
-		}
-		return category;
-	}
-
-	private TaglibPaletteDrawer findCategory(
-			final IPaletteItemManager manager, final String tldURI) {
-		
-		TaglibPaletteDrawer lib = null;
-		for (final Iterator it = manager.getAllCategories().iterator(); it.hasNext();) {
-			lib = (TaglibPaletteDrawer) it.next();
-			if (tldURI.equals(lib.getURI()))
-				return lib;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-JavaDoc) This method will read information from the CMDocument to
-	 * create the tag entries. It will check the existing items in the registry.
-	 * If the corresponding tag is not in palette manager, then it will create
-	 * one, and mark the newly created item as "expert". Otherwise, it will
-	 * check whether the tld contains more information than the palette manager,
-	 * and adding those information to it (such as description, icons for tags)
-	 * 
-	 * @param category
-	 * 
-	 * @param cmdoc
-	 */
-	private void loadFromCMDocument(final TaglibPaletteDrawer category,
-			final CMDocument cmdoc) {
-
-		final CMNamedNodeMap nodeMap = cmdoc.getElements();
-		for (int i = 0, size = nodeMap.getLength(); i < size; i++) {
-			final CMElementDeclaration eledecl = (CMElementDeclaration) nodeMap
-					.item(i);
-			final String tagName = eledecl.getElementName();
-			TagToolPaletteEntry item;
-			if (tagName.equalsIgnoreCase(IHTMLConstants.TAG_INPUT)) {// TODO:
-																		// fix
-																		// this
-																		// nonsense!
-				final StringBuffer name = new StringBuffer(category.getURI());
-				name.append(":").append(tagName).append(":").append(tagName); //$NON-NLS-1$ //$NON-NLS-2$
-				item = category.getTagPaletteEntryById(name.toString());
-			} else {
-				item = category.getTagPaletteEntryByTagName(tagName);
-			}
-			if (item == null) {
-				createTagEntry(category, eledecl);
-
-			}
-		}
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final PaletteInfo info, final CMDocument doc) {
-
-		final Boolean hidden = info.getHidden();
-		if ((hidden != null) && (hidden.booleanValue()))// do not create a
-														// palette entry
-			return;
-
-		final IMetaDataSourceModelProvider sourceProvider = ((Trait) info
-				.eContainer().eContainer()).getSourceModelProvider();
-		final String tagName = info.getTag();
-		final String id = info.getId();
-		final String label = info.getDisplayLabel();
-		final String desc = formatDescription(info.getDescription());
-		final ImageDescriptor smallIcon = getImageDescriptorFromString(
-				sourceProvider, info.getSmallIcon(), DEFAULT_SMALL_ICON);
-		final ImageDescriptor largeIcon = getImageDescriptorFromString(
-				sourceProvider, info.getLargeIcon(), DEFAULT_LARGE_ICON);
-		final Boolean expert = info.getExpert();
-
-		internalCreateTagEntry(doc, category, id, tagName, label, desc,
-				smallIcon, largeIcon, (expert != null && expert.booleanValue()));
-
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final PaletteInfo info, final Namespace ns) {
-
-		final Boolean hidden = info.getHidden();
-		if ((hidden != null) && (hidden.booleanValue()))// do not create a
-														// palette entry
-			return;
-
-		final IMetaDataSourceModelProvider sourceProvider = ((Trait) info
-				.eContainer().eContainer()).getSourceModelProvider();
-		final String tagName = info.getTag();
-		final String id = info.getId();
-		final String label = info.getDisplayLabel();
-		final String desc = formatDescription(info.getDescription());
-		final ImageDescriptor smallIcon = getImageDescriptorFromString(
-				sourceProvider, info.getSmallIcon(), DEFAULT_SMALL_ICON);
-		final ImageDescriptor largeIcon = getImageDescriptorFromString(
-				sourceProvider, info.getLargeIcon(), DEFAULT_LARGE_ICON);
-		final Boolean expert = info.getExpert();
-
-		internalCreateTagEntry(ns, category, id, tagName, label, desc,
-				smallIcon, largeIcon, (expert != null && expert.booleanValue()));
-
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final Entity entity, final CMDocument doc) {
-
-		final boolean hidden = getBooleanTagTraitValue(entity, "hidden", false); //$NON-NLS-1$
-		if (hidden)// do not create a palette entry
-			return;
-
-		final String tagName = entity.getId();
-		final String label = getStringTagTraitValue(entity, "display-label", tagName); //$NON-NLS-1$
-		final String desc = formatDescription(getStringTagTraitValue(entity,
-				"description", tagName)); //$NON-NLS-1$
-		final ImageDescriptor smallIcon = getImageDescriptorFromTagTraitValueAsString(
-				entity, "small-icon", DEFAULT_SMALL_ICON); //$NON-NLS-1$
-		final ImageDescriptor largeIcon = getImageDescriptorFromTagTraitValueAsString(
-				entity, "large-icon", DEFAULT_LARGE_ICON); //$NON-NLS-1$
-		final boolean expert = getBooleanTagTraitValue(entity, "expert", false); //$NON-NLS-1$
-
-		internalCreateTagEntry(doc, category, tagName, tagName, label, desc,
-				smallIcon, largeIcon, expert);
-
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final Entity entity, final Namespace ns) {
-
-		final boolean hidden = getBooleanTagTraitValue(entity, "hidden", false); //$NON-NLS-1$
-		if (hidden)// do not create a palette entry
-			return;
-
-		final String tagName = entity.getId();
-		final String label = getStringTagTraitValue(entity, "display-label", tagName); //$NON-NLS-1$
-		final String desc = formatDescription(getStringTagTraitValue(entity,
-				"description", tagName)); //$NON-NLS-1$
-		final ImageDescriptor smallIcon = getImageDescriptorFromTagTraitValueAsString(
-				entity, "small-icon", DEFAULT_SMALL_ICON); //$NON-NLS-1$
-		final ImageDescriptor largeIcon = getImageDescriptorFromTagTraitValueAsString(
-				entity, "large-icon", DEFAULT_LARGE_ICON); //$NON-NLS-1$
-		final boolean expert = getBooleanTagTraitValue(entity, "expert", false); //$NON-NLS-1$
-
-		internalCreateTagEntry(ns, category, tagName, tagName, label, desc,
-				smallIcon, largeIcon, expert);
-
-	}
-
-	private TagToolPaletteEntry internalCreateTagEntry(final TaglibPaletteDrawer category, 
-			final String id, final String tagName,
-			final String label, String desc, final ImageDescriptor smallIcon,
-			final ImageDescriptor largeIcon, final boolean expert) {
-		
-		final ITagDropSourceData data = new TagToolCreationAdapter(category
-				.getURI(), tagName, category.getDefaultPrefix(), id);
-		final TagToolPaletteEntry item = new TagToolPaletteEntry(data, label,
-				desc, smallIcon, largeIcon);
-		item.setId(id);
-
-		item.setVisible(!expert);
-		category.getChildren().add(item);
-		item.setParent(category);
-
-		return item;
-	}
-
-	private TagToolPaletteEntry internalCreateTagEntry(final CMDocument doc,
-			final TaglibPaletteDrawer category, final String id, final String tagName,
-			final String label, final String desc, final ImageDescriptor smallIcon,
-			final ImageDescriptor largeIcon, final boolean expert) {
-		
-		if (verifyPresentInContentModel(doc, tagName)) {
-			return internalCreateTagEntry(category, id, tagName, label, desc,
-					smallIcon, largeIcon, expert);
-		}
-		return null;
-	}
-
-	private TagToolPaletteEntry internalCreateTagEntry(final Namespace ns,
-			final TaglibPaletteDrawer category, final String id, final String tagName,
-			final String label, final String desc, final ImageDescriptor smallIcon,
-			final ImageDescriptor largeIcon, final boolean expert) {
-		
-		if (verifyPresentInContentModel(ns, tagName)) {
-			return internalCreateTagEntry(category, id, tagName, label, desc,
-					smallIcon, largeIcon, expert);
-		}
-		return null;
-	}
-
-	private boolean verifyPresentInContentModel(final CMDocument doc,
-			final String tagName) {
-		
-		return doc.getElements().getNamedItem(tagName) != null;
-	}
-
-	private boolean verifyPresentInContentModel(final Namespace ns,
-			final String tagName) {
-		
-		return ns.getViewElement(tagName) != null;
-	}
-
-	private boolean getBooleanTagTraitValue(final Entity entity, final String key,
-			final boolean defaultValue) {
-		final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (trait != null) {
-			return TraitValueHelper.getValueAsBoolean(trait);
-		}
-		return defaultValue;
-	}
-
-	private String getStringTagTraitValue(final Entity entity, final String key,
-			final String defaultValue) {
-		
-		final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (trait != null) {
-			final String val = TraitValueHelper.getValueAsString(trait);
-			if (val != null)
-				return val;
-		}
-		return defaultValue;
-	}
-
-	private ImageDescriptor getImageDescriptorFromTagTraitValueAsString(
-			final Entity entity, final String key, final ImageDescriptor defaultValue) {
-		final Trait t = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (t != null) {
-			final String imgDesc = TraitValueHelper.getValueAsString(t);
-			return getImageDescriptorFromString(t.getSourceModelProvider(),
-					imgDesc, defaultValue);
-		}
-		return defaultValue;
-	}
-
-	private ImageDescriptor getImageDescriptorFromString(
-			final IMetaDataSourceModelProvider sourceModelProvider, final String imgDesc,
-			final ImageDescriptor defaultValue) {
-		
-		ImageDescriptor image = defaultValue;
-		if (imgDesc != null) {
-			final IImageDescriptorProvider imageProvider = (IImageDescriptorProvider) sourceModelProvider
-					.getAdapter(IImageDescriptorProvider.class);
-			if (imageProvider != null) {
-				image = imageProvider.getImageDescriptor(imgDesc);
-			}
-		}
-		return image;
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final CMElementDeclaration eledecl) {
-
-		final String tagName = eledecl.getElementName();
-		String label = null;
-		String desc = null;
-
-		if (eledecl instanceof TLDElementDeclaration) {
-			final TLDElementDeclaration tag = (TLDElementDeclaration) eledecl;
-			label = tag.getDisplayName();
-			desc = tag.getDescription();
-		}
-
-		if (label == null || label.equals("")) //$NON-NLS-1$
-			label = tagName;
-
-		if (desc == null)
-			desc = ""; //$NON-NLS-1$
-		else
-			desc = formatDescription(desc);
-
-		final TagToolPaletteEntry item = internalCreateTagEntry(category, tagName,
-				tagName, label, desc, getDefaultSmallIcon(),
-				getDefaultLargeIcon(), false);
-		item.setToolProperty("CMElementDeclaration", eledecl); //$NON-NLS-1$
-
-	}
-
-	/**
-	 * @return DEFAULT_LARGE_ICON
-	 */
-	private ImageDescriptor getDefaultLargeIcon() {
-		return DEFAULT_LARGE_ICON;
-	}
-
-	/**
-	 * @return DEFAULT_SMALL_ICON
-	 */
-	private ImageDescriptor getDefaultSmallIcon() {
-		return DEFAULT_SMALL_ICON;
-	}
-
-	private String formatDescription(final String desc) {
-		// TODO: modify and use a formatter in the future?
-		final String aDesc = filterConvertString(desc);
-		if (aDesc != null) {
-			if (aDesc.length() > DESCRIPTION_TRUNCATE_HARD_LENGTH) {
-				final StringBuffer result = new StringBuffer(aDesc.substring(0,
-						DESCRIPTION_TRUNCATE_HARD_LENGTH));
-				result.append("..."); //$NON-NLS-1$
-				return result.toString();
-			}
-			return aDesc;
-
-		}
-		return ""; //$NON-NLS-1$
-	}
-
-	private String filterConvertString(final String text) {
-		if (text == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-		String result = removeHTMLTags.matcher(text).replaceAll(""); //$NON-NLS-1$
-		result = removeNewLines.matcher(result).replaceAll(" "); //$NON-NLS-1$
-		result = trimInteriorWhitespace.matcher(result).replaceAll(" "); //$NON-NLS-1$
-
-		return result;
-	}
-
-	/**
-	 * @param manager
-	 * @param ns
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer configPaletteItemsByNamespace(
-			final PaletteItemManager manager,
-			final Namespace ns) {
-		
-		return getOrCreateTaglibPaletteDrawer(manager, ns);
-	}
-
-	/**
-	 * @param manager
-	 * @param ns 
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer getOrCreateTaglibPaletteDrawer(
-			final IPaletteItemManager manager, final Namespace ns) {
-		
-		TaglibPaletteDrawer category = findCategory(manager, ns.getNSUri());
-		if (category != null)
-			return category;
-
-		final IProject project = manager.getTagRegistryIdentifier().getProject();
-		final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-				.createMetaDataModelContext(project, ns.getNSUri());
-		final Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		category = createTaglibPaletteDrawer(manager,  ns, model);
-
-		if (category != null) {
-			loadTags(category, ns, model);
-			sortTags(category.getChildren());
-		}
-		return category;
-	}
-
-	private TaglibPaletteDrawer createTaglibPaletteDrawer(
-			final IPaletteItemManager manager, final Namespace ns, final Model model) {
-
-		TaglibPaletteDrawer category = null;
-		if (model != null) {
-			// do we create it?
-			final boolean isHidden = getBooleanTagTraitValue(model, "hidden", false); //$NON-NLS-1$
-			if (isHidden) {
-				return null;
-			}
-
-			String label = getStringTagTraitValue(model,
-					"display-label", model.getId()); //$NON-NLS-1$
-			label = label.equals("") ? model.getId() : label; //$NON-NLS-1$
-			category = manager.createTaglibPaletteDrawer(model.getId(), label);
-
-			final String desc = getStringTagTraitValue(model,
-					"description", model.getId()); //$NON-NLS-1$
-			category.setDescription(formatDescription(desc));
-
-			final ImageDescriptor largeIconImage = getImageDescriptorFromTagTraitValueAsString(
-					model, "small-icon", null); //$NON-NLS-1$
-			if (largeIconImage != null)
-				category.setLargeIcon(largeIconImage);
-
-			final String prefix = getStringTagTraitValue(model,
-					"default-prefix", null); //$NON-NLS-1$
-			category.setDefaultPrefix(prefix);
-
-			final boolean isVisible = !(getBooleanTagTraitValue(model,
-					"expert", false)); //$NON-NLS-1$
-			category.setVisible(isVisible);
-
-			category.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED);
-
-		}
-		return category;
-	}
-
-	private void loadTags(final TaglibPaletteDrawer category,
-			final Namespace ns, final Model model) {
-
-		if (model != null) {// load from metadata - should always drop in here
-			final Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model,
-					"paletteInfos"); //$NON-NLS-1$
-			if (trait != null) {
-				final PaletteInfos tags = (PaletteInfos) trait.getValue();
-				for (Iterator it = tags.getInfos().iterator(); it.hasNext();) {
-					final PaletteInfo tag = (PaletteInfo) it.next();
-					createTagEntry(category, tag, ns);
-				}
-			} else {
-				for (final Iterator it = model.getChildEntities().iterator(); it
-						.hasNext();) {
-					final Entity tagAsEntity = (Entity) it.next();
-					createTagEntry(category, tagAsEntity, ns);
-				}
-			}
-		} else {// fail safe loading from cmDoc... should no longer go in here
-			loadFromNamespace(category, ns);
-		}
-	}
-
-	private void loadFromNamespace(final TaglibPaletteDrawer category,
-			final Namespace ns) {
-
-		for (Object velem : ns.getViewElements()) {
-			final ITagElement tag = (ITagElement) velem;
-			final TagToolPaletteEntry item = category.getTagPaletteEntryByTagName(tag
-					.getName());
-			if (item == null) {
-				createTagEntry(category, tag);
-			}
-		}
-	}
-
-	private void createTagEntry(final TaglibPaletteDrawer category,
-			final ITagElement tag) {
-
-		final String tagName = tag.getName();
-		String label = tagName;
-		String desc = ""; //$NON-NLS-1$
-
-		// if (eledecl instanceof TLDElementDeclaration){
-		// TLDElementDeclaration tag = (TLDElementDeclaration)eledecl;
-		// label = tag.getDisplayName();
-		// desc = tag.getDescription();
-		// }
-
-		//			if (label == null || label.equals("")) //$NON-NLS-1$
-		// label = tagName;
-		//			
-		// if (desc == null )
-		//				desc = ""; //$NON-NLS-1$
-		// else
-		// desc = formatDescription(desc);
-
-		// TagToolPaletteEntry item =
-		internalCreateTagEntry(category, tagName, tagName, label, desc,
-				getDefaultSmallIcon(), getDefaultLargeIcon(), false);
-		//			item.setToolProperty("CMElementDeclaration", eledecl); //$NON-NLS-1$
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java
deleted file mode 100644
index f81c5fa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java
+++ /dev/null
@@ -1,558 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.jst.jsf.common.internal.JSPUtil;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory.TagRegistryIdentifier;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.ITagRegistryListener;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.TagRegistryChangeEvent;
-import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.TagRegistryChangeEvent.EventType;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteCustomizationsHelper;
-import org.eclipse.jst.pagedesigner.editors.palette.IEntryChangeListener;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteConstants;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteContext;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemManager;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- *  Manages tag library palette by palette context.   Capable of handling JSP and XHTML content types.
- *  
- *  Callers must use getInstance(IPaletteContext), and when done, call release(IFile).   
- *  
- * @author mengbo and others
- */
-public class PaletteItemManager implements IPaletteItemManager,
-		IPaletteConstants, ITagRegistryListener {
-	
-	private static final boolean DEBUG = false;
-
-	
-	private static Map<TagRegistryIdentifier, PaletteItemManager> _managers = new HashMap<TagRegistryIdentifier, PaletteItemManager>();
-	private static ReentrantLock MANAGER_LOCK = new ReentrantLock();
-	private static long MANAGER_LOCK_TIMEOUT = 120;
-	
-	private Set<IFile> _files = new HashSet<IFile>();
-	private TagRegistryIdentifier _tagRegId;
-	private List<PaletteDrawer> _paletteCategories = new ArrayList<PaletteDrawer>();
-	private CopyOnWriteArrayList<IEntryChangeListener> _listeners = new CopyOnWriteArrayList<IEntryChangeListener>();
-	private AtomicBoolean IS_DISPOSED = new AtomicBoolean();
-
-	private PaletteHelper _paletteHelper;
-
-	private ITagRegistry _tagRegistry;
-
-
-	/**
-	 * Return singleton paletteItemManager for a given project.  Will only work for JSPs.
-	 * @param project
-	 * @return PaletteItemManager
-	 * @deprecated - use getInstance(paletteContext)
-	 */
-	public static PaletteItemManager getInstance(final IProject project) {
-		if (project == null) {
-			// sometimes when the editor is editing a file in jar file, may not
-			// be able to
-			// get the project.
-			return getInstance(createPaletteContext(null));
-		}		
-		//relies on JSP file extension for content type
-		return getInstance(createPaletteContext(project.getFile("dummy.jsp")));  //$NON-NLS-1$
-	}
-	
-	/**
-	 * @param paletteContext
-	 * @return PaletteItemManager instance shared with all files with same palette context in a project
-	 * 				May return null if locking issue 
-	 */
-	public static PaletteItemManager getInstance(final IPaletteContext paletteContext) {	
-		boolean hasLock = false;
-		try {
-			if (MANAGER_LOCK.tryLock(MANAGER_LOCK_TIMEOUT, TimeUnit.SECONDS)){
-				hasLock = true;
-				final TagRegistryIdentifier regId = getTagRegistryIdentifier(paletteContext);
-				PaletteItemManager manager = _managers.get(regId);
-				if (manager == null) {
-					 manager = new PaletteItemManager(regId);
-					_managers.put(regId, manager);
-					manager.init();
-				} 
-				manager.addFile(paletteContext.getFile());
-				return manager;
-			}
-			//if we get here then the lock has timed out
-			PDPlugin.log(new Status(Status.ERROR, PDPlugin.getPluginId(), "(getInstance()) Failed to get managers lock for" + paletteContext.getFile().toString())); //$NON-NLS-1$
-			
-		} catch (InterruptedException e) {
-			PDPlugin.log("Failed in PaletteItemManager.getInstance(PaletteContext", e); //$NON-NLS-1$
-		} finally {
-			if (hasLock)
-				MANAGER_LOCK.unlock();
-		}
-		return null;
-	}
-	
-	private static TagRegistryIdentifier getTagRegistryIdentifier(
-			final IPaletteContext paletteContext) {
-
-		final IFile file = paletteContext.getFile();
-		if (file != null) {
-	        final IContentTypeManager typeManager = Platform.getContentTypeManager();
-	        final IContentType contentType = 
-	            typeManager.findContentTypeFor(file.getName());
-	        
-	        if (contentType != null)
-	        {
-	            return new TagRegistryIdentifier(file.getProject(), contentType);
-	        }
-	        return null;
-		}
-		//to support legacy null projects.   Allows HTML and JSP tag libs to be displayed.
-	    return new TagRegistryIdentifier(null, org.eclipse.jst.pagedesigner.utils.JSPUtil.JSP_CONTENTTYPE);
-
-	}
-
-	/**
-	 * @param file
-	 * @return IPaletteContext
-	 */
-	public static IPaletteContext createPaletteContext(final IFile file) {
-		return new IPaletteContext() {
-			public IFile getFile() {
-				return file;
-			}
-
-			public Object getAdapter(Class adapter) {				
-				return null;
-			}
-		};
-	}
-	private void addFile(final IFile file) {
-		synchronized (_files) {
-			_files.add(file);
-		}
-		
-	}
-	
-	/**
-	 * Indicates that the file no longer needs the paletteItemManager, freeing the manager to be released after last reference
-	 * @param paletteContext
-	 */
-	public void release(final IPaletteContext paletteContext) { 
-		final IFile file = paletteContext.getFile();
-		boolean isEmpty = false;
-		synchronized (_files) {
-			if (_files.contains(file)) {
-				_files.remove(file);
-				if (_files.isEmpty())
-					isEmpty = true;
-			}
-		}
-
-		if (isEmpty && IS_DISPOSED.compareAndSet(false, true)) {
-			removeTagRegistryListeners(this);
-			boolean hasLock = false;
-			try {
-				if (MANAGER_LOCK.tryLock(MANAGER_LOCK_TIMEOUT, TimeUnit.SECONDS)) {
-					hasLock = true;
-					_managers.remove(_tagRegId);
-				}
-				else {
-					PDPlugin.log(new Status(Status.ERROR, PDPlugin.getPluginId(), "(Release) Failed to get managers lock for" + paletteContext.getFile().toString())); //$NON-NLS-1$
-				}
-			} catch (InterruptedException e) {
-				PDPlugin.log("Failed to release paletteItemManager for" + paletteContext.getFile().toString(), e); //$NON-NLS-1$
-			} finally {
-				if (hasLock)
-					MANAGER_LOCK.unlock();
-			}
-		}
-	}
-
-	private static void removeTagRegistryListeners(final PaletteItemManager manager) {
-		if (manager.getTagRegistry() != null)
-			manager.getTagRegistry().removeListener(manager);
-	}
-
-	private ITagRegistry getTagRegistry() {		
-		return _tagRegistry;
-	}
-
-	/**
-	 * For JUnit testing purposes only
-	 */
-	public static void clearPaletteItemManager() {
-		
-		boolean hasLock = false;
-		try {
-			if (MANAGER_LOCK.tryLock(MANAGER_LOCK_TIMEOUT, TimeUnit.SECONDS)){
-				hasLock = true;
-				if (_managers == null)
-					return;
-
-				for (final PaletteItemManager manager : _managers.values()) {
-					PaletteItemManager.removeTagRegistryListeners(manager);		
-					manager._files.clear();
-				}							
-				_managers.clear();
-			} else {
-				//if we get here then the lock has timed out
-				PDPlugin.log(new Status(Status.ERROR, PDPlugin.getPluginId(), "(clear) Failed to get managers lock")); //$NON-NLS-1$
-			}
-			
-		} catch (InterruptedException e) {
-			PDPlugin.log("Failed in clearPaletteItemManager", e); //$NON-NLS-1$
-		} finally {
-			if (hasLock)
-				MANAGER_LOCK.unlock();
-		}
-
-	}
-	
-	private PaletteItemManager(final TagRegistryIdentifier regId) {
-		_paletteHelper = new PaletteHelper(this);
-		if (regId != null) {
-			_tagRegId = regId;
-//			init();
-		}		
-	}
-	
-
-	public List getAllCategories() {	
-		synchronized (_paletteCategories) {
-			final List<PaletteDrawer> readOnlyCategories = new ArrayList<PaletteDrawer>(_paletteCategories);			
-			return Collections.unmodifiableList(readOnlyCategories);
-		}		
-	}
-
-	/**
-	 * Initializes the palette items for the current project
-	 */
-	protected synchronized void init() {
-		synchronized (_paletteCategories) {
-			_paletteCategories.clear();
-		}
-		
-		initTagRegistry();
-
-		DesignerPaletteCustomizationsHelper.loadUserCustomizations(this);
-		
-		sortCategories();
-	}
-
-	private void sortCategories() {
-		//note that once we store ordering customizations, we will need to do something different
-		synchronized(_paletteCategories) {
-			Collections.sort(_paletteCategories, new Comparator(){
-	
-				public int compare(Object o1, Object o2) {
-					String label1 = ((PaletteEntry)o1).getLabel();
-					String label2 = ((PaletteEntry)o2).getLabel();
-					
-					return label1.compareTo(label2);
-				}
-				
-			});
-		}
-	}
-
-	/**
-	 * Reinitializes the palatteItemManager and informs all palette roots that use the manager to refresh
-	 */
-	public void reset() {
-		init();
-		fireModelChanged(null, null);
-	}
-	
-	private void initTagRegistry() {
-		registerHTMLCategory();
-		if (isJSP(_tagRegId))
-			registerJSPCategory();			
-		
-		registerTagsFromTagRegistry();	
-	}
-
-	private boolean isJSP(final TagRegistryIdentifier tagRegistryId) {
-		final IContentType ct = tagRegistryId.getContentType();
-		if (JSPUtil.isJSPContentType(ct.getId()))
-			return true;
-		return false;
-	}
-
-	private void registerTagsFromTagRegistry() {
-		_tagRegistry = getTagRegistry(_tagRegId);
-		if (_tagRegistry != null) {
-			for (final Namespace ns : _tagRegistry.getAllTagLibraries()) {							
-				_paletteHelper.configPaletteItemsByNamespace(this, ns);			
-			}
-		}
-	}
-
-	private ITagRegistry getTagRegistry(final TagRegistryIdentifier regId) {
-		ITagRegistry reg = null;
-		if (regId.getProject() != null) {
-			reg = CompositeTagRegistryFactory.getInstance().getRegistry(regId);
-			if (reg != null) {
-				reg.addListener(this);
-			}
-		}
-		return reg;
-	}
-
-	private void registerHTMLCategory() {
-		final CMDocument doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.HTML_DOC_TYPE);
-		_paletteHelper.getOrCreateTaglibPaletteDrawer(this, doc, CMDocType.HTML_DOC_TYPE);
-	}
-
-	private void registerJSPCategory() {
-		final CMDocument doc = HTMLCMDocumentFactory.getCMDocument(CMDocType.JSP11_DOC_TYPE);
-		_paletteHelper.getOrCreateTaglibPaletteDrawer(this, doc, CMDocType.JSP11_DOC_TYPE);
-	}
-
-//	/**
-//	 * Search Classpath entry list to find if the entry is jar library and the
-//	 * library have the tld descriptor, if have ,build a palette category mapping
-//	 * the tld descriptor.
-//	 * 
-//	 * @param project
-//	 */
-//	private void registerTldFromClasspath(final IProject project) {
-//		if (project != null) {
-//			ITaglibRecord[] tldrecs = TaglibIndex.getAvailableTaglibRecords(project.getFullPath());
-//			for (int i=0;i<tldrecs.length;i++){				
-//				_paletteHelper.configPaletteItemsByTLD(this, getCurProject(), tldrecs[i]);			
-//			}
-//		}			
-//	}
-
-	/**
-	 * @param id (most likely the uri)
-	 * @param label 
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findOrCreateCategory(final String id, final String label) {
-		TaglibPaletteDrawer category = getTaglibPalletteDrawer(id);
-		if (category == null)
-			category = createTaglibPaletteDrawer(id, label);
-		return category;
-	}
-
-	/**
-	 * @param uri
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findCategoryByURI(final String uri) {
-		TaglibPaletteDrawer category;
-		for (final Iterator iter = getAllCategories().iterator(); iter.hasNext();) {
-			category = (TaglibPaletteDrawer) iter.next();
-			if (uri.equals(category.getURI())) {
-				return category;
-			}
-		}
-		return null;
-	}
-
-	public TaglibPaletteDrawer createTaglibPaletteDrawer(final String uri, final String label) {
-		final TaglibPaletteDrawer r = new TaglibPaletteDrawer(uri, label);
-		synchronized(_paletteCategories) {
-			_paletteCategories.add(r);
-		}
-		return r;
-	}
-
-	public TaglibPaletteDrawer getTaglibPalletteDrawer(final String uri) {
-		for (final Iterator iter = getAllCategories().iterator(); iter.hasNext();) {
-			final TaglibPaletteDrawer cat = (TaglibPaletteDrawer) iter.next();
-			if (uri.equalsIgnoreCase(cat.getId())) {
-				return cat;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#addEntryChangeListener(com.sybase.stf.jmt.pagedesigner.editors.palette.IEntryChangeListener)
-	 */
-	public void addEntryChangeListener(final IEntryChangeListener listener) {
-		_listeners.addIfAbsent(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#removeEntryChangeListener(com.sybase.stf.jmt.pagedesigner.editors.palette.IEntryChangeListener)
-	 */
-	public void removeEntryChangeListener(final IEntryChangeListener listener) {		
-		_listeners.remove(listener);
-	}
-
-	/**
-	 * Notify model change event
-	 * 
-	 * @param oldDefinitions
-	 * @param newDefinitions
-	 */
-	private void fireModelChanged(final List oldDefinitions, final List newDefinitions) {
-		if (_listeners == null) {
-			return;
-		}
-		for (final Iterator<IEntryChangeListener> it= _listeners.iterator();it.hasNext();){
-			final IEntryChangeListener listener = it.next();
-			listener.modelChanged(oldDefinitions, newDefinitions);
-		}	
-	}
-	
-	/**
-	 * Informs all paletteItemManagers, except the notifying paletteManager, of updates to the customizations
-	 * All palette viewer roots will be notifed of possible updates
-	 * @param notifyingManager 
-	 */
-	public static void notifyPaletteItemManagersOfCustomizationsUpdate(final IPaletteItemManager notifyingManager){
-		boolean hasLock = false;
-		try {
-			if (MANAGER_LOCK.tryLock(MANAGER_LOCK_TIMEOUT, TimeUnit.SECONDS)){
-				hasLock = true;
-				for (Iterator it=_managers.values().iterator();it.hasNext();){
-					final PaletteItemManager mgr = (PaletteItemManager)it.next();
-					if (mgr != null && notifyingManager != mgr)
-						mgr.reset();
-				}
-			} 
-			else {
-				//if we get here then the lock has timed out
-				PDPlugin.log(new Status(Status.ERROR, PDPlugin.getPluginId(), "Failed to get managers lock in notifyPaletteItemManagersOfCustomizationsUpdate")); //$NON-NLS-1$
-			}
-			
-		} catch (InterruptedException e) {
-			PDPlugin.log("Failed in notifyPaletteItemManagersOfCustomizationsUpdate", e); //$NON-NLS-1$
-		} finally {
-			if (hasLock)
-				MANAGER_LOCK.unlock();
-		}
-
-	}
-
-	public void registryChanged(final TagRegistryChangeEvent event) {
-		final EventType eventType = event.getType();
-		switch (eventType) {
-			case ADDED_NAMESPACE:
-				addNamespaces(event.getAffectedObjects());
-				break;
-			case REMOVED_NAMESPACE:
-				removeNamespaces(event.getAffectedObjects());
-				break;
-			case CHANGED_NAMESPACE:
-				changeNamespaces(event.getAffectedObjects());
-				break;
-			case REGISTRY_DISPOSED:
-				break;
-	
-			default:
-				break;
-		}
-		
-		DesignerPaletteCustomizationsHelper.loadUserCustomizations(this);
-		sortCategories();
-		
-		fireModelChanged(null, null);
-	}
-
-
-	private void addNamespaces(final List<? extends Namespace> affectedObjects) {
-		synchronized (_paletteCategories) {
-			for (final Namespace ns : affectedObjects) {
-				if (DEBUG)
-					System.out.println("Add NS: "+ns.getNSUri()+"["+System.currentTimeMillis()+"]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				_paletteHelper.configPaletteItemsByNamespace(this, ns);
-			}
-		}
-	}
-	
-	private void removeNamespaces(final List<? extends Namespace> affectedObjects) {
-		final List<Integer> drawersToRemove = new ArrayList<Integer>();
-		synchronized (_paletteCategories) {
-			for (final Namespace ns : affectedObjects) {
-				for (int i=_paletteCategories.size() - 1; i >= 0; i--) {//gather in reverse order
-					final PaletteDrawer drawer = _paletteCategories.get(i);
-					if (drawer.getId().equals(ns.getNSUri())) {
-						if (DEBUG)
-							System.out.println("Remove NS: "+drawer.getId() +"["+System.currentTimeMillis()+"]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-						drawersToRemove.add(new Integer(i));	
-					}
-				}
-			}	
-			if (! drawersToRemove.isEmpty()) {
-				Collections.sort(drawersToRemove, new Comparator<Integer>() {//reverse order sort
-
-					public int compare(Integer o1, Integer o2) {
-						if (o1.intValue() > o2.intValue())
-							return -1;
-						else if (o1.intValue() < o2.intValue())
-							return 1;
-							
-						return 0;
-					}
-				});
-				for (Integer index : drawersToRemove) {
-					_paletteCategories.remove(index.intValue());				
-				}
-			}
-		}
-	}
-
-	private void changeNamespaces(final List<? extends Namespace> affectedObjects) {
-		//for now, remove then add
-		removeNamespaces(affectedObjects);
-		addNamespaces(affectedObjects);		
-	}
-
-	public TagRegistryIdentifier getTagRegistryIdentifier() {		
-		return _tagRegId;
-	}
-
-	/**
-	 * @return helper
-	 */
-	public PaletteHelper getPaletteHelper() {
-		return _paletteHelper;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java
deleted file mode 100644
index 5f7ba74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-
-/**
- * Palette Drawer for Tag lib items
- *
- */
-public class TaglibPaletteDrawer extends PaletteDrawer {
-	private String prefix;	
-
-	/**
-	 * Constructor
-	 * @param uri
-	 * @param label
-	 */
-	public TaglibPaletteDrawer(String uri, String label) {
-		super(label);
-		super.setId(uri);
-		setDrawerType(ToolEntry.PALETTE_TYPE_TOOL);
-	}
-	
-	/**
-	 * @return default prefix for tag during creation
-	 */
-	public String getDefaultPrefix() {
-		return prefix;
-	}
-
-	/**
-	 * Set the default prefix for use during item creation
-	 * @param prefix
-	 */
-	public void setDefaultPrefix(String prefix) {
-		this.prefix = prefix;
-	}
-
-	/**
-	 * @return uri identifying the library of tags
-	 */
-	public String getURI(){
-		return getId();
-	}
-	
-	/**
-	 * @param uri for the libary of tags
-	 */
-	public void setURI(String uri){
-		setId(uri);
-	}
-	
-	/**
-	 * @param id
-	 * @return TagToolPaletteEntry for the tag using the id
-	 */
-	public TagToolPaletteEntry getTagPaletteEntryById(String id){
-		for (Iterator it=getChildren().iterator();it.hasNext();){
-			TagToolPaletteEntry tag = (TagToolPaletteEntry)it.next();
-			if (tag.getId().equals(id))
-				return tag;
-		}
-		return null;
-	}
-	
-	/**
-	 * @param tagName
-	 * @return TagToolPaletteEntry using the tag name
-	 */
-	public TagToolPaletteEntry getTagPaletteEntryByTagName(String tagName){
-		for (Iterator it=getChildren().iterator();it.hasNext();){
-			TagToolPaletteEntry tag = (TagToolPaletteEntry)it.next();
-			if (tag.getTagName().equalsIgnoreCase(tagName))
-				return tag;
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.palette.PaletteDrawer#acceptsType(java.lang.Object)
-	 */
-	public boolean acceptsType(Object object){
-			return true;
-	}
-	
-	/**
-	 * @return PERMISSION_HIDE_ONLY
-	 * @see org.eclipse.gef.palette.PaletteEntry#getUserModificationPermission()
-	 */
-	public int getUserModificationPermission() {
-		return PERMISSION_HIDE_ONLY;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/messages.properties
deleted file mode 100644
index 81fbded..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-DesignerPaletteCustomizerDialog_ExportCustomizations=Export Palette Customizations
-DesignerPaletteCustomizerDialog_ImportCustomizations=Import Palette Customizations
-DesignerPaletteViewerProvider_Hide=Hide
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/IPropertyPageDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/IPropertyPageDescriptor.java
deleted file mode 100644
index c5a8041..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/IPropertyPageDescriptor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Property descriptor for metadata enabled tag attributes in the WPE property pages.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * Not intended to be implemented by clients. 
- */
-public interface IPropertyPageDescriptor extends IMetaDataEnabledFeature, IAdaptable{
-	/**
-	 * Trait id for defining quick edit tab sections.   Value must be of type qe:QuickEditTabSections
-	 * eg. <value xsi:type="qe:QuickEditTabSections">
-	 */
-	public static final String QUICK_EDIT_TAB = "quick-edit-tab"; //$NON-NLS-1$
-	/**
-	 * Trait id for category name value
-	 */
-	public static final String PROP_DESC_CATEGORY = "category"; //$NON-NLS-1$
-	
-//	/**
-//	 * Trait id for fully qualified cell editor class name
-//	 */
-//	public static final String PROP_DESC_CELL_EDITOR = "cell-editor";
-//	/**
-//	 * Trait id for fully qualified dialog field editor name
-//	 */
-//	public static final String PROP_DESC_DIALOG_FIELD_EDITOR = "dialog-field-editor";
-	
-	/**
-	 * @return name of attribute.  Must not be null.
-	 */
-	public String getAttributeName();
-	/**
-	 * @return category name.  Must not be null.
-	 */
-	public String getCategory();
-	/**
-	 * @return label to use.  Must not be null.
-	 */
-	public String getLabel();
-	/**
-	 * @return description.   May return null.
-	 */
-	public String getDescription();
-	/**
-	 * @return whether this is a required property.   Default false.
-	 */
-	public boolean isRequired();
-	/**
-	 * @param parent
-	 * @return cell editor to use.   May be null.
-	 */
-	public CellEditor getCellEditor(Composite parent);
-	/**
-	 * @return dialog field editor to use.   May be null.
-	 */
-	public DialogField getDialogFieldEditor();
-	/**
-	 * @return uri. Must not be null.
-	 */
-	public String getUri();
-	/**
-	 * @return tag name.  Must not be null.
-	 */
-	public String getTagName();
-	/**
-	 * @return fully qualified attribute-value-runtime-type as String
-	 */
-	public String getValueType();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/EditorValidatorAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/EditorValidatorAdapter.java
deleted file mode 100644
index a2f6304..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/EditorValidatorAdapter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties.internal;
-
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-
-/**
- * Adapts IValidValues to ICellEditorValidator
- *
- */
-public class EditorValidatorAdapter implements ICellEditorValidator, IInputValidator {
-
-	private IValidValues _vvs;
-
-	/**
-	 * Constructor
-	 * @param vvs
-	 */
-	public EditorValidatorAdapter(IValidValues vvs) {
-		_vvs = vvs;
-	}
-
-	public String isValid(Object value) {
-		//for now, if value is not a string, return true
-		if (value instanceof String)
-			return isValid((String)value);
-		return null;
-	}
-	
-	public String isValid(String value) {
-		_vvs.getValidationMessages().clear();
-		if (_vvs.isValidValue(value))
-			return null;//is valid
-
-		return ((IValidationMessage)_vvs.getValidationMessages().get(0)).getMessage();
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptor.java
deleted file mode 100644
index eb49a6c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptor.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties.internal;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.metadataprocessors.AbstractMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.internal.CellEditorFactoryRegistry;
-import org.eclipse.jst.pagedesigner.properties.ITabbedPropertiesConstants;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.w3c.dom.Element;
-
-/**
- * MD enabled feature of an attribute value runtime type allowing for the tabbed property
- * page to work
- *
- */
-public class PropertyDescriptor extends AbstractMetaDataEnabledFeature
-		implements IMetaDataEnabledFeature, IPropertyPageDescriptor, IAdaptable {
-
-	/**
-	 * Constructor
-	 */
-	public PropertyDescriptor() {
-		// TODO Auto-generated constructor stub
-	}
-
-	//IPropertyPageDescriptor 
-	public String getCategory() {		
-		String cat = getTraitValueAsString(IPropertyPageDescriptor.PROP_DESC_CATEGORY);
-		return cat != null ? cat : ITabbedPropertiesConstants.OTHER_CATEGORY;
-	}
-
-	public CellEditor getCellEditor(Composite parent) {
-//		TODO: allow for override of the factory by using MD
-//		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
-//				getMetaDataContext().getEntity(),
-//				IPropertyPageDescriptor.PROP_DESC_CELL_EDITOR);
-//		
-//		if (trait != null) {
-//			String classname = TraitValueHelper.getValueAsString(trait);
-//			if (classname != null && ! classname.equals("")){
-//				try {
-//					Class klass = PDPlugin.getDefault().getBundle().loadClass(classname);
-//					if (klass != null){
-//						//
-//					}
-//				} catch (ClassNotFoundException e) {//
-//					String msg = "Unable to locate cell editor:"+classname+ " for "+toString();
-//					PDPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, PDPlugin.getPluginId(), msg));
-//				}
-//			}
-//		}
-		//otherwise use factory
-		Element element = (Element)IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(getStructuredDocumentContext()).getNode();		
-		return CellEditorFactoryRegistry.getInstance().createCellEditor(parent, this, element);
-	}
-
-	public String getDescription() {
-		return getTraitValueAsString("description"); //$NON-NLS-1$
-	}
-
-	public String getLabel() {
-		String label = getTraitValueAsString("display-label"); //$NON-NLS-1$
-		if (label == null) {
-			label = getMetaDataContext().getEntity().getId();
-		}
-		return label + ":"; //$NON-NLS-1$
-	}
-
-	public boolean isRequired() {
-		return getTraitValueAsBoolean("required"); //$NON-NLS-1$
-	}
-
-	public DialogField getDialogFieldEditor() {
-		//TODO: allow for override of the factory by using MD
-//		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
-//				getMetaDataContext().getEntity(),
-//				IPropertyPageDescriptor.PROP_DESC_DIALOG_FIELD_EDITOR);
-//		
-//		if (trait != null) {
-//			String classname = TraitValueHelper.getValueAsString(trait);
-//			if (classname != null && ! classname.equals("")){
-//				try {
-//					Class klass = PDPlugin.getDefault().getBundle().loadClass(classname);
-//					if (klass != null){
-//						//
-//					}
-//				} catch (ClassNotFoundException e) {//
-//					String msg = "Unable to locate cell editor:"+classname+ " for "+toString();
-//					PDPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, PDPlugin.getPluginId(), msg));
-//				}
-//			}
-//		}
-		//otherwise use factory
-		EditorCreator creator = EditorCreator.getInstance();
-		return creator.createDialogFieldWithWrapper(getUri(),
-				getTagName(),this, null);
-	}
-
-	public String getTagName() {
-		return getTagEntity().getId();
-	}
-
-	public String getUri() {
-		return getMetaDataContext().getEntity().getModel().getCurrentModelContext().getUri();
-	}
-	
-	public String getValueType() {
-		return getTraitValueAsString(MetaDataEnabledProcessingFactory.ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME);
-	}
-
-	public String getAttributeName() {
-		return getMetaDataContext().getEntity().getId();
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (IPropertyDescriptor.class == adapter) {
-			return new PropertyDescriptorAdapter(this);
-		}
-		else if (IPossibleValues.class == adapter) {
-			List pvs = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-						IPossibleValues.class, 
-						getStructuredDocumentContext(), 
-						getAttributeEntity());
-			if (!pvs.isEmpty())
-				return pvs.get(0);
-		}
-		else if (IDefaultValue.class == adapter) {
-			List dvs = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-						IDefaultValue.class, 
-						getStructuredDocumentContext(), 
-						getAttributeEntity());
-			if (!dvs.isEmpty())
-				return dvs.get(0);
-		}
-		else if (ICellEditorValidator.class == adapter) {
-			IValidValues vvs = (IValidValues)getAdapter(IValidValues.class);
-			if (vvs != null)
-				return new EditorValidatorAdapter(vvs);			
-		
-		}
-		else if (IInputValidator.class == adapter) {
-				IValidValues vvs = (IValidValues)getAdapter(IValidValues.class);
-				if (vvs != null)	
-					return new EditorValidatorAdapter(vvs);				
-		}
-		else if (IValidValues.class == adapter) {
-			List vvs = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-						IValidValues.class, 
-						getStructuredDocumentContext(), 
-						getAttributeEntity());
-			if (!vvs.isEmpty())
-				return vvs.get(0);
-		}
-		return null;
-	}
-	
-	private Entity getTagEntity() {
-		return (Entity)getAttributeEntity().eContainer();
-	}
-	
-	private Entity getAttributeEntity() {
-		return getMetaDataContext().getEntity();
-	}
-	
-	public String toString() {
-		return getUri()+"/"+getTagName()+"/"+getAttributeName(); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptorAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptorAdapter.java
deleted file mode 100644
index a946b29..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptorAdapter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties.internal;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-
-/**
- * Adapts the MetadataEnabledFeature <code>org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor</code>, to a <code>org.eclipse.ui.views.properties.IPropertyDescriptor</code> 
- *
- */
-public class PropertyDescriptorAdapter implements IPropertyDescriptor{
-
-	private IPropertyPageDescriptor _ppd;
-
-	/**
-	 * Constructor
-	 * @param propertyPageDescriptor
-	 */
-	public PropertyDescriptorAdapter(IPropertyPageDescriptor propertyPageDescriptor) {
-		_ppd = propertyPageDescriptor;
-	}
-
-	public CellEditor createPropertyEditor(Composite parent) {
-		return _ppd.getCellEditor(parent);
-	}
-
-	public String getCategory() {
-		return _ppd.getCategory();
-	}
-
-	public String getDescription() {
-		return _ppd.getDescription();
-	}
-
-	public String getDisplayName() {
-		return _ppd.getAttributeName();
-	}
-
-	public String[] getFilterFlags() {
-		return null;
-	}
-
-	public Object getHelpContextIds() {
-		return null;//FIXME
-	}
-
-	public Object getId() {
-		return _ppd.getAttributeName();
-	}
-
-	public ILabelProvider getLabelProvider() {	
-		return null;//FIXME: do better?  Used to supply labels for attribute property sheet (not quick edit)
-	}
-
-	public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/package-info.java
deleted file mode 100644
index 4dae0fb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Web Page Editor tag attribute property page interfaces. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.editors.properties;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSections.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSections.java
deleted file mode 100644
index c3d5304..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSections.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSections.java,v 1.2 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Quick Edit Tab Sections</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections#getSections <em>Sections</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getQuickEditTabSections()
- * @model
- * @generated
- */
-public interface QuickEditTabSections extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-	
-	/**
-	 * trait id to use
-	 * @generated NOT
-	 */
-	String TRAIT_ID = "quick-edit-tab"; //$NON-NLS-1$
-	
-	/**
-	 * Returns the value of the '<em><b>Sections</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sections</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Sections</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getQuickEditTabSections_Sections()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='section'"
-	 * @generated
-	 */
-	EList<SectionInfo> getSections();
-
-} // QuickEditTabSections
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsFactory.java
deleted file mode 100644
index d51fba9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsFactory.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsFactory.java,v 1.2 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage
- * @generated
- */
-public interface QuickEditTabSectionsFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	QuickEditTabSectionsFactory eINSTANCE = org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Quick Edit Tab Sections</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Quick Edit Tab Sections</em>'.
-	 * @generated
-	 */
-	QuickEditTabSections createQuickEditTabSections();
-
-	/**
-	 * Returns a new object of class '<em>Section Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Section Info</em>'.
-	 * @generated
-	 */
-	SectionInfo createSectionInfo();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	QuickEditTabSectionsPackage getQuickEditTabSectionsPackage();
-
-} //QuickEditTabSectionsFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsPackage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsPackage.java
deleted file mode 100644
index e23670b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsPackage.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsPackage.java,v 1.5 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsFactory
- * @model kind="package"
- * @generated
- */
-@SuppressWarnings("hiding")
-public interface QuickEditTabSectionsPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "quickedittabsections"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore"; //$NON-NLS-1$
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "qe"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	QuickEditTabSectionsPackage eINSTANCE = org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl <em>Quick Edit Tab Sections</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getQuickEditTabSections()
-	 * @generated
-	 */
-	int QUICK_EDIT_TAB_SECTIONS = 0;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int QUICK_EDIT_TAB_SECTIONS__SECTIONS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Quick Edit Tab Sections</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int QUICK_EDIT_TAB_SECTIONS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl <em>Section Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSectionInfo()
-	 * @generated
-	 */
-	int SECTION_INFO = 1;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_INFO__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_INFO__TYPE = 1;
-
-	/**
-	 * The number of structural features of the '<em>Section Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_INFO_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE <em>SECTION TYPE</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSECTION_TYPE()
-	 * @generated
-	 */
-	int SECTION_TYPE = 2;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections <em>Quick Edit Tab Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Quick Edit Tab Sections</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections
-	 * @generated
-	 */
-	EClass getQuickEditTabSections();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections#getSections <em>Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Sections</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections#getSections()
-	 * @see #getQuickEditTabSections()
-	 * @generated
-	 */
-	EReference getQuickEditTabSections_Sections();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo <em>Section Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Section Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo
-	 * @generated
-	 */
-	EClass getSectionInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId()
-	 * @see #getSectionInfo()
-	 * @generated
-	 */
-	EAttribute getSectionInfo_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType()
-	 * @see #getSectionInfo()
-	 * @generated
-	 */
-	EAttribute getSectionInfo_Type();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE <em>SECTION TYPE</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>SECTION TYPE</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @generated
-	 */
-	EEnum getSECTION_TYPE();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	QuickEditTabSectionsFactory getQuickEditTabSectionsFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-//    @SuppressWarnings("hiding")
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl <em>Quick Edit Tab Sections</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getQuickEditTabSections()
-		 * @generated
-		 */
-        EClass QUICK_EDIT_TAB_SECTIONS = eINSTANCE.getQuickEditTabSections();
-
-		/**
-		 * The meta object literal for the '<em><b>Sections</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference QUICK_EDIT_TAB_SECTIONS__SECTIONS = eINSTANCE.getQuickEditTabSections_Sections();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl <em>Section Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSectionInfo()
-		 * @generated
-		 */
-		EClass SECTION_INFO = eINSTANCE.getSectionInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION_INFO__ID = eINSTANCE.getSectionInfo_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION_INFO__TYPE = eINSTANCE.getSectionInfo_Type();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE <em>SECTION TYPE</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSECTION_TYPE()
-		 * @generated
-		 */
-		EEnum SECTION_TYPE = eINSTANCE.getSECTION_TYPE();
-
-	}
-
-} //QuickEditTabSectionsPackage
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SECTION_TYPE.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SECTION_TYPE.java
deleted file mode 100644
index 3db1adf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SECTION_TYPE.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: SECTION_TYPE.java,v 1.3 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.Enumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>SECTION TYPE</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSECTION_TYPE()
- * @model
- * @generated
- */
-public enum SECTION_TYPE implements Enumerator {
-	/**
-	 * The '<em><b>ATTRIBUTE</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ATTRIBUTE_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	ATTRIBUTE(0, "ATTRIBUTE", "ATTRIBUTE"), //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * The '<em><b>SECTION</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SECTION_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	SECTION(1, "SECTION", "SECTION"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The '<em><b>ATTRIBUTE</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>ATTRIBUTE</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #ATTRIBUTE
-	 * @model
-	 * @generated
-	 * @ordered
-	 */
-	public static final int ATTRIBUTE_VALUE = 0;
-
-	/**
-	 * The '<em><b>SECTION</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>SECTION</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #SECTION
-	 * @model
-	 * @generated
-	 * @ordered
-	 */
-	public static final int SECTION_VALUE = 1;
-
-	/**
-	 * An array of all the '<em><b>SECTION TYPE</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final SECTION_TYPE[] VALUES_ARRAY =
-		new SECTION_TYPE[] {
-			ATTRIBUTE,
-			SECTION,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>SECTION TYPE</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List<SECTION_TYPE> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>SECTION TYPE</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param literal 
-	 * @return SECTION_TYPE
-	 * @generated
-	 */
-	public static SECTION_TYPE get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			SECTION_TYPE result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>SECTION TYPE</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param name 
-	 * @return SECTION_TYPE
-	 * @generated
-	 */
-	public static SECTION_TYPE getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			SECTION_TYPE result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>SECTION TYPE</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value 
-	 * @return SECTION_TYPE
-	 * @generated
-	 */
-	public static SECTION_TYPE get(int value) {
-		switch (value) {
-			case ATTRIBUTE_VALUE: return ATTRIBUTE;
-			case SECTION_VALUE: return SECTION;
-		}
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final int value;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final String name;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final String literal;
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private SECTION_TYPE(int value, String name, String literal) {
-		this.value = value;
-		this.name = name;
-		this.literal = literal;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getValue() {
-	  return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-	  return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLiteral() {
-	  return literal;
-	}
-
-	/**
-	 * Returns the literal value of the enumerator, which is its string representation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		return literal;
-	}
-	
-} //SECTION_TYPE
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SectionInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SectionInfo.java
deleted file mode 100644
index 8f5a152..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SectionInfo.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: SectionInfo.java,v 1.2 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Section Info</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType <em>Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSectionInfo()
- * @model
- * @generated
- */
-public interface SectionInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSectionInfo_Id()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Type</b></em>' attribute.
-	 * The default value is <code>"ATTRIBUTE"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Type</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Type</em>' attribute.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @see #setType(SECTION_TYPE)
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSectionInfo_Type()
-	 * @model default="ATTRIBUTE" unique="false"
-	 * @generated
-	 */
-	SECTION_TYPE getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(SECTION_TYPE value);
-
-} // SectionInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsFactoryImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsFactoryImpl.java
deleted file mode 100644
index 1388669..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsFactoryImpl.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsFactoryImpl.java,v 1.3 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsFactory;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class QuickEditTabSectionsFactoryImpl extends EFactoryImpl implements QuickEditTabSectionsFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the factory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static QuickEditTabSectionsFactory init() {
-		try {
-			QuickEditTabSectionsFactory theQuickEditTabSectionsFactory = (QuickEditTabSectionsFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore");  //$NON-NLS-1$
-			if (theQuickEditTabSectionsFactory != null) {
-				return theQuickEditTabSectionsFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new QuickEditTabSectionsFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS: return createQuickEditTabSections();
-			case QuickEditTabSectionsPackage.SECTION_INFO: return createSectionInfo();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case QuickEditTabSectionsPackage.SECTION_TYPE:
-				return createSECTION_TYPEFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case QuickEditTabSectionsPackage.SECTION_TYPE:
-				return convertSECTION_TYPEToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSections createQuickEditTabSections() {
-		QuickEditTabSectionsImpl quickEditTabSections = new QuickEditTabSectionsImpl();
-		return quickEditTabSections;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SectionInfo createSectionInfo() {
-		SectionInfoImpl sectionInfo = new SectionInfoImpl();
-		return sectionInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return the SECTION_TYPE enumerator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SECTION_TYPE createSECTION_TYPEFromString(EDataType eDataType, String initialValue) {
-		SECTION_TYPE result = SECTION_TYPE.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return the String version of the section type 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertSECTION_TYPEToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsPackage getQuickEditTabSectionsPackage() {
-		return (QuickEditTabSectionsPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the package 
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	@Deprecated
-	public static QuickEditTabSectionsPackage getPackage() {
-		return QuickEditTabSectionsPackage.eINSTANCE;
-	}
-
-} //QuickEditTabSectionsFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsImpl.java
deleted file mode 100644
index 081c76f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsImpl.java,v 1.2 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Quick Edit Tab Sections</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl#getSections <em>Sections</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class QuickEditTabSectionsImpl extends EObjectImpl implements QuickEditTabSections {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached value of the '{@link #getSections() <em>Sections</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSections()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<SectionInfo> sections;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected QuickEditTabSectionsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return QuickEditTabSectionsPackage.Literals.QUICK_EDIT_TAB_SECTIONS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<SectionInfo> getSections() {
-		if (sections == null) {
-			sections = new EObjectContainmentEList<SectionInfo>(SectionInfo.class, this, QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS);
-		}
-		return sections;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				return ((InternalEList<?>)getSections()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				return getSections();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				getSections().clear();
-				getSections().addAll((Collection<? extends SectionInfo>)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				getSections().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				return sections != null && !sections.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //QuickEditTabSectionsImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsPackageImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsPackageImpl.java
deleted file mode 100644
index 636c6ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsPackageImpl.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsPackageImpl.java,v 1.3 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsFactory;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class QuickEditTabSectionsPackageImpl extends EPackageImpl implements QuickEditTabSectionsPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass quickEditTabSectionsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass sectionInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum sectioN_TYPEEEnum = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private QuickEditTabSectionsPackageImpl() {
-		super(eNS_URI, QuickEditTabSectionsFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-     * @return the initialized package 
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static QuickEditTabSectionsPackage init() {
-		if (isInited) return (QuickEditTabSectionsPackage)EPackage.Registry.INSTANCE.getEPackage(QuickEditTabSectionsPackage.eNS_URI);
-
-		// Obtain or create and register package
-		QuickEditTabSectionsPackageImpl theQuickEditTabSectionsPackage = (QuickEditTabSectionsPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof QuickEditTabSectionsPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new QuickEditTabSectionsPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theQuickEditTabSectionsPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theQuickEditTabSectionsPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theQuickEditTabSectionsPackage.freeze();
-
-		return theQuickEditTabSectionsPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getQuickEditTabSections() {
-		return quickEditTabSectionsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getQuickEditTabSections_Sections() {
-		return (EReference)quickEditTabSectionsEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSectionInfo() {
-		return sectionInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSectionInfo_Id() {
-		return (EAttribute)sectionInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSectionInfo_Type() {
-		return (EAttribute)sectionInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getSECTION_TYPE() {
-		return sectioN_TYPEEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsFactory getQuickEditTabSectionsFactory() {
-		return (QuickEditTabSectionsFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		quickEditTabSectionsEClass = createEClass(QUICK_EDIT_TAB_SECTIONS);
-		createEReference(quickEditTabSectionsEClass, QUICK_EDIT_TAB_SECTIONS__SECTIONS);
-
-		sectionInfoEClass = createEClass(SECTION_INFO);
-		createEAttribute(sectionInfoEClass, SECTION_INFO__ID);
-		createEAttribute(sectionInfoEClass, SECTION_INFO__TYPE);
-
-		// Create enums
-		sectioN_TYPEEEnum = createEEnum(SECTION_TYPE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Create type parameters
-
-		// Set bounds for type parameters
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(quickEditTabSectionsEClass, QuickEditTabSections.class, "QuickEditTabSections", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getQuickEditTabSections_Sections(), this.getSectionInfo(), null, "sections", null, 0, -1, QuickEditTabSections.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-
-		initEClass(sectionInfoEClass, SectionInfo.class, "SectionInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEAttribute(getSectionInfo_Id(), ecorePackage.getEString(), "id", null, 1, 1, SectionInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEAttribute(getSectionInfo_Type(), this.getSECTION_TYPE(), "type", "ATTRIBUTE", 0, 1, SectionInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
-
-		// Initialize enums and add enum literals
-		initEEnum(sectioN_TYPEEEnum, org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE.class, "SECTION_TYPE"); //$NON-NLS-1$
-		addEEnumLiteral(sectioN_TYPEEEnum, org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE.ATTRIBUTE);
-		addEEnumLiteral(sectioN_TYPEEEnum, org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE.SECTION);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		 //$NON-NLS-1$
-		addAnnotation
-		  (getQuickEditTabSections_Sections(), 
-		   source, 
-		   new String[] {
-			 "kind", "element", //$NON-NLS-1$ //$NON-NLS-2$
-			 "name", "section" //$NON-NLS-1$ //$NON-NLS-2$
-		   });
-	}
-
-} //QuickEditTabSectionsPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/SectionInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/SectionInfoImpl.java
deleted file mode 100644
index b0019d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/SectionInfoImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: SectionInfoImpl.java,v 1.2 2008/11/18 22:22:35 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Section Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl#getType <em>Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SectionInfoImpl extends EObjectImpl implements SectionInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final SECTION_TYPE TYPE_EDEFAULT = SECTION_TYPE.ATTRIBUTE;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected SECTION_TYPE type = TYPE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SectionInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return QuickEditTabSectionsPackage.Literals.SECTION_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, QuickEditTabSectionsPackage.SECTION_INFO__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SECTION_TYPE getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(SECTION_TYPE newType) {
-		SECTION_TYPE oldType = type;
-		type = newType == null ? TYPE_EDEFAULT : newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, QuickEditTabSectionsPackage.SECTION_INFO__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				return getId();
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				return getType();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				setId((String)newValue);
-				return;
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				setType((SECTION_TYPE)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				return type != TYPE_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: "); //$NON-NLS-1$
-		result.append(id);
-		result.append(", type: "); //$NON-NLS-1$
-		result.append(type);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SectionInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsAdapterFactory.java
deleted file mode 100644
index f6b7045..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsAdapterFactory.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsAdapterFactory.java,v 1.2 2008/11/18 22:22:46 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage
- * @generated
- */
-public class QuickEditTabSectionsAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static QuickEditTabSectionsPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = QuickEditTabSectionsPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	@Override
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected QuickEditTabSectionsSwitch<Adapter> modelSwitch =
-		new QuickEditTabSectionsSwitch<Adapter>() {
-			@Override
-			public Adapter caseQuickEditTabSections(QuickEditTabSections object) {
-				return createQuickEditTabSectionsAdapter();
-			}
-			@Override
-			public Adapter caseSectionInfo(SectionInfo object) {
-				return createSectionInfoAdapter();
-			}
-			@Override
-			public Adapter defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	@Override
-	public Adapter createAdapter(Notifier target) {
-		return modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections <em>Quick Edit Tab Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections
-	 * @generated
-	 */
-	public Adapter createQuickEditTabSectionsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo <em>Section Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo
-	 * @generated
-	 */
-	public Adapter createSectionInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //QuickEditTabSectionsAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsSwitch.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsSwitch.java
deleted file mode 100644
index 040881c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsSwitch.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsSwitch.java,v 1.3 2008/11/18 22:22:46 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * 
- * @param <T> 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage
- * @generated
- */
-public class QuickEditTabSectionsSwitch<T> {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation"; //$NON-NLS-1$
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static QuickEditTabSectionsPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsSwitch() {
-		if (modelPackage == null) {
-			modelPackage = QuickEditTabSectionsPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public T doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected T doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List<EClass> eSuperTypes = theEClass.getESuperTypes();
-        return
-        	eSuperTypes.isEmpty() ?
-        		defaultCase(theEObject) :
-        		doSwitch(eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected T doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS: {
-				QuickEditTabSections quickEditTabSections = (QuickEditTabSections)theEObject;
-				T result = caseQuickEditTabSections(quickEditTabSections);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case QuickEditTabSectionsPackage.SECTION_INFO: {
-				SectionInfo sectionInfo = (SectionInfo)theEObject;
-				T result = caseSectionInfo(sectionInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Quick Edit Tab Sections</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Quick Edit Tab Sections</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseQuickEditTabSections(QuickEditTabSections object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Section Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Section Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseSectionInfo(SectionInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public T defaultCase(EObject object) {
-		return null;
-	}
-
-} //QuickEditTabSectionsSwitch
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/package-info.java
deleted file mode 100644
index e51e80c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Web Page Editor tag attribute QuickEdit property page classes.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/AbsolutePointLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/AbsolutePointLocator.java
deleted file mode 100644
index 0ebdeb2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/AbsolutePointLocator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * @author cbateman
- *
- */
-public class AbsolutePointLocator implements Locator 
-{
-    private static AbsolutePointLocator   INSTANCE;
-    private final static Point    DEFAULT_POINT = new Point(0,0);
-    
-    private Point  _referencePoint = DEFAULT_POINT; 
-    private int    _xOffset = 0;
-    private int    _yOffset = 0;
-    private IFigure _intersectFigure;
-    
-    /**
-     * @return the singleton instance
-     */
-    public synchronized static AbsolutePointLocator getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new AbsolutePointLocator();
-        }
-        return INSTANCE;
-    }
-    
-    /** 
-     * Relocates the target figure to the reference point with possible x and y
-     * offsetting.  Uses the target's preferredSize as the new size.
-     */
-    public void relocate(IFigure target) 
-    {
-        Point leftTop = new Point(_referencePoint.x+_xOffset, _referencePoint.y+_yOffset);
-        
-
-        //figure.translateToAbsolute(leftTop);
-        target.translateToRelative(leftTop);
-        Dimension d = target.getPreferredSize();
-        Rectangle rect = new Rectangle(leftTop, d);
-
-        // to avoid enlargemeent
-        if (_intersectFigure != null)
-        {
-            rect = rect.intersect(_intersectFigure.getBounds());
-        }
-        
-        target.setBounds(rect);
-    }
-
-    /**
-     * Sets the reference point used to calculate the location to which
-     * relocate will relocate its target.  The x and y offset values are added
-     * to the reference point before final re-location.  If point is null
-     * then the reference is set to (0,0)
-     * @param point
-     * @param xoffset 
-     * @param yoffset 
-     */
-    public void setReferencePoint(Point point, int xoffset, int yoffset)
-    {
-        if (point == null)
-        {
-            _referencePoint = DEFAULT_POINT;
-        }
-        else
-        {
-            _referencePoint = point;
-        }
-       
-        _xOffset = xoffset;
-        _yOffset = yoffset;
-    }
-    
-    /**
-     * Sets the figure used to calculate a rectangular intersect of the 
-     * relocated target.  This normally set to the parent of the target
-     * such as a layer to ensure that the relocate target does not enlarge
-     * its parent by relocating outside it's rectangle.
-     * 
-     * If intersectFigure is set to null, then no intersect calculation will
-     * be performed.
-     * 
-     * @param intersectFigure
-     */
-    public void setIntersectFigure(IFigure intersectFigure)
-    {
-        _intersectFigure = intersectFigure;
-    }
-    
-    private AbsolutePointLocator() {/*no external instantiation*/}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/BasicLabelToolTip.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/BasicLabelToolTip.java
deleted file mode 100644
index bd216a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/BasicLabelToolTip.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A tool tip based on a label
- * @author cbateman
- *
- */
-public class BasicLabelToolTip extends Label
-{
-    /**
-     * @param i
-     */
-    public BasicLabelToolTip(Image i) {
-        super(i);
-        initialize();
-    }
-
-    /**
-     * @param s
-     * @param i
-     */
-    public BasicLabelToolTip(String s, Image i) {
-        super(s, i);
-        initialize();
-    }
-
-    /**
-     * @param s
-     */
-    public BasicLabelToolTip(String s) {
-        super(s);
-        initialize();
-    }
-
-    /**
-     * 
-     */
-    protected void initialize()
-    {
-        setOpaque(true);
-        setBackgroundColor(ColorConstants.tooltipBackground);
-        setBorder(
-                new LineBorder(ColorConstants.tooltipForeground, 1)
-                {
-                    // add an extra pixel of inset to make sure the text
-                    // isn't pressed against the border
-                    public Insets getInsets(IFigure figure) {
-                        return new Insets(getWidth()+1);
-                    }
-                }
-        );
-        setTextAlignment(PositionConstants.CENTER); 
-        setForegroundColor(ColorConstants.tooltipForeground);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnHelper.java
deleted file mode 100644
index 6574e59..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnHelper.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-
-/**
- * @author mengbo
- */
-public class ColumnHelper {
-    
-    /**
-     * @param editPart
-     * @return a rectangle that bounds the actual visual rectangle of the column represented
-     * by editPart.  The editPart's figure normally only maps to the td in the rendered table.
-     * 
-     * The rectangle is translated to absolute bounds
-     */
-    public static Rectangle getAdjustedColumnBoundingRectangle(GraphicalEditPart editPart)
-    {
-        Rectangle bounds = editPart.getFigure().getBounds().getCopy();
-
-        if (editPart.getParent() != null) {
-            IFigure figure = ((GraphicalEditPart) editPart.getParent())
-                    .getFigure();
-            if (figure instanceof CSSFigure) {
-                CSSFigure cssFigure = (CSSFigure) figure;
-                LayoutManager layoutManager = cssFigure.getLayoutManager();
-                if (layoutManager instanceof CSSTableLayout2) {
-                    CSSTableLayout2 tableLayout = (CSSTableLayout2) layoutManager;
-                    bounds.y = tableLayout.getHSpacing();
-                    bounds.height = figure.getClientArea().height
-                            - tableLayout.getHSpacing() * 2;
-                }
-            }
-        }
-        bounds = new PrecisionRectangle(bounds.getResized(-1, -1));
-        editPart.getFigure().translateToAbsolute(bounds);
-        
-        return bounds;
-    }
-    
-	static Rectangle getColumnBounds(GraphicalEditPart editPart,
-			IFigure target) {
-	    Rectangle bounds = getAdjustedColumnBoundingRectangle(editPart);
-        target.translateToRelative(bounds);
-        Insets insets = target.getInsets();
-		bounds.translate(-insets.left, -insets.top);
-		bounds.resize(insets.getWidth() + 1, insets.getHeight() + 1);
-		return bounds;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnResizableEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnResizableEditPolicy.java
deleted file mode 100644
index 4b527c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnResizableEditPolicy.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Handle;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.handles.MoveHandle;
-import org.eclipse.gef.handles.ResizeHandle;
-import org.eclipse.gef.handles.SquareHandle;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.gef.tools.SelectEditPartTracker;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class ColumnResizableEditPolicy extends ElementResizableEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
-	 */
-	protected List createSelectionHandles() {
-		String elementName = ((Element) getHost().getModel()).getLocalName();
-		if ("column".equalsIgnoreCase(elementName)) { //$NON-NLS-1$
-			List list = new ArrayList();
-
-			GraphicalEditPart part = (GraphicalEditPart) getHost();
-            
-            {
-    			MoveHandle borderhandle = new MoveHandle(part, new ColumnBorderHandleLocator(
-    					part));
-    			list.add(borderhandle);
-            }
-            
-            {
-    			MyMoveHandle cornerHandle = new MyMoveHandle(part, new ColumnHandleLocator(part, getHostFigure(),
-    					PositionConstants.NORTH_WEST));
-    			list.add(cornerHandle);
-            }
-            
-			SelectEditPartTracker tracker = new SelectEditPartTracker(getHost());
-			list.add(createHandle(part, PositionConstants.SOUTH_EAST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.SOUTH_WEST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.NORTH_WEST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.NORTH_EAST, tracker,
-					SharedCursors.ARROW));
-			return list;
-
-		}
-		return super.createSelectionHandles();
-	}
-
-	private Handle createHandle(GraphicalEditPart owner, int direction,
-			DragTracker tracker, Cursor cursor) {
-		ResizeHandle handle = new ResizeHandle(owner, new ColumnCornerLocator(
-				owner, direction), cursor);
-		handle.setCursor(cursor);
-		handle.setDragTracker(tracker);
-		return handle;
-	}
-
-    private class ColumnHandleLocator extends CornerRelativeHandleLocator {
-		private GraphicalEditPart editPart;
-
-		/**
-		 * @param editPart
-		 * @param reference
-		 * @param location
-		 */
-		public ColumnHandleLocator(GraphicalEditPart editPart, IFigure reference, int location) {
-            super(reference, location);
-			this.editPart = editPart;
-		}
-        
-        protected Dimension getNewTargetSize(IFigure relocateFigure) {
-            return relocateFigure.getPreferredSize();
-        }
-
-        protected Rectangle getCurrentTargetBounds(IFigure relocateFigure) {
-            return ColumnHelper.getColumnBounds(editPart, relocateFigure);
-        }
-	}
-
-	private class ColumnCornerLocator implements Locator {
-		private double relativeX;
-
-		private double relativeY;
-
-		private GraphicalEditPart editPart;
-
-		/**
-		 * Constructs a RelativeLocator with the given reference figure and
-		 * relative location. The location is a constant from
-		 * {@link PositionConstants} used as a convenient and readable way to
-		 * set both the relativeX and relativeY values.
-		 * 
-		 * @param editPart
-		 *            the reference figure
-		 * @param location
-		 *            one of NORTH, NORTH_EAST, etc.
-		 */
-		public ColumnCornerLocator(GraphicalEditPart editPart, int location) {
-			this.editPart = editPart;
-			switch (location & PositionConstants.NORTH_SOUTH) {
-			case PositionConstants.NORTH:
-				relativeY = 0;
-				break;
-			case PositionConstants.SOUTH:
-				relativeY = 1.0;
-				break;
-			default:
-				relativeY = 0.5;
-			}
-
-			switch (location & PositionConstants.EAST_WEST) {
-			case PositionConstants.WEST:
-				relativeX = 0;
-				break;
-			case PositionConstants.EAST:
-				relativeX = 1.0;
-				break;
-			default:
-				relativeX = 0.5;
-			}
-		}
-
-		/**
-		 * Relocates the target using the relative offset locations.
-		 * 
-		 * @see org.eclipse.draw2d.Locator#relocate(org.eclipse.draw2d.IFigure)
-		 */
-		public void relocate(IFigure target) {
-			Rectangle targetBounds = ColumnHelper.getColumnBounds(editPart,
-					target);
-
-			Dimension targetSize = target.getPreferredSize();
-
-			targetBounds.x += (int) (targetBounds.width * relativeX - ((targetSize.width + 1) / 2));
-			targetBounds.y += (int) (targetBounds.height * relativeY - ((targetSize.height + 1) / 2));
-			targetBounds.setSize(targetSize);
-			target.setBounds(targetBounds);
-		}
-	}
-
-    private class ColumnBorderHandleLocator implements Locator {
-        private GraphicalEditPart editPart;
-
-        /**
-         * @param editPart
-         */
-        public ColumnBorderHandleLocator(GraphicalEditPart editPart) {
-            this.editPart = editPart;
-        }
-
-        public void relocate(IFigure target) {
-            target.setBounds(ColumnHelper.getColumnBounds(editPart, target));
-        }
-    }
-    
-    private static class MyMoveHandle extends SquareHandle
-    {
-        private static final String MOVE_HANDLE_IMAGE_FILE = "MoveHandle.png"; //$NON-NLS-1$
-
-		/**
-         * @param owner
-         * @param loc
-         */
-        public MyMoveHandle(GraphicalEditPart owner, Locator loc) {
-            super(owner, loc);
-            setCursor(SharedCursors.SIZEALL);
-        }
-
-        protected void init() {
-            setPreferredSize(16,16);
-        }
-
-        protected Color getBorderColor() {
-            return ColorConstants.black;
-        }
-
-        protected Color getFillColor() {
-            return ColorConstants.white;
-        }
-
-        protected DragTracker createDragTracker() {
-            DragTracker tracker = new DragEditPartsTracker(getOwner());
-            
-            return tracker;
-        }
-
-        public void paintFigure(Graphics graphics) {
-            super.paintFigure(graphics);
-            final  Image moveImage = PDPlugin.getDefault().getImage(MOVE_HANDLE_IMAGE_FILE);
-            Point topLeft = getBounds().getTopLeft().getCopy();
-            topLeft.performTranslate(3,3);
-            graphics.drawImage(moveImage, topLeft);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java
deleted file mode 100644
index e43befe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.handles.RelativeHandleLocator;
-
-/**
- * A locator for handles that attach to the corner of square figures
- * @author cbateman
- *
- */
-class CornerRelativeHandleLocator extends RelativeHandleLocator
-{
-    private double relativeX = 0;
-    private double relativeY = 0;
-    private double offsetXMultiplier = 0;
-    private double offsetYMultiplier = 0;
-    
-    /**
-     * @param reference
-     * @param location
-     */
-    public CornerRelativeHandleLocator(IFigure reference, int location) {
-        super(reference, location);
-        
-        // unfortunately, relativeX and relativeY are private in super
-        // so duplicate calc code here
-        switch (location & PositionConstants.NORTH_SOUTH) 
-        {
-            case PositionConstants.NORTH:
-                relativeY = 0; 
-                offsetYMultiplier = -1.0;
-            break;
-
-            case PositionConstants.SOUTH:
-                relativeY = 1.0; 
-                offsetYMultiplier = 0;
-            break;
-            default:
-                relativeY = 0.5;
-        }
-
-        switch (location & PositionConstants.EAST_WEST) 
-        {
-            case PositionConstants.WEST:
-                relativeX = 0; 
-                offsetXMultiplier = -1.0;
-            break;
-            case PositionConstants.EAST:
-                relativeX = 1.0;
-                offsetXMultiplier = 0;                    
-            break;
-            default:
-                relativeX = 0.5;
-        }
-    }
-
-    /**
-     * Pass in targetBounds to be updated and newTargetSize.  targetBounds will
-     * be applied to the figure that is being relocated immediately after this method
-     * @param targetBounds
-     * @param newTargetSize
-     */
-    protected void relocateBounds(Rectangle targetBounds, Dimension newTargetSize)
-    {
-        // copied from super.relocate because relativeX/Y are private in super
-        // changed from super to remove div by 2 that centers target; we want
-        // it to be corner-to-corner
-        targetBounds.x
-            += (int) (((targetBounds.width+2) * relativeX) + ((newTargetSize.width+1)*offsetXMultiplier));
-        targetBounds.y
-            += (int) (targetBounds.height * relativeY + ((newTargetSize.height+1)*offsetYMultiplier));
-
-        targetBounds.setSize(newTargetSize);
-    }
-
-    /**
-     * @param relocateFigure
-     * @return a modifiable Rectangle that represents the bounds of the figure to be relocated
-     */
-    protected Rectangle getCurrentTargetBounds(IFigure relocateFigure)
-    {
-        IFigure reference = getReferenceFigure();
-        Rectangle targetBounds = new PrecisionRectangle(getReferenceBox().getResized(-1, -1));
-        reference.translateToAbsolute(targetBounds);
-        relocateFigure.translateToRelative(targetBounds);
-        return targetBounds;
-    }
-    
-    /**
-     * @param relocateFigure
-     * @return the new target dimensions
-     */
-    protected Dimension getNewTargetSize(IFigure relocateFigure)
-    {
-        return relocateFigure.getPreferredSize();
-    }
-    
-    public void relocate(IFigure target) {
-        Rectangle targetBounds = getCurrentTargetBounds(target);
-        Dimension targetSize = getNewTargetSize(target);
-        relocateBounds(targetBounds, targetSize);
-
-        target.setBounds(targetBounds);        
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DesignerElementEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DesignerElementEditPolicy.java
deleted file mode 100644
index d374946..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DesignerElementEditPolicy.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.editpolicies.ComponentEditPolicy;
-
-/**
- * @author mengbo
- */
-public class DesignerElementEditPolicy extends ComponentEditPolicy {
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.gef.editpolicies.ComponentEditPolicy#createDeleteCommand(org.eclipse.gef.requests.GroupRequest)
-	// */
-	// protected Command createDeleteCommand(GroupRequest deleteRequest)
-	// {
-	// // Object model = getHost().getModel();
-	// // ;
-	// // Node parent = null;
-	// // if (model instanceof Node)
-	// // {
-	// // parent = ((Node) model).getParentNode();
-	// // }
-	// // EditDomain domain = getHost().getViewer().getEditDomain();
-	// // IEditorPart editor = null;
-	// // //FIXME: must do this cast?
-	// // if (domain instanceof DefaultEditDomain)
-	// // {
-	// // editor = ((DefaultEditDomain) domain).getEditorPart();
-	// // }
-	// // if (editor instanceof HTMLEditor)
-	// // {
-	// // DeleteNodeCommand deleteCmd = new DeleteNodeCommand(((HTMLEditor)
-	// editor).getTextEditor().getTextViewer());
-	// // deleteCmd.setParent(parent);
-	// // deleteCmd.setChild((Node) getHost().getModel());
-	// // return deleteCmd;
-	// // }
-	// // else
-	// // {
-	// // return null;
-	// // }
-	// }
-	//
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see org.eclipse.gef.EditPolicy#getCommand(org.eclipse.gef.Request)
-	// */
-	// public Command getCommand(Request request)
-	// {
-	// if (request.getType() == DesignCutAction.CUT_TYPE && request instanceof
-	// GroupRequest)
-	// {
-	// return createCutCommand((GroupRequest) request);
-	// }
-	// else if (request.getType() == DesignPasteAction.PASTE_TYPE && request
-	// instanceof GroupRequest)
-	// {
-	// return createPasteCommand((GroupRequest) request);
-	// }
-	// return super.getCommand(request);
-	// }
-	//
-	// protected Command createCutCommand(GroupRequest cutRequest)
-	// {
-	// Object model = getHost().getModel();
-	// ;
-	// Node parent = null;
-	// if (model instanceof Node)
-	// {
-	// parent = ((Node) model).getParentNode();
-	// }
-	// EditDomain domain = getHost().getViewer().getEditDomain();
-	// IEditorPart editor = null;
-	// //FIXME: must do this cast?
-	// if (domain instanceof DefaultEditDomain)
-	// {
-	// editor = ((DefaultEditDomain) domain).getEditorPart();
-	// }
-	// if (editor instanceof HTMLEditor)
-	// {
-	// CutNodeCommand cutCmd = new CutNodeCommand(((HTMLEditor)
-	// editor).getTextEditor().getTextViewer());
-	// cutCmd.setParent(parent);
-	// cutCmd.setChild((Node) getHost().getModel());
-	// return cutCmd;
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-	//
-	// protected Command createPasteCommand(GroupRequest cutRequest)
-	// {
-	// Object model = getHost().getModel();
-	// ;
-	// Node parent = null;
-	// if (model instanceof Node)
-	// {
-	// parent = ((Node) model).getParentNode();
-	// }
-	// EditDomain domain = getHost().getViewer().getEditDomain();
-	// IEditorPart editor = null;
-	// //FIXME: must do this cast?
-	// if (domain instanceof DefaultEditDomain)
-	// {
-	// editor = ((DefaultEditDomain) domain).getEditorPart();
-	// }
-	// if (editor instanceof HTMLEditor)
-	// {
-	// PasteNodeCommand pasteCmd = new PasteNodeCommand(((HTMLEditor)
-	// editor).getTextEditor().getTextViewer());
-	// pasteCmd.setParent(parent);
-	// pasteCmd.setChild((Node) getHost().getModel());
-	// return pasteCmd;
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DragMoveEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DragMoveEditPolicy.java
deleted file mode 100644
index 0a805da..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DragMoveEditPolicy.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.commands.CloneNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.MoveNodeCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DragMoveEditPolicy extends DropEditPolicy
-{
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public final Command getCommand(Request request) {
-		if (!(request instanceof ChangeBoundsRequest)) {
-			return null;
-		}
-
-		ChangeBoundsRequest r = (ChangeBoundsRequest) request;
-
-		// we only support move/copy a single node.
-		if (!MoveSupport.isSingleNode(r)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		// the edit policy only handle at the target part, so only care about
-		// the
-		// target part request.
-		final Object type = r.getType();
-		if (type != REQ_ADD && type != REQ_CLONE && type != REQ_MOVE_CHILDREN) {
-
-			return null;
-		}
-
-		Node draggedNode = MoveSupport.getDraggedNode(r);
-		Node hostNode = ((NodeEditPart) getHost()).getIDOMNode();
-
-		if (DOMUtil.isAncester(draggedNode, hostNode)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		DesignPosition position = findPosition(r);
-		if (position == null || !position.isValid()) {
-			return null;
-		}
-
-		// can't move/copy into self.
-		Node node = position.getContainerNode();
-		if (DOMUtil.isAncester(draggedNode, node)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		// ok, we are about to move/copy into the specified position.
-		IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position);
-
-		if (REQ_CLONE.equals(type)) {
-			return new CloneNodeCommand((IHTMLGraphicalViewer) getHost()
-					.getViewer(), domposition, draggedNode);
-		}
-        return new MoveNodeCommand((IHTMLGraphicalViewer) getHost()
-        		.getViewer(), domposition, draggedNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof ChangeBoundsRequest) {
-			return this.getHost();
-		}
-		return super.getTargetEditPart(request);
-	}
-
-	protected final DesignPosition findPosition(DropRequest r) {
-		final IPositionMediator mediator = getDropChildValidator(r);
-        if (mediator == null)
-        {
-            return null;
-        }
-        final IDropLocationStrategy dropStrategy = createDropLocationStrategy(r);
-		final DesignPosition position = 
-            dropStrategy.calculateDesignPosition(getHost(), r.getLocation(), mediator);
-        
-        // verify that the drop strategy has honoured it's contract that our
-        // mediator be respected
-        if (position != null)
-        {
-            if (!mediator.isValidPosition(position))
-            {
-                // if our mediator says no go, then veto the requestor
-                // there is no drop location
-                return null;
-            }
-        }
-		return position;
-	}
-
-    public void showTargetFeedback(Request request) 
-    {
-        Object type = request.getType();
-        // only show feedback for these request types
-        if (type == REQ_ADD || type == REQ_CLONE
-                || type == REQ_MOVE_CHILDREN || type == REQ_MOVE) {
-            super.showTargetFeedback(request);
-        }
-    }
-
-    protected final IPositionMediator createDefaultDropChildValidator(DropData r)
-    {
-        return new DnDPositionValidator(new DropActionData(
-                ActionData.COMPONENT_MOVE, r));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DropEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DropEditPolicy.java
deleted file mode 100644
index 87368ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DropEditPolicy.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-
-/**
- * @author cbateman
- *
- */
-public abstract class DropEditPolicy extends GraphicalEditPolicy 
-{
-    private List        _feedbackFigures;
-
-    /**
-     * @param r
-     * @return a mediator that can validate valid model drops into the
-     * host's edit part
-     */
-    protected IPositionMediator createDropChildValidator(DropRequest r)
-    {
-        // sub-class may override to customize the drop container validator
-        return null;
-    }
-    
-    /**
-     * @param r
-     * @return the appropriate design position for the drop request
-     */
-    protected abstract DesignPosition findPosition(DropRequest r);
-    
-    /**
-     * @param data
-     * @return a default validation mediator to be used if nothing custom is provided
-     */
-    protected abstract IPositionMediator createDefaultDropChildValidator(DropData data);
-    
-    /**
-     * @param r
-     * @return the validator to be used to validate the 'request' to drop
-     * the edit parts specified by 'r' into this policy's host edit part
-     */
-    protected final IPositionMediator getDropChildValidator(DropRequest r)
-    {
-        IPositionMediator mediator = createDropChildValidator(r);
-        
-        if (mediator == null)
-        {
-            DropData data = createDropData(r);
-            
-            if (data == null)
-            {
-                return null;
-            }
-            mediator = createDefaultDropChildValidator(data);
-        }
-       
-        return mediator;
-    }
-    
-    /**
-     * @param request
-     * @return the data about the drop request
-     */
-    protected DropData createDropData(DropRequest request)
-    {
-        if (request instanceof GroupRequest)
-        {
-            List editParts = ((GroupRequest)request).getEditParts();
-            
-            // TODO: currently we only support one drop item
-            if (editParts.size() > 0)
-            {
-                EditPart part = (EditPart) editParts.get(0);
-                if (part instanceof NodeEditPart)
-                {
-                    NodeEditPart nodePart = (NodeEditPart) part;
-                    TagIdentifier tagId = nodePart.getTagIdentifier();
-                    if (tagId != null)
-                    {
-                        List tagIds = new ArrayList();
-                        tagIds.add(tagId);
-                        return new DropData(tagIds);
-                    }
-                }
-            }
-        }
-        else if (request instanceof ItemCreationRequest)
-        {
-            IDropSourceData creationProvider = 
-                ((ItemCreationRequest)request).getTagCreationProvider();
-            String tagName = creationProvider.getId();
-            if (creationProvider instanceof ITagDropSourceData)
-            {
-                tagName = ((ITagDropSourceData)creationProvider).getTagName();
-            }
-            TagIdentifier tagId = 
-                TagIdentifierFactory.
-                    createJSPTagWrapper(creationProvider.getNamespace(),
-                            tagName);
-            List tagIds = new ArrayList();
-            tagIds.add(tagId);
-            return new DropData(tagIds);
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param r
-     * @return the drop location strategy
-     */
-    protected final IDropLocationStrategy createDropLocationStrategy(DropRequest r)
-    {
-        DropData dropData = createDropData(r);
-        if (dropData != null && dropData.getTagIdentifiers().size() > 0)
-        {
-            // TODO: only supporting single item drop currently
-            TagIdentifier tagIdentifier = 
-                (TagIdentifier) dropData.getTagIdentifiers().get(0);
-
-            IElementEdit elementEdit = 
-                ElementEditFactoryRegistry.getInstance()
-                    .createElementEdit(tagIdentifier); 
-
-            // element edit not guaranteed to exist
-            if (elementEdit != null)
-            {
-                IDropLocationStrategy strategy = 
-                    elementEdit.getDropRequestorLocationStrategy(tagIdentifier, getHost().getViewer());
-                
-                if (strategy != null)
-                {
-                    return strategy;
-                }
-            }
-        }
-        
-        // by default, return the default strategy
-        return new DefaultDropLocationStrategy(getHost().getViewer());
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-     */
-    public void eraseTargetFeedback(Request request) {
-        if (_feedbackFigures != null)
-        {
-            for (final Iterator it = _feedbackFigures.iterator(); it.hasNext();)
-            {
-                final IFigure figure = (IFigure) it.next();
-                
-                if (figure != null)
-                {
-                    removeFeedback(figure);
-                }
-            }
-            
-            _feedbackFigures.clear();
-            _feedbackFigures = null;
-        }
-    }
-    
-    public void showTargetFeedback(Request request) 
-    {
-        if (request instanceof DropRequest) 
-        {
-            DesignPosition position = findPosition((DropRequest)request);
-            if (position != null) {
-                // erase any prior feedback
-                eraseTargetFeedback(request);
-                // add figures to feedback layer and save them in _feedbackFigures
-                // for later.
-                _feedbackFigures = createDropLocationStrategy((DropRequest)request).showTargetFeedback(getHost(), position, (DropRequest)request); 
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementDecoratorSquareHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementDecoratorSquareHandle.java
deleted file mode 100644
index 5ba2257..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementDecoratorSquareHandle.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.SquareHandle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * A square handle for element decoration
- * @author cbateman
- *
- */
-public class ElementDecoratorSquareHandle extends SquareHandle {
-
-    
-    /**
-     * @param owner
-     * @param loc
-     * @param c
-     */
-    public ElementDecoratorSquareHandle(GraphicalEditPart owner, Locator loc,
-            Cursor c) {
-        super(owner, loc, c);
-    }
-    /**
-     * @param owner
-     * @param loc
-     */
-    public ElementDecoratorSquareHandle(GraphicalEditPart owner, Locator loc) {
-        super(owner, loc);
-    }
-    protected DragTracker createDragTracker() {
-        return null;
-    }
-    protected Color getBorderColor() {
-        return ColorConstants.black;
-    }
-
-    protected Color getFillColor() 
-    {
-        return ColorConstants.white;
-    }
-
-    /**
-     * @return the transparency alpha channel (0-255)
-     */
-    protected int getAlpha()
-    {
-        return 255;
-    }
-    
-    /**
-     * Draws the handle with fill color and outline color dependent 
-     * on the primary selection status of the owner editpart.
-     *
-     * @param g The graphics used to paint the figure.
-     */
-    public void paintFigure(Graphics g) {
-        Rectangle r = getBounds();
-        r.shrink(1, 1);
-        try {
-            g.setBackgroundColor(getFillColor());
-            g.setAlpha(getAlpha());
-            g.fillRectangle(r.x, r.y, r.width, r.height);
-            g.setForegroundColor(getBorderColor()); 
-            g.drawRectangle(r.x, r.y, r.width, r.height);
-        } finally {
-            //We don't really own rect 'r', so fix it.
-            r.expand(1, 1);
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementMenuBar.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementMenuBar.java
deleted file mode 100644
index ee61b03..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementMenuBar.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NonVisualComponentEditPart;
-
-/**
- * A menu bar for a specific element edit part
- * 
- * @author cbateman
- *
- */
-public class ElementMenuBar extends Figure implements ISelectionProvider, ISelectionChangedListener
-{
-    private ElementEditPart   _hostPart;
-    /**
-     * Should always be accessed for use through getChildParts().  Not automatically
-     * allocated because of high probability that a host part will have no children of interest
-     */
-    private Set                    _childParts;
-    private List                    _selectionListeners;
-    private IStructuredSelection    _selection;
-
-    /**
-     * @param hostPart
-     */
-    public ElementMenuBar(ElementEditPart hostPart)
-    {
-        hostPart.getViewer().addSelectionChangedListener(this);
-        
-        _hostPart = hostPart;
-        ToolbarLayout layout = new ToolbarLayout(false);
-        layout.setSpacing(4);
-        setLayoutManager(layout);
-    }
-
-    /**
-     * @return true if there are child parts in the menu
-     */
-    public boolean hasChildParts()
-    {
-        return _childParts != null &&_childParts.size() > 0;
-    }
-    
-    /**
-     * 
-     */
-    public void dispose()
-    {
-        _hostPart.getViewer().removeSelectionChangedListener(this);
-        if (_childParts != null)
-        {
-            _childParts.clear();
-            _childParts = null;
-        }
-        
-        if (_selectionListeners != null)
-        {
-            _selectionListeners.clear();
-            _selectionListeners = null;
-        }
-        
-        _selection = null;
-    }
-    
-    /**
-     * @param editpart
-     */
-    public void addNonVisualChild(NonVisualComponentEditPart editpart)
-    {
-        add(editpart.getFigure());
-        getChildParts().add(editpart);
-    }
-    
-    /**
-     * Removes editpart from the list of non-visual edit parts that this menu
-     * bar is managing the visuals for. 
-     * @param editpart
-     */
-    public void removeNonVisualChild(final NonVisualComponentEditPart editpart)
-    {
-        // TODO: I have relaxed the checking to see if editpart is valid
-        // child because of the way ElementEditPart refreshes itself
-        // when the model changes.  It's possible this will get called more
-        // than once for the same editpart argument
-        getChildParts().remove(editpart);
-        if (editpart.getFigure().getParent() == this)
-        {
-            remove(editpart.getFigure());
-        }
-    }
-
-    /**
-     * @return true if a member of the menu bar has edit part focus
-     */
-    public boolean hasEditPartFocus()
-    {
-        for (Iterator it = getChildParts().iterator(); it.hasNext();)
-        {
-            EditPart editPart = (EditPart) it.next();
-            
-            if (editPart.getSelected() == EditPart.SELECTED_PRIMARY)
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-    
-    private Set getChildParts()
-    {
-        if (_childParts == null) 
-        {
-            _childParts = new HashSet();
-        }
-
-        return _childParts;
-    }
-
-    protected void paintChildren(Graphics graphics) 
-    {
-        // force all children to paint with my alpha setting
-        graphics.setAlpha(getAlpha());
-        //push the current state so it is what the children revert to
-        graphics.pushState();
-        super.paintChildren(graphics);
-        // pop that state we pushed above
-        graphics.popState();
-    }
-
-    private int getAlpha()
-    {
-        return isEnabled() ? 255 : 75;
-    }
-
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        List listeners = getSelectionListeners();
-        
-        if (!listeners.contains(listener))
-        {
-            listeners.add(listener);
-        }
-    }
-
-    public ISelection getSelection() {
-        return _selection;
-    }
-
-    public void removeSelectionChangedListener(
-            ISelectionChangedListener listener) {
-        getSelectionListeners().remove(listener);
-    }
-
-    public void setSelection(ISelection selection) {
-        // no external selection change supported
-    }
-    
-    private List getSelectionListeners()
-    {
-        if (_selectionListeners == null)
-        {
-            _selectionListeners = new ArrayList(1);
-        }
-        
-        return _selectionListeners;
-    }
-
-    private void fireSelectionChanged() 
-    {
-        for (final Iterator it = _selectionListeners.iterator(); it.hasNext();)
-        {
-            ISelectionChangedListener listener = (ISelectionChangedListener) it.next();
-            listener.selectionChanged(new SelectionChangedEvent(this, _selection));
-        }
-    }
-
-    public void selectionChanged(SelectionChangedEvent event) {
-        ISelection selection = event.getSelection();
-        
-        if (selection instanceof IStructuredSelection)
-        {
-            // the number of selections we care about will be no bigger than the total number of selections
-            final List mySelections = new ArrayList(((IStructuredSelection)selection).size());
-            
-            if (_childParts != null)
-            {
-                for (final Iterator it = ((IStructuredSelection)selection).iterator()
-                        ; it.hasNext();)
-                {
-                    Object selectedObj = it.next();
-                    if (_childParts.contains(selectedObj))
-                    {
-                        mySelections.add(selectedObj);
-                    }
-                }
-            }
-
-            _selection = new StructuredSelection(mySelections);
-            
-            fireSelectionChanged();
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementResizableEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementResizableEditPolicy.java
deleted file mode 100644
index 368d267..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementResizableEditPolicy.java
+++ /dev/null
@@ -1,493 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.gef.requests.SelectionRequest;
-import org.eclipse.gef.tools.SelectEditPartTracker;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.BlockBox;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.requests.LocationModifierRequest;
-import org.eclipse.jst.pagedesigner.tools.ObjectModeDragTracker;
-import org.eclipse.jst.pagedesigner.tools.RangeDragTracker;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementResizableEditPolicy extends ResizableEditPolicy implements IEnhancedSelectionEditPolicy 
-{
-	private static final Insets INSETS_1 = new Insets(1, 1, 1, 1);
-
-	private static final int THRESHHOLD = 3;
-    
-    // the number of pixels to offset the top left of tooltop feedback
-    // below the current mouse cursor location
-    private static final int TOOLTIP_VERTICAL_OFFSET = 25;
-
-	private static final Insets INSETS_CONST = new Insets(THRESHHOLD,
-			THRESHHOLD, THRESHHOLD, THRESHHOLD);
-
-	private boolean _showLabelFeedback = true;
-
-	private IFigure[] _hoverFeedbackFigure;
-    
-    //private NonVisualChildDecorator   _selectionDecoratorNorthWest; // = null;
-    private MouseSelectableChildDecorator   _nonVisualChildDecorator; // = null;
-    
-	private final static Color HOVER_FEEDBACK_COLOR = ColorConstants.blue;
-
-	public void deactivate() 
-    {
-        super.deactivate();
-        if (_nonVisualChildDecorator != null)
-        {
-            _nonVisualChildDecorator.dispose();
-            _nonVisualChildDecorator = null;
-        }
-    }
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) {
-		if (RequestConstants.REQ_SELECTION_HOVER.equals(request.getType())) {
-			if (_hoverFeedbackFigure != null) {
-				for (int i = 0; i < _hoverFeedbackFigure.length; i++) {
-					removeFeedback(_hoverFeedbackFigure[i]);
-				}
-				_hoverFeedbackFigure = null;
-            }
-            
-            // <gripe>this is what I hate about GEF, if it's a location dependent
-            // request why aren't we guaranteed a LocationRequest?!
-            // even GEF interal code protects casts by checking getType()
-            // rather than an instanceof!</gripe>
-            Assert.isTrue(request instanceof LocationRequest);
-            // don't show tooltip if drag is active
-            _showLabelFeedback = !((NodeEditPart)getHost()).isDragActive();
-			_hoverFeedbackFigure = showHoverFeedback((LocationRequest)request);
-		} else {
-			super.showTargetFeedback(request);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void eraseTargetFeedback(Request request) {
-		if (RequestConstants.REQ_SELECTION_HOVER.equals(request.getType())) {
-			if (_hoverFeedbackFigure != null) {
-				for (int i = 0; i < _hoverFeedbackFigure.length; i++) {
-					removeFeedback(_hoverFeedbackFigure[i]);
-				}
-				_hoverFeedbackFigure = null;
-                getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_HOVER_LOST);
-			}
-		} else {
-			super.eraseTargetFeedback(request);
-		}
-	}
-
-	/**
-	 * @param request
-	 */
-	private IFigure[] showHoverFeedback(LocationRequest request) {
-		if (!shouldUseObjectMode(request) && !isStyleTags(getHost())) {
-			return null;
-		}
-
-        final IFigure figure = this.getHostFigure();
-		Rectangle[] rects;
-		if (figure instanceof CSSFigure) {
-			rects = ((CSSFigure) figure).getFragmentsBounds();
-		} else {
-			rects = new Rectangle[] { figure.getBounds() };
-		}
-        int figureSize = rects.length;
-        
-        if (_showLabelFeedback)
-        {
-            figureSize++;
-        }
-        
-		IFigure[] figures = new IFigure[figureSize];
-		for (int i = 0; i < rects.length; i++) {
-			RectangleFigure fig = new RectangleFigure();
-			fig.setFill(false);
-			fig.setOutline(true);
-			fig.setLineWidth(1);
-			fig.setForegroundColor(HOVER_FEEDBACK_COLOR);
-			addFeedback(fig);
-
-			Rectangle r = rects[i].getCopy();
-			figure.translateToAbsolute(r);
-			fig.translateToRelative(r);
-			fig.setBounds(r);
-
-			figures[i] = fig;
-		}
-       
-		if (_showLabelFeedback) 
-        {
-            getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_HOVER_RECEIVED);
-            
-			BasicLabelToolTip label = new BasicLabelToolTip(getTooltipText());
-			addFeedback(label);
-
-            // use mouse cursor plus an offset so the tooltip doesn't
-            // appear z-ordered below the mouse cursor
-            AbsolutePointLocator locator = AbsolutePointLocator.getInstance();
-            locator.setReferencePoint(request.getLocation(), 0, TOOLTIP_VERTICAL_OFFSET);
-            //  to avoid enlargemeent of the feedback layer
-            locator.setIntersectFigure(getFeedbackLayer());
-            locator.relocate(label);
-			figures[rects.length] = label;
-		}
-		return figures;
-	}
-
-	private String getTooltipText() {
-		Element element = (Element) this.getHost().getModel();
-		StringBuffer text = new StringBuffer(element.getTagName());
-		return text.toString();
-	}
-
-	private boolean isStyleTags(EditPart part) {
-		if (part != null && part.getModel() instanceof Node) {
-			return EditModelQuery.HTML_STYLE_NODES.contains(((Node) part
-					.getModel()).getNodeName());
-		}
-        return false;
-	}
-    private MouseSelectableChildDecorator getNonVisualChildDecorator()
-    {
-        if  (_nonVisualChildDecorator == null)
-        {
-            _nonVisualChildDecorator = 
-                new MouseSelectableChildDecorator((GraphicalEditPart)getHost()
-                        , PositionConstants.NORTH_EAST
-                        , getLayer(LayerConstants.FEEDBACK_LAYER)
-                        , getLayer(LayerConstants.HANDLE_LAYER));
-        }
-        return _nonVisualChildDecorator;
-    }
-
-	/**
-	 * @param request
-	 * @return true if we should be using object mode for this request
-	 */
-	public boolean shouldUseObjectMode(Request request) {
-		ElementEditPart part = (ElementEditPart) this.getHost();
-		if (isStyleTags(part)) {
-			return false;
-		}
-		if (part.isWidget()
-				|| (!part.canHaveDirectTextChild() && !part
-						.haveNonWhitespaceTextChild())) {
-			return true;
-		}
-		if (request instanceof SelectionRequest
-				&& ((SelectionRequest) request).isControlKeyPressed()) {
-			return true;
-		}
-		if (request instanceof LocationModifierRequest
-				&& ((LocationModifierRequest) request).isControlKeyPressed()) {
-			return true;
-		}
-
-		// for other elements
-		if (request instanceof LocationRequest) {
-			Point location = ((LocationRequest) request).getLocation()
-					.getCopy();
-			part.getFigure().translateToRelative(location);
-			return shouldUseObjectMode(location);
-		}
-        return false; // should not happen
-	}
-
-	/**
-	 * @param location
-	 * @return
-	 */
-	private boolean shouldUseObjectMode(Point location) {
-		// when the location is close to the border/padding of the element, then
-		// we think it is default to
-		// object mode selection.
-		CSSFigure figure = (CSSFigure) this.getHostFigure();
-		if (figure.getFragmentsBounds().length != 1) {
-			return false;
-		}
-		Rectangle bounds = figure.getBounds().getCopy();
-		Insets insets = figure.getInsets();
-		bounds.crop(insets);
-		if (insets.top > THRESHHOLD && insets.left > THRESHHOLD
-				&& insets.right > THRESHHOLD && insets.bottom > THRESHHOLD) {
-			return !bounds.contains(location);
-		}
-
-		// since the figure insets could be 0, so we expand it a little, thus
-		// even the point is
-		// a little inside the content area, we still think it is selection the
-		// object.
-		if (bounds.height < 3 * THRESHHOLD || bounds.width < 3 * THRESHHOLD) {
-			bounds.crop(INSETS_1);
-		} else {
-			bounds.crop(INSETS_CONST);
-		}
-		return !bounds.contains(location);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
-	 */
-	protected List createSelectionHandles() {
-		// we have three different kinds of handles.
-		// 1. Those element that is resizable.
-		// 2. Those element that is rectangle but not resizable.
-		// 3. Those element that is not rectangle (fragments)
-
-		IFigure figure = this.getHostFigure();
-		if (figure instanceof CSSFigure && getHost() instanceof ElementEditPart) {
-			CSSFigure cssfigure = (CSSFigure) figure;
-			List fragments = cssfigure.getFragmentsForRead();
-
-			// XXX: only one fragment and is blockbox, then we think it is
-			// resizable by figure
-			// should move this test to somewhere else.
-			if (fragments != null && fragments.size() == 1
-					&& fragments.get(0) instanceof BlockBox) {
-				if (((ElementEditPart) getHost()).isResizable()) {
-					// super is Resizable policy, will create a resize handles.
-					return super.createSelectionHandles();
-				}
-                return createNonResizeHandles();
-			}
-            return createFragmentsHandles();
-		}
-        // second case
-        return createNonResizeHandles();
-	}
-
-	/**
-	 * @return
-	 */
-	private List createFragmentsHandles() {
-		List list = new ArrayList();
-		list.add(new FragmentHandle((GraphicalEditPart) getHost()));
-		return list;
-	}
-
-	/**
-	 * @return
-	 */
-	private List createNonResizeHandles() {
-		// following code copied from NonResizableEditPolicy
-		List list = new ArrayList();
-		if (isDragAllowed()) {
-			NonResizableHandleKit.addHandles((GraphicalEditPart) getHost(),
-					list);
-		} else {
-			NonResizableHandleKit.addHandles((GraphicalEditPart) getHost(),
-					list, new SelectEditPartTracker(getHost()),
-					SharedCursors.ARROW);
-		}
-
-		return list;
-	}
-
-
-    protected void hideSelection() {
-        super.hideSelection();
-        // handle removing the menu bar handle separately because it will decide
-        // when to remove itself (not removeSelectionHandles)
-        getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_SELECTION_LOST);
-
-    }
-
-    protected void showSelection() {
-        super.showSelection();
-        // handle adding the menu bar handle separately because it will decide
-        // when to remove itself (not removeSelectionHandles
-        getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_SELECTION_RECEIVED);
-    }
-
-    /**
-	 * child class could override this method.
-	 * 
-     * @param element 
-	 * @param width
-	 * @param height
-	 * @return the resize command or null  if none
-	 */
-	protected Command getResizeCommand(IDOMElement element, int width,
-			int height) {
-		Map map = new HashMap();
-		if (width > 0) {
-			map.put("width", width + "px"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		if (height > 0) {
-			map.put("height", height + "px"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		if (!map.isEmpty()) {
-            return new ChangeStyleCommand(element, map);
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getResizeCommand(org.eclipse.gef.requests.ChangeBoundsRequest)
-	 */
-	protected Command getResizeCommand(ChangeBoundsRequest request) {
-		ElementEditPart part = (ElementEditPart) this.getHost();
-
-		Rectangle rect = part.getFigure().getBounds();
-		rect = request.getTransformedRectangle(rect);
-		int width = rect.width;
-		int height = rect.height;
-
-		// since the user dragged rectangle included border/padding of the
-		// element. And if the element's
-		// width/height style setting don't include border padding, then we need
-		// to set the element's width/height
-		// style property a little smaller.
-		if (part.getFigure() instanceof CSSFigure) {
-			CSSFigure cssfigure = (CSSFigure) part.getFigure();
-			ICSSStyle style = cssfigure.getCSSStyle();
-			if (style != null && !style.isSizeIncludeBorderPadding()) {
-				width -= (style.getBorderInsets().getWidth() + style
-						.getPaddingInsets().getWidth());
-				height -= (style.getBorderInsets().getHeight() + style
-						.getPaddingInsets().getHeight());
-			}
-		}
-
-		//make sure to only change the dimensions for the direction of the resize request.
-		int resizeDirection = request.getResizeDirection();
-		switch (resizeDirection) {
-			case PositionConstants.EAST:
-			case PositionConstants.WEST:
-				//resizing, only the width, so set the height to -1;
-				height = -1;
-				break;
-			case PositionConstants.NORTH:
-			case PositionConstants.SOUTH:
-				//resizing only the height, so set the width to -1
-				width = -1;
-				break;
-			default:
-				//all others are changing both directions...
-		}
-		return getResizeCommand((IDOMElement) part.getIDOMNode(), width, height);
-	}
-
-	/**
-	 * Shows or updates feedback for a change bounds request.
-	 * 
-	 * @param request
-	 *            the request
-	 */
-	protected void showChangeBoundsFeedback(ChangeBoundsRequest request) {
-		IFigure feedback = getDragSourceFeedbackFigure();
-
-		PrecisionRectangle rect = new PrecisionRectangle(
-				getInitialFeedbackBounds().getCopy());
-		getHostFigure().translateToAbsolute(rect);
-		rect.translate(request.getMoveDelta());
-		rect.resize(request.getSizeDelta());
-
-		// to avoid enlarge feedback pane.
-		// when draging a editpart inside designer to move/copy it, we do not
-		// want to
-		// enlarge the canvas, since that may resulting in relayout.
-		rect = (PrecisionRectangle) rect.intersect(getFeedbackLayer()
-				.getBounds());
-
-		feedback.translateToRelative(rect);
-		feedback.setBounds(rect);
-	}
-
-    public Cursor getSelectionToolCursor(Point mouseLocation) {
-        // by default return null to indicate system default.  
-        // sub-classes should override to customize
-        return null;
-    }
-
-    /**
-     * by default, return null
-     * sub-classes should override to customize
-     * @param request
-     * @return the selectin tracker
-     */
-    protected DragTracker getSelectionTracker(LocationRequest request)
-    {
-        return null;
-    }
-    
-    public DragTracker getSelectionDragTracker(LocationRequest request) 
-    {
-        if (org.eclipse.jst.pagedesigner.requests.PageDesignerRequestConstants.REQ_SELECTION_TRACKER.equals(request.getType())){
-            return getSelectionTracker(request);
-        }
-        
-        // be default don't specify a selection drag tracker
-        // sub-classes should override to customize
-        if (shouldUseObjectMode(request)) {
-            return new ObjectModeDragTracker(getHost());
-        }
-        return new RangeDragTracker(getHost());
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentCornerHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentCornerHandle.java
deleted file mode 100644
index ad3bd87..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentCornerHandle.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.SquareHandle;
-import org.eclipse.jst.pagedesigner.tableedit.EmptyLocator;
-
-/**
- * A Handle used to mark the fragment.
- */
-public class FragmentCornerHandle extends SquareHandle {
-	FragmentCornerHandle(GraphicalEditPart owner) {
-		super(owner, new EmptyLocator());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentHandle.java
deleted file mode 100644
index 5efd984..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentHandle.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Handle;
-import org.eclipse.gef.handles.AbstractHandle;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class FragmentHandle extends AbstractHandle implements Handle {
-	/**
-	 * @param owner
-	 */
-	public FragmentHandle(GraphicalEditPart owner) {
-		super(owner, new FragmentLocator());
-		this.setOpaque(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#paint(org.eclipse.draw2d.Graphics)
-	 */
-	public void paint(Graphics graphics) {
-		graphics.setClip(this.getBounds().getCopy().expand(7, 7));
-		super.paint(graphics);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		DragEditPartsTracker tracker = new DragEditPartsTracker(getOwner());
-		tracker.setDefaultCursor(getCursor());
-		return tracker;
-	}
-
-	private void refresh() {
-
-		// set the bounds of this figure, so it could cover all children.
-		bounds = getOwnerFigure().getBounds();
-		bounds = new PrecisionRectangle(bounds.getResized(-1, -1));
-		getOwnerFigure().translateToAbsolute(bounds);
-		this.translateToRelative(bounds);
-		this.setBounds(bounds);
-
-		this.removeAll();
-		// ok, recreate all children.
-		CSSFigure cssfigure = (CSSFigure) getOwner().getFigure();
-		List fragments = cssfigure.getFragmentsForRead();
-		for (int i = 0, size = fragments.size(); i < size; i++) {
-			// the rectangle.
-			Figure childFigure = new BorderFigure();
-			childFigure.setBorder(new LineBorder(1));
-			this.add(childFigure);
-
-			FlowBox box = (FlowBox) fragments.get(i);
-			Rectangle rect = new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-					.getHeight());
-			cssfigure.translateToAbsolute(rect);
-
-			childFigure.translateToRelative(rect);
-			childFigure.setBounds(rect);
-
-			createCornerHandles(cssfigure, box);
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void createCornerHandles(CSSFigure reference, FlowBox referencebox) {
-		createHandle(reference, referencebox, PositionConstants.SOUTH_EAST);
-		createHandle(reference, referencebox, PositionConstants.SOUTH_WEST);
-		createHandle(reference, referencebox, PositionConstants.NORTH_WEST);
-		createHandle(reference, referencebox, PositionConstants.NORTH_EAST);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
-	 */
-	public boolean containsPoint(int x, int y) {
-		List children = this.getChildren();
-		for (int i = 0, n = children.size(); i < n; i++) {
-			if (((IFigure) children.get(i)).containsPoint(x, y)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param north_east
-	 */
-	private void createHandle(CSSFigure reference, FlowBox referencebox,
-			int location) {
-		double relativeX, relativeY;
-		switch (location & PositionConstants.NORTH_SOUTH) {
-		case PositionConstants.NORTH:
-			relativeY = 0;
-			break;
-		case PositionConstants.SOUTH:
-			relativeY = 1.0;
-			break;
-		default:
-			relativeY = 0.5;
-		}
-
-		switch (location & PositionConstants.EAST_WEST) {
-		case PositionConstants.WEST:
-			relativeX = 0;
-			break;
-		case PositionConstants.EAST:
-			relativeX = 1.0;
-			break;
-		default:
-			relativeX = 0.5;
-		}
-
-		FragmentCornerHandle target = new FragmentCornerHandle(getOwner());
-		this.add(target);
-
-		// for corner small box.
-		Rectangle targetBounds = new Rectangle(referencebox.getX(),
-				referencebox.getY(), referencebox.getWidth(), referencebox
-						.getHeight());
-		targetBounds = new PrecisionRectangle(targetBounds);
-		reference.translateToAbsolute(targetBounds);
-		target.translateToRelative(targetBounds);
-		// targetBounds.resize(1, 1);
-
-		Dimension targetSize = target.getPreferredSize();
-
-		targetBounds.x += (int) (targetBounds.width * relativeX - ((targetSize.width + 1) / 2));
-		targetBounds.y += (int) (targetBounds.height * relativeY - ((targetSize.height + 1) / 2));
-		targetBounds.setSize(targetSize);
-		target.setBounds(targetBounds);
-	}
-
-	static class FragmentLocator implements Locator {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.draw2d.Locator#relocate(org.eclipse.draw2d.IFigure)
-		 */
-		public void relocate(IFigure target) {
-			((FragmentHandle) target).refresh();
-		}
-	}
-
-	static class BorderFigure extends Figure {
-		/**
-		 * the bounds padding
-		 */
-		public static final int INNER_PAD = 2;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
-		 */
-		public boolean containsPoint(int x, int y) {
-			if (!super.containsPoint(x, y))
-				return false;
-			return !Rectangle.SINGLETON.setBounds(getBounds()).shrink(
-					INNER_PAD, INNER_PAD).contains(x, y);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/HeadItemCreationEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/HeadItemCreationEditPolicy.java
deleted file mode 100644
index a7de205..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/HeadItemCreationEditPolicy.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation and/or initial documentation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.w3c.dom.Node;
-
-/**
- *
- */
-public class HeadItemCreationEditPolicy extends ItemCreationEditPolicy {
-
-	/**
-	 * @param host
-	 */
-	public HeadItemCreationEditPolicy(ElementEditPart host) {
-		super();
-		setHost(host);
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	@Override
-	public Command getCommand(Request request) {
-		if (request instanceof ItemCreationRequest) {
-			ItemCreationRequest r = (ItemCreationRequest) request;
-			DesignPosition position = findPosition((ItemCreationRequest)request);
-			
-			if (position == null) {
-				return null;
-			}
-
-			IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position);
-			if (domposition == null) {
-				return null;
-			}
-
-			// since the head tag is a widget, the offset will need 
-			// to be updated in the position so that new node is
-			// appended to the list of children.
-			Node node = domposition.getContainerNode();
-			domposition = new DOMPosition(node, node.getChildNodes().getLength());
-
-			return new CreateItemCommand(
-					PDPlugin
-							.getResourceString("ItemCreationEditPolicy.CommandLabel.CreateItem"),//$NON-NLS-1$
-					getViewer(getHost()).getModel(), domposition, r.getTagCreationProvider());
-		}
-		return null;
-	}
-
-	@Override
-	protected IPositionMediator createDropChildValidator(DropRequest r) {
-		DropData dropData = createDropData(r);
-
-		if (dropData != null) {
-			MyDnDPositionValidator validator = new MyDnDPositionValidator(
-					new DropActionData(ActionData.PALETTE_DND, dropData));
-			return validator;
-		}
-		return null;
-	}
-
-	private static class MyDnDPositionValidator extends DnDPositionValidator {
-
-		public MyDnDPositionValidator(DropActionData dropActionData) {
-			super(dropActionData);
-		}
-
-		@Override
-		public boolean isValidPosition(IDOMPosition position) {
-			// if position is really a IDOMRefPosition, convert it to DOMPosition
-			Node node = null;
-			if (position instanceof DOMRefPosition) {
-				node = ((DOMRefPosition) position).getReferenceNode();
-				if (IHTMLConstants.TAG_HEAD.equalsIgnoreCase(node.getLocalName())) {
-					return true;
-				}
-			} else {
-				node = position.getContainerNode();
-				if (IHTMLConstants.TAG_HEAD.equalsIgnoreCase(node.getLocalName())) {
-					return true;
-				}
-			}
-
-			return super.isValidPosition(position);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java
deleted file mode 100644
index 779762b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * Allows a selection edit policy to specify extra capabilities
- * 
- * @author cbateman
- */
-public interface IEnhancedSelectionEditPolicy 
-{
-    /**
-     * @param mouseLocation 
-     * @return the cursor that should be displayed when a selection tool
-     * enters the hit box (mouses over) of an edit part but no selection
-     * or drag operations have occurred yet.  Null indicates the caller should
-     * use whatever default it deems appropriate.
-     */
-    Cursor getSelectionToolCursor(Point mouseLocation);
-    
-    /**
-     * @param request 
-     * @param mouseLocator
-     * @return a drag tracker to be used when the mouse moves over a certain
-     * location and mouse state is in initial state or null if the policy
-     * doesn't wish to customize this. This allows an edit part
-     * to customize what drag tracker is used depending on where the mouse is positioned
-     * on its figure.
-     */
-    DragTracker getSelectionDragTracker(LocationRequest request);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ITableEditAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ITableEditAdapter.java
deleted file mode 100644
index 0795c8a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ITableEditAdapter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ITableEditAdapter {
-	/**
-	 * @return the column count
-	 */
-	public int getColumnCount();
-
-	/**
-	 * @return the row count
-	 */
-	public int getRowCount();
-
-	/**
-	 * @param atPosition
-	 */
-	public void insertColumn(int atPosition);
-
-	/**
-	 * @param rowPosition
-	 */
-	public void insertRow(int rowPosition);
-
-	/**
-	 * @param columnIndex
-	 * @return the starting point for resize
-	 */
-	public int getColumnResizeStart(int columnIndex);
-
-	/**
-	 * @return the resize width
-	 */
-	public int getColumnResizeWidth();
-
-	/**
-	 * @param columnIndex
-	 * @return column start
-	 */
-	public int getColumnStart(int columnIndex);
-
-	/**
-	 * @param columnIndex
-	 * @return the column width
-	 */
-	public int getColumnWidth(int columnIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return the row start
-	 */
-	public int getRowStart(int rowIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return the row height
-	 */
-	public int getRowHeight(int rowIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return starting point of the row resize
-	 */
-	public int getRowResizeStart(int rowIndex);
-
-	/**
-	 * @return the row resize width
-	 */
-	public int getRowResizeWidth();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/JSFDropEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/JSFDropEditPolicy.java
deleted file mode 100644
index 0b36919..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/JSFDropEditPolicy.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.jst.pagedesigner.commands.PDDropRequest;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class JSFDropEditPolicy extends GraphicalEditPolicy {
-	String _attrName;
-
-	/**
-	 * @param attrname
-	 */
-	public JSFDropEditPolicy(String attrname) {
-		_attrName = attrname;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof PDDropRequest) {
-			return getHost();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof PDDropRequest) {
-			PDDropRequest r = (PDDropRequest) request;
-			final String s = (String) r.getCurrentEvent().data;
-			return new Command() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.gef.commands.Command#execute()
-				 */
-				public void execute() {
-					// XXX: should check whether alreayd set the attribute,
-					// maybe
-					// should also popup dialog etc.
-					((Element) getHost().getModel()).setAttribute(_attrName, s);
-				}
-			};
-		}
-
-		return super.getCommand(request);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void eraseTargetFeedback(Request request) {
-		// 
-		super.eraseTargetFeedback(request);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) {
-		super.showTargetFeedback(request);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LinkEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LinkEditPolicy.java
deleted file mode 100644
index ad222be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LinkEditPolicy.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.jst.pagedesigner.actions.link.LinkRequest;
-import org.eclipse.jst.pagedesigner.actions.link.MakeLinkCommand;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LinkEditPolicy extends GraphicalEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		EditPart part = this.getHost();
-		IHTMLGraphicalViewer viewer = null;
-		if (part instanceof TextEditPart) {
-			//TODO: ?? part = (TextEditPart) part;
-			viewer = (IHTMLGraphicalViewer) part.getViewer();
-		}
-		if (request instanceof LinkRequest) {
-			LinkRequest req = (LinkRequest) request;
-			String identifier = req.getIdentifier();
-			DesignRange range = req.getDesignRange();
-            // TODO: when part !instancof TextEditPart, viewer == null
-			Command command = new MakeLinkCommand(identifier, viewer, part,
-					range);
-			return command;
-		}
-		return super.getCommand(request);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LocationHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LocationHelper.java
deleted file mode 100644
index b6e09fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LocationHelper.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final class LocationHelper {
-	/**
-	 * @param host 
-	 * @param p
-	 * @param result
-	 * @param tagName
-	 * @param skip
-	 * @return  true if insertion point is found
-	 */
-	public static boolean findInsertLocation(GraphicalEditPart host, Point p,
-			GraphicalEditPart[] result, String tagName, Node skip) {
-		if (isHostInsideSkip(host, skip))
-			return false;
-
-		while (isValidHost(host) && !canHostContainTag(host, tagName)) {
-			if (host.getParent() instanceof GraphicalEditPart)
-				host = (GraphicalEditPart) host.getParent();
-			else
-				host = null;
-		}
-		if (!isValidHost(host))
-			return false;
-
-		// ok, next we try to find a insertion point inside host
-		result[0] = host;
-		List children = host.getChildren();
-		if (children.isEmpty()) {
-			result[1] = null;
-			return true;
-		}
-		// TODO: never read GraphicalEditPart ref = null;
-		for (int i = 0, size = children.size(); i < size; i++) {
-			GraphicalEditPart child = (GraphicalEditPart) children.get(i);
-			Rectangle rect = getAbsoluteBounds(child);
-
-			if (rect.contains(p)) {
-				IFigure figure = child.getFigure();
-				if (figure instanceof ICSSFigure) {
-					List frags = ((ICSSFigure) figure).getFragmentsForRead();
-					if (frags.size() > 1) // more than one frags, so is a zig
-					// zag.
-					{
-						// check whether is before the first box.
-						FlowBox box = (FlowBox) frags.get(0);
-						Rectangle rect1 = getAbsoluteBounds(figure, box);
-						if (rect1.x > p.x && rect1.y + rect1.height > p.y) {
-							// p is at left/above the first box. so we think p
-							// is before this child
-							result[1] = child;
-							return true;
-						}
-						// check whether is after the last box
-						box = (FlowBox) frags.get(frags.size() - 1);
-						rect1 = getAbsoluteBounds(figure, box);
-						if (rect1.x < p.x && rect1.y < p.y) {
-							continue;
-						}
-					}
-				}
-				// ok, treat as the point in a rect figure, see which side is
-				// closer.
-				if (p.x > rect.x + rect.width / 2) {
-					continue;
-				}
-                result[1] = child;
-                return true;
-			} else if (rect.x + rect.width < p.x || rect.y + rect.height < p.y) {
-				// p is at right or below rect. so the point is "after" the
-				// rect.
-				continue;
-			} else {
-				// ok, p is "before" rect.
-				result[1] = child;
-				return true;
-			}
-		}
-		// we search through all.
-		result[1] = null;
-		return true;
-	}
-
-	/**
-	 * @param figure
-	 * @param box
-	 * @return the bounding rectangle
-	 */
-	public static Rectangle getAbsoluteBounds(IFigure figure, FlowBox box) {
-		Rectangle r = new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-				.getHeight());
-		figure.translateToAbsolute(r);
-		return r;
-	}
-
-	/**
-	 * @param child
-	 * @return the bounding rectangle
-	 */
-	public static Rectangle getAbsoluteBounds(GraphicalEditPart child) {
-		Rectangle bounds = child.getFigure().getBounds().getCopy();
-		child.getFigure().translateToAbsolute(bounds);
-		return bounds;
-	}
-
-	/**
-	 * @param host
-	 * @param tagName
-	 * @return
-	 */
-	private static boolean canHostContainTag(GraphicalEditPart host,
-			String tagName) {
-		if (host == null)
-			return false;
-		Node node = (Node) host.getModel();
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			ModelQuery modelQuery = getModelQuery(node);
-			if (modelQuery != null) {
-				CMElementDeclaration elementDecl = modelQuery
-						.getCMElementDeclaration((Element) node);
-				if (elementDecl == null) {
-					return true;
-				}
-				if (elementDecl.getContentType() == CMElementDeclaration.EMPTY)
-					return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @param host
-	 * @return
-	 */
-	private static boolean isValidHost(GraphicalEditPart host) {
-		return host != null
-				&& (host instanceof ElementEditPart || host instanceof DocumentEditPart);
-	}
-
-	/**
-	 * @param host
-	 * @param skip
-	 * @return
-	 */
-	private static boolean isHostInsideSkip(GraphicalEditPart host, Node skip) {
-		if (skip == null)
-			return false;
-
-		// XXX: not done.
-		return false;
-	}
-
-	private static ModelQuery getModelQuery(Node node) {
-        Document doc = node.getOwnerDocument();
-        
-		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-            doc = (Document) node;
-		}
-        return ModelQueryUtil.getModelQuery(doc);
-	}
-
-	private LocationHelper()
-	{
-	    // util class, no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MouseSelectableChildDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MouseSelectableChildDecorator.java
deleted file mode 100644
index 11957af..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MouseSelectableChildDecorator.java
+++ /dev/null
@@ -1,631 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.MouseEvent;
-import org.eclipse.draw2d.MouseListener;
-import org.eclipse.draw2d.MouseMotionListener;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * A child decorator that supports mouse selection
- * 
- * @author cbateman
- *
- */
-class MouseSelectableChildDecorator extends NonVisualChildDecorator
-{
-    private static final String PIN_UP_IMAGE_FILE = "pin_up.gif"; //$NON-NLS-1$
-    
-	private static final String PIN_DOWN_IMAGE_FILE = "pin_down.gif"; //$NON-NLS-1$
-
-	// no visual or affordance showing
-    private static final int           STATE_START = 0;
-    
-    // the host is showing hover feedback, but is not selected
-    private static final int           STATE_HOST_HOVER = 1;
-    
-    // the host has primary selection
-    private static final int           STATE_HOST_SELECTED = 2;
-    
-    // the selection handle for the decorator has mouse hover
-    private static final int           STATE_HANDLE_HOVER = 3;
-    
-    // the selection handle has been selected (is showing)
-    private static final int           STATE_HANDLE_MENU_BAR_SHOWING = 4;
-    
-    // the menu bar has hover
-    private static final int           STATE_HANDLE_MENU_BAR_HOVER = 5;
-    
-    // the menu bar has primary selection
-    private static final int           STATE_HANDLE_MENU_BAR_SELECTED = 6;
-    
-    /**
-     * An event indicating the host received hover
-     */
-    public static final int           EVENT_HOST_HOVER_RECEIVED = 31;
-    /**
-     * An event indicating the host lost hover
-     */
-    public static final int           EVENT_HOST_HOVER_LOST = 32;
-    /**
-     * An event indicating the host received selection
-     */
-    public static final int           EVENT_HOST_SELECTION_RECEIVED = 33;
-    /**
-     * An event indicating the host lost selection
-     */
-    public static final int           EVENT_HOST_SELECTION_LOST = 34;
-    private static final int          EVENT_HANDLE_HOVER_RECEIVED = 35;
-    private static final int          EVENT_HANDLE_HOVER_LOST = 36;
-    private static final int          EVENT_HANDLE_SELECTED = 37;
-    private static final int          EVENT_ALL_SELECTION_LOST = 38;
-    private static final int          EVENT_MENU_BAR_SELECTION_RECEIVED = 39;
-    
-    private MouseMotionListener      _motionListener;
-    private MouseListener            _mouseListener;
-    private boolean                  _isMouseOver = false;
-    private ElementMenuBar           _elementMenuBar;
-
-    private DisplayStateMachine      _stateMachine;
-    private VerticalMenuLocator      _menuLocator;
-    private AnimatedHideLocator      _hideLocator;
-    private IFigure                  _hoverParent;
-    private IFigure                  _selectionParent;
-
-    private ISelectionChangedListener _menuSelectionListener;
-    
-    MouseSelectableChildDecorator(final GraphicalEditPart hostPart, int location, 
-            IFigure hoverParent, IFigure selectionParent) {
-        super(hostPart, location);
-        _menuLocator = new VerticalMenuLocator(hostPart, this);
-        _hideLocator = new AnimatedHideLocator();
-        _elementMenuBar = ((ElementEditPart)hostPart).getElementMenuBar();
-        _stateMachine = new DisplayStateMachine();
-        _hoverParent = hoverParent;
-        _selectionParent = selectionParent;
-        
-        _motionListener = new MouseMotionListener.Stub()
-        {
-            public void mouseEntered(MouseEvent me) {
-                _isMouseOver = true;
-                updateState(EVENT_HANDLE_HOVER_RECEIVED);
-            }
-    
-            public void mouseExited(MouseEvent me) {
-                _isMouseOver = false;
-                updateState(EVENT_HANDLE_HOVER_LOST);
-            }
-        };
-        addMouseMotionListener(_motionListener);
-            
-        _mouseListener = new MouseListener.Stub()
-        {
-            public void mousePressed(MouseEvent me) {
-                updateState(EVENT_HANDLE_SELECTED);
-            }
-        };
-        addMouseListener(_mouseListener);
-        
-        _menuSelectionListener = new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event) {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection.size() == 0)
-                {
-                    // if the host part has been given back selection, then
-                    // we have a host selection event
-                    if (getOwner().getSelected() == EditPart.SELECTED_PRIMARY)
-                    {
-                        updateState(EVENT_HOST_SELECTION_RECEIVED);
-                    }
-                    // otherwise, both the host and the non-visual children are lost,
-                    // so fire all selection lost
-                    else
-                    {
-                        updateState(EVENT_ALL_SELECTION_LOST);
-                    }
-                }
-                // otherwise, one or more non-visual children have selection
-                else
-                {
-                    updateState(EVENT_MENU_BAR_SELECTION_RECEIVED);
-                }
-            }
-        };
-        _elementMenuBar.addSelectionChangedListener(_menuSelectionListener);
-    }
-    
-    public void paintFigure(Graphics g) {
-        // TODO: could we use an image label toggle button here instead?    
-        Image  arrowImage = null;
-        
-        if (_stateMachine.isMenuShowing())
-        {
-            arrowImage = PDPlugin.getDefault().getImage(PIN_DOWN_IMAGE_FILE);
-        }
-        else
-        {
-            arrowImage = PDPlugin.getDefault().getImage(PIN_UP_IMAGE_FILE);
-        }
-        
-        Rectangle r = getBounds();
-        g.setAlpha(75);
-        g.setBackgroundColor(getFillColor());
-        g.fillRectangle(r.x, r.y, r.width, r.height);
-        g.setAlpha(getAlpha());
-        g.drawImage(arrowImage, r.x+1, r.y+1);
-        g.setForegroundColor(getBorderColor()); 
-        g.drawRectangle(r.x, r.y, r.width-1, r.height-1);
-    }
-
-    /**
-     * @param event
-     */
-    public void updateState(int event)
-    {
-        int oldState = _stateMachine.doTransition(event);
-        updateVisual(oldState);
-    }
-    
-    /**
-     * @param oldState
-     */
-    protected void updateVisual(int oldState)
-    {
-        // overriding all other considerations is whether the menu bar even has
-        // any items to show.  If not don't show anything
-        if (!_elementMenuBar.hasChildParts())
-        {
-            if (getParent() != null)
-            {
-                getParent().remove(this);
-            }
-            
-            return;
-        }
-        
-        switch (_stateMachine._curState)
-        {
-            case STATE_START:
-                hide(_elementMenuBar, false);
-                IFigure parent = getParent();
-                if (parent != null)
-                {
-                    parent.remove(this);
-                }
-            break;
-            
-            case STATE_HOST_HOVER:
-                if (_hoverParent != null)
-                {
-                    _hoverParent.add(this);
-                    validate();
-                }
-                show(_elementMenuBar, false);
-                setVisible(false);
-            break;
-            
-            case STATE_HOST_SELECTED:
-                if (_selectionParent != null)
-                {
-                    _selectionParent.add(this);
-                    validate();
-                }
-
-                setVisible(true);
-
-                if (oldState != STATE_HOST_SELECTED
-                        && oldState != STATE_HANDLE_HOVER)
-                {
-                    show(_elementMenuBar, true);
-                    hide(_elementMenuBar, true);
-                }
-                else
-                {
-                    if (!_hideLocator._isAnimating)
-                    {
-                        hide(_elementMenuBar, false);
-                    }
-                }
-                repaint();
-            break;
-            
-            case STATE_HANDLE_HOVER:
-                if (_stateMachine.isMenuShowing(oldState))
-                {
-                    hide(_elementMenuBar, false);
-                }
-                else
-                {
-                    show(_elementMenuBar, false);
-                }
-                repaint();
-            break;
-            
-            case STATE_HANDLE_MENU_BAR_SHOWING:
-                show(_elementMenuBar, true);
-                repaint();
-            break;
-            
-            case STATE_HANDLE_MENU_BAR_HOVER:
-            case STATE_HANDLE_MENU_BAR_SELECTED:
-                //revalidate();
-            break;
-            
-            
-            default:
-                
-        }
-    }
-
-    protected void init() {
-        setPreferredSize(new Dimension(12, 12));
-    }
-    
-    /**
-     * 
-     */
-    public void dispose()
-    {
-        hide(_elementMenuBar, false);
-        
-        if (_motionListener != null)
-        {
-            removeMouseMotionListener(_motionListener);
-            _motionListener = null;
-        }
-        
-        if (_mouseListener != null)
-        {
-            removeMouseListener(_mouseListener);
-            _mouseListener = null;
-        }
-        
-        if (_menuSelectionListener != null)
-        {
-            _elementMenuBar.removeSelectionChangedListener(_menuSelectionListener);
-            _menuSelectionListener = null;
-        }
-    }
-    
-    private void hide(ElementMenuBar menuBar, boolean animate)
-    {
-        if (animate)
-        {
-            final Point endPoint = this.getLocation().getCopy();
-            //TODO: don't understand when translation is necessary...
-            //this.translateToAbsolute(endPoint);
-            
-            endPoint.x += this.getBounds().width / 2;
-            endPoint.y += this.getBounds().height / 2;
-            _hideLocator.setHideEndPoint(endPoint);
-            _hideLocator.relocate(menuBar);
-        }
-        else 
-        {
-            if (menuBar.getParent() != null)
-            {
-                getParent().remove(menuBar);
-            }
-        }
-    }
-    
-    private void show(ElementMenuBar menuBar, boolean enabled)
-    {
-        menuBar.setEnabled(enabled);
-        getParent().add(menuBar);
-        _menuLocator.relocate(menuBar);
-    }
-    
-    protected int getAlpha() 
-    {
-        return (_isMouseOver || _stateMachine.isMenuShowing()) ? 255 : 75;
-    }
-    
-    private class DisplayStateMachine
-    {
-        private int _curState = STATE_START;
-        
-        /**
-         * @param event
-         * @return execute a state machine transition on event
-         */
-        public int doTransition(int event)
-        {
-            final int     oldState = _curState;
-            
-            switch(_curState)
-            {
-                case STATE_START:
-                    // can only transition from start state
-                    // on a host event
-                    if (event == EVENT_HOST_HOVER_RECEIVED)
-                    {
-                        _curState = STATE_HOST_HOVER;
-                    }
-                    else if (event == EVENT_HOST_SELECTION_RECEIVED)
-                    {
-                        _curState = STATE_HOST_SELECTED;
-                    }
-                break;
-                
-                case STATE_HOST_HOVER:
-                    if (event == EVENT_HOST_SELECTION_RECEIVED)
-                    {
-                        _curState = STATE_HOST_SELECTED;
-                    }
-                    else if (event == EVENT_HOST_SELECTION_LOST
-                            || event == EVENT_HOST_HOVER_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                    else if (event == EVENT_HOST_HOVER_RECEIVED)
-                    {
-                        // preserve state in this case
-                    }
-                break;
-
-                case STATE_HOST_SELECTED:
-                    // once the host is selected,the only host event that
-                    // that can change state is selection lost
-                    if (event == EVENT_HOST_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                    else if (event == EVENT_HANDLE_HOVER_RECEIVED)
-                    {
-                        _curState = STATE_HANDLE_HOVER;
-                    }
-                    else if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_MENU_BAR_SHOWING;
-                    }
-                    else if (event == EVENT_ALL_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                break;
-                    
-                case STATE_HANDLE_HOVER:
-                    if (event == EVENT_HANDLE_HOVER_LOST)
-                    {
-                        _curState = STATE_HOST_SELECTED;
-                    }
-                    else if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_MENU_BAR_SHOWING;
-                    }
-                    else if (event == EVENT_HOST_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                break;
-                case STATE_HANDLE_MENU_BAR_SHOWING:
-                    if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_HOVER;
-                    }
-                    else if (event == EVENT_MENU_BAR_SELECTION_RECEIVED)
-                    {
-                        _curState = STATE_HANDLE_MENU_BAR_SELECTED;
-                    }
-                    else if (event == EVENT_ALL_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                break;
-
-                case STATE_HANDLE_MENU_BAR_HOVER:
-                break;                    
-
-                case STATE_HANDLE_MENU_BAR_SELECTED:
-                    if (event == EVENT_ALL_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                    else if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_HOVER;
-                    }
-                break;
-                
-            }
-            
-            
-            return oldState;
-        }
-
-        /**
-         * @return true if the  menu should be showing in the  current state
-         */
-        public boolean isMenuShowing()
-        {
-            return isMenuShowing(_curState);
-        }
-
-        /**
-         * @param state
-         * @return true if state is one in which the menu should be showing
-         */ 
-        public boolean isMenuShowing(int state)
-        {
-            return _curState == STATE_HANDLE_MENU_BAR_SHOWING 
-                    || _curState == STATE_HANDLE_MENU_BAR_HOVER
-                    || _curState == STATE_HANDLE_MENU_BAR_SELECTED;
-        }
-    }
-    
-    private static class VerticalMenuLocator implements Locator
-    {
-        private IFigure  _referenceFigure;
-        
-        VerticalMenuLocator(GraphicalEditPart owner, IFigure reference)
-        {
-            _referenceFigure = reference;
-        }
-        
-        public void relocate(IFigure target) 
-        {
-            final Rectangle finalBounds = getFinalMenuBounds(target);
-            target.setBounds(finalBounds);
-        }
-        
-        
-        private Rectangle getInitialMenuBounds(final IFigure target)
-        {
-            Rectangle targetBounds = 
-                new PrecisionRectangle(_referenceFigure.getBounds().getResized(-1, -1));
-            _referenceFigure.translateToAbsolute(targetBounds);
-            target.translateToRelative(targetBounds);
-            return targetBounds;
-        }
-
-        private Rectangle getFinalMenuBounds(final IFigure target)
-        {
-            final IFigure referenceFigure =  _referenceFigure;
-            
-            Rectangle targetBounds = getInitialMenuBounds(target);
-            Dimension targetSize = target.getPreferredSize();
-
-            // copied from super.relocate because relativeX/Y are private in super
-            // changed from super to remove div by 2 that centers target; we want
-            // it to be corner-to-corner
-            targetBounds.x
-                += targetBounds.width+4;
-            targetBounds.y
-                  -= (targetSize.height / 2) - referenceFigure.getBounds().height/2;
-            targetBounds.setSize(targetSize);
-            //target.setBounds(targetBounds);
-
-//            final Rectangle viewPortRect = 
-//                ((IHTMLGraphicalViewer)_owner.getViewer()).getViewport().getBounds();
-//            final Rectangle targetRect = targetBounds.getCopy();
-//            
-//            targetRect.intersect(viewPortRect);
-
-//            int width = targetBounds.width - targetRect.width;
-//            int height = targetBounds.height - targetRect.height;
-            
-//            if (width != 0)
-//            {
-//                targetBounds.x -= width;
-//            }
-//            
-//            if (height != 0)
-//            {
-//                targetBounds.y += height;
-//            }
-            
-            return targetBounds;
-        }
-    }
-    
-    private static class AnimatedHideLocator implements Locator
-    {
-        private Point _endPoint;
-        private boolean _isAnimating;
-        
-        /**
-         * @param endPoint -- must be absolute coordinate
-         */
-        public void setHideEndPoint(Point endPoint)
-        {
-            _endPoint = endPoint;
-        }
-        
-        public void relocate(IFigure target) 
-        {
-            final Point newEndPoint = _endPoint.getCopy();
-            target.translateToRelative(_endPoint);
-            Rectangle startBounds = target.getBounds().getCopy();
-            animateBoundsChange(target, startBounds, newEndPoint);
-        }
-
-        private void animateBoundsChange(final IFigure target, 
-                final Rectangle startBounds, 
-                final Point endPoint)
-        {
-            final int numSteps = 5;
-            final int numMs = 500;
-            final int timeSteps = numMs/numSteps;
-            
-            int xDelta = endPoint.x - startBounds.x;
-            int yDelta = endPoint.y - startBounds.y;
-            
-            final int widthIncrement = -1 * startBounds.width / numSteps;
-            final int heightIncrement = -1 * startBounds.height / numSteps;
-            int xIncrement = xDelta / numSteps;
-            int yIncrement = yDelta  / numSteps;
-            
-            target.setBounds(startBounds);
-            if (widthIncrement != 0 || heightIncrement != 0)
-            {
-                _isAnimating = true;
-                doAnimation(numMs, timeSteps, widthIncrement, heightIncrement, xIncrement, yIncrement, endPoint, target);
-            }
-        }
-        
-        private void doAnimation(final int remainingTime, 
-                final int timeIncrement, 
-                final int widthIncrement, final int heightIncrement
-                , final int xIncrement, final int yIncrement
-                , final Point endPoint
-                , final IFigure target)
-        {
-            Display.getCurrent().timerExec(timeIncrement, 
-            new Runnable()
-            {
-            public void run() 
-            {
-               if (remainingTime <= 0)
-               {
-                   if (target.getParent() != null)
-                   {
-                       target.getParent().remove(target);
-                   }
-                   _isAnimating = false;
-               }
-               else
-               {
-                   final Rectangle curBounds = target.getBounds().getCopy();
-                   curBounds.width += widthIncrement;
-                   curBounds.height += heightIncrement;
-                   curBounds.x += xIncrement;
-                   curBounds.y += yIncrement;
-                   target.setBounds(curBounds);
-                   target.revalidate();
-                   doAnimation(remainingTime-timeIncrement, timeIncrement, widthIncrement, heightIncrement, xIncrement, yIncrement, endPoint, target);
-               }
-            }
-            });
-         }
-    }
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MoveSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MoveSupport.java
deleted file mode 100644
index dc420cf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MoveSupport.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.List;
-
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MoveSupport {
-	/**
-	 * Check whether the move operation only drags a single node.
-	 * 
-	 * @param request
-	 * @return true if the request affects a single node
-	 */
-	public static boolean isSingleNode(ChangeBoundsRequest request) {
-		List parts = request.getEditParts();
-		if (parts == null || parts.size() != 1
-				|| !(parts.get(0) instanceof NodeEditPart)) {
-			return false;
-		}
-        return true;
-	}
-
-	/**
-	 * this method must be called after isSingleNode
-	 * 
-	 * @param request
-	 * @return the dragged part
-	 */
-	public static NodeEditPart getDraggedPart(ChangeBoundsRequest request) {
-		List parts = request.getEditParts();
-		NodeEditPart part = (NodeEditPart) parts.get(0);
-		return part;
-	}
-
-	/**
-	 * this method must be called after isSingleNode
-	 * 
-	 * @param request
-	 * @return the dragged node
-	 */
-	public static Node getDraggedNode(ChangeBoundsRequest request) {
-		return getDraggedPart(request).getIDOMNode();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildDecorator.java
deleted file mode 100644
index 2f9c1e6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildDecorator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-
-class NonVisualChildDecorator extends ElementDecoratorSquareHandle
-{
-   
-    NonVisualChildDecorator(final GraphicalEditPart hostPart, int location)
-    {
-        super(hostPart, new CornerRelativeHandleLocator(hostPart.getFigure(), location));
-    }
-
-    protected void init() {
-        setPreferredSize(new Dimension(8, 8));
-    }
-    
-    public void ancestorMoved(IFigure ancestor) {
-        // TODO: for some reason this causes an infinite loop
-        // when in the feedback layer...
-        //super.ancestorMoved(ancestor);
-    }
-
-    protected DragTracker createDragTracker() {
-        return null;
-    }
-    
-    protected int getAlpha()
-    {
-        return 255;
-    }
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildGraphicalEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildGraphicalEditPolicy.java
deleted file mode 100644
index 59678d2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildGraphicalEditPolicy.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.NonVisualComponentEditPart;
-import org.eclipse.swt.graphics.Color;
-import org.w3c.dom.Element;
-
-/**
- * An edit policy for non visual child edit parts
- * @author cbateman
- *
- */
-public class NonVisualChildGraphicalEditPolicy extends NonResizableEditPolicy 
-{
-    // the number of pixels to offset the top left of tooltop feedback
-    // below the current mouse cursor location
-    private static final int TOOLTIP_VERTICAL_OFFSET = 25;
-    private final static Color HOVER_FEEDBACK_COLOR = ColorConstants.blue;
-    
-    
-    private BasicLabelToolTip   _toolTip;
-    private boolean             _showLabelFeedback;
-    private RectangleFigure _mouseOverBorder;
-
-    public void showTargetFeedback(Request request) {
-        if (RequestConstants.REQ_SELECTION_HOVER.equals(request.getType())) {
-            removeToolTipLabel();
-            removeMouseOverBorder();
-            Assert.isTrue(request instanceof LocationRequest);
-            // don't show tooltip if drag is active
-            _showLabelFeedback = !((NodeEditPart)getHost()).isDragActive();
-            showHoverFeedback((LocationRequest)request);
-        } else {
-            super.showTargetFeedback(request);
-        }
-
-    }
-
-    public void eraseTargetFeedback(Request request) {
-        removeToolTipLabel();
-        removeMouseOverBorder();
-    }
-
-    /**
-     * @param request
-     */
-    private void showHoverFeedback(LocationRequest request)
-    {
-        if (_showLabelFeedback)
-        {
-            addMouseOverBorder();
-            _toolTip = new BasicLabelToolTip(getTooltipText());
-            addFeedback(_toolTip);
-
-            // use mouse cursor plus an offset so the tooltip doesn't
-            // appear z-ordered below the mouse cursor
-            AbsolutePointLocator locator = AbsolutePointLocator.getInstance();
-            locator.setReferencePoint(request.getLocation(), 0, TOOLTIP_VERTICAL_OFFSET);
-            //  to avoid enlargemeent of the feedback layer
-            locator.setIntersectFigure(getFeedbackLayer());
-            locator.relocate(_toolTip);
-        }
-    }
-    
-    private String getTooltipText() {
-        Element element = (Element) ((NonVisualComponentEditPart)getHost()).getDOMNode();
-        StringBuffer text = new StringBuffer(element.getTagName());
-        return text.toString();
-    }
-    
-    private void addMouseOverBorder()
-    {
-        if (_mouseOverBorder == null)
-        {
-            _mouseOverBorder = new RectangleFigure();
-            _mouseOverBorder.setFill(false);
-            _mouseOverBorder.setOutline(true);
-            _mouseOverBorder.setLineWidth(1);
-            _mouseOverBorder.setForegroundColor(HOVER_FEEDBACK_COLOR);
-        }
-        
-        addFeedback(_mouseOverBorder);
-        
-        IFigure hostFigure = getHostFigure();
-        Rectangle r = hostFigure.getBounds().getCopy().expand(1, 1);
-        hostFigure.translateToAbsolute(r);
-        _mouseOverBorder.translateToRelative(r);
-
-        _mouseOverBorder.setBounds(r);
-    }
-    
-    /**
-     * 
-     */
-    private void removeMouseOverBorder()
-    {
-        if (_mouseOverBorder != null) {
-            removeFeedback(_mouseOverBorder);
-            _mouseOverBorder = null;
-        }
-    }
-    
-    protected List createSelectionHandles() {
-//        return super.createSelectionHandles();
-        return Collections.EMPTY_LIST;  
-    }
-
-    /**
-     * 
-     */
-    private void removeToolTipLabel()
-    {
-        if (_toolTip != null) {
-            removeFeedback(_toolTip);
-            _toolTip = null;
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PDEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PDEditPolicy.java
deleted file mode 100644
index 72e76d6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PDEditPolicy.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-/**
- * @author mengbo
- */
-public interface PDEditPolicy {
-	/**
-	 * the edit policy for PD Drop
-	 */
-	String PDDROP_ROLE = "PDDropEditPolicy"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java
deleted file mode 100644
index 79b8f7f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class PolicyHelper {
-	private static Logger _log = PDPlugin.getLogger(PolicyHelper.class);
-
-	/**
-	 * @param part
-	 * @return the current viewer's status line manager or null
-	 */
-	public static IStatusLineManager getStatusLineManager(EditPart part) {
-		EditPartViewer v = part.getViewer();
-		if (v instanceof IHTMLGraphicalViewer) {
-			IHTMLGraphicalViewer htmlviewer = (IHTMLGraphicalViewer) v;
-			IStatusLineManager m = htmlviewer.getStatusLineManager();
-			if (m == null) {
-				_log.info("Warn.PolicyHelper.0", (String) null); //$NON-NLS-1$
-			}
-			return m;
-		}
-		_log.info("Warn.PolicyHelper.1", (String)null); //$NON-NLS-1$
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java
deleted file mode 100644
index 5b87485..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.AbstractDropCustomizer;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.w3c.dom.Element;
-
-/**
- * <p><b>Provisional API - subject to change</b></p>
- * @author mengbo
- * @version 1.5
- */
-// TODO: should this be abstract?
-public class AbstractElementEdit implements IElementEdit {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public void createEditPolicies(ElementEditPart part) {
-        // do nothing; sub-classes should override to add edit policies a part
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#handleModelChange(org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public boolean handleModelChange(Element ele, ElementEditPart part,
-			boolean recursive) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		// default do nothing, child class could override.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart,
-	 *      org.eclipse.jst.pagedesigner.parts.NodeEditPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean fillContainerContextMenu(IMenuManager contextMenu,
-			ElementEditPart elePart, NodeEditPart nodePart,
-			ISelection innerSelection) {
-		return false;
-	}
-
-	/**
-	 * Child class should override this method if they have different way for
-	 * resizing. e.g. DataWindow use "width/height" attribute, not "style".
-	 * Also, the default ResizeCommand will adjust "style", so if child class
-	 * override this method, they should also use different command.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy#getResizeCommand(org.eclipse.gef.requests.ChangeBoundsRequest)
-	 */
-	public boolean isResizable(Element ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl != null) {
-			// XXX: default implementation, if this element support "style"
-			// attribute,
-			// then we think it support resize.
-			return decl.getAttributes().getNamedItem("style") != null; //$NON-NLS-1$
-		}
-		return true;
-	}
-
-    /** 
-     * By default, return null to signal caller should use its default strategy
-     */
-    public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer) {
-        return null;
-    }
-
-    private final static IDropCustomizer   DEFAULT_DROP_CUSTOMIZER = 
-        new AbstractDropCustomizer(){/* do nothing; use defaults */};
-    
-    /** (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#getDropCustomizer(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     * @deprecated use getDropCustomizer(IDropSourceData) instead.
-     */
-    public IDropCustomizer getDropCustomizer(TagIdentifier tagId) 
-    {
-        return DEFAULT_DROP_CUSTOMIZER;
-    }
-
-    public IDropCustomizer getDropCustomizer(IDropSourceData dropSourceData)
-    {
-        if (dropSourceData instanceof ITagDropSourceData)
-        {
-            final String uri = ((ITagDropSourceData)dropSourceData).getNamespace();
-            final String tagName = ((ITagDropSourceData)dropSourceData).getTagName();
-            final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(uri, tagName);
-            return getDropCustomizer(tagId);
-        }
-        return DEFAULT_DROP_CUSTOMIZER;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#getTagCreator(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     */
-    public ITagCreator getTagCreator(TagIdentifier tagId) 
-    {
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java
deleted file mode 100644
index b7e42a5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-/**
- * @author cbateman
- *
- */
-public abstract class AbstractElementEditFactory implements IElementEditFactory 
-{
-    private String _supportedUri;
-    
-    /**
-     * @param uri
-     */
-    protected AbstractElementEditFactory(final String uri)
-    {
-        _supportedUri = uri;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     */
-    public abstract IElementEdit createElementEdit(TagIdentifier tag); 
-
-    public String getSupportedURI() 
-    {
-        return _supportedUri;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java
deleted file mode 100644
index d4162ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditFacRegistryReader {
-	private static List<IElementEditFactory> _handlers = null;
-
-	/**
-	 * @return all available handers for the ext-pt.  List is not
-	 * modifiable
-	 */
-	public static synchronized List<IElementEditFactory> getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return Collections.unmodifiableList(_handlers);
-	}
-
-	private static List<IElementEditFactory> readAllHandlers()
-    {
-        List<IElementEditFactory> result = new ArrayList<IElementEditFactory>();
-        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-                .getExtensionPoint(PDPlugin.getPluginId(),
-                        IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-        IExtension[] extensions = extensionPoint.getExtensions();
-
-        for (int i = 0; i < extensions.length; i++)
-        {
-            IExtension ext = extensions[i];
-            IConfigurationElement[] elementEditElement = ext
-                    .getConfigurationElements();
-
-            for (int j = 0; j < elementEditElement.length; j++)
-            {
-                final IConfigurationElement element = elementEditElement[j];
-                if (element.getName().equals(
-                        IJMTConstants.ELEMENT_EDIT_FACTORY))
-                {
-                    elementEditElement[j].getAttribute("class"); //$NON-NLS-1$
-                    Object obj;
-                    try
-                    {
-                        obj = elementEditElement[j]
-                                .createExecutableExtension("class"); //$NON-NLS-1$
-
-                        // TODO: we need a policy based solution here,
-                        // but this will do for now
-                        if (obj instanceof IElementEditFactory)
-                        {
-                            if (element.getContributor().getName().startsWith("org.eclipse.jst")) //$NON-NLS-1$
-                            {
-                                if (PageDesignerTraceOptions.TRACE_ELEMENTEDITLOAD)
-                                {
-                                    PageDesignerTraceOptions.log("ElementEditFacRegistryReader: Appending to list:"+obj.getClass().getName()); //$NON-NLS-1$
-                                }
-                                // push JSF tools provided ones to the end
-                                result.add((IElementEditFactory) obj);
-                            }
-                            // prepend if something outside JSF tools declared it
-                            else
-                            {
-                                if (PageDesignerTraceOptions.TRACE_ELEMENTEDITLOAD)
-                                {
-                                    PageDesignerTraceOptions.log("ElementEditFacRegistryReader: Prepending to list:"+obj.getClass().getName()); //$NON-NLS-1$
-                                }
-                                // this way, adopters can put their overrides
-                                // of factories with built-in support like
-                                // JSF HTML/CORE will be used first
-                                result.add(0, (IElementEditFactory) obj);
-                            }
-                        }
-                    } catch (CoreException e)
-                    {
-                        PDPlugin.log("Problem loading element edit extension for "+element.toString(), e); //$NON-NLS-1$
-                    }
-                }
-            }
-        }
-        
-
-        if (PageDesignerTraceOptions.TRACE_ELEMENTEDITLOAD)
-        {
-            PageDesignerTraceOptions.log("\nFinal elementEditFactory list in order:"); //$NON-NLS-1$
-            for (final IElementEditFactory factory : result)
-            {
-                PageDesignerTraceOptions.log(factory.getClass().getName());
-            }
-            PageDesignerTraceOptions.log("\n"); //$NON-NLS-1$
-        }
-
-        return result;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java
deleted file mode 100644
index 0b8f513..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.PageDesignerTraceOptions;
-import org.eclipse.jst.pagedesigner.elementedit.html.HTMLElementEditFactory;
-import org.eclipse.jst.pagedesigner.elementedit.jsp.JSPElementEditFactory;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditFactoryRegistry
-{
-    List _factories = new ArrayList();
-
-    private static ElementEditFactoryRegistry _instance;
-
-    /**
-	 *
-	 */
-    private ElementEditFactoryRegistry()
-    {
-        final List<IElementEditFactory> facs = ElementEditFacRegistryReader
-                .getAllHandlers();
-
-        if (facs != null)
-        {
-            for (final IElementEditFactory fac : facs)
-            {
-                addFactory(fac);
-            }
-        }
-        addFactory(new HTMLElementEditFactory());
-        addFactory(new JSPElementEditFactory());
-    }
-
-    /**
-     * Add a factory to list available.
-     *
-     * @param fac
-     */
-    public void addFactory(final IElementEditFactory fac)
-    {
-        _factories.add(fac);
-    }
-
-    /**
-     * @param tagIdentifier
-     * @return an IElementEdit constructed for the tag uniquely identified by
-     *         the ns uri (tag uri for JSP tags) and tagName (element name) or
-     *         null if the system can't create one.
-     */
-    public IElementEdit createElementEdit(final TagIdentifier tagIdentifier)
-    {
-        final String uri = tagIdentifier.getUri();
-
-        // first round, match uri
-        for (int i = 0, size = _factories.size(); i < size; i++)
-        {
-            final IElementEditFactory fac = (IElementEditFactory) _factories.get(i);
-            final String facuri = fac.getSupportedURI();
-            if (facuri != null && facuri.equalsIgnoreCase(uri))
-            {
-                final IElementEdit elementEdit = fac.createElementEdit(tagIdentifier);
-                if (elementEdit != null)
-                {
-                    if (PageDesignerTraceOptions.TRACE_ELEMENTEDITSELECTION)
-                    {
-                        PageDesignerTraceOptions.log("ElementEditFactoryRegistry: first loop, "+ //$NON-NLS-1$
-                                String.format("Selected %s for uri=%s, tagname=%s", elementEdit.getClass().getName(),uri, tagIdentifier.getTagName())); //$NON-NLS-1$
-                    }
-                    return elementEdit;
-                }
-            }
-        }
-        // second round
-        for (int i = 0, size = _factories.size(); i < size; i++)
-        {
-            final IElementEditFactory fac = (IElementEditFactory) _factories.get(i);
-            final String facuri = fac.getSupportedURI();
-            if (facuri == null)
-            {
-                final IElementEdit elementEdit = fac.createElementEdit(tagIdentifier);
-                if (elementEdit != null)
-                {
-                    if (PageDesignerTraceOptions.TRACE_ELEMENTEDITSELECTION)
-                    {
-                        PageDesignerTraceOptions.log("ElementEditFactoryRegistry: second loop, "+ //$NON-NLS-1$
-                                String.format("Selected %s for uri=%s, tagname=%s", elementEdit.getClass().getName(),uri, tagIdentifier.getTagName())); //$NON-NLS-1$
-                    }
-                    return elementEdit;
-                }
-            }
-        }
-
-        if (PageDesignerTraceOptions.TRACE_ELEMENTEDITSELECTION)
-        {
-            PageDesignerTraceOptions.log("ElementEditFactoryRegistry: no element edit found, returning null for "+ //$NON-NLS-1$
-                    String.format("uri=%s, name=%s", tagIdentifier.getUri(), tagIdentifier.getTagName())); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-    /**
-     * Convenience method for createElementEdit(uri, tagName) that takes a tag
-     * element.
-     *
-     * @param ele
-     * @return an element edit
-     */
-    public IElementEdit createElementEdit(final Element ele)
-    {
-        final TagIdentifier tagIdentifier = TagIdentifierFactory
-                .createDocumentTagWrapper(ele);
-        return createElementEdit(tagIdentifier);
-    }
-
-    /**
-     * @return the single instance of the factory registry
-     */
-    public synchronized static ElementEditFactoryRegistry getInstance()
-    {
-        if (_instance == null)
-        {
-            _instance = new ElementEditFactoryRegistry();
-        }
-        return _instance;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java
deleted file mode 100644
index 7a8e12f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.w3c.dom.Element;
-
-/**
- * IElementEdit support additional edit support to an element.
- *
- * This interface should not be extended by clients.  Extend AbstractElementEdit
- * instead.
- *
- * <p><b>Provisional API - subject to change</b></p>
- *
- * @author mengbo
- * @version 1.5
- */
-public interface IElementEdit
-{
-	/**
-	 * override default edit policies on part
-	 * @param part
-	 */
-	public void createEditPolicies(ElementEditPart part);
-
-	/**
-	 * The element (or its decendent) changed.
-	 *
-	 * @param ele
-	 * @param part
-	 * @param recursive
-	 * @return handle model changes on part.
-	 */
-	public boolean handleModelChange(Element ele, ElementEditPart part,
-			boolean recursive);
-
-	/**
-	 * Add special menu items for the particular element to the context menu.
-	 *
-	 * @param contextMenu
-	 * @param ele
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele);
-
-	/**
-	 * This method is called when current selection is inside "ele". And this
-	 * method should fill in menu items relating to the "ele" context and the
-	 * current "innerSelection". For example, this "ele" could be a table,
-	 * "innerSelection" could be something inside a cell. Then could fill in
-	 * actions relating to the table and the cell, such as "add row before",
-	 * "delete current column", etc.
-	 *
-	 * @param contextMenu
-	 * @param elePart
-	 *            the elementeditpart corresponding to this ElementEdit
-	 * @param nodePart
-	 *            the smallest part covers the current selection. nodePart will
-	 *            always be a decedent of the elePart.
-	 * @param innerSelection
-	 *            the selection
-	 * @return true if added actions.
-	 */
-	public boolean fillContainerContextMenu(IMenuManager contextMenu,
-			ElementEditPart elePart, NodeEditPart nodePart,
-			ISelection innerSelection);
-
-	/**
-	 * whether the corresponding element support resize. If it does, then the
-	 * corresponding policy installed through <code>createEditPolicies</code>
-	 * should handle resize.
-	 * @param ele
-	 *
-	 * @return true if ele has resize support
-	 */
-	public boolean isResizable(Element ele);
-
-    /**
-     * @param tag the element to return a drop location strategy for.
-     * This is the requesting element (being dropped), not the drop target
-     *
-     * @param viewer is the viewer where the new strategy will optionally
-     * add feedback
-     *
-     * @return the strategy to be used to use to find a drop location when
-     * the corresponding element is being dropped (the source part).  May
-     * be null signalling that the caller should use its default strategy.
-     *
-     */
-     public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer);
-
-    /**
-     * @param tagId
-     * @return the drop customizer for this edit's element.  May return null.
-     * Returning null and returning a IDropCustomizer whose runCustomizer always returns
-     * OK and getDropCustomizationData always returns null will be considered
-     * equivalent by the framework.
-     * @deprecated use getDropCustomizer(IDropSourceData) instead
-     */
-    public IDropCustomizer getDropCustomizer(TagIdentifier tagId);
-
-    /**
-     * @param dropSourceData
-     * @return the drop customizer for the drop source data or null if none.
-     */
-    public IDropCustomizer getDropCustomizer(final IDropSourceData dropSourceData);
-
-    /**
-     * @param tagId
-     * @return a tag creator for the indicated tag or null to indicate that the
-     * system should use it's default tag creator
-     */
-    public ITagCreator getTagCreator(TagIdentifier tagId);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java
deleted file mode 100644
index 052275a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * 
- * Clients should not implement this interface.  Extend AbstractElementEditFactory instead.
- */
-public interface IElementEditFactory {
-	/**
-	 * 
-	 * @param tag
-	 * @return null if this factory don't support this element
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tag);
-
-	/**
-	 * get the URI namespace that this factory support. "null" means this
-	 * factory can be used as default factory.
-	 * 
-	 * @return null if this factory don't have a specific URI to support.
-	 */
-	public String getSupportedURI();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
deleted file mode 100644
index 2ddff0c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HTMLElementEditFactory implements IElementEditFactory 
-{
-    final static TagIdentifier HTMLHEAD_TAG_IDENTIFIER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_HTML, IHTMLConstants.TAG_HEAD);
-    final static TagIdentifier HTMLTABLE_TAG_IDENTIFIER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_HTML, IHTMLConstants.TAG_TABLE);
-    
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tagIdentifier) {
-		if (HTMLTABLE_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
-			return new TableElementEdit();
-		} else if (HTMLHEAD_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
-			return new HeadElementEdit();
-		} else if (tagIdentifier != null) {
-			// No need to check the URI, it was checked to get this factory.
-			// Just check the tag name, ignoring case in the HTML tag names.
-			// The HTML tag meta data uses upper case and the programming
-			// constants are in lower case.
-			if (IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagIdentifier.getTagName())) {
-				return new StylesheetLinkElementEdit();
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_HTML;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HeadElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HeadElementEdit.java
deleted file mode 100644
index 4840bbb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HeadElementEdit.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation and/or initial documentation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editpolicies.HeadItemCreationEditPolicy;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * Simple ElementEdit implementation to support context menu insert
- * actions and drag and drop of tags into the HTML head tag.
- */
-public class HeadElementEdit extends AbstractElementEdit
-{
-	private static final Action EMPTY_ACTION = new Action() {
-        // create a default instance that does nothing.
-        // Action is abstract but has no abstract methods
-        // run() on this object is a NOOP
-	};
-
-	/* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager, org.w3c.dom.Element)
-     */
-	@Override
-    public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		super.fillContextMenu(contextMenu, ele);
-
-		final IDOMElement element = (IDOMElement) ele;
-		IContributionItem item = contextMenu.find(PageDesignerActionConstants.INSERT_SUBMENU_ID);
-		if (item instanceof IMenuManager) {
-			final IMenuManager submenu = (IMenuManager) item;
-    		submenu.add(EMPTY_ACTION);
-    		submenu.addMenuListener(new IMenuListener() {
-    			public void menuAboutToShow(IMenuManager manager) {
-    				submenu.removeAll();
-    				addHeadAddItems(submenu, element);
-    			}
-    		});
-		}
-    }
-
-    private void addHeadAddItems(IMenuManager submenu, IDOMElement element) {
-		submenu.add(new InsertStylesheetLinkAction(element));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	@Override
-	public void createEditPolicies(ElementEditPart part) {
-		part.installEditPolicy(ItemCreationRequest.REQ_ITEM_CREATION,
-				new HeadItemCreationEditPolicy(part));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/InsertStylesheetLinkAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/InsertStylesheetLinkAction.java
deleted file mode 100644
index a2c9326..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/InsertStylesheetLinkAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation and/or initial documentation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- */
-public class InsertStylesheetLinkAction extends Action
-{
-	private IDOMElement _parentElement;
-
-	/**
-	 * @param parentElement 
-	 */
-	public InsertStylesheetLinkAction(IDOMElement parentElement) {
-		setText(PDPlugin.getResourceString("HeadElementEdit.Submenu.InsertStylesheetLink"));//$NON-NLS-1$
-		_parentElement = parentElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		// TODO: figure out how to get the default attributes from
-		// the tag create metadata. Get a tag creation provider?
-		Map attributes = new LinkedHashMap();
-		attributes.put("href", "");  //$NON-NLS-1$//$NON-NLS-2$
-		attributes.put("rel", "Stylesheet");  //$NON-NLS-1$//$NON-NLS-2$
-		attributes.put("type", "text/css");  //$NON-NLS-1$//$NON-NLS-2$
-		Command command = new AddSubNodeCommand(
-				PDPlugin.getResourceString("ItemCreationEditPolicy.CommandLabel.CreateItem"),//$NON-NLS-1$
-				_parentElement, IHTMLConstants.TAG_LINK, ITLDConstants.URI_HTML,
-				attributes);
-		command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/StylesheetLinkElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/StylesheetLinkElementEdit.java
deleted file mode 100644
index d3e4ea5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/StylesheetLinkElementEdit.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation and/or initial documentation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.w3c.dom.Node;
-
-/**
- * Simple ElementEdit implementation to support drag and drop
- * of style sheet link tags into the HTML head tag.
- */
-public class StylesheetLinkElementEdit extends AbstractElementEdit
-{
-    public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer) {
-        return new MyDropLocationStrategy(viewer);
-    }
-
-    private static class MyDropLocationStrategy extends DefaultDropLocationStrategy
-    {
-        /**
-         * @param viewer
-         */
-        public MyDropLocationStrategy(EditPartViewer viewer) {
-            super(viewer);
-        }
-
-        public DesignPosition calculateDesignPosition(EditPart host,
-                Point p, IPositionMediator validator) {
-        	Node node = (Node) host.getModel();
-        	if (host != null && IHTMLConstants.TAG_HEAD.equalsIgnoreCase(node.getLocalName())) {
-        		return new DesignPosition(host, 0);
-        	}
-        	return super.calculateDesignPosition(host, p, validator);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java
deleted file mode 100644
index a2d605c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteHeaderFooterCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteRowCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertHeaderFooterCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertRowCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableResizeColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableResizeRowCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableChildElementPosition;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.TableInsertRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizeRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableRowColumnDeleteRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableElementEdit extends AbstractElementEdit {
-
-	private final static Action action = new Action() {
-        // TODO: what's this for?
-	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-
-		final ElementEditPart tablePart =
-			(ElementEditPart) ((IDOMElement) ele).getAdapterFor(EditPart.class);
-
-		final Element table = (Element) tablePart.getModel();
-
-		final TableChildElementPosition position = new TableUtil(table).getPosition((Node)null);
-		final int cellRow = position.getRowIndex();
-		final int cellColumn = position.getColumnIndex();
-
-		final IMenuManager tableMenu =
-			new MenuManager(PDPlugin.getResourceString("ElementEdit.Submenu.Table")); //$NON-NLS-1$
-		tableMenu.add(action);
-		tableMenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				tableMenu.removeAll();
-				fillTableMenu(tablePart, cellRow, cellColumn, tableMenu);
-			}
-		});
-
-		contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart,
-	 *      org.eclipse.jst.pagedesigner.parts.NodeEditPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean fillContainerContextMenu(
-			IMenuManager contextMenu,
-			final ElementEditPart tablePart,
-			NodeEditPart nodePart,
-			ISelection innerSelection) {
-
-		super.fillContainerContextMenu(contextMenu, tablePart, nodePart, innerSelection);
-
-		final Element table = (Element) tablePart.getModel();
-		final Node node = (Node) nodePart.getModel();
-
-		final TableChildElementPosition position = new TableUtil(table).getPosition(node);
-		final int cellRow = position.getRowIndex();
-		final int cellColumn = position.getColumnIndex();
-
-		final IMenuManager tableMenu =
-			new MenuManager(PDPlugin.getResourceString("ElementEdit.Submenu.Table")); //$NON-NLS-1$
-		tableMenu.add(action);
-		tableMenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				tableMenu.removeAll();
-				fillTableMenu(tablePart, cellRow, cellColumn, tableMenu);
-			}
-		});
-
-		contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER, tableMenu);
-		return true;
-	}
-
-	/**
-	 * @param tablePart
-	 * @param cellRow
-	 * @param cellColumn
-	 * @param tableMenu
-	 */
-	private void fillTableMenu(ElementEditPart tablePart, int cellRow,
-			int cellColumn, IMenuManager tableMenu) {
-		SelectEditPartAction action1 = SelectEditPartAction.create(
-				PDPlugin.getResourceString("ElementEdit.Submenu.SelectTable"), tablePart);//$NON-NLS-1$
-		tableMenu.add(action1);
-
-		tableMenu.add(new Separator());
-
-		{
-			InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertRowBefore"),//$NON-NLS-1$
-					tablePart, cellRow, true, true);
-			tableMenu.add(insertRowBeforeAction);
-
-			InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertRowAfter"),//$NON-NLS-1$
-					tablePart, cellRow, true, false);
-			tableMenu.add(insertRowAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertColumnBefore"),//$NON-NLS-1$
-					tablePart, cellColumn, false, true);
-			tableMenu.add(insertColumnBeforeAction);
-
-			InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertColumnAfter"),//$NON-NLS-1$
-					tablePart, cellColumn, false, false);
-			tableMenu.add(insertColumnAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(
-					PDPlugin.getResourceString("ElementEdit.Submenu.DeleteRow"),//$NON-NLS-1$
-					tablePart, cellRow, true);
-			tableMenu.add(deleteRowAction);
-
-			DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteColumn"),//$NON-NLS-1$
-					tablePart, cellColumn, false);
-			tableMenu.add(deleteColumnAction);
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertHeaderFooterAction headerAction = new InsertHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertHeader"), tablePart, true);//$NON-NLS-1$
-			tableMenu.add(headerAction);
-			InsertHeaderFooterAction footerAction = new InsertHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertFooter"), tablePart, false);//$NON-NLS-1$
-			tableMenu.add(footerAction);
-			DeleteHeaderFooterAction delHeaderAction = new DeleteHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteHeader"), tablePart, true);//$NON-NLS-1$
-			tableMenu.add(delHeaderAction);
-			DeleteHeaderFooterAction delFooterAction = new DeleteHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteFooter"), tablePart, false);//$NON-NLS-1$
-			tableMenu.add(delFooterAction);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public void createEditPolicies(ElementEditPart part) {
-		part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
-				new TableResizePolicy(part));
-	}
-
-	static class TableResizePolicy extends TableResizableEditPolicy {
-		ElementEditPart _part;
-
-		/**
-		 * @param part
-		 */
-		public TableResizePolicy(ElementEditPart part) {
-			_part = part;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request)
-		 */
-		public Command getCommand(Request request) {
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part
-					.getViewer();
-			Element table = (Element) _part.getIDOMNode();
-			if (request instanceof TableResizeRequest) {
-				TableResizeRequest trq = (TableResizeRequest) request;
-				if (trq.isRow()) {
-					return new TableResizeRowCommand(viewer, table, trq
-							.getIndex(), trq.getDelta());
-				}
-                return new TableResizeColumnCommand(viewer, table, trq
-                		.getIndex(), trq.getDelta());
-			} else if (request instanceof TableInsertRequest) {
-				TableInsertRequest tableInsertRequest = (TableInsertRequest) request;
-				int index = tableInsertRequest.getIndex()
-						+ (tableInsertRequest.isBefore() ? 0 : 1);
-				if (tableInsertRequest.isRow()) {
-					return new TableInsertRowCommand(viewer, table, index,
-							tableInsertRequest.isBefore());
-				}
-                return new TableInsertColumnCommand(viewer, table, index);
-			} else if (request instanceof TableRowColumnDeleteRequest) {
-				TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request;
-				if (deleteReq.isRow()) {
-					return new TableDeleteRowCommand(viewer, table, deleteReq
-							.getIndex());
-				}
-                return new TableDeleteColumnCommand(viewer, table,
-                		deleteReq.getIndex());
-			} else if (request instanceof InsertHeaderFooterRequest) {
-				InsertHeaderFooterRequest hfRequest = (InsertHeaderFooterRequest) request;
-				return new TableInsertHeaderFooterCommand(viewer, table,
-						hfRequest.isHeader());
-			} else if (request instanceof DeleteHeaderFooterRequest) {
-				DeleteHeaderFooterRequest hfRequest = (DeleteHeaderFooterRequest) request;
-				return new TableDeleteHeaderFooterCommand(viewer, table,
-						hfRequest.isHeader());
-			}
-			return super.getCommand(request);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java
deleted file mode 100644
index 9dc4f9e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSPElementEditFactory implements IElementEditFactory 
-{
-    final static TagIdentifier TAG_DIRECTIVE_TAGLIB_TAG_IDENTIFIER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSP, IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tagIdentifier) {
-		if (TAG_DIRECTIVE_TAGLIB_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
-			return new TaglibElementEdit();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_JSP;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java
deleted file mode 100644
index 9c82880..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TaglibElementEdit extends AbstractElementEdit {
-	private TaglibURIAction action;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		super.fillContextMenu(contextMenu, ele);
-
-		TaglibURIAction action1 = getAction();
-
-		action1.setURI(ele.getAttribute(ICSSPropertyID.ATTR_URI));
-
-		action1.setElement(ele);
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_SPECIAL,
-				action1);
-	}
-
-	private TaglibURIAction getAction() {
-		if (action == null) {
-			action = new TaglibURIAction();
-		}
-		return action;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java
deleted file mode 100644
index eefc1b3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TaglibURIAction extends Action {
-	private String URI;
-
-	private Element element;
-
-	/**
-	 * Default constructor
-	 */
-	public TaglibURIAction() {
-		setText(PDPlugin.getResourceString("ElementEdit.Submenu.Taglib"));//$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		if (element == null || URI == null || "".equals(URI))//$NON-NLS-1$
-		{
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		String fileName = getResolvedURL(getElement(), URI);
-
-		if (fileName != null && fileName.length() > 0) {
-			IPath includedPath = new Path(fileName);
-			includedPath.makeAbsolute();
-
-			IFile file = getFile(includedPath);
-			if (file != null && file.exists()) {
-				try {
-					IDE.openEditor(getPage(), file);
-					return;
-				} catch (PartInitException e) {
-					PDPlugin.getAlerts().warning(
-							"Message.Warning.Title", e.getLocalizedMessage());//$NON-NLS-1$
-				}
-			}
-		}
-		PDPlugin.getAlerts().warning(
-				"Message.Warning.Title", "Taglib.OpenFile.ERROR");//$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	private IWorkbenchPage getPage() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-		return window.getActivePage();
-	}
-
-	/**
-	 * @param uri
-	 */
-	public void setURI(String uri) {
-		this.URI = uri;
-	}
-
-	private IFile getFile(IPath includedPath) {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IProject[] projects = workspaceRoot.getProjects();
-
-		for (int i = 0, length = projects.length; i < length; i++) {
-			IPath path = projects[i].getLocation();
-			path = path.makeAbsolute();
-			if (path != null && path.isPrefixOf(includedPath)) {
-				// -1 so we still have the project path
-				includedPath = includedPath.removeFirstSegments(path
-						.segmentCount() - 1);
-				return ResourcesPlugin.getWorkspace().getRoot().getFile(
-						includedPath);
-			}
-		}
-		return null;
-	}
-
-	private String getResolvedURL(Element element_, String attrName) {
-		URIResolver resolver = null;
-		if (element_ instanceof IDOMNode) {
-			resolver = ((IDOMNode) element_).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = URI;
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the element.
-	 */
-	public Element getElement() {
-		return element;
-	}
-
-	/**
-	 * @param element
-	 *            The element to set.
-	 */
-	public void setElement(Element element) {
-		this.element = element;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java
deleted file mode 100644
index 83bd334..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.extensionpoint;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * @author mengbo
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-
-public interface IContextMenuItemContributor {
-	/**
-	 * @param uri
-	 */
-	void setURI(String uri);
-
-	/**
-	 * @return the uri
-	 */
-	String getURI();
-
-	/**
-	 * @param manager
-	 * @param selection
-	 * @param model
-	 * @param parentUI
-	 */
-	void fillContextMenu(IMenuManager manager, ISelection selection,
-			IStructuredModel model, Control parentUI);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/package-info.java
deleted file mode 100644
index 547f3b3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Web Page Editor Extension Point Interfaces. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.extensionpoint;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/AbstractFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/AbstractFigureHandler.java
deleted file mode 100644
index 06090c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/AbstractFigureHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractFigureHandler implements IFigureHandler {
-	private CSSFigure _figure;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return (type == IFigureHandler.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // TODO: anything?
-	}
-
-	/**
-	 * @param node
-	 * @return the css style on the node
-	 */
-	protected ICSSStyle getCSSStyle(Element node) {
-		ICSSStyle style = null;
-		if (node instanceof IDOMElement) {
-			style = (ICSSStyle) ((IDOMElement) node)
-					.getAdapterFor(ICSSStyle.class);
-		}
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		} 
-        
-        return style;
-	}
-
-	/**
-	 * @param oldFigure
-	 */
-	protected void setCurrentFigure(CSSFigure oldFigure) {
-		this._figure = oldFigure;
-	}
-
-	public CSSFigure getFigure() {
-		return this._figure;
-	}
-
-	/**
-	 * child class could override this method
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/BRFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/BRFigureHandler.java
deleted file mode 100644
index ff32c72..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/BRFigureHandler.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBrFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSLayout;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class BRFigureHandler extends AbstractFigureHandler {
-	/**
-	 * @param figure
-	 * @return the CSS layout for fixed layout
-	 */
-	protected CSSLayout getFixedCSSLayout(CSSFigure figure) {
-		return new CSSBrFlowLayout(figure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-	public void updateFigure(Element node, CSSFigure oldFigure) {
-		oldFigure.setCSSStyle(getCSSStyle(node));
-		oldFigure.setFixedLayoutManager(getFixedCSSLayout(oldFigure));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/DefaultFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/DefaultFigureHandler.java
deleted file mode 100644
index 82cc075..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/DefaultFigureHandler.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DefaultFigureHandler extends AbstractFigureHandler {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler#updateFigure(org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.css2.layout.CSSFigure)
-	 */
-	public void updateFigure(Element node, CSSFigure oldFigure) {
-		setCurrentFigure(oldFigure);
-		ICSSStyle style = getCSSStyle(node);
-		oldFigure.setCSSStyle(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java
deleted file mode 100644
index f061e11..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class FigureFactory 
-{
-	/**
-	 * @param figure
-	 * @param node
-	 */
-	private static void createFigureDeep(IFigure parentFigure, final Node node) {
-		if (node instanceof Element) {
-			IFigureHandler handler = createAndAdapt((Element) node);
-			if (handler instanceof HiddenFigureHandler) {
-				// for deep hidden element, we don't create figure for them.
-				// this will remove the small <> icon for data window.
-				return;
-			}
-			CSSFigure figure = new CSSFigure();
-			handler.updateFigure((Element) node, figure);
-			// IFigure figure = handler.createFigure((Element) node);
-			parentFigure.add(figure);
-			if (!handler.isWidget()) {
-				NodeList children = node.getChildNodes();
-
-				for (int i = 0, size = children.getLength(); i < size; i++) {
-					createFigureDeep(figure, children.item(i));
-				}
-			}
-		} else if (node instanceof Text) {
-			final String data = HTMLUtil.compactWhitespaces((Text) node, node
-					.getNodeValue());
-			// XXX: seemed there is some bug in handling whitespace (unnecessary
-			// take additional space)
-			// so skip it here.
-			if (data.trim().length() == 0) {
-				return;
-			}
-			// XXX: currently creating of CSSTextFigure is distributed both here
-			// and TextEditPart. We may want to unify them later.
-			CSSTextFigure figure = new CSSTextFigure(new ICSSTextProvider() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getCSSStyle()
-				 */
-                //  TODO: dead?
-//				public ICSSStyle getCSSStyle() {
-//					INodeNotifier notifier = (INodeNotifier) node
-//							.getParentNode();
-//					return (ICSSStyle) notifier.getAdapterFor(ICSSStyle.class);
-//				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getTextData()
-				 */
-				public String getTextData() {
-					return data;
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getSelectedRange()
-				 */
-				public int[] getSelectedRange() {
-					// text figure created here will not be real text in
-					// original doc.
-					// so don't support their selection.
-					return null;
-				}
-			});
-			parentFigure.add(figure);
-		}
-	}
-
-	/**
-	 * @param ele
-	 * @param old
-	 * @param figure
-	 * @return the figure
-	 */
-	public static IFigure updateDeepFigure(Element ele, Element old,
-			CSSFigure figure) {
-		recursiveDisposeAndUnadapt(old);
-		List figureChildren = figure.getChildren();
-		for (int i = figureChildren.size() - 1; i >= 0; i--) {
-			figure.remove((IFigure) figureChildren.get(i));
-		}
-
-		IFigureHandler handler = createAndAdapt(ele);
-		handler.updateFigure(ele, figure);
-		if (!handler.isWidget()) {
-			NodeList children = ele.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				createFigureDeep(figure, children.item(i));
-			}
-		}
-		return figure;
-	}
-
-
-	private static void recursiveDisposeAndUnadapt(Element ele) {
-		disposeAndUnadapt(ele);
-		NodeList nl = ele.getChildNodes();
-		for (int i = 0, size = nl.getLength(); i < size; i++) {
-			Node n = nl.item(i);
-			if (n instanceof Element) {
-				recursiveDisposeAndUnadapt((Element) n);
-			}
-		}
-	}
-
-	private static void disposeAndUnadapt(Element ele) {
-		IFigureHandler handler = getHandler(ele);
-		if (handler != null) {
-			handler.dispose();
-			((IDOMElement) ele).removeAdapter(handler);
-		}
-	}
-
-	private static IFigureHandler getHandler(Element ele) {
-		if (ele instanceof IDOMElement) {
-			IDOMElement xmlele = (IDOMElement) ele;
-			return (IFigureHandler) xmlele.getAdapterFor(IFigureHandler.class);
-		}
-		return null;
-	}
-
-	private static IFigureHandler createAndAdapt(Element ele) {
-		IFigureHandler handler = createFigureHandler(ele);
-		if (ele instanceof IDOMElement) {
-			((IDOMElement) ele).addAdapter(handler);
-		}
-		return handler;
-	}
-
-	private static IFigureHandler createFigureHandler(Element ele) {
-		String tag = ele.getTagName();
-		if ("input".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new InputFigureHandler();
-		} else if ("select".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new SelectFigureHandler();
-		} else if ("img".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new ImgFigureHandler();
-		} else if ("object".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new ObjectFigureHandler();
-		} else if ("textarea".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new TextareaFigureHandler();
-		} else if ("br".equalsIgnoreCase(tag)) { //$NON-NLS-1$
-			return new BRFigureHandler();
-		} else if (!HTMLUtil.isVisualHtmlElement(tag)) {
-			return new HiddenFigureHandler(getSharedHTMLImage(ele));
-		} else {
-			return new DefaultFigureHandler();
-		}
-	}
-
-	/**
-	 * @param tag
-	 * @return
-	 */
-	private static Image getSharedHTMLImage(Element element) {
-		Image image = null;
-		
-        IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(element);
-        if (context != null){   
-        	IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-        	if (wsResolver != null){
-        		image = TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),"HTML", element.getLocalName()); //$NON-NLS-1$
-        	}
-        }
-		return image != null ? image : JSFUICommonPlugin.getDefault().getImage(
-			JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);	
-	}
-	
-	private FigureFactory()
-	{
-	    // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/HiddenFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/HiddenFigureHandler.java
deleted file mode 100644
index 4a253cd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/HiddenFigureHandler.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.widget.ImageWidgetProvider;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class HiddenFigureHandler extends WidgetFigureHandler {
-	private Image _image;
-
-	/**
-	 * @param image
-	 */
-	public HiddenFigureHandler(Image image) {
-		_image = image;
-	}
-
-	protected ICSSWidgetProvider initializeWidgetProvider(Element ele) {
-		return new ImageWidgetProvider(getImage(), DefaultStyle.getInstance());
-	}
-
-	/**
-	 * @return
-	 */
-	private Image getImage() {
-		return _image;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/IFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/IFigureHandler.java
deleted file mode 100644
index 99cfe3a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/IFigureHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.w3c.dom.Element;
-
-/**
- * IFigureHandler is similiar to EditPart in some sence. Each IFigureHandler is
- * adapted to an HTML element node, and provide a figure for it.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IFigureHandler extends INodeAdapter {
-	/**
-	 * @param node
-	 * @param oldFigure
-	 */
-	public void updateFigure(Element node, CSSFigure oldFigure);
-
-	/**
-	 * 
-	 */
-	public void dispose();
-
-	/**
-	 * @return true if the node is deemed a widget
-	 */
-	public boolean isWidget();
-
-	/**
-	 * @return the figure
-	 */
-	public CSSFigure getFigure();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ImgFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ImgFigureHandler.java
deleted file mode 100644
index 920b3d3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ImgFigureHandler.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ImageWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.ImageResolver;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-/*package*/ class ImgFigureHandler extends WidgetFigureHandler {
-	/**
-	 * the image provided for a widget
-	 */
-	protected Image _image;
-
-	/**
-	 * child class can override this method.
-	 * 
-	 * @param node
-	 */
-	protected void initializeImage(Element node) {
-		if (_image != null) {
-			_image.dispose();
-		}
-		_image = ImageResolver.initializeImage(node, "src"); //$NON-NLS-1$
-	}
-
-	public void dispose() {
-		if (_image != null) {
-			_image.dispose();
-			_image = null;
-		}
-	}
-
-	protected ICSSWidgetProvider initializeWidgetProvider(Element ele) {
-		initializeImage(ele);
-		ImageWidgetProvider provider = new ImageWidgetProvider(_image,
-				getCSSStyle(ele));
-		return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java
deleted file mode 100644
index bd61ce0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ButtonWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.CheckboxWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.HiddenProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ImageWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.InputFileWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.RadioWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.TextInputWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.utils.ImageResolver;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-/*package*/ class InputFigureHandler extends WidgetFigureHandler {
-	private Image _image;
-
-	void initializeImage(Element node) {
-		if (_image != null) {
-			_image.dispose();
-		}
-		_image = ImageResolver.initializeImage(node, "src"); //$NON-NLS-1$
-	}
-
-	ImageWidgetProvider getImageProvider(Element node) {
-		initializeImage(node);
-		ImageWidgetProvider provider = new ImageWidgetProvider(_image,
-				getCSSStyle(node));
-		return provider;
-	}
-
-	ICSSWidgetProvider getButtonProvider(Element node) {
-		ButtonWidgetProvider provider = new ButtonWidgetProvider(
-				getCSSStyle(node));
-		provider.setValue(getButtonValue(node));
-		return provider;
-	}
-
-	ICSSWidgetProvider getFileProvider(Element node) {
-		// ICSSWidgetProvider textprovider = getTextInputProvider();
-		// // XXX: should we use the defaultstyle for the button?
-		// ButtonWidgetProvider browsebutton = new
-		// ButtonWidgetProvider(getCSSStyle());
-		// browsebutton.setValue("Browse...");
-		// CompositeWidgetProvider provider = new
-		// CompositeWidgetProvider(getCSSStyle(), textprovider, browsebutton,
-		// false);
-		// return provider;
-		ICSSWidgetProvider textprovider = getTextInputProvider(node);
-		// XXX: should we use the defaultstyle for the button?
-		ButtonWidgetProvider browsebutton = new ButtonWidgetProvider(
-				getCSSStyle(node));
-		browsebutton.setValue(Messages.InputFigureHandler_Browse);
-		InputFileWidgetProvider provider = new InputFileWidgetProvider(
-				getCSSStyle(node), textprovider, browsebutton);
-		return provider;
-	}
-
-	/**
-	 * should not return null
-	 * 
-	 * @return the image
-	 */
-	protected Image getHiddenImage() {
-		return JSFUICommonPlugin.getDefault().getImage(
-				JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-	}
-
-	ICSSWidgetProvider getHiddenProvider(Element node) {
-		return new HiddenProvider(getHiddenImage(), node);
-	}
-
-	ICSSWidgetProvider getPasswordProvider(Element node) {
-		TextInputWidgetProvider provider = new TextInputWidgetProvider(
-				getCSSStyle(node), TextInputWidgetProvider.PWD_SIZE);
-		provider.setSize(getSize(node));
-		provider.setValue("********"); //$NON-NLS-1$
-		return provider;
-	}
-
-	ICSSWidgetProvider getTextInputProvider(Element node) {
-		TextInputWidgetProvider provider = new TextInputWidgetProvider(
-				getCSSStyle(node));
-		provider.setSize(getSize(node));
-		provider.setValue(getValue(node));
-		return provider;
-	}
-
-	private int getSize(Element node) {
-		String s = DOMUtil.getAttributeIgnoreCase(node, "size"); //$NON-NLS-1$
-		try {
-			if (s != null) {
-				return Integer.parseInt(s);
-			}
-		} catch (NumberFormatException  ex) {
-            // suppress and fall-through; return 0
-		}
-        return 0;
-	}
-
-	/**
-	 * @return
-	 */
-	private String getValue(Element node) {
-		return DOMUtil.getAttributeIgnoreCase(node, "value"); //$NON-NLS-1$
-	}
-
-	private String getButtonValue(Element node) {
-		String value = getValue(node);
-		if (value == null) {
-			String type = DOMUtil.getAttributeIgnoreCase(node,
-					ICSSPropertyID.ATTR_TYPE);
-			if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SUBMIT)) {
-				return IHTMLConstants.SUBMIT_LABEL;
-			} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_RESET)) {
-				return IHTMLConstants.RESET_LABEL;
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @return the widget provider
-	 */
-	protected ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		reset();
-
-		String type = DOMUtil.getAttributeIgnoreCase(node,
-				ICSSPropertyID.ATTR_TYPE);
-
-		if (type == null) {
-			return getTextInputProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SUBMIT)
-				|| type.equalsIgnoreCase(ICSSPropertyID.VAL_RESET)
-				|| type.equalsIgnoreCase(ICSSPropertyID.VAL_BUTTON)) {
-			return getButtonProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_IMAGE)) {
-			return getImageProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_FILE)) {
-			return getFileProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_RADIO)) {
-			RadioWidgetProvider provider = new RadioWidgetProvider(
-					getCSSStyle(node));
-			provider.setChecked(node.hasAttribute("checked")); //$NON-NLS-1$
-			return provider;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_CHECKBOX)) {
-			CheckboxWidgetProvider provider = new CheckboxWidgetProvider(
-					getCSSStyle(node));
-			provider.setChecked(node.hasAttribute("checked")); //$NON-NLS-1$
-			return provider;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_HIDDEN)) {
-			return getHiddenProvider(node);
-		}
-		if (type.equalsIgnoreCase(ICSSPropertyID.VAL_PASSWORD)) {
-			return getPasswordProvider(node);
-		}
-        return getTextInputProvider(node);
-	}
-
-	/**
-	 * 
-	 */
-	private void reset() {
-		if (_image != null) {
-			_image.dispose();
-			_image = null;
-		}
-	}
-
-	public void dispose() {
-		reset();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/Messages.java
deleted file mode 100644
index 63be108..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/Messages.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- * 
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.figurehandler.messages"; //$NON-NLS-1$
-	/**
-	 * see messages.properties
-	 */
-	public static String InputFigureHandler_Browse;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java
deleted file mode 100644
index 8dfeccd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class ObjectFigureHandler extends ImgFigureHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.ImgFigureHandler#initializeImage()
-	 */
-	protected void initializeImage(Element node) {
-		if (_image == null) {
-			_image = TagImageManager.getInstance().getSmallIconImage(null, "HTML", node.getTagName()); //$NON-NLS-1$
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/SelectFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/SelectFigureHandler.java
deleted file mode 100644
index 6876b54..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/SelectFigureHandler.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ComboWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ListWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-/*package*/ class SelectFigureHandler extends WidgetFigureHandler {
-
-	/**
-	 * @param node
-	 * @return the labels
-	 */
-	public String[] getOptionLabels(Element node) {
-		List options = DOMUtil.getChildElementsByTagIgnoreCase(node,
-				IHTMLConstants.TAG_OPTION);
-		String[] ret = new String[options.size()];
-		for (int i = 0; i < ret.length; i++) {
-			Element option = (Element) options.get(i);
-			ret[i] = DOMUtil.getTextElementValue(option);
-		}
-		return ret;
-	}
-
-	/**
-	 * @param node
-	 * @return the label
-	 */
-	public String getSelectedLabels(Element node) {
-		List options = DOMUtil.getChildElementsByTagIgnoreCase(node,
-				IHTMLConstants.TAG_OPTION);
-		String result = null;
-		for (int i = 0, n = options.size(); i < n; i++) {
-			Element option = (Element) options.get(i);
-			if (option.hasAttribute(IHTMLConstants.ATTR_SELECTED)) {
-				result = DOMUtil.getTextElementValue(option);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param node
-	 * @return true if is multiple
-	 */
-	private boolean isMultiple(Element node) {
-		return DOMUtil
-				.getAttributeIgnoreCase(node, ICSSPropertyID.VAL_MULTIPLE) != null;
-	}
-
-	/**
-	 * @return the provider
-	 */
-	protected final ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		String[] labels = getOptionLabels(node);
-		String rows = DOMUtil.getAttributeIgnoreCase(node,
-				IHTMLConstants.ATTR_SIZE);
-		int rowsInt = 0;
-		try {
-			if (rows != null) {
-				rowsInt = Integer.parseInt(rows);
-			}
-		} catch (Exception ex) {
-			// ignore
-		}
-		if (isMultiple(node) || rowsInt > 1) {
-			ListWidgetProvider provider = new ListWidgetProvider(
-					getCSSStyle(node));
-			provider.setOptions(labels);
-			provider.setRows(rowsInt);
-			return provider;
-		}
-        ComboWidgetProvider provider = new ComboWidgetProvider(
-        		getCSSStyle(node));
-        provider.setOptions(labels);
-        provider.setSelectedLabel(getSelectedLabels(node));
-        return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/TextareaFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/TextareaFigureHandler.java
deleted file mode 100644
index 8905538..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/TextareaFigureHandler.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.TextAreaWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TextareaFigureHandler extends WidgetFigureHandler {
-	protected ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		TextAreaWidgetProvider provider = new TextAreaWidgetProvider(
-				getCSSStyle(node));
-		String s = DOMUtil.getAttributeIgnoreCase(node, "cols"); //$NON-NLS-1$
-		if (s != null) {
-			try {
-				provider.setColumns(Integer.parseInt(s));
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		s = DOMUtil.getAttributeIgnoreCase(node, "rows"); //$NON-NLS-1$
-		if (s != null) {
-			try {
-				provider.setRows(Integer.parseInt(s));
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		s = DOMUtil.getTextElementValue(node);
-		if (s != null) {
-			provider.setValue(s);
-		}
-		return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java
deleted file mode 100644
index d2a3421..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSWidgetLayout;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.w3c.dom.Element;
-
-/**
- * A widget figure handler
- *
- */
-abstract class WidgetFigureHandler extends AbstractFigureHandler {
-
-	/**
-	 * default constructor
-	 */
-	public WidgetFigureHandler() {
-		super();
-	}
-
-	public void updateFigure(Element node, CSSFigure oldFigure) {
-		setCurrentFigure(oldFigure);
-		ICSSWidgetProvider provider = initializeWidgetProvider(node);
-		oldFigure.setCSSStyle(provider.getCSSStyle());
-		oldFigure
-				.setFixedLayoutManager(new CSSWidgetLayout(oldFigure, provider));
-	}
-
-	/**
-	 * @param ele
-	 * @return the widget provider
-	 */
-	protected abstract ICSSWidgetProvider initializeWidgetProvider(Element ele);
-
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/messages.properties
deleted file mode 100644
index 3c804bb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-InputFigureHandler_Browse=Browse...
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java
deleted file mode 100644
index 1ccd833..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import java.util.Collection;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.utils.BodyHelper;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * Clients should sub-class in order to create a new ITagCreationAdvisor type,
- * however, it is preferable to extend DefaultTagCreationAdvisor where possible.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractTagCreationAdvisor implements ITagCreationAdvisor 
-{
-    /**
-     * Information passed by the framework about the tag to be created
-     * {@link CreationData}
-     */
-    protected final CreationData  _creationData;
-
-    /**
-     * @param creationData
-     */
-    public AbstractTagCreationAdvisor(CreationData  creationData)
-    {
-        this._creationData = creationData;
-    }
-
-    /**
-     * @param model
-     * @param tagElement
-     */
-    public final void applyCustomization(IDOMModel model, Element tagElement)
-    {
-        ElementCustomizationCommand command = 
-            getElementCustomizationCommand(model, tagElement);
-        
-        if (command != null && command.canExecute())
-        {
-            command.execute();
-        }
-    }
-
-    /**
-     * @param model
-     * @param tagElement
-     * @return the customization command
-     */
-    protected abstract ElementCustomizationCommand getElementCustomizationCommand(IDOMModel model, Element tagElement);
-
-    /**
-     * Return position for tag after all necessary containers are created.  
-     * If necessary containers cannot be created and do not exist for any reason,
-     * implementer should return null
-     * to signal that the tag creation should not occur.
-     * 
-     * Clients may override this method to provide custom container positioning
-     * 
-     * @param model
-     * @param domPosition
-     * @return position after necessary containers are created
-     */
-    public final IDOMPosition checkAndApplyNecessaryContainers(
-            IDOMModel model, IDOMPosition domPosition) 
-    {
-        IDOMPosition position = DOMPositionHelper.splitText(domPosition);
-
-        position = BodyHelper.adjustInsertPosition
-            (_creationData.getUri(), _creationData.getTagName(), position);
-        
-        //position = getContainerCreationCommands(position);
-        ContainerCreationCommand command = getContainerCreationCommand(position);
-        
-        if (command != null)
-        {
-            command.execute();
-            Collection<IDOMPosition>  collection = command.getResult();
-            
-            if (collection.size()==1)
-            {
-                position = collection.iterator().next(); 
-            }
-            else
-            {
-                position = null;
-            }
-        }
-
-        if (position == null) {
-            // user cancelled
-            return null;
-        }
-
-        // because the next call of getPrefix() may insert new taglib node
-        // into the document, if we use the normal
-        // DOMPositin which use index, maybe it will be invalidated by the
-        // new taglib node. So use RefPosition here.
-        return DOMPositionHelper.toDOMRefPosition(position);
-    }
-
-    /**
-     * @param position
-     * @return a command (could be CompoundCommand or chained command) that when executed
-     * will add any necessary containers.
-     */
-    protected abstract ContainerCreationCommand getContainerCreationCommand(IDOMPosition position);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreator.java
deleted file mode 100644
index a334781..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreator.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * The abstract class from which all client ITagCreator instances
- * should be derived.
- * 
- * The createTag method enforces a set of steps required by the framework
- * to create a new tag.  However, it allows you to configure some of the steps
- * by providing an ITagCreationAdvisor through the doSelectCreationAdvisor.
- *
- * <p><b>Provisional API - subject to change</b></p>
- *
- * @author cbateman
- *
- */
-public abstract class AbstractTagCreator implements ITagCreator 
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.ITagCreator#createTag(org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry, org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel, org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-     */
-    public final Element createTag(final CreationData creationData) 
-    {
-        final ITagCreationAdvisor  advisor = selectCreationAdvisor(creationData);
-        
-        // adjust the creation position to accommodate required containers
-        final IDOMPosition position = 
-            advisor.checkAndApplyNecessaryContainers(creationData.getModel(), creationData.getDomPosition());
-        
-        if (position == null) return null;//throw exception?
-
-        creationData.setAdjustedPosition(position);
-        
-        // create the element
-        final Element ele =  createElement(creationData);
-        if (ele == null) return null;//throw exception?
-
-        // apply tag customization
-        advisor.applyCustomization(creationData.getModel(), ele);
-
-        // ensure that any attributes required by the tag's definition
-        // is initialized.
-        // TODO: a drawback of this approach is that it leaves the tag in
-        // a state where there are no error flags to tell the user something is
-        // missing, but may initialize the tag with an (empty) invalid value
-        //ensureRequiredAttrs(ele, creationData);
-
-        addTagToContainer(position, ele);
-
-        return ele;
-    }
-
-    private ITagCreationAdvisor selectCreationAdvisor(CreationData creationData)
-    {
-        ITagCreationAdvisor advisor  = doSelectCreationAdvisor(creationData);
-
-        // enforce that the advisor must be an AbstractTagCreationAdvisor to 
-        // avoid using the default (not this case also covers advisor == null)
-        if (! (advisor instanceof AbstractTagCreationAdvisor))
-        {
-            advisor = new DefaultTagCreationAdvisor(creationData);
-        }
-
-        return advisor;
-    }
-    
-    /**
-     * @param creationData
-     * @return a tag creation advisor or null to indicate the use of the system default
-     */
-    protected abstract ITagCreationAdvisor doSelectCreationAdvisor(CreationData creationData);
-
-    /**
-     * @param creationData 
-     * @return {@link Element}
-     */
-    protected final Element createElement(final CreationData creationData)
-    {
-        Element ele =  creationData.getModel().getDocument().createElement(creationData.getTagName());
-        if (ele == null) return null;
-
-        //ugly... fix me
-        
-        // TODO: move this into an ensure method?
-        // XXX: we are using "startsWith("directive.")" to test whether
-        // should setJSPTag, this
-        // maybe is not the best way. Need check whether SSE have special
-        // API for it.
-        if (ITLDConstants.URI_JSP.equals(creationData.getUri())
-                && (ele.getLocalName().startsWith("directive.") //$NON-NLS-1$
-                        || "declaration".equals(ele.getLocalName()) //$NON-NLS-1$
-                        || "expression".equals(ele.getLocalName()) || "scriptlet" //$NON-NLS-1$ //$NON-NLS-2$
-                        .equals(ele.getLocalName()))) {
-            // it is a jsp tag
-            ((IDOMElement) ele).setJSPTag(true);
-        }
-
-        if (creationData.getPrefix() != null)
-        {
-            ele.setPrefix(creationData.getPrefix());
-        }
-
-        return ele;
-    }
-
-    /**
-     * @param position
-     * @param tagElement
-     */
-    private void addTagToContainer(final IDOMPosition position, final Element tagElement) {
-        if (position == null || position.getContainerNode() == null) {
-            return;
-        }
-
-        if (position.getNextSiblingNode() == null) {
-            position.getContainerNode().appendChild(tagElement);
-        } else {
-            position.getContainerNode().insertBefore(tagElement,
-                    position.getNextSiblingNode());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java
deleted file mode 100644
index 5669ea9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * Value object that wraps creation data
- *  
- * <p><b>Provisional API - subject to change</b></p>
- *  
- * @author cbateman
- *
- */
-public final class CreationData
-{
-    private final ITagDropSourceData  _creationProvider;
-    private final String                _prefix; 
-    private final IDOMPosition          _domPosition;
-    private final IDOMModel             _model;
-    private final IAdaptable            _customizationData;
-
-    private TagIdentifier               _tagId; // = null; lazy init on creation 
-    
-    /**
-     * The tag {@link Entity} being created
-     */
-    private Entity _tagEntity; // = null; lazy load because derived from
-                               // potentially expensive meta-data search
-    
-    /**
-     * The {@link ITaglibDomainMetaDataModelContext} for the tag creation
-     */
-    private final ITaglibDomainMetaDataModelContext _taglibMetaDataContext;
-
-    // mutable because it may be changed from the original _domPosition
-    private IDOMPosition _adjustedPosition;
-
-    
-    /**
-     * @param creationProvider 
-     * @param model 
-     * @param domPosition 
-     * @param taglibMetaDataContext 
-     * @param customizationData 
-     */
-    public CreationData(final ITagDropSourceData creationProvider,
-            final IDOMModel model, final IDOMPosition domPosition,
-            final ITaglibDomainMetaDataModelContext taglibMetaDataContext,
-            final IAdaptable customizationData)
-    {
-        super();
-        this._creationProvider = creationProvider;
-        this._taglibMetaDataContext = taglibMetaDataContext;
-        this._domPosition = domPosition;
-        this._adjustedPosition = _domPosition;
-        this._model = model;
-        this._customizationData = customizationData; 
-        this._prefix = getPrefix(getUri(), model, getDefaultPrefix());
-    }
-
-    /**
-     * Returns the ns prefix for the tag and also creates taglib reference if necessary
-     * @param uri
-     * @param model
-     * @param suggested
-     * @return prefix to use
-     */
-    protected static String getPrefix(String uri, IDOMModel model,
-            String suggested) {
-        // TODO: this shouldn't really add to the document
-        if (uri==null || ITLDConstants.URI_HTML.equalsIgnoreCase(uri)
-                || ITLDConstants.URI_JSP.equalsIgnoreCase(uri)
-                || CMDocType.JSP11_DOC_TYPE.equalsIgnoreCase(uri)) {
-            return null;
-        }
-
-        // now handles custom tag lib
-        return JSPUtil.getOrCreatePrefix(model, uri, suggested);
-    }
-    
-    /**
-     * @return the tag identifier uri
-     */
-    public String getUri() {
-       	ITagDropOverrider overrider = getTagDropOverrider();
-    	if (overrider != null && overrider.getUriOverride() != null)
-    		 return overrider.getUriOverride();
-    	
-        return _creationProvider.getNamespace();
-    }
-
-    /**
-     * @return the default prefix
-     */
-    public String getDefaultPrefix() {
-    	ITagDropOverrider overrider = getTagDropOverrider();
-    	if (overrider != null && overrider.getDefaultPrefixOverride() != null)
-    		 return overrider.getDefaultPrefixOverride();
-    	    	
-        return _creationProvider.getDefaultPrefix();
-    }
-
-    private ITagDropOverrider getTagDropOverrider() {
-    	if (getDropCustomizationData() != null
-    			&& getDropCustomizationData()
-    				.getAdapter(ITagDropOverrider.class) != null) {
-    		
-    		 return (ITagDropOverrider)getDropCustomizationData()
-    		 		.getAdapter(ITagDropOverrider.class);
-    	}
-    	return null;
-    }
-    /**
-     * @return the local prefix for the  tag
-     */
-    public String getPrefix() {
-        return _prefix;
-    }
-
-    /**
-     * @return the tag name
-     */
-    public String getTagName() {
-    	ITagDropOverrider overrider = getTagDropOverrider();
-    	if (overrider != null && overrider.getTagNameOverride() != null)
-    		 return overrider.getTagNameOverride();
-    	
-        return _creationProvider.getTagName();
-    }
-
-    /**
-     * @return the creation provider
-     */
-    public ITagDropSourceData getTagCreationProvider()
-    {
-        return _creationProvider;
-    }
-
-    /**
-     * @return the {@link Entity} for this tag element being created
-     */
-    public Entity getTagEntity() {
-        if (_tagEntity == null){
-            _tagEntity = TaglibDomainMetaDataQueryHelper.getEntity(_taglibMetaDataContext, getTagName());
-            
-        }
-        return _tagEntity;
-    }
-    
-    /**
-     * @return flag indicating that html form container ancestor is required
-     */
-    public boolean isHTMLFormRequired() {
-        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(getTagEntity(), "requires-html-form"); //$NON-NLS-1$
-        if (t != null)
-            return TraitValueHelper.getValueAsBoolean(t);
-        
-        return false;
-    }
-    
-    /**
-     * @return flag indicating that jsf component
-     */
-    public boolean isJSFComponent() {      
-        Model model = TaglibDomainMetaDataQueryHelper.getModel(_taglibMetaDataContext);
-        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(model, "is-jsf-component-library"); //$NON-NLS-1$
-        if (t != null)
-            return TraitValueHelper.getValueAsBoolean(t);
-        
-        return false;
-    }
-
-	/**
-	 * @return flag indicating that jsf view container ancestor is required
-	 */
-	public boolean isJSFViewTagRequired() {
-		return JSPUtil.isJSPModel(_model);		
-	}
-	
-    /**
-     * @return the metadata context for the tag
-     */
-    public ITaglibDomainMetaDataModelContext getTaglibMetaDataContext() {
-        return _taglibMetaDataContext;
-    }
-
-    /**
-     * @return the original dom position of the tag creation
-     */
-    public IDOMPosition getDomPosition() {
-        return _domPosition;
-    }
-
-    /**
-     * @return the dom model
-     */
-    public IDOMModel getModel() 
-    {
-        return _model;
-    }
-
-    /**
-     * @return the adjusted position (calculated to account for containers etc.)
-     */
-    public IDOMPosition getAdjustedPosition() {
-        return _adjustedPosition;
-    }
-
-    /**
-     * @param adjustedPosition
-     */
-    /*package*/ void setAdjustedPosition(IDOMPosition adjustedPosition) {
-        _adjustedPosition = adjustedPosition;
-    }
-
-    /**
-     * @return the TagIdentifer for the tag to be created
-     */
-    public TagIdentifier getTagId() 
-    {
-        if (_tagId == null)
-        {
-            _tagId = TagIdentifierFactory.createJSPTagWrapper(getUri(), getTagName());
-        }
-        return _tagId;
-    }
-
-    /**
-     * @return the customization data passed in from the tool.  May be null.
-     */
-    public IAdaptable getDropCustomizationData() {
-        return _customizationData;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java
deleted file mode 100644
index a0b0d89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.SingletonContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.TagContainerCreationCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * The default advisor.
- * 
- * Clients may extend this class.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class DefaultTagCreationAdvisor extends AbstractTagCreationAdvisor 
-{
-    /**
-     * @param creationData
-     */
-    public DefaultTagCreationAdvisor(CreationData creationData) 
-    {
-        super(creationData);
-    }
-
-    
-    @Override
-    protected ElementCustomizationCommand getElementCustomizationCommand(
-            IDOMModel model, Element tagElement) {
-        return new ElementCustomizationCommand(model, tagElement, _creationData);
-    }
-
-    /**
-     * @param position the initial drop position
-     * @return position after creating required containers
-     */
-    protected ContainerCreationCommand getContainerCreationCommand(final IDOMPosition position) {
-    	if (_creationData.isJSFComponent()) {
-            return getJSFContainerCommand(position);
-        }
-        else if (!(_creationData.isJSFComponent()) && _creationData.isHTMLFormRequired()){
-            return getHtmlFormCommand(position);
-        }        
-        return null;
-    }
-
-	/**
-     * @param position
-     * @return the default container creation command for a JSF tag
-     */
-    protected ContainerCreationCommand getJSFContainerCommand(final IDOMPosition position)
-    {
-        ContainerCreationCommand command = null; 
-        	
-        if (_creationData.isJSFViewTagRequired())
-            command = new SingletonContainerCreationCommand(position, IJSFConstants.TAG_IDENTIFIER_VIEW, _creationData.getTagId());
-        
-        if (_creationData.isHTMLFormRequired())
-        {
-        	final ContainerCreationCommand htmlFormCommand = new TagContainerCreationCommand(position, IJSFConstants.TAG_IDENTIFIER_FORM, _creationData.getTagId());
-        	if (command != null)
-        		command.chain(htmlFormCommand);
-        	else
-        		command = htmlFormCommand;
-        }
-        
-        return command;
-    }
-    
-    /**
-     * @param position
-     * @return the default container creation command for an HTML form tag
-     */
-    protected ContainerCreationCommand getHtmlFormCommand(final IDOMPosition position)
-    {
-        return new TagContainerCreationCommand(position, IHTMLConstants.TAG_IDENTIFIER_HTML_FORM, _creationData.getTagId());
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java
deleted file mode 100644
index 97e19c4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * An advisor object that allows customization of tag creation in an ITagCreator
- * 
- * Clients should *not* implement this interface.  Extend AbstractTagCreationAdvisor
- * or DefaultTagCreationAdvisor instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface ITagCreationAdvisor
-{
-    /**
-     * @param model
-     * @param domPosition
-     * @return a new IDOMPosition adjust for required containers or domPosition
-     * if no adjust is required.  ???May return null???
-     */
-    IDOMPosition checkAndApplyNecessaryContainers(IDOMModel model,
-            IDOMPosition domPosition);
-
-    /**
-     * Apply customization to tagElement.  May use to modify
-     * attributes and child elements of the tag.
-     * 
-     * @param model
-     * @param tagElement
-     * @param tagToolItem
-     */
-    void applyCustomization(IDOMModel model, Element tagElement);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java
deleted file mode 100644
index c8d56e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.w3c.dom.Element;
-
-/**
- * The interface type of all tag creators.
- * 
- * Clients should *not* implement this interface.  Extend AbstractTagCreator instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface ITagCreator {
-	/**
-	 * @param creationData 
-	 * @return W3C Element for the  tag at the correct position in the DOM.   May be null if creation cannot occur.
-	 */
-	public Element createTag(final CreationData creationData);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagDropOverrider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagDropOverrider.java
deleted file mode 100644
index 12a24bb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagDropOverrider.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-/**
- * Used to override the data used in a tag drop in the CreateItemCommand
- * <p>
- * This is NOT API.  Clients should not use this interface as it may change in the future.
- */
-public interface ITagDropOverrider
-{
-
-    /**
-     * The default overrider
-     *
-     */
-    static class DefaultTagDropOverrider implements ITagDropOverrider
-    {
-        private final String _tagNameOverrride;
-        private final String _uriOverride;
-        private final String _defaultPrefixOverride;
-        
-        public DefaultTagDropOverrider(final String uriOverride, final String tagNameOverride, final String defaultPrefixOverride)
-        {
-            super();
-            _tagNameOverrride = tagNameOverride;
-            _uriOverride = uriOverride;
-            _defaultPrefixOverride = defaultPrefixOverride;
-        }
-
-        public String getTagNameOverride()
-        {
-            return _tagNameOverrride;
-        }
-
-        public String getUriOverride()
-        {
-            return _uriOverride;
-        }
-        
-        public String getDefaultPrefixOverride()
-        {
-            return _defaultPrefixOverride;
-        }
-        
-    }
-    /**
-     * @return the new uri to use or null if shouldn't override
-     */
-    String getUriOverride();
-
-    /**
-     * @return the new tag name or null if shouldn't override
-     */
-    String getTagNameOverride();
-    
-    /**
-     * @return the new default prefix or null if shouldn't override
-     */
-    String getDefaultPrefixOverride();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java
deleted file mode 100644
index 42c3656..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class ItemCreationEditPolicy extends DropEditPolicy 
-{
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof ItemCreationRequest) {
-			ItemCreationRequest r = (ItemCreationRequest) request;
-			DesignPosition position = findPosition((ItemCreationRequest)request);
-            
-			if (position == null) {
-				return null;
-			}
-            IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position);
-			if (domposition == null) {
-				return null;
-			}
-//			TagToolCreationAdapter tagToolCreationAdapter = new TagToolCreationAdapter(r.getTagToolPaletteEntry(), getViewer(getHost()).getModel());
-			return new CreateItemCommand(
-					PDPlugin
-							.getResourceString("ItemCreationEditPolicy.CommandLabel.CreateItem"),//$NON-NLS-1$
-					getViewer(getHost()).getModel(), domposition, r.getTagCreationProvider());
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof ItemCreationRequest) {
-			DesignPosition position = findPosition((ItemCreationRequest)request);
-
-			if (position == null) {
-				return null;
-			}
-
-			EditPart container = position.getContainerPart();
-			return container;
-		}
-		return null;
-	}
-
-	/**
-	 * @param host
-	 * @return the graphical viewer
-	 */
-	protected IHTMLGraphicalViewer getViewer(EditPart host) {
-		return (IHTMLGraphicalViewer) ((GraphicalEditPart) host).getViewer();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) 
-    {
-        if (request instanceof DropRequest 
-                && request.getType() == ItemCreationRequest.REQ_ITEM_CREATION)
-        {
-            super.showTargetFeedback(request);
-            if (getHost() instanceof GraphicalEditPart) {
-                ExposeHelper exposeHelper = new ExposeHelper(
-                        getViewer(getHost()));
-                exposeHelper.adjustVertical(((DropRequest)request).getLocation());
-            }
-        }
-	}
-
-	protected DesignPosition findPosition(DropRequest request) {
-        final IPositionMediator mediator = getDropChildValidator(request);
-        if (mediator == null)
-        {
-            return null;
-        }
-        
-        final IDropLocationStrategy dropStrategy = createDropLocationStrategy(request);
-        final DesignPosition position = 
-            dropStrategy.calculateDesignPosition(getHost(), request.getLocation(), mediator);
-        
-        // verify that the drop strategy has honoured it's contract that our
-        // mediator be respected
-        if (position != null)
-        {
-            if (!mediator.isValidPosition(position))
-            {
-                // if our mediator says no go, then veto the requestor
-                // there is no drop location
-                return null;
-            }
-        }
-        return position;
-    }
-
-    protected final IPositionMediator createDefaultDropChildValidator(DropData data) {
-        return new DnDPositionValidator(new DropActionData(
-                ActionData.PALETTE_DND, data));    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java
deleted file mode 100644
index 317c243..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-
-/**
- * Tag tool item creation request class
- * 
- * @author mengbo
- */
-public class ItemCreationRequest extends Request implements DropRequest {
-	/**
-	 * Constant used for item creation request
-	 */
-	public static final String REQ_ITEM_CREATION = "Item Creation"; //$NON-NLS-1$
-	/**
-	 * Constant used for tag tool item
-	 */
-	private static final String DROP_SOURCE_DATA = "TagToolPaletteEntry"; //$NON-NLS-1$
-	/**
-	 * Constant used for location during creation request
-	 */
-	public static final String LOCATION = "location"; //$NON-NLS-1$
-	
-
-	/**
-	 * Constructor
-	 */
-	public ItemCreationRequest() {
-		super(REQ_ITEM_CREATION);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.DropRequest#getLocation()
-	 */
-	public Point getLocation() {
-		return (Point)getExtendedData().get(LOCATION);
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		getExtendedData().remove(LOCATION);
-		getExtendedData().put(LOCATION, location);
-	}
-
-	/**
-	 * Set the tag tool item for creation request
-	 * @param creationProvider
-	 */
-	public void setTagCreationProvider(final IDropSourceData creationProvider) {
-		getExtendedData().remove(DROP_SOURCE_DATA);
-		getExtendedData().put(DROP_SOURCE_DATA, creationProvider);
-	}
-
-	/**
-	 * @return {@link ITagDropSourceData} requesting creation
-	 */
-	public IDropSourceData getTagCreationProvider() {
-		return (IDropSourceData)getExtendedData().get(DROP_SOURCE_DATA);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java
deleted file mode 100644
index 22ef94a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.tools.TargetingTool;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.DropCustomizationController;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * This Tool is used to create items. It is to replace the default CreationTool
- * of GEF. We are not using CreationToolEntry for creating item, since the
- * default GEF implementation require creating of the object before drop into
- * the view. We do not want to create the XML element (and possibly its taglib
- * declaration) before the drop is really performed.)
- * 
- * @author mengbo
- */
-public class ItemCreationTool extends TargetingTool {
-    private final ITagDropSourceData _tagDropSourceData; //can we get rid of this?
-
-	/**
-	 * Default constructor. Sets the default and disabled cursors.
-	 * @param tagDropSourceData 
-	 */
-	public ItemCreationTool(ITagDropSourceData tagDropSourceData) {
-		setDefaultCursor(SharedCursors.CURSOR_TREE_ADD);
-		setDisabledCursor(SharedCursors.NO);
-
-		this._tagDropSourceData = tagDropSourceData;  
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#calculateCursor()
-	 */
-	protected Cursor calculateCursor() {
-		/*
-		 * Fix for Bug# 66010 The following two lines of code were added for the
-		 * case where a tool is activated via the keyboard (that code hasn't
-		 * been released yet). However, they were causing a problem as described
-		 * in 66010. Since the keyboard activation code is not being released
-		 * for 3.0, the following lines are being commented out.
-		 */
-		// if (isInState(STATE_INITIAL))
-		// return getDefaultCursor();
-		return super.calculateCursor();
-	}
-
-	/**
-	 * Creates a {@link ItemCreationRequest}and sets this tool's factory on the
-	 * request.
-	 * 
-	 * @see org.eclipse.gef.tools.TargetingTool#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		ItemCreationRequest request = new ItemCreationRequest();
-		request.setTagCreationProvider(_tagDropSourceData);
-		return request;
-	}
-
-	/**
-	 * @see org.eclipse.gef.Tool#deactivate()
-	 */
-	public void deactivate() {
-		super.deactivate();
-		// TODO: never read helper = null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getCommandName()
-	 */
-	protected String getCommandName() {
-		return ItemCreationRequest.REQ_ITEM_CREATION;
-	}
-
-	/**
-	 * Cast the target request to a CreateRequest and returns it.
-	 * 
-	 * @return the target request as a CreateRequest
-	 * @see TargetingTool#getTargetRequest()
-	 */
-	protected ItemCreationRequest getCreateRequest() {
-		return (ItemCreationRequest) getTargetRequest();
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getDebugName()
-	 */
-	protected String getDebugName() {
-		return "Item Creation Tool";//$NON-NLS-1$
-	}
-
-	/**
-	 * The creation tool only works by clicking mouse button 1 (the left mouse
-	 * button in a right-handed world). If any other button is pressed, the tool
-	 * goes into an invalid state. Otherwise, it goes into the drag state,
-	 * updates the request's location and calls
-	 * {@link TargetingTool#lockTargetEditPart(org.eclipse.gef.EditPart)}with the edit part
-	 * that was just clicked on.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		if (button != 1) {
-			setState(STATE_INVALID);
-			handleInvalidInput();
-			return true;
-		}
-		if (stateTransition(STATE_INITIAL, STATE_DRAG)) {
-			if (getTargetEditPart() != null) {
-				getCreateRequest().setLocation(getLocation());
-				lockTargetEditPart(getTargetEditPart());
-				// Snap only when size on drop is employed
-				// TODO: never read helper = (SnapToHelper) getTargetEditPart().getAdapter(
-				//SnapToHelper.class);
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * If the tool is currently in a drag or drag-in-progress state, it goes
-	 * into the terminal state, performs some cleanup (erasing feedback,
-	 * unlocking target edit part), and then calls {@link #performCreation(int)}.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonUp(int)
-	 */
-	protected boolean handleButtonUp(int button) 
-	{
-		if (stateTransition(STATE_DRAG | STATE_DRAG_IN_PROGRESS, STATE_TERMINAL)) 
-		{
-			eraseTargetFeedback();
-			unlockTargetEditPart();
-			
-			// customizer may cancel the drop
-			customizeDropAndMaybeExecute(button);
-		}
-		
-		setState(STATE_TERMINAL);
-		handleFinished();
-
-		return true;
-	}
-
-	/**
-     * @param button
-     */
-    protected void customizeDropAndMaybeExecute(final int button)
-    {
-        Command command = getCurrentCommand();
-
-        IStatus status = Status.OK_STATUS;
-        if (command instanceof CreateItemCommand)
-        {
-            status = new DropCustomizationController((CreateItemCommand) command,
-                    _tagDropSourceData, 
-                    ((CreateItemCommand)command).getDocument(),
-                    ((CreateItemCommand)command).getPosition()).
-                performCustomization();
-        }
-
-        if (status.getSeverity() == IStatus.OK)
-        {
-            performCreation(button);
-        }
-    }
-
-
-    /**
-	 * Updates the request, sets the current command, and asks to show feedback.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragInProgress()
-	 */
-	protected boolean handleDragInProgress() {
-		if (isInState(STATE_DRAG_IN_PROGRESS)) {
-			updateTargetRequest();
-			setCurrentCommand(getCommand());
-			showTargetFeedback();
-		}
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragStarted()
-	 */
-	protected boolean handleDragStarted() {
-		return stateTransition(STATE_DRAG, STATE_DRAG_IN_PROGRESS);
-	}
-
-	/**
-	 * If the user is in the middle of creating a new edit part, the tool erases
-	 * feedback and goes into the invalid state when focus is lost.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleFocusLost()
-	 */
-	protected boolean handleFocusLost() {
-		if (isInState(STATE_DRAG | STATE_DRAG_IN_PROGRESS)) {
-			eraseTargetFeedback();
-			setState(STATE_INVALID);
-			handleFinished();
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.TargetingTool#handleHover()
-	 */
-	protected boolean handleHover() {
-		if (isInState(STATE_INITIAL))
-			updateAutoexposeHelper();
-		return true;
-	}
-
-	/**
-	 * Updates the request and mouse target, gets the current command and asks
-	 * to show feedback.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleMove()
-	 */
-	protected boolean handleMove() {
-		updateTargetRequest();
-		updateTargetUnderMouse();
-		setCurrentCommand(getCommand());
-		showTargetFeedback();
-		return true;
-	}
-
-	/**
-	 * Executes the current command and selects the newly created object. The
-	 * button that was released to cause this creation is passed in, but since
-	 * {@link #handleButtonDown(int)}goes into the invalid state if the button
-	 * pressed is not button 1, this will always be button 1.
-	 * 
-	 * @param button
-	 *            the button that was pressed
-	 */
-	protected void performCreation(int button) {
-		executeCurrentCommand();
-		// selectAddedObject();
-	}
-
-	// /*
-	// * Add the newly created object to the viewer's selected objects.
-	// */
-	// private void selectAddedObject() {
-	// final Object model = getCreateRequest().getNewObject();
-	// if (model == null)
-	// return;
-	// EditPartViewer viewer = getCurrentViewer();
-	// Object editpart = viewer.getEditPartRegistry().get(model);
-	// if (editpart instanceof EditPart) {
-	// viewer.flush();
-	// viewer.select((EditPart)editpart);
-	// }
-	// }
-
-	/**
-	 * Sets the location (and size if the user is performing size-on-drop) of
-	 * the request.
-	 * 
-	 * @see org.eclipse.gef.tools.TargetingTool#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		ItemCreationRequest req = getCreateRequest();
-		req.setLocation(getLocation());
-		// if (isInState(STATE_DRAG_IN_PROGRESS)) {
-		// Point loq = getStartLocation();
-		// req.setLocation(bounds.getLocation());
-		// req.getExtendedData().clear();
-		// if (!getCurrentInput().isAltKeyDown() && helper != null) {
-		// PrecisionRectangle baseRect = new PrecisionRectangle(bounds);
-		// PrecisionRectangle result = baseRect.getPreciseCopy();
-		// helper.snapRectangle(req, PositionConstants.NSEW,
-		// baseRect, result);
-		// req.setLocation(result.getLocation());
-		// req.setSize(result.getSize());
-		// }
-		// } else {
-		// req.setLocation(getLocation());
-		// }
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/UserCustomizedTagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/UserCustomizedTagCreationAdvisor.java
deleted file mode 100644
index 3ff7ad0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/UserCustomizedTagCreationAdvisor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.UserCustomizedContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.UserCustomizedElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.ParentData;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * Tag creation advisor that returns a new ElementCustomizationCommand
- * subclass that will perform customization of attributes, child tags and parent tags 
- * 
- * @author prusev
- * @author Debajit Adhikary
- */
-public class UserCustomizedTagCreationAdvisor extends DefaultTagCreationAdvisor {
-
-    /**
-     * Default
-     * @param creationData
-     */
-    public UserCustomizedTagCreationAdvisor(CreationData creationData) {
-        super(creationData);
-    }
-
-    /**
-     * @param model
-     * @param tagElement
-     * @return
-     * 
-     * Gives back the new command class.
-     */
-    protected ElementCustomizationCommand getElementCustomizationCommand(
-            IDOMModel model, Element tagElement) {
-        return new UserCustomizedElementCustomizationCommand(model, tagElement, _creationData);
-    }
-
-    
-    /** 
-     * Performs parent tag customization for the dropped tag. Chains any
-     * required container creation commands to ensure that the required parents
-     * are created.
-     * 
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.itemcreation.DefaultTagCreationAdvisor#getContainerCreationCommand (org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-     * 
-     */
-    @Override
-    protected ContainerCreationCommand getContainerCreationCommand(IDOMPosition position)
-    {
-        final IAdaptable adaptable = _creationData.getDropCustomizationData();
-        if (adaptable != null)
-        {
-            final ICustomizationData data = (ICustomizationData) adaptable.getAdapter(ICustomizationData.class);
-            ContainerCreationCommand command = null;
-            ParentData parentData = data.getParentData();
-            
-            boolean isFirstParent = true;
-            for (final ICustomizationData parentCustomizationData : parentData.getParentCustomizationData())
-            {
-                TagIdentifier parentTagIdentifier = parentCustomizationData.getTagIdentifier();
-                
-                if (isFirstParent) 
-                {
-                    command = new UserCustomizedContainerCreationCommand(position, parentTagIdentifier, _creationData.getTagId(), parentCustomizationData);
-                    isFirstParent = false;
-                }
-                else
-                {
-                    command.chain(new UserCustomizedContainerCreationCommand(position, parentTagIdentifier, _creationData.getTagId(), parentCustomizationData));
-                }
-            }
-            return command;
-        } 
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java
deleted file mode 100644
index c7db6e3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand;
-
-/**
- * Command for creating containers.
- * 
- *  * <p><b>Provisional API - subject to change</b></p>
- *  
- *  Clients may sub-class, but is preferable to use {@link SingletonContainerCreationCommand}
- *  or {@link TagContainerCreationCommand} instead.
- *  
- * @author cbateman
- *
- */
-public abstract class ContainerCreationCommand extends AbstractCreationCommand 
-{
-    private final IDOMPosition          _originalDomPosition;
-    private final TagIdentifier         _containerTag;
-    private final TagIdentifier         _tagBeingCreated;
-    private IDOMPosition                _domPosition;
-    private ContainerCreationCommand    _nextCommand = null;
-    
-    /**
-     * @param domPosition
-     * @param containerTag
-     */
-    /*package*/ ContainerCreationCommand(IDOMPosition domPosition, TagIdentifier containerTag, TagIdentifier tagBeingCreated)
-    {
-        _domPosition = domPosition;
-        _originalDomPosition = domPosition;
-        _containerTag = containerTag;
-        _tagBeingCreated = tagBeingCreated;
-    }
-    
-    @Override
-    public final void execute() 
-    {
-        _domPosition = doExecute();
-        
-        if (_nextCommand != null)
-        {
-            _nextCommand.setDomPosition(_domPosition);
-            _nextCommand.execute();
-            // update the dom position
-            _domPosition = _nextCommand.getDomPosition();
-        }
-    }
-
-    @Override
-    public final Collection<IDOMPosition> getResult() 
-    {
-        return Collections.singletonList(_domPosition);
-    }
-
-    /**
-     * @return the new dom position after the container insert
-     */
-    protected abstract IDOMPosition doExecute();
-
-    @Override
-    public final ContainerCreationCommand chain(Command command) 
-    {
-        if (!(command instanceof ContainerCreationCommand))
-        {
-            throw new IllegalArgumentException("Can only chain ContainerCreationCommand's"); //$NON-NLS-1$
-        }
-        
-        if (_nextCommand == null)
-        {
-            _nextCommand = (ContainerCreationCommand) command;
-        }
-        else
-        {
-            _nextCommand.chain(command);
-        }
-        
-        return this;
-    }
-
-    /**
-     * Update the domPosition
-     * 
-     * @param domPosition
-     */
-    public final void setDomPosition(final IDOMPosition domPosition)
-    {
-        if (_domPosition.getContainerNode().getOwnerDocument() == 
-                domPosition.getContainerNode().getOwnerDocument())
-        {
-            _domPosition = domPosition;
-        }
-        else
-        {
-            // if not in same document, then error
-            throw new IllegalArgumentException("New domPosition must be in same document as old domPosition"); //$NON-NLS-1$
-        }
-    }
-
-    /**
-     * @return the dom position
-     */
-    protected final IDOMPosition getDomPosition() {
-        return _domPosition;
-    }
-
-    /**
-     * @return the original dom position that this container creation command
-     * was created with.
-     */
-    protected final IDOMPosition getOriginalDomPosition() {
-        return _originalDomPosition;
-    }
-
-    /**
-     * @return the container tag to be created
-     */
-    protected final TagIdentifier getContainerTag() {
-        return _containerTag;
-    }
-
-    /**
-     * @return the tag that is being created for which we are adding the container
-     */
-    protected final TagIdentifier getTagBeingCreated() {
-        return _tagBeingCreated;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java
deleted file mode 100644
index 34b8ce1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.MetadataTagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolCreationAdapter;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteElementTemplateHelper;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * A command to customize a new tag element
- * <p>
- * <b>Provisional API - subject to change</b>
- * </p>
- * 
- * Clients may sub-class.
- * 
- * @author cbateman
- * 
- */
-public class ElementCustomizationCommand extends AbstractCreationCommand
-{
-    /**
-     * the dom model where the element will be added
-     */
-    protected final IDOMModel _model;
-    /**
-     * the element to be customized
-     */
-    protected final Element _element;
-    /**
-     * the creation data for the new tag
-     */
-    protected final CreationData _creationData;
-
-    /**
-     * @param model
-     * @param element
-     * @param creationData
-     */
-    public ElementCustomizationCommand(final IDOMModel model,
-            final Element element, final CreationData creationData)
-    {
-        _model = model;
-        _element = element;
-        _creationData = creationData;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand#execute()
-     */
-    @Override
-    public void execute()
-    {
-        applyChildElementCustomization();
-        applyAttributeCustomization();
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand#prepare()
-     */
-    @Override
-    protected boolean prepare()
-    {
-        // do nothing by default; return true to indicate can execute
-        return true;
-    }
-
-    /**
-     * Override to customize the children of the tag being created
-     * 
-     * Default implementation uses meta-data to load a template. This is the
-     * prefered method for static child values (i.e. those that are not
-     * calculated dynamically at runtime).
-     */
-    protected void applyChildElementCustomization()
-    {
-        final ITagDropSourceData tagDropSourceData = 
-            _creationData.getTagCreationProvider();
-        if (tagDropSourceData != null)
-        {
-            MetadataTagDropSourceData provider =
-                TagToolCreationAdapter.createMdTagCreationProvider(tagDropSourceData, _model);
-            PaletteElementTemplateHelper.applyTemplate(_model, _element,
-                    provider);
-        }
-    }
-
-    /**
-     * Add required attributes and default values, if set, to the created tag
-     * element
-     * 
-     * To customize the attributes that get added, use TagCreationInfo metadata
-     * 
-     * This method is provided as a utility for clients. It is not used by
-     * default
-     * 
-     * @param element
-     * @param creationData
-     */
-    @SuppressWarnings("deprecation")
-    protected final void ensureRequiredAttrs(final Element element,
-            final CreationData creationData)
-    {
-        final CMElementDeclaration ed = CMUtil.getTLDElementDeclaration(creationData
-                .getUri(), creationData.getTagName(), creationData.getModel()
-                .getDocument().getStructuredDocument());
-
-        if (ed != null)
-        {
-            for (final Iterator it = ed.getAttributes().iterator(); it.hasNext();)
-            {
-                final CMAttributeDeclaration attr = (CMAttributeDeclaration) it
-                        .next();
-                if (attr.getUsage() == CMAttributeDeclaration.REQUIRED
-                        && element.getAttribute(attr.getAttrName()) == null)
-                {
-                    element.setAttribute(attr.getAttrName(), attr
-                            .getDefaultValue());
-                }
-            }
-        }
-    }
-
-    /**
-     * Override to customize the attributes of the tag being created
-     * 
-     * Default implementation uses meta-data to set the attribut values. This is
-     * the prefered method for static attribute values (i.e. those that are not
-     * calculated dynamically at runtime).
-     * 
-     */
-    protected void applyAttributeCustomization()
-    {
-        final ITagDropSourceData info = _creationData.getTagCreationProvider();
-        if (info != null)
-        {
-            final MetadataTagDropSourceData provider =
-                TagToolCreationAdapter.createMdTagCreationProvider(info, _model);
-            final List<TagCreationAttribute> list = provider.getAttributes();
-            if (list != null)
-            {
-                for (final TagCreationAttribute attr : list)
-                {
-                    _element.setAttribute(attr.getId(),
-                            (attr.getValue() == null ? "" : attr.getValue())); //$NON-NLS-1$
-                }
-            }
-        }
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand#chain(org.eclipse.emf.common.command.Command)
-     */
-    @Override
-    public final Command chain(final Command command)
-    {
-        return super.chain(command);
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand#getResult()
-     */
-    @Override
-    public final Collection<Element> getResult()
-    {
-        return Collections.singletonList(_element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java
deleted file mode 100644
index 5fa9f6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.utils.BodyHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.JSFRootContainerPositionRule;
-import org.w3c.dom.Document;
-
-/**
- * Used to create a container that should only occur once per document. Typically
- * used for HTML body and JSF f:view tags.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * Clients may reference but not sub-class.
- * @author cbateman
- *
- */
-public final class SingletonContainerCreationCommand extends ContainerCreationCommand 
-{
-    private static final int  MAX_DEPTH_TO_SEARCH_FOR_CONTAINER = 10;
-
-    /**
-     * @param domPosition
-     * @param containerTag
-     * @param tagBeingCreated 
-     */
-    public SingletonContainerCreationCommand(IDOMPosition domPosition,
-            TagIdentifier containerTag, TagIdentifier tagBeingCreated) 
-    {
-        super(domPosition, containerTag, tagBeingCreated);
-    }
-
-    @Override
-    protected IDOMPosition doExecute() 
-    {
-       return insertSingletonIfNotPresent();
-    }
-    
-    private IDOMPosition insertSingletonIfNotPresent()
-    {
-        IDOMPosition domPosition = getDomPosition();
-        final TagIdentifier containerTag = getContainerTag();
-        final TagIdentifier tagBeingCreated = getTagBeingCreated();
-        
-        final Document document = EditModelQuery.getDocumentNode(domPosition
-                .getContainerNode());
-        
-        final boolean isContainerAlreadyPresent =
-            JSFRootContainerPositionRule.hasBasicContainers
-                (document, MAX_DEPTH_TO_SEARCH_FOR_CONTAINER);
-
-        if (isContainerAlreadyPresent) 
-        {
-            // if the container and element to be created are the same,
-            // then return null indicating to abort
-            if (containerTag.equals(tagBeingCreated))
-            {
-                domPosition =  null;
-            }
-            // otherwise, simply fall through keeping domPosition unchanged
-        }
-        // if the container isn't already present
-        else
-        {
-            
-            if (!containerTag.equals(tagBeingCreated)) 
-            {
-            // if the container is different and doesn't exist, then add it.
-                domPosition = BodyHelper.insertBody(domPosition, containerTag.asQName(), "f"); //$NON-NLS-1$
-            }
-            // otherwise, fall through leaving domPosition unchanged
-        }
-
-        return domPosition;
-    }
-
-    @Override
-    protected boolean prepare()
-    {
-        throw new UnsupportedOperationException("don't use"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java
deleted file mode 100644
index fb2a23f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ResolverUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.dom.ValidatorSupport;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolCreationAdapter;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author cbateman
- * 
- *  * <p><b>Provisional API - subject to change</b></p>
- *  
- *  Clients may sub-class
- *
- */
-public class TagContainerCreationCommand extends ContainerCreationCommand {
-
-    /**
-     * @param domPosition
-     * @param containerTag
-     * @param tagBeingCreated
-     */
-    public TagContainerCreationCommand(IDOMPosition domPosition,
-            TagIdentifier containerTag, TagIdentifier tagBeingCreated) 
-    {
-        super(domPosition, containerTag, tagBeingCreated);
-    }
-
-    @Override
-    protected IDOMPosition doExecute() 
-    {
-        final IDOMPosition domPosition = getDomPosition();
-        final QName  containerQName = getContainerTag().asQName();
-        boolean hasform = ValidatorSupport.checkContainer(domPosition, containerQName);
-        IDOMPosition newPosition = domPosition;
-        if (!hasform)
-        {
-            final IDOMModel model = ((IDOMNode) domPosition.getContainerNode())
-                .getModel();
-            
-            final IFile fileForDocument = ResolverUtil.getFileForDocument(model.getStructuredDocument());            
-            final ITagDropSourceData creationProvider =
-                TagToolCreationAdapter.findProviderForContainer(containerQName, PaletteItemManager.createPaletteContext(fileForDocument));
-            newPosition = ValidatorSupport
-                    .insertContainer(domPosition, model, creationProvider, getContainerCustomizationData());
-            if (newPosition == null) {
-                newPosition = domPosition;
-            }
-        }
-        return newPosition;
-    }
-
-    /**
-     * Override to inject customization data into the tag creation
-     * @return a customization data for the container.
-     */
-    protected IAdaptable getContainerCustomizationData()
-    {
-        return null;
-    }
-    
-    @Override
-    protected final boolean prepare()
-    {
-        throw new UnsupportedOperationException("don't use"); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedContainerCreationCommand.java
deleted file mode 100644
index 7cfbc8e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedContainerCreationCommand.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ResolverUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.dom.ValidatorSupport;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolCreationAdapter;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * Tag container creation command for tags dropped on to the WPE by the user
- * 
- * @see TagContainerCreationCommand
- * 
- * @author Debajit Adhikary
- * 
- */
-public class UserCustomizedContainerCreationCommand extends
-        TagContainerCreationCommand
-{
-    /**
-     * Customization data for tag dropped
-     * 
-     * @see ICustomizationData
-     * @see IAdaptable
-     */
-    private final IAdaptable    _data;
-
-    
-    /**
-     * @param domPosition
-     *            Position in the DOM where the tag is to be inserted
-     * @param containerTag
-     *            Container tag
-     * @param tagBeingCreated
-     *            The tag which was dropped
-     * @param data
-     *            Customization data for the tag dropped
-     * 
-     * @see TagContainerCreationCommand#TagContainerCreationCommand(IDOMPosition, TagIdentifier, TagIdentifier)
-     */
-    public UserCustomizedContainerCreationCommand(IDOMPosition domPosition,
-            TagIdentifier containerTag, TagIdentifier tagBeingCreated, IAdaptable data)
-    {
-        super(domPosition, containerTag, tagBeingCreated);
-        _data = data;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.command.TagContainerCreationCommand#getContainerCustomizationData()
-     */
-    @Override
-    protected IAdaptable getContainerCustomizationData()
-    {
-        return _data;
-    }
-
-    @Override
-    protected IDOMPosition doExecute()
-    {
-        final IDOMPosition domPosition = getDomPosition();
-        final QName containerQName = getContainerTag().asQName();
-
-        IDOMPosition newPosition = domPosition;
-        final IDOMModel model = ((IDOMNode) domPosition.getContainerNode())
-                .getModel();
-
-        final IFile fileForDocument = ResolverUtil.getFileForDocument(model.getStructuredDocument());    
-        final ITagDropSourceData creationProvider = TagToolCreationAdapter
-                .findProviderForContainer(containerQName, PaletteItemManager.createPaletteContext(fileForDocument));
-
-        newPosition = ValidatorSupport.insertContainer(domPosition,
-                model, creationProvider, getContainerCustomizationData());
-        if (newPosition == null)
-        {
-            newPosition = domPosition;
-        }
-
-        return newPosition;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedElementCustomizationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedElementCustomizationCommand.java
deleted file mode 100644
index dcf6c5d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/UserCustomizedElementCustomizationCommand.java
+++ /dev/null
@@ -1,200 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ResolverUtil;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.MetadataTagDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolCreationAdapter;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * Added extra functionality to use the customization data to set tag attributes
- * based on user enter values from drop wizard display.
- * 
- * @author prusev
- * @author Debajit Adhikary
- * 
- */
-public class UserCustomizedElementCustomizationCommand extends
-        ElementCustomizationCommand
-{
-
-    /**
-     * @param model
-     * @param element
-     * @param creationData
-     */
-    public UserCustomizedElementCustomizationCommand(IDOMModel model,
-            Element element, CreationData creationData)
-    {
-        super(model, element, creationData);
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand#execute()
-     */
-    @Override
-    public void execute()
-    {
-        super.execute();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand#applyChildElementCustomization()
-     */
-    @Override
-    protected void applyChildElementCustomization()
-    {
-        // TODO: Use this to get child information from metadata?
-        // super.applyChildElementCustomization();
-
-        // Get customization data
-        if (_creationData.getDropCustomizationData() != null)
-        {
-            final ICustomizationData data = (ICustomizationData) _creationData.getDropCustomizationData().getAdapter(ICustomizationData.class);
-//            
-//            if (data.getTextNodeData() != null) {
-//            	final Node textNode = _element.getOwnerDocument().createTextNode(data.getTextNodeData());
-//            	_element.appendChild(textNode);
-//            } 
-//            else 
-            if (data.getChildrenData() != null)
-            {
-                int childCount = 0;
-                CHILDREN_LOOP: for (ICustomizationData child : data.getChildrenData().getChildList())
-                {
-                    assert (_element.getOwnerDocument() != null);
-
-                    // Setup child node
-                    Element childNode = _element.getOwnerDocument().createElement(child.getTagIdentifier().getTagName());
-                    String prefix = JSPUtil.getOrCreatePrefix(_model, child.getTagIdentifier().getUri(), null);
-                    childNode.setPrefix(prefix);
-
-                    // Attach to child the attributes from the customization data 
-                    Map<String, String> attrMap = child.getAttributeData().getAttributes();
-                    for (String attrName : attrMap.keySet())
-                    {
-                        String attrValue = attrMap.get(attrName);
-                        childNode.setAttribute(attrName, attrValue);
-                    }
-
-                    // Attach child node to element
-                    _element.appendChild(childNode);
-
-                    // Set up other attributes and child tags for this child
-                    IFile fileForDocument = ResolverUtil.getFileForDocument(_model.getStructuredDocument());
-                    if (fileForDocument == null)
-                    {
-                        PDPlugin.log("File not found for model: "+_model.toString(), new Exception("Stack trace only"));  //$NON-NLS-1$ //$NON-NLS-2$
-                        continue CHILDREN_LOOP;
-                    }
-//                    final IProject project = fileForDocument.getProject();
-//                    PaletteItemManager itemManager = PaletteItemManager.getInstance(project);
-//                    PaletteItemManager itemManager = PaletteItemManager.getInstance(fileForDocument);
-//
-//                    if (itemManager == null)
-//                    {
-//                    	PDPlugin.log("paletteManager not found for file: "+fileForDocument.toString(), new Exception("Stack trace only")); //$NON-NLS-1$ //$NON-NLS-2$
-////                        PDPlugin.log("paletteManager not found for project: "+project.toString(), new Exception("Stack trace only")); //$NON-NLS-1$ //$NON-NLS-2$
-//                        continue CHILDREN_LOOP;
-//                    }
-
-                    final String uri = child.getTagIdentifier().getUri();
-                    final String tagName = child.getTagIdentifier().getTagName();
-                    final ITagDropSourceData creationProvider =
-                        TagToolCreationAdapter.findProviderForContainer(uri, tagName, PaletteItemManager.createPaletteContext(fileForDocument));
-                    final ITaglibDomainMetaDataModelContext modelContext = 
-                        TaglibDomainMetaDataQueryHelper
-                            .createMetaDataModelContext(fileForDocument.getProject(), child.getTagIdentifier().getUri());
-//                    		.createMetaDataModelContext(project, child.getTagIdentifier().getUri());
-                    IDOMPosition domPosition = new DOMPosition(_element, childCount++);
-                    CreationData creationData = new CreationData(creationProvider,_model, domPosition, modelContext, child);
-
-                    ElementCustomizationCommand command = new UserCustomizedElementCustomizationCommand(_model, childNode, creationData);
-                    command.execute();
-                }
-            }
-        }
-    }
-
-    /**
-     * Override to customize the attributes of the tag being created
-     * 
-     * Default implementation uses meta-data to set the attribute values. This
-     * is the preferred method for static attribute values (i.e. those that are
-     * not calculated dynamically at runtime).
-     * 
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand#applyAttributeCustomization()
-     */
-    protected void applyAttributeCustomization()
-    {
-        final Map<String, String> attributes = new HashMap<String, String>();
-        addAttributesFromPaletteMetadata(attributes);
-        addAttributesFromDropCustomization(attributes);
-        /*
-         * Added by Pete: Use the attribute data within the customization data
-         * container to configure the tag attributes
-         */
-        for (final Map.Entry<String, String> entry : attributes.entrySet())
-        {
-            _element.setAttribute(entry.getKey(), entry.getValue());
-        }
-    }
-
-    private void addAttributesFromDropCustomization(
-            Map<String, String> attributes)
-    {
-        if (_creationData.getDropCustomizationData() != null)
-        {
-            // Pull out the attribute data using the IAdaptable interface
-            ICustomizationData data = (ICustomizationData) _creationData
-                    .getDropCustomizationData().getAdapter(
-                            ICustomizationData.class);
-            Map<String, String> attrs = data.getAttributeData().getAttributes();
-            // Go through each attribute/value pair and configure it
-            for (String id : attrs.keySet())
-            {
-                attributes.put(id, attrs.get(id) == null ? "" : attrs.get(id)); //$NON-NLS-1$
-            }
-        }
-    }
-
-    private void addAttributesFromPaletteMetadata(Map<String, String> attributes)
-    {
-        final ITagDropSourceData info = _creationData.getTagCreationProvider();
-        if (info != null)
-        {
-            final MetadataTagDropSourceData provider =
-                TagToolCreationAdapter.createMdTagCreationProvider(info, _model);
-
-            final List<TagCreationAttribute> list = provider.getAttributes();
-            if (list != null)
-            {
-                for (final TagCreationAttribute attr : list)
-                {
-                    attributes.put(attr.getId(), (attr.getValue() == null ? "" //$NON-NLS-1$
-                            : attr.getValue()));
-                }
-            }
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java
deleted file mode 100644
index 32a462c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-
-/**
- * Clients should extend to implement their own IDropCustomizer.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-
-public abstract class AbstractDropCustomizer implements IDropCustomizer 
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer#getDropCustomizationData()
-     */
-    public IAdaptable getDropCustomizationData() 
-    {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer#runCustomizer()
-     */
-    public IStatus runCustomizer() 
-    {
-        return Status.OK_STATUS;
-    }
-    
-    public IStatus runCustomizer(final IFile file, final IDOMPosition position)
-    {
-        // backward compatibility: call the deprecated method to ensure that
-        // existing users are not broken
-        return runCustomizer();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AttributeData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AttributeData.java
deleted file mode 100644
index 834674b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AttributeData.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Class containing all the data that pertains to the customization
- * of a tag's attributes. 
- * 
- * @author prusev
- * @author Debajit Adhikary
- *
- */
-public class AttributeData {
-
-	private Map<String, String> attrs = new HashMap<String, String>();
-
-	
-	/**
-	 * Returns a map of the attributes (Name-Value pairs)
-	 * 
-	 * @return Map of attribute names and values
-	 * 
-	 */
-	public Map<String, String> getAttributes()
-	{
-		return attrs;
-	}
-
-	
-	/**
-	 * Sets the attribute data to the map of attribute names and values
-	 * provided.
-	 * 
-	 * @param attribs
-	 *            Map of attribute names and values
-	 * 
-	 */
-	public void setAttributes(Map<String, String> attribs)
-	{
-	    attrs.clear();
-	    attrs.putAll(attribs);
-	}
-
-	
-	/**
-	 * Adds an attribute.
-	 * 
-	 * @param attr
-	 *            Attribute name
-	 * @param userVal
-	 *            Attribute value
-	 * 
-	 */
-	public void addAttribute(String attr, String userVal)
-	{
-		attrs.put(attr, userVal);
-	}
-
-	/**
-	 * Returns the value for a given attribute name.
-	 * 
-	 * @param attr
-	 *            Attribute name whose value is to be found
-	 * @return Attribute value for the given attribute name
-	 * 
-	 */
-	public String getValForAttrib(String attr)
-	{
-		return attrs.get(attr);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ChildrenData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ChildrenData.java
deleted file mode 100644
index dfdcca2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ChildrenData.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The class containing any data that pertains to the customization of a tag's
- * children will be contained here. Currently, this is empty for this PoC
- * 
- * @author prusev
- * @author Debajit Adhikary
- * 
- */
-public class ChildrenData
-{
-    private List<ICustomizationData> childList;
-
-    
-    /**
-     * Default constructor
-     * 
-     */
-    public ChildrenData()
-    {
-        this.childList = new ArrayList<ICustomizationData>();
-    }
-
-    
-	/**
-	 * Constructor to initialize a ChildrenData object with a list of
-	 * customization data for the child tags
-	 * 
-	 * @param childList
-	 *            List of customization data objects for child tags
-	 * 
-	 */
-    public ChildrenData(List<ICustomizationData> childList)
-    {
-        this.childList = childList;
-    }
-
-    
-    /**
-     * @return the childList
-     */
-    public List<ICustomizationData> getChildList()
-    {
-        return childList;
-    }
-
-    
-    /**
-     * @param childList
-     *            the childList to set
-     */
-    public void setChildList(List<ICustomizationData> childList)
-    {
-        this.childList = childList;
-    }
-
-    
-    /**
-     * @param childData ChildData object to add 
-     */
-    public void add(ICustomizationData childData)
-    {
-        childList.add(childData);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/CustomizationDataImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/CustomizationDataImpl.java
deleted file mode 100644
index 6495528..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/CustomizationDataImpl.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-
-/**
- * Container class for all customization data collected from the tag wizard.
- * Through the Adaptable interface it will return the desired subdata piece such
- * as tag AttributeData.
- * 
- * @author prusev
- * @author Debajit Adhikary
- * 
- */
-
-public class CustomizationDataImpl implements IWritableCustomizationData
-{
-    private TagIdentifier tagIdentifier;
-    private AttributeData _attrs;
-    private ChildrenData childrenData;
-    private ParentData parentData;
-
-    
-	/**
-	 * Constructor.
-	 * 
-	 * @param target
-	 *            Tag identifier for the tag whose customization data this is
-	 * 
-	 */
-    public CustomizationDataImpl(final TagIdentifier target)
-    {
-        tagIdentifier = target;
-        _attrs = new AttributeData();
-        parentData = new ParentData();
-        childrenData = new ChildrenData();
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-     */
-    public Object getAdapter(Class adapter)
-    {
-        if (ICustomizationData.class.equals(adapter))
-        {
-            return this;
-        }
-        
-        return null;
-    }
-
-    
-    //------------------------------------------------------------
-    // Methods to handle the tag identifier
-    //------------------------------------------------------------
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData#getTagIdentifier()
-     */
-    public TagIdentifier getTagIdentifier()
-    {
-        return tagIdentifier;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#setTagIdentifier(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     */
-    public void setTagIdentifier(TagIdentifier tagId)
-    {
-        this.tagIdentifier = tagId;
-    }
-    
-    
-    //------------------------------------------------------------
-    // Methods to handle attributes
-    //------------------------------------------------------------
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData#getAttributeData()
-     */
-    public final AttributeData getAttributeData()
-    {
-        return _attrs;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#setAttributes(org.eclipse.jst.pagedesigner.itemcreation.customizer.AttributeData)
-     */
-    public void setAttributes(AttributeData attrs)
-    {
-        _attrs = attrs;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#addAttribute(java.lang.String, java.lang.String)
-     */
-    public void addAttribute(String attributeName, String attributeValue)
-    {
-        getAttributeData().addAttribute(attributeName, attributeValue);
-    }
-
-    
-    //------------------------------------------------------------
-    // Methods to handle children
-    //------------------------------------------------------------
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData#getChildrenData()
-     */
-    public final ChildrenData getChildrenData()
-    {
-        return childrenData;
-    }    
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#setChildrenData(org.eclipse.jst.pagedesigner.itemcreation.customizer.ChildrenData)
-     */
-    public void setChildrenData(ChildrenData data)
-    {
-        childrenData = data;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#addChildrenData(org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData)
-     */
-    public void addChildData (ICustomizationData childData)
-    {
-        getChildrenData().add(childData);
-    }
-    
-    
-    //------------------------------------------------------------
-    // Methods to handle parents
-    //------------------------------------------------------------
-    
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData#getParentData()
-     */
-    public final ParentData getParentData()
-    {
-        return parentData;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#setParentData(org.eclipse.jst.pagedesigner.itemcreation.customizer.ParentData)
-     */
-    public void setParentData(ParentData parentData)
-    {
-        this.parentData = parentData;
-    }
-
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IWritableCustomizationData#addParentData(org.eclipse.jst.pagedesigner.itemcreation.customizer.ICustomizationData)
-     */
-    public void addParentData (ICustomizationData parentData_)
-    {
-        getParentData().add(parentData_);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/DropCustomizationController.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/DropCustomizationController.java
deleted file mode 100644
index b1bd18e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/DropCustomizationController.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ResolverUtil;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.ICustomizableCommand;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-
-/**
- * Not API -- Do not use
- * 
- * @author cbateman
- *
- */
-public final class DropCustomizationController
-{
-    private final ICustomizableCommand _command;
-    private final IDropSourceData  _dropSourceData;
-    private final IDOMDocument  _domDocument;
-    private final IDOMPosition _domPosition;
-
-    /**
-     * @param command
-     * @param dropSourceData 
-     * @param domDocument 
-     * @param domPosition 
-     */
-    public DropCustomizationController(final ICustomizableCommand command,
-            final IDropSourceData dropSourceData, final IDOMDocument domDocument, final IDOMPosition domPosition)
-    {
-        _command = command;
-        _dropSourceData = dropSourceData;
-        _domDocument = domDocument;
-        _domPosition = domPosition;
-    }
-
-    /**
-     * @return the result of the customization
-     */
-    public IStatus performCustomization()
-    {
-        String tagName = _dropSourceData.getId();
-        if (_dropSourceData instanceof ITagDropSourceData)
-        {
-            tagName = ((ITagDropSourceData)_dropSourceData).getTagName();
-        }
-        final TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(
-                _dropSourceData.getNamespace(), tagName);
-        final IElementEdit elementEdit = ElementEditFactoryRegistry.getInstance()
-                .createElementEdit(tagId);
-
-        IStatus status = Status.OK_STATUS;
-        if (elementEdit != null)
-        {
-            final IDropCustomizer customizer = elementEdit.getDropCustomizer(_dropSourceData);
-
-            if (customizer != null)
-            {
-                final IFile file = getFile(_domDocument);
-                if (file != null)
-                {
-                    status = customizer.runCustomizer(file, _domPosition);
-                }
-                else 
-                {
-                    PDPlugin.log("Could not find file.", new Exception("Not a real exception")); //$NON-NLS-1$ //$NON-NLS-2$
-                    status = Status.CANCEL_STATUS;
-                }
-
-                if (status.getSeverity() == IStatus.OK)
-                {
-                    _command.setCustomizationData(customizer
-                            .getDropCustomizationData());
-                }
-            }
-        }
-        return status;
-    }
-
-    private static IFile getFile(IDOMDocument domDoc)
-    {
-        final IStructuredDocument sdoc = domDoc.getStructuredDocument();
-        if (sdoc != null)
-        {
-            return ResolverUtil.getFileForDocument(sdoc);
-        }
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ICustomizationData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ICustomizationData.java
deleted file mode 100644
index 0a76ae0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ICustomizationData.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-/**
- * Represents a read-only customization data object. Customization data for a
- * tag includes its identifier, attribute data, child tag information and parent
- * tag information.
- * 
- * @see IWritableCustomizationData
- * 
- * @author prusev
- * @author Debajit Adhikary
- * 
- */
-public interface ICustomizationData extends IAdaptable  
-{
-    /**
-     * Returns the TagIdentifier for the tag whose customization data this is
-     * 
-     * @return the TagIdentifier 
-     */
-    public TagIdentifier getTagIdentifier();
-    
-    
-    /**
-     * Returns the parent data associated with this customization data
-     * 
-     * @return the attribute information for this customization data
-     */
-    public AttributeData getAttributeData();
-
-    
-    /**
-     * Returns the children data associated with this customization data
-     * 
-     * @return the ChildrenData for this customization data
-     */
-    public ChildrenData getChildrenData();
-
-    
-    /**
-     * Returns the parent data associated with this customization data
-     * 
-     * @return the parent data for this customization data 
-     */
-    public ParentData getParentData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java
deleted file mode 100644
index deca04e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-
-/**
- * Interface used to declare an object that customizes tag creation data prior
- * to a drop.  The drop customizer should be used to ellicit data on per-drop basis.
- * 
- * Clients should not implement this interface.  Extend AbstractDropCustomizer instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author cbateman
- *
- */
-public interface IDropCustomizer 
-{
-    /**
-     * This is deprecated and is no longer called directly.  AbstractDropCustomizer
-     * will call this from runCustomizer(IFile) in the default case.
-     * 
-     * @return the status condition of the customizer
-     * @deprecated use runCustomizer(IFile, IDOMPosition) instead.
-     */
-    public IStatus runCustomizer();
-
-    /**
-     * Executed when the user performs a drop gesture for a tag, but before the
-     * command is dispatched to create the tag in the target document.  Implementers
-     * may do calculations or raise customization UI.  The return value is used
-     * to decide whether to continue.  Values other than OK and CANCEL are currently
-     * ignored.  If the return value has a severity of CANCEL, then the drop will
-     * be aborted.  If the return severity is OK, then getDropCustomizationData will
-     * be called and it's value will be passed to the ITagCreator framework through
-     * the CreationData object.
-     * 
-     * NOTE: This method may be called on the UI thread, although this is not guaranteed.
-     * Implementer should ensure that anything that is long-running (such as a dialog)
-     * is user-cancellable and that any UI code is run on the display thread.
-     * @param file 
-     * @param position the position in the target file where the new tag will be dropped
-     * 
-     * @return the status condition of the customizer
-     */
-
-    public IStatus runCustomizer(final IFile file, final IDOMPosition position);
-
-    /**
-     * @return the customization data.  This method will only be called after runCustomizer
-     * and only if runCustomizer returns IStatus.OK in its severity.  The adaptable will
-     * be passed to the ITagCreator framework through the CreationData value object.  You
-     * may return null even if runCustomizer() returns OK.
-     */
-    public IAdaptable getDropCustomizationData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IWritableCustomizationData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IWritableCustomizationData.java
deleted file mode 100644
index af9bd67..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IWritableCustomizationData.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-
-/**
- * Represents a writable customization data object.
- * 
- * @see ICustomizationData 
- * 
- * @author Debajit Adhikary
- *
- */
-public interface IWritableCustomizationData extends ICustomizationData
-{
-    //------------------------------------------------------------
-    // Methods to set the tag identifier information  
-    //------------------------------------------------------------
-
-    
-    /**
-     * Sets the tag identifier associated with a customization data object
-     * 
-     * @param tagId
-     *            The tag identifier to set it to
-     *            
-     */
-    public void setTagIdentifier(TagIdentifier tagId);
-    
-    
-    //------------------------------------------------------------
-    // Methods to set attribute data
-    //------------------------------------------------------------
-
-    
-    /**
-     * Sets the attribute data for an existing customization data object
-     * 
-     * @param attrs
-     *            The AttributeData object to set it to
-     *            
-     */
-    public void setAttributes(AttributeData attrs);
-
-    
-    /**
-     * Adds one attribute to an existing customization data object.
-     * 
-     * @param attributeName
-     *            The name of the attribute
-     * @param attributeValue
-     *            The value of this attribute
-     * 
-     */
-    public void addAttribute(String attributeName, String attributeValue);
-
-    
-    //------------------------------------------------------------
-    // Methods to set child data 
-    //------------------------------------------------------------
-    
-
-    /**
-     * Sets the child tag(s) customization information for an existing customization
-     * data object
-     * 
-     * @param data
-     *            The ChildrenData object to set it to
-     * 
-     */
-    public void setChildrenData(ChildrenData data);
-    
-    
-    /**
-     * Adds a child to an existing tag. (Adds the child's customization data to
-     * the existing tag's customization data)
-     * 
-     * @param childrenData
-     *            Customization Data for a child
-     * 
-     */
-    public void addChildData (ICustomizationData childrenData);
-
-    
-    //------------------------------------------------------------
-    // Methods to set parent customization data
-    //------------------------------------------------------------
-    
-    /**
-     * Sets parent customization information for an existing tag's customization
-     * data
-     * 
-     * @param parentData
-     *            The parent data to set it to
-     * 
-     */
-    public void setParentData(ParentData parentData);
-
-    
-    /**
-     * Attaches a parent to a tag (The customization data for a parent is added
-     * to the tag's customization data). The oldest parent (outermost container
-     * tag) should be attached (added) first.
-     * 
-     * @param parentData
-     *            Parent customization data
-     */
-    public void addParentData (ICustomizationData parentData);
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ParentData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ParentData.java
deleted file mode 100644
index e138685..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/ParentData.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Class to represent parent tag customization data for a tag. This information
- * is stored as a List of ICustomizationData objects, where each
- * ICustomizationData object belongs to one parent tag. (The outermost parent tag
- * (oldest ancestor) should be added first to this list)
- * 
- * @author Debajit Adhikary
- * 
- */
-public class ParentData
-{
-	/**
-	 * List of ICustomizationData objects to store parent tag information. The
-	 * outermost parent tag should be added first. 
-	 */
-	private List<ICustomizationData> parentList;
-
-    
-    /**
-     * Default constructor
-     * 
-     */
-    public ParentData ()
-    {
-        parentList = new ArrayList<ICustomizationData>();
-    }
-    
-    
-    /**
-	 * @param parentData
-	 *            Customization data to add for the parent tag
-	 *            
-	 */
-    public void add (ICustomizationData parentData)
-    {
-        this.parentList.add(parentData);
-    }
-
-    
-    /**
-	 * Returns the Parent customization data as a list of customization objects.
-	 * 
-	 * @return The parent customization data
-	 * 
-	 */
-    public List<ICustomizationData> getParentCustomizationData ()
-    {
-        return parentList;
-    }
-
-    
-    /**
-     * @param parentList List of ICustomizationData to set it to
-     * 
-     */
-    public void setParentCustomizationData (List<ICustomizationData> parentList)
-    {
-        this.parentList = parentList;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java
deleted file mode 100644
index 325c965..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-
-/**
- * Internal super-class of all tag creation commands.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractCreationCommand extends AbstractCommand implements
-        ICreationCommand 
-{
-    public abstract void execute(); 
-
-    public final void redo() 
-    {
-        throw new UnsupportedOperationException("don't use"); //$NON-NLS-1$
-    }
-
-    @Override
-    public final boolean canExecute() 
-    {
-        return super.canExecute();
-    }
-
-    @Override
-    public final boolean canUndo() {
-        return super.canUndo();
-    }
-
-    @Override
-    public Command chain(Command command) {
-        if (command instanceof ICreationCommand)
-        {
-            return super.chain(command);
-        }
-        throw new IllegalArgumentException("command must an ICreationCommand"); //$NON-NLS-1$
-    }
-
-    @Override
-    public final void dispose() 
-    {
-        throw new UnsupportedOperationException("don't use"); //$NON-NLS-1$
-    }
-
-    @Override
-    public final Collection<?> getAffectedObjects() {
-        return super.getAffectedObjects();
-    }
-
-    @Override
-    public final String getDescription() 
-    {
-        return super.getDescription();
-    }
-
-    @Override
-    public final String getLabel() 
-    {
-        return super.getLabel();
-    }
-
-    @Override
-    public Collection<?> getResult() 
-    {
-        return Collections.EMPTY_LIST;
-    }
-
-    @Override
-    protected abstract boolean prepare(); 
-
-    @Override
-    public final void setDescription(String description) 
-    {
-        super.setDescription(description);
-    }
-
-    @Override
-    public final void setLabel(String label) 
-    {
-        super.setLabel(label);
-    }
-
-    @Override
-    public final void undo() 
-    {
-        // for now, there is no undo
-        super.undo();
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java
deleted file mode 100644
index bcb087c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import org.eclipse.jst.pagedesigner.itemcreation.AbstractTagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreationAdvisor;
-
-/**
- * {@link org.eclipse.jst.pagedesigner.itemcreation.ITagCreator} used by the Web Page Editor palette. 
- * 
- * Uses org.eclipse.jst.jsf.common.metadata 
- */
-public class DefaultTagCreator extends AbstractTagCreator 
-{
-
-    @Override
-    protected ITagCreationAdvisor doSelectCreationAdvisor(
-            CreationData creationData) {
-        // return null by default. This causes the default advisor to be used.
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/ICreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/ICreationCommand.java
deleted file mode 100644
index bc2f25d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/ICreationCommand.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-
-/**
- * Implemented by commands that do tag model creation.  NOTE: this interface is highly provisional
- * and mainly exists to provide a facade to the future use of an existing Command infrastructure:
- * probably the EMF commands.  We haven't decided yet so it is important that:
- * 
- * This interface should NOT be implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface ICreationCommand 
-{
-    // tagging interface only
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreationFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreationFactory.java
deleted file mode 100644
index 948ed45..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreationFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.AbstractTagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-
-/**
- * Creates instances of
- * {@link org.eclipse.jst.pagedesigner.itemcreation.ITagCreator}s 
- * (Eventually) Will use TagCreavtorFactories registered using
- * org.eclipse.jst.jsf.pagedesigner.tagcreationfactories ext-pt. Currently only
- * using DefaultTagCreator.
- */
-public class TagCreationFactory
-{
-    private static TagCreationFactory INSTANCE = null;
-
-    /**
-     * @return singleton instance
-     */
-    public synchronized static TagCreationFactory getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new TagCreationFactory();
-        }
-        return INSTANCE;
-    }
-
-    /**
-     * Using the TagToolPaletteEntry, locate the factory to use for tag creation
-     * 
-     * @param tagId
-     * 
-     * @return ITagCreator
-     */
-    public ITagCreator createTagCreator(final TagIdentifier tagId)
-    {
-
-        IElementEdit elementEdit = ElementEditFactoryRegistry.getInstance()
-                .createElementEdit(tagId);
-
-        if (elementEdit != null)
-        {
-            // for (ITagCreatorFactory factory : factories)
-            // {
-            ITagCreator tagCreator = null;
-            try
-            {
-                tagCreator = elementEdit.getTagCreator(tagId);
-            }
-            catch (Exception e)
-            {
-                PDPlugin.getLogger(getClass()).error(
-                        "Error.ProblemLoadingTagCreatorFactory", //$NON-NLS-1$
-                        elementEdit.getClass().toString(), e);
-            }
-
-            if (tagCreator != null)
-            {
-                if (tagCreator instanceof AbstractTagCreator)
-                {
-                    return tagCreator;
-                }
-                // if non-null, skipped, log the issue
-                PDPlugin.getLogger(getClass()).error(
-                        "Error.ProblemLoadingTagCreatorFactory", //$NON-NLS-1$
-                        "Tag creator must extend AbstractTagCreator", //$NON-NLS-1$
-                        new Throwable());
-            }
-        }
-
-        // all else fails, use the internal default
-        return new DefaultTagCreator();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java
deleted file mode 100644
index ea06009..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-
-/**
- * A registry reader that lazy initializes a list of uri-sensitive
- * extensions
- * 
- * @author cbateman
- *
- */
-public final class TagCreatorFactoryRegistryReader 
-{
-    // TODO: move this logic into the ElementEditFacRegistryReader
-//    private static Map<String, List<ITagCreatorFactory>> _handlers = null;
-//
-//    /**
-//     * @param uri the uri to get a list of factories for
-//     * @return all available handers for the ext-pt
-//     */
-//    public static synchronized List<ITagCreatorFactory> getAllHandlers(final String uri) 
-//    {
-//        if (_handlers == null) {
-//            _handlers = readAllHandlers();
-//        }
-//        return _handlers.get(uri);
-//    }
-//
-//    private static Map<String, List<ITagCreatorFactory>> readAllHandlers() 
-//    {
-//        final Map<String, List<ExtElement>>  map = 
-//            new HashMap<String, List<ExtElement>>();
-//
-//        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-//                .getExtensionPoint(PDPlugin.getPluginId(),
-//                        IJMTConstants.TAG_CREATOR_FACTORY_EXT_NAME);
-//        IExtension[] extensions = extensionPoint.getExtensions();
-//
-//        for (int i = 0; i < extensions.length; i++) 
-//        {
-//            IExtension ext = extensions[i];
-//            IConfigurationElement[] tagCreationHandlers = ext
-//                    .getConfigurationElements();
-//
-//            for (int j = 0; j < tagCreationHandlers.length; j++) {
-//                if (tagCreationHandlers[j].getName().equals(
-//                        IJMTConstants.TAG_CREATOR_FACTORY_ELEMENT_NAME)) 
-//                {
-//                    try
-//                    {
-//                        final ExtElement extElement = 
-//                            new ExtElement(tagCreationHandlers[j]);
-//                        List<ExtElement> elements = 
-//                            map.get(extElement.getUri());
-//                        
-//                        if (elements == null)
-//                        {
-//                            elements = new ArrayList<ExtElement>();
-//                            map.put(extElement.getUri(), elements);
-//                        }
-//                        
-//                        elements.add(extElement);
-//                    }
-//                    catch (CoreException ce)
-//                    {
-//                        PDPlugin.getLogger(ExtElement.class)
-//                            .error("Error.ProblemLoadingExtensionPoint", ce);
-//                    }
-//                }
-//            }
-//        }
-//        
-//        final Map<String, List<ITagCreatorFactory>> handlers = 
-//            new HashMap<String, List<ITagCreatorFactory>>();
-//        
-//        // now loop through the extensions, looking for collisions
-//        // on the same uri
-//        for (String uri : map.keySet())
-//        {
-//            List<ExtElement>  elements = map.get(uri);
-//            
-//            if (elements.size() > 1)
-//            {
-//                Collections.sort(elements);
-//                
-//                MultiStatus chainedStatus = new MultiStatus(PDPlugin.getPluginId(), 0, "Collision detected in ITagCreatorFactory extensions for uri: "+uri+". Factories will be queried in the following order with the first contender to provide a ITagCreator winning",
-//                        new Throwable());
-//                
-//                for (ExtElement element : elements)
-//                {
-//                    IStatus status = 
-//                        new Status(IStatus.WARNING, PDPlugin.getPluginId(), element.getClassName());
-//                    chainedStatus.add(status);
-//                }
-//                
-//                PDPlugin.log(chainedStatus);
-//            }
-//            
-//            List<ITagCreatorFactory>  factories = 
-//                new ArrayList<ITagCreatorFactory>();
-//
-//            for (ExtElement element : elements)
-//            {
-//                factories.add(element.getFactoryInstance());
-//            }
-//            
-//            handlers.put(uri, factories);
-//        }
-//
-//        return handlers;
-//    }
-//
-//    private static class ExtElement implements Comparable<ExtElement>
-//    {
-//        private final IConfigurationElement  _element;
-//        
-//        private final ITagCreatorFactory  _factoryInstance;
-//        
-//        ExtElement(IConfigurationElement element) throws CoreException
-//        {
-//            _element = element;
-//            
-//            final String uri = getUri();
-//            final String factory = getClassName();
-//            
-//            if (uri == null || factory == null)
-//            {
-//                throw new CoreException(new Status(IStatus.ERROR,PDPlugin.getPluginId(), "uri and factory must not be null: uri="+uri+", factory="+factory));
-//            }
-//            
-//            Object obj = _element.createExecutableExtension("factory");
-//
-//            if (obj instanceof ITagCreatorFactory) 
-//            {
-//                _factoryInstance = (ITagCreatorFactory) obj;
-//            }
-//            else
-//            {
-//                throw new CoreException(new Status(IStatus.ERROR,PDPlugin.getPluginId(), "Factory must be instanceof ITagCreatorFactory"));
-//            }
-//        }
-//
-//        /**
-//         * @return the uri
-//         */
-//        public String getUri() {
-//            return _element.getAttribute("uri");
-//        }
-//
-//        /**
-//         * @return the class name
-//         */
-//        public String getClassName() {
-//            return _element.getAttribute("factory");
-//        }
-//
-//        /**
-//         * @return the factory instance or null
-//         */
-//        public ITagCreatorFactory getFactoryInstance() 
-//        {
-//            return _factoryInstance;
-//        }
-//
-//        /* 
-//         * Two elements compare by the canonical comparision of their
-//         * contributor's bundle name string
-//         */
-//        public int compareTo(ExtElement o)
-//        {
-//            return _element.getContributor().getName().compareTo
-//                (o._element.getContributor().getName());
-//        }
-//
-//        @Override
-//        public boolean equals(Object obj) 
-//        {
-//            // ensure that x.equals(y) iff x.compareTo(y) == 0
-//            if (obj instanceof ExtElement)
-//            {
-//                return compareTo((ExtElement) obj) == 0;
-//            }
-//            
-//            return false;
-//        }
-//
-//        @Override
-//        public int hashCode() 
-//        {
-//            // ensure that x.equals(y) => x.hashCode == y.hashCode
-//            return _element.getContributor().getName().hashCode();
-//        }
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/UserCustomizedTagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/UserCustomizedTagCreator.java
deleted file mode 100644
index a6cef41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/UserCustomizedTagCreator.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreationAdvisor;
-import org.eclipse.jst.pagedesigner.itemcreation.UserCustomizedTagCreationAdvisor;
-
-/**
- * Tag creation advisor that returns a new ElementCustomizationCommand
- * subclass that will perform customization of attributes, child tags and parent tags 
- * 
- * @author prusev
- *
- */
-public class UserCustomizedTagCreator extends DefaultTagCreator {
-
-	/**
-	 * 
-	 */
-	public UserCustomizedTagCreator()
-	{
-		// empty
-	}
-	
-    @Override
-    protected ITagCreationAdvisor doSelectCreationAdvisor(CreationData creationData) {
-        // Return a new tag creation advisor
-        return new UserCustomizedTagCreationAdvisor(creationData);
-    }
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java
deleted file mode 100644
index 0b809fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.ui.internal.utils.StringUtil;
-
-/**
- * @author mengbo
- * @deprecated
- */
-public class AttributeDescriptor implements IAttributeDescriptor {
-	private String _attributeName;
-
-	private String _category;
-
-	private String _valueType;
-
-	private String _typeParameter;
-
-	private String _labelString;
-
-	private String _defaultValue;
-
-	private String _description;
-
-	private Map _parameterMap;
-
-	private Map _options;
-
-	private boolean _required;
-
-	/**
-	 * 
-	 */
-	public AttributeDescriptor() {
-		super();
-	}
-
-	/**
-	 * @param attrName
-	 */
-	public AttributeDescriptor(String attrName) {
-		this.setAttributeName(attrName);
-	}
-
-	/**
-	 * @param attributeName
-	 */
-	public void setAttributeName(String attributeName) {
-		this._attributeName = attributeName;
-	}
-
-	/**
-	 * @param category
-	 */
-	public void setCategory(String category) {
-		this._category = category;
-	}
-
-	/**
-	 * @param valueType
-	 */
-	public void setValueType(String valueType) {
-		this._valueType = valueType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getAttributeName()
-	 */
-	public String getAttributeName() {
-		return _attributeName;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getDescription()
-	 */
-	public String getDescription() {
-		return _description;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getCategory()
-	 */
-	public String getCategory() {
-		return _category;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getValueType()
-	 */
-	public String getValueType() {
-		return _valueType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getOptions()
-	 */
-	public Map getOptions() {
-		return _options;
-	}
-
-	/**
-	 * @param description
-	 */
-	public void setDescription(String description) {
-		_description = description;
-	}
-
-	/**
-	 * @param map
-	 * @param defaultValue
-	 */
-	public void setOptions(Map map, String defaultValue) {
-		_options = map;
-		_defaultValue = defaultValue;
-	}
-
-	/**
-	 * @return Returns the typeParameter.
-	 */
-	public String getTypeParameter() {
-		return _typeParameter;
-	}
-
-	/**
-	 * @param typeParameter
-	 *            The typeParameter to set.
-	 */
-	public void setTypeParameter(String typeParameter) {
-		this._typeParameter = typeParameter;
-		_parameterMap = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor#getLabelString()
-	 */
-	public String getLabelString() {
-		if (_labelString == null) {
-			_labelString = StringUtil.splitVariable(getAttributeName());
-		}
-		return _labelString;
-	}
-
-	/**
-	 * @param labelString
-	 *            The labelString to set.
-	 */
-	public void setLabelString(String labelString) {
-		this._labelString = labelString;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor#getParameterByName(java.lang.String)
-	 */
-	public String getParameterByName(String name) {
-		if (_parameterMap == null) {
-			parseParameter();
-		}
-		Object value = _parameterMap.get(name);
-		return value == null ? "" : value.toString(); //$NON-NLS-1$
-	}
-
-	/**
-	 * 
-	 */
-	private void parseParameter() {
-		_parameterMap = new HashMap();
-		if (_typeParameter == null) {
-			return;
-		}
-		StringTokenizer tokenizer = new StringTokenizer(_typeParameter, "||"); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens()) {
-			String parameterEntry = tokenizer.nextToken();
-			int index = parameterEntry.indexOf('=');
-			if (index != -1) {
-				_parameterMap.put(parameterEntry.substring(0, index),
-						parameterEntry.substring(index + 1));
-			}
-		}
-	}
-
-	public String getDefaultValue() {
-		return _defaultValue;
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setDefaultValue(String value) {
-		_defaultValue = value;
-	}
-
-	public boolean isRequired() {
-		return _required;
-	}
-
-	/**
-	 * @param required
-	 */
-	public void setRequired(boolean required) {
-		this._required = required;
-	}
-	
-	public String toString(){
-		StringBuffer buf = new StringBuffer("AttributeDescriptor: "); //$NON-NLS-1$
-		buf.append(this.getAttributeName());
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/BindingHandlerDelegate.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/BindingHandlerDelegate.java
deleted file mode 100644
index bace305..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/BindingHandlerDelegate.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated
- */
-public class BindingHandlerDelegate implements IBindingHandler {
-	private static final String BINDING_DISABLED_IMAGE_FILE = "PD_Binding_disabled.gif"; //$NON-NLS-1$
-	private static final String BINDING_IMAGE_FILE = "PD_Binding.gif"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#handleBinding(org.eclipse.swt.widgets.Shell,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      java.lang.String)
-	 */
-	public String handleBinding(Shell shell, IDOMNode ancester,
-			IDOMElement element, String currentValue) {
-		IBindingHandler handler = getDelegatedHandler(ancester, element);
-		if (handler != null) {
-			return handler
-					.handleBinding(shell, ancester, element, currentValue);
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#isEnabled(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-	// public boolean isEnabled(IDOMNode ancester, IDOMElement element)
-	// {
-	// IBindingHandler handler = getDelegatedHandler(ancester, element);
-	// return (handler == null) ? false : handler.isEnabled(ancester, element);
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#isEnabled(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor)
-	 */
-	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-			String uri, String tagName, IAttributeDescriptor attr) {
-		IBindingHandler handler = getDelegatedHandler(ancester, element);
-		return (handler == null) ? false : handler.isEnabled(ancester, element,
-				uri, tagName, attr);
-	}
-
-//	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-//			IPropertyPageDescriptor attr) {
-//		IBindingHandler handler = getDelegatedHandler(ancester, element);
-//		return (handler == null) ? false : handler.isEnabled(ancester, element,
-//				attr);
-//	}
-	
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#getImage()
-	 */
-	public Image getImage() {
-		return PDPlugin.getDefault().getImage(BINDING_IMAGE_FILE);
-	}
-
-	public Image getDisabledImage() {
-		return PDPlugin.getDefault().getImage(BINDING_DISABLED_IMAGE_FILE);
-	}
-
-	private IBindingHandler getDelegatedHandler(IDOMNode ancester,
-			IDOMElement element) {
-		IProject project = getProject(ancester, element);
-		if (project != null) {
-			Object obj = project.getAdapter(IBindingHandler.class);
-			if (obj instanceof IBindingHandler) {
-				return (IBindingHandler) obj;
-			}
-		}
-
-		return null;
-	}
-
-	private IProject getProject(IDOMNode ancester, IDOMElement element) {
-		IDOMModel model = getModel(ancester, element);
-		if (model != null) {
-			return StructuredModelUtil.getProjectFor(model);
-		}
-        return null;
-	}
-
-	private IDOMModel getModel(IDOMNode ancester, IDOMElement element) {
-		if (ancester != null) {
-			return ancester.getModel();
-		} else if (element != null) {
-			return element.getModel();
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/DefaultEditorCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/DefaultEditorCreator.java
deleted file mode 100644
index 2275079..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/DefaultEditorCreator.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.internal.CellEditorFactoryRegistry;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DefaultEditorCreator extends EditorCreator {
-	static IPropertyPageDescriptor _staticAttr;
-
-	static IDOMElement _staticElement;
-
-	//static IBindingHandler _staticHandler;
-
-	static CellEditorHolder _staticHolder;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditor(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.w3c.dom.Element)
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, IDOMElement element) {
-		return CellEditorFactoryRegistry.getInstance().createCellEditor(parent,
-				attr, element);
-	}
-
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createDialogField(org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor)
-//	 */
-//	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-//		return CellEditorFactoryRegistry.getInstance().createDialogField(attr);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditorWithWrapper(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler,
-	 *      org.eclipse.swt.graphics.Image)
-	 */
-	@SuppressWarnings("deprecation")
-    public CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, final IDOMElement element,
-			IBindingHandler handler1) {
-//		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-//				: handler1);
-//		String uri = CMUtil.getElementNamespaceURI(element);
-//		String tagName = element.getLocalName();
-		
-		return createCellEditor(parent, attr, element);
-//		
-//		if (!handler.isEnabled(element, element, uri, tagName, attr)) {
-//			// should not enabled, so directly return original cell editor
-//			return createCellEditor(parent, attr, element);
-//		}
-//		try {
-//			// since "createWrappedCellEditor()" and "getBindingImage()" is
-//			// called from the constructor of CellEditorWrapper, at that time,
-//			// can't reference this DefaultEditorCreator and final fields yet,
-//			// so use static variable for it.
-//			_staticAttr = attr;
-//			_staticElement = element;
-//			_staticHandler = handler;
-//
-//			return new CellEditorWrapper(parent) {
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#createWrappedCellEditor(org.eclipse.swt.widgets.Composite)
-//				 */
-//				protected CellEditor createWrappedCellEditor(Composite cell) {
-//					return EditorCreator.getInstance().createCellEditor(cell,
-//							_staticAttr, _staticElement);
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#openDialogBox(org.eclipse.swt.widgets.Control)
-//				 */
-//				protected Object openDialogBox(Control cellEditorWindow) {
-//					return handler.handleBinding(cellEditorWindow.getShell(),
-//							element, element, convertToString(this.getValue()));
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#getBindingImage()
-//				 */
-//				protected Image getBindingImage() {
-//					return _staticHandler.getImage();
-//				}
-//			};
-//		} finally {
-//			_staticAttr = null;
-//			_staticElement = null;
-//			_staticHandler = null;
-//			_staticHolder = null;
-//		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditorWithWrapper(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.eclipse.jst.pagedesigner.meta.EditorCreator.CellEditorHolder,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler)
-	 */
-	@SuppressWarnings("deprecation")
-    public CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, CellEditorHolder holder,
-			final IDOMElement element, IBindingHandler handler1) {
-//		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-//				: handler1);
-//		String uri = CMUtil.getElementNamespaceURI(element);
-//		String tagName = element.getLocalName();
-		
-		return holder.createCellEditor(parent);
-		
-//		if (!handler.isEnabled(element, element, uri, tagName, attr)) {
-//			// should not enabled, so directly return original cell editor
-//			return holder.createCellEditor(parent);
-//		}
-//		try {
-//			// since "createWrappedCellEditor()" and "getBindingImage()" is
-//			// called from the constructor of CellEditorWrapper, at that time,
-//			// can't reference this DefaultEditorCreator and final fields yet,
-//			// so use static variable for it.
-//			_staticElement = element;
-//			_staticHandler = handler;
-//			_staticHolder = holder;
-//
-//			return new CellEditorWrapper(parent) {
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#createWrappedCellEditor(org.eclipse.swt.widgets.Composite)
-//				 */
-//				protected CellEditor createWrappedCellEditor(Composite cell) {
-//					return _staticHolder.createCellEditor(cell);
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#openDialogBox(org.eclipse.swt.widgets.Control)
-//				 */
-//				protected Object openDialogBox(Control cellEditorWindow) {
-//					return handler.handleBinding(cellEditorWindow.getShell(),
-//							element, element, convertToString(this.getValue()));
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#getBindingImage()
-//				 */
-//				protected Image getBindingImage() {
-//					return _staticHandler.getImage();
-//				}
-//			};
-//		} finally {
-//			_staticAttr = null;
-//			_staticElement = null;
-//			_staticHandler = null;
-//			_staticHolder = null;
-//		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createDialogFieldWithWrapper(java.lang.String,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler)
-	 */
-	@SuppressWarnings("deprecation")
-    public DialogField createDialogFieldWithWrapper(String uri, String tagName,
-			IPropertyPageDescriptor attr, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		DialogField field = createDialogField(attr);
-		// if (field instanceof StringButtonDialogField)
-		// {
-		// ((StringButtonDialogField) field).setButtonLabel("...");
-		// }
-		DialogFieldWrapper wrapper = new DialogFieldWrapper(field, handler
-				.getImage(), handler.getDisabledImage(), uri, tagName, attr,
-				handler);
-		wrapper.setDatabindingEnabled(true);
-
-		return wrapper;
-	}
-
-
-//	private String convertToString(Object value) {
-//		if (value == null) {
-//			return null;
-//		}
-//        return value.toString();
-//	}
-
-	@SuppressWarnings("deprecation")
-    @Override
-	public DialogField createDialogFieldWithWrapper(
-			IPropertyPageDescriptor attr, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		DialogField field = createDialogField(attr);
-		// if (field instanceof StringButtonDialogField)
-		// {
-		// ((StringButtonDialogField) field).setButtonLabel("...");
-		// }
-		DialogFieldWrapper wrapper = new DialogFieldWrapper(field, handler
-				.getImage(), handler.getDisabledImage(), attr.getUri(), attr.getTagName(), attr,
-				handler);
-		wrapper.setDatabindingEnabled(true);
-
-		return wrapper;
-	}
-
-	@Override
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-		return CellEditorFactoryRegistry.getInstance().createDialogField(attr);		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java
deleted file mode 100644
index a6d6bb6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class EditorCreator {
-	static EditorCreator _instance;
-
-	@SuppressWarnings("deprecation")
-    static IBindingHandler _defaultHandler = new BindingHandlerDelegate();
-
-	/**
-	 * 
-	 */
-	public static interface CellEditorHolder {
-		/**
-		 * @param parent
-		 * @return the cell editor
-		 */
-		public CellEditor createCellEditor(Composite parent);
-	}
-
-	/**
-	 * Create a dialog field without databinding using the specified attribute
-	 * descriptor.
-	 * 
-	 * @param attr
-	 * @return DialogField
-	 */
-	public abstract DialogField createDialogField(IPropertyPageDescriptor attr);
-
-	/**
-	 * Create a dialog field that will have databinding support. Basically, this
-	 * method will create a normal dialog field using the attribute descriptor,
-	 * then make a wrapper on it.
-	 * 
-	 * @param uri
-	 *            the namespace uri
-	 * @param tagName
-	 *            the local tag name
-	 * @param attr
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return DialogField
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract DialogField createDialogFieldWithWrapper(String uri,
-			String tagName, IPropertyPageDescriptor attr, IBindingHandler handler);
-
-
-	/**
-	 * @param descriptor
-	 * @param handler
-	 * @return the dialog field
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract DialogField createDialogFieldWithWrapper(IPropertyPageDescriptor descriptor, IBindingHandler handler);
-//	
-//	/**
-//	 * Create a dialog field that will have databinding support. Basically, this
-//	 * method will create a normal dialog field using the attribute descriptor,
-//	 * then make a wrapper on it.
-//	 *
-//	 * @param uri
-//	 *            the namespace uri
-//	 * @param tagName
-//	 *            the local tag name
-//	 * @param attrName
-//	 * @param handler
-//	 *            if null, system default mechanism will be used.
-//	 * @return DialogField
-//	 */
-//	public abstract DialogField createDialogFieldWithWrapper(String uri,
-//			String tagName, String attrName, IBindingHandler handler);
-	/**
-	 * Create a cell editor.
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @return CellEditor
-	 */
-	public abstract CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, IDOMElement element);
-
-	/**
-	 * Create a cell editor that will have databinding support.
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return CellEditor
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, IDOMElement element,
-			IBindingHandler handler);
-
-	/**
-	 * Create a cell edtior that will have databinding support. This method
-	 * don't provide an attribute descriptor, but it provide a CellEditorHolder
-	 * to create whatever normal cell editor it wants.
-	 * 
-	 * @param parent
-	 * @param attr
-	 *            could be null
-	 * @param holder
-	 * @param element
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return CellEditor
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, CellEditorHolder holder,
-			IDOMElement element, IBindingHandler handler);
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static EditorCreator getInstance() {
-		if (_instance == null) {
-			_instance = new DefaultEditorCreator();
-		}
-		return _instance;
-	}
-
-	/**
-	 * @return the binding handler
-	 */
-	@SuppressWarnings("deprecation")
-    public IBindingHandler getSystemDefaultBindingHandler() {
-		return _defaultHandler;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java
deleted file mode 100644
index 91f5f27..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import java.util.Map;
-
-/**
- * 
- * @author mengbo
- * @deprecated
- */
-public interface IAttributeDescriptor {
-	/**
-	 * suffix
-	 */
-	final String PARAMETER_SUFFIX = "suffix"; //$NON-NLS-1$
-
-	/**
-	 * style
-	 */
-	final String PARAMETER_STYLE = "style"; //$NON-NLS-1$
-
-	/**
-	 * super type
-	 */
-	final String PARAMETER_SUPER_TYPE = "superType"; //$NON-NLS-1$
-
-	/**
-	 * separator
-	 */
-	final String PARAMETER_SEPARATOR = "separator"; //$NON-NLS-1$
-
-	/**
-	 * default
-	 */
-	final String PARAMETER_DEFAULT = "default"; //$NON-NLS-1$
-
-	/**
-	 * get the name of the attribute.
-	 * 
-	 * @return the attribute name
-	 */
-	public String getAttributeName();
-
-	/**
-	 * Returns a brief description of this property. This localized string is
-	 * shown to the user when this property is selected. and it is used as
-	 * tooltip of the property now.
-	 * 
-	 * @return a brief description, or <code>null</code> if none
-	 */
-	public String getDescription();
-
-	/**
-	 * return the category for this attribute.
-	 * 
-	 * @return the category
-	 */
-	public String getCategory();
-
-	/**
-	 * value type is used to construct the cell editor.
-	 * 
-	 * @return the value type
-	 */
-	public String getValueType();
-
-	/**
-	 * Some value type contains additional parameter information. For example,
-	 * if valueType is CLASSNAME, the typeParameter could be super
-	 * interface/super class name.
-	 * 
-	 * NOTE: if valueType is ENUMERATION, caller should use
-	 * <code>getOptions()</code>
-	 * 
-	 * @return null if there is no type parameter.
-	 */
-	public String getTypeParameter();
-
-	/**
-	 * @param name
-	 * @return the parameter
-	 */
-	public String getParameterByName(String name);
-
-	/**
-	 * when the value type is "enumeration", this method will be called to
-	 * construct the drop downlist.
-	 * 
-	 * The Map will be (key->display string)
-	 * 
-	 * @return the options
-	 */
-	public Map getOptions();
-
-	/**
-	 * Gets the default value of Options
-	 * 
-	 * @return the default value
-	 */
-	public String getDefaultValue();
-
-	/**
-	 * A human readable string as the label of the attribute.
-	 * 
-	 * @return the label
-	 */
-	public String getLabelString();
-
-	/**
-	 * Indicate whether the attribute is required.
-	 * 
-	 * @return true if is required
-	 */
-	public boolean isRequired();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeRuntimeValueType.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeRuntimeValueType.java
deleted file mode 100644
index 8a9512c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeRuntimeValueType.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-/**
- * Enumeration of core attribute-value-runtime-types.
- * Not to be implemented by clients.
- */
-public interface IAttributeRuntimeValueType {
-	// shared for html and jsf
-	/**
-	 * 
-	 */
-	static final String prefix1 = "org.eclipse.jst.jsf.core.attributevalues."; //$NON-NLS-1$
-	/**
-	 * 
-	 */
-	static final String prefix2 = "org.eclipse.jst.pagedesigner.attributevalues."; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String BASE = prefix1+"BaseType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String CSSSTYLE = prefix1+"CSSStyleType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String CSSCLASS = prefix1+"CSSClassType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String CSSID = prefix1+"CSSIdType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String STRING = prefix1+"StringType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String BOOLEAN = prefix1+"BooleanType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String RELATIVEPATH = prefix1+"RelativePathType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String WEBPATH = prefix1+"WebPathType"; //FIXME //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String COLOR = prefix1+"ColorType"; //$NON-NLS-1$
-
-//	public static final String NAMED_BOOLEAN = prefix1+"NAMED-BOOLEAN";
-	
-	/**
-	 * 
-	 */
-	public static final String LONG = prefix1+"LongType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String INTEGER = prefix1+"IntegerType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String DOUBLE = prefix1+"DoubleType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String METHODBINDING = prefix1+"MethodBindingType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String JAVACLASS = prefix1+"JavaClassType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String SCRIPT = prefix1+"ScriptType"; //$NON-NLS-1$
-
-//	public static final String PROPERTYBINDING = prefix1+"PROPERTYBINDING";
-	
-	/**
-	 * 
-	 */
-	public static final String VALUE = prefix1+"ValueType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String VALUEBINDING = prefix1+"ValueBindingType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String TIMEZONE = prefix1+"TimeZoneType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String ACTION = prefix1+"ActionType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String CLASSPATH_RESOURCE = prefix1+"CLASSPATH_RESOURCE"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String CURRENCYCODE = prefix1+"CurrencyCodeType"; //$NON-NLS-1$
-
-	/**
-	 * 
-	 */
-	public static final String LINK = prefix1+"LinkType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String LOCALE = prefix1+"LocaleType"; //$NON-NLS-1$
-
-//	public static final String MULTICHOICE = prefix1+"MULTICHOICE";
-	
-	/**
-	 * 
-	 */
-	public static final String FACESCONFIGIDENTIFIER = prefix1+"FacesConfigIdentifierType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String FACESCONFIGVALIDATORID = prefix1+"FacesConfigValidatorIDType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String FACESCONFIGCONVERTERID = prefix1+"FacesConfigConverterIDType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String COMPONENTBINDING = prefix1+"ComponentBindingType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String COMPONENTID = prefix1+"ComponentIDType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String LENGTH = prefix1+"LengthType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String RESOURCEBUNDLE = prefix1+"ResourceBundleType"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 */
-	public static final String LANGUAGECODE = prefix1+"LanguageCodeType"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IBindingHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IBindingHandler.java
deleted file mode 100644
index 514cb41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IBindingHandler.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated
- */
-public interface IBindingHandler {
-	/**
-	 * This handler should open a dialog to accept user input.
-	 * 
-	 * @param shell
-	 * @param ancester
-	 * @param element
-	 * @param currentValue
-	 * @return null means user canceled the operation.
-	 */
-	public String handleBinding(Shell shell, IDOMNode ancester,
-			IDOMElement element, String currentValue);
-
-	/**
-	 * Whether should the binding be enabled for the specified element context.
-	 * element could be null.
-	 * 
-	 * @param ancester
-	 * @param element
-	 * @param uri
-	 * @param tagName
-	 * @param attr
-	 *            could be null.
-	 * @return true if is enabled
-	 */
-	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-			String uri, String tagName, IAttributeDescriptor attr);
-
-	
-//	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-//			IPropertyPageDescriptor attr);
-	
-	/**
-	 * given the meta data of an attribute, to see whether should enable binding
-	 * handler for it.
-	 * 
-	 * @param uri
-	 * @param tagName
-	 * @param attr
-	 * @return
-	 */
-	// public boolean isEnabled(String uri, String tagName, IAttributeDescriptor
-	// attr);
-	/**
-	 * Image used for the small button.
-	 * 
-	 * @return the image
-	 */
-	public Image getImage();
-
-	/**
-	 * @return the image indicating disablement
-	 */
-	public Image getDisabledImage();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ITagAttributeCellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ITagAttributeCellEditorFactory.java
deleted file mode 100644
index 363f858..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ITagAttributeCellEditorFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * Factory for creating CellEditors and DialogFields to edit element attributes.
- */
-public interface ITagAttributeCellEditorFactory {
-	/**
-	 * create cell editor
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param ele
-	 * @return null means failed to create cell editor
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, Element ele);
-
-	/**
-	 * Normally, the DialogField for an attribute may appear in the following
-	 * places.
-	 * <ol>
-	 * <li>In the Quick Editor properties view, used to edit an element.
-	 * <li>In a dialog to edit an element
-	 * <li>In a dialog, to create an element
-	 * </ol>
-	 * 
-	 * It is the caller's responsibility to add valueChanged listener to the
-	 * dialog field to decide how to apply the value.
-	 * 
-	 * It is also the caller's responsibility to set the initial value of the
-	 * field.
-	 * 
-	 * The field should always be an instanceof <code>ISupportTextValue</code>,
-	 * it could also optionally implement <code>IElementContextable</code>
-	 * 
-	 * @param attr
-	 *            the attribute descriptor, meta data
-	 * @return A dialog field. null means this factory can't create one.
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr);
-
-	/**
-	 * The attribute runtime value types supported by this factory.
-	 * 
-	 * @return null means this factory can behave as default factory.
-	 */
-	public String[] getSupportedValueTypes();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CategoryNameComparator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CategoryNameComparator.java
deleted file mode 100644
index 2a438b3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CategoryNameComparator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.Comparator;
-import java.util.HashSet;
-
-/**
- * Sorts categories and ensures that @see{ITabbedPropertiesConstants.OTHER_CATEGORY} comes last
- * @author mengbo
- */
-public class CategoryNameComparator implements Comparator {
-	static HashSet _pairs = new HashSet();
-
-	private final static CategoryNameComparator _instance = new CategoryNameComparator();
-
-	static class Pair {
-		String s1;
-
-		String s2;
-
-		Pair(String a, String b) {
-			s1 = a;
-			s2 = b;
-		}
-
-		public int hashCode() {
-			return s1.hashCode() + s2.hashCode();
-		}
-
-		public boolean equals(Object o) {
-			if (o instanceof Pair) {
-				Pair p = (Pair) o;
-				return s1.equals(p.s1) && s2.equals(p.s2);
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param s1
-	 * @param s2
-	 */
-	public static void addPair(String s1, String s2) {
-		_pairs.add(new Pair(s1, s2));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		if (o1.equals(o2))
-			return 0;
-
-		//Below code sorted OTHER category ("Attributes") to the bottom
-		//Commenting out as it just looks strange
-//		if (ITabbedPropertiesConstants.OTHER_CATEGORY.equals(o1))
-//			return 1;
-//		if (ITabbedPropertiesConstants.OTHER_CATEGORY.equals(o2))
-//			return -1;
-
-//		Pair p = new Pair((String) o1, (String) o2);
-//		if (_pairs.contains(p))
-//			return -1;
-		return ((String)o1).compareTo(((String)o2));
-	}
-
-	/**
-	 * @return the instance
-	 */
-	public static CategoryNameComparator getInstance() {
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFacRegistryReader.java
deleted file mode 100644
index 72e8938..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFacRegistryReader.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory;
-
-/**
- * Read the registry to find out all the CellEditorFactory.
- * 
- * @author mengbo
- */
-public class CellEditorFacRegistryReader {
-	static ITagAttributeCellEditorFactory[] _factories = null;
-
-	/**
-	 * @return ITagAttributeCellEditorFactory[]
-	 */
-	public static synchronized ITagAttributeCellEditorFactory[] getAllFactories() {
-		if (_factories == null) {
-			_factories = readAllFactories();
-		}
-		return _factories;
-
-	}
-
-	private static ITagAttributeCellEditorFactory[] readAllFactories() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] facs = ext.getConfigurationElements();
-
-			for (int j = 0; j < facs.length; j++) {
-				if (facs[j].getName().equals(
-						IJMTConstants.TAG_ATTRIBUTE_CELLEDITOR_FACTORY)) {
-					Object obj;
-					try {
-						obj = facs[j].createExecutableExtension("class"); //$NON-NLS-1$
-
-						if (obj instanceof ITagAttributeCellEditorFactory) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						// ignore the exception
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		ITagAttributeCellEditorFactory[] ret = new ITagAttributeCellEditorFactory[result
-				.size()];
-		result.toArray(ret);
-		return ret;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java
deleted file mode 100644
index e4cdaf5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorFactory;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * CellEditorFactoryRegistry also read information from plugin.xml extension to
- * allow other plugins to contribute new kinds of cell editors.
- * 
- */
-public class CellEditorFactoryRegistry {
-//	private static final Logger _log = PDPlugin
-//			.getLogger(CellEditorFactoryRegistry.class);
-
-	private static CellEditorFactoryRegistry _instance;
-
-	private Map _factoryMap = new HashMap();
-
-	private List _defaultFactories = new ArrayList();
-
-	/**
-	 * @return singleton CellEditorFactoryRegistry
-	 */
-	public static CellEditorFactoryRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new CellEditorFactoryRegistry();
-		}
-		return _instance;
-	}
-
-	private CellEditorFactoryRegistry() {
-		ITagAttributeCellEditorFactory[] facs = CellEditorFacRegistryReader
-				.getAllFactories();
-		if (facs != null) {
-			for (int i = 0; i < facs.length; i++) {
-				addCellEditorFactory(facs[i]);
-			}
-		}
-		addCellEditorFactory(new CellEditorFactory());
-	}
-
-	/**
-	 * @param fac
-	 */
-	public void addCellEditorFactory(ITagAttributeCellEditorFactory fac) {
-		String[] types = fac.getSupportedValueTypes();
-		if (types == null || types.length == 0) {
-			_defaultFactories.add(fac);
-		} else {
-			for (int i = 0; i < types.length; i++) {
-				_factoryMap.put(types[i], fac);
-			}
-		}
-	}
-
-	/**
-	 * Return cell editor for attribute based upon runtime value type
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @return CellEditor
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, Element element) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0)
-			return null;
-
-		CellEditor result = null;
-		ITagAttributeCellEditorFactory fac = (ITagAttributeCellEditorFactory) _factoryMap
-				.get(type);
-		
-		if (fac != null) {
-			result = fac.createCellEditor(parent, attr, element);
-		}
-		if (result == null) {
-			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-				result = ((ITagAttributeCellEditorFactory) _defaultFactories
-						.get(i)).createCellEditor(parent, attr, element);
-				if (result != null)
-					break;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param attr
-	 * @return DialogField
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0) {
-			DialogField result = createTextDialogField(attr);
-			result.setLabelText(attr.getLabel()); //labelProvider???
-			return result;
-		}
-//		type = type.toUpperCase();
-
-		DialogField result = null;
-		ITagAttributeCellEditorFactory fac = (ITagAttributeCellEditorFactory) _factoryMap
-				.get(type);
-		if (fac != null) {
-			result = fac.createDialogField(attr);
-		}
-		if (result == null) {
-			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-				result = ((ITagAttributeCellEditorFactory) _defaultFactories
-						.get(i)).createDialogField(attr);
-				if (result != null) {
-					break;
-				}
-			}
-		}
-		if (result == null) {
-			result = createTextDialogField(attr);
-		}
-		if (!(result instanceof ISupportTextValue)) {
-			result = createTextDialogField(attr);
-		}
-//		result.setLabelText(attr.getLabel() + ":"); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * @param attr
-	 * @return DialogField
-	 */
-	public DialogField createTextDialogField(IPropertyPageDescriptor attr) {
-		StringDialogField field = new StringDialogField();
-		field.setLabelText(attr.getLabel());
-		field.setRequired(attr.isRequired());
-		field.setToolTip(attr.getDescription());
-		return field;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java
deleted file mode 100644
index e9f63ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.jst.pagedesigner.ui.preferences.PDPreferences;
-import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSStyleAdapterFactory extends AbstractAdapterFactory {
-	static Class ADAPTERKEY = ICSSStyle.class;
-    private final PDPreferences _prefs;
-
-	private CSSStyleAdapterFactory() {
-		super(ADAPTERKEY, true);
-		_prefs = new PDPreferences();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory#createAdapter(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	protected INodeAdapter createAdapter(INodeNotifier target) {
-		if (target instanceof Element) {
-			return new AbstractStyle((Element) target, _prefs);
-		}
-        return null;
-	}
-
-	/**
-	 * @return the factory instance
-	 */
-	public static CSSStyleAdapterFactory getInstance() {
-        // TODO: this 'singleton' is broken
-		return new CSSStyleAdapterFactory();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java
deleted file mode 100644
index 92c9bb9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowPage;
-import org.eclipse.wst.css.core.internal.event.ICSSStyleListener;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector;
-import org.eclipse.wst.html.core.internal.htmlcss.StyleListener;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public class DocumentEditPart extends NodeEditPart implements StyleListener,
-		ICSSStyleListener {
-	boolean _refreshing = false;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List list = new ArrayList();
-		Node model = (Node) getModel();
-		if (model == null) {
-			return list;
-		}
-
-		NodeList children1 = model.getChildNodes();
-		for (int i = 0, n = children1.getLength(); i < n; i++) {
-			Node node = children1.item(i);
-			if (node.getNodeType() != Node.TEXT_NODE
-					&& node.getNodeType() != Node.ELEMENT_NODE) {
-				continue;
-			}
-			list.add(node);
-		}
-		return list;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		FlowPage f = new FlowPage();
-		return f;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		refresh();
-	}
-
-    /**
-     * @param recursive
-     */
-    public void refresh(final boolean recursive)
-    {
-        if (!recursive)
-        {
-            refresh();
-        }
-        else
-        {
-            refreshVisuals();
-            refreshChildren(recursive);
-            refreshSourceConnections();
-            refreshTargetConnections();
-
-        }
-    }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#refresh()
-	 */
-	public void refresh() {
-		if (_refreshing) {
-			return;
-		}
-		_refreshing = true;
-		try {
-			super.refresh();
-		} finally {
-			_refreshing = false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#refreshChildren()
-	 */
-	protected void refreshChildren() {
-	    refreshChildren(false);
-	}
-
-    /**
-     * @param recursive
-     */
-    protected void refreshChildren(final boolean recursive)
-    {
-        super.refreshChildren();
-        List children1 = getChildren();
-        for (int i = 0, size = children1.size(); i < size; i++)
-        {
-            final EditPart editPart = (EditPart) children1.get(i);
-            if (editPart instanceof ElementEditPart)
-            {
-                ((ElementEditPart)editPart).refresh(recursive);
-            }
-            else
-            {
-                editPart.refresh();
-            }
-        }
-    }
-
-	// protected void removeChildVisual(EditPart childEditPart)
-	// {
-	// if (childEditPart instanceof SubNodeEditPart)
-	// {
-	// Node node = ((SubNodeEditPart) childEditPart).getNodeForFigure();
-	// if (node != null)
-	// {
-	// getDestDocumentForDesign().removeChild(node);
-	// }
-	// }
-	// super.removeChildVisual(childEditPart);
-	// }
-	//    
-	// protected void addChildVisual(EditPart childEditPart, int index)
-	// {
-	// if (childEditPart instanceof SubNodeEditPart)
-	// {
-	// Node node = ((SubNodeEditPart) childEditPart).getNodeForFigure();
-	// if (node != null)
-	// {
-	// NodeList nodeList = getDestDocumentForDesign().getChildNodes();
-	// if (nodeList.getLength() > index)
-	// {
-	// getDestDocumentForDesign().insertBefore(node, nodeList.item(index));
-	// }
-	// else
-	// {
-	// getDestDocumentForDesign().appendChild(node);
-	// }
-	// }
-	// }
-	// super.addChildVisual(childEditPart, index);
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.html.core.internal.htmlcss.StyleListener#styleChanged()
-	 */
-	public void styleChanged() {
-		// refresh the whole document when style change (<style> or <link>)
-		this.refreshStyle();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.css.core.internal.event.ICSSStyleListener#styleChanged(org.eclipse.wst.css.core.internal.provisional.document.ICSSModel,
-	 *      org.eclipse.wst.css.core.document.ICSSSelector[],
-	 *      org.eclipse.wst.css.core.document.ICSSSelector[], java.lang.String)
-	 */
-	public void styleChanged(ICSSModel srcModel, ICSSSelector[] removed,
-			ICSSSelector[] added, String media) {
-		if ((removed != null && removed.length > 0) || added != null
-				&& added.length > 0) {
-			this.refreshStyle();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.css.core.internal.event.ICSSStyleListener#styleUpdate(org.eclipse.wst.css.core.internal.provisional.document.ICSSModel)
-	 */
-	public void styleUpdate(ICSSModel srcModel) {
-		this.refreshStyle();
-	}
-
-	/**
-	 * 
-	 */
-	private void refreshStyle() {
-		List childParts = this.getChildren();
-		for (Iterator iter = childParts.iterator(); iter.hasNext();) {
-			EditPart part = (EditPart) iter.next();
-			if (part instanceof ElementEditPart) {
-				IDOMNode node = (IDOMNode) ((ElementEditPart) part)
-						.getNodeForFigure();
-				if (node != null) {
-					refreshChildStyles(node);
-				}
-			}
-		}
-		getFigure().revalidate();
-		// getFigure().repaint();
-	}
-
-	/**
-	 * @param node
-	 */
-	private void refreshChildStyles(IDOMNode node) {
-		NodeList childNodes = node.getChildNodes();
-		for (int i = 0, size = childNodes.getLength(); i < size; i++) {
-			refreshChildStyles((IDOMNode) childNodes.item(i));
-		}
-		if (node instanceof IDOMElement) {
-			// only refresh style on element.
-			ICSSStyle a = (ICSSStyle) node.getAdapterFor(ICSSStyle.class);
-			if (a != null) {
-				a.reset();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java
deleted file mode 100644
index cac1252..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.jst.pagedesigner.css2.style.IRangeSelectionProxy;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * EditProxyAdapter is used to provide additional information to the underlying
- * figures. As when we doing the "convert", we are creating new nodes and
- * generate figure using those new nodes. This class is used to adapt to those
- * new nodes, and providing additional information to them.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class EditProxyAdapter implements INodeAdapter, IRangeSelectionProxy {
-	ElementEditPart _part;
-
-	/**
-	 * @param part 
-	 */
-	public EditProxyAdapter(ElementEditPart part) {
-		_part = part;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		if (type == IRangeSelectionProxy.class) {
-			return true;
-		} else if (type == EditProxyAdapter.class) {
-			return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.IRangeSelectionProxy#isRangeSelected()
-	 */
-	public boolean isRangeSelected() {
-		return _part.isRangeSelected();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java
deleted file mode 100644
index f85bfba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java
+++ /dev/null
@@ -1,641 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSWidgetLayout;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.jst.pagedesigner.css2.widget.HiddenProvider;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementMenuBar;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.IEnhancedSelectionEditPolicy;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.figurehandler.FigureFactory;
-import org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.requests.PageDesignerRequestConstants;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditPart extends SubNodeEditPart {
-	private static Logger _log = PDPlugin.getLogger(ElementEditPart.class);
-
-	private Element _elementNode;
-
-	private ITagConverter _tagConverter;
-    
-    private ElementMenuBar  _nonVisualElementBar;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPart#setModel(java.lang.Object)
-	 */
-	public void setModel(Object model) {
-		super.setModel(model);
-		_elementNode = (Element) model;
-		_tagConverter = getTagConverter(_elementNode);
-		_tagConverter.convertRefresh(null);
-		adaptEditProxy();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#getDragTracker(org.eclipse.gef.Request)
-	 */
-	public DragTracker getDragTracker(Request request) 
-    {
-        EditPolicy policy = this
-            .getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE);
-
-        if (PageDesignerRequestConstants.REQ_SELECTION_TRACKER.equals(request.getType())
-                || org.eclipse.gef.RequestConstants.REQ_SELECTION.equals(request.getType()))
-        {
-            if (policy instanceof IEnhancedSelectionEditPolicy
-                    && request instanceof LocationRequest)
-            {
-                return ((IEnhancedSelectionEditPolicy)policy).getSelectionDragTracker((LocationRequest)request);
-            }
-            
-            return null;
-        }
-        
-        // should not happen
-        return new DragEditPartsTracker(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		IElementEdit support = getElementEdit();
-		if (support != null) {
-			support.createEditPolicies(this);
-		}
-
-		// if ElementEdit didn't install special SELECTION_FEEDBACK_ROLE policy,
-		// then default
-		if (this.getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE) == null) {
-			this.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
-					new ElementResizableEditPolicy());
-		}
-	}
-
-	/**
-	 * @return the associated element edit
-	 */
-	public IElementEdit getElementEdit() {
-		// XXX: should we cache it?
-		return ElementEditFactoryRegistry.getInstance().createElementEdit(
-				_elementNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#addNotify()
-	 */
-	public void addNotify() {
-		if (_tagConverter == null) {
-			_tagConverter = getTagConverter(_elementNode);
-			_tagConverter.convertRefresh(null);
-			adaptEditProxy();
-		}
-		super.addNotify();
-	}
-
-	/**
-	 * @param node
-	 * @return
-	 */
-	private ITagConverter getTagConverter(Element node) {
-		return DTManager.getInstance().getTagConverter(node,
-				IConverterFactory.MODE_DESIGNER,
-				this.getDestDocumentForDesign());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeNotify()
-	 */
-	public void removeNotify() {
-		super.removeNotify();
-		// if (_tagConverter != null)
-		// {
-		// _tagConverter.dispose();
-		// _tagConverter = null;
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List children_ = new ArrayList(_tagConverter.getChildModeList());
-        
-        for (Iterator it = _tagConverter.getNonVisualChildren().iterator(); it.hasNext();)
-        {
-            Element nonVisualChild = (Element) it.next();
-            children_.add(DTManager.getInstance().getTagConverter(nonVisualChild,
-                IConverterFactory.MODE_DESIGNER,
-                this.getDestDocumentForDesign()));
-        }
-        return children_;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		// if (_tagConverter.isVisualByHTML())
-		// {
-		// Element result = _tagConverter.getResultElement();
-		// return FigureFactory.createFigure(result,
-		// true);//_tagConverter.isMultiLevel());
-		// }
-		// else
-		// {
-		// CSSWidgetFigure figure = new CSSWidgetFigure(this._elementNode,
-		// createHiddenProvider());
-		// return figure;
-		// }
-		return new CSSFigure();
-	}
-
-	/**
-	 * @return
-	 */
-	private HiddenProvider createHiddenProvider() {
-		Element result = _tagConverter.getHostElement();
-		String localName = result.getLocalName();
-		String appendString = localName;
-		if (localName.equalsIgnoreCase(IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB)) {
-			appendString = ((IDOMElement) result)
-					.getAttribute(IJSPCoreConstants.ATTR_URI);
-			if (appendString == null) {
-				appendString = ((IDOMElement) result)
-					.getAttribute(IJSPCoreConstants.ATTR_TAGDIR);
-				if (appendString == null)
-					appendString = ""; //$NON-NLS-1$
-			}
-		}
-		Image image = _tagConverter.getVisualImage();
-		HiddenProvider provider = new HiddenProvider(image, this);
-		((CSSFigure) getFigure()).setCSSStyle(provider.getCSSStyle());
-		provider.setLabel(appendString);
-		return provider;
-	}
-
-	/**
-	 * called by the
-	 * @param recursive
-	 * 
-	 */
-	public void refreshModelChange(boolean recursive) {
-		IElementEdit support = getElementEdit();
-		if (support == null
-				|| !support.handleModelChange(_elementNode, this, recursive)) {
-			this.refresh(recursive);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#refresh()
-	 */
-	public void refresh() {
-		refresh(false);
-	}
-
-	/**
-	 * @param recursive
-	 */
-	public void refresh(boolean recursive) {
-		if (!_tagConverter.isVisualByHTML()) {
-			_tagConverter.convertRefresh(null);
-			((CSSFigure) getFigure())
-					.setFixedLayoutManager(new CSSWidgetLayout(
-							(CSSFigure) getFigure(), createHiddenProvider()));
-			// nothing to refresh
-			// ((CSSWidgetFigure)
-			// getFigure()).setProvider(createHiddenProvider());
-			return;
-		}
-		EditPart editPart;
-		Object model;
-
-		Map modelToEditPart = new HashMap();
-		List children1 = getChildren();
-
-		for (int i = 0, n = children1.size(); i < n; i++) {
-			editPart = (EditPart) children1.get(i);
-			modelToEditPart.put(editPart.getModel(), editPart);
-			// remove child visual, since we may reconstruct the figure
-			// structure of this edit part
-			removeChildVisual(editPart);
-		}
-
-		Element oldEle = _tagConverter.getResultElement();
-
-		// link parent node.
-		Node parent = oldEle.getParentNode();
-		_tagConverter.convertRefresh(null);
-		if (parent != null) {
-			// a new element is generated. replace the old one.
-			parent.replaceChild(_tagConverter.getResultElement(), oldEle);
-		}
-
-		adaptEditProxy();
-
-		// XXX: comment out the if-else for always deep update.
-		// this is for the case when a empty container generate child
-		// text node, and then when user input data into the container,
-		// the node change from "multiLevel" state to "non-multilevel"
-		// state. We don't handle this very well yet, so always to deep
-		// update for now. (lium)
-		// if (_tagConverter.isMultiLevel())
-		// {
-		FigureFactory.updateDeepFigure(_tagConverter.getResultElement(),
-				oldEle, (CSSFigure) this.getFigure());
-		// }
-		// else
-		// {
-		// FigureFactory.updateNonDeepFigure(_tagConverter.getResultElement(),
-		// this.getFigure());
-		// }
-
-		List modelObjects = getModelChildren();
-		if (!recursive) {
-			for (int i = 0, n = modelObjects.size(); i < n; i++) {
-				model = modelObjects.get(i);
-
-				// Look to see if the EditPart is already around but in the
-				// wrong location
-				editPart = (EditPart) modelToEditPart.remove(model);
-
-				if (editPart != null) {
-					addChildVisual(editPart, i);
-				} else {
-					// An editpart for this model doesn't exist yet. Create and
-					// insert one.
-					editPart = createChild(model);
-					addChild(editPart, i);
-				}
-			}
-			for (Iterator iter = modelToEditPart.values().iterator(); iter
-					.hasNext();) {
-				EditPart part = (EditPart) iter.next();
-				removeChild(part);
-			}
-		} else {
-			// remove all child, and recreate them.
-			for (Iterator iter = modelToEditPart.values().iterator(); iter
-					.hasNext();) {
-				EditPart part = (EditPart) iter.next();
-				removeChild(part);
-			}
-			for (int i = 0, n = modelObjects.size(); i < n; i++) {
-				model = modelObjects.get(i);
-
-				// Look to see if the EditPart is already around but in the
-				// wrong location
-				// An editpart for this model doesn't exist yet. Create and
-				// insert one.
-				editPart = createChild(model);
-				addChild(editPart, i);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void adaptEditProxy() {
-		Element resultEle = _tagConverter.getResultElement();
-		if (resultEle instanceof IDOMElement) {
-			INodeAdapter adapter = ((IDOMElement) resultEle)
-					.getAdapterFor(EditProxyAdapter.class);
-			if (adapter != null) {
-				((IDOMElement) resultEle).removeAdapter(adapter);
-			}
-			((IDOMElement) resultEle).addAdapter(new EditProxyAdapter(this));
-		}
-	}
-
-	/**
-	 * @return true if we are in range mode and this is in 
-	 * the selection range
-	 */
-	public boolean isRangeSelected() {
-		IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) this.getViewer();
-		if (viewer == null || !viewer.isInRangeMode()) {
-			return false;
-		}
-		DesignRange range = viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return false;
-		}
-		return RangeUtil.intersect(range, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#isWidget()
-	 */
-	public boolean isWidget() {
-		return _tagConverter.isWidget();
-	}
-
-	/**
-	 * @return true if our model node can have direct text children
-	 */
-	public boolean canHaveDirectTextChild() {
-		return CMUtil.canHaveDirectTextChild(this._elementNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#isResizable()
-	 */
-	public boolean isResizable() {
-		if (!_tagConverter.isVisualByHTML()) {
-			return false;
-		}
-		IElementEdit edit = this.getElementEdit();
-		if (edit != null) {
-			return edit.isResizable(this._elementNode);
-		}
-        CMElementDeclaration decl = CMUtil
-        		.getElementDeclaration(this._elementNode);
-        if (decl != null) {
-        	// XXX: default implementation, if this element support "style"
-        	// attribute,
-        	// then we think it support resize.
-        	return decl.getAttributes().getNamedItem("style") != null; //$NON-NLS-1$
-        }
-        return true;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private IFigure getFigure(Node parent) {
-		if (parent instanceof INodeNotifier) {
-			IFigureHandler handler = (IFigureHandler) ((INodeNotifier) parent)
-					.getAdapterFor(IFigureHandler.class);
-			if (handler != null) {
-				return handler.getFigure();
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#addChildVisual(org.eclipse.gef.EditPart,
-	 *      int)
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-        
-        boolean figureAdded = false;
-
-        if (childEditPart instanceof NonVisualComponentEditPart)
-        {
-            getNonVisualElementBar().addNonVisualChild(((NonVisualComponentEditPart) childEditPart));
-            figureAdded = true;
-            //TODO: need better flow of control.
-            return;
-        }
-        
-		Node childNode = (Node) childEditPart.getModel();
-		IFigure childFigure = ((GraphicalEditPart) childEditPart).getFigure();
-		ConvertPosition position = _tagConverter
-				.getChildVisualPosition(childNode);
-		if (position != null) {
-			Node parent = position.getParentNode();
-			// link up figure.
-			IFigure parentFigure = getFigure(parent);
-			if (parentFigure != null) {
-				parentFigure.add(childFigure, position.getIndex());
-				figureAdded = true;
-			}
-			// link up style
-			if (parent instanceof INodeNotifier) {
-				ICSSStyle parentStyle = (ICSSStyle) ((INodeNotifier) parent)
-						.getAdapterFor(ICSSStyle.class);
-				if (parentStyle != null) {
-					ICSSStyle childStyle = (ICSSStyle) ((INodeNotifier) childNode)
-							.getAdapterFor(ICSSStyle.class);
-					if (childStyle instanceof AbstractStyle) {
-						((AbstractStyle) childStyle)
-								.setParentStyle(parentStyle);
-					}
-				}
-			}
-			// link up the nodeForFigure
-			if (childEditPart instanceof SubNodeEditPart) {
-				Node nodeForFigure = ((SubNodeEditPart) childEditPart)
-						.getNodeForFigure();
-				if (nodeForFigure != null /*
-											 * && !(nodeForFigure instanceof
-											 * PseudoElement)
-											 */) {
-					parent.appendChild(nodeForFigure);
-				}
-			}
-		} else {
-		    _log.error("getChildVisualPosition() return null"); //$NON-NLS-1$
-		}
-
-		if (!figureAdded) {
-			super.addChildVisual(childEditPart, index);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeChildVisual(org.eclipse.gef.EditPart)
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-        // remove figure
-        IFigure childFigure = ((GraphicalEditPart) childEditPart).getFigure();
-        IFigure parent = childFigure.getParent();
-
-		if (parent != null) {
-			parent.remove(childFigure);
-		}
-        
-        if (childEditPart instanceof NonVisualComponentEditPart)
-        {
-            _nonVisualElementBar.removeNonVisualChild((NonVisualComponentEditPart) childEditPart);
-        }
-        // this only applies to visual edit parts
-        else
-        {
-    		// de-link style
-    		Node childNode = (Node) childEditPart.getModel();
-    		ICSSStyle childStyle = (ICSSStyle) ((INodeNotifier) childNode)
-    				.getAdapterFor(ICSSStyle.class);
-    		if (childStyle instanceof AbstractStyle) {
-    			((AbstractStyle) childStyle).setParentStyle(null);
-    		}
-    		// de-link nodeForFigure
-    		if (childEditPart instanceof SubNodeEditPart) {
-    			Node nodeForFigure = ((SubNodeEditPart) childEditPart)
-    					.getNodeForFigure();
-    			if (nodeForFigure != null && nodeForFigure.getParentNode() != null) {
-    				nodeForFigure.getParentNode().removeChild(nodeForFigure);
-    			}
-    		}
-        }
-	}
-
-	/**
-	 * @return the associated tag converter
-	 */
-	public ITagConverter getTagConvert() {
-		return _tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // XXX: this can cause multiple refreshes on the same edit part for the 
-        // same change.  I can also cause incorrect child refreshes...
-		refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.SubNodeEditPart#getNodeForFigure()
-	 */
-	public Node getNodeForFigure() {
-		return _tagConverter.getResultElement();
-	}
-
-	/**
-	 * @return true this part's node has non whitespace child nodes
-	 */
-	public boolean haveNonWhitespaceTextChild() {
-		List children1 = this.getChildren();
-		for (int i = 0, size = children1.size(); i < size; i++) {
-			if (children1.get(i) instanceof TextEditPart) {
-				IDOMText xmltext = (IDOMText) ((TextEditPart) children1.get(i))
-						.getIDOMNode();
-				if (!xmltext.isElementContentWhitespace()) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-    private ElementMenuBar getNonVisualElementBar()
-    {
-        if (_nonVisualElementBar == null)
-        {
-            _nonVisualElementBar = new ElementMenuBar(this);
-        }
-        return _nonVisualElementBar;
-    }
-
-    /**
-     * @return the element menu bar for this element
-     */
-    public ElementMenuBar getElementMenuBar() {
-        return getNonVisualElementBar();
-    }
-
-    public void deactivate() {
-        super.deactivate();
-        if (_nonVisualElementBar != null)
-        {
-            _nonVisualElementBar.dispose();
-            _nonVisualElementBar = null;
-        }
-        if (_tagConverter != null) {
-        	_tagConverter.dispose();
-        }
-    }
-
-    public Cursor getCursor(Point mouseLocation) {
-        // let the selection edit policy dictate
-        EditPolicy  editPolicy = getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE);
-        
-        if (editPolicy instanceof IEnhancedSelectionEditPolicy)
-        {
-            return  ((IEnhancedSelectionEditPolicy)editPolicy).getSelectionToolCursor(mouseLocation);
-        }
-        return super.getCursor(mouseLocation);
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java
deleted file mode 100644
index 66dd085..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Node;
-
-/**
- * The model here can only be Document/Element/Text.
- * 
- * @author mengbo
- */
-public class HTMLEditPartsFactory implements EditPartFactory {
-	private IDOMDocument _destDocument;
-
-	/**
-	 * @param destDoc
-	 */
-	public HTMLEditPartsFactory(IDOMDocument destDoc) {
-		this._destDocument = destDoc;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPartFactory#createEditPart(org.eclipse.gef.EditPart,
-	 *      java.lang.Object)
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-        NodeEditPart part = null;
-        
-        if (model instanceof Node)
-        {
-    		Node node = (Node) model;
-    		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-    			part = new DocumentEditPart();
-    		} else if (node.getNodeType() == Node.ELEMENT_NODE) {
-    			// String tag = ((Element)node).getTagName();
-    			// if ("TABLE".equalsIgnoreCase(tag))
-    			// part = new HTMLTableEditPart();
-    			// else
-                    part = new ElementEditPart();
-    		} else if (node.getNodeType() == Node.TEXT_NODE
-    				|| node.getNodeType() == Node.CDATA_SECTION_NODE) {
-    			part = new TextEditPart();
-    		}
-        }
-        // XXX: we need to create wrapper that allows us to know when
-        // a model object represents a non-visual decorator
-        else if (model instanceof ITagConverter)
-        {
-            part = new NonVisualComponentEditPart();
-        }
-        
-		if (part != null) {
-			part.setDestDocumentForDesign(this._destDocument);
-			part.setModel(model);
-		}
-		return part;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java
deleted file mode 100644
index 653ba15..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.dnd.internal.LocalDropEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.DragMoveEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.tools.RangeDragTracker;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class NodeEditPart extends AbstractGraphicalEditPart implements
-		INodeAdapter {
-
-	private IDOMDocument _destDocument;
-	private boolean      _isDragActive;
-    
-	/**
-	 * this method is called from the HTMLEditPartsFactory directly after the
-	 * part's creation.
-	 * 
-	 * @param doc
-	 */
-	public void setDestDocumentForDesign(IDOMDocument doc) {
-		this._destDocument = doc;
-	}
-
-	/**
-	 * @return to owner document of this part's model node
-	 */
-	public IDOMDocument getDestDocumentForDesign() {
-		if (this._destDocument == null) {
-			return (IDOMDocument) this.getIDOMNode().getOwnerDocument();
-		}
-        return this._destDocument;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.NODE_ROLE, null);
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, null);
-		installEditPolicy(LocalDropRequest.REQ_LOCAL_DROP,
-				new LocalDropEditPolicy());
-		installEditPolicy(ItemCreationRequest.REQ_ITEM_CREATION,
-				new ItemCreationEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new DragMoveEditPolicy());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type == EditPart.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#addNotify()
-	 */
-	public void addNotify() {
-		Object obj = getModel();
-		if (obj instanceof INodeNotifier) {
-			((INodeNotifier) obj).addAdapter(this);
-		}
-		super.addNotify();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeNotify()
-	 */
-	public void removeNotify() {
-		super.removeNotify();
-		Object obj = getModel();
-		if (obj instanceof INodeNotifier) {
-			((INodeNotifier) obj).removeAdapter(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPart#deactivate()
-	 */
-	public void deactivate() {
-		LocationRequest hoverRequest = new LocationRequest();
-		hoverRequest.setType(RequestConstants.REQ_SELECTION_HOVER);
-		this.eraseTargetFeedback(hoverRequest);
-		super.deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		Object obj = getModel();
-		if (key == IPropertySource.class) {
-			if (obj instanceof INodeNotifier) {
-				return ((INodeNotifier) obj)
-						.getAdapterFor(IPropertySource.class);
-			}
-		}
-
-		if (obj instanceof IAdaptable) {
-			Object ret = ((IAdaptable) obj).getAdapter(key);
-			if (ret != null)
-				return ret;
-		}
-		return super.getAdapter(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getDragTracker(org.eclipse.gef.Request)
-	 */
-	public DragTracker getDragTracker(Request request) {
-		return new RangeDragTracker(this);
-	}
-
-	/**
-	 * @return the model node as an IDOMNode
-	 */
-	public IDOMNode getIDOMNode() {
-		return ((IDOMNode) getModel());
-	}
-
-    /**
-     * @return the model node as a node
-     */
-    public Node getDOMNode()
-    {
-        return ((Node)getModel());
-    }
-    
-    /**
-     * @return if this edit part's model is an Element, then returns
-     * the tag identifier. Otherwise, null.
-     */
-    public TagIdentifier getTagIdentifier()
-    {
-        Node node = getDOMNode();
-        
-        if (node instanceof Element)
-        {
-            return TagIdentifierFactory.createDocumentTagWrapper(((Element)node));
-        }
-        
-        return null;
-    }
-    
-	/**
-	 * if a EditPart don't support caret inside it, and don't can't have child
-	 * edit part, then we call it as a widget.
-	 * 
-	 * @return true if this part represents a widget
-	 */
-	public boolean isWidget() {
-		return false; // child class must override.
-	}
-
-	/**
-	 * whether this EditPart allow the selection range to have one edge in the
-	 * edit part and one edge outside the edit part.
-	 * 
-	 * @return true if selection range across is allowed
-	 */
-	public boolean allowSelectionRangeAcross() {
-		return true;
-	}
-
-	/**
-	 * @return true if this part is resizable
-	 */
-	public boolean isResizable() {
-		return false;
-	}
-    
-    /**
-     * @return true if drag is active on this part
-     */
-    public boolean isDragActive() {
-        return _isDragActive;
-    }
-    
-    /**
-     * @param newValue
-     */
-    public void setDragActive(boolean newValue)
-    {
-        _isDragActive = newValue;
-    }
-    
-    /**
-     * @param mouseLocation
-     * @return this edit part's cursor or null if this edit part
-     * does not wish to specify a specific cursor (the default
-     * should be used).  
-     * Note that this is only called when no drag tracker is active,
-     * when the mouse enters the edit part with the RangeSelectionTool
-     * and the current state is INITIAL.  This allows the editpart to
-     * specify a custom mouse-over tool cursor
-     * TODO: perhaps getCursor is not a specific enough a name
-     */
-    public Cursor getCursor(Point mouseLocation)
-    {
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java
deleted file mode 100644
index 08b76d1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.ImageFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.editpolicies.NonVisualChildGraphicalEditPolicy;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Represents a node that is non-visual in the runtime rendering
- * but which may wish to have a meta-representation on the design canvas.
- *
- */
-public class NonVisualComponentEditPart extends NodeEditPart 
-{
-    protected IFigure createFigure() 
-    {
-        IFigure figure_ = new ImageFigure(getTagConverter().getVisualImage())
-        {
-
-            protected void paintFigure(Graphics graphics) {
-                super.paintFigure(graphics);
-                
-                if (getImage() == null)
-                    return;
-
-                Rectangle srcRect = new Rectangle(getImage().getBounds());
-                graphics.drawImage(getImage(), srcRect, getClientArea());
-            }
-            
-        };
-        
-        figure_.setMinimumSize(new Dimension(0,0));
-        return figure_;
-    }
-
-    public void notifyChanged(INodeNotifier notifier, int eventType,
-            Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // for now, do nothing
-    }
-
-    protected void createEditPolicies() {
-        super.createEditPolicies();
-        installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE
-                          , new NonVisualChildGraphicalEditPolicy());
-        installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-                null);
-    }
-
-    @Override
-    public void deactivate()
-    {
-        ITagConverter tagConverter = (ITagConverter) getModel();
-        if (tagConverter != null)
-        {
-            tagConverter.dispose();
-        }
-        
-        // always do super stuff
-        super.deactivate();
-    }
-
-    /**
-     * @return the tag converter
-     */
-    protected ITagConverter getTagConverter()
-    {
-    	ITagConverter tagConverter = (ITagConverter)getModel();
-    	//need to call convertRefresh to get image (if any) from metadata
-    	if (tagConverter != null) {
-    		tagConverter.convertRefresh(null);
-    	}
-    	return tagConverter;
-    }
-    
-    /**
-     * @return the host element for this edit part
-     */
-    protected Element getModelElement()
-    {
-        return getTagConverter().getHostElement();
-    }
-
-    public IDOMNode getIDOMNode() 
-    {
-        return (IDOMNode) getModelElement();
-    }
-
-    public Node getDOMNode() {
-        return getModelElement();
-    }
-
-//    public DragTracker getDragTracker(Request request) {
-//        // TODO: need to define drag semantics for these
-//        // Also, right now edit part dragging causes bad behaviour
-//        // in the non-visual decorator
-//        return null;//new ObjectModeDragTracker(this);
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java
deleted file mode 100644
index 67e62f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class Refresher implements INodeAdapter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return (type == Refresher.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		if (eventType == INodeNotifier.ADD || eventType == INodeNotifier.REMOVE) {
-			// for ADD and REMOVE, system will fire CHANGE event, so we ignore
-			// the ADD/REMOVE
-			// event here.
-			return;
-		}
-		if (notifier instanceof IDOMNode) {
-			IDOMNode node = (IDOMNode) notifier;
-			// we need to refresh all CSS style adapter of node and its
-			// children.
-			EditPart part = (EditPart) node.getAdapterFor(EditPart.class);
-			if (part instanceof SubNodeEditPart) {
-				Node nodeForFigure = ((SubNodeEditPart) part)
-						.getNodeForFigure();
-				if (nodeForFigure instanceof IDOMNode) {
-					refreshChildStyles((IDOMNode) nodeForFigure);
-				}
-			}
-
-			// we need also find the nearest parent node that has editpart, and
-			// refresh it.
-			refreshContainingPart(node,
-					eventType == INodeNotifier.STRUCTURE_CHANGED);
-
-			part = (EditPart) node.getAdapterFor(EditPart.class);
-			if (part != null) {
-				((IHTMLGraphicalViewer) part.getViewer()).clearSelectionRange();
-			}
-		}
-	}
-
-	/**
-	 * @param node
-	 */
-	private void refreshContainingPart(IDOMNode node, boolean recursive) {
-		if (node.getOwnerDocument() == node) {
-			EditPart part = (EditPart) node.getAdapterFor(EditPart.class);
-			if (part != null) {
-				part.refresh();
-			}
-		} else {
-			while (node != null) {
-				EditPart part = (EditPart) node.getAdapterFor(EditPart.class);
-				if (part != null) {
-					if (part instanceof ElementEditPart) {
-						((ElementEditPart) part).refreshModelChange(recursive);
-					} else {
-						part.refresh();
-					}
-					return;
-				}
-				node = (IDOMNode) node.getParentNode();
-			}
-		}
-	}
-
-	/**
-	 * @param node
-	 */
-	private void refreshChildStyles(IDOMNode node) {
-		NodeList childNodes = node.getChildNodes();
-		for (int i = 0, size = childNodes.getLength(); i < size; i++) {
-			refreshChildStyles((IDOMNode) childNodes.item(i));
-		}
-		if (node instanceof IDOMElement) {
-			// only refresh style on element.
-			ICSSStyle a = (ICSSStyle) node.getAdapterFor(ICSSStyle.class);
-			if (a != null) {
-				a.reset();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java
deleted file mode 100644
index bb9c599..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RefresherFactory extends AbstractAdapterFactory {
-	private final Refresher refresher = new Refresher();
-
-	RefresherFactory() {
-		super(Refresher.class, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory#createAdapter(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	protected INodeAdapter createAdapter(INodeNotifier target) {
-		return refresher;
-	}
-
-	static RefresherFactory _instance = new RefresherFactory();
-
-	/**
-	 * @return the factory singleton
-	 */
-	public static RefresherFactory getInstance() {
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/SubNodeEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/SubNodeEditPart.java
deleted file mode 100644
index 8056dd9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/SubNodeEditPart.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class SubNodeEditPart extends NodeEditPart {
-	/**
-	 * 
-	 * @return could be null
-	 */
-	public abstract Node getNodeForFigure();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java
deleted file mode 100644
index 4535c58..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.editpolicies.LinkEditPolicy;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class TextEditPart extends SubNodeEditPart implements ICSSTextProvider {
-	private String _cachedData;
-
-	private Text _textNode;
-
-	private Text _textNodeForFigure;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPart#setModel(java.lang.Object)
-	 */
-	public void setModel(Object model) {
-		super.setModel(model);
-		_textNode = (Text) model;
-		_cachedData = _textNode.getData();
-		_textNodeForFigure = getDestDocumentForDesign().createTextNode(
-				_cachedData);
-	}
-
-	protected IFigure createFigure() {
-		// XXX: currently creating of CSSTextFigure is distributed both here
-		// and FigureFactory. We may want to unify them later.
-		return new CSSTextFigure(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		this.installEditPolicy("link editpolicy", new LinkEditPolicy()); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.SubNodeEditPart#getNodeForFigure()
-	 */
-	public Node getNodeForFigure() {
-		return _textNodeForFigure;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		_cachedData = _textNode.getData();
-		_textNodeForFigure.setData(_cachedData);
-		if (eventType == INodeNotifier.CHANGE) {
-			getFigure().revalidate();
-		} else {
-			// XXX: been removed? parent EditPart should have handled it.
-		}
-	}
-
-
-	/**
-	 * @return the associated css style for this text node
-	 */
-	public ICSSStyle getCSSStyle() {
-		IFigure figure1 = this.getFigure();
-		if (figure1 instanceof ICSSFigure) {
-			ICSSStyle style = ((ICSSFigure) figure1).getCSSStyle();
-			if (style != null) {
-				return style;
-			}
-		}
-		return DefaultStyle.getInstance();
-	}
-
-	/**
-	 * As when text are displayed in HTML, they are "normalized". For example,
-	 * leading whitespace may be removed dure to previous node as trailing
-	 * whitespace. Entity reference may have be resolved. Sequence whitespace
-	 * been merged.
-	 * 
-	 * It is also possible that the text node is in "PRE" mode, in that case the
-	 * above things are not done.
-	 * 
-	 * This method return the really value that is going to be presented to
-	 * user. EditPartPosition's offset is referencing this value.
-	 * 
-	 * @return the text data
-	 * @see org.eclipse.jst.pagedesigner.viewer.DesignPosition
-	 */
-	public String getTextData() {
-		ICSSStyle style = getCSSStyle();
-		String data = _cachedData;
-		if (style.getStyleProperty(ICSSPropertyID.ATTR_WHITESPACE) != ICSSPropertyID.VAL_PRE) {
-			return HTMLUtil.compactWhitespaces(_textNode, data);
-		}
-        return data;
-	}
-
-	/**
-	 * check what part of this text node is in the range selection.
-	 * 
-	 * @return text node ranges
-	 */
-	public int[] getSelectedRange() {
-		IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) this.getViewer();
-		if (viewer == null || !viewer.isInRangeMode()) {
-			return null;
-		}
-		DesignRange range = viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return null;
-		}
-		if (!RangeUtil.intersect(range, this)) {
-			return null;
-		}
-		// ok, we intersect with the range.
-		range = RangeUtil.normalize(range);
-		EditPart startContainer = range.getStartPosition().getContainerPart();
-		EditPart endContainer = range.getEndPosition().getContainerPart();
-		int[] ret = new int[2];
-		if (startContainer != this) {
-			ret[0] = 0;
-		} else {
-			ret[0] = range.getStartPosition().getOffset();
-		}
-		if (endContainer != this) {
-			ret[1] = this.getTextData().length();
-		} else {
-			{
-				ret[1] = range.getEndPosition().getOffset();
-			}
-		}
-		return ret;
-	}
-
-	public boolean isSelectable() {
-        // controls, amongst other things, whether or not a standard 
-        // hit test in SelectionTool for mouse over will find this edit part 
-		return true;
-	}
-
-    public Cursor getCursor(Point mouseLocation) {
-        return SharedCursors.IBEAM;
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java
deleted file mode 100644
index 83d190d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import javax.servlet.jsp.el.ELException;
-import javax.servlet.jsp.el.FunctionMapper;
-import javax.servlet.jsp.el.VariableResolver;
-
-import org.apache.commons.el.ExpressionEvaluatorImpl;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.jsp.core.el.JSFELParserHelper;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-
-/**
- * This is a static class. But it has "session" concept in it. To make it static
- * is only to simplify its use.
- * 
- * This class currently is only used by TagConverter, when calculating the
- * displayed string for resource bundle items.
- * 
- * XXX: in the future, if we want to this to be non-static, we may incorportate
- * it into the context of the tag converter.
- * 
- * @author mengbo
- * @version 1.5
- */
-// TODO: we may consider support cache the properties.
-public class PageExpressionContext {
-	private static final Logger _log = PDPlugin
-			.getLogger(PageExpressionContext.class);
-
-	static PageExpressionContext _current;
-
-	List _pageVarProviders = new ArrayList();
-
-	VariableResolver resolver = new SimpleVariableResolver();
-
-	private IProject _prj;
-
-	/**
-	 * @param prj
-	 */
-	public PageExpressionContext(IProject prj) {
-		_prj = prj;
-	}
-
-	/**
-	 * reset the context.
-	 */
-	public static void reset() {
-		_current = null;
-	}
-
-	/**
-	 * Initialize the current context
-	 * @param prj
-	 */
-	public static void initialize(IProject prj) {
-		_current = new PageExpressionContext(prj);
-	}
-
-	/**
-	 * @return the current context
-	 */
-	public static PageExpressionContext getCurrent() {
-		return _current;
-	}
-
-	/**
-	 * @param provider
-	 */
-	public void pushPageVarProvider(IPageVariablesProvider provider) {
-		_pageVarProviders.add(provider);
-	}
-
-	/**
-	 * @param provider
-	 */
-	public void popPageVarProvider(IPageVariablesProvider provider) {
-		try {
-			_pageVarProviders.remove(_pageVarProviders.size() - 1);
-		} catch (Exception ex) {
-			// "Error"
-			_log.info("PageExpressionContext.Info.0", ex); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * this method is for design time expression evaluation. Currently it only
-	 * handles
-	 * 
-	 * @param expression
-	 * @param expectedClass 
-	 * @param options
-	 *            XXX: not used today. In the future, we may support things like
-	 *            locale in options
-	 * @return the result of evaluating the expression
-	 * @throws ELException 
-	 */
-	public Object evaluateExpression(String expression, Class expectedClass,
-			Map options) throws ELException {
-		expression = JSFELParserHelper.toJspElExpression(expression);
-		ExpressionEvaluatorImpl evaluator = new ExpressionEvaluatorImpl();
-		FunctionMapper mapper = new EmptyFunctionMapper();
-
-		return evaluator.evaluate(expression, expectedClass, resolver, mapper);
-	}
-
-	class SimpleVariableResolver implements VariableResolver {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see javax.servlet.jsp.el.VariableResolver#resolveVariable(java.lang.String)
-		 */
-		public Object resolveVariable(String varName) throws ELException {
-			// reverse order.
-			for (int k = _pageVarProviders.size() - 1; k >= 0; k--) {
-				IPageVariablesProvider _pageVars = (IPageVariablesProvider) _pageVarProviders
-						.get(k);
-				if (_pageVars != null) {
-					IVariableInfo[] vars = _pageVars.getBeanInfos();
-					if (vars != null) {
-						for (int i = 0; i < vars.length; i++) {
-							if (varName.equals(vars[i].getName())) {
-								// ok we found.
-								if (vars[i].getMode() == IVariableInfo.RESOURCEBUNDLE) {
-									String resourceName = vars[i]
-											.getTypeInfoString();
-									IStorage s = null;
-									try {
-										s = LoadBundleUtil
-												.getLoadBundleResource(_prj,
-														resourceName);
-									} catch (CoreException ex) {
-										// "Error"
-										_log
-												.info(
-														"PageExpressionContext.Info.0", ex); //$NON-NLS-1$
-									}
-									if (s == null) {
-										throw new ELException();
-									}
-									InputStream input = null;
-									try {
-										input = new BufferedInputStream(s
-												.getContents());
-										Properties p = new Properties();
-										p.load(input);
-										return p;
-									} catch (CoreException e) {
-										throw new ELException(e);
-									} catch (IOException e) {
-										throw new ELException(e);
-									} finally {
-										ResourceUtils.ensureClosed(input);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-			throw new ELException("Can't find: " + varName); //$NON-NLS-1$
-		}
-
-	}
-
-	static class EmptyFunctionMapper implements FunctionMapper {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see javax.servlet.jsp.el.FunctionMapper#resolveFunction(java.lang.String,
-		 *      java.lang.String)
-		 */
-		public Method resolveFunction(String arg0, String arg1) {
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java
deleted file mode 100644
index 4c0b2f7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.wst.xml.core.internal.document.InvalidCharacterException;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreviewConvertContext {
-	private Logger _log = PDPlugin.getLogger(PreviewConvertContext.class);
-
-	private IDOMDocument _destDocument;
-
-	/**
-	 * Instantiates an instance for the specified IDOMDocument.
-	 * 
-	 * @param destDocument IDOMDocument instance.
-	 */
-	public PreviewConvertContext(IDOMDocument destDocument) {
-		this._destDocument = destDocument;
-	}
-
-	/**
-	 * Converts specified Node for preview.
-	 * 
-	 * @param ele Node instance to convert.
-	 * @return Converted Node instance.
-	 */
-	public Node previewConvert(Node ele) {
-		if (ele instanceof Element) {
-			return previewConvertElement((Element) ele);
-		} else if (ele instanceof Text) {
-			return createText((Text) ele);
-		} else {
-			// XXX: we'll support other node like doctype etc in the future.
-			// so they should also be rendered into preview.
-
-			return null;
-		}
-	}
-
-	/**
-	 * @param text
-	 * @return
-	 */
-	private Node createText(Text text) {
-		Text previewText = this._destDocument.createTextNode(text.getData());
-		try {
-			((IDOMText) previewText).setSource(((IDOMText) text).getSource());
-		} catch (InvalidCharacterException e) {
-			// "Error"
-			_log.info("PreviewConvertContext.Error.0", e); //$NON-NLS-1$
-		}
-		return previewText;
-	}
-
-	/**
-	 * Converts specified Element instance for preview.
-	 * 
-	 * @param ele Element instance to be converted.
-	 * @return Converted Node instance.
-	 */
-	protected Node previewConvertElement(Element ele) {
-		ITagConverter converter = createTagConverter(ele);
-		if (!converter.isVisualByHTML()) {
-			return null;
-		}
-		converter.convertRefresh(null);
-		Element result = converter.getResultElement();
-		List children = converter.getChildModeList();
-		if (children != null) {
-			for (int i = 0, size = children.size(); i < size; i++) {
-				Node child = (Node) children.get(i);
-				if (child != null) {
-					Node childPreview = previewConvert(child);
-					if (childPreview != null) {
-						ConvertPosition position = converter
-								.getChildVisualPosition(child);
-						if (position != null) {
-							/* FIX for bug #179403
-							// FIXME: not using index here, need fix.
-							position.getParentNode().appendChild(childPreview);
-							*/
-							NodeList childNodes = position.getParentNode().getChildNodes();
-							if (childNodes.getLength() > position.getIndex()) {
-								Node item = childNodes.item(position.getIndex());
-								position.getParentNode().insertBefore(childPreview, item);
-							} else {
-								position.getParentNode().appendChild(childPreview);
-							}
-						}
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param ele
-	 * @return
-	 */
-	private ITagConverter createTagConverter(Element ele) {
-		return DTManager.getInstance().getTagConverter(ele,
-				IConverterFactory.MODE_PREVIEW, _destDocument);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java
deleted file mode 100644
index 881e306..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.document.XMLGeneratorImpl;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.core.internal.provisional.document.ISourceGenerator;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreviewHandlerNew {
-	//private static Logger _log = PDPlugin.getLogger(PreviewHandlerNew.class);
-
-	/**
-	 * @param part
-	 * @param result
-	 */
-	public static void generatePreview(DocumentEditPart part,
-			StringBuffer result) {
-		try {
-			IProject prj = StructuredModelUtil.getProjectFor(part.getIDOMNode()
-					.getModel());
-			PageExpressionContext.initialize(prj);
-
-			IDOMDocument doc = (IDOMDocument) part.getIDOMNode();
-			Object obj = doc.getAdapterFor(IDocumentPageVariableAdapter.class);
-			if (obj instanceof IPageVariablesProvider) {
-				((IPageVariablesProvider) obj).refresh();
-				PageExpressionContext.getCurrent().pushPageVarProvider(
-						(IPageVariablesProvider) obj);
-			} else {
-				PageExpressionContext.getCurrent().pushPageVarProvider(null);
-			}
-
-			// IDOMModel previewModel =
-			// (IDOMModel)StructuredModelManager.getModelManager().createNewInstance(doc.getModel());
-			// IDOMDocument previewDoc = previewModel.getDocument();
-
-			// CR400625: creating XML model here instead of HTML model. Since
-			// for HTML model, there are checking enforced
-			// by WTP to make sure the HTML content model is not invalidated.
-			// And sometimes, the converted HTML may not fully
-			// comply with HTML content model.
-			// Use XML instead to workaround the content model validation.
-
-			// CR403449: But if we use XML, then system can't recogonize special
-			// tag such as "script", "style", they
-			// support <!-- --> in them.
-			// So we are still using HTML model, but in TagConverter, we are
-			// always caling DOMUtil.cloneNodeDeepIgnoreError
-			// to try to skip the errors.
-			// Hopefully in later version of SSE, the famous "br" problem is
-			// fixed, and we won't met error when doing
-			// deep clone.
-			// IStructuredModel sModel =
-			// StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(IContentTypeIdentifier.ContentTypeID_XML);
-			// FIXME: if is not jsp, should use original contentType, if is jsp,
-			// should use the corresponding
-			// content type
-			IStructuredModel sModel = StructuredModelManager.getModelManager()
-					.createUnManagedStructuredModelFor(
-							ContentTypeIdForHTML.ContentTypeID_HTML);
-
-			IDOMDocument previewDoc = ((IDOMModel) sModel).getDocument();
-			PreviewConvertContext context = new PreviewConvertContext(
-					previewDoc);
-
-			ISourceGenerator generator = XMLGeneratorImpl.getInstance();
-			List subeditparts = part.getChildren();
-			for (int i = 0, size = subeditparts.size(); i < size; i++) {
-				NodeEditPart subpart = (NodeEditPart) subeditparts.get(i);
-				Node node = context.previewConvert(subpart.getIDOMNode());
-
-				PreviewUtil.previewNode(node);
-
-				appendSkinStyleSheetLinks(node, subpart.getIDOMNode());
-
-				if (node != null) {
-					result.append(generator.generateSource(node));
-				}
-
-			}
-			sModel.releaseFromEdit();
-		} finally {
-			PageExpressionContext.reset();
-		}
-	}
-
-	private static void appendSkinStyleSheetLinks(Node previewNode, IDOMNode domNode) {
-		if (previewNode != null && domNode != null) {
-			Element head = locateHeadElement(previewNode);
-			if (head != null) {
-				Document document = head.getOwnerDocument();
-				if (document != null) {
-					DTSkinManager skinManager = DTSkinManager.getInstance(domNode);
-					if (skinManager != null) {
-						List<IDTSkin> currentSkins = skinManager.getCurrentSkins();
-						for (IDTSkin currentSkin: currentSkins) {
-							List<String> styleSheetLocations = currentSkin.getStyleSheetLocations();
-							for (String styleSheetLocation: styleSheetLocations) {
-								Element link = document.createElement(IHTMLConstants.TAG_LINK);
-								link.setAttribute(IHTMLConstants.ATTR_REL, "stylesheet"); //$NON-NLS-1$
-								link.setAttribute(IHTMLConstants.ATTR_TYPE, "text/css"); //$NON-NLS-1$
-								link.setAttribute(IHTMLConstants.ATTR_HREF, styleSheetLocation);
-								head.appendChild(link);
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private static Element locateHeadElement(Node node) {
-		Element head = null;
-		if (node != null && node instanceof Element) {
-			if (node.getLocalName().equalsIgnoreCase(IHTMLConstants.TAG_HEAD)) {
-				head = (Element)node;
-			} else {
-				NodeList childNodes = node.getChildNodes();
-				for (int i = 0, len = childNodes.getLength(); i < len; i++) {
-					head = locateHeadElement(childNodes.item(i));
-					if (head != null) {
-						break;
-					}
-				}
-			}
-		}
-		return head;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java
deleted file mode 100644
index 6aa3c67..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class PreviewResources extends ResourceUtils {
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(PreviewResources.class);
-
-	private static PreviewResources _resource; // singleton
-
-	private static final String BUNDLE = "org.eclipse.jst.pagedesigner.preview.PreviewResources"; //$NON-NLS-1$
-
-	/**
-	 * Empty Constructor.
-	 * 
-	 * @return WizardsResources
-	 */
-
-	public static PreviewResources getInstance() {
-		if (_resource == null) {
-			_resource = new PreviewResources();
-		}
-		return _resource;
-	}
-
-	/**
-	 * The constructor create a resource bundle
-	 */
-	protected PreviewResources() {
-		try {
-			_resources = ResourceBundle.getBundle(BUNDLE);
-			// NOTE: this throws a runtime "MissingResourceException".
-		} catch (MissingResourceException ee) {
-			_log
-					.error(
-							"Log.Error.PreviewResources.ResouceNotFound", BUNDLE, ee); //$NON-NLS-1$
-		}
-		setBundle(_resources, BUNDLE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties
deleted file mode 100644
index 1e42ee3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Resource message for RenderingTraverser
-####################################################
-RenderingTraverser.Error.FileNotFound		=	File not found.
-RenderingTraverser.Error.UnsupportedEncoding	=	Unsupport encoding.
-RenderingTraverser.Error.IO		=	IO exception.
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java
deleted file mode 100644
index b1811ab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.io.File;
-
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.ProgressEvent;
-import org.eclipse.swt.browser.ProgressListener;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Models the windows IE browser for preview
- *
- */
-public class WindowsIEBrowser implements ProgressListener {
-	private Browser _browser;
-
-	/**
-	 * @param composite
-	 * @param i
-	 */
-	public void create(Composite composite, int i) {
-		_browser = new Browser(composite, i);
-		_browser.addProgressListener(this);
-	}
-
-	/**
-	 * @param file
-	 */
-	public synchronized void loadFile(File file) {
-		if (_browser == null) {
-			return;
-		}
-        String s = "file:" + file.getAbsolutePath(); //$NON-NLS-1$
-        _browser.setUrl(s);
-        return;
-	}
-
-	/**
-	 * dispose the instance
-	 */
-	public void dispose() {
-		if (_browser == null) {
-			return;
-		}
-        _browser.dispose();
-        _browser = null;
-        return;
-	}
-
-	public void changed(ProgressEvent progressevent) {
-        // do nothing
-	}
-
-	public void completed(ProgressEvent progressevent) {
-	    // do nothing
-	}
-
-	/**
-	 * @return the underlying swt Browser instance
-	 */
-	public Browser getBrowser() {
-		return _browser;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AllPropertySection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AllPropertySection.java
deleted file mode 100644
index 3c40094..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AllPropertySection.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.IPropertySourceProvider;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * Mainly copied from AdvancedPropertySection. But extend it to allow setting
- * PropertySourceProvider.
- * 
- * @author mengbo
- */
-public class AllPropertySection extends AbstractPropertySection {
-	// FIXME: workaround the eclipse properties view limitation of sorting
-	// category.
-	private AttributePropertySheetPage page;
-
-	/**
-	 * IPropertySourceProvider for this section
-	 */
-	protected IPropertySourceProvider _provider;
-
-	/**
-	 * selected tag IDOMElement 
-	 */
-	protected IDOMElement _element;
-
-	/**
-	 * The INodeAdapter to use for notification of model change
-	 */
-	protected INodeAdapter _adapter = new INodeAdapter() {
-		public boolean isAdapterForType(Object type) {
-			return false;
-		}
-
-		public void notifyChanged(INodeNotifier notifier, int eventType,
-				Object changedFeature, Object oldValue, Object newValue, int pos) {
-			refresh();
-		}
-	};
-
-	/**
-	 * Constructor
-	 */
-	public AllPropertySection() {
-		this.setPropertySourceProvider(new AttributePropertySourceProvider());
-	}
-
-	@Override
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		
-	
-		Composite composite = getWidgetFactory()
-				.createFlatFormComposite(parent);
-		page = new AttributePropertySheetPage();
-		page.init(tabbedPropertySheetPage.getSite());
-
-		if (_provider != null) {
-			page.setPropertySourceProvider(_provider);
-		}
-
-		page.createControl(composite);
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		data.bottom = new FormAttachment(100, 0);
-		data.height = 100;
-		data.width = 100;
-		page.getControl().setLayoutData(data);
-	}
-
-	@Override
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-				part, selection);
-
-		if (_element != newEle && page != null) {
-			super.setInput(part, selection);
-			page.selectionChanged(part, selection);
-			if (_element != null) {
-				_element.removeAdapter(_adapter);
-			}
-			_element = newEle;
-			if (_element != null) {
-				_element.addAdapter(_adapter);
-			}
-		}
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-
-		if (_element != null) {
-			_element.removeAdapter(_adapter);
-		}
-		if (page != null) {
-			page.dispose();
-			page = null;
-		}
-	}
-
-	@Override
-	public void refresh() {
-		if (page != null)
-			page.refresh();
-	}
-
-	@Override
-	public boolean shouldUseExtraSpace() {
-		return true;
-	}
-
-	/**
-	 * Set provider into tabbedPropertiesPage
-	 * @param provider
-	 */
-	public void setPropertySourceProvider(IPropertySourceProvider provider) {
-		_provider = provider;
-		if (page != null){
-			page.setPropertySourceProvider(_provider);
-
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySheetPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySheetPage.java
deleted file mode 100644
index 9b236f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySheetPage.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jst.pagedesigner.meta.internal.CategoryNameComparator;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetSorter;
-
-/**
- * In PropertySheetPage, the <code>setSorter</code> is protected. Creating
- * this class to make setSorter accessible to us.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class AttributePropertySheetPage extends PropertySheetPage {
-//	TODO: add actions
-//	public void makeContributions(IMenuManager menuManager,
-//			IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
-//		super.makeContributions(menuManager, toolBarManager, statusLineManager);
-//		//add actions here
-//			hide/show all categories
-//			collapse
-//			remove
-//	}
-
-	/**
-	 * Use my sorter to sort the category name. Only override the
-	 * compareCategories method.
-	 * 
-	 * @author mengbo
-	 * @version 1.5
-	 */
-	private static class MySorter extends PropertySheetSorter {
-		public int compareCategories(String categoryA, String categoryB) {
-			return CategoryNameComparator.getInstance().compare(categoryA,
-					categoryB);
-		}
-	}
-
-	/**
-	 * Constructor
-	 */
-	public AttributePropertySheetPage() {
-		super();
-		setSorter(new MySorter());
-	}
-
-//	public void createControl(Composite parent) {
-//		super.createControl(parent);
-////		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-////				PDPlugin.getResourceString("MyPropertySheetPage.help.id"));
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.java
deleted file mode 100644
index 6ed998f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
-import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.IStructuredDocumentContextResolverFactory2;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.designtime.internal.resolver.ITagElementResolver;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * 
- * @author mengbo
- */
-public class AttributePropertySource implements IPropertySource {
-	private IDOMElement _element;
-
-	private IPropertySource _innerSource;
-
-	private Entity _tagEntity;
-
-	private IStructuredDocumentContext _context;
-
-	private IPropertyDescriptor[] _descriptors;
-
-	/**
-	 * Constructor
-	 * @param ele
-	 * @param source
-	 */
-	public AttributePropertySource(Element ele, IPropertySource source) {
-		_element = (IDOMElement) ele;
-		_innerSource = source;
-		_tagEntity = getTagEntity();
-	}
-
-	private Entity getTagEntity() {
-		_context = 
-				IStructuredDocumentContextFactory.INSTANCE.getContext(_element.getStructuredDocument(), _element);
-		if (_context == null) 
-			return null;
-		
-		IWorkspaceContextResolver wsresolver = 
-				IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(_context);
-		if (wsresolver == null) 
-			return null;
-		
-		ITaglibContextResolver resolver = 
-				IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(_context);
-		if (resolver == null) return null;
-		
-		String uri = resolver.getTagURIForNodeName(_element);
-		
-		//TODO: make below better
-		if (uri == null){
-			if (_element.getNamespaceURI() != null && _element.getNamespaceURI().equals("http://java.sun.com/JSP/Page")) //$NON-NLS-1$
-				uri = "JSP11"; //$NON-NLS-1$
-			else
-				uri = "HTML"; //$NON-NLS-1$
-		}
-		ITaglibDomainMetaDataModelContext domainContext = 
-				TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(wsresolver.getProject(), uri);
-		return TaglibDomainMetaDataQueryHelper.getEntity(domainContext, _element.getLocalName());		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
-	 */
-	public Object getEditableValue() {
-		return _innerSource.getEditableValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
-	 */
-	public Object getPropertyValue(Object id) {
-		// CR377844: when the attribute in source is "a&gt;b", we would like to
-		// display
-		// "a>b" in cell editor. But _innerSource.getPropertyValue(id) will
-		// return the source
-		// of the attribute, so can't use that here.
-		// read QTS log for detail.
-		// return _innerSource.getPropertyValue(id);
-		if (id == null) {
-			return null;
-		}
-		String name = id.toString();
-		String value = _element.getAttribute(name);
-		if (value == null) {
-			value = ""; //$NON-NLS-1$
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
-	 */
-	public boolean isPropertySet(Object id) {
-		return _innerSource.isPropertySet(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
-	 */
-	public void resetPropertyValue(Object id) {
-		_innerSource.resetPropertyValue(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public void setPropertyValue(final Object id, final Object value) {
-		Object oldValue = getPropertyValue(id);
-		if (oldValue == value || (oldValue != null && oldValue.equals(value))) {
-			return;
-		}
-		Command c = new ChangeAttributeCommand(
-				PDPlugin
-						.getResourceString("AttributePropertySource.CommandLabel.ChangeAttribute"), _element, (String) id, (String) value); //$NON-NLS-1$
-		c.execute();
-	}
-
-	/**
-	 * the major job of this wrapper is to provide tag attribute property descriptors 
-	 */
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		if (_descriptors == null) {
-			final List result = new ArrayList();
-			
-			final ITagElementResolver tagregResolver = IStructuredDocumentContextResolverFactory2.INSTANCE
-					.getResolver(_context, ITagElementResolver.class);
-			
-			if (tagregResolver != null) { //relies on getTagEntity() having been called to have setup the _element
-				final ITagElement tag = tagregResolver.getTagElement(_element);
-				if (tag != null) {
-					for (final ITagAttribute attr : tag.getAttributes().values()) {
-						final IPropertyDescriptor pd = getAttrPropertyDescriptor(attr
-								.getName());
-						if (pd != null)
-							result.add(new PropertyDescriptorWrapper(_element,
-									pd));// ,
-							// getStatusLineManager()));
-						else {
-							final PropertyDescriptor pd1 = new TextPropertyDescriptor(
-									attr.getName(), attr.getName());
-							pd1.setDescription(attr.getDescription());
-							pd1.setCategory(ITabbedPropertiesConstants.OTHER_CATEGORY);
-							result.add(new PropertyDescriptorWrapper(_element,
-									pd1));// ,
-							// getStatusLineManager()));
-						}
-
-					}
-				}
-			}
-			
-			if (result.size() == 0) {// for JSP and HTML cases
-														// this is still
-														// necessary
-				final IPropertyDescriptor[] descs = _innerSource.getPropertyDescriptors();
-				for (int i = 0; i < descs.length; i++) {
-					final IPropertyDescriptor pd = getAttrPropertyDescriptor((String) descs[i]
-							.getId());
-					if (pd != null)
-						result.add(new PropertyDescriptorWrapper(_element, pd));// ,
-					// getStatusLineManager()));
-					else {
-						if (descs[i] instanceof PropertyDescriptor)
-							((PropertyDescriptor) descs[i])
-									.setCategory(ITabbedPropertiesConstants.OTHER_CATEGORY);
-						result.add(new PropertyDescriptorWrapper(_element,
-								descs[i]));// ,
-						// getStatusLineManager()));
-					}
-
-				}
-			}
-
-			_descriptors = new IPropertyDescriptor[result.size()];
-			result.toArray(_descriptors);
-
-		}
-		return _descriptors;
-	}
-
-//	private IAttributeDescriptor findReferencedAttribute(
-//			IElementDescriptor elementDescriptor, IPropertyDescriptor desc) {
-//		return null;
-//	}
-
-//	private IElementDescriptor getElementDescriptor() {
-//		ICMRegistry registry = CMRegistry.getInstance();
-//		String uri = CMUtil.getElementNamespaceURI(_element);
-//		return registry.getElementDescriptor(uri, _element.getLocalName());
-//	}
-
-	private IPropertyDescriptor getAttrPropertyDescriptor(String attrName){
-		Entity attrEntity = TaglibDomainMetaDataQueryHelper.getEntity(_tagEntity, attrName);
-		List ppds = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(IPropertyPageDescriptor.class, _context, attrEntity);
-		if (ppds.size() > 0)
-			return (IPropertyDescriptor)((IPropertyPageDescriptor)ppds.get(0)).getAdapter(IPropertyDescriptor.class);
-		
-		return null;
-			
-	}
-	
-//	private IStatusLineManager getStatusLineManager() {
-//		_page.getSite().getActionBars().getStatusLineManager();
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySourceProvider.java
deleted file mode 100644
index 086072b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySourceProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.IPropertySourceProvider;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.ui.internal.properties.XMLPropertySource;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class AttributePropertySourceProvider implements IPropertySourceProvider {
-
-	/**
-	 * Constructor
-	 */
-	public AttributePropertySourceProvider() {
-		//
-	}
-
-	public IPropertySource getPropertySource(Object object) {
-		Element model = null;
-		IPropertySource source = null;
-
-		if ((model = DesignerPropertyTool.getElementNode(object)) != null) {
-			source = (IPropertySource) ((INodeNotifier) (model))
-					.getAdapterFor(IPropertySource.class);
-			if (source == null) {
-				source = new XMLPropertySource((INodeNotifier) model);
-			}
-		}
-		if (source != null) {
-			return new AttributePropertySource( model, source);
-		}
-		return source;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/BaseCustomSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/BaseCustomSection.java
deleted file mode 100644
index db8742d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/BaseCustomSection.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StatusUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class BaseCustomSection extends AbstractPropertySection {
-
-	/**
-	 * Status that all is OK
-	 */
-	protected static final Status OKSTATUS = new Status(IStatus.OK, PDPlugin
-			.getPluginId(), 0, "", null); //$NON-NLS-1$
-
-	private WPETabbedPropertySheetPage _propertySheetPage;
-
-	private boolean _visible = false;
-
-	/**
-	 * the tag IDOMElement
-	 */
-	protected IDOMElement _element;
-
-	/**
-	 * the INodeAdapter used to receive notifications of model updates
-	 */
-	protected INodeAdapter _adapter = new INodeAdapter() {
-		public boolean isAdapterForType(Object type) {
-			return false;
-		}
-
-		public void notifyChanged(INodeNotifier notifier, int eventType,
-				Object changedFeature, Object oldValue, Object newValue, int pos) {
-			BaseCustomSection.this.notifyChanged(notifier, eventType,
-					changedFeature, oldValue, newValue, pos);
-		}
-	};
-
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-				part, selection);
-		if (_element != newEle) {
-			if (_element != null) {
-				_element.removeAdapter(_adapter);
-			}
-			_element = newEle;
-			if (_element != null) {
-				_element.addAdapter(_adapter);
-			}
-		}
-	}
-
-	/**
-	 * Method adapter will call when element has changed
-	 * 
-	 * @param notifier
-	 * @param eventType
-	 * @param changedFeature
-	 * @param oldValue
-	 * @param newValue
-	 * @param pos
-	 */
-	protected abstract void notifyChanged(INodeNotifier notifier,
-			int eventType, Object changedFeature, Object oldValue,
-			Object newValue, int pos);
-
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		_propertySheetPage = (WPETabbedPropertySheetPage) aTabbedPropertySheetPage;
-	}
-
-	/**
-	 * for certain action performed in the section, may result big change in the
-	 * model. e.g: change tag name will result in editpart recreate. In this
-	 * case, we need do a total refresh.
-	 * 
-	 */
-	protected void refreshPropertySheetPage() {
-		if (_propertySheetPage != null) {
-			IWorkbenchPart part = getPart();
-			if (part != null) {
-				ISelection sel = part.getSite().getSelectionProvider()
-						.getSelection();
-				_propertySheetPage.selectionChanged(part, sel);
-			} else {
-				// XXX: will else happen?
-				System.out.println("AbstractCustomSection --> What to do?"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * Change selection
-	 * @param node
-	 */
-	protected void gotoNode(Node node) {
-		_propertySheetPage.internalChangeSelection(node, node);
-	}
-
-	/**
-	 * @return IStatusLineManager to use for the property sheet page
-	 */
-	protected IStatusLineManager getStatusLineManager() {
-		if (_propertySheetPage != null) {
-			IActionBars bar = _propertySheetPage.getSite().getActionBars();
-			if (bar != null) {
-				return bar.getStatusLineManager();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param status to display on status line
-	 */
-	protected void applyStatus(IStatus[] status) {
-		if (!_visible) {
-			return;
-		}
-
-		IStatusLineManager statusLine = getStatusLineManager();
-		if (statusLine == null) {
-			return;
-		}
-
-		IStatus s;
-		if (status == null || status.length == 0) {
-			s = null;
-		} else {
-			s = StatusUtil.getMostSevere(status);
-		}
-
-		if (s == null || s.getSeverity() != IStatus.ERROR) {
-			statusLine.setErrorMessage(null);
-		} else {
-			statusLine.setErrorMessage(s.getMessage());
-		}
-	}
-
-	/**
-	 * @param message
-	 */
-	protected void setErrorMessage(String message) {
-		IStatusLineManager s = getStatusLineManager();
-		if (s != null) {
-			s.setErrorMessage(message);
-		}
-	}
-
-	/**
-	 * @param message
-	 * @return Status
-	 */
-	protected Status createErrorStatus(String message) {
-		return new Status(IStatus.ERROR, PDPlugin.getPluginId(), 0, message,
-				null);
-	}
-
-	public void aboutToBeHidden() {
-		applyStatus(null);
-		_visible = false;
-//		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-//				part, selection);
-//		if (_element != newEle) {
-			if (_element != null) {
-				_element.removeAdapter(_adapter);
-			}
-//			_element = newEle;
-//			if (_element != null) {
-//				_element.addAdapter(_adapter);
-//			}
-//		}
-		super.aboutToBeHidden();
-	}
-
-	public void aboutToBeShown() {
-		super.aboutToBeShown();
-//		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-//				part, selection);
-//		if (_element != newEle) {
-//			if (_element != null) {
-//				_element.removeAdapter(_adapter);
-//			}
-//			_element = newEle;
-			if (_element != null) {
-				_element.addAdapter(_adapter);
-			}
-//		}
-		_visible = true;
-	}
-
-	/**
-	 * @return IProject for the WPE editing instance
-	 */
-	protected IProject getProject() {
-		if (_propertySheetPage != null) {
-			IEditorInput input = _propertySheetPage.getEditor()
-					.getEditorInput();
-			if (input instanceof IFileEditorInput) {
-				return ((IFileEditorInput) input).getFile().getProject();
-			}
-		}
-		return null;
-	}
-
-	public void dispose() {
-		super.dispose();
-		if (_element != null) {
-			_element.removeAdapter(_adapter);
-		}
-	}
-
-	/**
-	 * @return IFile for WPE editing instance
-	 */
-	protected IFile getFile() {
-		if (_propertySheetPage != null) {
-			IEditorInput input = _propertySheetPage.getEditor()
-					.getEditorInput();
-			if (input instanceof IFileEditorInput) {
-				return ((IFileEditorInput) input).getFile();
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerPropertyTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerPropertyTool.java
deleted file mode 100644
index d32d534..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerPropertyTool.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectNature;
-import org.eclipse.gef.editparts.AbstractEditPart;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.views.contentoutline.ContentOutline;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Attr;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This is util class most used by Property related operation.
- * 
- * @author mengbo
- */
-public class DesignerPropertyTool {
-	
-	/**
-	 * @param fNode
-	 * @param attributeDesc
-	 * @return attribute value
-	 */
-	public static String getAttributeValue(Element fNode, CMNode attributeDesc) {
-		if (attributeDesc == null) {
-			return ""; //$NON-NLS-1$
-		}
-		String returnedValue = ""; //$NON-NLS-1$
-		NamedNodeMap attrMap = fNode.getAttributes();
-		if (attrMap != null) {
-			Node attribute = attrMap.getNamedItem(attributeDesc.getNodeName());
-			if (attribute != null) {
-				if (attribute instanceof IDOMNode) {
-					returnedValue = ((IDOMNode) attribute).getValueSource();
-				} else {
-					returnedValue = attribute.getNodeValue();
-				}
-			}
-		}
-		return returnedValue;
-	}
-
-//	/**
-//	 * @param fNode
-//	 * @param filter
-//	 * @return array of attributes as objects
-//   * (unused)	
-//	 */
-//	public static Object[] getElementReferedAttributes(Element fNode,
-//			String[] filter) {
-//		List result = new ArrayList();
-//		CMNamedNodeMap cmnnm = getElementDeclaredAttributes(fNode);
-//		for (int i = 0, n = cmnnm.getLength(); i < n; i++) {
-//			String name = cmnnm.item(i).getNodeName();
-//			if (Arrays.asList(filter).contains(name)) {
-//				result.add(cmnnm.item(i));
-//			}
-//		}
-//		return result.toArray(new CMNode[result.size()]);
-//	}
-
-	/**
-	 * @param fNode
-	 * @return CMNamedNodeMap
-	 */
-	public static CMNamedNodeMap getElementDeclaredAttributes(Node fNode) {
-		IStructuredModel structModel = null;
-		if (fNode instanceof IDOMNode) {
-			structModel = ((IDOMNode) fNode).getModel();
-		}
-		if (null == structModel) {
-			return null;
-		}
-		CMElementDeclaration cmde = null;
-		CMNamedNodeMap cmnnm = null;
-		if (fNode == null || fNode.getNodeType() != Node.ELEMENT_NODE) {
-			cmde = null;
-		}
-		ModelQuery modelQuery = ModelQueryUtil.getModelQuery(fNode
-				.getOwnerDocument());
-		if (modelQuery != null) {
-			cmde = modelQuery.getCMElementDeclaration((Element) fNode);
-		}
-		if (cmde != null) {
-			cmnnm = cmde.getAttributes();
-		}
-		return cmnnm;
-	}
-
-	/**
-	 * the selection could be different kinds of selection, including: 1.
-	 * ITextSelection 2. IStructuredSelection (Node) 3. IStructuredSelection
-	 * (EditPart) 4. DesignRange we want to normalize it to only #2. If the node
-	 * is ATTR or TEXT/CDATA_SECTION, will use it's parent node.
-	 * 
-	 * @param selectingPart
-	 * @param selection
-	 * @param htmlEditor
-	 * @return null if can't normalize.
-	 */
-	public static Node normalizeSelectionToElement(
-			IWorkbenchPart selectingPart, ISelection selection,
-			HTMLEditor htmlEditor) {
-		
-		Node node = null;
-		if (selectingPart instanceof HTMLEditor) {
-			IEditorPart part = ((HTMLEditor) selectingPart).getActiveEditor();
-			if (part instanceof TextEditor) {
-				if (selection instanceof ITextSelection) {
-					IStructuredModel model = ((HTMLEditor) selectingPart)
-							.getModel();
-					node = SelectionHelper.toNode(model,
-							(ITextSelection) selection);
-				}
-			} else if (part instanceof GraphicalEditor) {
-				if (selection instanceof IStructuredSelection) {
-					node = SelectionHelper
-							.toNode((IStructuredSelection) selection);
-				} else if (selection instanceof DesignRange) {
-					node = SelectionHelper.toNode((DesignRange) selection);
-				}
-			}
-			if (node instanceof Attr) {
-				node = ((Attr) node).getOwnerElement();
-			} else if (node instanceof Text || node instanceof CDATASection) {
-				node = node.getParentNode();
-			}
-		} else if (selectingPart instanceof ContentOutline) {
-			if (selection instanceof IStructuredSelection
-					&& ((ContentOutline) selectingPart).getCurrentPage() != null
-					&& ((ContentOutline) selectingPart).getCurrentPage()
-							.getControl().isFocusControl()) {
-				node = SelectionHelper.toNode((IStructuredSelection) selection);
-				if (node == null) {
-					node = htmlEditor.getDOMDocument();
-				}
-			}
-		}
-
-		return node;
-	}
-
-	/**
-	 * @param node as Object
-	 * @return element 
-	 */
-	public static Element getElementNode(Object node) {
-		Object model;
-		Element element = null;
-		if (node == null) {
-			return null;
-		}
-
-		if (node instanceof Element) {
-			element = (Element) node;
-		} else if (node instanceof AbstractEditPart) {
-			model = ((AbstractEditPart) node).getModel();
-			if (model instanceof Element) {
-				element = (Element) model;
-			}
-		} else if (node instanceof ISelection) {
-			element = getElement(null, (ISelection) node);
-		}
-		return element;
-	}
-
-	/**
-	 * @param element
-	 * @param filter
-	 * @return list of attribute names
-	 */
-	public static List getNameList(Element element, String[] filter) {
-		List result = new ArrayList();
-		CMNamedNodeMap attributes = getElementDeclaredAttributes(element);
-		if (attributes != null) {
-			for (int i = 0, n = attributes.getLength(); i < n; i++) {
-				String name = attributes.item(i).getNodeName();
-				if (Arrays.asList(filter).contains(name))
-					result.add(name);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param selection
-	 *            should be a normalized selection
-	 * @return node
-	 */
-	public static Node getCommonParent(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			Object obj = ((IStructuredSelection) selection).getFirstElement();
-			return (Node) obj;
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			Node node1 = range.getStartPosition().getContainerNode();
-			Node node2 = range.getEndPosition().getContainerNode();
-			return DOMUtil.findCommonAncester(node1, node2);
-		} else {
-			// should not happen
-			return null;
-		}
-	}
-
-	/**
-	 * The passed in selection should be normalized selection.
-	 * 
-	 * @param selectingPart
-	 * @param selection
-	 * @return element
-	 */
-	public static Element getElement(IWorkbenchPart selectingPart,
-			ISelection selection) {
-		Node node = getCommonParent(selection);
-		if (node instanceof Element) {
-			return (Element) node;
-		} else if (node != null) {
-			node = node.getParentNode();
-			if (node instanceof Element) {
-				return (Element) node;
-			}
-		}
-		return null;
-	}
-
-	// reserved for future native use.
-	// public static void dumpChildren(Element element)
-	// {
-	// // In this function we are using logger to dump message out.
-	// Logger logger = PDPlugin.getLogger(DesignerPropertyTool.class);
-	// if (element == null || !DEBUG)
-	// return;
-	// NodeList nl = element.getChildNodes();
-	// // It's our pattern for dumping message
-	// logger.debug("\n----------------------------"); //$NON-NLS-1$
-	// logger.debug("Element:" + element.getNodeName()); //$NON-NLS-1$
-	// for (int i = 0; i < nl.getLength(); i++)
-	// {
-	// Node node = nl.item(i);
-	// logger.debug("child[" + i + "]:" + node.getNodeName()); //$NON-NLS-1$
-	// //$NON-NLS-2$
-	// }
-	// logger.debug("----------------------------\n"); //$NON-NLS-1$
-	// }
-
-	/**
-	 * @param element
-	 * @return bool
-	 *  (unused)
-	 */
-	public static boolean isMultiSelection(Element element) {
-		if (element.getNodeName().equalsIgnoreCase(IHTMLConstants.TAG_OPTION)) {
-			return element.getAttribute(ICSSPropertyID.ATTR_MULTIPLE) != null;
-		}
-		return false;
-	}
-
-//	/**
-//	 * @param element
-//	 * @return if elementImpl, return source, else null
-//	 * (unused)
-//	 */
-//	public static String getElementTextSource(Element element) {
-//		if (element == null) {
-//			return null;
-//		}
-//		if (element instanceof ElementImpl) {
-//			return ((ElementImpl) element).getSource();
-//		}
-//		return null;
-//	}
-
-	/**
-	 * @param project
-	 * @return IJavaProject
-	 */
-	public static IJavaProject getJavaProject(Object project) {
-		if (project == null) {
-			return null;
-		}
-		if (project instanceof IJavaProject) {
-			return (IJavaProject) project;
-		} else if (project instanceof IProject) {
-			try {
-				IProjectNature nature = ((IProject) project)
-						.getNature(JavaCore.NATURE_ID);
-				if (nature == null) {
-					return null;
-				}
-                return (IJavaProject) nature;
-			} catch (Exception e) {
-				// Error.DesignerPropertyTool.NatureQuerying = Error in project
-				// java nature querying
-				PDPlugin.getLogger(DesignerPropertyTool.class).error(
-						"Error.DesignerPropertyTool.NatureQuerying", e); //$NON-NLS-1$
-				// Should be error tolerable?
-				return null;
-			}
-		}
-		return null;
-	}
-//
-//	/**
-//	 * @param project as Object
-//	 * @return IProject or null
-//	 */
-//	public static IProject getProject(Object project) {
-//		if (project instanceof IProject) {
-//			return (IProject) project;
-//		} else if (project instanceof IJavaProject) {
-//			return ((IJavaProject) project).getProject();
-//		}
-//		return null;
-//	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ISectionFilter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ISectionFilter.java
deleted file mode 100644
index 95591e8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ISectionFilter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated  unused
- */
-public interface ISectionFilter {
-
-	/**
-	 * @param node
-	 * @return true if node applies
-	 */
-	boolean appliesTo(Element node);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ITabbedPropertiesConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ITabbedPropertiesConstants.java
deleted file mode 100644
index 233923a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ITabbedPropertiesConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ITabbedPropertiesConstants {
-
-	// FIXME: when return null, will in fact using "Misc". This may not guarantee
-	// it be the
-	// last category, since is sorted by string order.
-	/**
-	 * the other category
-	 */
-	static final String OTHER_CATEGORY = Messages.ITabbedPropertiesConstants_other_category;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/Messages.java
deleted file mode 100644
index a99a43c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/Messages.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalized Strings
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.messages"; //$NON-NLS-1$
-	/**
-	 * 
-	 */
-	public static String ITabbedPropertiesConstants_other_category;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.java
deleted file mode 100644
index 262b43b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class NavigationHiearchyAction extends Action {
-	private Menu _hiearchyMenu;
-
-	private Node _startNode;
-
-	private Node _currentNode;
-
-	private WPETabbedPropertySheetPage _propertyPage;
-
-	private class MenuCreator implements IMenuCreator {
-		public void dispose() {
-			if (_hiearchyMenu != null) {
-				for (int i = 0, n = _hiearchyMenu.getItemCount(); i < n; i++) {
-					MenuItem menuItem = _hiearchyMenu.getItem(i);
-					menuItem.setData(null);
-				}
-				_hiearchyMenu.dispose();
-				_hiearchyMenu = null;
-			}
-		}
-
-		public Menu getMenu(Menu parent) {
-			return null;
-		}
-
-		public Menu getMenu(Control parent) {
-			dispose();
-			_hiearchyMenu = new Menu(parent);
-
-			// next we need to add the list of parents node into the menu.
-			Node node = _startNode;
-			List list = new ArrayList();
-			while (node != null && !(node instanceof Document)
-					&& !(node instanceof DocumentFragment)) {
-				list.add(node);
-				node = node.getParentNode();
-			}
-
-			// adding ancesters reverse order.
-			for (int i = list.size() - 1; i >= 0; i--) {
-				Node thenode = (Node) list.get(i);
-				MenuItem item = new MenuItem(_hiearchyMenu, SWT.CHECK);
-				item.setSelection(thenode == _currentNode ? true : false);
-				String text = thenode.getNodeName();
-				item.setText(text);
-				item.setData(thenode);
-				item.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						Node selectedNode = (Node) e.widget.getData();
-						_propertyPage.internalChangeSelection(selectedNode,
-								_startNode);
-					}
-				});
-			}
-
-			return _hiearchyMenu;
-		}
-	}
-
-	/**
-	 * @param propertyPage
-	 */
-	public NavigationHiearchyAction(WPETabbedPropertySheetPage propertyPage) {
-		super(""); //$NON-NLS-1$
-		setEnabled(true);
-		setMenuCreator(new MenuCreator());
-		this._propertyPage = propertyPage;
-	}
-
-	/**
-	 * @param selectedNode
-	 * @param startNode
-	 */
-	protected void changeSelection(Node selectedNode, Node startNode) {
-		this._propertyPage.internalChangeSelection(selectedNode, startNode);
-		this._currentNode = selectedNode;
-		this._startNode = startNode;
-		this.setText(this._currentNode.getNodeName());
-	}
-
-	/**
-	 * @param currentNode
-	 * @param startNode
-	 */
-	protected void refresh(Node currentNode, Node startNode) {
-		this._currentNode = currentNode;
-		this._startNode = startNode;
-		if (!(_currentNode instanceof Text)
-				&& !(_currentNode instanceof Element)) {
-			this.setText("---"); //$NON-NLS-1$
-			this.setEnabled(false);
-		} else {
-			this.setText(_currentNode.getNodeName());
-			this.setEnabled(true);
-		}
-	}
-
-	@Override
-	public void run() {
-		this._propertyPage.internalChangeSelection(_currentNode, _startNode);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/PropertyDescriptorWrapper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/PropertyDescriptorWrapper.java
deleted file mode 100644
index 6503bf1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/PropertyDescriptorWrapper.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This is a simple PropertyDescriptor wrapper. It simply changed the category
- * name. This is because the default category name is "Attributes", which will
- * make them appear before other things, and that is not what we want.
- * 
- * @author mengbo
- */
-public class PropertyDescriptorWrapper implements IPropertyDescriptor {
-
-	private IPropertyDescriptor _inner;
-
-	private IDOMElement _element;
-
-	private IStatusLineManager _statusLineManager;
-
-//	/**
-//	 * Constructor
-//	 * @param element 
-//	 * @param innerDescriptor 
-//	 * @param statusLineManager 
-//	 * 
-//	 */
-//	public PropertyDescriptorWrapper(IDOMElement element,
-//			IPropertyDescriptor innerDescriptor, IStatusLineManager statusLineManager) {
-//		this._element = element;
-//		this._inner = innerDescriptor;
-//		this._statusLineManager = statusLineManager;
-//	}
-
-	/**
-	 * Constructor
-	 * @param element
-	 * @param innerDescriptor
-	 */
-	public PropertyDescriptorWrapper(IDOMElement element,
-			IPropertyDescriptor innerDescriptor) {
-		this._element = element;
-		this._inner = innerDescriptor;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#createPropertyEditor(org.eclipse.swt.widgets.Composite)
-	 */
-	public CellEditor createPropertyEditor(Composite parent) {
-		EditorCreator.CellEditorHolder holder = new EditorCreator.CellEditorHolder() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator.CellEditorHolder#createCellEditor(org.eclipse.swt.widgets.Composite)
-			 */
-			public CellEditor createCellEditor(Composite parent1) {
-				CellEditor ed = null;
-				if (_inner != null) 
-					ed = _inner.createPropertyEditor(parent1);
-				else
-					ed = new TextCellEditor(parent1);
-				
-				if (_statusLineManager != null)
-					ed.addListener(new StatusBarUpdater(ed));
-				return ed;
-			}
-		};
-		return EditorCreator.getInstance().createCellEditorWithWrapper(parent,
-				null, holder, _element, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getCategory()
-	 */
-	public String getCategory() {
-		String cat = _inner.getCategory();
-		return cat != null ? cat : ITabbedPropertiesConstants.OTHER_CATEGORY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDescription()
-	 */
-	public String getDescription() {
-		return _inner.getDescription();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDisplayName()
-	 */
-	public String getDisplayName() {
-		return _inner.getDisplayName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getFilterFlags()
-	 */
-	public String[] getFilterFlags() {
-		return _inner.getFilterFlags();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getHelpContextIds()
-	 */
-	public Object getHelpContextIds() {
-		return _inner.getHelpContextIds();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getId()
-	 */
-	public Object getId() {
-		return _inner.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getLabelProvider()
-	 */
-	public ILabelProvider getLabelProvider() {
-		return _inner.getLabelProvider();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#isCompatibleWith(org.eclipse.ui.views.properties.IPropertyDescriptor)
-	 */
-	public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
-		if (anotherProperty instanceof PropertyDescriptorWrapper) {
-			return _inner
-					.isCompatibleWith(((PropertyDescriptorWrapper) anotherProperty)
-							.getInner());
-		}
-		return _inner.isCompatibleWith(anotherProperty);
-	}
-
-	/**
-	 * @return IPropertyDescriptor
-	 */
-	public IPropertyDescriptor getInner() {
-		return _inner;
-	}
-
-	private class StatusBarUpdater implements ICellEditorListener {
-		private CellEditor ed;
-	
-		StatusBarUpdater(CellEditor ed) {
-			this.ed = ed;
-		}
-		public void applyEditorValue() {//
-		}
-		public void cancelEditor() {//
-		}
-
-		public void editorValueChanged(boolean oldValidState,
-				boolean newValidState) {
-			if (!newValidState)
-				_statusLineManager.setErrorMessage(ed.getErrorMessage());				
-			else
-				_statusLineManager.setErrorMessage(null);
-				
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/WPETabbedPropertySheetPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/WPETabbedPropertySheetPage.java
deleted file mode 100644
index 6883987..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/WPETabbedPropertySheetPage.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.properties.internal.QuickEditTabManager;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.views.contentoutline.ContentOutline;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class WPETabbedPropertySheetPage extends TabbedPropertySheetPage {
-
-	// TODO: when we want to extend this page, HTMLEditor would not be the sole
-	// type of editor part.
-	private HTMLEditor _htmlEditor;
-
-	private NavigationHiearchyAction _hiearchAction = new NavigationHiearchyAction(
-			this);
-	
-	private QuickEditTabManager manager;
-
-	private ISelectionListener _selListener;
-
-	/**
-	 * Constructor
-	 * @param tabbedPropertySheetPageContributor
-	 * @param editor 
-	 */
-	public WPETabbedPropertySheetPage(
-			ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor,
-			HTMLEditor editor) {
-		super(tabbedPropertySheetPageContributor);
-		_htmlEditor = editor;
-	}
-
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (part == null) {
-			part = _htmlEditor;
-		}
-		if (part instanceof HTMLEditor || part instanceof ContentOutline) {
-			Node node = DesignerPropertyTool.normalizeSelectionToElement(part,
-					selection, _htmlEditor);
-			if (node != null) {
-				try {
-					_hiearchAction.refresh(node, node);
-					this.getSite().getActionBars().getToolBarManager().update(
-							true);
-					//setInput(part, node);
-					super.selectionChanged(part, new StructuredSelection(node));
-				} catch (Exception e) {
-					// Some synchronization would cause this, it does not damage
-					// the data.
-				}
-			}
-		}
-	}
-	
-	/**
-	 * This method should be called from internal of the property page. Normally
-	 * means user did some action inside the property sheet to change current
-	 * selection.
-	 * 
-	 * @param selectedNode
-	 * @param innerNode
-	 */
-	public void internalChangeSelection(Node selectedNode, Node innerNode) {
-		getEditor().setFocus();
-		_hiearchAction.refresh(selectedNode, innerNode);
-		this.getSite().getActionBars().getToolBarManager().update(true);
-		super.selectionChanged(null, new StructuredSelection(selectedNode));
-	}
-
-	/**
-	 * @return EditorPart instance that this property sheet is for.   Will return instance of WPE (htmlEditor)
-	 */
-	public EditorPart getEditor() {
-		return this._htmlEditor;
-	}
-
-	public void init(IPageSite pageSite) {
-		super.init(pageSite);
-		setSelectionProvider();
-		setSelectionListener();
-		IToolBarManager toolbar = pageSite.getActionBars().getToolBarManager();
-		toolbar.add(_hiearchAction);		
-		_hiearchAction.refresh(null, null);
-	}
-
-	private void setSelectionListener() {
-		this.getSite().getWorkbenchWindow().getSelectionService()
-				.addPostSelectionListener(getSelectionListener());
-	}
-
-	private ISelectionListener getSelectionListener() {
-		if (_selListener == null){
-			_selListener = new ISelectionListener() {
-				public void selectionChanged(IWorkbenchPart part,
-						ISelection selection) {
-					if (getEditor() == part)//only fire if the selection applies to this tabbed prop sheet instance
-						WPETabbedPropertySheetPage.this.selectionChanged(
-							part, selection);
-				}
-			};
-		}
-		return _selListener;
-	}
-
-	private void setSelectionProvider() {
-		this.getSite().setSelectionProvider(new ISelectionProvider() {
-			private ISelection _selection;
-
-			public void addSelectionChangedListener(
-					ISelectionChangedListener listener) {
-			    // do nothing
-			}
-
-			/**
-			 * Returns the current selection for this provider.
-			 * 
-			 * @return the current selection
-			 */
-			public ISelection getSelection() {
-				return _selection;
-			}
-
-			/**
-			 * Removes the given selection change listener from this selection
-			 * provider. Has no affect if an identical listener is not
-			 * registered.
-			 * 
-			 * @param listener
-			 *            a selection changed listener
-			 */
-			public void removeSelectionChangedListener(
-					ISelectionChangedListener listener) {
-				// do nothing
-			}
-
-			/**
-			 * Sets the current selection for this selection provider.
-			 * 
-			 * @param selection
-			 *            the new selection
-			 */
-			public void setSelection(ISelection selection) {
-				_selection = selection;
-			}
-		});
-
-	}
-
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI
-				.getWorkbench()
-				.getHelpSystem()
-				.setHelp(
-						getControl(),
-						PDPlugin
-								.getResourceString("WPETabbedPropertySheetPage.help.id")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @return acquires an instance of QuickEditTabManager
-	 */
-	public QuickEditTabManager getTabManager() {
-		if (manager == null) {
-			manager = QuickEditTabManager.acquireInstance(this);
-		}
-		return manager;
-	}
-
-	@Override
-	public void dispose() {
-		this.getSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener(getSelectionListener());
-		this.getSite().setSelectionProvider(null);
-		manager.releaseInstance();
-		manager.dispose();
-		manager = null;
-		_selListener = null;
-		_htmlEditor = null;
-		super.dispose();
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java
deleted file mode 100644
index 2daa303..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AttributeGroupMessages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.attrgroup.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private AttributeGroupMessages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the value for key or !!key!! if not found
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public static String getString(String key, Object arg0) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public static String getString(String key, Object arg0, Object arg1) {
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java
deleted file mode 100644
index 8288c89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroupPage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.internal.AttributeGroup;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DialogUtil {
-	/**
-	 * Utility method, this method will popup a dialog for user to input
-	 * attributes for initialize a sub element. In this method will create a
-	 * command and execute it.
-	 * 
-	 * @param shell
-	 *            parent shell for dialog
-	 * @param parent
-	 *            the parent element
-	 * @param group
-	 *            the AttributeGroup
-	 * @return true if success, false if user canceled.
-	 */
-	public static boolean createSubElement(Shell shell,
-			final IDOMElement parent, final AttributeGroup group) {
-		group.setElementContext(parent, parent);//2ndParam seems to need to be parent most of the time... don't know why it WAS null... changed 12/19/07
-		
-		if (group.getDialogFields().length == 0){
-			//don't show dialog
-			createSubNode(group, parent, Collections.EMPTY_MAP);
-			return true;
-		}
-		
-		final DialogFieldGroupPage page = new DialogFieldGroupPage("", group); //$NON-NLS-1$
-		page.setTitle(AttributeGroupMessages.getString(
-				"DialogUtil.createTitle", group.getTagName())); //$NON-NLS-1$
-		page
-				.setDescription(AttributeGroupMessages
-						.getString(
-								"DialogUtil.createDescription", group.getTagName(), parent.getTagName())); //$NON-NLS-1$
-
-		Wizard wizard = new Wizard() {
-			public void addPages() {
-				super.addPage(page);
-			}
-
-			public boolean performFinish() {
-				DialogField[] fields = group.getDialogFields();
-				Map map = new HashMap();
-				for (int i = 0; i < fields.length; i++) {
-					IPropertyPageDescriptor desc = group
-							.getPropertyDescriptor(fields[i]);
-					if (desc != null && fields[i] instanceof ISupportTextValue) {
-						String value = ((ISupportTextValue) fields[i])
-								.getText();
-						if (value != null && value.length() > 0) {
-							map.put(desc.getAttributeName(), value);
-						}
-					}
-				}
-				createSubNode(group, parent, map);
-				return true;
-			}
-		};
-		wizard.setWindowTitle(AttributeGroupMessages.getString(
-				"DialogUtil.createTitle", group.getTagName())); //$NON-NLS-1$
-		wizard.setDefaultPageImageDescriptor(PDPlugin.getDefault()
-				.getImageDescriptor("newsuade_wiz.gif")); //$NON-NLS-1$
-		CommonWizardDialog dialog = new CommonWizardDialog(shell, wizard);
-
-		return dialog.open() == Window.OK;
-	}
-
-	private static void createSubNode(final AttributeGroup group, final IDOMElement parent, final Map mapOfAttributeValues) {
-		AddSubNodeCommand addSubCommand = new AddSubNodeCommand(
-				AttributeGroupMessages
-						.getString(
-								"DialogUtil.createCommandLabel", group.getTagName()), parent, group.getTagName(), group.getURI(), mapOfAttributeValues); //$NON-NLS-1$
-		addSubCommand.execute();
-		
-	}
-
-	/**
-	 * Utility method, this method will popup a dialog for user to input
-	 * attributes for initialize a sub element. In this method will create a
-	 * command and execute it.
-	 * 
-	 * @param shell
-	 *            parent shell for dialog
-	 * @param parent
-	 *            parent element
-	 * @param uri
-	 *            new ele's uri
-	 * @param tagName
-	 *            new ele's tag name
-	 * @param attributes
-	 *            an array of attribute names. The dialog will create a
-	 *            dialogfield for each of them to allow user to input initial
-	 *            value. If null, the system will try to use all attribute of
-	 *            the element.
-	 * @return true if success, false if user canceled.
-	 */
-	public static boolean createSubElement(Shell shell,
-			final IDOMElement parent, final String uri, final String tagName,
-			final String[] attributes) {
-		
-		final 	AttributeGroup group = new AttributeGroup(uri, tagName,
-				attributes);
-
-		return createSubElement(shell, parent, group);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/IElementContextable.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/IElementContextable.java
deleted file mode 100644
index bb90d80..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/IElementContextable.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This is a special interface for those special dialog field that need context
- * information.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IElementContextable {
-	/**
-	 * 
-	 * @param ancester
-	 *            an non null element, could be the element being edited, or an
-	 *            ancester element when we are creating new element.
-	 * @param element
-	 *            if not null, then is the element being edited, could be used
-	 *            to retrive initial data.
-	 * 
-	 */
-	public void setElementContext(IDOMNode ancester, IDOMElement element);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/messages.properties
deleted file mode 100644
index dd21120..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/messages.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-DialogUtil.createTitle=Create {0}
-DialogUtil.createDescription=Create subelement "{0}" under "{1}"
-DialogUtil.createCommandLabel=Create {0}
-AttributeGroupSection.changeAttribute=Change Attribute
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CSSDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CSSDialogCellEditor.java
deleted file mode 100644
index b43bcc3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CSSDialogCellEditor.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.ui.dialogs.StyleDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * A css dialog cell editor
- *
- */
-public class CSSDialogCellEditor extends EditableDialogCellEditor {
-	private IDOMElement _element;
-
-	/**
-	 * @param parent
-	 * @param element 
-	 */
-	public CSSDialogCellEditor(Composite parent, IDOMElement element) {
-		super(parent);
-		_element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) _element)
-				.getStyle();
-
-		PreferenceManager manager = new PreferenceManager();
-		Shell shell = cellEditorWindow.getShell();
-
-		final CSSPropertyContext context = new CSSPropertyContext(styleDeclaration);
-		StyleDialog dialog = new StyleDialog(shell, manager, _element, context);
-		if (dialog.open() == Window.OK) {
-			if (context.isModified()) {			
-				PlatformUI.getWorkbench().getDisplay().asyncExec(
-	                    new Runnable()
-	                    {
-	                        public void run()
-	                        {
-	            				ChangeStyleCommand c = new ChangeStyleCommand(_element, context);
-	                        	c.execute();
-	                        }
-	            });
-			}
-		}
-
-		String style = (_element == null ? null : _element
-				.getAttribute(IJSFConstants.ATTR_STYLE));
-		return style == null ? "" : style; //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorFactory.java
deleted file mode 100644
index de79670..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorFactory.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeRuntimeValueType;
-import org.eclipse.jst.pagedesigner.properties.dialogfields.MDEnabledComboDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.ClasspathResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.ContextableResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.StyleButtonDialogField;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * 
- * @author mengbo
- */
-public class CellEditorFactory implements ITagAttributeCellEditorFactory {
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, Element element) {
-		
-		String type = attr.getValueType();
-		
-		IPossibleValues pvs = (IPossibleValues)attr.getAdapter(IPossibleValues.class);
-		IDefaultValue defaultValue = (IDefaultValue)attr.getAdapter(IDefaultValue.class);
-//		ICellEditorValidator validator = (ICellEditorValidator)attr.getAdapter(ICellEditorValidator.class);
-		CellEditor ed = null;
-		if (IAttributeRuntimeValueType.RELATIVEPATH.equalsIgnoreCase(type)|| IAttributeRuntimeValueType.WEBPATH.equalsIgnoreCase(type)) {
-			IProject project = getProject(element);
-			if (project != null) {
-//				String typeParam = TraitValueHelper.getValueAsString(TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(),"type-param"));
-				ResourceDialogCellEditor cellEditor = new ResourceDialogCellEditor(
-						parent);
-				Trait fileExt = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "file-extensions"); //$NON-NLS-1$
-				Trait separator = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "separator"); //$NON-NLS-1$
-				String[] fileExts = null;
-				if (fileExt != null){
-					List exts = TraitValueHelper.getValueAsListOfStrings(fileExt);
-					fileExts = (String[])exts.toArray(new String[exts.size()]);
-				} 
-				
-				String sep = null;
-				if (separator != null)
-					sep = TraitValueHelper.getValueAsString(separator);
-				
-				if (fileExts != null)
-					cellEditor.setSuffixs(fileExts);
-				if (sep != null)
-					cellEditor.setSeparator(sep);
-
-				cellEditor.setProject(project);
-				cellEditor.setReferredFile(getFile(element));
-
-				if (IAttributeRuntimeValueType.WEBPATH.equalsIgnoreCase(type)) {
-					cellEditor.setWebPath(true);
-				}
-
-				if (IJSPCoreConstants.TAG_DIRECTIVE_INCLUDE.equals(element
-						.getLocalName())
-						|| IJSPCoreConstants.TAG_INCLUDE.equals(element
-								.getLocalName())) {
-					cellEditor.setTransformJSPURL(false);
-				}
-				ed = cellEditor;
-			}
-		} 
-		else if (IAttributeRuntimeValueType.RESOURCEBUNDLE.equals(type)) {
-			ed = new LoadbundleSelectionCellEditor(parent,
-					getProject(element));
-		}
-		else if (IAttributeRuntimeValueType.CSSSTYLE.equalsIgnoreCase(type)) {
-//				String param = getParamterValue(attr, "style");
-////							.getParameterByName(IAttributeDescriptor.PARAMETER_STYLE);
-//				if (!param.equalsIgnoreCase("STYLE")) {
-//					return null;
-//				}
-				CSSDialogCellEditor cellEditor = new CSSDialogCellEditor(parent,
-						(IDOMElement) element);
-				ed = cellEditor;
-		}
-		else if (pvs != null && pvs.getPossibleValues().size() > 0) {
-//			if (validator != null) 
-//				ed = LabeledStyleComboCellEditor.newInstance(parent, pvs,
-//	            		defaultValue, SWT.DROP_DOWN | SWT.READ_ONLY);
-//			else 
-				ed = LabeledStyleComboCellEditor.newInstance(parent, pvs,
-            		defaultValue, SWT.NONE);
-	
-		}
-		
-//		} else if (IAttributeRuntimeValueType.CSSID.equalsIgnoreCase(type)) {
-//		    // TODO: missing case?
-
-		else {
-			ed = new TextCellEditor(parent);
-		}
-//		if (validator != null){
-//			ed.setValidator(validator);
-//		}
-		
-		return ed;
-	}
-
-
-//	private String getParamterValue(IPropertyPageDescriptor attr, String traitKey) {
-//		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), traitKey);
-//		if (trait != null){
-//			return TraitValueHelper.getValueAsString(trait);
-//		}
-//		return null;
-//	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.NEWMDIAttributeCellEditorFactory#createDialogField(org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor,
-	 *      org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-
-		String type = attr.getValueType();
-		
-		IPossibleValues pvs = (IPossibleValues)attr.getAdapter(IPossibleValues.class);
-//		IDefaultValue defaultValue = (IDefaultValue)attr.getAdapter(IDefaultValue.class);
-//		ICellEditorValidator validator = (ICellEditorValidator)attr.getAdapter(ICellEditorValidator.class);
-		
-		
-
-		if (IAttributeRuntimeValueType.RELATIVEPATH.equals(type) ||
-				IAttributeRuntimeValueType.WEBPATH.equals(type)) {
-			Trait fileExt = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "file-extensions"); //$NON-NLS-1$
-			Trait seperator = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "separator"); //$NON-NLS-1$
-			
-			String[] fileExts = null;
-			if (fileExt != null){
-				List exts = TraitValueHelper.getValueAsListOfStrings(fileExt);
-				fileExts = (String[])exts.toArray(new String[exts.size()]);
-			} 
-			
-			String sep = null;
-			if (seperator != null)
-				sep = TraitValueHelper.getValueAsString(seperator);
-		
-			ContextableResourceButtonDialogField field = new ContextableResourceButtonDialogField();
-			field.setLabelText(attr.getLabel());
-			if (fileExts != null) {
-				field.setSuffixs(fileExts);
-			}
-			
-			if (sep != null) {
-				field.setSeparator(sep);
-			}
-			
-			if ("".equalsIgnoreCase(field.getSeparator())) { //$NON-NLS-1$
-				field.setResourceDescription(ResourceBoundle
-						.getString("FileCellEditor.Msg")); //$NON-NLS-1$
-			} else {
-				field.setResourceDescription(ResourceBoundle
-						.getString("FileCellEditor.Msg1")); //$NON-NLS-1$
-			}
-			field.setWebPath(IAttributeRuntimeValueType.WEBPATH.equals(type));
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-
-		} else if (IAttributeRuntimeValueType.CLASSPATH_RESOURCE.equals(type) ||
-				IAttributeRuntimeValueType.RESOURCEBUNDLE.equals(type)) {
-			ClasspathResourceButtonDialogField field = new ClasspathResourceButtonDialogField();
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			field.setLabelText(attr.getLabel());
-			return field;
-		} else if (IAttributeRuntimeValueType.CSSSTYLE.equalsIgnoreCase(type)) {
-//			String param = getParamterValue(attr, "style");
-//			if (!"STYLE".equalsIgnoreCase(param)) {
-//				return null;
-//			}
-			StyleButtonDialogField field = new StyleButtonDialogField();
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			field.setLabelText(attr.getLabel());
-			return field;
-		
-//		// if there is no type or type unknown, then we just return null. and
-//		// system will
-//		// create default (text cell editor).
-		} else if (pvs != null && pvs.getPossibleValues().size() > 0) {
-			MDEnabledComboDialogField field = new MDEnabledComboDialogField(SWT.None);
-			field.setLabelText(attr.getLabel());
-			field.setToolTip(attr.getDescription());
-			field.setRequired(attr.isRequired());
-			return field;
-		}
-		return null;
-	}
-
-	private IProject getProject(Element element) {
-		if (element instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) element).getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			if (file != null) {
-				return file.getProject();
-			}
-		}
-		return null;
-	}
-
-	public String[] getSupportedValueTypes() {
-		return null;//default - all!
-	}
-
-	private IFile getFile(Element element) {
-		if (element instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) element).getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			return file;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java
deleted file mode 100644
index 011ff99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * CellEditorWrapper is a special cell editor, that wraps an existing cell
- * editor by adding a small clickable button to end of it.
- * 
- * Due to limitation of the CellEditor framework, this wrapping technology may
- * resulting in some small inconvenience when change focus from the "wrapped"
- * cell editor to the "added" button.
- * 
- * This is an abstract class. Child class need override some methods.
- * 
- * @author mengbo
- */
-public abstract class CellEditorWrapper extends CellEditor {
-	/**
-	 * The editor control.
-	 */
-	private Composite _editor;
-
-	/**
-	 * the wrapped cell editor
-	 */
-	private CellEditor _wrapped;
-
-	/**
-	 * The button.
-	 */
-	private Button _button;
-
-	/**
-	 * Internal class for laying out the dialog.
-	 */
-	private class DialogCellLayout extends Layout {
-		public void layout(Composite editor, boolean force) {
-			Rectangle bounds = editor.getClientArea();
-			Point size = _button.computeSize(SWT.DEFAULT, SWT.DEFAULT, force);
-			// if (_wrapped != null)
-			_wrapped.getControl().setBounds(0, 0, bounds.width - size.x,
-					bounds.height);
-			_button.setBounds(bounds.width - size.x, 0, size.x, bounds.height);
-		}
-
-		public Point computeSize(Composite editor, int wHint, int hHint,
-				boolean force) {
-			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
-				return new Point(wHint, hHint);
-			Point contentsSize = _wrapped.getControl().computeSize(SWT.DEFAULT,
-					SWT.DEFAULT, force);
-			Point buttonSize = _button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-					force);
-			// Just return the button width to ensure the button is not clipped
-			// if the label is long.
-			// The label will just use whatever extra width there is
-			Point result = new Point(buttonSize.x, Math.max(contentsSize.y,
-					buttonSize.y));
-			return result;
-		}
-	}
-
-	/**
-	 * Default DialogCellEditor style
-	 */
-	private static final int defaultStyle = SWT.NONE;
-
-	/**
-	 * Creates a new dialog cell editor with no control
-	 * 
-	 * @since 2.1
-	 */
-	public CellEditorWrapper() {
-		setStyle(defaultStyle);
-	}
-
-	/**
-	 * Creates a new dialog cell editor parented under the given control. The
-	 * cell editor value is <code>null</code> initially, and has no validator.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 */
-	protected CellEditorWrapper(Composite parent) {
-		this(parent, defaultStyle);
-	}
-
-	/**
-	 * Creates a new dialog cell editor parented under the given control. The
-	 * cell editor value is <code>null</code> initially, and has no validator.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @param style
-	 *            the style bits
-	 * @since 2.1
-	 */
-	protected CellEditorWrapper(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/**
-	 * Creates the button for this cell editor under the given parent control.
-	 * <p>
-	 * The default implementation of this framework method creates the button
-	 * display on the right hand side of the dialog cell editor. Subclasses may
-	 * extend or reimplement.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @return the new button control
-	 */
-	protected Button createButton(Composite parent) {
-		Button result = new Button(parent, SWT.DOWN);
-		result.setImage(getBindingImage());
-		// result.setText("..."); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * Since createButton is called from constructor, so we could only let child
-	 * class override this method to provide image. Rather than setting as
-	 * property.
-	 * 
-	 * @return image
-	 */
-	protected abstract Image getBindingImage();
-
-	/**
-	 * Creates the controls used to show the value of this cell editor.
-	 * <p>
-	 * The default implementation of this framework method creates a label
-	 * widget, using the same font and background color as the parent control.
-	 * </p>
-	 * <p>
-	 * Subclasses may re-implement. If you re-implement this method, you should
-	 * also re-implement <code>updateContents</code>.
-	 * </p>
-	 * 
-	 * @param cell
-	 *            the control for this cell editor
-	 * @return control
-	 */
-	protected Control createContents(Composite cell) {
-		_wrapped = createWrappedCellEditor(cell);
-		if (_wrapped == null) {
-			_wrapped = new TextCellEditor(cell);
-		}
-		_wrapped.addListener(new ICellEditorListener() {
-			public void applyEditorValue() {
-				fireApplyEditorValue();
-			}
-
-			public void cancelEditor() {
-				fireCancelEditor();
-			}
-
-			public void editorValueChanged(boolean oldValidState,
-					boolean newValidState) {
-				fireEditorValueChanged(oldValidState, newValidState);
-			}
-		});
-		_wrapped.addPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				// FIXME:
-			}
-		});
-
-		_wrapped.getControl().setVisible(true);
-		_wrapped.getControl().addListener(SWT.Hide, new Listener() {
-			public void handleEvent(Event event) {
-				Display.getCurrent().asyncExec(new Runnable() {
-					public void run() {
-						if (_wrapped != null && _wrapped.getControl() != null
-								&& !_wrapped.getControl().isDisposed()) {
-							_wrapped.getControl().setVisible(true);
-						} else {
-							deactivate();
-						}
-					}
-				});
-
-			}
-		});
-		return _wrapped.getControl();
-	}
-
-	/**
-	 * @param cell
-	 * @return CellEditor
-	 */
-	protected abstract CellEditor createWrappedCellEditor(Composite cell);
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Control createControl(Composite parent) {
-		Font font = parent.getFont();
-		Color bg = parent.getBackground();
-
-		_editor = new Composite(parent, getStyle());
-		_editor.setFont(font);
-		_editor.setBackground(bg);
-		_editor.setLayout(new DialogCellLayout());
-
-		createContents(_editor);
-		// updateContents(value);
-
-		_button = createButton(_editor);
-		_button.setFont(font);
-
-		_button.addKeyListener(new KeyAdapter() {
-			public void keyReleased(KeyEvent e) {
-				if (e.character == '\u001b') { // Escape
-					fireCancelEditor();
-				}
-			}
-		});
-
-		_button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				Object newValue = openDialogBox(_editor);
-				if (newValue != null) {
-					boolean newValidState = isCorrect(newValue);
-					if (newValidState) {
-						markDirty();
-						doSetValue(newValue);
-					} else {
-						// try to insert the current value into the error
-						// message.
-						setErrorMessage(MessageFormat.format(getErrorMessage(),
-								new Object[] { newValue.toString() }));
-					}
-					fireApplyEditorValue();
-				}
-			}
-		});
-
-		setValueValid(true);
-
-		return _editor;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor. The focus is set to the cell
-	 * editor's button.
-	 */
-	protected void doSetFocus() {
-		if (_wrapped != null && _wrapped.getControl() != null
-				&& !_wrapped.getControl().isDisposed()) {
-			_wrapped.setFocus();
-		} else {
-			_button.setFocus();
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Object doGetValue() {
-		return _wrapped.getValue();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected void doSetValue(Object value) {
-		if (_wrapped != null) {
-			_wrapped.setValue(value);
-		}
-	}
-
-	/**
-	 * Opens a dialog box under the given parent control and returns the
-	 * dialog's value when it closes, or <code>null</code> if the dialog was
-	 * cancelled or no selection was made in the dialog.
-	 * <p>
-	 * This framework method must be implemented by concrete subclasses. It is
-	 * called when the user has pressed the button and the dialog box must pop
-	 * up.
-	 * </p>
-	 * 
-	 * @param cellEditorWindow
-	 *            the parent control cell editor's window so that a subclass can
-	 *            adjust the dialog box accordingly
-	 * @return the selected value, or <code>null</code> if the dialog was
-	 *         cancelled or no selection was made in the dialog
-	 */
-	protected abstract Object openDialogBox(Control cellEditorWindow);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#activate()
-	 */
-	public void activate() {
-		super.activate();
-		_wrapped.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#deactivate()
-	 */
-	public void deactivate() {
-		super.deactivate();
-		// if (_wrapped != null)
-		// {
-		// _wrapped.deactivate();
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#dispose()
-	 */
-	public void dispose() {
-		_wrapped.dispose();
-		super.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/EditableDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/EditableDialogCellEditor.java
deleted file mode 100644
index 9a9c385..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/EditableDialogCellEditor.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jface.viewers.DialogCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author mengbo
- */
-public abstract class EditableDialogCellEditor extends DialogCellEditor {
-	private Text _text;
-
-	/**
-	 * 
-	 */
-	public EditableDialogCellEditor() {
-		super();
-	}
-
-	/**
-	 * @param parent
-	 */
-	public EditableDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public EditableDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite cell) {
-		_text = new Text(cell, SWT.LEFT);
-		_text.setFont(cell.getFont());
-		_text.setBackground(cell.getBackground());
-		_text.addKeyListener(new KeyAdapter() {
-			// hook key pressed - see PR 14201
-			public void keyPressed(KeyEvent e) {
-				keyReleaseOccured(e);
-				// disposed this cell editor
-				if ((getControl() == null) || getControl().isDisposed()) {
-					return;
-				}
-			}
-		});
-		// when the text control has focus, the cellEditor will deactive even
-		// when you press the button.
-		// Add the follow codes enable switch to the button control.
-		_text.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				boolean newValidState = isCorrect(_text.getText());
-				if (newValidState) {
-					markDirty();
-					doSetValue(_text.getText());
-				} else {
-					// try to insert the current value into the error message.
-					setErrorMessage(MessageFormat.format(getErrorMessage(),
-							new Object[] { _text.getText().toString() }));
-				}
-			}
-		});
-
-		return _text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#doSetFocus()
-	 */
-	protected void doSetFocus() {
-		_text.setFocus();
-		_text.selectAll();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#updateContents(java.lang.Object)
-	 */
-	protected void updateContents(Object value) {
-		if (_text == null || _text.isDisposed()) {
-			return;
-		}
-
-		String text = "";//$NON-NLS-1$
-		if (value != null) {
-			text = value.toString();
-		}
-		_text.setText(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\r') {
-			boolean newValidState = isCorrect(_text.getText());
-			if (newValidState) {
-				markDirty();
-				doSetValue(_text.getText());
-			} else {
-				// try to insert the current value into the error message.
-				setErrorMessage(MessageFormat.format(getErrorMessage(),
-						new Object[] { _text.getText().toString() }));
-			}
-			fireApplyEditorValue();
-		}
-		super.keyReleaseOccured(keyEvent);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledComboBoxCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledComboBoxCellEditor.java
deleted file mode 100644
index efd1df0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledComboBoxCellEditor.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.sse.ui.internal.Logger;
-
-/**
- * A simple ComboBoxCellEditor, which allow value and display string to be
- * different.
- * 
- * @author mengbo
- */
-public class LabeledComboBoxCellEditor extends ComboBoxCellEditor {
-	private boolean _fSettingValue = false;
-
-	private Object[] _values;
-
-	/**
-	 * Create LabeledComboBoxCellEditor
-	 * @param parent
-	 * @param valueLabelMap
-	 * @param style
-	 * @return LabeledComboBoxCellEditor
-	 */
-	public static LabeledComboBoxCellEditor newInstance(Composite parent,
-			Map valueLabelMap, int style) {
-		// we'll sort according to label. since that is what being show to user.
-		List list = new ArrayList();
-		for (Iterator iter = valueLabelMap.keySet().iterator(); iter.hasNext();) {
-			Object key = iter.next();
-			String label = (String) valueLabelMap.get(key);
-			list.add(new Object[] { key, label });
-		}
-		// sort by label
-		Collections.sort(list, new Comparator() {
-			public int compare(Object o1, Object o2) {
-				String label1 = (String) ((Object[]) o1)[1];
-				String label2 = (String) ((Object[]) o2)[1];
-				return label1.compareTo(label2);
-			}
-		});
-		Object[] values = new Object[list.size()];
-		String[] labels = new String[list.size()];
-		for (int i = 0, n = list.size(); i < n; i++) {
-			values[i] = ((Object[]) list.get(i))[0];
-			labels[i] = (String) ((Object[]) list.get(i))[1];
-		}
-		return new LabeledComboBoxCellEditor(parent, values, labels, style);
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param parent
-	 * @param values
-	 * @param labels
-	 */
-	public LabeledComboBoxCellEditor(Composite parent, Object[] values,
-			String[] labels) {
-		this(parent, values, labels, SWT.NONE);
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param parent
-	 * @param values
-	 * @param labels
-	 * @param style
-	 */
-	public LabeledComboBoxCellEditor(Composite parent, Object[] values,
-			String[] labels, int style) {
-		super(parent, labels, style);
-		_values = values;
-	}
-
-	protected Object doGetValue() {
-		// otherwise limits to set of valid values
-		Object index = super.doGetValue();
-		int selection = -1;
-		if (index instanceof Integer) {
-			selection = ((Integer) index).intValue();
-		}
-		if (selection >= 0) {
-			return _values[selection];
-		} else if (getControl() instanceof CCombo) {
-			// retrieve the actual text as the list of valid items doesn't
-			// contain the value
-			return ((CCombo) getControl()).getText();
-		}
-		return null;
-	}
-
-	protected void doSetValue(Object value) {
-		if (_fSettingValue) {
-			return;
-		}
-		_fSettingValue = true;
-		if (value instanceof Integer) {
-			super.doSetValue(value);
-		} else {
-			String stringValue = value.toString();
-			int selection = -1;
-			for (int i = 0; i < _values.length; i++) {
-				if (_values[i].equals(stringValue)) {
-					selection = i;
-				}
-			}
-			if (selection >= 0) {
-				super.doSetValue(new Integer(selection));
-			} else {
-				super.doSetValue(new Integer(-1));
-				if (getControl() instanceof CCombo
-						&& !stringValue.equals(((CCombo) getControl())
-								.getText())) {
-					// update the Text widget
-					((CCombo) getControl()).setText(stringValue);
-				}
-			}
-		}
-		_fSettingValue = false;
-	}
-
-	public void setItems(String[] newItems) {
-		if (getControl() == null || getControl().isDisposed()) {
-			Logger.log(Logger.ERROR,
-					"Attempted to update item list for disposed cell editor"); //$NON-NLS-1$
-			return;
-		}
-
-		// keep selection if possible
-		Object previousSelectedValue = getValue();
-		super.setItems(newItems);
-		if (previousSelectedValue != null && getControl() instanceof CCombo) {
-			for (int i = 0; i < newItems.length; i++) {
-				if (newItems[i].equals(previousSelectedValue)) {
-					setValue(previousSelectedValue);
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledStyleComboCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledStyleComboCellEditor.java
deleted file mode 100644
index e8a47d5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledStyleComboCellEditor.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.sse.ui.internal.Logger;
-
-/**
- * A combo cell editor
- *
- */
-public class LabeledStyleComboCellEditor extends StyleComboCellEditor {
-	private boolean _fSettingValue = false;
-
-	private Object[] _values;
-
-	/**
-	 * @param parent
-	 * @param valueLabelMap
-	 * @param defaultValue
-	 * @param style
-	 * @return the new instance
-	 */
-	public static LabeledStyleComboCellEditor newInstance(Composite parent,
-			Map valueLabelMap, String defaultValue, int style) {
-		// we'll sort according to label. since that is what being show to user.
-		List list = new ArrayList();
-		for (Iterator iter = valueLabelMap.keySet().iterator(); iter.hasNext();) {
-			Object key = iter.next();
-			String label = (String) valueLabelMap.get(key);
-			list.add(new Object[] { key, label });
-		}
-		// sort by label
-		Collections.sort(list, new Comparator() {
-			public int compare(Object o1, Object o2) {
-				String label1 = (String) ((Object[]) o1)[1];
-				String label2 = (String) ((Object[]) o2)[1];
-				return label1.compareTo(label2);
-			}
-		});
-		Object[] values = new Object[list.size()];
-		String[] labels = new String[list.size()];
-		for (int i = 0, n = list.size(); i < n; i++) {
-			values[i] = ((Object[]) list.get(i))[0];
-			labels[i] = (String) ((Object[]) list.get(i))[1];
-		}
-		return new LabeledStyleComboCellEditor(parent, values, labels,
-				defaultValue, style);
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param parent
-	 * @param values
-	 * @param labels
-	 * @param defaultValue 
-	 * @param style
-	 */
-	public LabeledStyleComboCellEditor(Composite parent, Object[] values,
-			String[] labels, String defaultValue, int style) {
-		super(parent, labels, style);
-		StyleCombo combo = (StyleCombo) getControl();
-		if (defaultValue != null)
-			combo.setDefaultValue(defaultValue);
-		_values = values;
-	}
-
-	protected Object doGetValue() {
-		// otherwise limits to set of valid values
-		Object index = super.doGetValue();
-		int selection1 = -1;
-		if (index instanceof Integer) {
-			selection1 = ((Integer) index).intValue();
-		}
-		if (selection1 >= 0) {
-			return _values[selection1];
-		} else if (getControl() instanceof StyleCombo) {
-			// retrieve the actual text as the list of valid items doesn't
-			// contain the value
-			return ((StyleCombo) getControl()).getText();
-		}
-		return null;
-	}
-
-	protected void doSetValue(Object value) {
-		if (_fSettingValue) {
-			return;
-		}
-		_fSettingValue = true;
-		if (value instanceof Integer) {
-			super.doSetValue(value);
-		} else {
-			String stringValue = value.toString();
-			int selection1 = -1;
-			for (int i = 0; i < _values.length; i++) {
-				if (_values[i].equals(stringValue)) {
-					selection1 = i;
-				}
-			}
-			if (selection1 >= 0) {
-				super.doSetValue(new Integer(selection1));
-			} else {
-				super.doSetValue(new Integer(-1));
-				if (getControl() instanceof StyleCombo
-						&& !stringValue.equals(((StyleCombo) getControl())
-								.getText())) {
-					// update the Text widget
-					((StyleCombo) getControl()).setText(stringValue);
-				}
-			}
-		}
-		_fSettingValue = false;
-	}
-
-	public void setItems(String[] newItems) {
-		if (getControl() == null || getControl().isDisposed()) {
-			Logger.log(Logger.ERROR,
-					"Attempted to update item list for disposed cell editor"); //$NON-NLS-1$
-			return;
-		}
-
-		// keep selection if possible
-		Object previousSelectedValue = getValue();
-		super.setItems(newItems);
-		if (previousSelectedValue != null && getControl() instanceof StyleCombo) {
-			for (int i = 0; i < newItems.length; i++) {
-				if (newItems[i].equals(previousSelectedValue)) {
-					setValue(previousSelectedValue);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Create CellEditor
-	 * @param parent
-	 * @param pvs
-	 * @param defaultValue
-	 * @param style
-	 * @return CellEditor
-	 */
-	public static CellEditor newInstance(Composite parent, IPossibleValues pvs,
-			IDefaultValue defaultValue, int style) {
-	
-		CellEditor ed = null;
-		if (pvs != null) {
-			Map map = getPossibleValueMap(pvs);
-			ed = newInstance(parent, map, defaultValue != null ? defaultValue.getDefaultValue() : null, style);
-		}
-		
-		return ed;
-	}
-
-	private static Map getPossibleValueMap(IPossibleValues pvs) {
-		Map<String, String> map = new HashMap<String, String>(pvs.getPossibleValues().size());
-		for (Iterator it = pvs.getPossibleValues().iterator();it.hasNext();){
-			IPossibleValue pv = (IPossibleValue)it.next();
-			map.put(pv.getValue(), pv.getDisplayValue());
-		}
-		return map;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LoadbundleSelectionCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LoadbundleSelectionCellEditor.java
deleted file mode 100644
index 1465478..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LoadbundleSelectionCellEditor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.ResourceOnClasspathDialog;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * @author mengbo
- */
-public class LoadbundleSelectionCellEditor extends EditableDialogCellEditor {
-	private static final String[] PROPERTIES_FILES_SUFFIXS = new String[] { IFileFolderConstants.EXT_PROPERTIES };
-
-	private String _value;
-
-	private IProject _project;
-
-	/**
-	 * @param parent
-	 * @param project 
-	 */
-	public LoadbundleSelectionCellEditor(Composite parent, IProject project) {
-		super(parent);
-		_project = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		ResourceOnClasspathDialog dialog = new ResourceOnClasspathDialog(
-				cellEditorWindow.getShell(), DesignerPropertyTool
-						.getJavaProject(_project));
-		dialog.setTitle(ResourceBoundle.getString("FileCellEditor.Title")); //$NON-NLS-1$
-		dialog.setSuffixs(PROPERTIES_FILES_SUFFIXS);
-		dialog.open();
-		if (dialog.getResult() != null) {
-			_value = (String) dialog.getResult()[0];
-		}
-		return _value;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceBoundle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceBoundle.java
deleted file mode 100644
index b3eeac5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceBoundle.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ResourceBoundle {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.celleditors.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private ResourceBoundle() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the value for the key or !!key!!
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceDialogCellEditor.java
deleted file mode 100644
index 0eced33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceDialogCellEditor.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.jst.pagedesigner.utils.WebAppUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author mengbo
- */
-public class ResourceDialogCellEditor extends EditableDialogCellEditor {
-	private IProject _project;
-
-	private String[] _suffixs;
-
-	private String _resourceDescription;
-
-	private IFile _referredFile;
-
-	private boolean _isWebPath = false;
-
-	private boolean _needTransformJSPURL = true;
-
-	private String _separator = ""; //$NON-NLS-1$
-
-
-	/**
-	 * Constructor
-	 */
-	public ResourceDialogCellEditor() {
-		super();
-	}
-	
-	/**
-	 * Constructor
-	 * @param parent 
-	 */
-	public ResourceDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-	
-	/**
-	 * Constructor
-	 * @param parent 
-	 * @param style 
-	 */
-	public ResourceDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	protected Object openDialogBox(Control cellEditorWindow) {
-		Shell shell = cellEditorWindow.getShell();
-		int style = "".equals(_separator) ? SWT.NONE : SWT.MULTI | SWT.H_SCROLL //$NON-NLS-1$
-				| SWT.V_SCROLL;
-		CommonResourceDialog dialog = new CommonResourceDialog(shell, _project,
-				style);
-		dialog.setTitle(ResourceBoundle.getString("FileCellEditor.Title")); //$NON-NLS-1$
-		dialog.setSuffixs(_suffixs);
-		dialog.setResourceDescription(_resourceDescription);
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			StringBuffer buffer = new StringBuffer();
-			for (int i = 0; i < result.length; i++) {
-				IPath path = ((IFile) result[i]).getLocation();
-
-				IPath referredPath = null;
-				if (_referredFile != null) {
-					referredPath = _referredFile.getLocation();
-				} else {
-					referredPath = _project.getLocation();
-				}
-
-				String newValue = null;
-				if (this._isWebPath) {
-					IFile selectedFile = ((IFile) result[i]);
-					newValue = WebrootUtil.getWebPath(selectedFile
-							.getFullPath());
-				} else {
-					newValue = PathUtil.convertToRelativePath(path.toString(),
-							referredPath.toString());
-				}
-				if (this._needTransformJSPURL) {
-					newValue = WebAppUtil.transformJSPURL(newValue,
-							this._referredFile);
-				}
-				buffer.append(newValue);
-				buffer.append(_separator);
-			}
-			if (buffer.length() > 0) {
-				return buffer.substring(0, buffer.length()
-						- _separator.length());
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this._project = project;
-	}
-
-	/**
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * @return Returns the referredFile.
-	 */
-	public IFile getReferredFile() {
-		return _referredFile;
-	}
-
-	/**
-	 * @param referredFile
-	 *            The referredFile to set.
-	 */
-	public void setReferredFile(IFile referredFile) {
-		this._referredFile = referredFile;
-	}
-
-	/**
-	 * @return Returns the resourceDescription.
-	 */
-	public String getResourceDescription() {
-		if (_resourceDescription == null) {
-			if ("".equalsIgnoreCase(getSeparator())) { //$NON-NLS-1$
-				_resourceDescription = ResourceBoundle
-						.getString("FileCellEditor.Msg"); //$NON-NLS-1$
-			} else {
-				_resourceDescription = ResourceBoundle
-						.getString("FileCellEditor.Msg1"); //$NON-NLS-1$
-			}			
-		}
-		return _resourceDescription;
-	}
-
-	/**
-	 * @param resourceDescription
-	 *            The resourceDescription to set.
-	 */
-	public void setResourceDescription(String resourceDescription) {
-		this._resourceDescription = resourceDescription;
-	}
-
-	/**
-	 * @return Returns the suffixes.
-	 */
-	public String[] getSuffixs() {
-		return _suffixs;
-	}
-
-	/**
-	 * @param suffixs
-	 *            The suffixes to set.
-	 */
-	public void setSuffixs(String[] suffixs) {
-		this._suffixs = suffixs;
-	}
-
-	/**
-	 * set some special path to web path instead of relative path
-	 * 
-	 * @param isWebPath
-	 */
-	public void setWebPath(boolean isWebPath) {
-		this._isWebPath = isWebPath;
-	}
-
-	/**
-	 * @param needTransform
-	 */
-	public void setTransformJSPURL(boolean needTransform) {
-		this._needTransformJSPURL = needTransform;
-	}
-
-	/**
-	 * @return separator to use for between values
-	 */
-	public String getSeparator() {
-		return _separator;
-	}
-
-	/**
-	 * @param separator to use for between values
-	 */
-	public void setSeparator(String separator) {
-		this._separator = separator;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/StyleComboCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/StyleComboCellEditor.java
deleted file mode 100644
index dba336d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/StyleComboCellEditor.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.text.MessageFormat;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Combo cell editor
- *
- */
-public class StyleComboCellEditor extends CellEditor {
-	/**
-	 * The list of items to present in the combo box.
-	 */
-	private String[] items;
-
-	/**
-	 * The zero-based index of the selected item.
-	 */
-	int selection;
-
-	/**
-	 * The custom combo box control.
-	 */
-	StyleCombo comboBox;
-
-	/**
-	 * Default ComboBoxCellEditor style
-	 */
-	private static final int defaultStyle = SWT.NONE;
-
-	/**
-	 * Default constructor
-	 */
-	public StyleComboCellEditor() {
-		setStyle(defaultStyle);
-	}
-
-	/**
-	 * @param parent
-	 * @param items
-	 */
-	public StyleComboCellEditor(Composite parent, String[] items) {
-		this(parent, items, defaultStyle);
-	}
-
-	/**
-	 * @param parent
-	 * @param items
-	 * @param style
-	 */
-	public StyleComboCellEditor(Composite parent, String[] items, int style) {
-		super(parent, style);
-		setItems(items);
-	}
-
-	/**
-	 * Returns the list of choices for the combo box
-	 * 
-	 * @return the list of choices for the combo box
-	 */
-	public String[] getItems() {
-		return this.items;
-	}
-
-	/**
-	 * Sets the list of choices for the combo box
-	 * 
-	 * @param items
-	 *            the list of choices for the combo box
-	 */
-	public void setItems(String[] items) {
-		Assert.isNotNull(items);
-		this.items = items;
-		populateComboBoxItems();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Control createControl(Composite parent) {
-
-		comboBox = new StyleCombo(parent, getStyle());
-		comboBox.setFont(parent.getFont());
-
-		comboBox.addKeyListener(new KeyAdapter() {
-			// hook key pressed - see PR 14201
-			public void keyPressed(KeyEvent e) {
-				keyReleaseOccured(e);
-			}
-		});
-
-		comboBox.addSelectionListener(new SelectionAdapter() {
-			public void widgetDefaultSelected(SelectionEvent event) {
-				applyEditorValueAndDeactivate();
-			}
-
-			public void widgetSelected(SelectionEvent event) {
-				selection = comboBox.getSelectionIndex();
-			}
-		});
-
-		comboBox.addTraverseListener(new TraverseListener() {
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_ESCAPE
-						|| e.detail == SWT.TRAVERSE_RETURN) {
-					e.doit = false;
-				}
-			}
-		});
-
-		comboBox.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				StyleComboCellEditor.this.focusLost();
-			}
-		});
-		return comboBox;
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method returns the zero-based index
-	 * of the current selection.
-	 * 
-	 * @return the zero-based index of the current selection wrapped as an
-	 *         <code>Integer</code>
-	 */
-	protected Object doGetValue() {
-		return new Integer(selection);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected void doSetFocus() {
-		comboBox.setFocus();
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method sets the minimum width of the
-	 * cell. The minimum width is 10 characters if <code>comboBox</code> is
-	 * not <code>null</code> or <code>disposed</code> eles it is 60 pixels
-	 * to make sure the arrow button and some text is visible. The list of
-	 * CCombo will be wide enough to show its longest item.
-	 */
-	public LayoutData getLayoutData() {
-		LayoutData layoutData = super.getLayoutData();
-		if ((comboBox == null) || comboBox.isDisposed())
-			layoutData.minimumWidth = 60;
-		else {
-			// make the comboBox 10 characters wide
-			GC gc = new GC(comboBox);
-			layoutData.minimumWidth = (gc.getFontMetrics()
-					.getAverageCharWidth() * 10) + 10;
-			gc.dispose();
-		}
-		return layoutData;
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method accepts a zero-based index of
-	 * a selection.
-	 * 
-	 * @param value
-	 *            the zero-based index of the selection wrapped as an
-	 *            <code>Integer</code>
-	 */
-	protected void doSetValue(Object value) {
-		Assert.isTrue(comboBox != null && (value instanceof Integer));
-		selection = ((Integer) value).intValue();
-		comboBox.select(selection);
-	}
-
-	/**
-	 * Updates the list of choices for the combo box for the current control.
-	 */
-	private void populateComboBoxItems() {
-		if (comboBox != null && items != null) {
-			comboBox.removeAll();
-			for (int i = 0; i < items.length; i++)
-				comboBox.add(items[i], i);
-
-			setValueValid(true);
-			selection = 0;
-		}
-	}
-
-	/**
-	 * Applies the currently selected value and deactiavates the cell editor
-	 */
-	void applyEditorValueAndDeactivate() {
-		// must set the selection before getting value
-		selection = comboBox.getSelectionIndex();
-		Object newValue = doGetValue();
-		markDirty();
-		boolean isValid = isCorrect(newValue);
-		setValueValid(isValid);
-		if (!isValid) {
-			// try to insert the current value into the error message.
-			setErrorMessage(MessageFormat.format(getErrorMessage(),
-					new Object[] { items[selection] }));
-		}
-		fireApplyEditorValue();
-		deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#focusLost()
-	 */
-	protected void focusLost() {
-		if (isActivated()) {
-			applyEditorValueAndDeactivate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\u001b') { // Escape character
-			fireCancelEditor();
-		} else if (keyEvent.character == '\t') { // tab key
-			applyEditorValueAndDeactivate();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/messages.properties
deleted file mode 100644
index aa55e43..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-FileCellEditor.Title=Select File
-FileCellEditor.Msg=Select a file
-FileCellEditor.Msg1=Select one or more files
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/dialogfields/MDEnabledComboDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/dialogfields/MDEnabledComboDialogField.java
deleted file mode 100644
index e63245f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/dialogfields/MDEnabledComboDialogField.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.dialogfields;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StyleComboDialogField;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This combo dialog field defers loading the combos until the element context has been set
- *
- */
-public class MDEnabledComboDialogField extends StyleComboDialogField implements IElementContextable {
-
-	/**
-	 * Constructor
-	 * @param flags
-	 */
-	public MDEnabledComboDialogField(int flags) {
-		super(flags);
-	}
-
-	public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		IStructuredDocumentContext sdContext =IStructuredDocumentContextFactory.INSTANCE.getContext(element.getStructuredDocument(), element);
-		IPropertyPageDescriptor ppd = (IPropertyPageDescriptor)getAttachedData("KEY_ATTR");//FIXME use constant //$NON-NLS-1$
-		ppd.setStructuredDocumentContext(sdContext);
-		IPossibleValues pvs = (IPossibleValues)ppd.getAdapter(IPossibleValues.class);
-		IDefaultValue def = (IDefaultValue)ppd.getAdapter(IDefaultValue.class);
-		if (def != null)
-			setDefaultValue(def.getDefaultValue());
-		if (pvs.getPossibleValues() != null)
-			setEntryMap(getMapOfPossibleValues(pvs));
-	}
-
-	private Map getMapOfPossibleValues(IPossibleValues pvs) {
-		Map map = new TreeMap<String, String>();
-		for (Iterator<IPossibleValue> it=pvs.getPossibleValues().iterator();it.hasNext();){
-			IPossibleValue pv = it.next();
-			map.put(pv.getValue(), pv.getDisplayValue());
-		}
-		return map;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AllPropertySectionDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AllPropertySectionDescriptor.java
deleted file mode 100644
index 8c5de9b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AllPropertySectionDescriptor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jst.pagedesigner.properties.AllPropertySection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * SectionDescriptor for the WPE Attributes tab
- */
-public class AllPropertySectionDescriptor extends AbstractSectionDescriptor {
-	/**
-	 * Id for the WPE AllPropertySectionDescriptor
-	 */
-	public static final String ID = "AllPropertySectionDescriptor"; //$NON-NLS-1$
-
-	private ISection section;
-
-	public String getId() {
-		return ID;
-	}
-
-	public ISection getSectionClass() {
-		if (section == null){
-			section = new AllPropertySection();
-		}
-		return section;
-	}
-
-	public String getTargetTab() {
-		return AttributesTabDescriptor.TAB_ID;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroup.java
deleted file mode 100644
index 585cd4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroup.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- * 
- * TODO: cleanup up constructors
- */
-public class AttributeGroup extends DialogFieldGroup {
-	private static final Object KEY_ATTR = "KEY_ATTR"; //$NON-NLS-1$
-
-//	private String _helpContextId;
-
-	private List<DialogField> _dialogFields = null;  //consider using Map
-	private IDOMElement _ownerElement;
-	private Entity _tagEntity;
-	private List<String> _attrNames;
-	private List<IPropertyPageDescriptor> _attrPDs;
-	private IStructuredDocumentContext _sdContext;
-
-	private String _uri;
-	private String _tagName;
-	
-	/**
-	 * Constructor
-	 * @param tagEntity - may not be null
-	 * @param attrNames - may not be null.  Attribute names must be valid for the tag, and have attribute-value-runtime-type trait info
-	 */
-	public AttributeGroup(Entity tagEntity, List<String> attrNames) {
-		_tagEntity = tagEntity;
-		_attrNames = attrNames;		
-	}
-	
-	/**
-	 * Constructor where tagEntity is determined later or set later
-	 * @param uri - may be null
-	 * @param tagName - may be null
-	 * @param attributeNames - may not be null.  Attribute names must be valid for the tag, and have attribute-value-runtime-type trait info
-	 */
-	public AttributeGroup(String uri,
-			String tagName, String[] attributeNames) {
-		_uri = uri;
-		_tagName = tagName;
-		if (attributeNames != null)
-			_attrNames = Arrays.asList(attributeNames);
-		else 
-			_attrNames = new ArrayList();
-	}
-	
-	private List<IPropertyPageDescriptor> prepareDescriptors(Entity tagEntity,
-			List<String> names) {
-		
-		List pds = new ArrayList();
-		for (String attrName : names) {
-			IPropertyPageDescriptor pd = getPD(tagEntity, attrName);
-			if (pd != null)
-				pds.add(pd);
-		}
-		return pds;
-	}
-
-	private IPropertyPageDescriptor getPD(Entity tagEntity, String attrName) {		
-		IPropertyPageDescriptor pd = null;
-		Entity attrEntity = TaglibDomainMetaDataQueryHelper.getEntity(tagEntity, attrName);
-		if (attrEntity != null){
-			List pds = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-							IPropertyPageDescriptor.class, getStructuredDocumentContext(), attrEntity);					
-			if (pds != null && !pds.isEmpty())
-				pd = (IPropertyPageDescriptor)pds.get(0);
-			else 
-				pd = new DefaultPropertyPageDescriptor(tagEntity, attrEntity);
-		}
-		return pd;
-	}
-
-
-	private void resetStructuredDocumentContext() {
-		_sdContext = null;
-		getStructuredDocumentContext();		
-	}
-
-	private IStructuredDocumentContext getStructuredDocumentContext() {
-		if (_sdContext == null) {
-			if (_ownerElement != null) {
-				_sdContext = IStructuredDocumentContextFactory.INSTANCE.getContext(_ownerElement.getStructuredDocument(), _ownerElement);				
-				
-			} else {
-				IEditorPart edPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-				if (edPart != null && edPart instanceof HTMLEditor) {//edPart will always be the WPE, but checking just to be safe
-					_sdContext = IStructuredDocumentContextFactory.INSTANCE.getContext(((HTMLEditor)edPart).getDocument(), 0);
-				}
-			} 
-		}
-		return _sdContext;
-	}
-
-	/**
-	 * @return tag entity for this attribute group
-	 */
-	protected Entity getTagEntity() {
-		if (_tagEntity == null) {
-			if (_ownerElement != null){
-				IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(_ownerElement.getStructuredDocument(), 0);
-				if (context != null){
-					String uri = _uri != null ? _uri : IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(context).getNode().getBaseURI();
-					String tagName = _tagName != null ? _tagName :  IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(context).getNode().getNodeName();
-					if (uri != null){
-						IProject project = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context).getProject();
-						_tagEntity = TaglibDomainMetaDataQueryHelper.getEntity(TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri), tagName);
-					}
-				}
-			}
-		}
-		return _tagEntity;
-	}
-	/**
-	 * @return tag name
-	 */
-	public String getTagName() {
-		if (getTagEntity() == null)
-			return _tagName;
-		return getTagEntity().getId();
-	}
-
-	/**
-	 * @return tag URI
-	 */
-	public String getURI() {
-		if (getTagEntity() == null)
-			return _uri;
-		return getTagEntity().getModel().getCurrentModelContext().getUri();
-	}
-
-
-	/**
-	 * Empty implementation. Subclasses should override to override default dialogField creation
-	 * @param ppd
-	 * @return DialogField
-	 */
-	protected DialogField createDialogField(IPropertyPageDescriptor ppd) {
-		return null;
-	}
-	
-//	protected DialogField createDialogField(String uri, String tag,
-//			String attr) {
-//		
-//		return null;
-//	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		if (_dialogFields == null) {
-			_dialogFields = new ArrayList();
-
-			for (IPropertyPageDescriptor pd : getAttributePDs()) {
-				DialogField field;			
-				field = createDialogField(pd);
-				
-				if (field == null) {
-					field = pd.getDialogFieldEditor();
-				}
-
-				field.putAttachedData(KEY_ATTR, pd);//descriptors[i]);
-
-				IDialogFieldApplyListener applyListener = getDialogFieldApplyListener(pd);
-//						getURI(), getTagName(), pd.getAttributeName());//descriptors[i]);
-				if (applyListener == null) {
-					applyListener = getDefaultApplyListener();
-				}
-				field.setDialogFieldApplyListener(applyListener);
-
-				IDialogFieldChangeListener changeListener = getDialogFieldChangeListener(pd);
-//						getURI(), getTagName(), pd.getAttributeName());//descriptors[i]);
-				if (changeListener == null) {
-					changeListener = getDefaultChangeListener();
-				}
-				field.setDialogFieldChangeListener(changeListener);
-				_dialogFields.add(field);
-			}
-		}
-	}
-
-	private List<IPropertyPageDescriptor> getAttributePDs() {
-		if (_attrPDs == null){
-			_attrPDs = prepareDescriptors(getTagEntity(), _attrNames);
-		}
-		return _attrPDs;
-	}
-
-	/**
-	 * Child class can override the method to provide listener implementation
-	 * 
-	 * @param ppd
-	 * @return IDialogFieldApplyListener
-	 */
-	protected IDialogFieldApplyListener getDialogFieldApplyListener(IPropertyPageDescriptor ppd) {
-		return null;
-	}
-
-	/**
-	 * Child class can override the method to provide listener implementation
-	 * 
-	 * @param ppd
-	 * @return IDialogFieldChangeListener
-	 */
-	protected IDialogFieldChangeListener getDialogFieldChangeListener(IPropertyPageDescriptor ppd){
-			return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (_ownerElement == null) {
-			return;
-		}
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-
-			ISupportTextValue textValue = (ISupportTextValue) field;
-			IPropertyPageDescriptor attr = (IPropertyPageDescriptor) field
-					.getAttachedData(KEY_ATTR);
-			String attrName = attr.getAttributeName();
-			String attrValue = _ownerElement.getAttribute(attrName);
-			textValue.setTextWithoutUpdate(attrValue);
-		}
-	}
-
-	/**
-	 * @return IDOMElement
-	 */
-	public IDOMElement getElement() {
-		return _ownerElement;
-	}
-
-	/**
-	 * Sets the context in each of the dialogFields in the Group
-	 * @param context
-	 * @param owner
-	 */
-	public void setElementContext(IDOMNode context, IDOMElement owner) {
-		this._ownerElement = owner;
-		resetStructuredDocumentContext();
-		initialize();
-		if (context != null) {
-			for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-				DialogField field = _dialogFields.get(i);
-				if (field instanceof IElementContextable) {
-					((IElementContextable) field).setElementContext(context,
-							owner);
-				}
-			}
-		}
-		refreshData();
-	}
-
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {//when being displayed by DialogFieldGroupPage  (wizard)
-			top = new Composite(parent, SWT.NONE);
-			FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-			parent.setLayout(fillLayout);
-		} else {
-			top = toolkit.createComposite(parent, SWT.NONE);
-		}
-//		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-//		parent.setLayout(fillLayout);
-
-//		if (this._helpContextId != null && this._helpContextId.length() > 0) {
-//			PlatformUI.getWorkbench().getHelpSystem().setHelp(top,
-//					_helpContextId);
-//		}
-
-		GridLayout layout = new GridLayout();
-		int numColumns = getNumColumns();
-		layout.numColumns = numColumns;
-		top.setLayout(layout);
-//		top.setLayoutData(new RowData());
-		
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			field.doFillIntoGrid(toolkit, top, numColumns);
-		}
-
-		DialogField maxColumnField = null;
-		int maxColumn = 0;
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			int c = field.getNumberOfControls();
-			if (c > maxColumn) {
-				maxColumn = c;
-				maxColumnField = field;
-			}
-		}
-		if (maxColumnField != null) {
-			maxColumnField.handleGrabHorizontal();
-		}
-	}
-
-	/**
-	 * @return number of columns in for composite grid layout
-	 */
-	public int getNumColumns() {
-		int columns = 1;
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			columns = Math.max(columns, field.getNumberOfControls());
-		}
-		return columns;
-	}
-	
-	@Override
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/**
-	 * @return DialogField[]
-	 */
-	public DialogField[] getDialogFields() {
-		initialize();
-		DialogField[] ret = new DialogField[_dialogFields.size()];
-		_dialogFields.toArray(ret);
-		return ret;
-	}
-
-	/**
-	 * get the dialogfield for the corresponding attribute.
-	 * 
-	 * @param attrName
-	 *            case sensitive attribute name.
-	 * @return null if fail to find.
-	 */
-	public DialogField getDialogField(String attrName) {
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			IPropertyPageDescriptor attr = this.getPropertyDescriptor(field);
-			if (attr != null && attr.getAttributeName().equals(attrName)) {
-				return field;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @param field
-	 * @return IPropertyPageDescriptor
-	 */
-	public IPropertyPageDescriptor getPropertyDescriptor(DialogField field) {
-		Object obj = field.getAttachedData(KEY_ATTR);
-		if (obj instanceof IPropertyPageDescriptor) {
-			return (IPropertyPageDescriptor) obj;
-		}
-	    return null;
-	}
-	
-	@Override
-	public void reset(){
-		if (_dialogFields != null){
-			for (DialogField field : _dialogFields){
-				field.setDialogFieldApplyListener(null);
-				field.setDialogFieldChangeListener(null);
-			}
-			_dialogFields = null;
-		}
-	}
-
-	/**
-	 * Set the tag entity
-	 * @param tagEntity
-	 */
-	/*package*/ void setTagEntity(Entity tagEntity) {
-		_tagEntity = tagEntity;		
-	}
-
-	public String toString(){
-		StringBuffer buf = new StringBuffer("AttributeGroup: uri="); //$NON-NLS-1$
-		buf.append("\r\r").append(getURI()).append("\r\rtag=").append(getTagName()); //$NON-NLS-1$ //$NON-NLS-2$
-		buf.append("\r\rAttrs: "); //$NON-NLS-1$
-		for (int i=0;i<_attrNames.size();i++) {
-			String attr = _attrNames.get(i);
-			buf.append(attr);
-			if (i<_attrNames.size())
-				buf.append(", "); //$NON-NLS-1$
-		}
-		return buf.toString();
-	}
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroupSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroupSection.java
deleted file mode 100644
index 49a49e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroupSection.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.AttributeGroupMessages;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * This is a section for a list of attribute dialog fields.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class AttributeGroupSection extends BaseCustomSection {
-	private static final Object KEY_ATTR = "KEY_ATTR"; //$NON-NLS-1$
-	private IDialogFieldApplyListener _fieldApplyListener = new IDialogFieldApplyListener() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener#dialogFieldApplied(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-		 */
-		public void dialogFieldApplied(DialogField field) {
-			Object attr = field.getAttachedData(KEY_ATTR);
-			if (attr instanceof IPropertyPageDescriptor && _element != null) {
-				ISupportTextValue textValue = (ISupportTextValue) field;
-				ChangeAttributeCommand c = new ChangeAttributeCommand(
-						AttributeGroupMessages
-								.getString("AttributeGroupSection.changeAttribute"), _element, ((IPropertyPageDescriptor) attr).getAttributeName(), textValue.getText()); //$NON-NLS-1$
-				c.execute();
-			}
-		}
-	};
-
-	private AttributeGroup _group;
-
-	/**
-	 * Constructor.  Create the section with a default AttributeGroup. In default
-	 * AttributeGroup, there is no relationship between fields.
-	 * 
-	 * @param tagEntity
-	 * @param attrNames
-	 */
-	public AttributeGroupSection(Entity tagEntity, List<String> attrNames) {
-		this(new AttributeGroup(tagEntity, attrNames));
-	}
-
-	/**
-	 * Constructor.  In case the group is not a default group (e.g. you may add some
-	 * customized relationship between the fields).
-	 * 
-	 * @param group
-	 */
-	public AttributeGroupSection(AttributeGroup group) {
-		_group = group;
-		_group.setDefaultApplyListener(_fieldApplyListener);
-//		_group.initialize();
-	}
-
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		_group.setElementContext(_element, _element);
-	}
-
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		_group.layoutDialogFields(factory, parent);
-	}
-
-	protected void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		if (_group != null) {
-			_group.refreshData();
-		}
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-		_group.reset();
-	}
-	
-	/**
-	 * NOT API - for JUnit testing only
-	 * @return @link{AttributeGroup}
-	 */
-	public AttributeGroup getAttributeGroup() {		
-		return _group;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributesTabDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributesTabDescriptor.java
deleted file mode 100644
index 4c00440..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributesTabDescriptor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-/**
- * Attributes tab descriptor
- *
- */
-public class AttributesTabDescriptor extends AbstractTabDescriptor {
-	
-	/**
-	 * Attributes tab id 
-	 */
-	public static final String TAB_ID = "jst.pagedesigner.tabbed.properties.attributes"; //$NON-NLS-1$
-
-	private Vector<ISectionDescriptor> descriptors;
-	
-	/**
-	 * Constructor
-	 */
-	public AttributesTabDescriptor(){
-		super();
-		descriptors = new Vector<ISectionDescriptor>(1);
-		descriptors.add(new AllPropertySectionDescriptor());
-	}
-	
-	@Override
-	public List getSectionDescriptors() {		
-		return descriptors;
-	}
-
-	public String getCategory() {
-		return "attributes"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return TAB_ID;
-	}
-
-	public String getLabel() {
-		return Messages.AttributesTabDescriptor_label;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DefaultPropertyPageDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DefaultPropertyPageDescriptor.java
deleted file mode 100644
index e32213c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DefaultPropertyPageDescriptor.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataContext;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.IAttributeRuntimeValueType;
-import org.eclipse.jst.pagedesigner.meta.internal.CellEditorFactoryRegistry;
-import org.eclipse.jst.pagedesigner.properties.ITabbedPropertiesConstants;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * Property descriptor implementation for when meta data is available, but the
- * meta data type is not adaptable to a {@link IPropertyPageDescriptor}.
- * 
- * It is assumed that the value type is
- * {@link org.eclipse.jst.jsf.taglibprocessing.attributevalues.StringType}.
- */
-public class DefaultPropertyPageDescriptor implements IPropertyPageDescriptor
-{
-    private Entity _tagEntity;
-    private Entity _attrEntity;
-
-    private IStructuredDocumentContext _sdContext;
-    private MetaDataContext _mdContext;
-
-    /**
-     * Constructor
-     * 
-     * @param tagEntity
-     * @param attrEntity
-     */
-    public DefaultPropertyPageDescriptor(Entity tagEntity, Entity attrEntity)
-    {
-        _tagEntity = tagEntity;
-        _attrEntity = attrEntity;
-    }
-
-    public String getAttributeName()
-    {
-        return _attrEntity.getId();
-    }
-
-    public String getCategory()
-    {
-        return ITabbedPropertiesConstants.OTHER_CATEGORY;
-    }
-
-    public CellEditor getCellEditor(Composite parent)
-    {
-        Element element = (Element) IStructuredDocumentContextResolverFactory.INSTANCE
-                .getDOMContextResolver(getStructuredDocumentContext())
-                .getNode();
-        return CellEditorFactoryRegistry.getInstance().createCellEditor(parent,
-                this, element);
-    }
-
-    public String getDescription()
-    {
-        return null;
-    }
-
-    public DialogField getDialogFieldEditor()
-    {
-        EditorCreator creator = EditorCreator.getInstance();
-        return creator.createDialogFieldWithWrapper(getUri(), getTagName(),
-                this, null);
-    }
-
-    public String getLabel()
-    {
-        return getAttributeName() + ":"; //$NON-NLS-1$
-    }
-
-    public String getTagName()
-    {
-        return _tagEntity.getId();
-    }
-
-    public String getUri()
-    {
-        return _tagEntity.getModel().getCurrentModelContext().getUri();
-    }
-
-    public String getValueType()
-    {
-        return IAttributeRuntimeValueType.STRING;
-    }
-
-    public boolean isRequired()
-    {
-        return false;
-    }
-
-    public MetaDataContext getMetaDataContext()
-    {
-        return _mdContext;
-    }
-
-    public IStructuredDocumentContext getStructuredDocumentContext()
-    {
-        return _sdContext;
-    }
-
-    public void setMetaDataContext(MetaDataContext context)
-    {
-        _mdContext = context;
-    }
-
-    public void setStructuredDocumentContext(IStructuredDocumentContext context)
-    {
-        _sdContext = context;
-    }
-
-    public Object getAdapter(Class adapter)
-    {
-        return null;
-    }
-
-    public String toString()
-    {
-        return getUri()
-                + "/" + getTagName() + "/" + getAttributeName() + " (Default Descriptor)"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/MDQuickEditTabSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/MDQuickEditTabSectionDescriptor.java
deleted file mode 100644
index e1628d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/MDQuickEditTabSectionDescriptor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * Quick Edit section descriptor that uses the quickEditSection trait meta data for the tag entity of the selection
- * to determine the sections to display
- *
- */
-public class MDQuickEditTabSectionDescriptor extends AbstractSectionDescriptor {
-	
-	/**
-	 * Default constructor
-	 */
-	public MDQuickEditTabSectionDescriptor() {
-		super();
-	}
-	
-	@Override
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		return true;// we will always display tab, but will show text that no quick edit properties are available when they aren't
-	}
-	
-	public ISection getSectionClass() {
-		return new  QuickEditTabSection();
-	}
-
-	public String getTargetTab() {
-		return QuickEditTabDescriptor.TAB_ID;
-	}
-
-	public String getId() {
-		return "mdQuickEditTabSections"; //$NON-NLS-1$
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/Messages.java
deleted file mode 100644
index 275a500..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalized strings
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.internal.messages"; //$NON-NLS-1$
-	/**
-	 * 
-	 */
-	public static String AttributesTabDescriptor_label;
-	/**
-	 * 
-	 */
-	public static String QuickEditTabDescriptor_label;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabGroupDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabGroupDescriptor.java
deleted file mode 100644
index 893b6ab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabGroupDescriptor.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * QuickEdit Tab section when quick edit section info is not available.
- * 
- * Ideally we should not be displaying the tab in the absence of MD, but due to current 
- * issues with the tabbed-properties framework, it is easier to simply display a "null"
- * section. 
- *
- */
-public class NullQuickEditTabGroupDescriptor extends
-		QuickEditTabSectionsDescriptor {
-
-	private List<ISection> nullQuickEditSection;
-	
-	/**
-	 * Constructor
-	 */
-	public NullQuickEditTabGroupDescriptor() {
-		super();
-	}
-
-	@Override
-	public List<ISection> getSections() {
-		return nullQuickEditSection;
-	}
-	
-	@Override
-	public void calculateSections() {
-		nullQuickEditSection = new ArrayList<ISection>(1);
-		nullQuickEditSection.add(new NullQuickEditTabSection());
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabSection.java
deleted file mode 100644
index 11712bf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabSection.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-/**
- * Section that displays text that no quick edit properties are available for the input
- */
-public class NullQuickEditTabSection extends AbstractPropertySection {
-
-	@Override
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = tabbedPropertySheetPage.getWidgetFactory();
-		
-		Composite cont = factory.createComposite(parent, SWT.NO_FOCUS);
-		GridLayout layout = new GridLayout(1, false);
-		cont.setLayout(layout);
-
-		CLabel lbl = 
-			factory.createCLabel(cont, PDPlugin.getResourceString("QuickEditTab.no_quick_edit_md"));//$NON-NLS-1$
-		lbl.setLayoutData(new GridData());		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabDescriptor.java
deleted file mode 100644
index 5917065..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabDescriptor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-
-/**
- * Quick Edit Tab Descriptor
- */
-public class QuickEditTabDescriptor extends AbstractTabDescriptor {
-
-	/**
-	 * Quick Edit tab id
-	 */
-	public static final String TAB_ID = "jst.pagedesigner.tabbed.properties.quickedit"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public QuickEditTabDescriptor(){
-		super();
-		getSectionDescriptors().add(new MDQuickEditTabSectionDescriptor());
-	}
-	
-	public String getCategory() {
-		return "quickedit"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return TAB_ID;
-	}
-
-	public String getLabel() {
-		return Messages.QuickEditTabDescriptor_label;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabManager.java
deleted file mode 100644
index 55de9cb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabManager.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.FileEditorInput;
-import org.w3c.dom.Element;
-
-/**
- * One-to-one with {@link WPETabbedPropertySheetPage} that manages the current sections for the current selection.
- * <p>
- * The QuickEditTabManager has a shared instance of a {@link QuickEditTabSectionsManager} for the project.
- * <p>
- * When a WPETabbedPropertySheetPage is created, it must acquire a QuickEditTabManager using the static acquireInstance method,
- * and then release the instance when it is disposed.  This ensures that the QuickEditTabSectionsManager shared instance (per project) is released appropriately.
- * <p>
- * selectionChanged method must be called prior to calling createControls on the sections for this tab group call.
- */
-public class QuickEditTabManager {
-	private QuickEditTabSectionsManager _groupsManager;
-	private QuickEditTabSections _quickEditTabSections;
-	private Entity _tagEntity;
-	private QName _lastTagID;
-	private QuickEditTabSectionsDescriptor _lastQuickEditTabGroup;
-	private QuickEditTabSectionsDescriptor _nullQuickEditTabGroup;
-	private Element _lastElement;
-	
-	private QuickEditTabSectionsManager getRegistry() {
-		return _groupsManager;
-	}
-
-	/**
-	 * Must only be called once per tabbed property sheet as ref count is kept.  
-	 * Callers must call releaseInstance when the page is disposed
-	 * @param page 
-	 * @return instance for this property sheet
-	 */
-	public static synchronized QuickEditTabManager acquireInstance(WPETabbedPropertySheetPage page) {
-		IProject project = getProject(page);	
-		QuickEditTabManager instance = new QuickEditTabManager();
-		instance._groupsManager = QuickEditTabSectionsManager.acquireInstance(project);
-		return instance;		
-	}
-
-	/**
-	 * Releases this instance, but does not dispose.  Ensures that the {@link QuickEditTabSectionsManager} is released.
-	 */
-	public synchronized void releaseInstance() {
-		this._groupsManager.releaseInstance();			
-	}
-	
-	/**
-	 * Private constructor
-	 */
-	private QuickEditTabManager(){
-		//
-	}
-	
-	private static IProject getProject(WPETabbedPropertySheetPage page) {
-		IProject proj = null;
-		IDocument doc = ((HTMLEditor)page.getEditor()).getDocument();
-		IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(doc, 0);
-		if (context != null){
-			proj = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context).getProject();
-		}
-		return proj;
-		 
-	}
-	/**
-	 * Must be called so that the sections for the input can be calculated. 
-	 * 
-	 * @param part
-	 * @param selection
-	 * @return true if current selection is different than during the last call
-	 */
-	public boolean selectionChanged(IWorkbenchPart part, ISelection selection) {
-		boolean hasChanged = false;
-		QuickEditTabSections qets = getQuickTabSectionsMetaData(part, selection); 
-		if (qets == null) {//use null quick edit tab			
-			hasChanged = (_quickEditTabSections != null);
-			_quickEditTabSections = qets;
-			_lastQuickEditTabGroup = getNullQuickEditTab();
-			_lastTagID = null;
-		}
-		else {
-			QName tagId = getTagId();
-			if (_lastTagID == null || !_lastTagID.equals(tagId)){
-				_quickEditTabSections = qets;
-				QuickEditTabSectionsDescriptor group = getRegistry().getQuickEditTabSectionsFor(tagId);
-				if (group == null){
-					group = createQuickEditTabGroup(tagId, _quickEditTabSections);
-					if (group != null){					
-						group.calculateSections();
-						getRegistry().addQuickEditTabGroupDescriptor(group);
-					}
-				}
-				_lastQuickEditTabGroup = group;
-				_lastTagID = tagId;
-			}
-		} 
-
-		return hasChanged;
-	}
-	
-	/**
-	 * @return current QuickEditTabSectionsDescriptor
-	 */
-	public QuickEditTabSectionsDescriptor getCurrentTabGroupDescriptor() {
-		return _lastQuickEditTabGroup;
-	}
-	
-	private QuickEditTabSections getQuickTabSectionsMetaData(IWorkbenchPart part,
-			ISelection selection) {
-
-		Element node = DesignerPropertyTool.getElement(part, selection);
-		if (node == null) {
-			return null;
-		}
-		if (_lastElement != node){
-			_lastElement = node;
-			_quickEditTabSections = null;
-			_tagEntity = getTagEntity(part, selection, node);
-			if (_tagEntity != null) {
-				Trait pds = TaglibDomainMetaDataQueryHelper.getTrait(_tagEntity, QuickEditTabSections.TRAIT_ID);
-				if (pds != null){
-					_quickEditTabSections = (QuickEditTabSections)pds.getValue();
-				}		
-			}			
-		}
-		return _quickEditTabSections;
-	}
-
-	private QuickEditTabSectionsDescriptor createQuickEditTabGroup(QName tagId,
-			QuickEditTabSections tabSections) {
-		return new QuickEditTabSectionsDescriptor(_tagEntity, tagId, tabSections);
-	}
-
-	private QName getTagId() {
-		return TaglibDomainMetaDataQueryHelper.getQNameForTagEntity(_tagEntity);
-	}
-
-	/**
-	 * Dispose
-	 */
-	public void dispose() {		
-		_lastQuickEditTabGroup= null;
-		_lastElement = null;
-		_lastTagID = null;		
-		_nullQuickEditTabGroup = null;
-		_quickEditTabSections = null;
-		_groupsManager = null;
-	}
-	
-	private Entity getTagEntity(IWorkbenchPart part, ISelection selection, Element node){
-		HTMLEditor ed = null;
-		if (part instanceof HTMLEditor)
-			ed = (HTMLEditor)part;
-		if (ed == null)
-			return null;
-		
-		if (ed.getEditorInput() instanceof FileEditorInput) {
-			FileEditorInput input = (FileEditorInput)ed.getEditorInput();
-			IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(ed.getDocument(), node);
-			if (context != null){
-				ITaglibContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(context);
-				if (resolver != null){
-					ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(input.getFile().getProject(),resolver.getTagURIForNodeName(node));
-					return TaglibDomainMetaDataQueryHelper.getEntity(mdContext, node.getLocalName());
-				}
-			}
-		}
-		return null;		
-	}
-	
-	private QuickEditTabSectionsDescriptor getNullQuickEditTab() {
-		if (_nullQuickEditTabGroup == null) {
-			_nullQuickEditTabGroup = new NullQuickEditTabGroupDescriptor();
-			_nullQuickEditTabGroup.calculateSections();
-		}
-		return _nullQuickEditTabGroup;
-	}
-
-	/**
-	 * NOT API - for JUnit testing only
-	 * @return {@link QuickEditTabSectionsManager} 
-	 */	
-	public QuickEditTabSectionsManager getQuickEditTabSectionsManager() {
-		return _groupsManager;
-	}
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSection.java
deleted file mode 100644
index 172626c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSection.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * Using the tag entity's QuickEditTabSections meta-data, this section reacts to changes in selection,
- * and will dynamically create a QuickEditTabGroup.   The QuickEditTabGroup is cached and reused.
- * <br><br>
- * This section delegates construction to the sections discovered thru meta data.   
- * Because this section is not disposed of until the tab is disposed, this section will enforce the expected section lifecycle
- * on the sections loaded from meta data.   This occurs during setInput.  But will pass on all section lifecycle events as 
- * this section receives them.
- * <br><br>
- * The lifecycle that this section enforces on it's child sections in the setInput call on this section are (in order):
- * 	<li>createControls
- * 	<li>setInput
- *  <li>aboutToBeShown
- *  <li>refresh
- *  
- * When tab section lifecycle events occur to this section, they are passed on to all child sections also. 
- * 	
- */
-public class QuickEditTabSection extends AbstractPropertySection {
-	
-	private QuickEditTabManager manager;
-	private Composite _composite;
-	private Composite _qeGroupComposite;
-	private WPETabbedPropertySheetPage _tabbedPropertySheetPage;
-
-	private QuickEditTabManager getTabManager() {
-		if (manager == null) {
-			manager = _tabbedPropertySheetPage.getTabManager();
-		}
-		return manager;
-	}
-
-	@Override
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		_composite = parent;
-		_tabbedPropertySheetPage = (WPETabbedPropertySheetPage)tabbedPropertySheetPage;
-	}
-
-	@Override
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		if (getTabManager() != null){
-			aboutToBeHidden();
-			createOrResetQuickEditGroupComposite();//disposes of old and recreates new topComp
-			getTabManager().selectionChanged(part, selection);
-			for (ISection section : getSections()){
-				section.createControls(_qeGroupComposite, _tabbedPropertySheetPage);
-				section.setInput(part, selection);
-			}
-			_composite.getParent().layout(true, true);
-			
-			aboutToBeShown();
-			refresh();
-		}			
-	}
-
-	@Override
-	public void aboutToBeHidden() {
-		super.aboutToBeHidden();
-		for (ISection section : getSections()){
-			section.aboutToBeHidden();
-		}
-	}
-
-	@Override
-	public void aboutToBeShown() {
-		super.aboutToBeShown();
-		for (ISection section : getSections()){
-			section.aboutToBeShown();
-		}
-	}
-	
-	@Override
-	public void refresh() {
-		super.refresh();
-		for (ISection section : getSections()){
-			section.refresh();
-		}
-	}
-
-	private void createOrResetQuickEditGroupComposite() {
-		if (_qeGroupComposite != null && !_qeGroupComposite.isDisposed()){
-			//dispose of current sections
-			disposeCurrentQuickEditTabSections();
-			_qeGroupComposite.dispose();
-		}			
-		
-		_qeGroupComposite = _tabbedPropertySheetPage.getWidgetFactory().createComposite(_composite, SWT.NO_FOCUS);
-		QuickEditTabLayout layout = new QuickEditTabLayout();
-		_qeGroupComposite.setLayout(layout);
-		
-	}
-
-	private void disposeCurrentQuickEditTabSections() {		
-		for (ISection section : getSections()){
-			section.dispose();
-		}
-	}
-
-	private List<ISection> getSections(){
-		if (getTabManager().getCurrentTabGroupDescriptor() != null)
-			return getTabManager().getCurrentTabGroupDescriptor().getSections();
-		
-		return Collections.EMPTY_LIST;
-	}
-	
-	public void dispose() {
-		super.dispose();
-		disposeCurrentQuickEditTabSections();
-		manager.dispose();
-		manager = null;
-		_composite = null;
-		_qeGroupComposite = null;
-		_tabbedPropertySheetPage = null;
-	}	
-
-	public boolean shouldUseExtraSpace() {
-		return false;
-	}
-
-	private class QuickEditTabLayout extends Layout {
-
-		// allow for adjustments
-		private static final int MARGIN = 0;
-		private static final int SPACING = 0;
-
-		// cache
-		Point[] sizes;
-		int maxWidth, totalHeight;
-
-		protected Point computeSize(Composite composite, int wHint, int hHint,
-				boolean flushCache) {
-
-			Control children[] = composite.getChildren();
-			if (flushCache || sizes == null || sizes.length != children.length) {
-				initialize(children);
-			}
-
-			int width = wHint, height = hHint;
-			if (wHint == SWT.DEFAULT)
-				width = maxWidth;
-
-			if (hHint == SWT.DEFAULT)
-				height = totalHeight;
-
-			return new Point(width + 2 * MARGIN, height + 2 * MARGIN);
-		}
-
-		protected void layout(Composite composite, boolean flushCache) {
-			Control children[] = composite.getChildren();
-			if (flushCache || sizes == null || sizes.length != children.length) {
-				initialize(children);
-			}
-			Rectangle rect = composite.getClientArea();
-			int x = MARGIN, y = MARGIN;
-			int width = Math.max(rect.width - 2 * MARGIN, maxWidth);
-//			System.out.println("--- Comp id: "+composite.toString()+ "[#Children: "+ composite.getChildren().length +"] -------");
-			for (int i = 0; i < children.length; i++) {
-				int height = sizes[i].y;
-				children[i].setBounds(x, y, width, height);
-				y += height + SPACING;
-//				System.out.println("h="+height+", y="+y);
-			}
-		    composite.setRedraw(true);
-		}
-
-		void initialize(Control children[]) {
-			maxWidth = 0;
-			totalHeight = 0;
-			sizes = new Point[children.length];
-			for (int i = 0; i < children.length; i++) {
-				sizes[i] = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-				maxWidth = Math.max(maxWidth, sizes[i].x);
-				totalHeight += sizes[i].y;
-			}
-			totalHeight += (children.length - 1) * SPACING;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionDescriptor.java
deleted file mode 100644
index 18fddd4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionDescriptor.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.internal.views.properties.tabbed.view.SectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-import org.w3c.dom.Element;
-
-/**
- * A SectionDescriptor from org.eclipse.ui.views.properties.tabbed.propertySections extension-point 
- * for use by the QuickEdit tab in the Web Page Editor.
- */
-public class QuickEditTabSectionDescriptor extends SectionDescriptor {
-
-	private static final String ATT_CLASS = "class"; //$NON-NLS-1$ 
-	private IConfigurationElement _configurationElement;
-	private Entity _tagEntity;
-
-	/**
-	 * Constructor for the section descriptor.
-	 * 
-	 * @param configurationElement
-	 *            the configuration element for the section descriptor.
-	 * @param typeMapper 
-	 */
-	public QuickEditTabSectionDescriptor(IConfigurationElement configurationElement, ITypeMapper typeMapper) {
-		super(configurationElement, typeMapper);
-		_configurationElement = configurationElement;
-	}
-
-	@Override
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Element node = DesignerPropertyTool.getElement(part, selection);
-		if (node == null) {
-			return false;
-		}
-		return true;
-	}
-
-	@Override
-	public ISection getSectionClass() {
-		ISection section = null;
-		try {
-			Object secOrGroup = _configurationElement
-					.createExecutableExtension(ATT_CLASS);
-			if (secOrGroup instanceof ISection) {
-				section = (ISection) secOrGroup;
-			} else if (secOrGroup instanceof AttributeGroup) {
-				((AttributeGroup) secOrGroup).setTagEntity(_tagEntity);
-				section = new AttributeGroupSection((AttributeGroup) secOrGroup);		
-			}
-		} catch (CoreException exception) {
-			handleSectionError(exception);
-		}
-		return section;
-	}
-	
-	/**
-	 * Handle the section error when an issue is found loading from the
-	 * configuration element.
-	 * 
-	 * @param _configurationElement
-	 *            the configuration element
-	 * @param exception
-	 *            an optional CoreException
-	 */
-	private void handleSectionError(CoreException exception) {
-		PDPlugin.getLogger(QuickEditTabSectionDescriptor.class).error("error", //$NON-NLS-1$
-				exception);
-		exception.printStackTrace();
-	}
-
-	/**
-	 * @param tagEntity
-	 * @return ISection for the tagEntity
-	 */
-	/*package*/ ISection getSectionClass(Entity tagEntity) {
-		_tagEntity = tagEntity;
-		return getSectionClass();
-	}
-		
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsDescriptor.java
deleted file mode 100644
index afba392..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsDescriptor.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * Represents all of the section classes that make up the Quick Edit tab for a given tag input.   
- * Uses QuickEditTabSections meta data from tag entity
- */
-public class QuickEditTabSectionsDescriptor {
-
-	private QuickEditTabSections _sections;
-	private QName _tagId;
-	private List<ISection> _sectionClasses;
-	private Entity _tagEntity;
-	private WPETabPropertySectionDescriptorProvider sectionProvider;
-
-	/**
-	 * Constructor
-	 * @param tagEntity
-	 * @param tagId
-	 * @param sections
-	 */
-	public QuickEditTabSectionsDescriptor (Entity tagEntity, QName tagId, QuickEditTabSections sections) {
-		_tagEntity = tagEntity;
-		_tagId = tagId;
-		_sections = sections;
-	}	
-
-	/*package*/ QuickEditTabSectionsDescriptor () {
-		_tagEntity = null;
-		_tagId = null;
-		_sections = null;
-	}
-	
-	/**
-	 * Determines section classes for the group from the available meta data
-	 */
-	public void calculateSections() {
-		if (_sectionClasses == null || _sectionClasses.isEmpty()) {
-			_sectionClasses = new ArrayList();
-			List<String> attrIds = new ArrayList();
-			for (SectionInfo secInfo : _sections.getSections()) {
-				if (secInfo.getType() == SECTION_TYPE.ATTRIBUTE){
-					//collect attrSecs and process as a group so that layout will be best
-					if (secInfo.getId() != null) 
-						attrIds.add(secInfo.getId());
-				}
-				else if (secInfo.getType() == SECTION_TYPE.SECTION) {
-					//if there are any attribute sections not processed, do that now
-					if (attrIds.size() > 0){
-						createAttributeGroup(attrIds);
-						attrIds = new ArrayList();
-					}
-					createSectionGroup(secInfo);
-				}
-			}
-			if (attrIds.size() > 0){
-				createAttributeGroup(attrIds);
-			}
-		}		
-	}
-
-	private void createSectionGroup(SectionInfo secInfo) {
-		QuickEditTabSectionDescriptor sd = getSectionProvider().getNamedSectionDescriptor(secInfo.getId());
-		if (sd != null) {
-			ISection section = sd.getSectionClass(_tagEntity);
-			if (section != null){
-				_sectionClasses.add(section);
-			}
-		}
-		
-	}
-
-	private void createAttributeGroup(List<String> attrNames) {
-		ISection section = new AttributeGroupSection(_tagEntity, attrNames);
-		if (section != null){		
-			_sectionClasses.add(section);
-		}
-	}
-
-	/**
-	 * @return QName of tag that this tab descriptor is for
-	 */
-	public QName getTagId() {
-		return _tagId;
-	}
-
-	/**
-	 * @return List of current ISection classes set after calculateSections() has been called
-	 */
-	public List<ISection> getSections() {
-		return _sectionClasses;
-	}
-
-	private WPETabPropertySectionDescriptorProvider getSectionProvider() {
-		if (sectionProvider == null){
-			sectionProvider = new WPETabPropertySectionDescriptorProvider();
-		}
-		return sectionProvider;
-	}
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsManager.java
deleted file mode 100644
index 17bbc45..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsManager.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Cache of quickEditTabGroupDescriptors keyed by tagID as QName.  
- */
-public class QuickEditTabSectionsManager {
-	
-	private static QuickEditTabSectionsManagerMgr _mgrInstance = new QuickEditTabSectionsManagerMgr();
-	private Map<QName, QuickEditTabSectionsDescriptor> map = new HashMap<QName, QuickEditTabSectionsDescriptor>(5);
-	private IProject _project;
-	private int clientCount = 0;
-	
-	/**
-	 * Returns instance of QuickEditTabSectionsManager for the given project.   Caller must release the instance when caller is being disposed.
-	 * @param project
-	 * @return instance of QuickEditTabSectionsManager
-	 */
-	public static synchronized QuickEditTabSectionsManager acquireInstance(IProject project){
-		QuickEditTabSectionsManager instance = _mgrInstance.getSectionsManager(project);
-		instance.clientCount++;
-		return instance;	
-	}
-	
-	/**
-	 * Releases instance of QuickEditTabSectionsManager and removes from the QuickEditSectionGroupsManagerMgr if it is the last reference
-	 */
-	public synchronized void releaseInstance(){
-		int refCount = --clientCount;
-		if (refCount == 0){
-			_mgrInstance.removeSectionsManager(_project);
-		}	
-	}
-
-	/**
-	 * private constructor
-	 */
-	private QuickEditTabSectionsManager(){
-		//
-	}
-	
-	/**
-	 * @return IProject that this section manager applies to
-	 */
-	public IProject getProject(){
-		return _project;
-	}
-	
-	/**
-	 * Get QuickEditTabSectionsDescriptor for passed tag
-	 * 
-	 * @param tagId
-	 * @return QuickEditTabSectionsDescriptor
-	 */
-	public QuickEditTabSectionsDescriptor getQuickEditTabSectionsFor(QName tagId) {
-		return map.get(tagId);
-	}
-
-	/**
-	 * Adds QuickEditTabSectionsDescriptor to managed registry keyed by the tagId
-	 * QName
-	 * 
-	 * @param group
-	 */
-	public void addQuickEditTabGroupDescriptor(QuickEditTabSectionsDescriptor group) {
-		map.put(group.getTagId(), group);
-	}
-
-	/**
-	 * Removes and disposes a cached {@link QuickEditTabSectionsDescriptor}
-	 * 
-	 * @param tagId
-	 */
-	public void removeQuickEditTabGroup(QName tagId) {
-		QuickEditTabSectionsDescriptor grp = map.get(tagId);
-		if (grp != null) {
-			map.remove(tagId);
-		}
-	}
-
-	/**
-	 * Manages the QuickEditTabSectionsManager instances.  Ensures one per project.	 
-	 */
-	private static class QuickEditTabSectionsManagerMgr {		
-		private Map <IProject,QuickEditTabSectionsManager>_map = new HashMap<IProject,QuickEditTabSectionsManager>();
-		/**
-		 * @param project - may be null
-		 * @return QuickEditTabManager for project
-		 */
-		public QuickEditTabSectionsManager getSectionsManager(IProject project){
-			if (_map.containsKey(project))
-				return _map.get(project);
-
-			QuickEditTabSectionsManager instance = new QuickEditTabSectionsManager();
-			instance._project = project;
-			_map.put(project, instance);
-			return instance;
-		}
-		
-		/**
-		 * Removes QuickEditTabManager from mgr for given project
-		 * @param project
-		 */
-		public void removeSectionsManager(IProject project){
-			if (_map.containsKey(project))
-				_map.remove(project);
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabDescriptorProvider.java
deleted file mode 100644
index 5003d40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabDescriptorProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
-
-/**
- * Class that provides the default tabs for the Web Page Editor
- */
-public class WPETabDescriptorProvider implements ITabDescriptorProvider {
-
-	private AttributesTabDescriptor _attributesTabDescriptor;
-	private QuickEditTabDescriptor _quickTabDescriptor;
-
-	/**
-	 * Constructor
-	 */
-	public WPETabDescriptorProvider() {
-		_quickTabDescriptor = new QuickEditTabDescriptor();
-		_attributesTabDescriptor = new AttributesTabDescriptor();
-	}
-	
-	/**
-	 * Provides a QuickTabDescriptor and the AttributesTabDescriptor
-	 */
-	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part,
-			ISelection selection) {
-
-		return new ITabDescriptor[]{_quickTabDescriptor, 
-									_attributesTabDescriptor};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabPropertySectionDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabPropertySectionDescriptorProvider.java
deleted file mode 100644
index 4e2530d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabPropertySectionDescriptorProvider.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider;
-
-/**
- * Provides sections registered for the Web Page Editor whose contributor ID is,
- * "org.eclipse.jst.pagedesigner.tabPropertyContributor" using the
- * org.eclipse.ui.views.properties.tabbed.propertyTabs extension-points.  
- * 
- * The sections declared using the org.eclipse.ui.views.properties.tabbed.propertySections extension-point 
- * for the WPE will only be displayed by the Quick Edit tab is the selected tag has metadata to choose 
- * the section.  TypeMappers/filters, etc. are ignored by this sectionDescriptorProvider.
- * 
- * See jsf_html.xml in the org.eclipse.jst.jsf.standard.tagsupport plugin for examples on how to use.  
- */
-public class WPETabPropertySectionDescriptorProvider implements
-		ISectionDescriptorProvider {
-	
-	private static final String EXTPT_SECTIONS = "propertySections"; //$NON-NLS-1$
-	private static final String ELEMENT_SECTION = "propertySection"; //$NON-NLS-1$
-	private ISectionDescriptor[] _descriptors = null;
-
-	/**
-	 * Constructor
-	 */
-	public WPETabPropertySectionDescriptorProvider() {
-		super();
-	}
-
-	public ISectionDescriptor[] getSectionDescriptors() {
-		if (_descriptors == null) {
-			List result = new ArrayList();
-			List contributedSections = readSectionDescriptors();
-			result.addAll(contributedSections);
-
-//			if (1 == 0){ //disabled for now... do we want to allow other mechanisms to add sections?
-//				List providers = readAdditionalSectionDescriptorProviders();
-//				for (int i = 0, size = providers.size(); i < size; i++) {
-//					try {
-//						ISectionDescriptorProvider provider = (ISectionDescriptorProvider) providers
-//								.get(i);
-//						ISectionDescriptor[] sections = provider
-//								.getSectionDescriptors();
-//						if (sections != null) {
-//							result.addAll(Arrays.asList(sections));
-//						}
-//					} catch (Exception ex) {
-//						// ignore
-//						ex.printStackTrace();
-//					}
-//				}
-//			}
-			_descriptors = new ISectionDescriptor[result.size()];
-			result.toArray(_descriptors);
-		}
-		return _descriptors;
-	}
-
-	/**
-	 * @return registered section descriptors for the WPE QuickEdit tab
-	 */
-	protected List<QuickEditTabSectionDescriptor> readSectionDescriptors() {
-		List result = new ArrayList();
-			
-		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_SECTIONS);
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement extension = extensions[i];
-			if (extension.getAttribute("contributorId").equals(HTMLEditor.TABBED_PROPERTIES_CONTRIBUTOR_ID)){ //$NON-NLS-1$
-				IConfigurationElement[] sections = extension
-						.getChildren(ELEMENT_SECTION);
-				for (int j = 0; j < sections.length; j++) {
-					IConfigurationElement section = sections[j];
-					ISectionDescriptor descriptor = new QuickEditTabSectionDescriptor(
-							section, null);//ITypeMapper set to null
-					result.add(descriptor);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param extensionPointId
-	 * @return IConfigurationElement[] 
-	 */
-	private static IConfigurationElement[] getConfigurationElements(
-			String extensionPointId) {
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint("org.eclipse.ui.views.properties.tabbed", extensionPointId); //$NON-NLS-1$
-		if (extensionPoint == null) {
-			return null;
-		}
-		return extensionPoint.getConfigurationElements();
-	}
-	
-	/**
-	 * @param name of section
-	 * @return {@link QuickEditTabSectionDescriptor} or null if not located
-	 */
-	public QuickEditTabSectionDescriptor getNamedSectionDescriptor(String name) {
-		for (int i=0;i<getSectionDescriptors().length;i++){
-			QuickEditTabSectionDescriptor sd = (QuickEditTabSectionDescriptor)getSectionDescriptors()[i];
-			if (name.equals(sd.getId()))
-				return sd;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/messages.properties
deleted file mode 100644
index 57b015f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/messages.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-AttributesTabDescriptor_label=Attributes
-QuickEditTabDescriptor_label=Quick Edit
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/messages.properties
deleted file mode 100644
index b0d48c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-ITabbedPropertiesConstants_other_category=Attributes
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java
deleted file mode 100644
index 1d85654..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.range;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- */
-public class RangeUtil {
-	/**
-	 * append the child after the reference node as next sibling.
-	 * 
-	 * @param child
-	 *            can't be null
-	 * @param reference
-	 *            can't be null
-	 * @return ??
-	 */
-    //TODO: dead
-//	private static Node appendAfter(Node child, Node reference) {
-//		Node next = reference.getNextSibling();
-//		if (next == null)
-//        {
-//			return reference.getParentNode().appendChild(child);
-//        }
-//        return reference.getParentNode().insertBefore(child, next);
-//	}
-
-	/**
-	 * @param child
-	 * @param reference
-	 * @return ??
-	 */
-    // TODO: dead
-//	private static Node insertBefore(Node child, Node reference) {
-//		return reference.getParentNode().insertBefore(child, reference);
-//	}
-
-	/**
-	 * Insert a node into the specified position. The node can be an element or
-	 * DocumentFragment.
-	 * 
-	 * @param node
-	 * @param position
-	 */
-	// TODO: dead
-//	private static Node insertElement(DesignPosition position, Element node) {
-//		EditPart containerEditPart = position.getContainerPart();
-//		int offset = position.getOffset();
-//
-//		if (containerEditPart instanceof TextEditPart) {
-//			TextEditPart textPart = (TextEditPart) containerEditPart;
-//			String textData = textPart.getTextData();
-//			Node textNode = (Node) textPart.getModel();
-//			if (offset == 0)
-//				return insertBefore(node, textNode);
-//			else if (offset == textData.length())
-//				return appendAfter(node, textNode);
-//			else {
-//				// inserting the element in the middle of text.
-//				String before = textData.substring(0, offset);
-//				String after = textData.substring(offset);
-//
-//				// XXX: don't know whether setNodeValue() will do all those
-//				// escape or not.
-//				textNode.setNodeValue(after);
-//				Node newnode = insertBefore(node, textNode);
-//
-//				// XXX: don't know whether createTextNode() will do all those
-//				// escape or not
-//				Text t = textNode.getOwnerDocument().createTextNode(before);
-//
-//				insertBefore(t, newnode);
-//				return newnode;
-//			}
-//		}
-//        return insertIntoEditPart(containerEditPart, node, offset);
-//	}
-
-	/**
-	 * @param containerEditPart
-	 * @param node
-	 * @param offset
-	 * @return
-	 */
-	// TODO: dead
-//	private static Node insertIntoEditPart(EditPart containerEditPart,
-//			Node node, int offset) {
-//		Node parent = (Node) containerEditPart.getModel();
-//		List childParts = containerEditPart.getChildren();
-//		if (offset >= childParts.size()) {
-//			// to the end of parent
-//			return parent.appendChild(node);
-//		}
-//        Node child = (Node) ((EditPart) childParts.get(offset)).getModel();
-//        return insertBefore(node, child);
-//	}
-
-	// TODO: dead
-//	private static TextPosition insertText(DesignPosition position, String data) {
-//		// TODO: never read EditPart containerEditPart = position.getContainerPart();
-//
-//		position = moveIntoText(position);
-//		int offset = position.getOffset();
-//
-//		if (position.getContainerPart() instanceof TextEditPart) {
-//			// it is guaranteeed that now the containing edit part is text node.
-//			TextEditPart textPart = (TextEditPart) position.getContainerPart();
-//			String textData = textPart.getTextData();
-//			String before = textData.substring(0, offset);
-//			String after = textData.substring(offset);
-//			if (data.startsWith(" ") && before.endsWith(" ")) {
-//				before = before.substring(0, before.length() - 1) + "&nbsp;";
-//			}
-//			if (after.startsWith(" ") && data.endsWith(" ")) {
-//				data = data.substring(0, data.length() - 1) + (char) 160;
-//			}
-//			String nextData = before + data + after;
-//			IDOMText text = (IDOMText) textPart.getModel();
-//			text.setData(nextData);
-//			return new TextPosition(text, offset + data.length());
-//		}
-//        // can't merge into a neighboring text node. So create a text node
-//        // of it's own
-//        EditPart part = position.getContainerPart();
-//        Node parent = (Node) part.getModel();
-//        Text text = parent.getOwnerDocument().createTextNode(data);
-//        insertIntoEditPart(part, text, offset);
-//        return new TextPosition((IDOMText) text, offset);
-//	}
-
-	/**
-	 * Try to make the position move into a text node.
-	 * 
-	 * @param position
-	 * @return
-	 */
-    // TODO: dead
-//	private static DesignPosition moveIntoText(DesignPosition position) {
-//		EditPart container = position.getContainerPart();
-//		if (container instanceof TextEditPart)
-//			return position;
-//		if (position.getOffset() > 0) {
-//			EditPart pre = (EditPart) container.getChildren().get(
-//					position.getOffset() - 1);
-//			if (pre instanceof TextEditPart) {
-//				return new DesignPosition(pre, ((TextEditPart) pre)
-//						.getTextData().length());
-//			}
-//		}
-//		if (position.getOffset() < container.getChildren().size()) {
-//			EditPart next = (EditPart) container.getChildren().get(
-//					position.getOffset());
-//			if (next instanceof TextEditPart) {
-//				return new DesignPosition(next, 0);
-//			}
-//		}
-//		return position;
-//	}
-
-	/**
-	 * try to move the position up to not inside a text. if the position is at 0
-	 * index or last index of a text node, then try to move it up.
-	 * 
-	 * @param position
-	 * @return
-	 */
-    // TODO: dead
-//	private static DesignPosition moveOutFromText(DesignPosition position) {
-//		EditPart container = position.getContainerPart();
-//		if (container instanceof TextEditPart) {
-//			int offset = position.getOffset();
-//			String text = ((TextEditPart) container).getTextData();
-//			if (offset == 0) {
-//				return new DesignPosition(container.getParent(), container
-//						.getParent().getChildren().indexOf(container));
-//			} else if (offset == text.length()) {
-//				return new DesignPosition(container.getParent(), container
-//						.getParent().getChildren().indexOf(container) + 1);
-//			}
-//		}
-//		return position;
-//	}
-
-//	private static void insertDocumentFragment(DesignPosition position,
-//			DocumentFragment fragment) {
-//		// FIXME: NOT DONE.
-//	}
-
-	/**
-	 * Test whether the range intersect with the part.
-	 * 
-	 * @param range
-	 * @param part
-	 * @return true if thereis an intersection
-	 */
-	public static boolean intersect(DesignRange range, EditPart part) {
-		if (range == null || !range.isValid())
-			return false;
-		range = normalize(range);
-		if (part instanceof DocumentEditPart)
-			return true;
-		EditPart parent = part.getParent();
-		int index = parent.getChildren().indexOf(part);
-		DesignPosition left = new DesignPosition(parent, index);
-		DesignPosition right = new DesignPosition(parent, index + 1);
-		int compare = compareDesignPosition(left, range.getEndPosition());
-		if (compare == 1 || compare == 0 || compare == Integer.MIN_VALUE)
-			return false;
-
-		compare = compareDesignPosition(right, range.getStartPosition());
-		if (compare == -1 || compare == 0 || compare == Integer.MIN_VALUE)
-			return false;
-
-		return true;
-	}
-
-	/**
-	 * make sure the start position is before end position. If the original
-	 * range is already normalized, then the original range will be returned
-	 * without constructing a new one.
-	 * 
-	 * @param range
-	 * @return the normalized range
-	 */
-	public static DesignRange normalize(DesignRange range) {
-		if (range == null || !range.isValid()) {
-			return range;
-		}
-		int result = compareDesignPosition(range.getStartPosition(), range
-				.getEndPosition());
-		if (result == 1)
-        {
-			return new DesignRange(range.getEndPosition(), range
-					.getStartPosition());
-        }
-        return range;
-	}
-
-	/**
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return 0 means equal. 1 Means p1 is after p2. -1 means p1 is before p2.
-	 *         Integer.MIN_VALUE means some error and can't compare.
-	 */
-	private static int compareDesignPosition(DesignPosition p1, DesignPosition p2) {
-		if (!p1.isValid() || !p2.isValid())
-			return Integer.MIN_VALUE;
-		if (p1.equals(p2))
-			return 0;
-		int offset1 = p1.getOffset();
-		int offset2 = p2.getOffset();
-		List a1 = getAncesters(p1.getContainerPart());
-		List a2 = getAncesters(p2.getContainerPart());
-		if (a1 == null || a2 == null)
-			return Integer.MIN_VALUE;
-		if (a1.get(0) != a2.get(0))
-			return Integer.MIN_VALUE; // not same DocumentEditPart
-		for (int i = 1;; i++) {
-			EditPart p1a = (EditPart) a1.get(i);
-			EditPart p2a = (EditPart) a2.get(i);
-			if (p1a == p2a) {
-				if (p1a != null)
-                {
-					continue; // same ancester
-                }
-                // both are null. just compare the offset.
-                return offset1 < offset2 ? -1
-                		: (offset1 == offset2 ? 0 : 1);
-			}
-			// p1a != p2a. now we can just compare p1a and p2a to decide the
-			// order.
-			if (p1a != null)
-				offset1 = p1a.getParent().getChildren().indexOf(p1a);
-			if (p2a != null)
-				offset2 = p2a.getParent().getChildren().indexOf(p2a);
-			if ((p1a == null && p2a == null) || (p1a != null && p2a != null)) {
-				return offset1 < offset2 ? -1 : (offset1 == offset2 ? 0 : 1);
-			} else if (p1a == null) {
-				return offset1 <= offset2 ? -1 : 1;
-			} else {
-				return offset1 >= offset2 ? 1 : -1;
-			}
-		}
-	}
-
-	/**
-	 * Get a list of ancester nodes starting from the DocumentEditPart till the
-	 * node.
-	 * 
-	 * @param part
-	 * @return
-	 */
-	private static List getAncesters(EditPart part) {
-		List list = new ArrayList();
-		while (part != null) {
-			list.add(part);
-			if (part instanceof DocumentEditPart)
-            {
-				break;
-            }
-			part = part.getParent();
-		}
-		if (part == null) {
-			// if part ==null, means we didn't find a DocumentEditPart,
-			// something must be wrong.
-			return null;
-		}
-		// reverse to make it starting from the docuemnteditpart node.
-		Collections.reverse(list);
-		list.add(null); // add an null terminator.
-		return list;
-	}
-
-	/**
-	 * find the smallest common ancester of two edit part.
-	 * 
-	 * @param part1
-	 * @param part2
-	 * @return
-	 */
-	private static EditPart findCommonAncester(EditPart part1, EditPart part2) {
-		if (part1 == part2) {
-			return part1;
-		}
-		List list1 = getAncesters(part1);
-		if (list1 == null)
-			return null;
-		List list2 = getAncesters(part2);
-		if (list2 == null)
-			return null;
-		if (list1.get(0) != list2.get(0))
-			return null;
-		EditPart common = (EditPart) list1.get(0);
-		for (int i = 1;; i++) {
-			EditPart p1 = (EditPart) list1.get(i);
-			EditPart p2 = (EditPart) list2.get(i);
-			if (p1 == null || p2 == null)
-				return common;
-			if (p1 != p2)
-				return common;
-			common = p1;
-		}
-
-	}
-
-	/**
-	 * @param range
-	 * @return the common ancestor
-	 */
-	public static EditPart findCommonAncestor(DesignRange range) {
-		if (!range.isValid()) {
-			return null;
-		}
-		DesignPosition startPosition = range.getStartPosition();
-		DesignPosition endPosition = range.getEndPosition();
-		return findCommonAncester(startPosition.getContainerPart(), endPosition
-				.getContainerPart());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/LocationModifierRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/LocationModifierRequest.java
deleted file mode 100644
index 176710b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/LocationModifierRequest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.requests;
-
-import org.eclipse.gef.requests.LocationRequest;
-
-/**
- * This is a LocationRequest plus keyboard modified support.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class LocationModifierRequest extends LocationRequest {
-
-	private boolean _controlKeyDown;
-
-	/**
-	 * 
-	 */
-	public LocationModifierRequest() {
-		super();
-	}
-
-	/**
-	 * @param type
-	 */
-	public LocationModifierRequest(Object type) {
-		super(type);
-	}
-
-	/**
-	 * @return true if the control key was pressed
-	 */
-	public boolean isControlKeyPressed() {
-		return _controlKeyDown;
-	}
-
-	/**
-	 * @param b
-	 */
-	public void setControlKeyPressed(boolean b) {
-		this._controlKeyDown = b;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/NodeCreationFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/NodeCreationFactory.java
deleted file mode 100644
index 7c54de0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/NodeCreationFactory.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.requests;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class NodeCreationFactory implements CreationFactory {
-	private final String _tagName;
-
-	private final String _uri;
-
-	private final String _suggestedPrefix;
-
-	private final Map _attributes;
-
-	/**
-	 * @param uri
-	 * @param tagname
-	 * @param suggestedPrefix
-	 * @param attributes
-	 */
-	public NodeCreationFactory(String uri, String tagname,
-			String suggestedPrefix, Map attributes) {
-		_tagName = tagname;
-		_uri = uri;
-		_suggestedPrefix = suggestedPrefix;
-		_attributes = attributes;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.CreationFactory#getNewObject()
-	 */
-	public Object getNewObject() {
-		Document ownerdoc = getOwnerDocument();
-		if (ownerdoc == null)
-			return null;
-
-		Element ele = ownerdoc.createElement(_tagName);
-		if (ele instanceof IDOMNode) {
-			String prefix = getPrefix(_uri, ((IDOMDocument) ownerdoc)
-					.getModel(), _suggestedPrefix);
-			if (prefix != null) {
-				ele.setPrefix(prefix);
-			}
-		}
-		if (_attributes != null) {
-			for (Iterator iter = _attributes.keySet().iterator(); iter
-					.hasNext();) {
-				String key = (String) iter.next();
-				String value = (String) _attributes.get(key);
-				ele.setAttribute(key, value);
-			}
-		}
-		return ele;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.CreationFactory#getObjectType()
-	 */
-	public Object getObjectType() {
-		return _tagName;
-	}
-
-	/**
-	 * XXX: need some better way for owner document. Maybe pass in from
-	 * constructor
-	 * 
-	 * @return the owner document
-	 */
-	protected Document getOwnerDocument() {
-		IWorkbenchWindow active = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (active == null)
-			return null;
-		IWorkbenchPage page = active.getActivePage();
-		if (page == null)
-			return null;
-		IEditorPart editor = page.getActiveEditor();
-		if (editor instanceof HTMLEditor) {
-			return ((HTMLEditor) editor).getDOMDocument();
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.requests.NodeCreationFactory#getPrefix(int)
-	 */
-	private String getPrefix(String uri, IDOMModel model, String suggested) {
-		if (ITLDConstants.URI_HTML.equals(uri)
-				|| ITLDConstants.URI_JSP.equals(uri))
-			return null;
-
-		// now handles custom tag lib
-		return JSPUtil.getOrCreatePrefix(model, uri, suggested);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/PageDesignerRequestConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/PageDesignerRequestConstants.java
deleted file mode 100644
index cd5d105..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/PageDesignerRequestConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.requests;
-
-/**
- * Page designer constants
- *
- */
-public final class PageDesignerRequestConstants 
-{
-    /**
-     * sent to an edit part to request a selection drag tracker
-     */
-    public final static String REQ_SELECTION_TRACKER = "selection.tracker.request"; //$NON-NLS-1$
-    
-    private PageDesignerRequestConstants()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java
deleted file mode 100644
index 97a1c1a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnHandle extends TableSideItemHandle {
-
-	/**
-	 * @param owner
-	 * @param index
-	 */
-	public ColumnHandle(GraphicalEditPart owner, int index) {
-		super(owner, false, index);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnResizeHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnResizeHandle.java
deleted file mode 100644
index e6446a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnResizeHandle.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnResizeHandle extends TableSideResizeHandle {
-	// 0 means before first column
-	int _columnIndex;
-
-	/**
-	 * @param owner 
-	 * @param index 
-	 * 
-	 */
-	public ColumnResizeHandle(GraphicalEditPart owner, int index) {
-		super(owner, false, index);
-		_columnIndex = index;
-	}
-
-	/**
-	 * @return the column index
-	 */
-	public int getColumnIndex() {
-		return _columnIndex;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterAction.java
deleted file mode 100644
index 02a8e5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param editPart 
-	 * @param isHeader 
-	 */
-	public DeleteHeaderFooterAction(String text, EditPart editPart,
-			boolean isHeader) {
-		super(text);
-		DeleteHeaderFooterRequest req = new DeleteHeaderFooterRequest(text,
-				isHeader);
-		this._command = editPart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterRequest.java
deleted file mode 100644
index ebd315d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterRequest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterRequest extends Request {
-	private boolean _isHeader;
-
-	/**
-	 * @param type
-	 * @param isHeader
-	 */
-	public DeleteHeaderFooterRequest(String type, boolean isHeader) {
-		super(type);
-		this._isHeader = isHeader;
-	}
-
-	/**
-	 * @return Returns the _isHeader.
-	 */
-	public boolean isHeader() {
-		return _isHeader;
-	}
-
-	/**
-	 * @param header
-	 *            The _isHeader to set.
-	 */
-	public void setHeader(boolean header) {
-		_isHeader = header;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteRowColumnAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteRowColumnAction.java
deleted file mode 100644
index 0f68bd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteRowColumnAction.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteRowColumnAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param tablePart 
-	 * @param index 
-	 * @param isrow 
-	 */
-	public DeleteRowColumnAction(String text, EditPart tablePart, int index,
-			boolean isrow) {
-		super(text);
-
-		TableRowColumnDeleteRequest req = new TableRowColumnDeleteRequest(
-				isrow, index);
-		this._command = tablePart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/EmptyLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/EmptyLocator.java
deleted file mode 100644
index d69fc73..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/EmptyLocator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class EmptyLocator implements Locator {
-	/**
-	 * 
-	 */
-	public EmptyLocator() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Locator#relocate(org.eclipse.draw2d.IFigure)
-	 */
-	public void relocate(IFigure target) {
-        // do nothing; this is a noop locator
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterAction.java
deleted file mode 100644
index 4009220..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param editPart 
-	 * @param isHeader 
-	 */
-	public InsertHeaderFooterAction(String text, EditPart editPart,
-			boolean isHeader) {
-		super(text);
-
-		InsertHeaderFooterRequest req = new InsertHeaderFooterRequest(text,
-				isHeader);
-		this._command = editPart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterRequest.java
deleted file mode 100644
index 845d48a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterRequest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterRequest extends Request {
-	private boolean _isHeader;
-
-	/**
-	 * @param type
-	 * @param isHeader
-	 */
-	public InsertHeaderFooterRequest(String type, boolean isHeader) {
-		super(type);
-		this._isHeader = isHeader;
-	}
-
-	/**
-	 * @return Returns the _isHeader.
-	 */
-	public boolean isHeader() {
-		return _isHeader;
-	}
-
-	/**
-	 * @param header
-	 *            The _isHeader to set.
-	 */
-	public void setHeader(boolean header) {
-		_isHeader = header;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertRowColumnAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertRowColumnAction.java
deleted file mode 100644
index 6eedf0a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertRowColumnAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertRowColumnAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param tablePart 
-	 * @param index 
-	 * @param isrow 
-	 * @param isbefore 
-	 */
-	public InsertRowColumnAction(String text, EditPart tablePart, int index,
-			boolean isrow, boolean isbefore) {
-		super(text);
-
-		TableInsertRequest req = new TableInsertRequest(isrow, index, isbefore);
-		this._command = tablePart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/MarqueeRectangleFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/MarqueeRectangleFigure.java
deleted file mode 100644
index c65e771..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/MarqueeRectangleFigure.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * This class is copied from MarqueeSelectionTool, since it is private there.
- * 
- * @author mengbo
- * @version 1.5
- */
-class MarqueeRectangleFigure extends Figure {
-
-	private int offset = 0;
-
-	private boolean schedulePaint = true;
-
-	private static final int DELAY = 110; // animation delay in millisecond
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintFigure(Graphics graphics) {
-		Rectangle bounds1 = getBounds().getCopy();
-		graphics.translate(getLocation());
-
-		graphics.setXORMode(true);
-		graphics.setForegroundColor(ColorConstants.white);
-		graphics.setBackgroundColor(ColorConstants.black);
-
-		graphics.setLineStyle(Graphics.LINE_DOT);
-
-		int[] points = new int[6];
-
-		points[0] = 0 + offset;
-		points[1] = 0;
-		points[2] = bounds1.width - 1;
-		points[3] = 0;
-		points[4] = bounds1.width - 1;
-		points[5] = bounds1.height - 1;
-
-		graphics.drawPolyline(points);
-
-		points[0] = 0;
-		points[1] = 0 + offset;
-		points[2] = 0;
-		points[3] = bounds1.height - 1;
-		points[4] = bounds1.width - 1;
-		points[5] = bounds1.height - 1;
-
-		graphics.drawPolyline(points);
-
-		graphics.translate(getLocation().getNegated());
-
-		if (schedulePaint) {
-			Display.getCurrent().timerExec(DELAY, new Runnable() {
-				public void run() {
-					offset++;
-					if (offset > 5)
-						offset = 0;
-
-					schedulePaint = true;
-					repaint();
-				}
-			});
-		}
-
-		schedulePaint = false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowHandle.java
deleted file mode 100644
index 5ebd6d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowHandle.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RowHandle extends TableSideItemHandle {
-
-	/**
-	 * @param owner
-	 * @param index
-	 */
-	public RowHandle(GraphicalEditPart owner, int index) {
-		super(owner, true, index);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowResizeHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowResizeHandle.java
deleted file mode 100644
index 8efbcc3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowResizeHandle.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RowResizeHandle extends TableSideResizeHandle {
-	// 0 means before first row
-	int _rowIndex;
-
-	/**
-	 * @param owner 
-	 * @param index 
-	 */
-	public RowResizeHandle(GraphicalEditPart owner, int index) {
-		super(owner, true, index);
-
-		_rowIndex = index;
-	}
-
-	/**
-	 * @return the row index
-	 */
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandle.java
deleted file mode 100644
index 466159b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandle.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableColumnHandle extends TableSideHandle {
-	/**
-	 * @param tableHost
-	 */
-	public TableColumnHandle(GraphicalEditPart tableHost) {
-		super(tableHost, new TableColumnHandleLocator(tableHost));
-	}
-
-	/**
-	 * 
-	 * 
-	 */
-	public void setupColumns() {
-		ITableEditAdapter tableAdapter = getTableEditAdapter();
-		if (tableAdapter == null) {
-			return;
-		}
-		int numColumns = tableAdapter.getColumnCount();
-		for (int i = 0; i < numColumns; i++) {
-			ColumnHandle columnHandle = createColumnHandle(i);
-			add(columnHandle);
-			ColumnResizeHandle columnResizeHandle = createColumnResizeHandle(i);
-			add(columnResizeHandle);
-		}
-		ColumnResizeHandle lastResize = createColumnResizeHandle(numColumns);
-		add(lastResize);
-	}
-
-	/**
-	 * @param numColumns
-	 * @return
-	 */
-	private ColumnResizeHandle createColumnResizeHandle(int numColumns) {
-		return new ColumnResizeHandle(getOwner(), numColumns);
-	}
-
-	/**
-	 * @param i
-	 * @return
-	 */
-	private ColumnHandle createColumnHandle(int i) {
-		return new ColumnHandle(getOwner(), i);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandleLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandleLocator.java
deleted file mode 100644
index 37bb7e2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandleLocator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.HandleBounds;
-import org.eclipse.gef.handles.MoveHandleLocator;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableColumnHandleLocator extends MoveHandleLocator {
-
-	GraphicalEditPart _tablePart;
-
-	/**
-	 * @param tablePart 
-	 */
-	public TableColumnHandleLocator(GraphicalEditPart tablePart) {
-		super(tablePart.getFigure());
-		_tablePart = tablePart;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.MoveHandleLocator#relocate(org.eclipse.draw2d.IFigure)
-	 */
-	public void relocate(IFigure target) {
-		Rectangle bounds;
-		if (getReference() instanceof HandleBounds) {
-			bounds = ((HandleBounds) getReference()).getHandleBounds();
-		} else {
-			bounds = getReference().getBounds();
-		}
-		Insets referenceInsets = getReference().getInsets();
-
-		Rectangle r = new Rectangle(bounds.x + referenceInsets.left, bounds.y
-				+ bounds.height, bounds.width - referenceInsets.getWidth(),
-				TableEditConst.HEIGHT);
-
-		getReference().translateToAbsolute(r);
-		target.translateToRelative(r);
-
-		target.setBounds(r);
-		relocateChildren(target, getReference());
-	}
-
-	/**
-	 * @param target
-	 * @param reference
-	 */
-	private void relocateChildren(IFigure target, IFigure reference) {
-		// As user may removed columns/rows, so need to recalculate columns.
-		TableColumnHandle tableColumnHandle = (TableColumnHandle) target;
-		tableColumnHandle.removeAll();
-		tableColumnHandle.setupColumns();
-
-		// ---------------------------
-		List children = target.getChildren();
-
-		ITableEditAdapter tableAdapter = TableEditHelper
-				.getTableEditAdapter(this._tablePart);
-		if (tableAdapter == null) {
-			// XXX: what should we do if we found it is no longer table?
-			// here just skip
-			return;
-		}
-		for (int i = 0, size = children.size(); i < size; i++) {
-			Rectangle rect = null;
-			IFigure child = (IFigure) children.get(i);
-			if (child instanceof ColumnHandle) {
-				ColumnHandle columnHandle = (ColumnHandle) child;
-				int columnIndex = columnHandle.getIndex();
-				rect = new Rectangle(tableAdapter.getColumnStart(columnIndex),
-						0, tableAdapter.getColumnWidth(columnIndex),
-						TableEditConst.HEIGHT);
-			} else if (child instanceof ColumnResizeHandle) {
-				ColumnResizeHandle resizeHandle = (ColumnResizeHandle) child;
-				int columnIndex = resizeHandle.getColumnIndex();
-				rect = new Rectangle(tableAdapter
-						.getColumnResizeStart(columnIndex), 0, tableAdapter
-						.getColumnResizeWidth(), TableEditConst.HEIGHT);
-			} else {
-				// should not happen.
-			}
-			if (rect != null) {
-				child.setBounds(rect);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditAdapter.java
deleted file mode 100644
index 6689636..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditAdapter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableEditAdapter implements ITableEditAdapter {
-	CSSTableLayout2 _tableLayout;
-
-	/**
-	 * @param layout2
-	 */
-	public TableEditAdapter(CSSTableLayout2 layout2) {
-		this._tableLayout = layout2;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getColumnCount()
-	 */
-	public int getColumnCount() {
-		return _tableLayout.getColumnWidths().length;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowCount()
-	 */
-	public int getRowCount() {
-		return _tableLayout.getRowHeights().length;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#insertColumn(int)
-	 */
-	public void insertColumn(int atPosition) {
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#insertRow(int)
-	 */
-	public void insertRow(int rowPosition) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getResizeStart(int)
-	 */
-	public int getColumnResizeStart(int columnIndex) {
-		int w = 0;
-		int[] columnWidths = _tableLayout.getColumnWidths();
-		for (int i = 0; i < columnIndex; i++) {
-			w += columnWidths[i];
-		}
-		w += columnIndex * _tableLayout.getHSpacing();
-		return w;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getResizeWidth()
-	 */
-	public int getColumnResizeWidth() {
-		return _tableLayout.getHSpacing();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getColumnStart(int)
-	 */
-	public int getColumnStart(int columnIndex) {
-		return getColumnResizeStart(columnIndex) + _tableLayout.getHSpacing();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getColumnWidth(int)
-	 */
-	public int getColumnWidth(int columnIndex) {
-		return _tableLayout.getColumnWidths()[columnIndex];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowStart(int)
-	 */
-	public int getRowStart(int rowIndex) {
-		int start = getRowResizeStart(rowIndex) + _tableLayout.getVSpacing();
-		if (_tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(_tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			start += _tableLayout.getCaptionSize().height;
-		}
-		return start;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowHeight(int)
-	 */
-	public int getRowHeight(int rowIndex) {
-		return _tableLayout.getRowHeights()[rowIndex];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowResizeStart(int)
-	 */
-	public int getRowResizeStart(int rowIndex) {
-		int w = 0;
-		int[] rowHeights = _tableLayout.getRowHeights();
-		for (int i = 0; i < rowIndex; i++) {
-			w += rowHeights[i];
-		}
-		w += rowIndex * _tableLayout.getHSpacing();
-		return w;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowResizeWidth()
-	 */
-	public int getRowResizeWidth() {
-		return _tableLayout.getVSpacing();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditConst.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditConst.java
deleted file mode 100644
index 40b1dee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditConst.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ interface TableEditConst {
-	/**
-	 * height constant
-	 */
-	public static final int HEIGHT = 10;
-
-	/**
-	 * width constant
-	 */
-	public static final int WIDTH = 10;
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditHelper.java
deleted file mode 100644
index 5614d81..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditHelper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableEditHelper {
-	/**
-	 * This method will return null if the editpart is not a table.
-	 * 
-	 * @param tablePart
-	 * @return the adapter
-	 */
-	public static ITableEditAdapter getTableEditAdapter(
-			GraphicalEditPart tablePart) {
-		IFigure figure = tablePart.getFigure();
-		LayoutManager layout = figure.getLayoutManager();
-		if (layout instanceof CSSTableLayout2) {
-			return new TableEditAdapter((CSSTableLayout2) layout);
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableHandleKit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableHandleKit.java
deleted file mode 100644
index c8082e5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableHandleKit.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableHandleKit {
-
-	/**
-	 * @param tableHost
-	 * @param handles
-	 */
-	public static void addHandles(GraphicalEditPart tableHost, List handles) {
-		addColumnHandles(tableHost, handles);
-		addRowHandles(tableHost, handles);
-	}
-
-	/**
-	 * @param tableHost
-	 * @param handles
-	 */
-	private static void addColumnHandles(GraphicalEditPart tableHost,
-			List handles) {
-		TableColumnHandle handle = new TableColumnHandle(tableHost);
-		handles.add(handle);
-
-	}
-
-	/**
-	 * @param tableHost
-	 * @param handles
-	 */
-	private static void addRowHandles(GraphicalEditPart tableHost, List handles) {
-		TableRowHandle handle = new TableRowHandle(tableHost);
-		handles.add(handle);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableInsertRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableInsertRequest.java
deleted file mode 100644
index 7ad13d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableInsertRequest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertRequest extends TableRowColumnRequest {
-	/**
-	 * 
-	 */
-	private static final String TABLE_INSERT_REQUEST = "Table Insert"; //$NON-NLS-1$
-
-	boolean _before;
-
-	/**
-	 * @param row 
-	 * @param index 
-	 * @param before 
-	 * 
-	 */
-	public TableInsertRequest(boolean row, int index, boolean before) {
-		super(TABLE_INSERT_REQUEST, row, index);
-		this._before = before;
-	}
-
-	/**
-	 * @return true if is before
-	 */
-	public boolean isBefore() {
-		return _before;
-	}
-
-	/**
-	 * @param before
-	 */
-	public void setBefore(boolean before) {
-		this._before = before;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizableEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizableEditPolicy.java
deleted file mode 100644
index 87619c2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizableEditPolicy.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizableEditPolicy extends ElementResizableEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
-	 */
-	protected List createSelectionHandles() {
-		List list = super.createSelectionHandles();
-
-		// CR402770-1. Add a check whether it is table. If is not, will not
-		// create the handles. Thus, the handles could assume
-		// TableEditHelper.getTableEditAdatper()
-		// will always return non null.
-		ITableEditAdapter adapter = TableEditHelper
-				.getTableEditAdapter((GraphicalEditPart) getHost());
-		if (adapter != null) {
-			TableHandleKit.addHandles((GraphicalEditPart) getHost(), list);
-		}
-		return list;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizeRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizeRequest.java
deleted file mode 100644
index f776ba8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizeRequest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizeRequest extends Request {
-	private static final String TABLE_RESIZE_REQ = "Table Resize"; //$NON-NLS-1$
-
-	private boolean _row;
-
-	private int _index;
-
-	private int _delta;
-
-	/**
-	 * @param isrow 
-	 * @param index 
-	 */
-	public TableResizeRequest(boolean isrow, int index) {
-		super(TABLE_RESIZE_REQ);
-		this._row = isrow;
-		this._index = index;
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-
-	/**
-	 * @param index
-	 */
-	public void setIndex(int index) {
-		this._index = index;
-	}
-
-	/**
-	 * @return true if is row
-	 */
-	public boolean isRow() {
-		return _row;
-	}
-
-	/**
-	 * @param row
-	 */
-	public void setRow(boolean row) {
-		this._row = row;
-	}
-
-	/**
-	 * @return the delta
-	 */
-	public int getDelta() {
-		return _delta;
-	}
-
-	/**
-	 * @param delta
-	 */
-	public void setDelta(int delta) {
-		this._delta = delta;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnDeleteRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnDeleteRequest.java
deleted file mode 100644
index 8688e87..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnDeleteRequest.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowColumnDeleteRequest extends TableRowColumnRequest {
-	private static final String TABLE_ROWCOLUMN_DELETE = "Table RowColumn Delete"; //$NON-NLS-1$
-
-	/**
-	 * @param row
-	 * @param index
-	 */
-	public TableRowColumnDeleteRequest(boolean row, int index) {
-		super(TABLE_ROWCOLUMN_DELETE, row, index);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnRequest.java
deleted file mode 100644
index b7bc8cd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnRequest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowColumnRequest extends Request {
-	int _index;
-
-	boolean _row;
-
-	/**
-	 * @param type
-	 * @param row 
-	 * @param index 
-	 */
-	public TableRowColumnRequest(Object type, boolean row, int index) {
-		super(type);
-		this._row = row;
-		this._index = index;
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-
-	/**
-	 * @param index
-	 */
-	public void setIndex(int index) {
-		this._index = index;
-	}
-
-	/**
-	 * @return true if is row
-	 */
-	public boolean isRow() {
-		return _row;
-	}
-
-	/**
-	 * @param row
-	 */
-	public void setRow(boolean row) {
-		this._row = row;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandle.java
deleted file mode 100644
index daca6e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandle.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowHandle extends TableSideHandle {
-	/**
-	 * @param tableHost
-	 */
-	public TableRowHandle(GraphicalEditPart tableHost) {
-		super(tableHost, new TableRowHandleLocator(tableHost));
-		// setupRows();
-	}
-
-	/**
-	 * 
-	 * 
-	 */
-	public void setupRows() {
-		ITableEditAdapter tableAdapter = getTableEditAdapter();
-		if (tableAdapter == null) {
-			return;
-		}
-		int numRows = tableAdapter.getRowCount();
-		for (int i = 0; i < numRows; i++) {
-			RowHandle rowHandle = createRowHandle(i);
-			add(rowHandle);
-			RowResizeHandle rowResizeHandle = createRowResizeHandle(i);
-			add(rowResizeHandle);
-		}
-		RowResizeHandle lastResize = createRowResizeHandle(numRows);
-		add(lastResize);
-	}
-
-	/**
-	 * @param rowIndex
-	 * @return
-	 */
-	private RowResizeHandle createRowResizeHandle(int rowIndex) {
-		return new RowResizeHandle(getOwner(), rowIndex);
-	}
-
-	/**
-	 * @param rowIndex
-	 * @return
-	 */
-	private RowHandle createRowHandle(int rowIndex) {
-		return new RowHandle(getOwner(), rowIndex);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandleLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandleLocator.java
deleted file mode 100644
index 54ed350..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandleLocator.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.HandleBounds;
-import org.eclipse.gef.handles.MoveHandleLocator;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowHandleLocator extends MoveHandleLocator {
-
-	GraphicalEditPart _tablePart;
-
-	/**
-	 * @param tablePart
-	 */
-	public TableRowHandleLocator(GraphicalEditPart tablePart) {
-		super(tablePart.getFigure());
-		_tablePart = tablePart;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.MoveHandleLocator#relocate(org.eclipse.draw2d.IFigure)
-	 */
-	public void relocate(IFigure target) {
-		Rectangle bounds;
-		if (getReference() instanceof HandleBounds) {
-			bounds = ((HandleBounds) getReference()).getHandleBounds();
-		} else {
-			bounds = getReference().getBounds();
-		}
-		// bounds = new PrecisionRectangle(bounds.getResized(-1, -1));
-		Insets referenceInsets = getReference().getInsets();
-
-		Rectangle r = new Rectangle(bounds.x + bounds.width, bounds.y
-				+ referenceInsets.top, TableEditConst.WIDTH, bounds.height
-				- referenceInsets.getHeight());
-		bounds = new PrecisionRectangle(r);
-
-		getReference().translateToAbsolute(bounds);
-		target.translateToRelative(bounds);
-
-		target.setBounds(bounds);
-		relocateChildren(target, getReference());
-	}
-
-	/**
-	 * @param target
-	 * @param reference
-	 */
-	private void relocateChildren(IFigure target, IFigure reference) {
-		// As user may removed columns/rows, so need to recalculate columns.
-		TableRowHandle tableRowHandle = (TableRowHandle) target;
-		tableRowHandle.removeAll();
-		tableRowHandle.setupRows();
-		List children = target.getChildren();
-
-		ITableEditAdapter tableAdapter = TableEditHelper
-				.getTableEditAdapter(this._tablePart);
-		if (tableAdapter == null) {
-			return;
-		}
-		for (int i = 0, size = children.size(); i < size; i++) {
-			Rectangle rect = null;
-			IFigure child = (IFigure) children.get(i);
-			if (child instanceof RowHandle) {
-				RowHandle rowHandle = (RowHandle) child;
-				int rowIndex = rowHandle.getIndex();
-				rect = new Rectangle(0, tableAdapter.getRowStart(rowIndex),
-						TableEditConst.WIDTH, tableAdapter
-								.getRowHeight(rowIndex));
-			} else if (child instanceof RowResizeHandle) {
-				RowResizeHandle resizeHandle = (RowResizeHandle) child;
-				int rowIndex = resizeHandle.getRowIndex();
-				rect = new Rectangle(0, tableAdapter
-						.getRowResizeStart(rowIndex), TableEditConst.WIDTH,
-						tableAdapter.getRowResizeWidth());
-			} else {
-				// should not happen.
-			}
-			if (rect != null) {
-				child.setBounds(rect);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideHandle.java
deleted file mode 100644
index 753ad40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideHandle.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.Locator;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.AbstractHandle;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableSideHandle extends AbstractHandle {
-	/**
-	 * @param owner
-	 * @param loc
-	 */
-	public TableSideHandle(GraphicalEditPart owner, Locator loc) {
-		super(owner, loc);
-		// TODO Auto-generated constructor stub
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/**
-	 * @return the edit part
-	 */
-	public GraphicalEditPart getTableEditPart() {
-		return this.getOwner();
-	}
-
-	/**
-	 * @return the adapter
-	 */
-	public ITableEditAdapter getTableEditAdapter() {
-		return TableEditHelper.getTableEditAdapter(getOwner());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemDragTracker.java
deleted file mode 100644
index efedef5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemDragTracker.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-
-/**
- * This is the tracker for the TableSideItem. It will be responsible to track
- * the right mouse down event and popup a menu.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class TableSideItemDragTracker extends DragEditPartsTracker {
-    // TODO: dead?
-    //	private boolean _isRow;
-//
-//	private int _index;
-
-	/**
-	 * 
-	 * @param sourceEditPart
-	 * @param isrow
-	 * @param index
-	 */
-	public TableSideItemDragTracker(EditPart sourceEditPart, boolean isrow,
-			int index) {
-		super(sourceEditPart);
-        // TODO: dead?
-//		this._isRow = isrow;
-//		this._index = index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#handleButtonUp(int)
-	 */
-	protected boolean handleButtonUp(int button) {
-		boolean result = super.handleButtonUp(button);
-		//
-		// if (button == 3)
-		// {
-		// MenuManager m = new MenuManager();
-		// if (_isRow)
-		// {
-		// m.add(new InsertRowColumnAction("Insert row before",
-		// getSourceEditPart(), _index, _isRow, true));
-		// m.add(new InsertRowColumnAction("Insert row after",
-		// getSourceEditPart(), _index, _isRow, false));
-		// m.add(new DeleteRowColumnAction("Delete row", getSourceEditPart(),
-		// _index, _isRow));
-		// }
-		// else
-		// {
-		// m.add(new InsertRowColumnAction("Insert column before",
-		// getSourceEditPart(), _index, _isRow, true));
-		// m.add(new InsertRowColumnAction("Insert column after",
-		// getSourceEditPart(), _index, _isRow, false));
-		// m.add(new DeleteRowColumnAction("Delete column", getSourceEditPart(),
-		// _index, _isRow));
-		// }
-		// m.createContextMenu(this.getCurrentViewer().getControl()).setVisible(true);
-		// }
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemHandle.java
deleted file mode 100644
index 9b833ab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemHandle.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.AbstractHandle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class TableSideItemHandle extends AbstractHandle {
-	private boolean _isRow;
-
-	private int _index;
-
-	/**
-	 * @param owner 
-	 * @param isRow 
-	 * @param index 
-	 * 
-	 */
-	public TableSideItemHandle(GraphicalEditPart owner, boolean isRow, int index) {
-		super(owner, new EmptyLocator());
-		this._isRow = isRow;
-		this._index = index;
-		initialize();
-	}
-
-	/**
-	 * 
-	 */
-	private void initialize() {
-		this.setOpaque(false);
-		LineBorder border1 = new LineBorder(ColorConstants.green, 1);
-		this.setBorder(border1);
-		this.setCursor(Cursors.ARROW);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintFigure(Graphics graphics) {
-		graphics.setXORMode(true);
-		graphics.setBackgroundColor(ColorConstants.darkGray);
-		graphics.fillRectangle(getBounds());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		return new TableSideItemDragTracker(getOwner(), _isRow, _index);
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-
-	/**
-	 * @return true if is row
-	 */
-	public boolean isRow() {
-		return _isRow;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeDragTracker.java
deleted file mode 100644
index ca0771f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeDragTracker.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * This is the drag tracker for the small resize item on the
- * TableSideResizeHandle. used to adjust a single column/row size.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class TableSideResizeDragTracker extends DragEditPartsTracker {
-	private boolean _isrow;
-
-	private int _index;
-
-	private MarqueeRectangleFigure _marqueeFigure;
-
-	/**
-	 * @param sourceEditPart
-	 * @param isrow 
-	 * @param index 
-	 */
-	public TableSideResizeDragTracker(EditPart sourceEditPart, boolean isrow,
-			int index) {
-		super(sourceEditPart);
-		this._isrow = isrow;
-		this._index = index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#showSourceFeedback()
-	 */
-	protected void showSourceFeedback() {
-		Rectangle rect = getFeedbackRect();
-		if (rect != null) {
-			rect = rect.getCopy();
-			getMarqueeRectangleFigure().setBounds(rect);
-		} else {
-			// ignore.
-		}
-	}
-
-	private int calculateDelta() {
-		int delta;
-		// FIXME: TODO: XXX: when delta is too small (<0) to make previous
-		// column/row
-		// to have negative size, then we need adjust delta.
-		if (_isrow) {
-			delta = getLocation().y - getStartLocation().y;
-		} else {
-			delta = getLocation().x - getStartLocation().x;
-		}
-		return delta;
-	}
-
-	/**
-	 * @return null if this is not a table.
-	 */
-	private Rectangle getFeedbackRect() {
-		ITableEditAdapter adapter = getTableEditAdapter();
-		if (adapter == null) {
-			return null;
-		}
-
-		IFigure figure = ((GraphicalEditPart) this.getSourceEditPart())
-				.getFigure();
-		Rectangle bounds = figure.getBounds();
-		Insets insets = figure.getInsets();
-		Rectangle rect;
-		if (_isrow) {
-			int delta = calculateDelta();
-			rect = new Rectangle(0, adapter.getRowResizeStart(_index) + delta,
-					bounds.width - insets.getWidth(), adapter
-							.getRowResizeWidth());
-		} else {
-			int delta = calculateDelta();
-			rect = new Rectangle(adapter.getColumnResizeStart(_index) + delta,
-					0, adapter.getColumnResizeWidth(), bounds.height
-							- insets.getHeight());
-		}
-		rect.translate(bounds.x + insets.left, bounds.y + insets.top);
-
-		figure.translateToAbsolute(rect);
-		getMarqueeRectangleFigure().translateToRelative(rect);
-		return rect;
-	}
-
-	/**
-	 * 
-	 * @return null if this is not a table.
-	 */
-	private ITableEditAdapter getTableEditAdapter() {
-		return TableEditHelper.getTableEditAdapter((GraphicalEditPart) this
-				.getSourceEditPart());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#eraseSourceFeedback()
-	 */
-	protected void eraseSourceFeedback() {
-		super.eraseSourceFeedback();
-		if (_marqueeFigure != null) {
-			removeFeedback(_marqueeFigure);
-			_marqueeFigure = null;
-		}
-	}
-
-	private MarqueeRectangleFigure getMarqueeRectangleFigure() {
-		if (this._marqueeFigure == null) {
-			this._marqueeFigure = new MarqueeRectangleFigure();
-			addFeedback(this._marqueeFigure);
-		}
-		return this._marqueeFigure;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		return new TableResizeRequest(this._isrow, this._index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		TableResizeRequest req = (TableResizeRequest) getTargetRequest();
-		req.setDelta(calculateDelta());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectEditPartTracker#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		lockTargetEditPart(getSourceEditPart());
-		return super.handleButtonDown(button);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#getCommand()
-	 */
-	protected Command getCommand() {
-		return getTargetEditPart().getCommand(getTargetRequest());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeHandle.java
deleted file mode 100644
index bfe6b22..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeHandle.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.AbstractHandle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableSideResizeHandle extends AbstractHandle {
-	private boolean _isRow;
-
-	private int _index;
-
-	/**
-	 * @param owner 
-	 * @param isrow 
-	 * @param index 
-	 * 
-	 */
-	public TableSideResizeHandle(GraphicalEditPart owner, boolean isrow,
-			int index) {
-		super(owner, new EmptyLocator());
-		this._isRow = isrow;
-		this._index = index;
-
-		this.setCursor(isrow ? Cursors.SIZEN : Cursors.SIZEE);
-		// this.setBackgroundColor(ColorConstants.green);
-		this.setOpaque(false);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		return new TableSideResizeDragTracker(getOwner(), _isRow, _index);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ExposeHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ExposeHelper.java
deleted file mode 100644
index 6828db1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ExposeHelper.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import org.eclipse.draw2d.FigureCanvas;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.editpolicies.AbstractEditPolicy;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-
-/**
- * This helper class expose an rectangle in design view, currentlly it is used
- * to help expose caret.
- * 
- * @author mengbo
- */
-public class ExposeHelper {
-	private static final int DEFAULT_OFFSET = 100;
-
-	private static final int SCROLL_OFFSET = 8;
-
-	IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param viewer 
-	 */
-	public ExposeHelper(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-	}
-
-	/**
-	 * Expose rectangle. (non-Javadoc)
-	 * @param rect 
-	 * 
-	 * @see org.eclipse.gef.ExposeHelper#exposeDescendant(org.eclipse.gef.EditPart)
-	 */
-	public void exposeArea(Rectangle rect) {
-		if (_viewer == null) {
-			return;
-		}
-		FigureCanvas canvas = (FigureCanvas) _viewer.getControl();
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return;
-		}
-		Rectangle exposeRegion = rect.getCopy();
-		Rectangle portBounds = port.getBounds().getCopy();
-		Point viewLocation = port.getViewLocation();
-		Dimension diff = calculateDiff(portBounds, exposeRegion);
-		if (diff != null) {
-			viewLocation.x -= diff.width;
-			viewLocation.y -= diff.height;
-			canvas.scrollSmoothTo(viewLocation.x, viewLocation.y);
-		}
-	}
-
-	private void exposeVertical(int offset) {
-		if (_viewer == null) {
-			return;
-		}
-		FigureCanvas canvas = (FigureCanvas) _viewer.getControl();
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return;
-		}
-		Point viewLocation = port.getViewLocation();
-		viewLocation.y += offset;
-		canvas.scrollSmoothTo(viewLocation.x, viewLocation.y);
-	}
-
-	private void exposeHorizontal(int offset) {
-		if (_viewer == null) {
-			return;
-		}
-		FigureCanvas canvas = (FigureCanvas) _viewer.getControl();
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return;
-		}
-		Point viewLocation = port.getViewLocation();
-		viewLocation.x += offset;
-		canvas.scrollSmoothTo(viewLocation.x, viewLocation.y);
-	}
-
-	private int calculateX(Rectangle portBounds, Rectangle caretRect) {
-		int result = 0;
-		if (portBounds.x > caretRect.getRight().x) {
-			result = portBounds.getLeft().getDifference(caretRect.getRight()).width;
-			if (portBounds.width >= caretRect.width) {
-				result = portBounds.getLeft()
-						.getDifference(caretRect.getLeft()).width;
-			}
-		} else if (portBounds.getRight().x < caretRect.getLeft().x) {
-			result = portBounds.getRight().getDifference(caretRect.getLeft()).width;
-			if (portBounds.width >= caretRect.width) {
-				result = portBounds.getRight().getDifference(
-						caretRect.getRight()).width;
-			}
-		}
-		return result;
-	}
-
-	private int calculateY(Rectangle portBounds, Rectangle caretRect) {
-		int result = 0;
-		if (portBounds.y > caretRect.getBottom().y) {
-			result = portBounds.getTop().getDifference(caretRect.getBottom()).height;
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getTop().getDifference(caretRect.getTop()).height;
-			}
-		} else if (portBounds.getBottom().y < caretRect.getTop().y) {
-			result = portBounds.getBottom().getDifference(caretRect.getTop()).height;
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getBottom().getDifference(
-						caretRect.getBottom()).height;
-			}
-		} else if (portBounds.getBottom().y < caretRect.getBottom().y) {
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getBottom().getDifference(
-						caretRect.getBottom()).height;
-			}
-		} else if (portBounds.getTop().y > caretRect.getTop().y) {
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getTop().getDifference(caretRect.getTop()).height;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Calculate caretPoint's offset to posrBounds at both x coordinate and y
-	 * coordinate.
-	 * 
-	 * @param portBounds
-	 * @param exposeRegion
-	 * @param canvas
-	 * @param caretPoint
-	 */
-	private Dimension calculateDiff(Rectangle portBounds, Rectangle caretRect) {
-		Dimension diff = new Dimension(0, 0);
-		diff.width = calculateX(portBounds, caretRect);
-		diff.height = calculateY(portBounds, caretRect);
-		return diff;
-	}
-
-	// /**
-	// * Calculate caretPoint's offset to posrBounds at both x coordinate and y
-	// coordinate.
-	// *
-	// * @param portBounds
-	// * @param exposeRegion
-	// * @param canvas
-	// * @param caretPoint
-	// */
-	// private Dimension calculateDiff(Rectangle portBounds, Point caretPoint)
-	// {
-	// int position = portBounds.getPosition(caretPoint);
-	// Dimension diff = null;
-	// Point containerPos = null;
-	// switch (position)
-	// {
-	// case PositionConstants.EAST:
-	// containerPos = new Point(portBounds.getRight().x, caretPoint.y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// case PositionConstants.NORTH_EAST:
-	// diff = portBounds.getTopRight().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.WEST:
-	// containerPos = new Point(portBounds.getLeft().x, caretPoint.y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// case PositionConstants.NORTH_WEST:
-	// diff = portBounds.getTopLeft().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.SOUTH_WEST:
-	// diff = portBounds.getBottomLeft().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.SOUTH_EAST:
-	// diff = portBounds.getBottomRight().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.NORTH:
-	// containerPos = new Point(caretPoint.x, portBounds.getTop().y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// case PositionConstants.SOUTH:
-	// containerPos = new Point(caretPoint.x, portBounds.getBottom().y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// }
-	// return diff;
-	// }
-	//
-	private static void expose(EditPart part, ScrollingGraphicalViewer viewer) {
-		if (part != null && part.getModel() instanceof Node) {
-			viewer.reveal(part);
-		}
-	}
-
-	private static void expose(Node element, ScrollingGraphicalViewer viewer) {
-		if (element instanceof INodeNotifier) {
-			EditPart editPart = (EditPart) ((INodeNotifier) element)
-					.getAdapterFor(EditPart.class);
-			expose(editPart, viewer);
-		}
-	}
-
-	/**
-	 * @param selection
-	 * @param viewer
-	 */
-	public static void expose(ISelection selection,
-			ScrollingGraphicalViewer viewer) {
-		if (selection instanceof IStructuredSelection) {
-			Object element = ((IStructuredSelection) selection)
-					.getFirstElement();
-			if (element instanceof Node) {
-				expose((Node) element, viewer);
-			} else if (element instanceof EditPart) {
-				expose((EditPart) element, viewer);
-			}
-		}
-	}
-
-	/**
-	 * @param p
-	 */
-	public void adjustVertical(Point p) {
-		int offset = 0;
-		if ((offset = getVerticalBoundsOffset(p, false)) < SCROLL_OFFSET) {
-			exposeVertical(SCROLL_OFFSET - offset);
-		} else if ((offset = getVerticalBoundsOffset(p, true)) < SCROLL_OFFSET) {
-			exposeVertical(offset - SCROLL_OFFSET);
-		}
-		if ((offset = getHorizontalBoundsOffset(p, true)) < SCROLL_OFFSET) {
-			exposeHorizontal(SCROLL_OFFSET - offset);
-		} else if ((offset = getHorizontalBoundsOffset(p, false)) < SCROLL_OFFSET) {
-			exposeHorizontal(offset - SCROLL_OFFSET);
-		}
-	}
-
-	/**
-	 * @return the location of the view port
-	 */
-	public Point getViewpostLocation() {
-		if (_viewer != null) {
-			Viewport port = _viewer.getViewport();
-
-			if (port != null) {
-				return port.getViewLocation();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param figure
-	 * @param p
-	 * @return the translated point
-	 */
-	public Point translateToViewport(IFigure figure, Point p) {
-		Point vp = getViewpostLocation();
-		return new Point(p.x - vp.x, p.y - vp.y);
-	}
-
-	private int getHorizontalBoundsOffset(Point p, boolean forward) {
-		if (_viewer == null) {
-			return DEFAULT_OFFSET;
-		}
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return DEFAULT_OFFSET;
-		}
-		if (forward) {
-			Rectangle portBounds = port.getBounds().getCopy();
-			return portBounds.getRight().x - p.x;
-		}
-        return p.x;
-	}
-
-	private int getVerticalBoundsOffset(Point p, boolean up) {
-		if (_viewer == null) {
-			return DEFAULT_OFFSET;
-		}
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return DEFAULT_OFFSET;
-		}
-		if (!up) {
-			Rectangle portBounds = port.getBounds().getCopy();
-			return portBounds.getBottom().y - p.y;
-		}
-        return p.y;
-	}
-
-	/**
-	 * @param rect
-	 * @param policy
-	 */
-	void exposeBorder(Rectangle rect, AbstractEditPolicy policy) {
-		Point p = rect.getTopLeft();
-		p = translateToViewport(((GraphicalEditPart) policy.getHost())
-				.getFigure(), p);
-		adjustVertical(p);
-		p = rect.getBottomRight();
-		p = translateToViewport(((GraphicalEditPart) policy.getHost())
-				.getFigure(), p);
-		adjustVertical(p);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ObjectModeDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ObjectModeDragTracker.java
deleted file mode 100644
index 15519bc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ObjectModeDragTracker.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * When user press right mouse to do selection, if the selected node is inside
- * current range selection, then don't change selection. This is for better
- * context menu support.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ObjectModeDragTracker extends DragEditPartsTracker {
-	/**
-	 * @param sourceEditPart
-	 */
-	public ObjectModeDragTracker(EditPart sourceEditPart) {
-		super(sourceEditPart);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectEditPartTracker#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		if (button == 3 && isInState(STATE_INITIAL)) {
-			EditPart sourcePart = this.getSourceEditPart();
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) sourcePart
-					.getViewer();
-			if (viewer != null && viewer.isInRangeMode()) {
-				DesignRange range = viewer.getRangeSelection();
-				if (range != null && range.isValid()) {
-					if (RangeUtil.intersect(range, sourcePart)) {
-						return true;
-					}
-				}
-			}
-		}
-		return super.handleButtonDown(button);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java
deleted file mode 100644
index 03e690e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import java.util.Collections;
-
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.requests.SelectionRequest;
-import org.eclipse.gef.tools.TargetingTool;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * @author mengbo
- */
-public class RangeDragTracker extends TargetingTool implements DragTracker {
-	/** Flag to indicate selection has been performed. */
-	private static final int FLAG_SELECTION_PERFORMED = TargetingTool.MAX_FLAG << 1;
-
-	private EditPart editpart;
-
-	/**
-	 * Constructs a new SelectEditPartTracker with the given edit part as the
-	 * source.
-	 * 
-	 * @param owner
-	 *            the source edit part
-	 */
-	public RangeDragTracker(EditPart owner) {
-		setSourceEditPart(owner);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#calculateCursor()
-	 */
-	protected Cursor calculateCursor() {
-        return Cursors.IBEAM;
-//		if (isInState(STATE_INITIAL))
-//        {
-//            return Cursors.IBEAM;
-//        }
-//        else if (isInState(STATE_DRAG | STATE_ACCESSIBLE_DRAG))
-//        {
-//			return getDefaultCursor();
-//		}
-//        return Cursors.IBEAM;
-//		return super.calculateCursor();
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getCommandName()
-	 */
-	protected String getCommandName() {
-		return "Range Drag Tracker";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getDebugName()
-	 */
-	protected String getDebugName() {
-		return "Range Drag Tracker";//$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the source edit part.
-	 * 
-	 * @return the source edit part
-	 */
-	protected EditPart getSourceEditPart() {
-		return editpart;
-	}
-
-	/**
-	 * Performs a conditional selection if needed (if right or left mouse button
-	 * have been pressed) and goes into the drag state. If any other button has
-	 * been pressed, the tool goes into the invalid state.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		if (button == 3 && isInState(STATE_INITIAL)) {
-			EditPart sourcePart = this.getSourceEditPart();
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) sourcePart
-					.getViewer();
-			if (viewer != null && viewer.isInRangeMode()) {
-				DesignRange range = viewer.getRangeSelection();
-				if (range != null && range.isValid()) {
-					if (RangeUtil.intersect(range, sourcePart)) {
-						return true;
-					}
-				}
-			}
-		}
-
-		if ((button == 1 || button == 3) && isInState(STATE_INITIAL)) {
-			peroformSelectionBegin();
-		}
-
-		if (button != 1) {
-			setState(STATE_INVALID);
-			if (button == 3)
-				setState(STATE_TERMINAL);
-			handleInvalidInput();
-		} else {
-			stateTransition(STATE_INITIAL, STATE_DRAG);
-		}
-		return true;
-	}
-
-	/**
-	 * If the
-	 * source is selected and there are no modifier keys pressed (i.e. the user
-	 * isn't selecting multiple edit parts or deselecting edit parts), sets the
-	 * direct edit flag so that when the mouse is released, a direct edit will
-	 * be performed.
-	 */
-	protected void peroformSelectionBegin() {
-		// if (getCurrentInput().isControlKeyDown())
-		// {
-		// // when control key is down, switch to object selection mode.
-		// getHTMLGraphicalViewer().ensureObjectSelectionMode();
-		// setFlag(FLAG_SELECTION_PERFORMED, true);
-		// EditPartViewer viewer = getCurrentViewer();
-		// List selectedObjects = viewer.getSelectedEditParts();
-		//
-		// if (selectedObjects.contains(getSourceEditPart()))
-		// viewer.deselect(getSourceEditPart());
-		// else
-		// viewer.appendSelection(getSourceEditPart());
-		// }
-		// else
-		if (getCurrentInput().isShiftKeyDown()) {
-			getHTMLGraphicalViewer().ensureRangeSelectionMode();
-			rangeSelection(true);
-		} else {
-			if (shouldStartRangeSelection()) {
-				rangeSelection(false);
-			} else {
-				getCurrentViewer().select(getSourceEditPart());
-			}
-		}
-	}
-
-	/**
-	 * If in the drag state, the tool selects the source edit part.  If the
-	 * edit part is newly selected and not completely visible,
-	 * {@link org.eclipse.gef.EditPartViewer#reveal(EditPart)}is called to show the selected
-	 * edit part.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonUp(int)
-	 */
-	protected boolean handleButtonUp(int button) {
-		if (isInState(STATE_DRAG)) {
-			// XXX: commented the following two line (lium)
-			// performSelection();
-			// if (button == 1 && getSourceEditPart().getSelected() !=
-			// EditPart.SELECTED_NONE)
-			// getCurrentViewer().reveal(getSourceEditPart());
-			setState(STATE_TERMINAL);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Calls {@link #performOpen()}if the double click was with mouse button 1.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDoubleClick(int)
-	 */
-	protected boolean handleDoubleClick(int button) {
-		if (button == 1) {
-			performOpen();
-		}
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragStarted()
-	 */
-	protected boolean handleDragStarted() {
-		return stateTransition(STATE_DRAG, STATE_DRAG_IN_PROGRESS);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragInProgress()
-	 */
-	protected boolean handleDragInProgress() {
-		if (getHTMLGraphicalViewer().isInRangeMode()) {
-			rangeSelection(true);
-			return true;
-		}
-        return super.handleDragInProgress();
-	}
-
-	/**
-	 * Returns <code>true</code> if selection has already occured.
-	 * 
-	 * @return <code>true</code> if selection has occured
-	 */
-	protected boolean hasSelectionOccurred() {
-		return getFlag(FLAG_SELECTION_PERFORMED);
-	}
-
-	/**
-	 * Creates a {@link SelectionRequest}and sends it to the source edit part
-	 * via {@link EditPart#performRequest(org.eclipse.gef.Request)}. Possible uses are to open
-	 * the selected item in another editor or replace the current editor's
-	 * contents based on the selected item.
-	 */
-	protected void performOpen() {
-		SelectionRequest request = new SelectionRequest();
-		request.setLocation(getLocation());
-		request.setType(RequestConstants.REQ_OPEN);
-		getSourceEditPart().performRequest(request);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#resetFlags()
-	 */
-	protected void resetFlags() {
-		super.resetFlags();
-		setFlag(FLAG_SELECTION_PERFORMED, false);
-	}
-
-	/**
-	 * Sets the source edit part.
-	 * 
-	 * @param part
-	 *            the source edit part
-	 */
-	protected void setSourceEditPart(EditPart part) {
-		this.editpart = part;
-	}
-
-	/**
-	 * @return the html graphical viewer
-	 */
-	public IHTMLGraphicalViewer getHTMLGraphicalViewer() {
-		return (IHTMLGraphicalViewer) getCurrentViewer();
-	}
-
-	/**
-	 * @return
-	 */
-	private boolean shouldStartRangeSelection() {
-		IPositionMediator positionMediator = new InlineEditingPositionMediator(
-				new ActionData(ActionData.INLINE_EDIT, null));
-		if (positionMediator.isEditable(new Target(getSourceEditPart()))) {
-			return getSourceEditPart() instanceof TextEditPart
-					|| !(((NodeEditPart) getSourceEditPart()).isWidget());
-		}
-        return false;
-	}
-
-	/**
-	 * @param b
-	 *            true means remain the old range start position.
-	 */
-	private void rangeSelection(boolean b) {
-		// XXX: not using updateTargetEditPartUnderMouse. Maybe should. Don't
-		// want to
-		// go through the request mechanism, so simple implementation for now.
-		
-		//to avoid 219038 and possibility of current viewer changing
-		final EditPartViewer viewer = getCurrentViewer();
-		final IHTMLGraphicalViewer graphicalViewer = (IHTMLGraphicalViewer)viewer;
-		EditPart editPart = viewer.findObjectAtExcluding(
-				getLocation(), Collections.EMPTY_LIST);
-		IPositionMediator positionMediator = new InlineEditingPositionMediator(
-				new ActionData(ActionData.INLINE_EDIT, null));
-		ExposeHelper exposeHelper = new ExposeHelper(graphicalViewer);
-		exposeHelper.adjustVertical(getCurrentInput().getMouseLocation());
-		DesignPosition position = EditPartPositionHelper.findEditPartPosition(
-				editPart, getCurrentInput().getMouseLocation(),
-				positionMediator);
-		if (b) {
-			graphicalViewer.setRangeEndPosition(position);
-		} else {
-			graphicalViewer.setRange(position, position);
-		}
-		graphicalViewer.updateHorizontalPos();
-	}
-
-    protected boolean handleHover() {
-        boolean retValue = super.handleHover();
-        refreshCursor();
-        return retValue;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java
deleted file mode 100644
index e25c052..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.gef.tools.SelectionTool;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.DeleteNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.SwitchSelectionCommand;
-import org.eclipse.jst.pagedesigner.commands.nav.HorizontalMoveCommand;
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.jst.pagedesigner.commands.nav.VerticalMoveCommand;
-import org.eclipse.jst.pagedesigner.commands.range.CopyCommand;
-import org.eclipse.jst.pagedesigner.commands.range.CutCommand;
-import org.eclipse.jst.pagedesigner.commands.range.DeleteCommand;
-import org.eclipse.jst.pagedesigner.commands.range.InsertCommand;
-import org.eclipse.jst.pagedesigner.commands.range.KeyboardData;
-import org.eclipse.jst.pagedesigner.commands.range.PasteCommand;
-import org.eclipse.jst.pagedesigner.commands.range.SelectAllCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.requests.LocationModifierRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * @author mengbo
- */
-public class RangeSelectionTool extends SelectionTool 
-{
-	private LocationRequest _hoverRequest;
-    
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectionTool#handleKeyDown(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected boolean handleKeyDown(KeyEvent e) {
-		// resetHover() is not visible.
-		if (isHoverActive()) {
-			handleHoverStop();
-		}
-		setHoverActive(false);
-
-		if ((e.stateMask & SWT.ALT) != 0) {
-			return false;
-		}
-		Command command = null;
-		KeyboardData keyCode = null;
-		switch (e.keyCode) {
-		case SWT.F2:
-			command = new SwitchSelectionCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer());
-
-			break;
-		case SWT.ARROW_UP:
-			command = new VerticalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), true, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_DOWN:
-			command = new VerticalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), false, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_LEFT:
-			command = new HorizontalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), false, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_RIGHT:
-			command = new HorizontalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), true, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.DEL:
-			if ((e.stateMask & SWT.SHIFT) == 0) {
-				if (getCurrentViewer().getSelection() != null) {
-					ISelection selection = getCurrentViewer().getSelection();
-					if (selection instanceof StructuredSelection) {
-						Object object = ((StructuredSelection) selection)
-								.getFirstElement();
-						if (!(object instanceof DocumentEditPart)) {
-							// "delete node"
-							command = new DeleteNodeCommand(
-									(IHTMLGraphicalViewer) getCurrentViewer());
-						}
-					}
-				}
-				if (command == null) {
-					// "delete"
-					command = new DeleteCommand(true,
-							(IHTMLGraphicalViewer) this.getCurrentViewer());
-				}
-			} else {
-				// "cut"
-				command = new CutCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer());
-				e.doit = false;
-			}
-			break;
-		case SWT.BS:
-			// "delete"
-			command = new DeleteCommand(false, (IHTMLGraphicalViewer) this
-					.getCurrentViewer());
-			e.doit = false;
-			break;
-		case SWT.INSERT:
-			if ((e.stateMask & SWT.SHIFT) != 0) {
-				// "paste"
-				command = new PasteCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer());
-				e.doit = false;
-				break;
-			} else if ((e.stateMask & SWT.CONTROL) != 0) {
-				// "copy"
-				command = new CopyCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer());
-				e.doit = false;
-				break;
-			}
-			break;
-		case SWT.LF:
-		case SWT.CR:
-			// "insert"
-			keyCode = new KeyboardData(e.character, e.stateMask,
-					(IHTMLGraphicalViewer) getCurrentViewer());
-			command = new InsertCommand(
-					PageDesignerResources.getInstance().getString(
-							"RangeSelectionTool.CommandLabel.Insert"), (IHTMLGraphicalViewer) this.getCurrentViewer(), keyCode); //$NON-NLS-1$
-			e.doit = false;
-			break;
-		default:
-			if (e.keyCode == 'a' && (e.stateMask & SWT.CTRL) != 0) {
-				command = new SelectAllCommand("selectAll", //$NON-NLS-1$
-						(IHTMLGraphicalViewer) this.getCurrentViewer());
-				e.doit = false;
-			} else {
-				if (getCurrentViewer() instanceof IHTMLGraphicalViewer
-						&& ((IHTMLGraphicalViewer) getCurrentViewer())
-								.isInRangeMode()
-						&& (!Character.isIdentifierIgnorable(e.character) && !Character
-								.isISOControl(e.character))
-						|| (e.character == '\r')) {
-					keyCode = new KeyboardData(e.character, e.stateMask,
-							(IHTMLGraphicalViewer) getCurrentViewer());
-					// "insert"
-					command = new InsertCommand(
-							PageDesignerResources.getInstance().getString(
-									"RangeSelectionTool.CommandLabel.Insert"), (IHTMLGraphicalViewer) this.getCurrentViewer(), keyCode); //$NON-NLS-1$
-					e.doit = false;
-					break;
-				}
-                return super.handleKeyDown(e);
-			}
-		}
-		if (command != null) {
-			command.execute();
-			e.doit = false;
-			if (command instanceof ICaretPositionMover) {
-				if (getCurrentViewer() instanceof IHTMLGraphicalViewer) {
-					((IHTMLGraphicalViewer) getCurrentViewer())
-							.updateHorizontalPos();
-				}
-			}
-			return true;
-		}
-		return false;
-	}
-
-	// /**
-	// * @param e
-	// * @return
-	// */
-	// protected boolean handleRangeModeKeyDown(KeyEvent e)
-	// {
-	// if (e.keyCode == SWT.SHIFT || e.keyCode == SWT.CONTROL || e.keyCode ==
-	// SWT.ALT)
-	// {
-	// return false;
-	// }
-	//
-	// dumpKey(e);
-	// Command command = null;
-	// switch (e.keyCode)
-	// {
-	// case SWT.ARROW_LEFT:
-	// command = new HorizontalMoveCommand((IHTMLGraphicalViewer)
-	// this.getCurrentViewer(), false,
-	// (e.stateMask & SWT.SHIFT) != 0);
-	// break;
-	// case SWT.ARROW_RIGHT:
-	// command = new HorizontalMoveCommand((IHTMLGraphicalViewer)
-	// this.getCurrentViewer(), true,
-	// (e.stateMask & SWT.SHIFT) != 0);
-	// break;
-	//
-	// }
-	// if (command != null)
-	// {
-	// command.execute();
-	// return true;
-	// }
-	//
-	// char content = e.character;
-	//
-	// // when reach here, should be standard content keys.
-	// return handleRangeModeContentChar(content);
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectionTool#createHoverRequest()
-	 */
-	protected void createHoverRequest() {
-		this._hoverRequest = new LocationModifierRequest();
-		_hoverRequest.setType(RequestConstants.REQ_SELECTION_HOVER);
-	}
-
-	protected Request getTargetHoverRequest() {
-		if (_hoverRequest == null) {
-			createHoverRequest();
-		}
-		return _hoverRequest;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectionTool#updateHoverRequest()
-	 */
-	protected void updateHoverRequest() {
-		LocationModifierRequest request = (LocationModifierRequest) getTargetHoverRequest();
-		request.setLocation(getLocation());
-		request.setControlKeyPressed(getCurrentInput().isControlKeyDown());
-	}
-
-    /* 
-     * If the target edit part is a NodeEditPart, then inform it if of the current
-     * drag status before calling its hover feedback
-     */
-    protected void showHoverFeedback() 
-    {
-        if (getTargetEditPart() instanceof NodeEditPart)
-        {
-            ((NodeEditPart)getTargetEditPart())
-                .setDragActive(
-                        isInState(STATE_DRAG_IN_PROGRESS 
-                                | STATE_ACCESSIBLE_DRAG_IN_PROGRESS 
-                                | STATE_DRAG));
-        }
-        super.showHoverFeedback();
-    }
-
-    // TODO : this method is for debug purposes and should
-    // be removed in production
-//    protected boolean updateTargetUnderMouse() {
-//        EditPart editPart = getTargetEditPart();
-//        boolean retValue =  super.updateTargetUnderMouse();
-//        if (getTargetEditPart() != editPart)
-//        {
-//            System.out.println("New target editpart:  "+getTargetEditPart()+" Old edit part: "+editPart);
-//        }
-//        return retValue;
-//    }
-
-    protected boolean handleMove() {
-        boolean handled =  super.handleMove();
-        EditPart targetEditPart = getTargetEditPart();
-        
-        if (isInState(STATE_INITIAL)
-                && targetEditPart instanceof NodeEditPart)
-        {
-            LocationRequest request = new LocationRequest(org.eclipse.jst.pagedesigner.requests.PageDesignerRequestConstants.REQ_SELECTION_TRACKER);
-            request.setLocation(getLocation());
-            DragTracker selectionTracker = targetEditPart.getDragTracker(request);
-            setDragTracker(selectionTracker);
-        }
-        
-        return handled;
-    }
-
-    protected Cursor calculateCursor() {
-        EditPart targetEditPart = getTargetEditPart();
-        if (isInState(STATE_INITIAL)
-               && targetEditPart instanceof NodeEditPart)
-        {
-            final Cursor  nodeCursor = 
-                ((NodeEditPart)targetEditPart).getCursor(getLocation());
-            
-            // if the edit part specified a custom cursor and there is no
-            // active drag tracker (which would otherwise manage cursor)
-            // then set the custom cursor
-            // if we fall-through, the default behaviour will be used
-            if (nodeCursor != null
-                    && getDragTracker() == null)
-            {
-                return nodeCursor;
-            }
-        }
-        // otherwise, use super's defaults
-        return super.calculateCursor();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/CommonResourceDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/CommonResourceDialog.java
deleted file mode 100644
index 8d6b638..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/CommonResourceDialog.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * This dialog shows IFile type resources within a IProject domain for
- * selection. The client can prvide the suffixs of files to filter when
- * candidates are shown on the tree,
- * 
- * TODO: dead?
- * 
- * @author mengbo
- */
-class CommonResourceDialog extends TreeViewerSelectionDialog {
-	private static final int WEBROOT_FOLDER_DEPTH = 2;
-
-	// CommonResourceDialog.statusMessage = Please select an image file
-	private static final String STATUS_MESSAGE = PageDesignerResources
-			.getInstance().getString("CommonResourceDialog.statusMessage"); //$NON-NLS-1$
-
-	private String _suffixs[] = null;
-
-	private CommonResourceFilter _filter;
-
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(CommonResourceDialog.class);
-
-	// The content provider
-	class ProjectFileDialogContentProvider implements ITreeContentProvider {
-		/**
-		 * The visual part that is using this content provider is about to be
-		 * disposed. Deallocate all allocated SWT resources.
-		 */
-		public void dispose() {
-            // do nothing
-		}
-
-		/**
-		 * @see ITreeContentProvider#getChildren
-		 */
-		public Object[] getChildren(Object element) {
-			if (element instanceof IWorkspace) {
-				IWorkspaceRoot root = ((IWorkspace) element).getRoot();
-				IProject[] projects = root.getProjects();
-				return projects;
-			} else if (element instanceof IContainer) {
-				if (element instanceof IProject) {
-					IContainer container = (IContainer) element;
-					if (container.isAccessible()) {
-						try {
-							IResource[] members = container.members();
-							return members;
-						} catch (CoreException e) {
-							// "Error.CommonResourceDialog.0.1" = "Error in
-							// project memeber querying"
-							// "Error.CommonResourceDialog.0.2" = "Please refer
-							// to the log for details"
-							PDPlugin
-									.getAlerts()
-									.error(
-											"Error.CommonResourceDialog.0.1", "Error.CommonResourceDialog.0.2"); //$NON-NLS-1$ //$NON-NLS-2$
-							// Error.ProjectFileDialogContentProvider.0 = Core
-							// error, you may need to restart the application
-							_log
-									.error(
-											"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						}
-					}
-				} else if (element instanceof IFolder) {
-					// Process the folder container
-					IContainer container = (IContainer) element;
-					if (container.isAccessible()) {
-						try {
-							// Filter all the files under the project and only
-							// show
-							// the folder in the container selection dialog
-							List children = new ArrayList();
-							IResource[] members = container.members();
-							for (int i = 0; i < members.length; i++) {
-								if (!members[i].getName().equals(
-										IFileFolderConstants.FOLDER_WEBINF)
-										&& !members[i]
-												.getName()
-												.equals(
-														IFileFolderConstants.FOLDER_METAINF)) {
-									children.add(members[i]);
-								}
-							}
-							return children.toArray();
-						} catch (CoreException e) {
-							// "Error.CommonResourceDialog.0.1" = "Error in
-							// project memeber querying"
-							// "Error.CommonResourceDialog.0.2" = "Please refer
-							// to the log for details"
-							PDPlugin
-									.getAlerts()
-									.error(
-											"Error.CommonResourceDialog.0.1", "Error.CommonResourceDialog.0.2"); //$NON-NLS-1$ //$NON-NLS-2$
-							// Error.ProjectFileDialogContentProvider.0 = core
-							// error, you may need to restart the application
-							_log
-									.error(
-											"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-			return new Object[0];
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements
-		 */
-		public Object[] getElements(Object element) {
-			return getChildren(element);
-		}
-
-		/**
-		 * @see ITreeContentProvider#getParent
-		 */
-		public Object getParent(Object element) {
-			if (element instanceof IResource) {
-				return ((IResource) element).getParent();
-			}
-			return null;
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren
-		 */
-		public boolean hasChildren(Object element) {
-			return getChildren(element).length > 0;
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            // do nothing
-		}
-
-	}
-
-	// The default resource filter
-	static class CommonResourceFilter extends ViewerFilter {
-		private String _suffixs[] = { IFileFolderConstants.EXT_PROPERTIES };
-
-		private Logger _mylog = PDPlugin.getLogger(CommonResourceFilter.class);
-
-		private IProject _project;
-
-		/**
-		 * @return Returns the _suffixs.
-		 */
-		public String[] getSuffixs() {
-			return _suffixs;
-		}
-
-		/**
-		 * @param _suffixs
-		 *            The _suffixs to set.
-		 */
-		public void setSuffixs(String[] _suffixs) {
-			this._suffixs = _suffixs;
-		}
-
-		/**
-		 * @param project
-		 */
-		public CommonResourceFilter(IProject project) {
-			_project = project;
-		}
-
-		/**
-		 * @param project
-		 *            The _project to set.
-		 */
-		public void setProject(IProject project) {
-			this._project = project;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			// TODO: This logic can be improved by add caching mechanism
-			if (element instanceof IWorkspace) {
-				return true;
-			} else if (element instanceof IFile) {
-				if (Arrays.asList(_suffixs).contains(
-						((IFile) element).getFileExtension())) {
-					return true;
-				}
-			} else if (element instanceof IContainer) {
-				if (!((IContainer) element).isAccessible()) {
-					return false;
-				}
-				if (element instanceof IProject) {
-					IProject container = (IProject) element;
-					if (isWebAppProject(container)
-							&& this.isSameProject(container, _project)) {
-						return true;
-					}
-                    return false;
-				} else if (element instanceof IFolder) {
-					IContainer container = (IContainer) element;
-					try {
-						if (container.getName().equals(
-								IFileFolderConstants.FOLDER_WEBINF)
-								|| container.getName().equals(
-										IFileFolderConstants.FOLDER_METAINF)) {
-							return false;
-						}
-						IResource[] members = container.members();
-						for (int i = 0; i < members.length; i++) {
-							{
-								if (select(viewer, members[i].getParent(),
-										members[i])) {
-									return true;
-								}
-							}
-						}
-					} catch (CoreException e) {
-						// "Error.ImgFileFilter.0" = "Error in filtering the
-						// tree", "Error.ImgFileFilter.2 = ""CoreException is
-						// thrown, please refer to error log for details"
-						// "Error.ProjectFileDialogContentProvider.0" = core
-						// error, show alert dialog to user.
-						PDPlugin
-								.getAlerts()
-								.detailError(
-										"Error.ImgFileFilter.0", "Error.ImgFileFilter.2");  //$NON-NLS-1$//$NON-NLS-2$
-						_mylog.error(
-								"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						return false;
-					}
-				}
-			}
-			// we don't select any other types of resources.
-			return false;
-		}
-
-		/**
-		 * Determines if a project is a Web Application project by the presence
-		 * of an associated Web Application Nature.
-		 * 
-		 * @return boolean - True, when project is a Web Application project
-		 */
-		private boolean isWebAppProject(IProject project) {
-			return WebrootUtil.isValidWebProject(project);
-		}
-
-		private boolean isSameProject(IProject orig, IProject dst) {
-			String currentProjectName = orig.getFullPath()
-					.toString().trim();
-			String projectName = dst.getFullPath().toString().trim();
-			return projectName.equalsIgnoreCase(currentProjectName);
-		}
-	}
-
-	/**
-	 * This is a dialog for common resource selection, the resouce supported
-	 * include IFolder, IProject, IFile, user can provide
-	 * 
-	 * @param parentShell
-	 * @param project
-	 */
-	public CommonResourceDialog(Shell parentShell, IProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		setContentProvider(new ProjectFileDialogContentProvider());
-		setLabelProvider(WorkbenchLabelProvider
-				.getDecoratingWorkbenchLabelProvider());
-		_filter = new CommonResourceFilter(project);
-		setFilter(_filter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#findInputElement()
-	 */
-	protected Object findInputElement() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection(java.lang.Object)
-	 */
-	protected boolean isValidSelection(Object selection) {
-		if (getContainerFullPath(selection) == null) {
-			return false;
-		}
-        int depth = getContainerFullPath(selection).segmentCount();
-        // The location is within WEBROOT PATH?
-        if ((selection instanceof IFile) && depth >= WEBROOT_FOLDER_DEPTH) {
-        	// Null means no filter is set
-        	if (_suffixs == null) {
-        		return true;
-        	}
-        	// The extension is supported?
-        	else if (_suffixs != null
-        			&& Arrays.asList(_suffixs).contains(
-        					((IFile) selection).getFileExtension())) {
-        		return true;
-        	}
-        }
-        // None of above conditions, invalid.
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		// Only one element is set by us.
-		IPath returnValue = getWebRelatedPath(objects[0]);
-		if (returnValue != null) {
-			if (!(returnValue.toString().startsWith(
-					IFileFolderConstants.PATH_SEPARATOR) || returnValue
-					.toString().startsWith("\\"))) { //$NON-NLS-1$
-				Path tempPath = new Path(IFileFolderConstants.PATH_SEPARATOR
-						+ returnValue.toString());
-				returnValue = tempPath;
-			}
-		}
-		return new Object[] { returnValue };
-	}
-
-	private IPath getContainerFullPath(Object _selectedElement) {
-		if (_selectedElement == null) {
-			return null;
-		} else if (_selectedElement instanceof IContainer) {
-			return ((IContainer) _selectedElement).getFullPath();
-		} else if (_selectedElement instanceof IFile) {
-			return ((IFile) _selectedElement).getFullPath();
-		}
-		return null;
-	}
-
-	private IPath getWebRelatedPath(Object _selectedElement) {
-		IPath result = null;
-		if (_selectedElement == null) {
-			return null;
-		} else if (_selectedElement instanceof IContainer) {
-			result = ((IContainer) _selectedElement).getFullPath();
-		} else if (_selectedElement instanceof IFile) {
-			result = ((IFile) _selectedElement).getFullPath();
-		}
-		if (result != null) {
-			if (result.segmentCount() > 2) {
-				result = result.removeFirstSegments(2);
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/PartActivationHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/PartActivationHandler.java
deleted file mode 100644
index e6bc799..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/PartActivationHandler.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @author mengbo
- */
-public abstract class PartActivationHandler extends ShellAdapter implements
-		IPartListener {
-	private IWorkbenchPart _activePart;
-
-	private boolean _isHandlingActivation = false;
-
-	private IWorkbenchPart _trace;
-
-	/**
-	 * @param part
-	 */
-	public PartActivationHandler(IWorkbenchPart part) {
-		_trace = part;
-	}
-
-	/**
-	 * this method is called when the specified part is activated.
-	 */
-	public abstract void handleActivation();
-
-	private void internalHandleActivation() {
-
-		if (_isHandlingActivation)
-			return;
-
-		if (_activePart == _trace) {
-			_isHandlingActivation = true;
-			try {
-				handleActivation();
-			} finally {
-				_isHandlingActivation = false;
-			}
-		}
-	}
-
-	/**
-	 * @see IPartListener#partActivated(IWorkbenchPart)
-	 */
-	public void partActivated(IWorkbenchPart part) {
-		_activePart = part;
-		internalHandleActivation();
-	}
-
-	/**
-	 * @see IPartListener#partBroughtToTop(IWorkbenchPart)
-	 */
-	public void partBroughtToTop(IWorkbenchPart part) {
-        // do nothing
-	}
-
-	/**
-	 * @see IPartListener#partClosed(IWorkbenchPart)
-	 */
-	public void partClosed(IWorkbenchPart part) {
-        // do nothing
-	}
-
-	/**
-	 * @see IPartListener#partDeactivated(IWorkbenchPart)
-	 */
-	public void partDeactivated(IWorkbenchPart part) {
-		_activePart = null;
-	}
-
-	/**
-	 * @see IPartListener#partOpened(IWorkbenchPart)
-	 */
-	public void partOpened(IWorkbenchPart part) {
-        // do nothing
-	}
-
-	/*
-	 * @see ShellListener#shellActivated(ShellEvent)
-	 */
-	public void shellActivated(ShellEvent e) {
-		internalHandleActivation();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/ResourceOnClasspathDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/ResourceOnClasspathDialog.java
deleted file mode 100644
index 6065899..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/ResourceOnClasspathDialog.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import java.io.File;
-import java.util.Arrays;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJarEntryResource;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.utils.JavaUtil;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This dialog will let client to select resources that located on a
- * IJavaProject classpath, the client can provide a list of files suffixs to
- * filter.
- * 
- * @author mengbo
- */
-// TODO: Since many jar files might do nothing to do with client's selection, we
-// may need to provides more filter choice
-// to clients to exclude unnecessary jar files, such as that are located in JDK
-// dir.
-public class ResourceOnClasspathDialog extends TreeViewerSelectionDialog {
-	// ResourcesOnClasspathDialog.statusMessage = Please select a property file
-	private static final String STATUS_MESSAGE = PageDesignerResources
-			.getInstance()
-			.getString("ResourcesOnClasspathDialog.statusMessage"); //$NON-NLS-1$
-
-	private IJavaProject _javaProject;
-
-	// the suffixs of files that can be selected
-	private String _suffixs[]; // =
-
-	// IJMTConstants.DEFAULT_SUFFIX;
-
-	private ResourceOnClasspathFilter _filter;
-
-	// Client doesn't need to know it.
-	class ResourceOnClasspathFilter extends ViewerFilter {
-		StandardJavaElementContentProvider _javaContentProvider;
-
-		/**
-		 * @param contentProvider
-		 */
-		public ResourceOnClasspathFilter(
-				StandardJavaElementContentProvider contentProvider) {
-			_javaContentProvider = contentProvider;
-		}
-
-		/**
-		 * Set the suffixs of files need to be selected.
-		 * 
-		 * @param suffixs
-		 */
-		public void setSuffixs(String suffixs[]) {
-			_suffixs = suffixs;
-		}
-
-		/**
-		 * @param contentProvider
-		 *            The _javaContentProvider to set.
-		 */
-		public void setJavaContentProvider(
-				StandardJavaElementContentProvider contentProvider) {
-			_javaContentProvider = contentProvider;
-		}
-
-		/**
-		 * @param project
-		 *            The _javaProject to set.
-		 */
-		public void setJavaProject(IJavaProject project) {
-			_javaProject = project;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			// TODO: This logic can be improved by add caching mechanism
-			if (element instanceof IJavaProject) {
-				String currentProjectName = ((IJavaProject) element)
-						.getProject().getFullPath().toString().trim();
-				String projectName = _javaProject.getProject().getFullPath()
-						.toString().trim();
-				if (projectName.equalsIgnoreCase(currentProjectName)) {
-					return true;
-				}
-                return false;
-			} else if (element instanceof IResource) {
-				if (((_javaProject != null) && !_javaProject
-						.isOnClasspath((IResource) element))) {
-					return false;
-				}
-				if (element instanceof IFile) {
-					if (Arrays.asList(_suffixs).contains(
-							((IFile) element).getFileExtension())) {
-						return true;
-					}
-				}
-				return false;
-			}
-
-			if (element instanceof IJarEntryResource) {
-				String ext = ((IJarEntryResource) element).getFullPath()
-						.getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				}
-                return false;
-			}
-			if (!(element instanceof IJavaElement)) {
-				return false;
-			}
-			if (((_javaProject != null) && !_javaProject
-					.isOnClasspath((IJavaElement) element))) {
-				return false;
-			}
-			IJavaElement javaElement = (IJavaElement) element;
-			Object[] children = null;
-			switch (javaElement.getElementType()) {
-			case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.IMPORT_CONTAINER:
-				return true;
-			case IJavaElement.PACKAGE_FRAGMENT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.CLASS_FILE:
-				if (Arrays.asList(_suffixs).contains(
-						IFileFolderConstants.EXT_CLASS)) {
-					return true;
-				} 
-				return false;
-			case IJavaElement.COMPILATION_UNIT:
-				String ext = javaElement.getPath().getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				} 
-				return false;
-			default:
-				return false;
-			}
-
-			for (int i = 0; i < children.length; i++) {
-				if (select(viewer, javaElement, children[i])) {
-					return true;
-				}
-			}
-			// Either the resouce or its children are not for displaying.
-			return false;
-		}
-	}
-
-	/**
-	 * Set the suffixs of files need to be selected.
-	 * 
-	 * @param suffixs
-	 */
-	public void setSuffixs(String suffixs[]) {
-		_suffixs = suffixs;
-		_filter.setSuffixs(suffixs);
-	}
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 */
-	public ResourceOnClasspathDialog(Shell parentShell, IJavaProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		// set provider and filter
-		StandardJavaElementContentProvider contentProvider = new StandardJavaElementContentProvider();
-		setContentProvider(contentProvider);
-		setLabelProvider(new JavaElementLabelProvider());
-		_filter = new ResourceOnClasspathFilter(contentProvider);
-		setFilter(_filter);
-		// store the project
-		_javaProject = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		IPath path = JavaUtil.getPathOnClasspath(_javaProject, objects[0]);
-		String result = null;
-		if (path.segmentCount() == 0) {
-			return new Object[] { "" }; //$NON-NLS-1$
-		}
-		path = path.removeFileExtension();
-		result = path.toOSString();
-		result = result.replace(File.separatorChar, '.');
-		return new Object[] { result };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection()
-	 */
-	protected boolean isValidSelection(Object selection) {
-		String extension = JavaUtil.getPathOnClasspath(_javaProject, selection)
-				.getFileExtension();
-		return (extension != null && Arrays.asList(_suffixs)
-				.contains(extension));
-	}
-
-	protected Object findInputElement() {
-		Object input = ResourcesPlugin.getWorkspace();
-		if (input instanceof IWorkspace) {
-			return JavaCore.create(((IWorkspace) input).getRoot());
-		} else if (input instanceof IContainer) {
-			IJavaElement element = JavaCore.create((IContainer) input);
-			if (element != null && element.exists())
-				return element;
-			return input;
-		}
-		return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java
deleted file mode 100644
index 097f048..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.part.DrillDownComposite;
-
-/**
- * This is a base dialog that uses TreeViewer to show selections, subclass needs
- * to provide IContentProvider, ILabelProvider and ViewerFilter for the
- * TreeViewer. Subclass needs to implement isValidSelection(), which valids the
- * selection, and findInputElement() which provides the root element of the
- * tree. Besides, subclass might need to implement getResult() to return a
- * customized result.
- * 
- * @author mengbo
- */
-abstract class TreeViewerSelectionDialog extends SelectionDialog {
-	// = "Select a file"
-	private static final String DEFAULT_TITLE = PageDesignerResources
-			.getInstance().getString("TreeViewerSelectionDialog.Title"); //$NON-NLS-1$
-
-	/** Used to tag the image type */
-	static final int STYLE_NONE = 0;
-
-	static final int STYLE_INFORMATION = 1;
-
-	static final int STYLE_ERROR = 2;
-
-	static final int STYLE_WARNING = 3;
-
-	/** Sizi of the TreeViewer composite */
-	private static final int SIZING_SELECTION_PANE_HEIGHT = 300;
-
-	private static final int SIZING_SELECTION_PANE_WIDTH = 320;
-
-	private String _title = DEFAULT_TITLE;
-
-	// the seleciton on the treeviewer.
-	private static Object _selection;
-
-	// providers
-	private ITreeContentProvider _contentProvider;
-
-	private ILabelProvider _labelProvider;
-
-	private ViewerFilter _filter;
-
-	/** The validation image */
-	private Label _statusImage;
-
-	/** The validation message */
-	private Label _statusLabel;
-
-	private String _statusMessage;
-
-	// private IJavaProject _project;
-	/** The selection tree */
-	private TreeViewer _treeViewer;
-
-	/**
-	 * @param parentShell
-	 * @param statusMessage 
-	 */
-	public TreeViewerSelectionDialog(Shell parentShell, String statusMessage) {
-		super(parentShell);
-		_statusMessage = statusMessage;
-		// ? need SWT.RESIZE
-		setShellStyle(getShellStyle());
-	}
-
-	/**
-	 * Returns a new drill down viewer for this dialog.
-	 * @param parent 
-	 * 
-	 */
-	protected void createTreeViewer(Composite parent) {
-		// Create drill down
-		DrillDownComposite drillDown = new DrillDownComposite(parent,
-				SWT.BORDER);
-		GridData spec = new GridData(GridData.VERTICAL_ALIGN_FILL
-				| GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL);
-		spec.widthHint = SIZING_SELECTION_PANE_WIDTH;
-		spec.heightHint = SIZING_SELECTION_PANE_HEIGHT;
-		drillDown.setLayoutData(spec);
-		_treeViewer = new TreeViewer(drillDown, SWT.NONE);
-		drillDown.setChildTree(_treeViewer);
-	}
-
-	private void setTreeViewerProviders() {
-		_treeViewer.setContentProvider(_contentProvider);
-		_treeViewer.setLabelProvider(_labelProvider);
-		_treeViewer.setSorter(new ViewerSorter());
-		_treeViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						_selection = getSelectedElement((IStructuredSelection) event
-								.getSelection());
-						updateStatus();
-					}
-				});
-		_treeViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				ISelection selection = event.getSelection();
-				if (selection instanceof IStructuredSelection) {
-					Object item = ((IStructuredSelection) selection)
-							.getFirstElement();
-					if (_treeViewer.getExpandedState(item)) {
-						_treeViewer.collapseToLevel(item, 1);
-					} else {
-						_treeViewer.expandToLevel(item, 1);
-					}
-				}
-			}
-		});
-		_treeViewer.setInput(findInputElement());
-
-		if (_filter != null) {
-			// Assert.isLegal(_contentProvider instanceof
-			// StandardJavaElementContentProvider);
-			_treeViewer.addFilter(_filter);
-		}
-
-	}
-
-	/**
-	 * Creates the contents of the composite.
-	 * @param parent 
-	 */
-	public void createTreeViewerComposite(Composite parent) {
-		Composite treeViewerComposite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		treeViewerComposite.setLayout(layout);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		treeViewerComposite.setLayoutData(gridData);
-		Label label = new Label(treeViewerComposite, SWT.WRAP);
-		label.setText(_title);
-		label.setFont(treeViewerComposite.getFont());
-		createTreeViewer(treeViewerComposite);
-		Dialog.applyDialogFont(treeViewerComposite);
-	}
-
-	/**
-	 * Sets the selected existing container.
-	 * 
-	 * @param selection -
-	 *            the current selected container.
-	 */
-	public void setSelectedElement(Object selection) {
-		// Expand to and select the specified container
-		if (_selection != null) {
-			_treeViewer.expandToLevel(_selection, 1);
-		}
-		List itemsToExpand = new ArrayList();
-		Object parent = _contentProvider.getParent(selection);
-		if (parent == null) {
-			return;
-		}
-		while (parent != null) {
-			itemsToExpand.add(0, parent);
-			parent = _contentProvider.getParent(parent);
-		}
-		_treeViewer.setExpandedElements(itemsToExpand.toArray());
-		_treeViewer.setSelection(new StructuredSelection(selection), true);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite area = (Composite) super.createDialogArea(parent);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		area.setLayout(gridLayout);
-
-		// Container treeviewer composite
-		createTreeViewerComposite(area);
-
-		_statusImage = SWTUtils.createLabelImage(area,
-				getMessageImage(STYLE_ERROR), 1, null);
-		_statusLabel = SWTUtils.createLabel(area, "", 1); //$NON-NLS-1$
-		// Link to model
-		setTreeViewerProviders();
-
-		return dialogArea;
-	}
-
-	private Object getSelectedElement(IStructuredSelection selection) {
-		return selection.getFirstElement();
-	}
-
-	/**
-	 * @param provider
-	 *            The _contentProvider to set.
-	 */
-	public void setContentProvider(ITreeContentProvider provider) {
-		_contentProvider = provider;
-	}
-
-	/**
-	 * @param provider
-	 *            The _labelProvider to set.
-	 */
-	public void setLabelProvider(ILabelProvider provider) {
-		_labelProvider = provider;
-	}
-
-	/**
-	 * @param filter
-	 *            The _filter to set.
-	 */
-	public void setFilter(ViewerFilter filter) {
-		this._filter = filter;
-	}
-
-
-	/**
-	 * Update the status message
-	 */
-	private void updateStatus() {
-		if (isValidSelection(_selection)) {
-			_statusImage.setImage(getMessageImage(STYLE_NONE));
-			_statusLabel.setText(""); //$NON-NLS-1$
-			getOkButton().setEnabled(true);
-		} else {
-			_statusImage.setImage(getMessageImage(STYLE_ERROR));
-			_statusLabel.setText(_statusMessage);
-			getOkButton().setEnabled(false);
-		}
-	}
-
-	/**
-	 * Get the different message according the message type.
-	 * 
-	 * @param imageType 
-	 * 
-	 * @return Image - the message image
-	 */
-	protected Image getMessageImage(int imageType) {
-		switch (imageType) {
-		case STYLE_ERROR:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
-		case STYLE_WARNING:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING);
-		case STYLE_INFORMATION:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
-		default:
-			return null;
-		}
-	}
-
-	/**
-	 * The <code>ContainerSelectionDialog</code> implementation of this
-	 * <code>Dialog</code> method builds a list of the selected resource
-	 * containers for later retrieval by the client and closes this dialog.
-	 */
-	protected void okPressed() {
-		List chosenContainerPathList = new ArrayList();
-		if (_selection != null) {
-			chosenContainerPathList.add(_selection);
-		}
-		setResult(chosenContainerPathList);
-		super.okPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Control control = super.createContents(parent);
-		if (_selection != null) {
-			this.setSelectedElement(_selection);
-		}
-		return control;
-	}
-
-	/**
-	 * @param selection
-	 * @return true if the selection is valid
-	 */
-	protected abstract boolean isValidSelection(Object selection);
-
-	/**
-	 * @return the input element
-	 */
-	protected abstract Object findInputElement();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/NestedEditorActionBarContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/NestedEditorActionBarContributor.java
deleted file mode 100644
index 2e0a2c0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/NestedEditorActionBarContributor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-
-/**
- * This contributor should be used when a SashEditor is inside a multipage
- * editor.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class NestedEditorActionBarContributor extends
-		MultiPageEditorActionBarContributor {
-	/**
-	 * Child class should not override this method.
-	 */
-	public final void setActivePage(IEditorPart activeEditor) {
-		if (activeEditor instanceof SashEditorPart) {
-			activeEditor = ((SashEditorPart) activeEditor).getActiveEditor();
-		}
-
-		setInnerActivePage(activeEditor);
-	}
-
-	/**
-	 * Child class should override this method
-	 * 
-	 * @param activeEditor
-	 */
-	public abstract void setInnerActivePage(IEditorPart activeEditor);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorPart.java
deleted file mode 100644
index ddaf592..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorPart.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IKeyBindingService;
-import org.eclipse.ui.INestableKeyBindingService;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-import org.eclipse.ui.part.MultiPageEditorSite;
-
-/**
- * This class emulates the MultiPageEditorPart. But instead of using multipage,
- * it use SashForm to separate the editors.
- * 
- * @author mengbo
- */
-public abstract class SashEditorPart extends EditorPart {
-	private int _orientation = SWT.VERTICAL;
-
-	private SashForm _sashForm;
-
-	/**
-	 * List of nested editors. Element type: IEditorPart. Need to hang onto them
-	 * here, in addition to using get/setData on the items, because dispose()
-	 * needs to access them, but widgetry has already been disposed at that
-	 * point.
-	 */
-	private ArrayList _nestedEditors = new ArrayList(3);
-
-	private Map _editorToComposite = new HashMap();
-
-	private IEditorPart _activeEditor = null;
-
-	/**
-	 * Creates and adds a new page containing the given editor to this
-	 * multi-page editor. The page is added at the given index. This also hooks
-	 * a property change listener on the nested editor.
-	 * 
-	 * @param editor
-	 *            the nested editor
-	 * @param input
-	 *            the input for the nested editor
-	 * @exception PartInitException
-	 *                if a new page could not be created
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int) the handler for
-	 *      property change events from the nested editor
-	 */
-	public void addPage(final IEditorPart editor, IEditorInput input)
-			throws PartInitException {
-		IEditorSite site = createSite(editor);
-		// call init first so that if an exception is thrown, we have created no
-		// new widgets
-		editor.init(site, input);
-		final Composite parent1 = new Composite(getContainer(), SWT.NONE);
-		FillLayout fillLayout = new FillLayout();
-		fillLayout.marginWidth = fillLayout.marginHeight = 1;
-		parent1.setLayout(fillLayout);
-
-		parent1.addListener(SWT.Activate, new Listener() {
-			public void handleEvent(Event event) {
-				if (event.type == SWT.Activate) {
-					activeEditorChanged(editor);
-					parent1.setBackground(ColorConstants.green);
-				}
-			}
-		});
-		parent1.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event event) {
-				parent1.setBackground(ColorConstants.titleInactiveBackground);
-			}
-		});
-		SWTUtils.workaroundResize(parent1);
-		editor.createPartControl(parent1);
-		editor.addPropertyListener(new IPropertyListener() {
-			public void propertyChanged(Object source, int propertyId) {
-				SashEditorPart.this.handlePropertyChange(propertyId);
-			}
-		});
-
-		_nestedEditors.add(editor);
-		_editorToComposite.put(editor, parent1);
-
-		connectPage(editor);
-	}
-
-	/**
-	 * @param editor
-	 */
-	protected void connectPage(IEditorPart editor) {
-		ISelectionProvider editSelectionProvider = editor.getSite()
-				.getSelectionProvider();
-		if (editSelectionProvider instanceof IPostSelectionProvider) {
-			((IPostSelectionProvider) editSelectionProvider)
-					.addPostSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							((SashEditorSelectionProvider) getSite()
-									.getSelectionProvider())
-									.firePostSelectionChanged(event);
-						}
-					});
-		} else {
-			editSelectionProvider
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-
-						public void selectionChanged(SelectionChangedEvent event) {
-							((SashEditorSelectionProvider) getSite()
-									.getSelectionProvider())
-									.fireSelectionChanged(event);
-						}
-					});
-		}
-	}
-
-	/**
-	 * Creates an empty container. Creates a CTabFolder with no style bits set,
-	 * and hooks a selection listener which calls <code>pageChange()</code>
-	 * whenever the selected tab changes.
-	 * 
-	 * @param parent
-	 *            The composite in which the container tab folder should be
-	 *            created; must not be <code>null</code>.
-	 * @return a new container
-	 */
-	private SashForm createContainer(Composite parent) {
-		// use SWT.FLAT style so that an extra 1 pixel border is not reserved
-		// inside the folder
-		SashForm newContainer = new SashForm(parent, SWT.NONE);
-		SWTUtils.workaroundResize(newContainer);
-		newContainer.setOrientation(_orientation);
-		return newContainer;
-	}
-
-	/**
-	 * @throws PartInitException
-	 */
-	abstract protected void createPages() throws PartInitException;
-
-	/**
-	 * The <code>MultiPageEditor</code> implementation of this
-	 * <code>IWorkbenchPart</code> method creates the control for the
-	 * multi-page editor by calling <code>createContainer</code>, then
-	 * <code>createPages</code>. Subclasses should implement
-	 * <code>createPages</code> rather than overriding this method.
-	 * 
-	 * @param parent
-	 *            The parent in which the editor should be created; must not be
-	 *            <code>null</code>.
-	 */
-	public final void createPartControl(Composite parent) {
-		this._sashForm = createContainer(parent);
-
-		try {
-			createPages();
-		} catch (PartInitException ex) {
-			ex.printStackTrace();
-		}
-		// set the active page (page 0 by default), unless it has already been
-		// done
-		if (getActiveEditor() == null) {
-			if (!_nestedEditors.isEmpty()) {
-				setActiveEditor((IEditorPart) _nestedEditors.get(0));
-			}
-		}
-	}
-
-	/**
-	 * Creates the site for the given nested editor. The
-	 * <code>MultiPageEditorPart</code> implementation of this method creates
-	 * an instance of <code>MultiPageEditorSite</code>. Subclasses may
-	 * reimplement to create more specialized sites.
-	 * 
-	 * @param editor
-	 *            the nested editor
-	 * @return the editor site
-	 */
-	protected IEditorSite createSite(IEditorPart editor) {
-		return new SashEditorSite(this, editor);
-	}
-
-	/**
-	 * The <code>MultiPageEditorPart</code> implementation of this
-	 * <code>IWorkbenchPart</code> method disposes all nested editors.
-	 * Subclasses may extend.
-	 */
-	public void dispose() {
-		_activeEditor = null;
-		for (int i = 0; i < _nestedEditors.size(); ++i) {
-			IEditorPart editor = (IEditorPart) _nestedEditors.get(i);
-			disposePart(editor);
-		}
-		_nestedEditors.clear();
-		_editorToComposite.clear();
-	}
-
-	/**
-	 * Returns the active nested editor if there is one.
-	 * <p>
-	 * Subclasses should not override this method
-	 * </p>
-	 * 
-	 * @return the active nested editor, or <code>null</code> if none
-	 */
-	public IEditorPart getActiveEditor() {
-		return _activeEditor;
-	}
-
-	/**
-	 * Returns the composite control containing this multi-page editor's pages.
-	 * This should be used as the parent when creating controls for the
-	 * individual pages. That is, when calling <code>addPage(Control)</code>,
-	 * the passed control should be a child of this container.
-	 * <p>
-	 * Warning: Clients should not assume that the container is any particular
-	 * subclass of Composite. The actual class used may change in order to
-	 * improve the look and feel of multi-page editors. Any code making
-	 * assumptions on the particular subclass would thus be broken.
-	 * </p>
-	 * <p>
-	 * Subclasses should not override this method
-	 * </p>
-	 * 
-	 * @return the composite, or <code>null</code> if
-	 *         <code>createPartControl</code> has not been called yet
-	 */
-	protected Composite getContainer() {
-		return _sashForm;
-	}
-
-	/**
-	 * Returns the editor for the given page index. The page index must be
-	 * valid.
-	 * 
-	 * @param pageIndex
-	 *            the index of the page
-	 * @return the editor for the specified page, or <code>null</code> if the
-	 *         specified page was not created with
-	 *         <code>addPage(IEditorPart,IEditorInput)</code>
-	 */
-	protected IEditorPart getEditor(int pageIndex) {
-		return (IEditorPart) _nestedEditors.get(pageIndex);
-	}
-
-	/**
-	 * Handles a property change notification from a nested editor. The default
-	 * implementation simply forwards the change to listeners on this multi-page
-	 * editor by calling <code>firePropertyChange</code> with the same
-	 * property id. For example, if the dirty state of a nested editor changes
-	 * (property id <code>IEditorPart.PROP_DIRTY</code>), this method handles
-	 * it by firing a property change event for
-	 * <code>IEditorPart.PROP_DIRTY</code> to property listeners on this
-	 * multi-page editor.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @param propertyId
-	 *            the id of the property that changed
-	 */
-	protected void handlePropertyChange(int propertyId) {
-		firePropertyChange(propertyId);
-	}
-
-	/**
-	 * The <code>MultiPageEditorPart</code> implementation of this
-	 * <code>IEditorPart</code> method sets its site to the given site, its
-	 * input to the given input, and the site's selection provider to a
-	 * <code>MultiPageSelectionProvider</code>. Subclasses may extend this
-	 * method.
-	 * 
-	 * @param site
-	 *            The site for which this part is being created; must not be
-	 *            <code>null</code>.
-	 * @param input
-	 *            The input on which this editor should be created; must not be
-	 *            <code>null</code>.
-	 * @throws PartInitException
-	 *             If the initialization of the part fails -- currently never.
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		setSite(site);
-		setInput(input);
-		site.setSelectionProvider(new SashEditorSelectionProvider(this));
-	}
-
-	/**
-	 * The <code>MultiPageEditorPart</code> implementation of this
-	 * <code>IEditorPart</code> method returns whether the contents of any of
-	 * this multi-page editor's nested editors have changed since the last save.
-	 * Pages created with <code>addPage(Control)</code> are ignored.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if any of the nested editors are dirty;
-	 *         <code>false</code> otherwise.
-	 */
-	public boolean isDirty() {
-		// use nestedEditors to avoid SWT requests; see bug 12996
-		for (Iterator i = _nestedEditors.iterator(); i.hasNext();) {
-			IEditorPart editor = (IEditorPart) i.next();
-			if (editor.isDirty()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Notifies this multi-page editor that the page with the given id has been
-	 * activated. This method is called when the user selects a different tab.
-	 * <p>
-	 * The <code>MultiPageEditorPart</code> implementation of this method sets
-	 * focus to the new page, and notifies the action bar contributor (if there
-	 * is one). This checks whether the action bar contributor is an instance of
-	 * <code>MultiPageEditorActionBarContributor</code>, and, if so, calls
-	 * <code>setActivePage</code> with the active nested editor. This also
-	 * fires a selection change event if required.
-	 * </p>
-	 * <p>
-	 * Subclasses may extend this method.
-	 * </p>
-	 * @param activeEditor 
-	 * 
-	 */
-	protected void activeEditorChanged(IEditorPart activeEditor) {
-		setActiveEditor(activeEditor);
-		setFocus();
-
-		IEditorSite site = getEditorSite();
-		while (site != null) {
-			IEditorActionBarContributor contributor = site
-					.getActionBarContributor();
-			if (contributor instanceof MultiPageEditorActionBarContributor) {
-				((MultiPageEditorActionBarContributor) contributor)
-						.setActivePage(activeEditor);
-			}
-			if (site instanceof MultiPageEditorSite) {
-				site = (IEditorSite) ((MultiPageEditorSite) site)
-						.getMultiPageEditor().getSite();
-			} else if (site instanceof SashEditorSite) {
-				site = (IEditorSite) ((SashEditorSite) site).getSashEditor()
-						.getSite();
-			} else {
-				site = null;
-			}
-		}
-
-		if (activeEditor != null) {
-			// Workaround for 1GAUS7C: ITPUI:ALL - Editor not activated when
-			// restored from previous session
-			// do not need second if once fixed
-			ISelectionProvider selectionProvider = activeEditor.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null) {
-				SelectionChangedEvent event = new SelectionChangedEvent(
-						selectionProvider, selectionProvider.getSelection());
-				((SashEditorSelectionProvider) getSite().getSelectionProvider())
-						.fireSelectionChanged(event);
-			}
-		}
-	}
-
-	/**
-	 * Disposes the given part and its site.
-	 * 
-	 * @param part
-	 *            The part to dispose; must not be <code>null</code>.
-	 */
-	private void disposePart(final IWorkbenchPart part) {
-        SafeRunner.run(new SafeRunnable() {
-			public void run() {
-				if (part.getSite() instanceof SashEditorSite) {
-					SashEditorSite partSite = (SashEditorSite) part.getSite();
-					partSite.dispose();
-				}
-				part.dispose();
-			}
-
-			public void handleException(Throwable e) {
-				// Exception has already being logged by Core. Do nothing.
-			}
-		});
-	}
-
-	/**
-	 * Sets the currently active page.
-	 * @param part
-	 * 
-	 */
-	protected void setActiveEditor(IEditorPart part) {
-		_activeEditor = part;
-	}
-
-	/**
-	 * The <code>MultiPageEditor</code> implementation of this
-	 * <code>IWorkbenchPart</code> method sets focus on the active nested
-	 * editor, if there is one.
-	 * <p>
-	 * Subclasses may extend or reimplement.
-	 * </p>
-	 */
-	public void setFocus() {
-		setFocus(getActiveEditor());
-	}
-
-	/**
-	 * Sets focus to the control for the given page. If the page has an editor,
-	 * this calls its <code>setFocus()</code> method. Otherwise, this calls
-	 * <code>setFocus</code> on the control for the page.
-	 * 
-	 * @param pageIndex
-	 *            the index of the page
-	 */
-	private void setFocus(IEditorPart editor) {
-		final IKeyBindingService service = getSite().getKeyBindingService();
-
-		if (editor == null) {
-			// There is no selected page, so deactivate the active service.
-			if (service instanceof INestableKeyBindingService) {
-				final INestableKeyBindingService nestableService = (INestableKeyBindingService) service;
-				nestableService.activateKeyBindingService(null);
-			} else {
-				//WorkbenchPlugin
-				PDPlugin
-				    .getLogger(getClass()).error("MultiPageEditorPart.setFocus()   Parent key binding service was not an instance of INestableKeyBindingService.  It was an instance of " + service.getClass().getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			return;
-		}
-        editor.setFocus();
-        // There is no selected page, so deactivate the active service.
-        if (service instanceof INestableKeyBindingService) {
-        	final INestableKeyBindingService nestableService = (INestableKeyBindingService) service;
-        	if (editor != null) {
-        		nestableService.activateKeyBindingService(editor
-        				.getEditorSite());
-        	} else {
-        		nestableService.activateKeyBindingService(null);
-        	}
-        } else {
-            PDPlugin
-                .getLogger(getClass()).error("MultiPageEditorPart.setFocus()   Parent key binding service was not an instance of INestableKeyBindingService.  It was an instance of " + service.getClass().getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		if (_activeEditor != null) {
-			_activeEditor.doSave(monitor);
-		}
-	}
-
-	public void doSaveAs() {
-		if (_activeEditor != null) {
-			_activeEditor.doSaveAs();
-		}
-
-	}
-
-	public boolean isSaveAsAllowed() {
-		if (_activeEditor != null)
-        {
-			return _activeEditor.isSaveAsAllowed();
-        }
-		return false;
-	}
-
-	/**
-	 * @param orientation
-	 */
-	public void setOrientation(int orientation) {
-		this._orientation = orientation;
-		if (_sashForm != null && !_sashForm.isDisposed()) {
-			_sashForm.setMaximizedControl(null);
-			_sashForm.setOrientation(_orientation);
-		}
-	}
-
-	/**
-	 * @param part
-	 */
-	public void setMaximizedEditor(IEditorPart part) {
-		if (part != null) {
-			Composite c = (Composite) _editorToComposite.get(part);
-			if (c != null && _sashForm != null && !_sashForm.isDisposed()) {
-				_sashForm.setMaximizedControl(c);
-				part.setFocus();
-			}
-		} else {
-			if (_sashForm != null && !_sashForm.isDisposed()) {
-				_sashForm.setMaximizedControl(null);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSelectionProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSelectionProvider.java
deleted file mode 100644
index 2f47aaa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSelectionProvider.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * @author mengbo
- */
-public class SashEditorSelectionProvider implements IPostSelectionProvider {
-
-	/**
-	 * Registered selection changed listeners (element type:
-	 * <code>ISelectionChangedListener</code>).
-	 */
-	private ListenerList _listeners = new ListenerList(ListenerList.IDENTITY);
-
-	private ListenerList _postSelectionChangedListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * The multi-page editor.
-	 */
-	private SashEditorPart _sashEditor;
-
-	/**
-	 * Creates a selection provider for the given multi-page editor.
-	 * 
-	 * @param sashEditor
-	 *            the multi-page editor
-	 */
-	public SashEditorSelectionProvider(SashEditorPart sashEditor) {
-		Assert.isNotNull(sashEditor);
-		this._sashEditor = sashEditor;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on <code>ISelectionProvider</code>.
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		_listeners.add(listener);
-	}
-
-	/**
-	 * Notifies all registered selection changed listeners that the editor's
-	 * selection has changed. Only listeners registered at the time this method
-	 * is called are notified.
-	 * 
-	 * @param event
-	 *            the selection changed event
-	 */
-	public void fireSelectionChanged(final SelectionChangedEvent event) {
-		Object[] listeners = this._listeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-            SafeRunner.run(new SafeRunnable() {
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Returns the sash editor.
-	 * @return the sash editor part
-	 */
-	public SashEditorPart getSashEditor() {
-		return _sashEditor;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on <code>ISelectionProvider</code>.
-	 */
-	public ISelection getSelection() {
-		IEditorPart activeEditor = _sashEditor.getActiveEditor();
-		if (activeEditor != null) {
-			ISelectionProvider selectionProvider = activeEditor.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null)
-				return selectionProvider.getSelection();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-JavaDoc) Method declaed on <code>ISelectionProvider</code>.
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		_listeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on <code>ISelectionProvider</code>.
-	 */
-	public void setSelection(ISelection selection) {
-		IEditorPart activeEditor = _sashEditor.getActiveEditor();
-		if (activeEditor != null) {
-			ISelectionProvider selectionProvider = activeEditor.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null)
-				selectionProvider.setSelection(selection);
-		}
-	}
-
-	public void addPostSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		_postSelectionChangedListeners.add(listener);
-	}
-
-	public void removePostSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		_postSelectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * Notifies any post selection listeners that a post selection event has
-	 * been received. Only listeners registered at the time this method is
-	 * called are notified.
-	 * 
-	 * @param event
-	 *            a selection changed event
-	 * 
-	 * @see #addPostSelectionChangedListener(ISelectionChangedListener)
-	 */
-	public void firePostSelectionChanged(final SelectionChangedEvent event) {
-		Object[] listeners = _postSelectionChangedListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSite.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSite.java
deleted file mode 100644
index 4558404..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSite.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IKeyBindingService;
-import org.eclipse.ui.INestableKeyBindingService;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-//import org.eclipse.ui.internal.PopupMenuExtender;
-
-/**
- * @author mengbo
- */
-public class SashEditorSite implements IEditorSite {
-
-	/**
-	 * The nested editor.
-	 */
-	private IEditorPart _editor;
-
-	/**
-	 * The multi-page editor.
-	 */
-	private SashEditorPart _sashEditor;
-
-	/**
-	 * The selection provider; <code>null</code> if none.
-	 * 
-	 * @see SashEditorSite#setSelectionProvider(ISelectionProvider)
-	 */
-	private ISelectionProvider _selectionProvider = null;
-
-	/**
-	 * The selection change listener, initialized lazily; <code>null</code> if
-	 * not yet created.
-	 */
-	private ISelectionChangedListener _selectionChangedListener = null;
-
-	/**
-	 * The cached copy of the key binding service specific to this sash editor
-	 * site. This value is <code>null</code> if it is not yet initialized.
-	 */
-	private IKeyBindingService _service = null;
-
-	/**
-	 * The list of popup menu extenders; <code>null</code> if none registered.
-	 */
-	// TODO: dead? private ArrayList _menuExtenders;
-
-	/**
-	 * Creates a site for the given editor nested within the given multi-page
-	 * editor.
-	 * 
-	 * @param sashEditor
-	 *            the multi-page editor
-	 * @param editor
-	 *            the nested editor
-	 */
-	public SashEditorSite(SashEditorPart sashEditor, IEditorPart editor) {
-		Assert.isNotNull(sashEditor);
-		Assert.isNotNull(editor);
-		this._sashEditor = sashEditor;
-		this._editor = editor;
-	}
-
-	/**
-	 * Dispose the contributions.
-	 */
-	public void dispose() {
-//		if (_menuExtenders != null) {
-//			for (int i = 0, size = _menuExtenders.size(); i < size; i++) {
-//				((PopupMenuExtender) _menuExtenders.get(i)).dispose();
-//			}
-//			_menuExtenders = null;
-//		}
-
-		// Remove myself from the list of nested key binding services.
-		if (_service != null) {
-			IKeyBindingService parentService = getEditor().getSite()
-					.getKeyBindingService();
-			if (parentService instanceof INestableKeyBindingService) {
-				INestableKeyBindingService nestableParent = (INestableKeyBindingService) parentService;
-				nestableParent.removeKeyBindingService(this);
-			}
-			_service = null;
-		}
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IEditorSite</code> method returns <code>null</code>, since
-	 * nested editors do not have their own action bar contributor.
-	 * 
-	 * @return <code>null</code>
-	 */
-	public IEditorActionBarContributor getActionBarContributor() {
-		return null;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IEditorSite</code> method forwards to the multi-page editor to
-	 * return the action bars.
-	 * 
-	 * @return The action bars from the parent multi-page editor.
-	 */
-	public IActionBars getActionBars() {
-		return _sashEditor.getEditorSite().getActionBars();
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the decorator manager.
-	 * 
-	 * @return The decorator from the workbench window.
-	 * @deprecated use IWorkbench.getDecoratorManager()
-	 */
-	public ILabelDecorator getDecoratorManager() {
-		return getWorkbenchWindow().getWorkbench().getDecoratorManager()
-				.getLabelDecorator();
-	}
-
-	/**
-	 * Returns the nested editor.
-	 * 
-	 * @return the nested editor
-	 */
-	public IEditorPart getEditor() {
-		return _editor;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns an empty string since
-	 * the nested editor is not created from the registry.
-	 * 
-	 * @return An empty string.
-	 */
-	public String getId() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IEditorSite.
-	 */
-	public IKeyBindingService getKeyBindingService() {
-		if (_service == null) {
-			_service = getSashEditor().getEditorSite().getKeyBindingService();
-			if (_service instanceof INestableKeyBindingService) {
-				INestableKeyBindingService nestableService = (INestableKeyBindingService) _service;
-				_service = nestableService.getKeyBindingService(this);
-
-			} else {
-				/*
-				 * This is an internal reference, and should not be copied by
-				 * client code. If you are thinking of copying this, DON'T DO
-				 * IT.
-				 */
-				PDPlugin
-						.getLogger(SashEditorSite.class)
-						.info(
-								"MultiPageEditorSite.getKeyBindingService()   Parent key binding service was not an instance of INestableKeyBindingService.  It was an instance of " + _service.getClass().getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		return _service;
-	}
-
-	/**
-	 * Returns the sash editor.
-	 * 
-	 * @return the sash editor
-	 */
-	public SashEditorPart getSashEditor() {
-		return _sashEditor;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the workbench page.
-	 * 
-	 * @return The workbench page in which this editor site resides.
-	 */
-	public IWorkbenchPage getPage() {
-		return getSashEditor().getSite().getPage();
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns an empty string since
-	 * the nested editor is not created from the registry.
-	 * 
-	 * @return An empty string.
-	 */
-	public String getPluginId() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns an empty string since
-	 * the nested editor is not created from the registry.
-	 * 
-	 * @return An empty string.
-	 */
-	public String getRegisteredName() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the selection changed listener which listens to the nested
-	 * editor's selection changes, and calls <code>handleSelectionChanged</code>.
-	 * 
-	 * @return the selection changed listener
-	 */
-	private ISelectionChangedListener getSelectionChangedListener() {
-		if (_selectionChangedListener == null) {
-			_selectionChangedListener = new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-					SashEditorSite.this.handleSelectionChanged(event);
-				}
-			};
-		}
-		return _selectionChangedListener;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns the selection provider
-	 * set by <code>setSelectionProvider</code>.
-	 * 
-	 * @return The current selection provider.
-	 */
-	public ISelectionProvider getSelectionProvider() {
-		return _selectionProvider;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the shell.
-	 * 
-	 * @return The shell in which this editor site resides.
-	 */
-	public Shell getShell() {
-		return getSashEditor().getSite().getShell();
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the workbench window.
-	 * 
-	 * @return The workbench window in which this editor site resides.
-	 */
-	public IWorkbenchWindow getWorkbenchWindow() {
-		return getSashEditor().getSite().getWorkbenchWindow();
-	}
-
-	/**
-	 * Handles a selection changed event from the nested editor. The default
-	 * implementation gets the selection provider from the multi-page editor's
-	 * site, and calls <code>fireSelectionChanged</code> on it (only if it is
-	 * an instance of <code>SashSelectionProvider</code>), passing a new
-	 * event object.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	public void handleSelectionChanged(SelectionChangedEvent event) {
-		// we'll only make the parent editor site fire the selection change
-		// event
-		// when we (the sasheditorsite) is the active editor in the parent site.
-		if (getSashEditor().getActiveEditor() == this.getPart()) {
-			ISelectionProvider parentProvider = getSashEditor().getSite()
-					.getSelectionProvider();
-			if (parentProvider instanceof SashEditorSelectionProvider) {
-				SelectionChangedEvent newEvent = new SelectionChangedEvent(
-						parentProvider, event.getSelection());
-				((SashEditorSelectionProvider) parentProvider)
-						.fireSelectionChanged(newEvent);
-			}
-		}
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor for registration.
-	 * 
-	 * @param menuID
-	 *            The identifier for the menu.
-	 * @param menuMgr
-	 *            The menu manager
-	 * @param selProvider
-	 *            The selection provider.
-	 */
-	public void registerContextMenu(String menuID, MenuManager menuMgr,
-			ISelectionProvider selProvider) {
-//		if (_menuExtenders == null) {
-//			_menuExtenders = new ArrayList(1);
-//		}
-		// cancel the registration of PopupMenuExtender since the
-		// PopupMenuExtender's behavior
-		// is different between eclipse 3.0 and eclipse 3.1,and we always have
-		// one context
-		// menu listener,no need add PopupMenuExtender as the second
-		// listener(workaroud for bug 408295-1)
-		// _menuExtenders.add(new PopupMenuExtender(menuID, menuMgr,
-		// selProvider,
-		// _editor));
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor for registration.
-	 * 
-	 * @param menuManager
-	 *            The menu manager
-	 * @param selProvider
-	 *            The selection provider.
-	 */
-	public void registerContextMenu(MenuManager menuManager,
-			ISelectionProvider selProvider) {
-		getSashEditor().getSite().registerContextMenu(menuManager, selProvider);
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method remembers the selection
-	 * provider, and also hooks a listener on it, which calls
-	 * <code>handleSelectionChanged</code> when a selection changed event
-	 * occurs.
-	 * 
-	 * @param provider
-	 *            The selection provider.
-	 * @see SashEditorSite#handleSelectionChanged(SelectionChangedEvent)
-	 */
-	public void setSelectionProvider(ISelectionProvider provider) {
-		ISelectionProvider oldSelectionProvider = _selectionProvider;
-		_selectionProvider = provider;
-		if (oldSelectionProvider != null) {
-			oldSelectionProvider
-					.removeSelectionChangedListener(getSelectionChangedListener());
-		}
-		if (_selectionProvider != null) {
-			_selectionProvider
-					.addSelectionChangedListener(getSelectionChangedListener());
-		}
-	}
-
-	/**
-	 * @param job
-	 */
-	public void progressEnd(Job job) {
-		// Do nothing
-	}
-
-
-	/**
-	 * @param job
-	 */
-	public void progressStart(Job job) {
-		// Do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPartSite#getPart()
-	 */
-	public IWorkbenchPart getPart() {
-		return _editor;
-	}
-
-	public void registerContextMenu(MenuManager menuManager,
-			ISelectionProvider selectionProvider, boolean includeEditorInput) {
-	    // do nothing
-	}
-
-	public void registerContextMenu(String menuId, MenuManager menuManager,
-			ISelectionProvider selectionProvider, boolean includeEditorInput) {
-		// do nothing
-
-	}
-
-	public Object getService(Class api) {
-		// return null
-		return null;
-	}
-
-	public boolean hasService(Class api) {
-		// no service
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ClasspathResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ClasspathResourceButtonDialogField.java
deleted file mode 100644
index 61af631..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ClasspathResourceButtonDialogField.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.ResourceOnClasspathDialog;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- */
-public class ClasspathResourceButtonDialogField extends StringButtonDialogField implements IElementContextable
-{
-
-	private static final String[] PROPERTIES_FILES_SUFFIXS = new String[] { IFileFolderConstants.EXT_PROPERTIES };
-
-	private static class MyStringButtonAdapter implements IStringButtonAdapter
-	{
-		private IProject _project;
-
-		public void changeControlPressed(DialogField field) {
-			browseButtonPressed(field);
-		}
-
-		private void browseButtonPressed(DialogField field) 
-		{
-			if (field instanceof ClasspathResourceButtonDialogField)
-			{
-				ClasspathResourceButtonDialogField classPathField = 
-					(ClasspathResourceButtonDialogField) field;
-				Shell shell = field.getShell();
-				ResourceOnClasspathDialog dialog = 
-					new ResourceOnClasspathDialog(shell, getJavaProject());
-				dialog.setTitle(JSFUICommonPlugin
-						.getResourceString("DialogField.ResourceButton.SelectFile"));//$NON-NLS-1$
-				dialog.setSuffixs(PROPERTIES_FILES_SUFFIXS);
-				if (dialog.open() == Window.OK) {
-					String oldValue = classPathField.getText();
-	
-					String newValue = (String) dialog.getResult()[0];
-					if (oldValue != newValue) {
-						classPathField.setText(newValue);
-					}
-				}
-			}
-		}
-		
-		private IJavaProject getJavaProject() {
-			try {
-				if (_project != null && _project.hasNature(JavaCore.NATURE_ID)) {
-					return JavaCore.create(_project);
-				}
-	            return null;
-			} catch (CoreException e) {
-				return null;
-			}
-		}
-	}
-	
-	/**
-s	 */
-	public ClasspathResourceButtonDialogField() {
-		super(new MyStringButtonAdapter());
-	}
-
-	public void setElementContext(
-			org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode ancester,
-			IDOMElement element) {
-		IProject prj = StructuredModelUtil.getProjectFor(ancester.getModel());
-		
-		IStringButtonAdapter adapter = getStringButtonAdapter();
-		
-		if (adapter instanceof MyStringButtonAdapter)
-		{
-			((MyStringButtonAdapter)adapter)._project = prj;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableResourceButtonDialogField.java
deleted file mode 100644
index a9e50ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableResourceButtonDialogField.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.jst.pagedesigner.utils.WebAppUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ContextableResourceButtonDialogField extends
-		ResourceButtonDialogField implements IElementContextable {
-
-	/**
-	 * Default constructor
-	 */
-	public ContextableResourceButtonDialogField() {
-		super(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-	public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		if (ancester == null) {
-			setProject(null);
-			setReferredFile(null);
-		} else {
-			IDOMModel model = ancester.getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			IProject prj = (file == null ? null : file.getProject());
-			setProject(prj);
-			setReferredFile(file);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField#browseButtonPressed()
-	 */
-	protected String browseButtonPressed() {
-		String url = super.browseButtonPressed();
-		url = WebAppUtil.transformJSPURL(url, this.getReferredFile());
-		return url;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/DialogFieldWrapper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/DialogFieldWrapper.java
deleted file mode 100644
index 4d1b16b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/DialogFieldWrapper.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IBindingHandler;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This is a wrapper to a dialog field, by adding a small image button at the
- * end. The caller is responsible to provide the image and the button click
- * handler.
- * 
- * @author mengbo
- * @version 1.5
- * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper
- */
-// NOTE: currently this class is dedicated to page designer by using the
-// IElementContextable interface.
-// It should be very easy to make it standard alone and reused in other places.
-@SuppressWarnings("deprecation")
-public class DialogFieldWrapper implements DialogField, ISupportTextValue,
-		IElementContextable {
-	private DialogField _wrapped;
-
-	private IDOMNode _ancester;
-
-	private IDOMElement _element;
-
-	private Button _databindingButton;
-
-	private boolean _databindingEnabled;
-
-	private Image _image;
-
-	private Image _disabledImage;
-
-	private IStringButtonAdapter _adapter;
-
-	private String _uri;
-
-	private String _tagName;
-
-    private IAttributeDescriptor _attr;
-
-    private IBindingHandler _handler;
-
-	private IPropertyPageDescriptor _pdattr;
-
-	/**
-	 * @param field 
-	 * @param image 
-	 * @param disabledImage 
-	 * @param uri 
-	 * @param tagName 
-	 * @param attr 
-	 * @param handler 
-	 * 
-	 */
-    public DialogFieldWrapper(DialogField field, Image image,
-			Image disabledImage, String uri, String tagName,
-			IAttributeDescriptor attr, IBindingHandler handler) {
-		super();
-		if (!(field instanceof ISupportTextValue)) {
-			throw new IllegalArgumentException(
-					"Field must be ISupportTextValue"); //$NON-NLS-1$
-		}
-		_wrapped = field;
-		this._image = image;
-		this._disabledImage = disabledImage;
-		this._uri = uri;
-		this._tagName = tagName;
-		this._attr = attr;
-		this._handler = handler;
-
-		setDatabindingPressedHandler(new IStringButtonAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-			 */
-            public void changeControlPressed(DialogField field1) {
-				Shell shell = field1.getLabelControl(null, null).getShell();
-				DialogFieldWrapper wrapper = (DialogFieldWrapper) field1;
-				String result = _handler
-						.handleBinding(shell, wrapper.getAncester(), wrapper
-								.getElement(), wrapper.getText());
-				if (result != null) {
-					wrapper.setText(result);
-				}
-			}
-		});
-	}
-	
-	/**
-	 * @param field 
-	 * @param image 
-	 * @param disabledImage 
-	 * @param uri 
-	 * @param tagName 
-	 * @param attr 
-	 * @param handler 
-	 * 
-	 */
-    public DialogFieldWrapper(DialogField field, Image image,
-			Image disabledImage, String uri, String tagName,
-			IPropertyPageDescriptor attr, IBindingHandler handler) {
-		super();
-		if (!(field instanceof ISupportTextValue)) {
-			throw new IllegalArgumentException(
-					"Field must be ISupportTextValue"); //$NON-NLS-1$
-		}
-		_wrapped = field;
-		this._image = image;
-		this._disabledImage = disabledImage;
-		this._uri = uri;
-		this._tagName = tagName;
-		this._pdattr = attr;
-		this._handler = handler;
-
-		setDatabindingPressedHandler(new IStringButtonAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-			 */
-			public void changeControlPressed(DialogField field1) {
-				Shell shell = field1.getLabelControl(null, null).getShell();
-				DialogFieldWrapper wrapper = (DialogFieldWrapper) field1;
-				String result = _handler
-						.handleBinding(shell, wrapper.getAncester(), wrapper
-								.getElement(), wrapper.getText());
-				if (result != null) {
-					wrapper.setText(result);
-				}
-			}
-		});
-	}
-
-	private void setDatabindingPressedHandler(IStringButtonAdapter adapter) {
-		this._adapter = adapter;
-		this.updateDatabindingControl();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#setTextWithoutUpdate(java.lang.String)
-	 */
-	public void setTextWithoutUpdate(String value) {
-		((ISupportTextValue) _wrapped).setTextWithoutUpdate(value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#getText()
-	 */
-	public String getText() {
-		return ((ISupportTextValue) _wrapped).getText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#setText(java.lang.String)
-	 */
-	public void setText(String value) {
-		((ISupportTextValue) _wrapped).setText(value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-    public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		if (_wrapped instanceof IElementContextable) {
-			((IElementContextable) _wrapped).setElementContext(ancester,
-					element);
-		}
-		this._ancester = ancester;
-		this._element = element;
-
-		boolean bindingEnabled = false;
-		
-		if (_attr != null)
-			bindingEnabled = _handler.isEnabled(_ancester, _element, _uri,
-				_tagName, _attr);
-		else if (_pdattr != null)
-			bindingEnabled = false;//_handler.isEnabled(_ancester, _element, _pdattr);
-		
-		this.setDatabindingEnabled(bindingEnabled);
-	}
-
-	// --------------------------------------------------------------------------------------------
-	// wrapped method to add the data binding browse button
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#doFillIntoGrid(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite, int)
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		Control[] wrappedControls = _wrapped.doFillIntoGrid(toolkit, parent,
-				nColumns - 1);
-		Control[] result = new Control[wrappedControls.length];
-
-		Control button = getDatabingingButton(toolkit, parent);
-		button.setLayoutData(gridDataForDatabindingButton(1));
-		button.setVisible(false);
-
-		System.arraycopy(wrappedControls, 0, result, 0, wrappedControls.length);
-		result[result.length - 1] = _databindingButton;
-		return result;
-	}
-
-	/**
-	 * @param span
-	 * @return
-	 */
-	private GridData gridDataForDatabindingButton(int span) {
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gd.horizontalSpan = span;
-		gd.widthHint = gd.heightHint = 18;
-		return gd;
-	}
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 * @return
-	 */
-	private Control getDatabingingButton(FormToolkit toolkit, Composite parent) {
-		if (_databindingButton == null || _databindingButton.isDisposed()) {
-			Assert.isNotNull(parent,
-					"uncreated control requested with composite null"); //$NON-NLS-1$
-			if (toolkit != null) {
-				_databindingButton = toolkit.createButton(parent, "", SWT.PUSH); //$NON-NLS-1$
-				_databindingButton.setImage(getImage());
-			} else {
-				_databindingButton = new Button(parent, SWT.PUSH);
-				_databindingButton.setImage(getImage());
-			}
-			_databindingButton.addPaintListener(new PaintListener() {
-				public void paintControl(PaintEvent e) {
-					if (!_databindingButton.isEnabled()
-							&& getDisabledImage() != null) {
-						Rectangle buttonBounds = _databindingButton.getBounds();
-						Rectangle imageBounds = getDisabledImage().getBounds();
-						e.gc.drawImage(getDisabledImage(),
-								(buttonBounds.width - imageBounds.width) / 2,
-								(buttonBounds.height - imageBounds.height) / 2);
-					}
-				}
-			});
-			_databindingButton.setEnabled(isEnabled() && _databindingEnabled);
-			_databindingButton.addSelectionListener(new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					databindingControlPressed();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					databindingControlPressed();
-				}
-			});
-
-		}
-		return _databindingButton;
-	}
-
-	/**
-	 * @return
-	 */
-	private Image getImage() {
-		return _image;
-	}
-
-	private Image getDisabledImage() {
-		return _disabledImage;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#getLabelControl(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public Control getLabelControl(FormToolkit _formToolkit, Composite parent) {
-		return _wrapped.getLabelControl(_formToolkit, parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setHyperLink(org.eclipse.ui.forms.events.IHyperlinkListener)
-	 */
-	public void setHyperLink(IHyperlinkListener listener) {
-		_wrapped.setHyperLink(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setLabelText(java.lang.String)
-	 */
-	public void setLabelText(String labeltext) {
-		_wrapped.setLabelText(labeltext);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setDialogFieldChangeListener(org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener)
-	 */
-	public void setDialogFieldChangeListener(IDialogFieldChangeListener listener) {
-		_wrapped.setDialogFieldChangeListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setDialogFieldApplyListener(org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener)
-	 */
-	public void setDialogFieldApplyListener(IDialogFieldApplyListener listener) {
-		_wrapped.setDialogFieldApplyListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setFocus()
-	 */
-	public boolean setFocus() {
-		return _wrapped.setFocus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getNumberOfControls()
-	 */
-	public int getNumberOfControls() {
-		return _wrapped.getNumberOfControls() + 1;
-	}
-
-	/**
-	 * @param enabled
-	 */
-	public void setDatabindingEnabled(boolean enabled) {
-		this._databindingEnabled = enabled;
-		updateDatabindingControl();
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		_wrapped.setEnabled(enabled);
-		updateDatabindingControl();
-	}
-
-	/**
-	 * 
-	 */
-	private void updateDatabindingControl() {
-		if (this._databindingButton != null && !_databindingButton.isDisposed()) {
-			this._databindingButton.setEnabled(this.isEnabled()
-					&& _databindingEnabled && _adapter != null);
-			_databindingButton.redraw();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return _wrapped.isEnabled();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getAttachedData(java.lang.Object)
-	 */
-	public Object getAttachedData(Object key) {
-		return _wrapped.getAttachedData(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#putAttachedData(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public void putAttachedData(Object key, Object value) {
-		_wrapped.putAttachedData(key, value);
-	}
-
-	private void databindingControlPressed() {
-		if (_adapter != null) {
-			_adapter.changeControlPressed(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		_wrapped.handleGrabHorizontal();
-	}
-
-	private IDOMNode getAncester() {
-		return _ancester;
-	}
-
-	private IDOMElement getElement() {
-		return _element;
-	}
-
-	/**
-	 * @return the wrapped field
-	 */
-	public DialogField getWrappedDialogField() {
-		return _wrapped;
-	}
-
-	public boolean isRequired() {
-		return _wrapped.isRequired();
-	}
-
-	public void setToolTip(String toolTip) {
-		_wrapped.setToolTip(toolTip);
-	}
-
-	public Shell getShell() {
-		return _wrapped.getShell();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ExtendedResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ExtendedResourceButtonDialogField.java
deleted file mode 100644
index 0c458ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ExtendedResourceButtonDialogField.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.utils.WebAppUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtendedResourceButtonDialogField extends
-		ResourceButtonDialogField {
-	/**
-	 * @param project
-	 */
-	public ExtendedResourceButtonDialogField(IProject project) {
-		super(project);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField#browseButtonPressed()
-	 */
-	protected String browseButtonPressed() {
-		String url = super.browseButtonPressed();
-		url = WebAppUtil.transformJSPURL(url, this.getReferredFile());
-		return url;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/StyleButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/StyleButtonDialogField.java
deleted file mode 100644
index 0e05a53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/StyleButtonDialogField.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.jst.pagedesigner.ui.dialogs.DialogsMessages;
-import org.eclipse.jst.pagedesigner.ui.dialogs.StyleDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- */
-public class StyleButtonDialogField extends StringButtonDialogField implements
-		IElementContextable {
-	private IDOMElement _element;
-
-	/**
-	 * Equivalent to StyleButtonDialogField(null)
-	 */
-	public StyleButtonDialogField() {
-		this(null);
-	}
-
-	/**
-	 * @param element
-	 */
-	public StyleButtonDialogField(IDOMElement element) {
-		this(null, element);
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				browseButtonPressed();
-			}
-		});
-		setButtonLabel(DialogsMessages.getString("StyleButtonDialogField.Edit"));//$NON-NLS-1$ 
-	}
-
-	/**
-	 * @param adapter
-	 * @param element
-	 */
-	public StyleButtonDialogField(IStringButtonAdapter adapter,
-			IDOMElement element) {
-		super(adapter);
-		_element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-	public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		this._element = element;
-	}
-
-	private void browseButtonPressed() {
-		if (_element instanceof ElementCSSInlineStyle) {
-			ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) _element)
-					.getStyle();
-
-			PreferenceManager manager = new PreferenceManager();
-			Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getShell();
-
-			CSSPropertyContext context = new CSSPropertyContext(
-					styleDeclaration);
-			StyleDialog dialog = new StyleDialog(shell, manager, _element,
-					context);
-			if (dialog.open() == Dialog.OK) {
-				if (!context.isModified()) {
-					return;
-				}
-				ChangeStyleCommand c = new ChangeStyleCommand(_element, context);
-				c.execute();
-
-				String style = (_element == null ? null : _element
-						.getAttribute(IJSFConstants.ATTR_STYLE));
-				setText(style);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroudPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroudPreferenceNode.java
deleted file mode 100644
index b2ed929..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroudPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BackgroudPreferenceNode implements IPreferenceNode {
-	private BackgroundPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BackgroudPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BackgroundPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        //TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Background"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BackgroundPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java
deleted file mode 100644
index e89f95c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BackgroundPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _backgroundImageCombo, _backgroundRepeatCombo,
-			_backgroundAttachmentCombo, _horizontalNumberCombo,
-			_horizontalUnitCombo, _verticalNumberCombo, _verticalUnitCombo;
-
-	private ColorButtonDialogField _backgroundColorField;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BackgroundPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BackgroundPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(3, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		_backgroundColorField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_backgroundColorField.setLabelText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.BackgroundColor")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_backgroundColorField.getLabelControl(null, top).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundColorField.getComboControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		_backgroundColorField.getChangeControl(null, top).setLayoutData(data);
-		_backgroundColorField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _backgroundColorField.getText();
-
-						_style.setBackgroundColor(color);
-					}
-				});
-
-		Label backgroundImageLabel = new Label(top, SWT.NONE);
-		backgroundImageLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.BackgroundImage")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundImageLabel.setLayoutData(data);
-
-		_backgroundImageCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundImageCombo.setItems(IStyleConstants.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundImageCombo.setLayoutData(data);
-		_backgroundImageCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String image = _backgroundImageCombo.getText();
-
-				_style.setBackgroundImage(image);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundRepeatLabel = new Label(top, SWT.NONE);
-		backgroundRepeatLabel
-				.setText(DialogsMessages
-						.getString("BackgroundBoxPreferencePage.BackgroundRepeatLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundRepeatLabel.setLayoutData(data);
-
-		_backgroundRepeatCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundRepeatCombo.setItems(IStyleConstants.REPEAT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundRepeatCombo.setLayoutData(data);
-		_backgroundRepeatCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String repeat = _backgroundRepeatCombo.getText();
-
-				_style.setBackgroundRepeat(repeat);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundAttachmentLabel = new Label(top, SWT.NONE);
-		backgroundAttachmentLabel
-				.setText(DialogsMessages
-						.getString("BackgroundBoxPreferencePage.BackgroundAttachmentLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundAttachmentLabel.setLayoutData(data);
-
-		_backgroundAttachmentCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundAttachmentCombo.setItems(IStyleConstants.ATTACHMENT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundAttachmentCombo.setLayoutData(data);
-		_backgroundAttachmentCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String attachment = _backgroundAttachmentCombo.getText();
-
-				_style.setBackgroundAttachment(attachment);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundHorizontalLabel = new Label(top, SWT.NONE);
-		backgroundHorizontalLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.HorizontalLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundHorizontalLabel.setLayoutData(data);
-
-		_horizontalNumberCombo = new StyleCombo(top, SWT.NONE);
-		_horizontalNumberCombo.setItems(IStyleConstants.POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_horizontalNumberCombo.setLayoutData(data);
-		_horizontalNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_horizontalUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_horizontalNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_horizontalUnitCombo.setEnabled(false);
-				}
-
-				String position = _horizontalNumberCombo.getText();
-				if (_horizontalUnitCombo.isEnabled()) {
-					position += _horizontalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionX(position);
-			}
-		});
-
-		_horizontalUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_horizontalUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL);
-		_horizontalUnitCombo.setLayoutData(data);
-		_horizontalUnitCombo.select(0);
-		_horizontalUnitCombo.setEnabled(false);
-		_horizontalUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _horizontalNumberCombo.getText();
-				if (_horizontalUnitCombo.isEnabled()) {
-					position += _horizontalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionX(position);
-
-			}
-		});
-
-		Label backgroundVerticalLabel = new Label(top, SWT.NONE);
-		backgroundVerticalLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.VerticalLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundVerticalLabel.setLayoutData(data);
-
-		_verticalNumberCombo = new StyleCombo(top, SWT.NONE);
-		_verticalNumberCombo.setItems(IStyleConstants.POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_verticalNumberCombo.setLayoutData(data);
-		_verticalNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_verticalUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_verticalNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_verticalUnitCombo.setEnabled(false);
-				}
-
-				String position = _verticalNumberCombo.getText();
-				if (_verticalUnitCombo.isEnabled()) {
-					position += _verticalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionY(position);
-			}
-		});
-
-		_verticalUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_verticalUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL);
-		_verticalUnitCombo.setLayoutData(data);
-		_verticalUnitCombo.select(0);
-		_verticalUnitCombo.setEnabled(false);
-		_verticalUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _verticalNumberCombo.getText();
-				if (_verticalUnitCombo.isEnabled()) {
-					position += _verticalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionY(position);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// background-color
-		String color = _style.getBackgroundColor();
-		if (!isEmptyString(color)) {
-			_backgroundColorField.setTextWithoutUpdate(color);
-		}
-
-		// background-image
-		String image = _style.getBackgroundImage();
-		if (!isEmptyString(image)) {
-			int index = _backgroundImageCombo.indexOf(image);
-			if (index != -1) {
-				_backgroundImageCombo.select(index);
-			} else {
-				_backgroundImageCombo.setText(image);
-			}
-		}
-
-		// background-repeat
-		String repeat = _style.getBackgroundRepeat();
-		if (!isEmptyString(repeat)) {
-			int index = _backgroundRepeatCombo.indexOf(repeat);
-			if (index != -1) {
-				_backgroundRepeatCombo.select(index);
-			} else {
-				_backgroundRepeatCombo.setText(repeat);
-			}
-		}
-
-		// background-attachment
-		String attachment = _style.getBackgroundAttachment();
-		if (!isEmptyString(attachment)) {
-			int index = _backgroundAttachmentCombo.indexOf(repeat);
-			if (index != -1) {
-				_backgroundAttachmentCombo.select(index);
-			} else {
-				_backgroundAttachmentCombo.setText(attachment);
-			}
-		}
-
-		// background-position
-		String position = _style.getBackgroundPositionX();
-		if (!isEmptyString(position)) {
-			int index = _horizontalNumberCombo.indexOf(position);
-			if (index != -1) {
-				_horizontalNumberCombo.select(index);
-			} else {
-				_horizontalNumberCombo.setText(position);
-			}
-		}
-		position = _style.getBackgroundPositionY();
-		if (!isEmptyString(position)) {
-			int index = _verticalNumberCombo.indexOf(position);
-			if (index != -1) {
-				_verticalNumberCombo.select(index);
-			} else {
-				_verticalNumberCombo.setText(position);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java
deleted file mode 100644
index 2f53009..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BlockPreferenceNode implements IPreferenceNode {
-	private BlockPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BlockPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BlockPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Block"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BlockPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java
deleted file mode 100644
index 786e738..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BlockPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _wordSpacingNumberCombo, _wordSpacingUnitCombo,
-			_letterSpacingNumberCombo, _letterSpacingUnitCombo,
-			_verticalAlignNumberCombo, _verticalAlignUnitCombo,
-			_textAlignCombo, _textIndentUnitCombo, _whiteSpaceCombo,
-			_displayCombo;
-
-	private Text _textIndentText;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BlockPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BlockPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(3, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label wordSpacingLabel = new Label(top, SWT.NONE);
-		wordSpacingLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.WordSpacing")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		wordSpacingLabel.setLayoutData(data);
-
-		_wordSpacingNumberCombo = new StyleCombo(top, SWT.NONE);
-		_wordSpacingNumberCombo.setItems(IStyleConstants.NORMAL);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_wordSpacingNumberCombo.setLayoutData(data);
-		_wordSpacingNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_wordSpacingUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_wordSpacingNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_wordSpacingUnitCombo.setEnabled(false);
-				}
-
-				String spacing = _wordSpacingNumberCombo.getText();
-				if (_wordSpacingUnitCombo.isEnabled()) {
-					spacing += _wordSpacingUnitCombo.getText();
-				}
-
-				_style.setWordSpacing(spacing);
-			}
-		});
-
-		_wordSpacingUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_wordSpacingUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_wordSpacingUnitCombo.setLayoutData(data);
-		_wordSpacingUnitCombo.select(0);
-		_wordSpacingUnitCombo.setEnabled(false);
-		_wordSpacingUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String spacing = _wordSpacingNumberCombo.getText();
-				if (_wordSpacingUnitCombo.isEnabled()) {
-					spacing += _wordSpacingUnitCombo.getText();
-				}
-
-				_style.setWordSpacing(spacing);
-
-			}
-		});
-
-		Label letterSpacingLabel = new Label(top, SWT.NONE);
-		letterSpacingLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.LetterSpacing")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		letterSpacingLabel.setLayoutData(data);
-
-		_letterSpacingNumberCombo = new StyleCombo(top, SWT.NONE);
-		_letterSpacingNumberCombo.setItems(IStyleConstants.NORMAL);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_letterSpacingNumberCombo.setLayoutData(data);
-		_letterSpacingNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_letterSpacingUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_letterSpacingNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_letterSpacingUnitCombo.setEnabled(false);
-				}
-
-				String spacing = _letterSpacingNumberCombo.getText();
-				if (_letterSpacingUnitCombo.isEnabled()) {
-					spacing += _letterSpacingUnitCombo.getText();
-				}
-
-				_style.setLetterSpacing(spacing);
-			}
-		});
-
-		_letterSpacingUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_letterSpacingUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_letterSpacingUnitCombo.setLayoutData(data);
-		_letterSpacingUnitCombo.select(0);
-		_letterSpacingUnitCombo.setEnabled(false);
-		_letterSpacingUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String spacing = _letterSpacingNumberCombo.getText();
-				if (_letterSpacingUnitCombo.isEnabled()) {
-					spacing += _letterSpacingUnitCombo.getText();
-				}
-
-				_style.setLetterSpacing(spacing);
-			}
-		});
-
-		Label verticalAlignLabel = new Label(top, SWT.NONE);
-		verticalAlignLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.VerticalAlign")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		verticalAlignLabel.setLayoutData(data);
-
-		_verticalAlignNumberCombo = new StyleCombo(top, SWT.NONE);
-		_verticalAlignNumberCombo.setItems(IStyleConstants.VERTICAL_ALIGN);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_verticalAlignNumberCombo.setLayoutData(data);
-		_verticalAlignNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_verticalAlignUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_verticalAlignNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_verticalAlignUnitCombo.setEnabled(false);
-				}
-
-				String align = _verticalAlignNumberCombo.getText();
-				if (_verticalAlignUnitCombo.isEnabled()) {
-					align += _verticalAlignUnitCombo.getText();
-				}
-
-				_style.setVerticalAlign(align);
-			}
-		});
-
-		_verticalAlignUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_verticalAlignUnitCombo.setItems(IStyleConstants.PERCENT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_verticalAlignUnitCombo.setLayoutData(data);
-		_verticalAlignUnitCombo.select(0);
-		_verticalAlignUnitCombo.setEnabled(false);
-		_verticalAlignUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String align = _verticalAlignNumberCombo.getText();
-				if (_verticalAlignUnitCombo.isEnabled()) {
-					align += _verticalAlignUnitCombo.getText();
-				}
-
-				_style.setVerticalAlign(align);
-			}
-		});
-
-		Label textAlignLabel = new Label(top, SWT.NONE);
-		textAlignLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.TextAlign")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		textAlignLabel.setLayoutData(data);
-
-		_textAlignCombo = new StyleCombo(top, SWT.NONE);
-		_textAlignCombo.setItems(IStyleConstants.TEXT_ALIGN);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textAlignCombo.setLayoutData(data);
-		_textAlignCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String align = _textAlignCombo.getText();
-
-				_style.setTextAlign(align);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label textIndentLabel = new Label(top, SWT.NONE);
-		textIndentLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.TextIndent")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		textIndentLabel.setLayoutData(data);
-
-		_textIndentText = new Text(top, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textIndentText.setLayoutData(data);
-		_textIndentText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_textIndentUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_textIndentText.getText());
-				} catch (NumberFormatException ex) {
-					_textIndentUnitCombo.setEnabled(false);
-				}
-
-				String indent = _textIndentText.getText();
-				if (_textIndentUnitCombo.isEnabled()) {
-					indent += _textIndentUnitCombo.getText();
-				}
-
-				_style.setTextIndent(indent);
-			}
-		});
-
-		_textIndentUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_textIndentUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textIndentUnitCombo.setLayoutData(data);
-		_textIndentUnitCombo.select(0);
-		_textIndentUnitCombo.setEnabled(false);
-		_textIndentUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String indent = _textIndentText.getText();
-				if (_textIndentUnitCombo.isEnabled()) {
-					indent += _textIndentUnitCombo.getText();
-				}
-
-				_style.setTextIndent(indent);
-			}
-		});
-
-		Label whiteSpaceLabel = new Label(top, SWT.NONE);
-		whiteSpaceLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.WhiteSpace")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		whiteSpaceLabel.setLayoutData(data);
-
-		_whiteSpaceCombo = new StyleCombo(top, SWT.NONE);
-		_whiteSpaceCombo.setItems(IStyleConstants.WHITE_SPACE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_whiteSpaceCombo.setLayoutData(data);
-		_whiteSpaceCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String space = _whiteSpaceCombo.getText();
-
-				_style.setWhiteSpace(space);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label displayLabel = new Label(top, SWT.NONE);
-		displayLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.Display")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		displayLabel.setLayoutData(data);
-
-		_displayCombo = new StyleCombo(top, SWT.NONE);
-		_displayCombo.setItems(IStyleConstants.DISPLAY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_displayCombo.setLayoutData(data);
-		_displayCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String display = _displayCombo.getText();
-
-				_style.setDisplay(display);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// word-spacing
-		String spacing = _style.getWordSpacing();
-		if (!isEmptyString(spacing)) {
-			int index = _wordSpacingNumberCombo.indexOf(spacing);
-			if (index != -1) {
-				_wordSpacingNumberCombo.select(index);
-			} else {
-				_wordSpacingNumberCombo.setText(spacing);
-			}
-		}
-
-		// letter-spacing
-		spacing = _style.getLetterSpacing();
-		if (!isEmptyString(spacing)) {
-			int index = _letterSpacingNumberCombo.indexOf(spacing);
-			if (index != -1) {
-				_letterSpacingNumberCombo.select(index);
-			} else {
-				_letterSpacingNumberCombo.setText(spacing);
-			}
-		}
-
-		// veritcal-align
-		String align = _style.getVerticalAlign();
-		if (!isEmptyString(align)) {
-			int index = _verticalAlignNumberCombo.indexOf(align);
-			if (index != -1) {
-				_verticalAlignNumberCombo.select(index);
-			} else {
-				_verticalAlignNumberCombo.setText(align);
-			}
-		}
-
-		// text-align
-		align = _style.getTextAlign();
-		if (!isEmptyString(align)) {
-			int index = _textAlignCombo.indexOf(align);
-			if (index != -1) {
-				_textAlignCombo.select(index);
-			} else {
-				_textAlignCombo.setText(align);
-			}
-		}
-
-		// text-indent
-		String indent = _style.getTextIndent();
-		if (!isEmptyString(indent)) {
-			_textIndentText.setText(indent);
-		}
-
-		// white-space
-		String space = _style.getWhiteSpace();
-		if (!isEmptyString(space)) {
-			int index = _whiteSpaceCombo.indexOf(space);
-			if (index != -1) {
-				_whiteSpaceCombo.select(index);
-			} else {
-				_whiteSpaceCombo.setText(space);
-			}
-		}
-
-		// display
-		String display = _style.getDisplay();
-		if (!isEmptyString(display)) {
-			int index = _displayCombo.indexOf(display);
-			if (index != -1) {
-				_displayCombo.select(index);
-			} else {
-				_displayCombo.setText(display);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-    // TODO: seeing this method repeated in on other preference pages..
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferenceNode.java
deleted file mode 100644
index 2707d94..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BorderPreferenceNode implements IPreferenceNode {
-	private BorderPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BorderPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BorderPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Border"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BorderPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java
deleted file mode 100644
index 858bf5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BorderPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _styleTopCombo, _styleRightCombo, _styleBottomCombo,
-			_styleLeftCombo;
-
-	private StyleCombo _widthTopNumberCombo, _widthRightNumberCombo,
-			_widthBottomNumberCombo, _widthLeftNumberCombo;
-
-	private StyleCombo _widthTopUnitCombo, _widthRightUnitCombo,
-			_widthBottomUnitCombo, _widthLeftUnitCombo;
-
-	private ColorButtonDialogField _colorTopField, _colorRightField,
-			_colorBottomField, _colorLeftField;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BorderPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BorderPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(1, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Group styleGroup = new Group(top, SWT.NONE);
-		styleGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Style")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		styleGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		styleGroup.setLayout(layout);
-
-		Label styleTopLabel = new Label(styleGroup, SWT.NONE);
-		styleTopLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleTopLabel.setLayoutData(data);
-
-		_styleTopCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleTopCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleTopCombo.setLayoutData(data);
-		_styleTopCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleTopCombo.getText();
-				_style.setBorderTopStyle(style);
-			}
-		});
-
-		Label styleRightLabel = new Label(styleGroup, SWT.NONE);
-		styleRightLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleRightLabel.setLayoutData(data);
-
-		_styleRightCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleRightCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleRightCombo.setLayoutData(data);
-		_styleRightCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleRightCombo.getText();
-				_style.setBorderRightStyle(style);
-			}
-		});
-
-		Label styleBottomLabel = new Label(styleGroup, SWT.NONE);
-		styleBottomLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleBottomLabel.setLayoutData(data);
-
-		_styleBottomCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleBottomCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleBottomCombo.setLayoutData(data);
-		_styleBottomCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleBottomCombo.getText();
-				_style.setBorderBottomStyle(style);
-			}
-		});
-
-		Label styleLeftLabel = new Label(styleGroup, SWT.NONE);
-		styleLeftLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleLeftLabel.setLayoutData(data);
-
-		_styleLeftCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleLeftCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleLeftCombo.setLayoutData(data);
-		_styleLeftCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleLeftCombo.getText();
-				_style.setBorderLeftStyle(style);
-			}
-		});
-
-		Group colorGroup = new Group(top, SWT.NONE);
-		colorGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Color")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		colorGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		colorGroup.setLayout(layout);
-
-		_colorTopField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorTopField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Top")); //$NON-NLS-1$
-
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorTopField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorTopField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorTopField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorTopField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorTopField.getText();
-						_style.setBorderTopColor(color);
-					}
-				});
-
-		_colorRightField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorRightField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorRightField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorRightField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorRightField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorRightField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorRightField.getText();
-						_style.setBorderRightColor(color);
-					}
-				});
-
-		_colorBottomField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorBottomField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorBottomField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorBottomField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorBottomField.getChangeControl(null, colorGroup)
-				.setLayoutData(data);
-		_colorBottomField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorBottomField.getText();
-						_style.setBorderBottomColor(color);
-					}
-				});
-
-		_colorLeftField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorLeftField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorLeftField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorLeftField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorLeftField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorLeftField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorLeftField.getText();
-						_style.setBorderLeftColor(color);
-					}
-				});
-
-		Group widthGroup = new Group(top, SWT.NONE);
-		widthGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Width")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		widthGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		widthGroup.setLayout(layout);
-
-		Label widthTopLabel = new Label(widthGroup, SWT.NONE);
-		widthTopLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthTopLabel.setLayoutData(data);
-
-		_widthTopNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthTopNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthTopNumberCombo.setLayoutData(data);
-		_widthTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthTopUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthTopNumberCombo.getText();
-				if (_widthTopUnitCombo.isEnabled()) {
-					width += _widthTopUnitCombo.getText();
-				}
-
-				_style.setBorderTopWidth(width);
-			}
-		});
-
-		_widthTopUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthTopUnitCombo.setLayoutData(data);
-		_widthTopUnitCombo.select(0);
-		_widthTopUnitCombo.setEnabled(false);
-		_widthTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthTopNumberCombo.getText();
-				if (_widthTopUnitCombo.isEnabled()) {
-					width += _widthTopUnitCombo.getText();
-				}
-
-				_style.setBorderTopWidth(width);
-			}
-		});
-
-		Label widthRightLabel = new Label(widthGroup, SWT.NONE);
-		widthRightLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthRightLabel.setLayoutData(data);
-
-		_widthRightNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthRightNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthRightNumberCombo.setLayoutData(data);
-		_widthRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthRightUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthRightNumberCombo.getText();
-				if (_widthRightUnitCombo.isEnabled()) {
-					width += _widthRightUnitCombo.getText();
-				}
-
-				_style.setBorderRightWidth(width);
-			}
-		});
-
-		_widthRightUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthRightUnitCombo.setLayoutData(data);
-		_widthRightUnitCombo.select(0);
-		_widthRightUnitCombo.setEnabled(false);
-		_widthRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthRightNumberCombo.getText();
-				if (_widthRightUnitCombo.isEnabled()) {
-					width += _widthRightUnitCombo.getText();
-				}
-
-				_style.setBorderRightWidth(width);
-			}
-		});
-
-		Label widthBottomLabel = new Label(widthGroup, SWT.NONE);
-		widthBottomLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthBottomLabel.setLayoutData(data);
-
-		_widthBottomNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthBottomNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthBottomNumberCombo.setLayoutData(data);
-		_widthBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthBottomUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthBottomNumberCombo.getText();
-				if (_widthBottomUnitCombo.isEnabled()) {
-					width += _widthBottomUnitCombo.getText();
-				}
-
-				_style.setBorderBottomWidth(width);
-			}
-		});
-
-		_widthBottomUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthBottomUnitCombo.setLayoutData(data);
-		_widthBottomUnitCombo.select(0);
-		_widthBottomUnitCombo.setEnabled(false);
-		_widthBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthBottomNumberCombo.getText();
-				if (_widthBottomUnitCombo.isEnabled()) {
-					width += _widthBottomUnitCombo.getText();
-				}
-
-				_style.setBorderBottomWidth(width);
-			}
-		});
-
-		Label widthLeftLabel = new Label(widthGroup, SWT.NONE);
-		widthLeftLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLeftLabel.setLayoutData(data);
-
-		_widthLeftNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthLeftNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthLeftNumberCombo.setLayoutData(data);
-		_widthLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthLeftUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthLeftNumberCombo.getText();
-				if (_widthLeftUnitCombo.isEnabled()) {
-					width += _widthLeftUnitCombo.getText();
-				}
-
-				_style.setBorderLeftWidth(width);
-			}
-		});
-
-		_widthLeftUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthLeftUnitCombo.setLayoutData(data);
-		_widthLeftUnitCombo.select(0);
-		_widthLeftUnitCombo.setEnabled(false);
-		_widthLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthLeftNumberCombo.getText();
-				if (_widthLeftUnitCombo.isEnabled()) {
-					width += _widthLeftUnitCombo.getText();
-				}
-
-				_style.setBorderLeftWidth(width);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// border-style
-		String style = _style.getBorderTopStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleTopCombo.indexOf(style);
-			if (index != -1) {
-				_styleTopCombo.select(index);
-			} else {
-				_styleTopCombo.setText(style);
-			}
-		}
-		style = _style.getBorderRightStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleRightCombo.indexOf(style);
-			if (index != -1) {
-				_styleRightCombo.select(index);
-			} else {
-				_styleRightCombo.setText(style);
-			}
-		}
-		style = _style.getBorderBottomStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleBottomCombo.indexOf(style);
-			if (index != -1) {
-				_styleBottomCombo.select(index);
-			} else {
-				_styleBottomCombo.setText(style);
-			}
-		}
-		style = _style.getBorderLeftStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleLeftCombo.indexOf(style);
-			if (index != -1) {
-				_styleLeftCombo.select(index);
-			} else {
-				_styleLeftCombo.setText(style);
-			}
-		}
-
-		// border-color
-		String color = _style.getBorderTopColor();
-		if (!isEmptyString(color)) {
-			_colorTopField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderRightColor();
-		if (!isEmptyString(color)) {
-			_colorRightField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderBottomColor();
-		if (!isEmptyString(color)) {
-			_colorBottomField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderLeftColor();
-		if (!isEmptyString(color)) {
-			_colorLeftField.setTextWithoutUpdate(color);
-		}
-
-		// border-width
-		String width = _style.getBorderTopWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthTopNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthTopNumberCombo.select(index);
-			} else {
-				_widthTopNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderRightWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthRightNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthRightNumberCombo.select(index);
-			} else {
-				_widthRightNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderBottomWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthBottomNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthBottomNumberCombo.select(index);
-			} else {
-				_widthBottomNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderLeftWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthLeftNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthLeftNumberCombo.select(index);
-			} else {
-				_widthLeftNumberCombo.setText(width);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java
deleted file mode 100644
index 0813ac4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BoxPreferenceNode implements IPreferenceNode {
-	private BoxPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _styles;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BoxPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_styles = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: this pattern is being repeated; perhaps need common super for preference nodes?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BoxPreferencePage(_element, _styles);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Box"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BoxPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java
deleted file mode 100644
index ecd70c7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java
+++ /dev/null
@@ -1,673 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BoxPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _widthNumberCombo, _widthUnitCombo, _heightNumberCombo,
-			_heightUnitCombo, _clearCombo;
-
-	private Text _paddingTopNumberText, _paddingRightNumberText,
-			_paddingBottomNumberText, _paddingLeftNumberText;
-
-	private StyleCombo _paddingTopUnitCombo, _paddingRightUnitCombo,
-			_paddingBottomUnitCombo, _paddingLeftUnitCombo;
-
-	private StyleCombo _marginTopNumberCombo, _marginRightNumberCombo,
-			_marginBottomNumberCombo, _marginLeftNumberCombo;
-
-	private StyleCombo _marginTopUnitCombo, _marginRightUnitCombo,
-			_marginBottomUnitCombo, _marginLeftUnitCombo;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BoxPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BoxPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(6, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label widthLabel = new Label(top, SWT.NONE);
-		widthLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Width")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLabel.setLayoutData(data);
-
-		_widthNumberCombo = new StyleCombo(top, SWT.NONE);
-		_widthNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthNumberCombo.setLayoutData(data);
-		_widthNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		_widthUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_widthUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthUnitCombo.setLayoutData(data);
-		_widthUnitCombo.select(0);
-		_widthUnitCombo.setEnabled(false);
-		_widthUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		Label clearLabel = new Label(top, SWT.NONE);
-		clearLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Clear")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clearLabel.setLayoutData(data);
-
-		_clearCombo = new StyleCombo(top, SWT.NONE);
-		_clearCombo.setItems(IStyleConstants.CLEAR);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clearCombo.setLayoutData(data);
-		_clearCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clear = _clearCombo.getText();
-				_style.setClear(clear);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label heightLabel = new Label(top, SWT.NONE);
-		heightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Height")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		heightLabel.setLayoutData(data);
-
-		_heightNumberCombo = new StyleCombo(top, SWT.NONE);
-		_heightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightNumberCombo.setLayoutData(data);
-		_heightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_heightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_heightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_heightUnitCombo.setEnabled(false);
-				}
-
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		_heightUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_heightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightUnitCombo.setLayoutData(data);
-		_heightUnitCombo.select(0);
-		_heightUnitCombo.setEnabled(false);
-		_heightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightNumberCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-		new Label(top, SWT.NONE);
-		new Label(top, SWT.NONE);
-
-		Group paddingGroup = new Group(top, SWT.NONE);
-		paddingGroup.setText(DialogsMessages
-				.getString("BoxPreferencePage.Padding")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		paddingGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		paddingGroup.setLayout(layout);
-
-		Label paddingTopLabel = new Label(paddingGroup, SWT.NONE);
-		paddingTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingTopLabel.setLayoutData(data);
-
-		_paddingTopNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingTopNumberText.setLayoutData(data);
-		_paddingTopNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingTopNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingTopUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingTopNumberText.getText();
-				if (_paddingTopUnitCombo.isEnabled()) {
-					padding += _paddingTopUnitCombo.getText();
-				}
-
-				_style.setPaddingTop(padding);
-			}
-		});
-
-		_paddingTopUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingTopUnitCombo.setLayoutData(data);
-		_paddingTopUnitCombo.select(0);
-		_paddingTopUnitCombo.setEnabled(false);
-		_paddingTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingTopNumberText.getText();
-				if (_paddingTopUnitCombo.isEnabled()) {
-					padding += _paddingTopUnitCombo.getText();
-				}
-
-				_style.setPaddingTop(padding);
-			}
-		});
-
-		Label paddingRightLabel = new Label(paddingGroup, SWT.NONE);
-		paddingRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingRightLabel.setLayoutData(data);
-
-		_paddingRightNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingRightNumberText.setLayoutData(data);
-		_paddingRightNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingRightNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingRightUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingRightNumberText.getText();
-				if (_paddingRightUnitCombo.isEnabled()) {
-					padding += _paddingRightUnitCombo.getText();
-				}
-
-				_style.setPaddingRight(padding);
-			}
-		});
-
-		_paddingRightUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingRightUnitCombo.setLayoutData(data);
-		_paddingRightUnitCombo.select(0);
-		_paddingRightUnitCombo.setEnabled(false);
-		_paddingRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingRightNumberText.getText();
-				if (_paddingRightUnitCombo.isEnabled()) {
-					padding += _paddingRightUnitCombo.getText();
-				}
-
-				_style.setPaddingRight(padding);
-			}
-		});
-
-		Label paddingBottomLabel = new Label(paddingGroup, SWT.NONE);
-		paddingBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingBottomLabel.setLayoutData(data);
-
-		_paddingBottomNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingBottomNumberText.setLayoutData(data);
-		_paddingBottomNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingBottomNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingBottomUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingBottomNumberText.getText();
-				if (_paddingBottomUnitCombo.isEnabled()) {
-					padding += _paddingBottomUnitCombo.getText();
-				}
-
-				_style.setPaddingBottom(padding);
-			}
-		});
-
-		_paddingBottomUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingBottomUnitCombo.setLayoutData(data);
-		_paddingBottomUnitCombo.select(0);
-		_paddingBottomUnitCombo.setEnabled(false);
-		_paddingBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingBottomNumberText.getText();
-				if (_paddingBottomUnitCombo.isEnabled()) {
-					padding += _paddingBottomUnitCombo.getText();
-				}
-
-				_style.setPaddingBottom(padding);
-			}
-		});
-
-		Label paddingLeftLabel = new Label(paddingGroup, SWT.NONE);
-		paddingLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingLeftLabel.setLayoutData(data);
-
-		_paddingLeftNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingLeftNumberText.setLayoutData(data);
-		_paddingLeftNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingLeftNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _paddingLeftNumberText.getText();
-				if (_paddingLeftUnitCombo.isEnabled()) {
-					top1 += _paddingLeftUnitCombo.getText();
-				}
-
-				_style.setPaddingLeft(top1);
-			}
-		});
-
-		_paddingLeftUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingLeftUnitCombo.setLayoutData(data);
-		_paddingLeftUnitCombo.select(0);
-		_paddingLeftUnitCombo.setEnabled(false);
-		_paddingLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _paddingLeftNumberText.getText();
-				if (_paddingLeftUnitCombo.isEnabled()) {
-					top1 += _paddingLeftUnitCombo.getText();
-				}
-
-				_style.setPaddingLeft(top1);
-			}
-		});
-
-		Group marginGroup = new Group(top, SWT.NONE);
-		marginGroup.setText(DialogsMessages
-				.getString("BoxPreferencePage.Margin")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		marginGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		marginGroup.setLayout(layout);
-
-		Label marginTopLabel = new Label(marginGroup, SWT.NONE);
-		marginTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginTopLabel.setLayoutData(data);
-
-		_marginTopNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginTopNumberCombo.setLayoutData(data);
-		_marginTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginTopUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginTopNumberCombo.getText();
-				if (_marginTopUnitCombo.isEnabled()) {
-					margin += _marginTopUnitCombo.getText();
-				}
-
-				_style.setMarginTop(margin);
-			}
-		});
-
-		_marginTopUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginTopUnitCombo.setLayoutData(data);
-		_marginTopUnitCombo.select(0);
-		_marginTopUnitCombo.setEnabled(false);
-		_marginTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginTopNumberCombo.getText();
-				if (_marginTopUnitCombo.isEnabled()) {
-					margin += _marginTopUnitCombo.getText();
-				}
-
-				_style.setMarginTop(margin);
-			}
-		});
-
-		Label marginRightLabel = new Label(marginGroup, SWT.NONE);
-		marginRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginRightLabel.setLayoutData(data);
-
-		_marginRightNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginRightNumberCombo.setLayoutData(data);
-		_marginRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginRightUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginRightNumberCombo.getText();
-				if (_marginRightUnitCombo.isEnabled()) {
-					margin += _marginRightUnitCombo.getText();
-				}
-
-				_style.setMarginRight(margin);
-			}
-		});
-
-		_marginRightUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginRightUnitCombo.setLayoutData(data);
-		_marginRightUnitCombo.select(0);
-		_marginRightUnitCombo.setEnabled(false);
-		_marginRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginRightNumberCombo.getText();
-				if (_marginRightUnitCombo.isEnabled()) {
-					margin += _marginRightUnitCombo.getText();
-				}
-
-				_style.setMarginRight(margin);
-			}
-		});
-
-		Label marginBottomLabel = new Label(marginGroup, SWT.NONE);
-		marginBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginBottomLabel.setLayoutData(data);
-
-		_marginBottomNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginBottomNumberCombo.setLayoutData(data);
-		_marginBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginBottomUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginBottomNumberCombo.getText();
-				if (_marginBottomUnitCombo.isEnabled()) {
-					margin += _marginBottomUnitCombo.getText();
-				}
-
-				_style.setMarginBottom(margin);
-			}
-		});
-
-		_marginBottomUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginBottomUnitCombo.setLayoutData(data);
-		_marginBottomUnitCombo.select(0);
-		_marginBottomUnitCombo.setEnabled(false);
-		_marginBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginBottomNumberCombo.getText();
-				if (_marginBottomUnitCombo.isEnabled()) {
-					margin += _marginBottomUnitCombo.getText();
-				}
-
-				_style.setMarginBottom(margin);
-			}
-		});
-
-		Label marginLeftLabel = new Label(marginGroup, SWT.NONE);
-		marginLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginLeftLabel.setLayoutData(data);
-
-		_marginLeftNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginLeftNumberCombo.setLayoutData(data);
-		_marginLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _marginLeftNumberCombo.getText();
-				if (_marginLeftUnitCombo.isEnabled()) {
-					top1 += _marginLeftUnitCombo.getText();
-				}
-
-				_style.setMarginLeft(top1);
-			}
-		});
-
-		_marginLeftUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginLeftUnitCombo.setLayoutData(data);
-		_marginLeftUnitCombo.select(0);
-		_marginLeftUnitCombo.setEnabled(false);
-		_marginLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _marginLeftNumberCombo.getText();
-				if (_marginLeftUnitCombo.isEnabled()) {
-					top1 += _marginLeftUnitCombo.getText();
-				}
-
-				_style.setMarginLeft(top1);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// width
-		String width = _style.getWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthNumberCombo.select(index);
-			} else {
-				_widthNumberCombo.setText(width);
-			}
-		}
-
-		// height
-		String height = _style.getHeight();
-		if (!isEmptyString(height)) {
-			int index = _heightNumberCombo.indexOf(height);
-			if (index != -1) {
-				_heightNumberCombo.select(index);
-			} else {
-				_heightNumberCombo.setText(height);
-			}
-		}
-
-		// clear
-		String clear = _style.getClear();
-		if (!isEmptyString(clear)) {
-			int index = _clearCombo.indexOf(clear);
-			if (index != -1) {
-				_clearCombo.select(index);
-			} else {
-				_clearCombo.setText(clear);
-			}
-		}
-
-		// padding
-		String padding = _style.getPaddingTop();
-		if (!isEmptyString(padding)) {
-			_paddingTopNumberText.setText(padding);
-		}
-		padding = _style.getPaddingRight();
-		if (!isEmptyString(padding)) {
-			_paddingRightNumberText.setText(padding);
-		}
-		padding = _style.getPaddingBottom();
-		if (!isEmptyString(padding)) {
-			_paddingBottomNumberText.setText(padding);
-		}
-		padding = _style.getPaddingLeft();
-		if (!isEmptyString(padding)) {
-			_paddingLeftNumberText.setText(padding);
-		}
-
-		// margin
-		String margin = _style.getMarginTop();
-		if (!isEmptyString(margin)) {
-			int index = _marginTopNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginTopNumberCombo.select(index);
-			} else {
-				_marginTopNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginRight();
-		if (!isEmptyString(margin)) {
-			int index = _marginRightNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginRightNumberCombo.select(index);
-			} else {
-				_marginRightNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginBottom();
-		if (!isEmptyString(margin)) {
-			int index = _marginBottomNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginBottomNumberCombo.select(index);
-			} else {
-				_marginBottomNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginLeft();
-		if (!isEmptyString(margin)) {
-			int index = _marginLeftNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginLeftNumberCombo.select(index);
-			} else {
-				_marginLeftNumberCombo.setText(margin);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java
deleted file mode 100644
index a8590fa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorPalette;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColorUtil extends ColorPalette {
-	private static final Map EXTENDED_COLORS = new HashMap(20);
-
-	private static final Map BASIC_COLORS = new HashMap(143);
-
-	static {
-		BASIC_COLORS.put("Aqua", new Color(null, 0x00, 0xFF, 0xFF)); //$NON-NLS-1$
-		BASIC_COLORS.put("Black", new Color(null, 0x00, 0x00, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Blue", new Color(null, 0x00, 0x00, 0xFF)); //$NON-NLS-1$
-		BASIC_COLORS.put("Fuchsia", new Color(null, 0xFF, 0x00, 0xFF)); //$NON-NLS-1$
-		BASIC_COLORS.put("Gray", new Color(null, 0x80, 0x80, 0x80)); //$NON-NLS-1$
-		BASIC_COLORS.put("Green", new Color(null, 0x00, 0x80, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Lime", new Color(null, 0x00, 0xFF, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Maroon", new Color(null, 0x80, 0x00, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Navy", new Color(null, 0x00, 0x00, 0x80)); //$NON-NLS-1$
-		BASIC_COLORS.put("Olive", new Color(null, 0x80, 0x80, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Purple", new Color(null, 0x80, 0x00, 0x80)); //$NON-NLS-1$
-		BASIC_COLORS.put("Red", new Color(null, 0xFF, 0x00, 0x00)); //$NON-NLS-1$
-		BASIC_COLORS.put("Silver", new Color(null, 0xC0, 0xC0, 0xC0)); //$NON-NLS-1$
-		BASIC_COLORS.put("Teal", new Color(null, 0x00, 0x80, 0x80)); //$NON-NLS-1$
-		BASIC_COLORS.put("White", new Color(null, 0xFF, 0xFF, 0xFF)); //$NON-NLS-1$
-		BASIC_COLORS.put("Yellow", new Color(null, 0xFF, 0xFF, 0x00)); //$NON-NLS-1$
-	}
-
-	static {
-		EXTENDED_COLORS.put("AliceBlue", new Color(null, 0xF0, 0xF8, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("AntiqueWhite", new Color(null, 0xFA, 0xEB, 0xD7)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Aqua", new Color(null, 0x00, 0xFF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Aquamarine", new Color(null, 0x7F, 0xFF, 0xD4)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Azure", new Color(null, 0xF0, 0xFF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Beige", new Color(null, 0xF5, 0xF5, 0xDC)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Bisque", new Color(null, 0xFF, 0xE4, 0xC4)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Black", new Color(null, 0x00, 0x00, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("BlanchedAlmond", new Color(null, 0xFF, 0xEB, 0xCD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Blue", new Color(null, 0x00, 0x00, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("BlueViolet", new Color(null, 0x8A, 0x2B, 0xE2)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Brown", new Color(null, 0xA5, 0x2A, 0x2A)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("BurlyWood", new Color(null, 0xDE, 0xB8, 0x87)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("CadetBlue", new Color(null, 0x5F, 0x9E, 0xA0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Chartreuse", new Color(null, 0x7F, 0xFF, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Chocolate", new Color(null, 0xD2, 0x69, 0x1E)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Coral", new Color(null, 0xFF, 0x7F, 0x50)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("CornflowerBlue", new Color(null, 0x64, 0x95, 0xED)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Cornsilk", new Color(null, 0xFF, 0xF8, 0xDC)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Crimson", new Color(null, 0xDC, 0x14, 0x3C)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Cyan", new Color(null, 0x00, 0xFF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkBlue", new Color(null, 0x00, 0x00, 0x8B)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkCyan", new Color(null, 0x00, 0x8B, 0x8B)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkGoldenRod", new Color(null, 0xB8, 0x86, 0x0B)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkGray", new Color(null, 0xA9, 0xA9, 0xA9)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkGreen", new Color(null, 0x00, 0x64, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkKhaki", new Color(null, 0xBD, 0xB7, 0x6B)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkMagenta", new Color(null, 0x8B, 0x00, 0x8B)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("DarkOliveGreen", new Color(null, 0x55, 0x6B, 0x2F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Darkorange", new Color(null, 0xFF, 0x8C, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkOrchid", new Color(null, 0x99, 0x32, 0xCC)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkRed", new Color(null, 0x8B, 0x00, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkSalmon", new Color(null, 0xE9, 0x96, 0x7A)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkSeaGreen", new Color(null, 0x8F, 0xBC, 0x8F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkSlateBlue", new Color(null, 0x48, 0x3D, 0x8B)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkSlateGray", new Color(null, 0x2F, 0x4F, 0x4F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkTurquoise", new Color(null, 0x00, 0xCE, 0xD1)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DarkViolet", new Color(null, 0x94, 0x00, 0xD3)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DeepPink", new Color(null, 0xFF, 0x14, 0x93)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DeepSkyBlue", new Color(null, 0x00, 0xBF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DimGray", new Color(null, 0x69, 0x69, 0x69)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("DodgerBlue", new Color(null, 0x1E, 0x90, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Feldspar", new Color(null, 0xD1, 0x92, 0x75)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("FireBrick", new Color(null, 0xB2, 0x22, 0x22)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("FloralWhite", new Color(null, 0xFF, 0xFA, 0xF0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("ForestGreen", new Color(null, 0x22, 0x8B, 0x22)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Fuchsia", new Color(null, 0xFF, 0x00, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Gainsboro", new Color(null, 0xDC, 0xDC, 0xDC)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("GhostWhite", new Color(null, 0xF8, 0xF8, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Gold", new Color(null, 0xFF, 0xD7, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("GoldenRod", new Color(null, 0xDA, 0xA5, 0x20)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Gray", new Color(null, 0x80, 0x80, 0x80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Green", new Color(null, 0x00, 0x80, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("GreenYellow", new Color(null, 0xAD, 0xFF, 0x2F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("HoneyDew", new Color(null, 0xF0, 0xFF, 0xF0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("HotPink", new Color(null, 0xFF, 0x69, 0xB4)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("IndianRed", new Color(null, 0xCD, 0x5C, 0x5C)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Indigo", new Color(null, 0x4B, 0x00, 0x82)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Ivory", new Color(null, 0xFF, 0xFF, 0xF0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Khaki", new Color(null, 0xF0, 0xE6, 0x8C)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Lavender", new Color(null, 0xE6, 0xE6, 0xFA)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LavenderBlush", new Color(null, 0xFF, 0xF0, 0xF5)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LawnGreen", new Color(null, 0x7C, 0xFC, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LemonChiffon", new Color(null, 0xFF, 0xFA, 0xCD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightBlue", new Color(null, 0xAD, 0xD8, 0xE6)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightCoral", new Color(null, 0xF0, 0x80, 0x80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightCyan", new Color(null, 0xE0, 0xFF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightGoldenRodYellow", new Color(null, 0xFA, 0xFA, //$NON-NLS-1$
-				0xD2));
-		EXTENDED_COLORS.put("LightGrey", new Color(null, 0xD3, 0xD3, 0xD3)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightGreen", new Color(null, 0x90, 0xEE, 0x90)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightPink", new Color(null, 0xFF, 0xB6, 0xC1)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightSalmon", new Color(null, 0xFF, 0xA0, 0x7A)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightSeaGreen", new Color(null, 0x20, 0xB2, 0xAA)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightSkyBlue", new Color(null, 0x87, 0xCE, 0xFA)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("LightSlateBlue", new Color(null, 0x84, 0x70, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("LightSlateGray", new Color(null, 0x77, 0x88, 0x99)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("LightSteelBlue", new Color(null, 0xB0, 0xC4, 0xDE)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LightYellow", new Color(null, 0xFF, 0xFF, 0xE0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Lime", new Color(null, 0x00, 0xFF, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("LimeGreen", new Color(null, 0x32, 0xCD, 0x32)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Linen", new Color(null, 0xFA, 0xF0, 0xE6)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Magenta", new Color(null, 0xFF, 0x00, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Maroon", new Color(null, 0x80, 0x00, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MediumAquaMarine", new Color(null, 0x66, 0xCD, //$NON-NLS-1$
-				0xAA));
-		EXTENDED_COLORS.put("MediumBlue", new Color(null, 0x00, 0x00, 0xCD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MediumOrchid", new Color(null, 0xBA, 0x55, 0xD3)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MediumPurple", new Color(null, 0x93, 0x70, 0xD8)); //$NON-NLS-1$
-		EXTENDED_COLORS
-				.put("MediumSeaGreen", new Color(null, 0x3C, 0xB3, 0x71)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MediumSlateBlue", //$NON-NLS-1$
-				new Color(null, 0x7B, 0x68, 0xEE));
-		EXTENDED_COLORS.put("MediumSpringGreen", new Color(null, 0x00, 0xFA, //$NON-NLS-1$
-				0x9A));
-		EXTENDED_COLORS.put("MediumTurquoise", //$NON-NLS-1$
-				new Color(null, 0x48, 0xD1, 0xCC));
-		EXTENDED_COLORS.put("MediumVioletRed", //$NON-NLS-1$
-				new Color(null, 0xC7, 0x15, 0x85));
-		EXTENDED_COLORS.put("MidnightBlue", new Color(null, 0x19, 0x19, 0x70)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MintCream", new Color(null, 0xF5, 0xFF, 0xFA)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("MistyRose", new Color(null, 0xFF, 0xE4, 0xE1)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Moccasin", new Color(null, 0xFF, 0xE4, 0xB5)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("NavajoWhite", new Color(null, 0xFF, 0xDE, 0xAD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Navy", new Color(null, 0x00, 0x00, 0x80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("OldLace", new Color(null, 0xFD, 0xF5, 0xE6)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Olive", new Color(null, 0x80, 0x80, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("OliveDrab", new Color(null, 0x6B, 0x8E, 0x23)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Orange", new Color(null, 0xFF, 0xA5, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("OrangeRed", new Color(null, 0xFF, 0x45, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Orchid", new Color(null, 0xDA, 0x70, 0xD6)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PaleGoldenRod", new Color(null, 0xEE, 0xE8, 0xAA)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PaleGreen", new Color(null, 0x98, 0xFB, 0x98)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PaleTurquoise", new Color(null, 0xAF, 0xEE, 0xEE)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PaleVioletRed", new Color(null, 0xD8, 0x70, 0x93)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PapayaWhip", new Color(null, 0xFF, 0xEF, 0xD5)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PeachPuff", new Color(null, 0xFF, 0xDA, 0xB9)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Peru", new Color(null, 0xCD, 0x85, 0x3F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Pink", new Color(null, 0xFF, 0xC0, 0xCB)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Plum", new Color(null, 0xDD, 0xA0, 0xDD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("PowderBlue", new Color(null, 0xB0, 0xE0, 0xE6)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Purple", new Color(null, 0x80, 0x00, 0x80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Red", new Color(null, 0xFF, 0x00, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("RosyBrown", new Color(null, 0xBC, 0x8F, 0x8F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("RoyalBlue", new Color(null, 0x41, 0x69, 0xE1)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SaddleBrown", new Color(null, 0x8B, 0x45, 0x13)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Salmon", new Color(null, 0xFA, 0x80, 0x72)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SandyBrown", new Color(null, 0xF4, 0xA4, 0x60)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SeaGreen", new Color(null, 0x2E, 0x8B, 0x57)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SeaShell", new Color(null, 0xFF, 0xF5, 0xEE)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Sienna", new Color(null, 0xA0, 0x52, 0x2D)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Silver", new Color(null, 0xC0, 0xC0, 0xC0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SkyBlue", new Color(null, 0x87, 0xCE, 0xEB)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SlateBlue", new Color(null, 0x6A, 0x5A, 0xCD)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SlateGray", new Color(null, 0x70, 0x80, 0x90)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Snow", new Color(null, 0xFF, 0xFA, 0xFA)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SpringGreen", new Color(null, 0x00, 0xFF, 0x7F)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("SteelBlue", new Color(null, 0x46, 0x82, 0xB4)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Tan", new Color(null, 0xD2, 0xB4, 0x8C)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Teal", new Color(null, 0x00, 0x80, 0x80)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Thistle", new Color(null, 0xD8, 0xBF, 0xD8)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Tomato", new Color(null, 0xFF, 0x63, 0x47)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Turquoise", new Color(null, 0x40, 0xE0, 0xD0)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Violet", new Color(null, 0xEE, 0x82, 0xEE)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("VioletRed", new Color(null, 0xD0, 0x20, 0x90)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Wheat", new Color(null, 0xF5, 0xDE, 0xB3)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("White", new Color(null, 0xFF, 0xFF, 0xFF)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("WhiteSmoke", new Color(null, 0xF5, 0xF5, 0xF5)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("Yellow", new Color(null, 0xFF, 0xFF, 0x00)); //$NON-NLS-1$
-		EXTENDED_COLORS.put("YellowGreen", new Color(null, 0x9A, 0xCD, 0x32)); //$NON-NLS-1$
-	}
-
-	public final Map getBasicColorMap() {
-		return Collections.unmodifiableMap(BASIC_COLORS);
-	}
-
-	public final Map getExtendedColorMap() {
-		return Collections.unmodifiableMap(EXTENDED_COLORS);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java
deleted file mode 100644
index 612d976..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DialogsMessages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.ui.dialogs.DialogsMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private DialogsMessages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the value for key or !!key!! if none
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.properties
deleted file mode 100644
index 6a49cd0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.properties
+++ /dev/null
@@ -1,99 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-StyleButtonDialogField.Edit=Edit...
-StyleDialog.Title=CSS Style Definition
-
-TextPreferenceNode.LabelText=Text
-TextPreferencePage.Title=Text
-TextPreferencePage.Font=Font:
-TextPreferencePage.Size=Size:
-TextPreferencePage.Weight=Weight:
-TextPreferencePage.Style=Style:
-TextPreferencePage.Variant=Variant:
-TextPreferencePage.LineHeight=Line Height:
-TextPreferencePage.Case=Case:
-TextPreferencePage.Decoration=Decoration:
-TextPreferencePage.Color=Color:
-
-BackgroundPreferenceNode.LabelText=Background
-BackgroundPreferencePage.Title=Background
-BackgroundBoxPreferencePage.BackgroundColor=Background color:
-BackgroundBoxPreferencePage.BackgroundImage=Background image:
-BackgroundBoxPreferencePage.BackgroundRepeatLabel=Repeat:
-BackgroundBoxPreferencePage.BackgroundAttachmentLabel=Attachment:
-BackgroundBoxPreferencePage.HorizontalLabel=Horizontal position:
-BackgroundBoxPreferencePage.VerticalLabel=Vertical position:
-
-BlockPreferenceNode.LabelText=Block
-BlockPreferencePage.Title=Block
-BlockPreferencePage.WordSpacing=Word spacing:
-BlockPreferencePage.LetterSpacing=Letter spacing:
-BlockPreferencePage.VerticalAlign=Vertical align:
-BlockPreferencePage.TextAlign=Text align:
-BlockPreferencePage.TextIndent=Text indent:
-BlockPreferencePage.WhiteSpace=White space:
-BlockPreferencePage.Display=Display:
-
-BoxPreferenceNode.LabelText=Box
-BoxPreferencePage.Title=Box
-BoxPreferencePage.Width=Width:
-BoxPreferencePage.Clear=Clear:
-BoxPreferencePage.Height=Height:
-BoxPreferencePage.Padding=Padding
-BoxPreferencePage.Margin=Margin
-BoxPreferencePage.Top=Top:
-BoxPreferencePage.Right=Right:
-BoxPreferencePage.Bottom=Bottom:
-BoxPreferencePage.Left=Left:
-
-BorderPreferenceNode.LabelText=Border
-BorderPreferencePage.Title=Border
-BorderPreferencePage.Style=Style
-BorderPreferencePage.Width=Width
-BorderPreferencePage.Color=Color
-BorderPreferencePage.Top=Top:
-BorderPreferencePage.Right=Right:
-BorderPreferencePage.Bottom=Bottom:
-BorderPreferencePage.Left=Left:
-
-ListPreferenceNode.LabelText=List
-ListPreferencePage.Title=List
-ListPreferencePage.Type=Type:
-ListPreferencePage.Image=Bullet image:
-ListPreferencePage.Position=Position:
-
-PositioningPreferenceNode.LabelText=Positioning
-PositioningPreferencePage.Title=Positioning
-PositioningPreferencePage.Type=Type:
-PositioningPreferencePage.Visibility=Visibility:
-PositioningPreferencePage.Width=Width:
-PositioningPreferencePage.ZIndex=Z-Index:
-PositioningPreferencePage.Height=Height:
-PositioningPreferencePage.Overflow=Overflow:
-PositioningPreferencePage.Placement=Placement
-PositioningPreferencePage.Clip=Clip
-PositioningPreferencePage.Right=Right:
-PositioningPreferencePage.Bottom=Bottom:
-PositioningPreferencePage.Left=Left:
-
-ExtensionsPreferenceNode.LabelText=Extensions
-ExtensionsPreferencePage.Title=Extensions
-ExtensionsPreferencePage.PageBreak=Page break
-ExtensionsPreferencePage.Before=Before:
-ExtensionsPreferencePage.After=After:
-ExtensionsPreferencePage.VisualEffect=Visual effect
-ExtensionsPreferencePage.Cursor=Cursor:
-
-WPEPropertyPage.Description=Select a tag library to see associated skins and set a current skin.
-WPEPropertyPage.TagLibs.Label=&Tag libraries:
-WPEPropertyPage.Skins.Label=Associated &skins:
-WPEPropertyPage.Current.Button=&Current
-WPEPropertyPage.Skins.Item.Current=(current)
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java
deleted file mode 100644
index 4eab2d2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionsPreferenceNode implements IPreferenceNode {
-	private ExtensionsPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public ExtensionsPreferenceNode(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new ExtensionsPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Extensions"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("ExtensionsPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java
deleted file mode 100644
index 7f9f42d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionsPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _beforeCombo, _afterCombo, _cursorCombo;
-
-	/**
-	 * Creates an instance.
-	 * 
-	 * @param element IDOMElement instance.
-	 * @param style CSSPropertyContext instance.
-	 */
-	public ExtensionsPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("ExtensionsPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(1, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Group pageGroup = new Group(top, SWT.NONE);
-		pageGroup.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.PageBreak")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		pageGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		pageGroup.setLayout(layout);
-
-		Label beforeLabel = new Label(pageGroup, SWT.NONE);
-		beforeLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.Before")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		beforeLabel.setLayoutData(data);
-
-		_beforeCombo = new StyleCombo(pageGroup, SWT.NONE);
-		_beforeCombo.setItems(IStyleConstants.PAGE_BREAK);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_beforeCombo.setLayoutData(data);
-		_beforeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String page = _beforeCombo.getText();
-				_style.setPageBreakBefore(page);
-			}
-		});
-
-		Label afterLabel = new Label(pageGroup, SWT.NONE);
-		afterLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.After")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		afterLabel.setLayoutData(data);
-
-		_afterCombo = new StyleCombo(pageGroup, SWT.NONE);
-		_afterCombo.setItems(IStyleConstants.PAGE_BREAK);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_afterCombo.setLayoutData(data);
-		_afterCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String page = _afterCombo.getText();
-				_style.setPageBreakAfter(page);
-			}
-		});
-
-		Group visualGroup = new Group(top, SWT.NONE);
-		visualGroup.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.VisualEffect")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		visualGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		visualGroup.setLayout(layout);
-
-		Label cursorLabel = new Label(visualGroup, SWT.NONE);
-		cursorLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.Cursor")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		cursorLabel.setLayoutData(data);
-
-		_cursorCombo = new StyleCombo(visualGroup, SWT.NONE);
-		_cursorCombo.setItems(IStyleConstants.CURSOR);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_cursorCombo.setLayoutData(data);
-		_cursorCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String cursor = _cursorCombo.getText();
-				_style.setCursor(cursor);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// page-break-before
-		String page = _style.getPageBreakBefore();
-		if (!isEmptyString(page)) {
-			int index = _beforeCombo.indexOf(page);
-			if (index != -1) {
-				_beforeCombo.select(index);
-			} else {
-				_beforeCombo.setText(page);
-			}
-		}
-
-		// page-break-after
-		page = _style.getPageBreakAfter();
-		if (!isEmptyString(page)) {
-			int index = _afterCombo.indexOf(page);
-			if (index != -1) {
-				_afterCombo.select(index);
-			} else {
-				_afterCombo.setText(page);
-			}
-		}
-
-		// cursor
-		String cursor = _style.getCursor();
-		if (!isEmptyString(cursor)) {
-			int index = _cursorCombo.indexOf(cursor);
-			if (index != -1) {
-				_cursorCombo.select(index);
-			} else {
-				_cursorCombo.setText(cursor);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java
deleted file mode 100644
index 3ca24c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IStyleConstants {
-	/**
-	 * attachment constants
-	 */
-	final public static String[] ATTACHMENT = { "fixed", "scroll" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * auto constants
-	 */
-	final public static String[] AUTO = { "auto" }; //$NON-NLS-1$
-
-	/**
-	 * border style constants
-	 */
-	final public static String[] BORDER_STYLE = { "none", "dotted", "dashed", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"solid", "double", "groove", "ridge", "inset", "outset" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-
-	/**
-	 * border width constants
-	 */
-	final public static String[] BORDER_WIDTH = { "thin", "medium", "thick" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * clear constants
-	 */
-	final public static String[] CLEAR = { "left", "right", "both", "none" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-
-	/**
-	 * color constants
-	 */
-	final public static String[] COLOR = { "black", "blue", "gray", "green", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-			"orange", "red", "white", "yellow", "aqua", "fuchsia", "lime", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
-			"maroon", "navy", "olive", "purple", "silver", "teal" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-
-	/**
-	 * display constants
-	 */
-	final public static String[] DISPLAY = { "none", "inline", "block", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"list-item", "run-in", "compact", "marker", "table", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			"inline-table", "table-row-group", "table-header-group", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"table-footer-group", "table-row", "table-column-group", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"table-column", "table-cell", "table-caption" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * float constants
-	 */
-	final public static String[] FLOAT = { "left", "right", "none" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * font family constants
-	 */
-	final public static String[] FONT_FAMILY = { "Verdana, Arial, Sans-Serif", //$NON-NLS-1$
-			"Tahoma, Verdana, Arial, Sans-Serif", "\"Times New Roman\", Serif", //$NON-NLS-1$ //$NON-NLS-2$
-			"Georgia, \"Times New Roman\", Serif", //$NON-NLS-1$
-			"\"Book Antiqua\", \"Times New Roman\", Serif", //$NON-NLS-1$
-			"\"Comic Sans MS\", Sans-Serif", "\"Courier New\", Courier", //$NON-NLS-1$ //$NON-NLS-2$
-			"\"Trebuchet MS\", Sans-Serif" }; //$NON-NLS-1$
-
-	/**
-	 * font size constants
-	 */
-	final public static String[] FONT_SIZE_NUMBER = { "9", "10", "12", "14", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-			"16", "18", "24", "36", "xx-small", "x-small", "small", "medium", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-			"large", "x-large", "xx-large", "smaller", "larger" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-
-	/**
-	 * font style constants
-	 */
-	final public static String[] FONT_STYLE = { "normal", "italic", "oblique" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * font transform constants
-	 */
-	final public static String[] FONT_TEXTTRANSFORM = { "capitalize", //$NON-NLS-1$
-			"uppercase", "lowercase", "none" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * font variant constants
-	 */
-	final public static String[] FONT_VARIANT = { "normal", "small-caps" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * font weight constants
-	 */
-	final public static String[] FONT_WEIGHT = { "normal", "bold", "bolder", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"lighter", "100", "200", "300", "400", "500", "600", "700", "800", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
-			"900" }; //$NON-NLS-1$
-
-	/**
-	 * list position constants
-	 */
-	final public static String[] LIST_POSITION = { "inside", "outside" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * list type constants
-	 */
-	final public static String[] LIST_TYPE = { "disc", "circle", "sqaure", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"decimal", "lower-roman", "upper-roman", "lower-alpha", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-			"upper-alpah", "none" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * none
-	 */
-	final public static String[] NONE = { "none" }; //$NON-NLS-1$
-
-	/**
-	 * normal
-	 */
-	final public static String[] NORMAL = { "normal" }; //$NON-NLS-1$
-
-	/**
-	 * percent
-	 */
-	final public static String[] PERCENT = { "%" }; //$NON-NLS-1$
-
-	/**
-	 * position constants
-	 */
-	final public static String[] POSITION = { "left", "center", "right" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * positioning type constants
-	 */
-	final public static String[] POSITIONING_TYPE = { "absolute", "relative", //$NON-NLS-1$ //$NON-NLS-2$
-			"static" }; //$NON-NLS-1$
-
-	/**
-	 * repeat constants
-	 */
-	final public static String[] REPEAT = { "no-repeat", "repeat", "repeat-x", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"repeat-y" }; //$NON-NLS-1$
-
-	/**
-	 * unit of size constants
-	 */
-	final public static String[] SIZE_UNIT = { "px", "pt", "in", "cm", "mm", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			"pc", "em", "ex", "%" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-
-	/**
-	 * text align constants
-	 */
-	final public static String[] TEXT_ALIGN = { "left", "right", "center", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"justify" }; //$NON-NLS-1$
-
-	/**
-	 * text decoration constants
-	 */
-	final public static String[] TEXT_DECORATION = { "underline", "overline", //$NON-NLS-1$ //$NON-NLS-2$
-			"line-through", "blink", "none" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * veritical align constants
-	 */
-	final public static String[] VERTICAL_ALIGN = { "baseline", "sub", "super", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"top", "text-top", "middle", "bottom", "text-bottom" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-
-	/**
-	 * white space constants
-	 */
-	final public static String[] WHITE_SPACE = { "normal", "pre", "nowrap" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * visibility constants
-	 */
-	final public static String[] VISIBILITY = { "inherit", "visible", "hidden" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	/**
-	 * overflow constants
-	 */
-	final public static String[] OVERFLOW = { "visible", "hidden", "scroll", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"auto" }; //$NON-NLS-1$
-
-	/**
-	 * page break constants
-	 */
-	final public static String[] PAGE_BREAK = { "auto", "always", "left", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"right" }; //$NON-NLS-1$
-
-	/**
-	 * cursor constants
-	 */
-	final public static String[] CURSOR = { "hand", "crosshair", "text", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			"wait", "default", "help", "e-resize", "ne-resize", "n-resize", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
-			"nw-resize", "w-resize", "sw-resize", "s-resize", "se-resize", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			"auto" }; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java
deleted file mode 100644
index 8964d7b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ListPreferenceNode implements IPreferenceNode {
-	private ListPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public ListPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new ListPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "List"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("ListPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java
deleted file mode 100644
index eda6fa5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ListPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _typeCombo, _imageCombo, _positionCombo;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public ListPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("ListPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(2, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label typeLabel = new Label(top, SWT.NONE);
-		typeLabel.setText(DialogsMessages.getString("ListPreferencePage.Type")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		typeLabel.setLayoutData(data);
-
-		_typeCombo = new StyleCombo(top, SWT.NONE);
-		_typeCombo.setItems(IStyleConstants.LIST_TYPE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_typeCombo.setLayoutData(data);
-		_typeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String type = _typeCombo.getText();
-				_style.setListStyleType(type);
-			}
-		});
-
-		Label imageLabel = new Label(top, SWT.NONE);
-		imageLabel.setText(DialogsMessages
-				.getString("ListPreferencePage.Image")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		imageLabel.setLayoutData(data);
-
-		_imageCombo = new StyleCombo(top, SWT.NONE);
-		_imageCombo.setItems(IStyleConstants.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_imageCombo.setLayoutData(data);
-		_imageCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String image = _imageCombo.getText();
-				_style.setListStyleImage(image);
-			}
-		});
-
-		Label positionLabel = new Label(top, SWT.NONE);
-		positionLabel.setText(DialogsMessages
-				.getString("ListPreferencePage.Position")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		positionLabel.setLayoutData(data);
-
-		_positionCombo = new StyleCombo(top, SWT.NONE);
-		_positionCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_positionCombo.setLayoutData(data);
-		_positionCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _positionCombo.getText();
-				_style.setListStylePosition(position);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// list-style-tyle
-		String type = _style.getListStyleType();
-		if (!isEmptyString(type)) {
-			int index = _typeCombo.indexOf(type);
-			if (index != -1) {
-				_typeCombo.select(index);
-			} else {
-				_typeCombo.setText(type);
-			}
-		}
-
-		// list-style-image
-		String image = _style.getListStyleImage();
-		if (!isEmptyString(image)) {
-			int index = _imageCombo.indexOf(image);
-			if (index != -1) {
-				_imageCombo.select(index);
-			} else {
-				_imageCombo.setText(image);
-			}
-		}
-
-		// list-style-position
-		String position = _style.getListStylePosition();
-		if (!isEmptyString(position)) {
-			int index = _positionCombo.indexOf(position);
-			if (index != -1) {
-				_positionCombo.select(index);
-			} else {
-				_positionCombo.setText(position);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferenceNode.java
deleted file mode 100644
index fec8192..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositioningPreferenceNode implements IPreferenceNode {
-	private PositioningPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public PositioningPreferenceNode(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new PositioningPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Positioning"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("PositioningPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java
deleted file mode 100644
index 026769b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java
+++ /dev/null
@@ -1,782 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositioningPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private Combo _typeCombo, _visibilityCombo, _widthNumberCombo,
-			_widthUnitCombo, _zIndexCombo, _heightNumberCombo,
-			_heightUnitCombo, _overflowCombo;
-
-	private Combo _placementTopNumberCombo, _placementRightNumberCombo,
-			_placementBottomNumberCombo, _placementLeftNumberCombo;
-
-	private Combo _placementTopUnitCombo, _placementRightUnitCombo,
-			_placementBottomUnitCombo, _placementLeftUnitCombo;
-
-	private Combo _clipTopNumberCombo, _clipRightNumberCombo,
-			_clipBottomNumberCombo, _clipLeftNumberCombo;
-
-	private Combo _clipTopUnitCombo, _clipRightUnitCombo, _clipBottomUnitCombo,
-			_clipLeftUnitCombo;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public PositioningPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("PositioningPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(6, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label typeLabel = new Label(top, SWT.NONE);
-		typeLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Type")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		typeLabel.setLayoutData(data);
-
-		_typeCombo = new Combo(top, SWT.NONE);
-		_typeCombo.setItems(IStyleConstants.POSITIONING_TYPE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 2;
-		_typeCombo.setLayoutData(data);
-		_typeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String type = _typeCombo.getText();
-				_style.setPosition(type);
-			}
-		});
-
-		Label visibilityLabel = new Label(top, SWT.NONE);
-		visibilityLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Visibility")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		visibilityLabel.setLayoutData(data);
-
-		_visibilityCombo = new Combo(top, SWT.NONE);
-		_visibilityCombo.setItems(IStyleConstants.VISIBILITY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_visibilityCombo.setLayoutData(data);
-		_visibilityCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String visibility = _visibilityCombo.getText();
-				_style.setVisibility(visibility);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label widthLabel = new Label(top, SWT.NONE);
-		widthLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Width")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLabel.setLayoutData(data);
-
-		_widthNumberCombo = new Combo(top, SWT.NONE);
-		_widthNumberCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthNumberCombo.setLayoutData(data);
-		_widthNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		_widthUnitCombo = new Combo(top, SWT.READ_ONLY);
-		_widthUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthUnitCombo.setLayoutData(data);
-		_widthUnitCombo.select(0);
-		_widthUnitCombo.setEnabled(false);
-		_widthUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		Label zIndexLabel = new Label(top, SWT.NONE);
-		zIndexLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.ZIndex")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		zIndexLabel.setLayoutData(data);
-
-		_zIndexCombo = new Combo(top, SWT.NONE);
-		_zIndexCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_zIndexCombo.setLayoutData(data);
-		_zIndexCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String index = _zIndexCombo.getText();
-				_style.setZIndex(index);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label heightLabel = new Label(top, SWT.NONE);
-		heightLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Height")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		heightLabel.setLayoutData(data);
-
-		_heightNumberCombo = new Combo(top, SWT.NONE);
-		_heightNumberCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightNumberCombo.setLayoutData(data);
-		_heightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_heightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_heightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_heightUnitCombo.setEnabled(false);
-				}
-
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		_heightUnitCombo = new Combo(top, SWT.READ_ONLY);
-		_heightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightUnitCombo.setLayoutData(data);
-		_heightUnitCombo.select(0);
-		_heightUnitCombo.setEnabled(false);
-		_heightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		Label overflowLabel = new Label(top, SWT.NONE);
-		overflowLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Overflow")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		overflowLabel.setLayoutData(data);
-
-		_overflowCombo = new Combo(top, SWT.NONE);
-		_overflowCombo.setItems(IStyleConstants.OVERFLOW);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_overflowCombo.setLayoutData(data);
-		_overflowCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String overflow = _overflowCombo.getText();
-				_style.setOverflow(overflow);
-			}
-		});
-
-		Group placementGroup = new Group(top, SWT.NONE);
-		placementGroup.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Placement")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		placementGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		placementGroup.setLayout(layout);
-
-		Label placementTopLabel = new Label(placementGroup, SWT.NONE);
-		placementTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementTopLabel.setLayoutData(data);
-
-		_placementTopNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementTopNumberCombo.setLayoutData(data);
-		_placementTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementTopUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementTopNumberCombo.getText();
-				if (_placementTopUnitCombo.isEnabled()) {
-					placement += _placementTopUnitCombo.getText();
-				}
-
-				_style.setTop(placement);
-			}
-		});
-
-		_placementTopUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementTopUnitCombo.setLayoutData(data);
-		_placementTopUnitCombo.select(0);
-		_placementTopUnitCombo.setEnabled(false);
-		_placementTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementTopNumberCombo.getText();
-				if (_placementTopUnitCombo.isEnabled()) {
-					placement += _placementTopUnitCombo.getText();
-				}
-
-				_style.setTop(placement);
-			}
-		});
-
-		Label placementRightLabel = new Label(placementGroup, SWT.NONE);
-		placementRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementRightLabel.setLayoutData(data);
-
-		_placementRightNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementRightNumberCombo.setLayoutData(data);
-		_placementRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementRightUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementRightNumberCombo.getText();
-				if (_placementRightUnitCombo.isEnabled()) {
-					placement += _placementRightUnitCombo.getText();
-				}
-
-				_style.setRight(placement);
-			}
-		});
-
-		_placementRightUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementRightUnitCombo.setLayoutData(data);
-		_placementRightUnitCombo.select(0);
-		_placementRightUnitCombo.setEnabled(false);
-		_placementRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementRightNumberCombo.getText();
-				if (_placementRightUnitCombo.isEnabled()) {
-					placement += _placementRightUnitCombo.getText();
-				}
-
-				_style.setRight(placement);
-			}
-		});
-
-		Label placementBottomLabel = new Label(placementGroup, SWT.NONE);
-		placementBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementBottomLabel.setLayoutData(data);
-
-		_placementBottomNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementBottomNumberCombo.setLayoutData(data);
-		_placementBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementBottomUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementBottomNumberCombo.getText();
-				if (_placementBottomUnitCombo.isEnabled()) {
-					placement += _placementBottomUnitCombo.getText();
-				}
-
-				_style.setBottom(placement);
-			}
-		});
-
-		_placementBottomUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementBottomUnitCombo.setLayoutData(data);
-		_placementBottomUnitCombo.select(0);
-		_placementBottomUnitCombo.setEnabled(false);
-		_placementBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementBottomNumberCombo.getText();
-				if (_placementBottomUnitCombo.isEnabled()) {
-					placement += _placementBottomUnitCombo.getText();
-				}
-
-				_style.setBottom(placement);
-			}
-		});
-
-		Label placementLeftLabel = new Label(placementGroup, SWT.NONE);
-		placementLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementLeftLabel.setLayoutData(data);
-
-		_placementLeftNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementLeftNumberCombo.setLayoutData(data);
-		_placementLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _placementLeftNumberCombo.getText();
-				if (_placementLeftUnitCombo.isEnabled()) {
-					top1 += _placementLeftUnitCombo.getText();
-				}
-
-				_style.setLeft(top1);
-			}
-		});
-
-		_placementLeftUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementLeftUnitCombo.setLayoutData(data);
-		_placementLeftUnitCombo.select(0);
-		_placementLeftUnitCombo.setEnabled(false);
-		_placementLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _placementLeftNumberCombo.getText();
-				if (_placementLeftUnitCombo.isEnabled()) {
-					top1 += _placementLeftUnitCombo.getText();
-				}
-
-				_style.setLeft(top1);
-			}
-		});
-
-		Group clipGroup = new Group(top, SWT.NONE);
-		clipGroup.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Clip")); //$NON-NLS-1$
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		clipGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		clipGroup.setLayout(layout);
-
-		Label clipTopLabel = new Label(clipGroup, SWT.NONE);
-		clipTopLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipTopLabel.setLayoutData(data);
-
-		_clipTopNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipTopNumberCombo.setLayoutData(data);
-		_clipTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipTopUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipTopNumberCombo.getText();
-				if (_clipTopUnitCombo.isEnabled()) {
-					clip += _clipTopUnitCombo.getText();
-				}
-
-				_style.setClipTop(clip);
-			}
-		});
-
-		_clipTopUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipTopUnitCombo.setLayoutData(data);
-		_clipTopUnitCombo.select(0);
-		_clipTopUnitCombo.setEnabled(false);
-		_clipTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipTopNumberCombo.getText();
-				if (_clipTopUnitCombo.isEnabled()) {
-					clip += _clipTopUnitCombo.getText();
-				}
-
-				_style.setClipTop(clip);
-			}
-		});
-
-		Label clipRightLabel = new Label(clipGroup, SWT.NONE);
-		clipRightLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipRightLabel.setLayoutData(data);
-
-		_clipRightNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipRightNumberCombo.setLayoutData(data);
-		_clipRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipRightUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipRightNumberCombo.getText();
-				if (_clipRightUnitCombo.isEnabled()) {
-					clip += _clipRightUnitCombo.getText();
-				}
-
-				_style.setClipRight(clip);
-			}
-		});
-
-		_clipRightUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipRightUnitCombo.setLayoutData(data);
-		_clipRightUnitCombo.select(0);
-		_clipRightUnitCombo.setEnabled(false);
-		_clipRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipRightNumberCombo.getText();
-				if (_clipRightUnitCombo.isEnabled()) {
-					clip += _clipRightUnitCombo.getText();
-				}
-
-				_style.setClipRight(clip);
-			}
-		});
-
-		Label clipBottomLabel = new Label(clipGroup, SWT.NONE);
-		clipBottomLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipBottomLabel.setLayoutData(data);
-
-		_clipBottomNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipBottomNumberCombo.setLayoutData(data);
-		_clipBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipBottomUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipBottomNumberCombo.getText();
-				if (_clipBottomUnitCombo.isEnabled()) {
-					clip += _clipBottomUnitCombo.getText();
-				}
-
-				_style.setClipBottom(clip);
-			}
-		});
-
-		_clipBottomUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipBottomUnitCombo.setLayoutData(data);
-		_clipBottomUnitCombo.select(0);
-		_clipBottomUnitCombo.setEnabled(false);
-		_clipBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipBottomNumberCombo.getText();
-				if (_clipBottomUnitCombo.isEnabled()) {
-					clip += _clipBottomUnitCombo.getText();
-				}
-
-				_style.setClipBottom(clip);
-			}
-		});
-
-		Label clipLeftLabel = new Label(clipGroup, SWT.NONE);
-		clipLeftLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipLeftLabel.setLayoutData(data);
-
-		_clipLeftNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipLeftNumberCombo.setLayoutData(data);
-		_clipLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _clipLeftNumberCombo.getText();
-				if (_clipLeftUnitCombo.isEnabled()) {
-					top1 += _clipLeftUnitCombo.getText();
-				}
-
-				_style.setClipLeft(top1);
-			}
-		});
-
-		_clipLeftUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipLeftUnitCombo.setLayoutData(data);
-		_clipLeftUnitCombo.select(0);
-		_clipLeftUnitCombo.setEnabled(false);
-		_clipLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _clipLeftNumberCombo.getText();
-				if (_clipLeftUnitCombo.isEnabled()) {
-					top1 += _clipLeftUnitCombo.getText();
-				}
-
-				_style.setClipLeft(top1);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// position
-		String position = _style.getPosition();
-		if (!isEmptyString(position)) {
-			int index = _typeCombo.indexOf(position);
-			if (index != -1) {
-				_typeCombo.select(index);
-			} else {
-				_typeCombo.setText(position);
-			}
-		}
-
-		// visibility
-		String visibility = _style.getVisibility();
-		if (!isEmptyString(visibility)) {
-			int index = _visibilityCombo.indexOf(visibility);
-			if (index != -1) {
-				_visibilityCombo.select(index);
-			} else {
-				_visibilityCombo.setText(visibility);
-			}
-		}
-
-		// width
-		String width = _style.getWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthNumberCombo.select(index);
-			} else {
-				_widthNumberCombo.setText(width);
-			}
-		}
-
-		// z-index
-		String zindex = _style.getZIndex();
-		if (!isEmptyString(zindex)) {
-			int index = _zIndexCombo.indexOf(zindex);
-			if (index != -1) {
-				_zIndexCombo.select(index);
-			} else {
-				_zIndexCombo.setText(zindex);
-			}
-		}
-
-		// height
-		String height = _style.getHeight();
-		if (!isEmptyString(height)) {
-			int index = _heightNumberCombo.indexOf(height);
-			if (index != -1) {
-				_heightNumberCombo.select(index);
-			} else {
-				_heightNumberCombo.setText(height);
-			}
-		}
-
-		// overflow
-		String overflow = _style.getOverflow();
-		if (!isEmptyString(overflow)) {
-			int index = _overflowCombo.indexOf(overflow);
-			if (index != -1) {
-				_overflowCombo.select(index);
-			} else {
-				_overflowCombo.setText(overflow);
-			}
-		}
-
-		// placement
-		String placement = _style.getTop();
-		if (!isEmptyString(placement)) {
-			int index = _placementTopNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementTopNumberCombo.select(index);
-			} else {
-				_placementTopNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getRight();
-		if (!isEmptyString(placement)) {
-			int index = _placementRightNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementRightNumberCombo.select(index);
-			} else {
-				_placementRightNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getBottom();
-		if (!isEmptyString(placement)) {
-			int index = _placementBottomNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementBottomNumberCombo.select(index);
-			} else {
-				_placementBottomNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getLeft();
-		if (!isEmptyString(placement)) {
-			int index = _placementLeftNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementLeftNumberCombo.select(index);
-			} else {
-				_placementLeftNumberCombo.setText(placement);
-			}
-		}
-
-		// clip
-		String clip = _style.getClipTop();
-		if (!isEmptyString(clip)) {
-			int index = _clipTopNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipTopNumberCombo.select(index);
-			} else {
-				_clipTopNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipRight();
-		if (!isEmptyString(clip)) {
-			int index = _clipRightNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipRightNumberCombo.select(index);
-			} else {
-				_clipRightNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipBottom();
-		if (!isEmptyString(clip)) {
-			int index = _clipBottomNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipBottomNumberCombo.select(index);
-			} else {
-				_clipBottomNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipLeft();
-		if (!isEmptyString(clip)) {
-			int index = _clipLeftNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipLeftNumberCombo.select(index);
-			} else {
-				_clipLeftNumberCombo.setText(clip);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-        }	
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java
deleted file mode 100644
index e50a885..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleCombo extends Combo {
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public StyleCombo(Composite parent, int style) {
-		super(parent, style);
-		this.addControlListener(new ControlAdapter() {
-			public void controlResized(ControlEvent e) {
-				Combo combo = (Combo) e.widget;
-				combo.setSelection(new Point(0, 0));
-			}
-		});
-	}
-
-	protected void checkSubclass() {
-        // override subclass validation, otherwise Widget.isValidSubclass
-        // will throw an error
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java
deleted file mode 100644
index 7c36d32..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleDialog extends PreferenceDialog {
-	/**
-	 * @param parentShell
-	 * @param manager
-	 * @param element 
-	 * @param style 
-	 */
-	public StyleDialog(Shell parentShell, PreferenceManager manager,
-			IDOMElement element, CSSPropertyContext style) {
-		super(parentShell, manager);
-		manager.addToRoot(new TextPreferenceNode(element, style));
-		manager.addToRoot(new BackgroudPreferenceNode(element, style));
-		manager.addToRoot(new BlockPreferenceNode(element, style));
-		manager.addToRoot(new BoxPreferenceNode(element, style));
-		manager.addToRoot(new BorderPreferenceNode(element, style));
-		manager.addToRoot(new ListPreferenceNode(element, style));
-		manager.addToRoot(new PositioningPreferenceNode(element, style));
-		manager.addToRoot(new ExtensionsPreferenceNode(element, style));
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		Control control = super.createDialogArea(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-				PDPlugin.getResourceString("StyleDialog.help.id")); //$NON-NLS-1$
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				getTreeViewer().getControl(),
-				PDPlugin.getResourceString("StyleDialog.help.id")); //$NON-NLS-1$
-		return control;
-	}
-
-	protected void update() {
-		super.update();
-		getShell().setText(DialogsMessages.getString("StyleDialog.Title")); //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java
deleted file mode 100644
index f88c0df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextPreferenceNode implements IPreferenceNode {
-	private TextPreferencePage _page;
-
-	private CSSPropertyContext _style;
-
-	private IDOMElement _element;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public TextPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new TextPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Text"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("TextPreferenceNode.LabelText"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java
deleted file mode 100644
index b830708..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java
+++ /dev/null
@@ -1,525 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _fontFamilyCombo, _fontSizeNumberCombo,
-			_fontSizeUnitCombo, _fontWeightCombo, _fontStyleCombo,
-			_fontVariantCombo, _fontLineHeightNumberCombo,
-			_fontLineHeightUnitCombo, _textTransformCombo;
-
-	private ColorButtonDialogField _colorField;
-
-	private Button _textDecorationUnderlineButton,
-			_textDecorationOverlineButton, _textDecorationLineThroughButton,
-			_textDecorationBlinkButton, _textDecorationNoneButton;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public TextPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		// Set the preference store for the preference page.
-		// IPreferenceStore store =
-		// JMTIntegrationPlugin.getDefault().getPreferenceStore();
-		// setPreferenceStore(store);
-		setTitle(DialogsMessages.getString("TextPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(5, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label fontLabel = new Label(top, SWT.NONE);
-		fontLabel.setText(DialogsMessages.getString("TextPreferencePage.Font")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		fontLabel.setLayoutData(data);
-
-		_fontFamilyCombo = new StyleCombo(top, SWT.NONE);
-		_fontFamilyCombo.setItems(IStyleConstants.FONT_FAMILY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 4;
-		_fontFamilyCombo.setLayoutData(data);
-		_fontFamilyCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_style.setFontFamily(_fontFamilyCombo.getText());
-			}
-		});
-
-		Label sizeLabel = new Label(top, SWT.NONE);
-		sizeLabel.setText(DialogsMessages.getString("TextPreferencePage.Size")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		sizeLabel.setLayoutData(data);
-
-		_fontSizeNumberCombo = new StyleCombo(top, SWT.NONE);
-		_fontSizeNumberCombo.setItems(IStyleConstants.FONT_SIZE_NUMBER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontSizeNumberCombo.setLayoutData(data);
-		_fontSizeNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_fontSizeUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_fontSizeNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_fontSizeUnitCombo.setEnabled(false);
-				}
-
-				String size = _fontSizeNumberCombo.getText();
-				if (_fontSizeUnitCombo.isEnabled()) {
-					size += _fontSizeUnitCombo.getText();
-				}
-
-				_style.setFontSize(size);
-			}
-		});
-
-		_fontSizeUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_fontSizeUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontSizeUnitCombo.setLayoutData(data);
-		_fontSizeUnitCombo.select(0);
-		_fontSizeUnitCombo.setEnabled(false);
-		_fontSizeUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String size = _fontSizeNumberCombo.getText();
-				if (_fontSizeUnitCombo.isEnabled()) {
-					size += _fontSizeUnitCombo.getText();
-				}
-
-				_style.setFontSize(size);
-			}
-		});
-
-		Label weightLabel = new Label(top, SWT.NONE);
-		weightLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Weight")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		weightLabel.setLayoutData(data);
-
-		_fontWeightCombo = new StyleCombo(top, SWT.NONE);
-		_fontWeightCombo.setItems(IStyleConstants.FONT_WEIGHT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontWeightCombo.setLayoutData(data);
-		_fontWeightCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String weight = _fontWeightCombo.getText();
-				_style.setFontWeight(weight);
-			}
-		});
-
-		Label stylesLabel = new Label(top, SWT.NONE);
-		stylesLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Style")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		stylesLabel.setLayoutData(data);
-
-		_fontStyleCombo = new StyleCombo(top, SWT.NONE);
-		_fontStyleCombo.setItems(IStyleConstants.FONT_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontStyleCombo.setLayoutData(data);
-		_fontStyleCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _fontStyleCombo.getText();
-				_style.setFontStyle(style);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label variantLabel = new Label(top, SWT.NONE);
-		variantLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Variant")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		variantLabel.setLayoutData(data);
-
-		_fontVariantCombo = new StyleCombo(top, SWT.NONE);
-		_fontVariantCombo.setItems(IStyleConstants.FONT_VARIANT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontVariantCombo.setLayoutData(data);
-		_fontVariantCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String variant = _fontVariantCombo.getText();
-				_style.setFontVariant(variant);
-			}
-		});
-
-		Label lineHeightLabel = new Label(top, SWT.NONE);
-		lineHeightLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.LineHeight")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		lineHeightLabel.setLayoutData(data);
-
-		_fontLineHeightNumberCombo = new StyleCombo(top, SWT.NONE);
-		_fontLineHeightNumberCombo.setItems(IStyleConstants.NORMAL);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontLineHeightNumberCombo.setLayoutData(data);
-		_fontLineHeightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_fontLineHeightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_fontLineHeightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_fontLineHeightUnitCombo.setEnabled(false);
-				}
-
-				String height = _fontLineHeightNumberCombo.getText();
-				if (_fontLineHeightUnitCombo.isEnabled()) {
-					height += _fontLineHeightUnitCombo.getText();
-				}
-
-				_style.setLineHeight(height);
-			}
-		});
-
-		_fontLineHeightUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_fontLineHeightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontLineHeightUnitCombo.setLayoutData(data);
-		_fontLineHeightUnitCombo.select(0);
-		_fontLineHeightUnitCombo.setEnabled(false);
-		_fontLineHeightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _fontLineHeightNumberCombo.getText();
-				if (_fontLineHeightUnitCombo.isEnabled()) {
-					height += _fontLineHeightUnitCombo.getText();
-				}
-
-				_style.setLineHeight(height);
-			}
-		});
-
-		Label caseLabel = new Label(top, SWT.NONE);
-		caseLabel.setText(DialogsMessages.getString("TextPreferencePage.Case")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		caseLabel.setLayoutData(data);
-
-		_textTransformCombo = new StyleCombo(top, SWT.NONE);
-		_textTransformCombo.setItems(IStyleConstants.FONT_TEXTTRANSFORM);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textTransformCombo.setLayoutData(data);
-		_textTransformCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String textTransform = _textTransformCombo.getText();
-				_style.setTextTransform(textTransform);
-			}
-		});
-
-		Label decorationLabel = new Label(top, SWT.NONE);
-		decorationLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Decoration")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		decorationLabel.setLayoutData(data);
-
-		Composite decorationComposite = new Composite(top, SWT.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 4;
-		decorationComposite.setLayoutData(data);
-		layout = new GridLayout(5, true);
-		layout.marginWidth = 0;
-		decorationComposite.setLayout(layout);
-
-		_textDecorationUnderlineButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationUnderlineButton
-				.setText(IStyleConstants.TEXT_DECORATION[0]);
-		_textDecorationUnderlineButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationUnderlineButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationOverlineButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationOverlineButton
-				.setText(IStyleConstants.TEXT_DECORATION[1]);
-		_textDecorationOverlineButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationOverlineButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationLineThroughButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationLineThroughButton
-				.setText(IStyleConstants.TEXT_DECORATION[2]);
-		_textDecorationLineThroughButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationLineThroughButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationBlinkButton = new Button(decorationComposite, SWT.CHECK);
-		_textDecorationBlinkButton.setText(IStyleConstants.TEXT_DECORATION[3]);
-		_textDecorationBlinkButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (_textDecorationBlinkButton.getSelection()) {
-					_textDecorationNoneButton.setSelection(false);
-				}
-				_style.setTextDecoration(getTextDecoration());
-			}
-		});
-
-		_textDecorationNoneButton = new Button(decorationComposite, SWT.CHECK);
-		_textDecorationNoneButton.setText(IStyleConstants.TEXT_DECORATION[4]);
-		_textDecorationNoneButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (_textDecorationNoneButton.getSelection()) {
-					_textDecorationUnderlineButton.setSelection(false);
-					_textDecorationOverlineButton.setSelection(false);
-					_textDecorationLineThroughButton.setSelection(false);
-					_textDecorationBlinkButton.setSelection(false);
-				}
-				_style.setTextDecoration(getTextDecoration());
-			}
-		});
-
-		_colorField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorField.setLabelText(DialogsMessages
-				.getString("TextPreferencePage.Color")); //$NON-NLS-1$
-
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorField.getLabelControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		data.horizontalAlignment = GridData.FILL;
-		data.grabExcessHorizontalSpace = false;
-		_colorField.getComboControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		_colorField.getChangeControl(null, top).setLayoutData(data);
-		_colorField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorField.getText();
-						_style.setColor(color);
-					}
-				});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// font-family
-		String fontFamily = _style.getFontFamily();
-		if (!isEmptyString(fontFamily)) {
-			int index = _fontFamilyCombo.indexOf(fontFamily);
-			if (index != -1) {
-				_fontFamilyCombo.select(index);
-			} else {
-				_fontFamilyCombo.setText(fontFamily);
-			}
-		}
-
-		// font-size
-		String fontSize = _style.getFontSize();
-		if (!isEmptyString(fontSize)) {
-			int index = _fontSizeNumberCombo.indexOf(fontSize);
-			if (index != -1) {
-				_fontSizeNumberCombo.select(index);
-			} else {
-				_fontSizeNumberCombo.setText(fontSize);
-			}
-		}
-
-		// font-weight
-		String fontWeight = _style.getFontWeight();
-		if (!isEmptyString(fontWeight)) {
-			int index = _fontWeightCombo.indexOf(fontWeight);
-			if (index != -1) {
-				_fontWeightCombo.select(index);
-			} else {
-				_fontWeightCombo.setText(fontWeight);
-			}
-		}
-
-		// font-style
-		String fontStyle = _style.getFontStyle();
-		if (!isEmptyString(fontStyle)) {
-			int index = _fontStyleCombo.indexOf(fontStyle);
-			if (index != -1) {
-				_fontStyleCombo.select(index);
-			} else {
-				_fontStyleCombo.setText(fontStyle);
-			}
-		}
-
-		// font-variant
-		String fontVariant = _style.getFontVariant();
-		if (!isEmptyString(fontVariant)) {
-			int index = _fontVariantCombo.indexOf(fontVariant);
-			if (index != -1) {
-				_fontVariantCombo.select(index);
-			} else {
-				_fontVariantCombo.setText(fontVariant);
-			}
-		}
-
-		// line-height
-		String lineHeight = _style.getLineHeight();
-		if (!isEmptyString(lineHeight)) {
-			int index = _fontLineHeightNumberCombo.indexOf(lineHeight);
-			if (index != -1) {
-				_fontLineHeightNumberCombo.select(index);
-			} else {
-				_fontLineHeightNumberCombo.setText(lineHeight);
-			}
-		}
-
-		// text-transform
-		String textTransform = _style.getTextTransform();
-		if (!isEmptyString(textTransform)) {
-			int index = _textTransformCombo.indexOf(textTransform);
-			if (index != -1) {
-				_textTransformCombo.select(index);
-			} else {
-				_textTransformCombo.setText(textTransform);
-			}
-		}
-
-		// text-decoration
-		String textDecoration = _style.getTextDecoration();
-		if (!isEmptyString(textDecoration)) {
-			int index = textDecoration
-					.indexOf(IStyleConstants.TEXT_DECORATION[0]);
-			if (index != -1) {
-				_textDecorationUnderlineButton.setSelection(true);
-			} else {
-				_textDecorationUnderlineButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[1]);
-			if (index != -1) {
-				_textDecorationOverlineButton.setSelection(true);
-			} else {
-				_textDecorationOverlineButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[2]);
-			if (index != -1) {
-				_textDecorationLineThroughButton.setSelection(true);
-			} else {
-				_textDecorationLineThroughButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[3]);
-			if (index != -1) {
-				_textDecorationBlinkButton.setSelection(true);
-			} else {
-				_textDecorationBlinkButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[4]);
-			if (index != -1) {
-				_textDecorationNoneButton.setSelection(true);
-			} else {
-				_textDecorationNoneButton.setSelection(false);
-			}
-		}
-
-		// color
-		String color = _style.getColor();
-		if (!isEmptyString(color)) {
-			_colorField.setTextWithoutUpdate(color);
-		}
-	}
-
-	private String getTextDecoration() {
-		StringBuffer textDecoration = new StringBuffer();
-		if (_textDecorationUnderlineButton.getSelection()) {
-			textDecoration.append(_textDecorationUnderlineButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationOverlineButton.getSelection()) {
-			textDecoration.append(_textDecorationOverlineButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationLineThroughButton.getSelection()) {
-			textDecoration.append(_textDecorationLineThroughButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationBlinkButton.getSelection()) {
-			textDecoration.append(_textDecorationBlinkButton.getText()).append(
-					' ');
-		}
-		if (_textDecorationNoneButton.getSelection()) {
-			textDecoration.append(_textDecorationNoneButton.getText()).append(
-					' ');
-		}
-
-		return textDecoration.toString().trim();
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/WPEPropertyPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/WPEPropertyPage.java
deleted file mode 100644
index 3ee9530..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/WPEPropertyPage.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTResourceProviderFactory;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.DTSkinManager;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTResourceProvider;
-import org.eclipse.jst.pagedesigner.dtresourceprovider.IDTSkin;
-import org.eclipse.jst.pagedesigner.utils.EditorUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.dialogs.PropertyPage;
-
-/**
- * Property page for the Web Page Editor.
- * 
- * @author Ian Trimble - Oracle
- */
-public class WPEPropertyPage extends PropertyPage {
-
-	private IProject project;
-	private TableViewer taglibTable;
-	private TableViewer skinsTable;
-	private Button currentButton;
-	private Map<String, IDTSkin> localCurrentSkinMap = new HashMap<String, IDTSkin>();
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.DialogPage#getDescription()
-	 */
-	@Override
-	public String getDescription() {
-		return DialogsMessages.getString("WPEPropertyPage.Description"); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	@Override
-	protected Control createContents(Composite parent) {
-		Composite top = new Composite(parent, SWT.NONE);
-		GridLayout topLayout = new GridLayout(2, false);
-		topLayout.marginWidth = 0;
-		top.setLayout(topLayout);
-		top.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-		//taglibs label
-		Label taglibLabel = new Label(top, SWT.NONE);
-		taglibLabel.setText(DialogsMessages.getString("WPEPropertyPage.TagLibs.Label")); //$NON-NLS-1$
-		taglibLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
-		//empty cell
-		new Label(top, SWT.NONE).setVisible(false);
-
-		//taglibs list
-		taglibTable = new TableViewer(top, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		taglibTable.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		taglibTable.getTable().addSelectionListener(new TaglibSelectionListener());
-		taglibTable.setContentProvider(new TaglibContentProvider());
-		taglibTable.setLabelProvider(new TaglibLabelProvider());
-		taglibTable.setInput(project);
-
-		//empty cell
-		new Label(top, SWT.NONE).setVisible(false);
-
-		//skins label
-		Label skinsLabel = new Label(top, SWT.NONE);
-		skinsLabel.setText(DialogsMessages.getString("WPEPropertyPage.Skins.Label")); //$NON-NLS-1$
-		skinsLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
-		//empty cell
-		new Label(top, SWT.NONE).setVisible(false);
-
-		//skins list
-		skinsTable = new TableViewer(top, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
-		skinsTable.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		skinsTable.getTable().addSelectionListener(new SkinSelectionListener());
-		skinsTable.setContentProvider(new SkinContentProvider());
-		skinsTable.setLabelProvider(new SkinLabelProvider());
-
-		//buttons
-		Composite buttons = new Composite(top, SWT.NONE);
-		GridLayout buttonsLayout = new GridLayout(1, true);
-		buttonsLayout.marginWidth = 0;
-		buttons.setLayout(buttonsLayout);
-		buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-		currentButton = new Button(buttons, SWT.NONE);
-		currentButton.setText(DialogsMessages.getString("WPEPropertyPage.Current.Button")); //$NON-NLS-1$
-		currentButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				String nsURI = getCurrentNSURI();
-				IStructuredSelection selection = (IStructuredSelection)skinsTable.getSelection();
-				IDTSkin dtSkin = (IDTSkin)selection.getFirstElement();
-				if (dtSkin != null) {
-					localCurrentSkinMap.put(nsURI, dtSkin);
-					skinsTable.refresh();
-					updateButtons();
-				}
-			}
-		});
-		updateButtons();
-
-		return top;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.PropertyPage#setElement(org.eclipse.core.runtime.IAdaptable)
-	 */
-	@Override
-	public void setElement(IAdaptable element) {
-		Object objElement = element.getAdapter(IProject.class);
-		if (objElement != null) {
-			project = (IProject)objElement;
-			if (taglibTable != null) {
-				taglibTable.setInput(objElement);
-			}
-		}
-		super.setElement(element);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
-	@Override
-	protected void performDefaults() {
-		List<TaglibData> taglibDataList = getTaglibDataList();
-		for (TaglibData taglibData: taglibDataList) {
-			String nsURI = taglibData.getNSURI();
-			IDTSkin defaultDTSkin = DTSkinManager.getInstance(project).getDefaultSkin(nsURI);
-			localCurrentSkinMap.put(nsURI, defaultDTSkin);
-		}
-		skinsTable.refresh();
-		updateButtons();
-		super.performDefaults();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	@Override
-	public boolean performOk() {
-		Set keys = localCurrentSkinMap.keySet();
-		for (Object key: keys) {
-			String nsURI = (String)key;
-			IDTSkin dtSkin = localCurrentSkinMap.get(nsURI);
-			DTSkinManager.getInstance(project).setCurrentSkin(nsURI, dtSkin);
-		}
-		EditorUtil.refreshAllWPEDesignViewers();
-		return super.performOk();
-	}
-
-	private IDTSkin getLocalCurrentSkin() {
-		IDTSkin localCurrentSkin = null;
-		String nsURI = getCurrentNSURI();
-		localCurrentSkin = localCurrentSkinMap.get(nsURI);
-		if (localCurrentSkin == null) {
-			localCurrentSkin = DTSkinManager.getInstance(project).getCurrentSkin(nsURI);
-		}
-		return localCurrentSkin;
-	}
-
-	private String getCurrentNSURI() {
-		String nsURI = null;
-		if (skinsTable != null) {
-			Object objInput = skinsTable.getInput();
-			if (objInput instanceof TaglibData) {
-				nsURI = ((TaglibData)objInput).getNSURI();
-			}
-		}
-		return nsURI;
-	}
-
-	private List<TaglibData> getTaglibDataList() {
-		List<TaglibData> taglibDataList = new ArrayList<TaglibData>();
-		List<IDTResourceProvider> resourceProviders =
-			DTResourceProviderFactory.getInstance().getActiveDTResourceProviders(project);
-		for (IDTResourceProvider resourceProvider: resourceProviders) {
-			TaglibData taglibData = new TaglibData(resourceProvider.getId());
-			if (!taglibDataList.contains(taglibData)) {
-				taglibDataList.add(taglibData);
-			}
-		}
-		return taglibDataList;
-	}
-
-	private void updateButtons() {
-		boolean currentButtonEnabled = false;
-		if (skinsTable != null) {
-			IStructuredSelection selection = (IStructuredSelection)skinsTable.getSelection();
-			if (selection != null) {
-				Object selectedObject = selection.getFirstElement();
-				if (selectedObject instanceof IDTSkin) {
-					IDTSkin localCurrentSkin = getLocalCurrentSkin();
-					if ((IDTSkin)selectedObject != localCurrentSkin) {
-						currentButtonEnabled = true;
-					}
-				}
-			}
-		}
-		currentButton.setEnabled(currentButtonEnabled);
-	}
-
-
-
-	/**
-	 * Content provider for taglib table viewer.
-	 */
-	private class TaglibContentProvider implements IStructuredContentProvider {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return getTaglibDataList().toArray();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			viewer.refresh();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			//nothing to dispose
-		}
-	}
-
-
-
-	/**
-	 * Label provider for taglib table viewer.
-	 */
-	private class TaglibLabelProvider extends LabelProvider {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object element) {
-			Image image = null;
-			if (element instanceof TaglibData) {
-				image = PDPlugin.getDefault().getImage("library_obj.gif"); //$NON-NLS-1$
-			}
-			return image;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object element) {
-			String text = null;
-			if (element instanceof TaglibData) {
-				TaglibData taglibData = ((TaglibData)element);
-				if (taglibData.getName() != null) {
-					text = taglibData.getName();
-				} else {
-					text = taglibData.getNSURI();
-				}
-			}
-			return text;
-		}
-	}
-
-
-
-	private class TaglibSelectionListener implements SelectionListener {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetSelected(SelectionEvent event) {
-			Object obj = event.item.getData();
-			if (obj instanceof TaglibData) {
-				skinsTable.setInput(obj);
-			}
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetDefaultSelected(SelectionEvent event) {
-			widgetSelected(event);
-		}
-	}
-
-
-
-	/**
-	 * Used to hold and pass taglib-related data.
-	 */
-	private class TaglibData {
-		private String nsURI;
-		private String name;
-		public TaglibData(String nsURI) {
-			this.nsURI = nsURI;
-			ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsURI);
-			Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-			Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "display-label"); //$NON-NLS-1$
-			this.name = TraitValueHelper.getValueAsString(trait);
-		}
-		public String getNSURI() {
-			return nsURI;
-		}
-		public String getName() {
-			return name;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see java.lang.Object#hashCode()
-		 */
-		public int hashCode() {
-			int nsURIHashCode = 0;
-			if (nsURI != null) {
-				nsURIHashCode = nsURI.hashCode();
-			}
-			int nameHashCode = 0;
-			if (name != null) {
-				nameHashCode = name.hashCode();
-			}
-			return nameHashCode | nsURIHashCode ;
-		}
-	}
-
-
-
-	/**
-	 * Content provider for skin table viewer.
-	 */
-	private class SkinContentProvider implements IStructuredContentProvider {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			List<IDTSkin> skinList;
-			if (inputElement instanceof TaglibData) {
-				skinList = DTSkinManager.getInstance(project).getSkins(((TaglibData)inputElement).getNSURI());
-			} else {
-				skinList = Collections.EMPTY_LIST;
-			}
-			return skinList.toArray();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			viewer.refresh();
-			updateButtons();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			//nothing to dispose
-		}
-	}
-
-
-
-	/**
-	 * Label provider for skin table viewer.
-	 */
-	private class SkinLabelProvider extends LabelProvider {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
-		 */
-		public Image getImage(Object element) {
-			Image image = null;
-			if (element instanceof IDTSkin) {
-				image = PDPlugin.getDefault().getImage("skin.png"); //$NON-NLS-1$
-			}
-			return image;
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
-		 */
-		public String getText(Object element) {
-			String text = null;
-			if (element instanceof IDTSkin) {
-				IDTSkin dtSkin = (IDTSkin)element;
-				text = dtSkin.getName();
-				if (dtSkin == getLocalCurrentSkin()) {
-					text += " "  + DialogsMessages.getString("WPEPropertyPage.Skins.Item.Current"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			return text;
-		}
-	}
-
-
-
-	private class SkinSelectionListener implements SelectionListener {
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetSelected(SelectionEvent event) {
-			updateButtons();
-		}
-		/*
-		 * (non-Javadoc)
-		 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
-		 */
-		public void widgetDefaultSelected(SelectionEvent event) {
-			widgetSelected(event);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferencePage.java
deleted file mode 100644
index 1be27be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferencePage.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.preferences;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.EditorUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * This class represents a preference page that is contributed to the
- * Preferences dialog. By subclassing <samp>FieldEditorPreferencePage </samp>,
- * we can use the field support built into JFace that allows us to create a page
- * that is small and knows how to save, restore and apply itself.
- * <p>
- * This page is used to modify preferences only. They are stored in the
- * preference store that belongs to the main plug-in class. That way,
- * preferences can be accessed directly via the preference store.
- * 
- * C.B: Copied from the GEMPreferences in the Faces Config Editor.
- */
-
-public final class PDPreferencePage extends FieldEditorPreferencePage implements
-        IWorkbenchPreferencePage
-{
-
-    // appearance
-
-    private Group _cssLayoutGroup;
-
-    // private BooleanField _enableAbsolute;
-    //
-    // private IntegerFieldEditor _artificialCellpadding;
-
-    private class BooleanField extends BooleanFieldEditor
-    {
-        // private Composite parent;
-
-        /**
-         * @param name
-         * @param label
-         * @param parent
-         */
-        public BooleanField(String name, String label, Composite parent)
-        {
-            super(name, label, parent);
-            // this.parent = parent;
-        }
-
-        // /**
-        // * @return the change control button
-        // */
-        // public Button getButton() {
-        // return getChangeControl(parent);
-        // }
-    }
-
-    /**
-     * Constructor
-     */
-    public PDPreferencePage()
-    {
-        super(GRID);
-        setPreferenceStore(PDPlugin.getDefault().getPreferenceStore());
-        setDescription(PreferenceMessages.PDPreferences_description);
-    }
-
-    /**
-     * Creates the field editors. Field editors are abstractions of the common
-     * GUI blocks needed to manipulate various types of preferences. Each field
-     * editor knows how to save and restore itself.
-     */
-    public void createFieldEditors()
-    {
-        _cssLayoutGroup = new Group(getFieldEditorParent(), SWT.NULL);
-
-        // note, we aren't saving the reference. It's assumed that parent
-        // worries about destruction, persistence etc.
-        /* _enableAbsolute = */addBooleanField(
-                PDPreferences.CSS_ENABLE_ABSOLUTE_POSITIONING,
-                PreferenceMessages.EditorPreferences_LABEL_CSSEnableAbsolutePositioning,
-                _cssLayoutGroup);
-        /* _artificialCellpadding = */addIntegerField(
-                PDPreferences.CSS_USE_ARTIFICAL_CELL_PADDING,
-                PreferenceMessages.EditorPreferences_LABEL_CSSArtificalCellPadding,
-                _cssLayoutGroup);
-    }
-
-    
-    @Override
-    public boolean performOk()
-    {
-        final boolean succeeded = super.performOk();
-        if (succeeded)
-        {
-            EditorUtil.refreshAllWPEDesignViewers();
-        }
-        return succeeded;
-    }
-
-    
-    protected void initialize()
-    {
-        // Color use: Default canvas colors should pick up system defaults
-        // enable or disable all of the color and font selection controls in the
-        // preference dialog
-        // depending on whether the "Use System Colors" checkbox is selected.
-        super.initialize();
-
-        ((GridLayout) getFieldEditorParent().getLayout()).numColumns = 1;
-        _cssLayoutGroup.setLayout(new GridLayout(2, false));
-        _cssLayoutGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-                | GridData.VERTICAL_ALIGN_BEGINNING));
-    }
-
-    public void init(IWorkbench workbench)
-    {
-        // no initialization
-    }
-
-    private IntegerFieldEditor addIntegerField(String name, String labelText,
-            Composite parent)
-    {
-        IntegerFieldEditor f = new IntegerFieldEditor(name, labelText, parent);
-        addField(f);
-        return f;
-    }
-
-    private BooleanField addBooleanField(String name, String labelText,
-            Composite parent)
-    {
-        BooleanField f = new BooleanField(name, labelText, parent);
-        addField(f);
-        return f;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferences.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferences.java
deleted file mode 100644
index b2dda7a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PDPreferences.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.ui.preferences;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-
-/**
- * Utility class for handling preferences related to the Web Page Editor plug-in.
- * <br>
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class PDPreferences extends AbstractPreferenceInitializer {
-
-    /**
-     * Preference used to set modes for the page designer when displayed in a
-     * sash editor.
-     */
-    public static final String SASH_EDITOR_MODE_PREF = PDPreferences.class
-            .getName()
-            + ".sash_editor_mode"; //$NON-NLS-1$
-    /**
-     * The number of pixels of artificial cell padding to use Default = 0
-     */
-    public final static String CSS_USE_ARTIFICAL_CELL_PADDING = PDPreferences.class
-            .getName()
-            + ".CSSArtificalCellPadding"; //$NON-NLS-1$
-    /**
-     * Whether or not to enable absolute positioning Default = false
-     */
-    public final static String CSS_ENABLE_ABSOLUTE_POSITIONING = PDPreferences.class
-            .getName()
-            + ".CSSEnableAbsolutePositioning"; //$NON-NLS-1$
-    /**
-     * The default value for absolute positioning enablement
-     */
-    public static final boolean DEFAULT_CSS_ENABLE_ABSOLUTE_POSITIONING = false;
-    /**
-     * The default value for artificial cell padding.
-     */
-    public static final int DEFAULT_CSS_USE_ARTIFICIAL_CELL_PADDING = 4;
-
-    private static IPreferenceStore getPreferenceStore()
-    {
-        return PDPlugin.getDefault().getPreferenceStore();
-    }
-
-    /**
-     * @return the css absolute positioning enablement flag.
-     */
-    public boolean isCssAbsolutePositioningEnabled()
-    {
-        final IPreferenceStore store = getPreferenceStore();
-        return store.getBoolean(CSS_ENABLE_ABSOLUTE_POSITIONING);
-    }
-
-    /**
-     * @return the css artificial cell padding preference
-     */
-    public int getCssArtificialCellPadding()
-    {
-        final IPreferenceStore store = getPreferenceStore();
-        return store.getInt(CSS_USE_ARTIFICAL_CELL_PADDING);
-    }
-
-    @Override
-    public void initializeDefaultPreferences()
-    {
-        // Set default HTML editor split vertical (i.e. with top and bottom
-        // pane)
-        IPreferenceStore store = getPreferenceStore();
-        store.setDefault(SASH_EDITOR_MODE_PREF, HTMLEditor.MODE_SASH_VERTICAL);
-        store.setDefault(CSS_USE_ARTIFICAL_CELL_PADDING,
-                DEFAULT_CSS_USE_ARTIFICIAL_CELL_PADDING);
-        store.setDefault(CSS_ENABLE_ABSOLUTE_POSITIONING,
-                DEFAULT_CSS_ENABLE_ABSOLUTE_POSITIONING);
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.java
deleted file mode 100644
index 0caaeee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.eclipse.jst.pagedesigner.ui.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-/*package*/ class PreferenceMessages extends NLS
-{
-    private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.ui.preferences.PreferenceMessages"; //$NON-NLS-1$
-    /**
-     * See PreferenceMessages.properties
-     */
-    public static String PDPreferences_description;
-    /**
-     * See PreferenceMessages.properties
-     */
-    public static String EditorPreferences_LABEL_CSSArtificalCellPadding;
-    /**
-     * See PreferenceMessages.properties
-     */
-    public static String EditorPreferences_LABEL_CSSEnableAbsolutePositioning;
-
-    private PreferenceMessages() {
-        // Do not instantiate
-    }
-
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, PreferenceMessages.class);
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.properties
deleted file mode 100644
index c7c7205..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/preferences/PreferenceMessages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-PDPreferences_description=Preferences for the design page of Web Page Editor.
-EditorPreferences_LABEL_CSSArtificalCellPadding=Add Artificial Padding Around Containers:
-EditorPreferences_LABEL_CSSEnableAbsolutePositioning=Enable Absolute CSS Position
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java
deleted file mode 100644
index 725bcad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.adapters.internal.BodyInfo;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition2;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This class helps location insertion position to inside correct body or doc
- * prefix. NOTE: this class only doing limited support on doc level position
- * validation. Element specific position validation will be done in other
- * places.
- * 
- * @author mengbo
- */
-public class BodyHelper {
-	// bit flags used for child skipping.
-	/**
-	 * Bit flag for empty text node
-	 */
-	public static final int EMPTY_TEXT = 1;
-
-	/**
-	 * Bit flag for comment node
-	 */
-	public static final int COMMENT = 2;
-
-	/**
-	 * Bit flag for HEAD node
-	 */
-	public static final int HEADER = 3;
-
-	/**
-	 * 
-	 * @param child
-	 * @return boolean
-	 */
-	private static boolean isSkippableChild(Node parent, Node child, int flag) {
-		if ((flag & COMMENT) != 0 && child.getNodeType() == Node.COMMENT_NODE)
-			return true;
-		if ((flag & EMPTY_TEXT) != 0 && child instanceof IDOMText
-				&& ((IDOMText) child).isElementContentWhitespace())
-			return true;
-
-		if ((flag & HEADER) != 0 && child.getNodeType() == Node.ELEMENT_NODE) {
-			String uri = CMUtil.getElementNamespaceURI((Element) child);
-			IBodyInfo parentInfo = getBodyInfo((IDOMNode) parent);
-			if (parentInfo != null
-					&& parentInfo.isBodyHeader((IDOMNode) parent, uri,
-							((Element) child).getLocalName()))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * check whether uri/tag should be header of any body container that is
-	 * ancester of the start node.
-	 * 
-	 * @param start
-	 * @param uri
-	 * @param tag
-	 * @return IDOMNode
-	 */
-	public static IDOMNode findHeaderContainer(IDOMNode start, String uri,
-			String tag) {
-		while (start != null) {
-			IBodyInfo designInfo = getBodyInfo(start);
-			if (designInfo != null && designInfo.isBodyContainer(start)) {
-				if (designInfo.isBodyHeader(start, uri, tag))
-					return start;
-			}
-			start = (IDOMNode) start.getParentNode();
-		}
-		return null;
-	}
-
-	/**
-	 * find the closest body insertion point, to make it as deep as possible.
-	 * (Move into as more body as possible)
-	 * @param position 
-	 * @return IDOMPosition
-	 */
-	public static IDOMPosition findBodyInsertLocation(IDOMPosition position) {
-		// forward first.
-		Node reference = position.getNextSiblingNode();
-		Node container = position.getContainerNode();
-		while (reference != null) {
-			IBodyInfo info = getBodyInfo((IDOMNode) reference);
-			if (info != null && info.isBodyContainer((IDOMNode) reference)) {
-				// good, we find a body!
-				position = new DOMPosition(reference, 0);
-				return findBodyInsertLocation(position);
-			}
-			if (isSkippableChild(container, reference, EMPTY_TEXT | COMMENT
-					| HEADER)) {
-				reference = reference.getNextSibling();
-				continue;
-			}
-            break;
-		}
-
-		// backward
-		reference = position.getPreviousSiblingNode();
-		while (reference != null) {
-			IBodyInfo info = getBodyInfo((IDOMNode) reference);
-			if (info != null && info.isBodyContainer((IDOMNode) reference)) {
-				// good, we find a body!
-				position = new DOMPosition(reference, reference.getChildNodes()
-						.getLength());
-				return findBodyInsertLocation(position);
-			}
-			// XXX: not skip header here. So if there is some header with wrong
-			// location, we will respect user.
-			if (isSkippableChild(container, reference, EMPTY_TEXT | COMMENT)) {
-				reference = reference.getPreviousSibling();
-				continue;
-			}
-            break;
-		}
-
-		// not find any body at same level as the insertion point.
-		return position;
-	}
-
-	/**
-	 * The element type identified by "uri" and "tag" is going to be inserted
-	 * into the document. This method is used to adjust the insert position so
-	 * it can be put into correct body or header section.
-	 * @param uri 
-	 * @param tag 
-	 * @param position 
-	 * @return IDOMPosition
-	 * 
-	 */
-	public static IDOMPosition adjustInsertPosition(String uri, String tag,
-			IDOMPosition position) {
-		IDOMNode parent = (IDOMNode) position.getContainerNode();
-		IBodyInfo designInfo = getBodyInfo(parent);
-		if (designInfo == null) {
-			return position; // should not happen.
-		}
-
-		IDOMNode headerContainer = findHeaderContainer(parent, uri, tag);
-
-		if (headerContainer == null) {
-			// the new node is not header.
-			if (shouldIgnoreAdjust(uri, tag)) {
-				return position;
-			}
-
-			// new node is not body header. So should place inside the inner most
-			// body.
-			if (!designInfo.isBodyContainer(parent)) {
-				return position; // it's parent is not body, so we suggest
-				// it's parent already correctly located, and respect user's
-				// choice.
-			}
-
-			// ok, we are inside some body, but we don't know whether we are in
-			// the inner most body.
-			// try to find a body container at same level and see whether we can
-			// move into that body.
-			return findBodyInsertLocation(position);
-		}
-        // good, we find a body container and the new node should be header
-        // of it.
-        Node child = headerContainer.getFirstChild();
-
-        // if parent is different from headerContainer, then
-        // child!=referenceHolder[0] will always be true
-        while (child != null) // && child != refNode)
-        {
-        	Comparator comp = NodeLocationComparator.getInstance();
-        	// Currently the comparator deels with tags like taglib and
-        	// loadbundle particularly, comparasion result 0
-        	// means it didn't compare the tags.
-        	if (comp.compare(child, tag) < 0
-        			|| (comp.compare(child, tag) == 0 && isSkippableChild(
-        					headerContainer, child, COMMENT | EMPTY_TEXT
-        							| HEADER))) {
-        		child = child.getNextSibling();
-        	} else {
-        		break;
-        	}
-        }
-        if (child != null) {
-        	return new DOMRefPosition(child, false);
-        }
-        return new DOMPosition(parent, parent.getChildNodes()
-        		.getLength());
-	}
-
-	/**
-	 * Find the position to insert a header element into the specified parent.
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @param parent
-	 * @param ref 
-	 */
-	public static void findHeaderInsertPosition(String uri, String tag,
-			Node parent, Node[] ref) {
-		Node child = parent.getFirstChild();
-		while (child != null) {
-			Comparator comp = NodeLocationComparator.getInstance();
-			if (comp.compare(child, tag) < 0
-					|| (comp.compare(child, tag) == 0 && isSkippableChild(
-							parent, child, COMMENT | EMPTY_TEXT | HEADER))) {
-				child = child.getNextSibling();
-			} else {
-				break;
-			}
-		}
-		ref[0] = child;
-		return;
-	}
-
-	/**
-	 * @param position
-	 * @param body
-	 * @param defaultPrefix
-	 * @return the new dom position based on the insert.  May return null if
-	 * insert fails.
-	 */
-	public static IDOMPosition insertBody(IDOMPosition position, QName body,
-			String defaultPrefix) {
-		IBodyInfo bodyInfo = getBodyInfo((IDOMNode) position.getContainerNode());
-
-		Node node = position.getContainerNode();
-		final Node originalContainer = node;
-		final Node nextSibling = position.getNextSiblingNode();
-
-		// create the body element first.
-		Document ownerDoc;
-		if (node instanceof Document) {
-			ownerDoc = (Document) node;
-		} else {
-			ownerDoc = node.getOwnerDocument();
-		}
-		if (ownerDoc == null) {
-			return null; // should not happen
-		}
-
-		final String prefix = JSPUtil.getOrCreatePrefix(((IDOMNode) node).getModel(),
-				body.getNamespaceURI(), defaultPrefix);
-		final Element ele = ownerDoc.createElement((prefix == null ? "" //$NON-NLS-1$
-				: (prefix + ":")) //$NON-NLS-1$
-				+ body.getLocalPart());
-
-		// need to find out the insertion point
-		while (node instanceof IDOMNode) {
-			if (bodyInfo.isBodyContainer((IDOMNode) node)) {
-				// ok, node is a body container.
-				// we could create the new node as child of node and move all
-				// node's none header children
-				// as children of the new node.
-
-				NodeList nl = node.getChildNodes();
-				ArrayList list = new ArrayList();
-				for (int i = 0; i < nl.getLength(); i++) {
-					Node child = nl.item(i);
-					if (isSkippableChild(node, child, HEADER | COMMENT
-							| EMPTY_TEXT)) {
-						continue;
-					}
-					list.add(nl.item(i));
-				}
-				for (int i = 0; i < list.size(); i++) {
-					ele.appendChild((Node) list.get(i));
-				}
-				node.appendChild(ele);
-
-				if (node == originalContainer) {
-					if (nextSibling == null) {
-						return new DOMRefPosition2(ele, true);
-					} else if (nextSibling.getParentNode() == ele) {
-						// next sibling is not in header part
-						return new DOMRefPosition(nextSibling, false);
-					} else {
-						return new DOMPosition(ele, 0);
-					}
-				}
-                return position;
-			}
-			node = node.getParentNode();
-		}
-		// should not happen, because document and documentfragment node will
-		// always be body node
-		// so if reach here, means the position is not in document.
-		return null;
-	}
-
-	/**
-	 * For certain special tags, do not following the "header"/"body" separation
-	 * and can't fit into the relocation process.
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @return true if tag is an element that should be moved in response to 
-	 * body insert.
-	 */
-	public static boolean shouldIgnoreAdjust(String uri, String tag) {
-		// FIXME:
-		return (ITLDConstants.URI_HTML.equalsIgnoreCase(uri) && "script" //$NON-NLS-1$
-				.equalsIgnoreCase(tag))
-				|| (ITLDConstants.URI_JSP.equals(uri));
-	}
-
-	/**
-	 * @param node
-	 * @return the body info corresponding to node (should we use a node adapter?)
-	 */
-	public static IBodyInfo getBodyInfo(IDOMNode node) {
-		// TODO: in the future, when bodyinfo is no longer singleton, we'll use
-		// adapter mechanism.
-		return BodyInfo.getInstance();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java
deleted file mode 100644
index 5483281..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-
-/**
- * This is a cache manager. It will use the ICacheEntryCreator interface to
- * manage creating new item and dispose old item.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CacheManager {
-	ICacheEntryCreator _creator;
-
-	int _maxSize;
-
-	// key --> value
-	Map _map = new HashMap();
-
-	// keep track of LRU
-	LinkedList _keys = new LinkedList();
-
-	/**
-	 * @param creator
-	 * @param maxSize
-	 */
-	public CacheManager(ICacheEntryCreator creator, int maxSize) {
-		_creator = creator;
-		_maxSize = maxSize;
-		if (_maxSize <= 0) {
-			_maxSize = 10;
-		}
-	}
-
-	/**
-	 * @param key
-	 * @return the cache entry for key
-	 */
-	public Object getEntry(Object key) {
-		Object result = _map.get(key);
-		if (result == null) {
-			// not existed yet.
-			if (_map.size() >= _maxSize) {
-				// we need to remove the oldest one.
-				Object keyRemove = _keys.removeFirst();
-				Object objToRemove = _map.remove(keyRemove);
-				_creator.dispose(keyRemove, objToRemove);
-			}
-			result = _creator.createEntry(key);
-			_keys.addLast(key);
-			_map.put(key, result);
-			return result;
-		}
-        _keys.remove(key);
-        _keys.addLast(key);
-        return result;
-	}
-
-	/**
-	 * Dispose the cache
-	 */
-	public void disposeAll() {
-		_keys.clear();
-		for (Iterator iter = _map.keySet().iterator(); iter.hasNext();) {
-			Object key = iter.next();
-			Object entry = _map.get(key);
-			_creator.dispose(key, entry);
-		}
-		_map.clear();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java
deleted file mode 100644
index 281f045..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
-import org.eclipse.jst.pagedesigner.editors.palette.ITagDropSourceData;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.TagCreationFactory;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommandUtil
-{
-    private static final Logger _log = PDPlugin.getLogger(CommandUtil.class);
-
-    /**
-     * @param dropSourceData
-     * @param model
-     * @param domPosition
-     * @param customizationData
-     * @return the element inserted or null if failed
-     */
-    public static Element executeInsertion(
-            final IDropSourceData dropSourceData, final IDOMModel model,
-            final IDOMPosition domPosition, final IAdaptable customizationData)
-    {
-        try
-        {
-            final ITaglibDomainMetaDataModelContext modelContext = getMetadataContext(
-                    dropSourceData.getNamespace(), model);
-
-            ITagDropSourceData tagDropSourceData = null;
-
-            if (dropSourceData instanceof ITagDropSourceData)
-            {
-                tagDropSourceData = (ITagDropSourceData) dropSourceData;
-            } else if (customizationData != null)
-            {
-                tagDropSourceData = (ITagDropSourceData) customizationData
-                        .getAdapter(ITagDropSourceData.class);
-            }
-
-            if (tagDropSourceData == null)
-            {
-                PDPlugin
-                        .log(
-                                "Could not down cast dropSourceData to tagDropSourceData", new Exception("for stack trace only")); //$NON-NLS-1$//$NON-NLS-2$
-            }
-
-            // TODO: note that the constructor currently causes the prefix defn
-            // to be added to the target doc. This should be moved into
-            // an ensure method in the AbstractTagCreator
-            final CreationData creationData = new CreationData(
-                    tagDropSourceData, model, domPosition, modelContext,
-                    customizationData);
-
-            final ITagCreator tagCreator = TagCreationFactory.getInstance()
-                    .createTagCreator(creationData.getTagId());
-
-            if (tagCreator == null)
-            {
-                return null;// should never get here!
-            }
-
-            return tagCreator.createTag(creationData);
-        } catch (Exception e)
-        {
-            _log
-                    .error(
-                            "Problem creating tag " + dropSourceData.getId() + " at:" + domPosition + "\n", e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-        }
-        return null;
-    }
-
-    /**
-     * @param uri
-     * @param model
-     * @return the metadata context for uri in the DOM model or null if none.
-     */
-    public static ITaglibDomainMetaDataModelContext getMetadataContext(
-            final String uri, final IDOMModel model)
-    {
-        final IStructuredDocument doc = model.getDocument()
-                .getStructuredDocument();
-
-        final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-                .getContext(doc, -1);
-        final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-                .getWorkspaceContextResolver(context);
-
-        final IProject project = resolver.getProject();
-
-        final ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper
-                .createMetaDataModelContext(project, uri);
-        return modelContext;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
deleted file mode 100644
index 196a87c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.wst.xml.core.internal.document.ElementImpl;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMUtil {
-	/**
-	 * @param parent
-	 * @param tag
-	 * @return the list of child elements  of parent that are Elements
-	 * and that have name 'tag' ignoring case
-	 */
-	public static List getChildElementsByTagIgnoreCase(Element parent,
-			String tag) {
-		List ret = new ArrayList();
-		NodeList nodeList = parent.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				String t = node.getNodeName();
-				if (tag.equalsIgnoreCase(t)) {
-					ret.add(node);
-				}
-			}
-		}
-		return ret;
-	}
-
-	/**
-	 * @param ele
-	 * @return the element value of the TEXT_NODE children of element
-	 * concat'd together
-	 */
-	public static String getTextElementValue(Element ele) {
-		StringBuffer buffer = new StringBuffer();
-		Node node = ele.getFirstChild();
-		while (node != null) {
-			if (node.getNodeType() == Node.TEXT_NODE) {
-				buffer.append(node.getNodeValue());
-			} else if (node.getNodeType() == Node.CDATA_SECTION_NODE) {
-				buffer.append(node.getNodeValue());
-			}
-			node = node.getNextSibling();
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * @param element
-	 * @param string
-	 * @return the attribute named string on element ignoring case in the comparison
-	 * or null if not found
-	 */
-	public static String getAttributeIgnoreCase(Element element, String string) {
-		NamedNodeMap map = element.getAttributes();
-		for (int i = 0; i < map.getLength(); i++) {
-			Node attr = map.item(i);
-			if (string.equalsIgnoreCase(attr.getNodeName())) {
-				return attr.getNodeValue();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param parent
-	 * @param tags
-	 * @return the list of children of parent with name in tags ignoring case
-	 */
-	public static List getChildrenByTagsIgnoreCase(Element parent, String[] tags) {
-		List result = new ArrayList();
-		NodeList nodeList = parent.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				String t = node.getNodeName();
-				for (int k = 0; k < tags.length; k++) {
-					if (tags[k].equalsIgnoreCase(t)) {
-						result.add(node);
-						break;
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param ele
-	 */
-	public static void removeAllChildren(Element ele) {
-		((ElementImpl) ele).removeChildNodes();
-	}
-
-	/**
-	 * @param ele
-	 * @param value
-	 */
-	public static void setTextElementValue(Element ele, String value) {
-		removeAllChildren(ele);
-		Text txt = ele.getOwnerDocument().createTextNode(value);
-		ele.appendChild(txt);
-	}
-
-	/**
-	 * @param ele 
-	 * @param attr 
-	 * @param defaultvalue 
-	 * @return the integer attribute of ele called attr.  Default value
-	 * is returned if the attribute is not found.
-	 */
-	public static int getIntAttributeIgnoreCase(Element ele, String attr,
-			int defaultvalue) {
-		if (ele == null) {
-			return defaultvalue;
-		}
-		String attrvalue = getAttributeIgnoreCase(ele, attr);
-		if (attrvalue == null) {
-			return defaultvalue;
-		}
-        try {
-        	return Integer.parseInt(attrvalue);
-        } catch (NumberFormatException  ex) {
-        	return defaultvalue;
-        }
-	}
-
-	/**
-	 * get all child elements
-	 * 
-	 * @param ele
-	 * @return the list of element children of type ELEMENT_NODE
-	 */
-	public static List getElementChildren(Element ele) {
-		List ret = new ArrayList();
-		NodeList nodeList = ele.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				ret.add(node);
-			}
-		}
-		return ret;
-	}
-
-	/**
-	 * judge whether element has an attribute named attrName
-	 * 
-	 * @param ele
-	 * @param attrName
-	 * @return true if element has attribute called attrName ignoring
-	 * case  in the comparison.
-	 */
-	public static boolean hasAttribute(Element ele, String attrName) {
-		NamedNodeMap map = ele.getAttributes();
-		for (int i = 0; i < map.getLength(); i++) {
-			Node attr = map.item(i);
-			if (attr.getNodeName().equalsIgnoreCase(attrName)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param node
-	 * @param sb
-	 */
-	public static void nodeToString(Node node, StringBuffer sb) {
-		int type = node.getNodeType();
-		switch (type) {
-		case Node.DOCUMENT_NODE:
-			sb.append("<?xml version=\"1.0\" ?>"); //$NON-NLS-1$
-			nodeToString(((Document) node).getDocumentElement(), sb);
-			break;
-
-		case Node.ELEMENT_NODE:
-			sb.append("<"); //$NON-NLS-1$
-			sb.append(node.getNodeName());
-			NamedNodeMap attrs = node.getAttributes();
-			for (int i = 0; i < attrs.getLength(); i++) {
-				Node attr = attrs.item(i);
-				sb.append(" " + attr.getNodeName() + "=\"" //$NON-NLS-1$ //$NON-NLS-2$
-						+ attr.getNodeValue() + "\""); //$NON-NLS-1$
-			}
-
-			NodeList children = node.getChildNodes();
-			if (children != null) {
-				int len = children.getLength();
-				if (len != 0) {
-					sb.append(">"); //$NON-NLS-1$
-				}
-				for (int i = 0; i < len; i++) {
-					nodeToString(children.item(i), sb);
-				}
-			}
-			break;
-
-		case Node.ENTITY_REFERENCE_NODE:
-			sb.append("&"); //$NON-NLS-1$
-			sb.append(node.getNodeName());
-			sb.append(";"); //$NON-NLS-1$
-			break;
-
-		case Node.CDATA_SECTION_NODE:
-			sb.append("<![CDATA["); //$NON-NLS-1$
-			sb.append(node.getNodeValue());
-			sb.append("]]>"); //$NON-NLS-1$
-			break;
-
-		case Node.TEXT_NODE:
-			sb.append(node.getNodeValue());
-			break;
-
-		case Node.PROCESSING_INSTRUCTION_NODE:
-			sb.append("<?"); //$NON-NLS-1$
-			sb.append(node.getNodeName());
-			String data = node.getNodeValue();
-			{
-				sb.append(" "); //$NON-NLS-1$
-				sb.append(data);
-			}
-			sb.append("?>"); //$NON-NLS-1$
-			break;
-		}
-
-		if (type == Node.ELEMENT_NODE) {
-			if (node.getFirstChild() != null) {
-				sb.append("</"); //$NON-NLS-1$
-				sb.append(node.getNodeName());
-				sb.append(">"); //$NON-NLS-1$
-			} else {
-				sb.append("/>"); //$NON-NLS-1$
-			}
-
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EditorUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EditorUtil.java
deleted file mode 100644
index bfffd3c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EditorUtil.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.internal.Workbench;
-
-/**
- * Utility class for Editor related information.
- * <br>
- * <p><b>Provisional API - subject to change</b></p>
- */
-public class EditorUtil {
-
-	private static final String PROPERTY_QUALIFIER = "org.eclipse.jst.pagedesigner"; //$NON-NLS-1$
-    private static final String PERSIST_PROPERTY_NAME_DESIGNER_MODE = "DesignMode";  //$NON-NLS-1$
-    private static final QualifiedName PERSIST_PROPERTY_KEY_DESIGNER_MODE = 
-    	new QualifiedName(PROPERTY_QUALIFIER, PERSIST_PROPERTY_NAME_DESIGNER_MODE);
-
-	/**
-	 * Find the design mode property for the file resource of the
-	 * editor input. If found, then return the property value,
-	 * otherwise return null. 
-	 * 
-	 * @param editorInput
-	 * @return user selected design mode for the editor input file
-	 */
-	public static String getEditorInputDesignModeProperty(IEditorInput editorInput) {
-		String dmProperty = null;
-		if (editorInput != null) {
-			IResource res = ResourceUtil.getResource(editorInput);
-			if (res != null) {
-				try {
-					dmProperty = res.getPersistentProperty(PERSIST_PROPERTY_KEY_DESIGNER_MODE);
-				} catch (CoreException e) {
-					// do nothing;
-				}
-			}
-		}
-
-		return dmProperty;
-	}
-
-	/**
-	 * Save the design mode property for the file resource of the
-	 * editor input. If the supplied mode is <code>null</code>,
-	 * the persistent property is removed from this resource. 
-	 * 
-	 * @param editorInput
-	 * @param mode user selected design mode to be saved
-	 */
-	public static void setEditorInputDesignModeProperty(IEditorInput editorInput, String mode) {
-		if (editorInput != null) {
-			IResource res = ResourceUtil.getResource(editorInput);
-			if (res != null) {
-				try {
-					res.setPersistentProperty(PERSIST_PROPERTY_KEY_DESIGNER_MODE, mode);
-				} catch (CoreException e) {
-					// do nothing;
-				}
-			}
-		}
-	}
-
-	/**
-	 * Calls <code>refreshDesignViewer()</code> on all open HTMLEditor
-	 * (Web Page Editor) instances.
-	 */
-	public static void refreshAllWPEDesignViewers() {
-		IWorkbenchWindow window = Workbench.getInstance().getActiveWorkbenchWindow();
-		if (window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if (page != null) {
-				IEditorReference[] editorRefs = page.getEditorReferences();
-				for (IEditorReference editorRef: editorRefs) {
-					IEditorPart editorPart = editorRef.getEditor(false);
-					if (editorPart instanceof HTMLEditor) {
-						((HTMLEditor)editorPart).refreshDesignViewer();
-					}
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java
deleted file mode 100644
index 0b68bad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class EntityMap {
-	private static Logger _log = PDPlugin.getLogger(EntityMap.class);
-
-	/**
-	 * @param s
-	 * @return s translated for HTML entities.
-	 */
-	public static String translate(String s) {
-		char[] array = s.toCharArray();
-		StringBuffer buffer = new StringBuffer();
-		int posi = 0;
-		int len = array.length;
-		while (posi < len) {
-			if (array[posi] != '&') {
-				buffer.append(replaceBadEntity(array[posi++]));
-				continue;
-			}
-
-			// now array[posi] == '&'
-			int lastPosi = posi;
-			posi++;
-			if (posi < len && array[posi] == '#') {
-				posi++;
-			}
-			while (posi < len) {
-				if (!Character.isLetterOrDigit(array[posi]))
-                {
-					break;
-                }
-				posi++;
-			}
-			// now posi>=array.length or array[posi] is non letter or digit
-			String str = new String(array, lastPosi, posi - lastPosi);
-			if (translateEntity(str, buffer)) {
-				// translated, skip the ';'
-				if (posi < len && array[posi] == ';') {
-					posi++;
-				}
-			}
-
-			if (posi == len) {
-				return buffer.toString();
-			}
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * Translate entity maps and compact whitespace. For heading and training
-	 * space, will not trim, only compact (making multiple whitespace to become
-	 * a single ' ' char).
-	 * @param s 
-	 * @return the result string.
-	 */
-	public static String translateAndCompact(String s) {
-		char[] array = s.toCharArray();
-		StringBuffer buffer = new StringBuffer();
-		int posi = 0;
-		int len = array.length;
-		while (posi < len) {
-			if (HTMLUtil.isHTMLWhitespace(array[posi])) {
-				while (++posi < len && HTMLUtil.isHTMLWhitespace(array[posi]))
-                {
-                    // no body
-                    // loop until we have find non-whitepspace or endof array
-                }
-
-                buffer.append(' ');
-				continue;
-			}
-			if (array[posi] != '&') {
-				buffer.append(replaceBadEntity(array[posi++]));
-				continue;
-			}
-
-			// now array[posi] == '&'
-			int lastPosi = posi;
-			posi++;
-			if (posi < len && array[posi] == '#') {
-				posi++;
-			}
-			while (posi < len) {
-				if (!Character.isLetterOrDigit(array[posi])) {
-					break;
-				}
-                posi++;
-			}
-			// now posi>=array.length or array[posi] is non letter or digit
-			String str = new String(array, lastPosi, posi - lastPosi);
-
-			if (translateEntity(str, buffer)) {
-				// translated, skip the ';'
-				if (posi < len && array[posi] == ';') {
-					posi++;
-				}
-			}
-
-			if (posi == len) {
-				return buffer.toString();
-			}
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * if can translate will return true and append the result string if can't
-	 * translate will return false and append original string
-	 * 
-	 * @param s
-	 *            the form &#number or &letterordigit without the trailing ";"
-	 * @param strBuf 
-	 * @return true  the translation can be done
-	 */
-	public static boolean translateEntity(String s, StringBuffer strBuf) {
-		int i = HTMLSpecialCharHelper.getSpecial(s); // HTMLSpecialCharHelper
-		// support without
-		// traning ';'
-		if (i != -1) {
-			strBuf.append((char) i);
-			return true;
-		}
-		if (s.length() > 2 && s.charAt(1) == '#') {
-			String number;
-			number = s.substring(2);
-			try {
-				int n;
-				if (number.length() > 0
-						&& (number.charAt(0) == 'x' || number.charAt(0) == 'X')) {
-					n = Integer.parseInt(number.substring(1), 16);
-				} else {
-					n = Integer.parseInt(number);
-				}
-				strBuf.append(replaceBadEntity((char) n));
-				return true;
-			} catch (Exception ex) {
-				// Error in integer formating
-				_log.info("Error occurred in integer formatting", ex); //$NON-NLS-1$
-				strBuf.append(s);
-				return false;
-			}
-		}
-        strBuf.append(s);
-        return false;
-	}
-
-	/**
-	 * In HTML &#149; is sometimes used (mostly based on CP 1252), but is
-	 * illegal, because it does not exist in Unicode
-	 * 
-	 * @param n
-	 * @return
-	 * see http://www.w3.org/Talks/1999/0830-tutorial-unicode-mjd/slide27-0.html
-	 */
-	private static char replaceBadEntity(char n) {
-		if (n < 132 || n > 156)
-			return n;
-		switch (n) {
-		case 132:
-			return (char) 8222;
-		case 133:
-			return (char) 8230;
-		case 134:
-			return (char) 8224;
-		case 135:
-			return (char) 8225;
-		case 139:
-			return (char) 8249;
-		case 140:
-			return (char) 338;
-		case 145:
-			return (char) 8216;
-		case 146:
-			return (char) 8217;
-		case 147:
-			return (char) 8220;
-		case 148:
-			return (char) 8221;
-		case 149:
-			return (char) 8226;
-		case 151:
-			return (char) 8212;
-		case 153:
-			return (char) 8482;
-		case 155:
-			return (char) 8250;
-		case 156:
-			return (char) 339;
-		default:
-			return n;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java
deleted file mode 100644
index d30fcd2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * entity map support.
- * 
- * @author mengbo
- */
-public class HTMLSpecialCharHelper {
-	private static Logger _log = PDPlugin
-			.getLogger(HTMLSpecialCharHelper.class);
-
-	private static Hashtable _table;
-
-	private static Hashtable _reverse;
-	static {
-		_table = new Hashtable(256);
-
-		_table.put(Integer.valueOf(34), "&quot;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(38), "&amp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(60), "&lt;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(62), "&gt;"); //$NON-NLS-1$
-
-		_table.put(Integer.valueOf(160), "&nbsp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(161), "&iexcl;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(162), "&cent;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(163), "&pound;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(164), "&curren;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(165), "&yen;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(166), "&brvbar;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(167), "&sect;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(168), "&uml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(169), "&copy;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(170), "&ordf;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(171), "&laquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(172), "&not;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(173), "&shy;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(174), "&reg;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(175), "&macr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(176), "&deg;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(177), "&plusmn;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(178), "&sup2;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(179), "&sup3;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(180), "&acute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(181), "&micro;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(182), "&para;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(183), "&middot;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(184), "&cedil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(185), "&sup1;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(186), "&ordm;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(187), "&raquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(188), "&frac14;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(189), "&frac12;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(190), "&frac34;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(191), "&iquest;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(192), "&Agrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(193), "&Aacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(194), "&Acirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(195), "&Atilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(196), "&Auml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(197), "&Aring;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(198), "&AElig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(199), "&Ccedil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(200), "&Egrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(201), "&Eacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(202), "&Ecirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(203), "&Euml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(204), "&Igrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(205), "&Iacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(206), "&Icirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(207), "&Iuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(208), "&ETH;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(209), "&Ntilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(210), "&Ograve;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(211), "&Oacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(212), "&Ocirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(213), "&Otilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(214), "&Ouml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(215), "&times;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(216), "&Oslash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(217), "&Ugrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(218), "&Uacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(219), "&Ucirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(220), "&Uuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(221), "&Yacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(222), "&THORN;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(223), "&szlig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(224), "&agrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(225), "&aacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(226), "&acirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(227), "&atilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(228), "&auml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(229), "&aring;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(230), "&aelig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(231), "&ccedil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(232), "&egrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(233), "&eacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(234), "&ecirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(235), "&euml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(236), "&igrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(237), "&iacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(238), "&icirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(239), "&iuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(240), "&eth;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(241), "&ntilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(242), "&ograve;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(243), "&oacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(244), "&ocirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(245), "&otilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(246), "&ouml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(247), "&divide;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(248), "&oslash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(249), "&ugrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(250), "&uacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(251), "&ucirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(252), "&uuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(253), "&yacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(254), "&thorn;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(255), "&yuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(402), "&fnof;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(913), "&Alpha;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(914), "&Beta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(915), "&Gamma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(916), "&Delta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(917), "&Epsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(918), "&Zeta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(919), "&Eta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(920), "&Theta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(921), "&Iota;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(922), "&Kappa;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(923), "&Lambda;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(924), "&Mu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(925), "&Nu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(926), "&Xi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(927), "&Omicron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(928), "&Pi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(929), "&Rho;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(931), "&Sigma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(932), "&Tau;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(933), "&Upsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(934), "&Phi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(935), "&Chi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(936), "&Psi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(937), "&Omega;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(945), "&alpha;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(946), "&beta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(947), "&gamma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(948), "&delta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(949), "&epsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(950), "&zeta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(951), "&eta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(952), "&theta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(953), "&iota;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(954), "&kappa;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(955), "&lambda;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(956), "&mu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(957), "&nu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(958), "&xi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(959), "&omicron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(960), "&pi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(961), "&rho;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(962), "&sigmaf;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(963), "&sigma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(964), "&tau;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(965), "&upsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(966), "&phi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(967), "&chi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(968), "&psi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(969), "&omega;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(977), "&thetasym;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(978), "&upsih;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(982), "&piv;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8226), "&bull;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8230), "&hellip;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8242), "&prime;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8243), "&Prime;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8254), "&oline;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8260), "&frasl;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8472), "&weierp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8465), "&image;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8476), "&real;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8482), "&trade;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8501), "&alefsym;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8592), "&larr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8593), "&uarr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8594), "&rarr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8595), "&darr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8596), "&harr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8629), "&crarr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8656), "&lArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8657), "&uArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8658), "&rArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8659), "&dArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8660), "&hArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8704), "&forall;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8706), "&part;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8707), "&exist;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8709), "&empty;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8711), "&nabla;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8712), "&isin;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8713), "&notin;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8715), "&ni;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8719), "&prod;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8722), "&sum;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8722), "&minus;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8727), "&lowast;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8730), "&radic;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8733), "&prop;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8734), "&infin;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8736), "&ang;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8869), "&and;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8870), "&or;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8745), "&cap;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8746), "&cup;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8747), "&int;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8756), "&there4;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8764), "&sim;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8773), "&cong;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8773), "&asymp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8800), "&ne;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8801), "&equiv;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8804), "&le;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8805), "&ge;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8834), "&sub;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8835), "&sup;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8836), "&nsub;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8838), "&sube;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8839), "&supe;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8853), "&oplus;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8855), "&otimes;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8869), "&perp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8901), "&sdot;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8968), "&lceil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8969), "&rceil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8970), "&lfloor;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8971), "&rfloor;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9001), "&lang;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9002), "&rang;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9674), "&loz;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9824), "&spades;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9827), "&clubs;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9829), "&hearts;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9830), "&diams;"); //$NON-NLS-1$
-
-		_table.put(Integer.valueOf(338), "&OElig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(339), "&oelig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(352), "&Scaron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(353), "&scaron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(376), "&Yuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(710), "&circ;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(732), "&tilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8194), "&ensp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8195), "&emsp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8201), "&thinsp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8204), "&zwnj;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8205), "&zwj;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8206), "&lrm;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8207), "&rlm;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8211), "&ndash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(151), "&mdash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8216), "&lsquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8217), "&rsquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8218), "&sbquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8220), "&ldquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8221), "&rdquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8222), "&bdquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8224), "&dagger;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8225), "&Dagger;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8240), "&permil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8249), "&lsaquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8250), "&rsaquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8364), "&euro;"); //$NON-NLS-1$
-
-		_reverse = new Hashtable(256);
-		for (Enumeration e = _table.keys(); e.hasMoreElements();) {
-			Object key = e.nextElement();
-			String value = (String) _table.get(key);
-			_reverse.put(value, key);
-			// also support without the training ';'
-			_reverse.put(value.substring(0, value.length() - 1), key);
-		}
-	}
-
-	/**
-	 * @param ch 
-	 * @return if not in the special list
-	 */
-	public static String getSpecial(int ch) {
-		return (String) _table.get(Integer.valueOf(ch));
-	}
-
-	/**
-	 * @param str
-	 * @return the code value corresponding to the string or null
-	 * if string is unknown
-	 */
-	public static int getSpecial(String str) {
-		Integer result = (Integer) _reverse.get(str);
-		if (result == null) {
-			return -1;
-		}
-        return result.intValue();
-	}
-
-	/**
-	 * @param str
-	 * @param start
-	 * @param end
-	 * @param writer
-	 * @throws IOException
-	 */
-	public static void encode(String str, int start, int end, Writer writer)
-			throws IOException {
-		for (int i = start; i < end; i++) {
-			char ch = str.charAt(i);
-			String special = getSpecial(ch);
-			if (special != null) {
-				writer.write(special);
-			} else {
-				if ((ch & 0xff) != 0) {
-					writer.write("&#"); //$NON-NLS-1$
-					writer.write(Integer.toString(ch));
-					writer.write(";"); //$NON-NLS-1$
-				} else {
-					writer.write(ch);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param str
-	 * @param result
-	 * @return the encoded string buffer
-	 */
-	public static StringBuffer encode(String str, StringBuffer result) {
-		return encode(str, 0, str.length(), result);
-	}
-
-	/**
-	 * @param str
-	 * @param start
-	 * @param end
-	 * @param result
-	 * @return the encoded string buffer
-	 */
-	public static StringBuffer encode(String str, int start, int end,
-			StringBuffer result) {
-		for (int i = start; i < end; i++) {
-			char ch = str.charAt(i);
-			String special = getSpecial(ch);
-			if (special != null) {
-				result.append(special);
-			} else {
-				if ((ch & 0xff00) != 0) {
-					result.append("&#"); //$NON-NLS-1$
-					result.append(Integer.toString(ch));
-					result.append(";"); //$NON-NLS-1$
-				} else {
-					result.append(ch);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param str
-	 * @param buffer
-	 * @return the decoded string buffer
-	 * @throws RuntimeException
-	 */
-	public static StringBuffer decode(String str, StringBuffer buffer)
-			throws RuntimeException {
-		return decode(str, 0, str.length(), buffer);
-	}
-
-	/**
-	 * @param str
-	 * @param start
-	 * @param end
-	 * @param buffer
-	 * @return the decoded string buffer
-	 * @throws RuntimeException
-	 */
-	public static StringBuffer decode(String str, int start, int end,
-			StringBuffer buffer) throws RuntimeException {
-		int pos = start;
-		do {
-			char ch = str.charAt(pos);
-			if (ch == '&') {
-				int stop = str.indexOf(';', pos + 1);
-				if (stop < 0 || stop >= end) {
-					_log.error("HTMLSpecialCharHelper.3"); //$NON-NLS-1$
-					throw new RuntimeException("HTMLSpecialCharHelper.2"); //$NON-NLS-1$
-				}
-				String sp = str.substring(pos, stop + 1);
-				int special = getSpecial(sp);
-				if (special != -1) {
-					buffer.append((char) special);
-				} else {
-					ch = sp.charAt(1);
-					if (ch != '#')
-						throw new RuntimeException("HTMLSpecialCharHelper.1"); //$NON-NLS-1$
-					try {
-						buffer.append((char) Integer.parseInt(sp.substring(2,
-								sp.length() - 1)));
-					} catch (NumberFormatException ex) {
-						_log.info("HTMLSpecialCharHelper.0", ex); //$NON-NLS-1$
-						throw new RuntimeException("illegal: " + sp); //$NON-NLS-1$
-					}
-				}
-				pos = stop + 1;
-			} else {
-				buffer.append(ch);
-				pos++;
-			}
-		} while (pos < end);
-		return buffer;
-	}
-
-	/**
-	 * @param entityRef
-	 * @return the code for the decoded entity reference
-	 */
-	public static int decodeEntity(String entityRef) {
-		Integer result = (Integer) _reverse.get(entityRef);
-		if (result != null) {
-			return result.intValue();
-		}
-		if (entityRef.length() >= 2 && entityRef.charAt(1) == '#') {
-			String s = entityRef.substring(2);
-			if (s.endsWith(";")) { //$NON-NLS-1$
-				s = s.substring(0, s.length() - 1);
-			}
-			try {
-				return Integer.parseInt(s);
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		return -1;
-	}
-}
-
-// FIXME: will it better to use Character instead of Integer ? (yang)
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java
deleted file mode 100644
index f189f78..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class HTMLUtil {
-	/**
-	 * check whether a char is a HTML whitespace.
-	 * 
-	 * @param ch
-	 * @return true if ch is considered to be HTML whitespace
-	 * @see <a href="http://www.w3.org/TR/html4/struct/text.html#h-9.1">white
-	 *      space </a>
-	 */
-	public static boolean isHTMLWhitespace(char ch) {
-		return ch == ' ' || ch == 0x09 || ch == 0x0c || ch == 0x0d
-				|| ch == 0x0a || ch == 0x200b;
-	}
-
-	/**
-	 * @param text
-	 * @return true if the entire string is considered to be HTML whitespace
-	 */
-	public static boolean isHTMLWhitespaceString(String text) {
-		for (int i = 0, size = text.length(); i < size; i++) {
-			if (!isHTMLWhitespace(text.charAt(i))) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * the HTML tags considered to be hidden
-	 */
-	static final String[] HiddenTags = new String[] {
-			IHTMLConstants.TAG_APPLET,
-			IHTMLConstants.TAG_AREA,
-			IHTMLConstants.TAG_BASE,
-			IHTMLConstants.TAG_BASEFONT,
-			IHTMLConstants.TAG_HEAD,
-			IHTMLConstants.TAG_IFRAME,
-			IHTMLConstants.TAG_ISINDEX,
-			IHTMLConstants.TAG_LINK,
-			IHTMLConstants.TAG_META,
-			IHTMLConstants.TAG_NOEMBED,
-			IHTMLConstants.TAG_NOFRAMES,
-			IHTMLConstants.TAG_NOSCRIPT,
-			IHTMLConstants.TAG_SCRIPT,
-			IHTMLConstants.TAG_STYLE,
-			IHTMLConstants.TAG_TITLE,
-			IHTMLConstants.TAG_PARAM };
-
-	/**
-	 * @param tag
-	 * @return true if the tag name is not in the list of hidden tags
-	 */
-	public static boolean isVisualHtmlElement(String tag) {
-		return !Arrays.asList(HiddenTags).contains(tag.toLowerCase());
-	}
-
-	/**
-	 * Handling white space. Basically, for leading and trailing whitespace,
-	 * will handle according whether the text is just after tag start or before
-	 * tag close.
-	 * <p>
-	 * For consequent whitespace, will compact them.
-	 * @param textNode 
-	 * @param s 
-	 * @return the compacted string
-	 * see http://www.w3.org/TR/html4/struct/text.html#h-9.1
-	 */
-	// XXX: currently, the whitespace handling is in this class, in the future
-	// may consider move it
-	// into lower layer (display/CSS layer)
-	public static String compactWhitespaces(Text textNode, String s) {
-		char[] array = s.toCharArray();
-		StringBuffer buffer = new StringBuffer(array.length);
-		int posi = 0;
-		int len = array.length;
-
-		while (posi < len) {
-			if (HTMLUtil.isHTMLWhitespace(array[posi])) {
-				while (++posi < len && HTMLUtil.isHTMLWhitespace(array[posi]))
-                {
-                    // no body
-                    // loop until we have find non-whitepspace or endof array
-                }
-
-				buffer.append(' ');
-				continue;
-			}
-			buffer.append(array[posi++]);
-			continue;
-		}
-		return buffer.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java
deleted file mode 100644
index a63faee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-/**
- * Identifies a factory/dispose advisor for cache entries
- * @param <KEY> 
- * @param <ENTRY> 
- */
-public interface ICacheEntryCreator<KEY,ENTRY> {
-	/**
-	 * @param key
-	 * @return the created entry
-	 */
-	public ENTRY createEntry(KEY key);
-
-	/**
-	 * @param key
-	 * @param entry
-	 */
-	public void dispose(KEY key, ENTRY entry);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java
deleted file mode 100644
index 1fd8672..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLDecoder;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ImageResolver {
-	/**
-	 * 
-	 * @param element
-	 * @param attrName
-	 * @return
-	 */
-	static String getResolvedURL(Element element, String attrName) {
-		URIResolver resolver = null;
-		if (element instanceof IDOMNode) {
-			resolver = ((IDOMNode) element).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = DOMUtil.getAttributeIgnoreCase(element, attrName);
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/**
-	 * given the element and an attribute name identifying the src of the image,
-	 * create a image.
-	 * 
-	 * @param element
-	 * @param attrName
-	 * @return the new image
-	 */
-	public static Image initializeImage(Element element, String attrName) {
-		String url = getResolvedURL(element, attrName);
-		if (url == null) {
-			return null;
-		}
-		//Bug 307801 - [WPE] WPE does not render Images with URL encoding in their path in the preview pane
-		try {
-			url = URLDecoder.decode(url, "UTF-8"); //$NON-NLS-1$
-		} catch(UnsupportedEncodingException uee) {
-			//we tried to decode using recommended encoding, we failed
-		} catch(IllegalArgumentException iae) {
-			//we tried to decode using recommended encoding, we failed
-		}
-		Image img = null;
-		int colonIndex = url.indexOf(":"); //$NON-NLS-1$
-		int slashIndex = url.indexOf("/"); //$NON-NLS-1$
-		if (colonIndex != -1 && (slashIndex != -1 && colonIndex < slashIndex)) {
-			//the url seems to have a protocol, so try to load it as a URL
-			try {
-				URL urlObj = new URL(url);
-				ImageDescriptor imgDesc = ImageDescriptor.createFromURL(urlObj);
-				img = imgDesc.createImage(false);
-			} catch(MalformedURLException mfe) {
-				//attempt to load as a file
-				try {
-					img = new Image(null, url);
-				} catch(SWTException se) {
-					//img remains null on return
-				}
-			} catch(SWTException se) {
-				//img remains null on return
-			}
-		} else {
-			//no protocol, so load it as a file
-			try {
-				img = new Image(null, url);
-			} catch(SWTException se) {
-				//img remains null on return
-			}
-		}
-		return img;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java
deleted file mode 100644
index 4c50dcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-/**
- * Flexible int array. You can set/get of any index value. The array size will
- * be automatically adjusted.
- * 
- * @author mengbo
- */
-public class IntFlexArray {
-	int[] array;
-
-	int size = 0;
-
-	/**
-	 * Create a new flex array with default capacity
-	 */
-	public IntFlexArray() {
-		this(10);
-	}
-
-	/**
-	 * @param initCapacity
-	 */
-	public IntFlexArray(int initCapacity) {
-		if (initCapacity <= 0)
-			initCapacity = 10;
-		array = new int[initCapacity];
-	}
-
-	/**
-	 * @param idx
-	 * @param obj
-	 */
-	public void setAt(int idx, int obj) {
-		ensureCapacity(idx + 1);
-		array[idx] = obj;
-		if (idx + 1 > size)
-			size = idx + 1;
-	}
-
-	/**
-	 * @param idx
-	 * @return the value at idx or 0 if idx is out of bounds
-	 */
-	public int getAt(int idx) {
-		if (idx < array.length)
-			return array[idx];
-        return 0;
-	}
-
-	/**
-	 * @return the current size of the array
-	 */
-	public int getSize() {
-		return size;
-	}
-
-	private void ensureCapacity(int size1) {
-		if (size1 <= array.length)
-			return;
-		int[] temp = array;
-		array = new int[2 * temp.length];
-		System.arraycopy(temp, 0, array, 0, temp.length);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JSPUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JSPUtil.java
deleted file mode 100644
index 0b7f587..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JSPUtil.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * utility class for JSP related information.
- * 
- * @author mengbo
- */
-public class JSPUtil {
-	
-	/**
-	 * JSP source contenttype
-	 */
-	public static final IContentType JSP_CONTENTTYPE = Platform.getContentTypeManager().getContentType("org.eclipse.jst.jsp.core.jspsource"); //$NON-NLS-1$
-	/**
-	 * find out whether the specified taglib has been defined in the IDOMModel.
-	 * If found, then return the prefix. If can't find, then will try to add a
-	 * taglib declaration into the model, and try to use the specified default
-	 * prefix
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param defaultPrefix 
-	 * @return prefix
-	 */
-	public static String getOrCreatePrefix(IDOMModel model, String uri,
-			String defaultPrefix) {
-		return getOrCreatePrefix(model, uri, defaultPrefix, null);
-	}
-
-	/**
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param defaultPrefix
-	 * @param nodes
-	 *            if a taglib node is created, then the created tag lib node is
-	 *            returned in this.  In the case of xml format, it is the attribute node on
-	 *            jsp:root
-	 * @return prefix
-	 */
-	public static String getOrCreatePrefix(IDOMModel model, String uri,
-			String defaultPrefix, Node[] nodes) {
-	
-		String prefix = getPrefix(model, uri);
-		if (prefix != null) {
-			return prefix;
-		}
-
-		prefix = findUnusedPrefix(model, defaultPrefix);
-
-		//need proper API to determine xml type... this may need to change in future
-		if (! model.getDocument().isXMLType()){
-			// TODO: should create the taglib inside the IDOMModel
-			//this is virtually the same as createTaglibDeclaration... fix me
-			Node[] ref = new Node[1];
-			BodyHelper.findHeaderInsertPosition(ITLDConstants.URI_JSP, "taglib", //$NON-NLS-1$
-					model.getDocument(), ref);
-			
-			Element ele = model.getDocument().createElement("jsp:directive.taglib"); //$NON-NLS-1$
-			((IDOMElement) ele).setJSPTag(true);
-			if (isTagDir(uri, model)) {
-				ele.setAttribute(IJSPCoreConstants.ATTR_TAGDIR, uri);
-			}
-			else {
-				ele.setAttribute(IJSPCoreConstants.ATTR_URI, uri);
-			}
-			ele.setAttribute(ICSSPropertyID.ATTR_PREFIX, prefix);
-			if (nodes != null && nodes.length > 0) {
-				nodes[0] = ele;
-			}
-			model.getDocument().insertBefore(ele, ref[0]);
-			new HTMLFormatProcessorImpl().formatNode(ele);
-		}
-		else {//xml format
-			//find root element
-			boolean tldRefExists = false;
-			Element root = getRootElement(model);
-			if (root != null){				
-				NamedNodeMap attrs = root.getAttributes();
-				for (int i=0;i<attrs.getLength();i++){
-					Attr a = (Attr)attrs.item(i);
-					//is the taglib uri already declared?
-					if (a.getValue().equals(uri)){
-						tldRefExists = true;
-						break;
-					}
-				}
-				if (!tldRefExists){
-					//create attribute
-					Attr a = model.getDocument().createAttribute("xmlns:"+prefix); //$NON-NLS-1$
-					a.setValue(uri);
-					root.setAttributeNode(a);
-					new HTMLFormatProcessorImpl().formatNode(root);
-					
-					//duplicating what non-xml case does... no callerd making use of this currently
-					if (nodes != null && nodes.length > 0) {
-						nodes[0] = a;
-					}
-				}
-			}				
-		}
-		return prefix;
-	}
-
-	private static boolean isTagDir(String uri, IDOMModel model) {
-		IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(model.getStructuredDocument(), 0);
-		if (context != null) {
-			IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-			if (resolver != null) {
-				ITaglibDomainMetaDataModelContext tldContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(resolver.getProject(), uri);
-				Trait t = TaglibDomainMetaDataQueryHelper.getTrait(tldContext, "", "isTagDir"); //$NON-NLS-1$ //$NON-NLS-2$		
-				return TraitValueHelper.getValueAsBoolean(t);
-			}
-		}
-		return false;
-	}
-
-	private static Element getRootElement(IDOMModel model) {
-		Document docNode = EditModelQuery.getDocumentNode(model.getDocument());
-		return docNode.getDocumentElement();
-	}
-
-	/**
-	 * Return prefix for taglib if declared in jsp file
-	 * @param model
-	 * @param uri
-	 * @return null means this is tld is not declared in the jsp file
-	 */
-	public static String getPrefix(IDOMModel model, String uri) {
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-		    // if the doc manager has nothing but the type is XML,
-		    // then see if the prefix is encoded as a namespace in
-		    // the doc root
-		    if (model.getDocument().isXMLType())
-		    {
-		        Element root = getRootElement(model);
-	            if (root != null){              
-	                NamedNodeMap attrs = root.getAttributes();
-	                for (int i=0;i<attrs.getLength();i++){
-	                    Attr a = (Attr)attrs.item(i);
-	                    //is the taglib uri already declared?
-	                    if (a.getValue().equals(uri)
-	                            && a.getName().startsWith("xmlns:")) //$NON-NLS-1$
-	                    {
-	                        String prefix =  a.getNodeName().substring("xmlns:".length()); //$NON-NLS-1$
-	                        
-	                        if ("".equals(prefix)) //$NON-NLS-1$
-	                        {
-	                            prefix = null;
-	                        }
-	                        return prefix;
-	                    }
-	                }
-	            }
-		    }
-			return null;
-		}
-		List trackers = m.getTaglibTrackers();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			if (uri.equals(tracker.getURI())) {
-				return tracker.getPrefix();
-			}
-            CMDocument cmdoc = tracker.getDocument();
-            if (cmdoc instanceof TLDDocument
-            		&& uri.equals(((TLDDocument) cmdoc).getUri())) {
-            	return tracker.getPrefix();
-            }
-		}
-		return null;
-	}
-
-	/**
-	 * create specified taglib declaration as jsp directive element
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param prefix
-	 * @return Element
-	 */
-	public static Element createTaglibDeclaration(IDOMModel model, String uri,
-			String prefix) {
-		
-		//seemingly unused - 5/6/09
-		Node[] ref = new Node[1];
-		BodyHelper.findHeaderInsertPosition(ITLDConstants.URI_JSP, "taglib", //$NON-NLS-1$
-				model.getDocument(), ref);
-		Element ele = model.getDocument().createElement("jsp:directive.taglib"); //$NON-NLS-1$
-		((IDOMElement) ele).setJSPTag(true);
-		if (isTagDir(uri, model)) {
-			ele.setAttribute(IJSPCoreConstants.ATTR_TAGDIR, uri);
-		}
-		else {
-			ele.setAttribute(IJSPCoreConstants.ATTR_URI, uri);
-		}
-		ele.setAttribute("prefix", prefix); //$NON-NLS-1$
-		model.getDocument().insertBefore(ele, ref[0]);
-		return ele;
-	}
-
-	/**
-	 * Return prefix to use based upon the suggestion.   
-	 * Appends an integer until unique, if suggestion was used.
-	 * @param model
-	 * @param suggestion
-	 * @return prefix
-	 */
-	public static String findUnusedPrefix(IDOMModel model, String suggestion) {
-		if (suggestion == null) {
-			suggestion = "p"; //$NON-NLS-1$
-		}
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-			return suggestion;
-		}
-		List trackers = m.getTaglibTrackers();
-		Set map = new HashSet();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			map.add(tracker.getPrefix());
-		}
-		if (!map.contains(suggestion)) {
-			return suggestion;
-		}
-		for (int i = 1;; i++) {
-			if (!map.contains(suggestion + i)) {
-				return suggestion + i;
-			}
-		}
-	}
-
-	/**
-	 * given the prefix, find the corresponding jsp tld URI.
-	 * 
-	 * @param model
-	 * @param prefix
-	 * @return prefix
-	 */
-	public static String findURIForPrefix(IDOMModel model, String prefix) {
-		if (prefix == null || model == null) {
-			return null;
-		}
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-			return null;
-		}
-		List trackers = m.getTaglibTrackers();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			if (prefix.equals(tracker.getPrefix())) {
-				CMDocument cmdoc = tracker.getDocument();
-				if (cmdoc instanceof TLDDocument) {
-					return ((TLDDocument) cmdoc).getUri();
-				}
-                break; // fall out and return null
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * judge whether the the baseFile belonged project can support uri specified
-	 * tag lib
-	 * 
-	 * @param uri
-	 *            tag lib uri
-	 * @param baseFile
-	 * @return boolean
-	 */
-	public static boolean supportTaglib(String uri, IFile baseFile) {
-		 //IPath location = baseFile.getLocation();
-		//Bug  https://bugs.eclipse.org/bugs/show_bug.cgi?id=221197 
-		 IPath location = baseFile.getFullPath();
-		if (location != null) {
-			return TaglibIndex.resolve(location.toString(), uri, false) != null;
-		}
-		return false;
-	}
-
-	/**
-	 * @param model
-	 * @return true if model is a JSP contenttype
-	 */
-	public static boolean isJSPModel(IDOMModel model) {		
-		final IContentTypeManager typeManager = Platform.getContentTypeManager();
-		final IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(model.getStructuredDocument(), 0);
-		final IWorkspaceContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-		final IFile file = (IFile)resolver.getResource();
-        final IContentType contentType = 
-            typeManager.findContentTypeFor(file.getName());
-        
-		return contentType.isKindOf(JSP_CONTENTTYPE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java
deleted file mode 100644
index e05000d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJarEntryResource;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class JavaUtil {
-	/**
-	 * 
-	 * @param javaProject
-	 * @param parent
-	 * @return the path in javaProject or new Path("") if not found on a class path
-	 * @author mengbo
-	 */
-	public static IPath getPathOnClasspath(IJavaProject javaProject,
-			Object parent) {
-		IPath result = null;
-		if (javaProject == null || parent == null) {
-			return new Path(""); //$NON-NLS-1$
-		}
-		IClasspathEntry[] entries = javaProject.readRawClasspath();
-		IPath classPath = null;
-		if (parent instanceof IResource) {
-			if (((javaProject != null) && !javaProject
-					.isOnClasspath((IResource) parent))) {
-				return new Path(""); //$NON-NLS-1$
-			}
-			if (parent instanceof IFile) {
-				IPath elementPath = ((IFile) parent).getFullPath();
-				if (((IFile) parent).getFileExtension().equalsIgnoreCase(
-						IFileFolderConstants.EXT_PROPERTIES)) {
-					int machings = 0;
-					try {
-						for (int i = 0; i < entries.length; i++) {
-							// Determine whether on this classentry's path
-							machings = entries[i].getPath()
-									.matchingFirstSegments(elementPath);
-							if (machings > 0) {
-								// Get package name
-								classPath = elementPath.removeFirstSegments(
-										machings).removeLastSegments(1);
-								break;
-							}
-						}
-						// Not on the classpath?
-						if (classPath == null) {
-							return null;
-						} else if (classPath.segmentCount() > 0)
-							result = javaProject.findElement(classPath)
-									.getPath().removeFirstSegments(machings)
-									.append(((IFile) parent).getName());
-						else
-							result = ((IFile) parent).getFullPath()
-									.removeFirstSegments(machings);
-					} catch (Exception e) {
-						// Error.DesignerPropertyTool.NatureQuerying = Error in
-						// project java nature querying
-						PDPlugin.getLogger(JavaUtil.class).error(
-								"Error.DesignerPropertyTool.NatureQuerying", e); //$NON-NLS-1$
-						return null;
-					}
-				}
-			}
-		} else if (parent instanceof IJarEntryResource) {
-			IPath elementPath = ((IJarEntryResource) parent).getFullPath();
-			if (elementPath.getFileExtension().equalsIgnoreCase(
-					IFileFolderConstants.EXT_PROPERTIES)) {
-				result = elementPath;
-			}
-		}
-		if (result != null) {
-			return result;
-		}
-		return new Path(""); //$NON-NLS-1$
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java
deleted file mode 100644
index 164a07e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.w3c.dom.Node;
-
-/**
- * To sort the location of tags, this comparator is used to compare tags' order.
- * 
- * @author mengbo
- */
-public class NodeLocationComparator implements Comparator {
-	private final static Map orders = new HashMap();
-
-	private final static Integer DEFAULT_ORDER = Integer.valueOf(Integer.MAX_VALUE);
-
-	private static NodeLocationComparator _instance = new NodeLocationComparator();
-	static {
-		orders.put("taglib", Integer.valueOf(0)); //$NON-NLS-1$
-		orders.put("directive.taglib", Integer.valueOf(0)); //$NON-NLS-1$
-		orders.put("head", Integer.valueOf(1)); //$NON-NLS-1$
-	}
-
-	private NodeLocationComparator() {
-        // no external instantiation
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static NodeLocationComparator getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * The object to be compared could be Node or tag name.
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		Assert.isTrue((o1 instanceof Node || o1 instanceof String)
-				&& (o2 instanceof Node || o2 instanceof String));
-		Integer i1 = getOrder(o1);
-		Integer i2 = getOrder(o2);
-		return i1.compareTo(i2);
-	}
-
-	private Integer getOrder(Object n) {
-		String name = null;
-		if (n instanceof Node) {
-			name = ((Node) n).getLocalName();
-		} else {
-			name = (String) n;
-		}
-		if (name != null) {
-			Object order = orders.get(name);
-			if (order != null) {
-				return (Integer) order;
-			}
-		}
-		return DEFAULT_ORDER;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java
deleted file mode 100644
index 2433b11..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java
+++ /dev/null
@@ -1,420 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.io.StringReader;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.nio.charset.Charset;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.PropertyResourceBundle;
-import java.util.Map.Entry;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.ui.IEditorInput;
-import org.w3c.dom.Attr;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public class PreviewUtil {
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(PreviewUtil.class);
-
-	/** line separator */
-	public static final String LINE_SEPARATOR = System
-			.getProperty("line.separator"); //$NON-NLS-1$
-
-	/** web root path */
-	private final static String WEBROOT_PATH = null;
-
-	/** the file being previewed */
-	private static IFile CURRENT_FILE = null;
-
-	/** the property bundel */
-	private static PropertyResourceBundle BUNDLE = null;
-
-	/** the property bundel map used for loadbundle preview action */
-	private static Map BUNDLE_MAP = null;
-
-	/** the variable name used for loadbundel preview action */
-	private static String VAR = null;
-
-	/** key is prefix value is uri */
-	private static Map _taglibMap = new HashMap();
-
-
-	/**
-	 * @return the current bundle
-	 */
-	public static final PropertyResourceBundle getBUNDLE() {
-        return BUNDLE;
-    }
-
-    /**
-     * @param bundle
-     */
-    public static final void setBUNDLE(PropertyResourceBundle bundle) {
-        BUNDLE = bundle;
-    }
-
-    /**
-     * @return the current bundle map
-     */
-    public static final Map getBUNDLE_MAP() {
-        return BUNDLE_MAP;
-    }
-
-    /**
-     * @param bundle_map
-     */
-    public static final void setBUNDLE_MAP(Map bundle_map) {
-        BUNDLE_MAP = bundle_map;
-    }
-
-    /**
-     * @return the current variable
-     */
-    public static final String getVAR() {
-        return VAR;
-    }
-
-    /**
-     * @param var
-     */
-    public static final void setVAR(String var) {
-        VAR = var;
-    }
-
-    /**
-	 * @return Returns the _taglibMap.
-	 */
-	public static Map getTaglibMap() {
-		return _taglibMap;
-	}
-
-	/**
-	 * @param map
-	 *            The _taglibMap to set.
-	 */
-	public static void setTaglibMap(Map map) {
-		_taglibMap = map;
-	}
-
-	/**
-	 * Get tag attribute string from attribute map
-	 * 
-	 * @param map
-	 *            tag attribute map
-	 * @return the attribute string
-	 */
-	public static String getAttributesAsString(Map map) {
-		return getAttributesAsString(map, true);
-	}
-
-	/**
-	 * Get file path from uri
-	 * 
-	 * @param uri
-	 *            taglib uri
-	 * @return the path as a string
-	 */
-	public static String getPathFromURI(String uri) {
-		if (uri == null) {
-			return uri;
-		}
-
-		if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
-			return PreviewUtil.WEBROOT_PATH + uri;
-		}
-		IFile curFile = PreviewUtil.CURRENT_FILE;
-		if (curFile != null) {
-			IContainer con = curFile.getParent();
-			if (con != null) {
-				IPath path = con.getLocation();
-				if (path != null) {
-					String aPath = path.toString() + File.separator + uri;
-
-					aPath = aPath.replace('/', File.separatorChar);
-					aPath = aPath.replace('\\', File.separatorChar);
-					if (aPath.endsWith(File.separator)) {
-						aPath += File.separator;
-					}
-					File file = new File(aPath);
-					if (file.exists()) {
-						return aPath;
-					}
-                    return uri;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Get bundle value for expression
-	 * 
-	 * @param attrValue
-	 *            expression
-	 * @return the value
-	 */
-	public static String getValueOFEP(String attrValue) {
-		if (attrValue != null) {
-			if (attrValue.startsWith("#{")) //$NON-NLS-1$
-			{
-				String key, value = null;
-				int i = attrValue.lastIndexOf("."); //$NON-NLS-1$
-				if (i > 0) {
-					key = attrValue.substring(i + 1, attrValue.length() - 1)
-							.trim();
-					String bundleVariable = attrValue.substring(2, i).trim();
-					if (BUNDLE_MAP == null) {
-						return attrValue;
-					}
-					PropertyResourceBundle bundle = (PropertyResourceBundle) BUNDLE_MAP
-							.get(bundleVariable);
-
-					if (bundle != null) {
-						try {
-							value = bundle.getString(key);
-							if (value != null) {
-								return value;
-							}
-                            return attrValue;
-						} catch (MissingResourceException e1) {
-							// "Error in resource bundle processing:"
-							_log.info("PreviewUtil.Error.0", e1); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-		}
-		return attrValue;
-	}
-
-	/**
-	 * Get tag attribute string from attribute map
-	 * 
-	 * @param map
-	 *            tag attribute map
-	 * @param flag
-	 *            state
-	 * @return the attributes as a single string
-	 */
-	private static String getAttributesAsString(Map<String, String> map, boolean flag) {
-		if (map == null) {
-			return null;
-		}
-
-		StringBuffer stringbuffer = new StringBuffer();
-		for (Iterator<Entry<String, String>> e = map.entrySet().iterator(); e.hasNext();) {
-		    Map.Entry<String,String> entry = e.next();
-			String attrName = entry.getKey();
-			String attrValue = entry.getValue();
-			attrValue = getValueOFEP(attrValue);
-			if (ICSSPropertyID.ATTR_SRC.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_HREF.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_URI.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_BINDING.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_PAGE.equalsIgnoreCase(attrName)) {
-				if (PreviewUtil.WEBROOT_PATH != null && attrValue != null
-						&& !attrValue.startsWith("http") //$NON-NLS-1$
-						&& !attrValue.startsWith("file")) //$NON-NLS-1$
-				{
-					attrValue = getPathFromURI(attrValue);
-				}
-			}
-			if (attrValue != null) {
-				stringbuffer.append(" ").append(attrName); //$NON-NLS-1$
-				if (attrValue.indexOf(34) != -1) {
-					StringBuffer stringbuffer1 = new StringBuffer();
-					for (int j = 0; j < attrValue.length(); j++) {
-						char c = attrValue.charAt(j);
-						if (c != '"') {
-							stringbuffer1.append(c);
-						}
-					}
-
-					attrValue = stringbuffer1.toString();
-				}
-				if (attrValue != null && attrValue.startsWith("#{")) //$NON-NLS-1$
-				{
-					attrValue = ""; //$NON-NLS-1$
-				}
-				stringbuffer.append("=\"").append(attrValue).append('"'); //$NON-NLS-1$
-			}
-		}
-		// System.out.println("BBBB:" +stringbuffer.toString());
-
-		return stringbuffer.toString();
-	}
-
-	/**
-	 * Change NamedNodeMap type to Map type
-	 * 
-	 * @param nodeMap
-	 *            NamedNodeMap type
-	 * @return the map
-	 */
-	public static Map getAttributeMap(NamedNodeMap nodeMap) {
-		if (nodeMap != null) {
-			int len = nodeMap.getLength();
-			HashMap map = new HashMap();
-			for (int i = 0; i < len; i++) {
-				Node node = nodeMap.item(i);
-				String name = node.getNodeName();
-				String value = node.getNodeValue();
-				if (name != null
-						&& !name.trim().equalsIgnoreCase("") && value != null) //$NON-NLS-1$
-				{
-					map.put(name, value);
-				}
-			}
-			return map;
-		}
-		return null;
-	}
-
-	/**
-	 * @param result
-	 * @param editorInput
-	 * @return the file
-	 */
-	public static File toFile(StringBuffer result, IEditorInput editorInput) {
-		try {
-			File file = File.createTempFile("previewtmp", ".html"); //$NON-NLS-1$ //$NON-NLS-2$
-			if (!file.exists()) {
-				file.createNewFile();
-			}
-			
-			//fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=202613 kindly contributed by Eiji Morito. 
-			IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
-			IContentType contentType = contentTypeManager.getContentType("org.eclipse.wst.html.core.htmlsource"); //$NON-NLS-1$
-			IContentDescription contentDescription = contentType.getDescriptionFor(new StringReader(result.toString()), null);
-			String charset = contentDescription.getCharset();
-			
-			if (charset == null || !Charset.isSupported(charset)) {
-				charset = ResourcesPlugin.getEncoding();
-				if (charset == null)
-					charset = "UTF-8"; //$NON-NLS-1$
-			}
-
-			FileOutputStream fos = new FileOutputStream(file);
-			PrintStream ps = new PrintStream(fos, true, charset);
-			ps.print(result.toString());
-			ps.close();
-			fos.close();
-			return file;
-		} catch (IOException e) {
-			// "Error in file open:"
-			_log.info("PreviewUtil.Error.3", e); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-
-	/**
-	 * do preivew on Node recursively translate escape char for Node and Node's
-	 * child translate relative path for Node and Node's child
-	 * 
-	 * @param node
-	 *            root node that will be previewed
-	 */
-	public static void previewNode(Node node) {
-		if (node == null) {
-			return;
-		}
-		NodeList nodeList = node.getChildNodes();
-		if (nodeList == null) {
-			return;
-		}
-		NamedNodeMap attrMap = node.getAttributes();
-
-		if (attrMap != null) {
-			for (int i = 0, n = attrMap.getLength(); i < n; i++) {
-				Node attrNode = attrMap.item(i);
-				if (attrNode instanceof Attr) {
-					Attr attr = (Attr) attrNode;
-					String value = attr.getNodeValue();
-					value = getValueOFEP(value);
-					//Bug 307801 - [WPE] WPE does not render Images with URL encoding in their path in the preview pane
-					try {
-						value = URLDecoder.decode(value, "UTF-8"); //$NON-NLS-1$
-					} catch(UnsupportedEncodingException uee) {
-						//we tried to decode using recommended encoding, we failed
-					} catch(IllegalArgumentException iae) {
-						//we tried to decode using recommended encoding, we failed
-					}
-					value = PathUtil.convertToAbsolutePath(value, null);
-					attr.setNodeValue(value);
-				}
-			}
-		}
-		for (int i = 0, n = nodeList.getLength(); i < n; i++) {
-			previewNode(nodeList.item(i));
-		}
-	}
-
-	// /**
-	// * handle escape attebute of tag
-	// *
-	// * @param node
-	// * @return
-	// */
-	// public static boolean escapeFoeNode(Node node)
-	// {
-	// if (node == null)
-	// {
-	// return false;
-	// }
-	// NamedNodeMap attrMap = node.getAttributes();
-	// if (attrMap != null)
-	// {
-	// for (int i = 0, n = attrMap.getLength(); i < n; i++)
-	// {
-	// Node attrNode = attrMap.item(i);
-	// if (attrNode != null && attrNode instanceof Attr)
-	// {
-	// if ("escape".equalsIgnoreCase(attrNode.getNodeName())
-	// && "true".equalsIgnoreCase(attrNode.getNodeValue()))
-	// {
-	// return true;
-	// }
-	// }
-	// }
-	// }
-	// return false;
-	// }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
deleted file mode 100644
index 46330f5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
+++ /dev/null
@@ -1,526 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLDecoder;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A URIResolver implementation
- *
- */
-public class ProjectResolver implements URIResolver {
-	private static final String TLD_TAG_URI = "uri"; //$NON-NLS-1$
-
-	private static final String URI_PREFIX_HTTP = "http"; //$NON-NLS-1$
-
-	private static final String FILE_PROTOCOL = "file"; //$NON-NLS-1$
-
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(ProjectResolver.class);
-
-	private IProject _project = null;
-
-	private String _fileBaseLocation = null;
-
-	private static Map _uriMap = null;
-
-	/**
-	 * It is strongly recommended that clients use
-	 * project.getAdapter(URIResolver.class) to obtain a URIResolver aware of
-	 * the Project's special requirements. Note that a URIResolver may not be
-	 * returned at all so manually creating this object may still be required.
-	 * @param project
-	 */
-	public ProjectResolver(IProject project) {
-		super();
-		_project = project;
-	}
-
-	/**
-	 * @param path
-	 */
-	public void seekTld(IFolder path) {
-		if (path == null) {
-			return;
-		}
-		if (_uriMap == null) {
-			_uriMap = new HashMap();
-		}
-
-		try {
-			IResource[] res = path.members();
-			if (null == res) {
-				return;
-			}
-			for (int i = 0; i < res.length; i++) {
-				if (res[i] instanceof IFolder) {
-					seekTld((IFolder) res[i]);
-				}
-				String ext = res[i].getFileExtension();
-				if (IFileFolderConstants.EXT_TAGLIB.equalsIgnoreCase(ext)) {
-					IFile tldFile = (IFile) res[i];
-					String uri = getURIfromTLD(tldFile);
-					String locate = tldFile.getLocation().toOSString();
-					if (uri != null && _uriMap.get(uri) == null) {
-						_uriMap.put(uri, locate);
-					}
-				}
-			}
-		} catch (CoreException e) {
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param path
-	 */
-	public void seekTld(File path) {
-		if (path == null || !path.isDirectory()) {
-			return;
-		}
-		if (_uriMap == null) {
-			_uriMap = new HashMap();
-		}
-
-		try {
-			File[] res = path.listFiles();
-			if (null == res) {
-				return;
-			}
-			for (int i = 0; i < res.length; i++) {
-				if (res[i] instanceof IFolder) {
-					seekTld(res[i]);
-				}
-
-				if (res[i].getName().endsWith(
-						IFileFolderConstants.DOT
-								+ IFileFolderConstants.EXT_TAGLIB)) {
-					String uri = getURIfromTLD(res[i]);
-					String locate;
-
-					locate = res[i].getCanonicalPath();
-
-					if (uri != null && _uriMap.get(uri) == null) {
-						_uriMap.put(uri, locate);
-					}
-				}
-			}
-		} catch (IOException e1) {
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param tldFile
-	 * @return the uri for the tld in tldFile or null
-	 */
-	public String getURIfromTLD(File tldFile) {
-
-		if (tldFile == null) {
-			return null;
-		}
-		IDOMModel tldModel = null;
-
-		InputStream in = null;
-		try {
-			in = new FileInputStream(tldFile);
-		} catch (FileNotFoundException e) {
-			_log.error("RenderingTraverser.Error.FileNotFound", e); //$NON-NLS-1$
-			return null;
-		}
-//		IDOMModel xmlModel = null;
-
-		try {
-			tldModel = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(
-					tldFile.getAbsolutePath(), in, null);
-			NodeList uriList = tldModel.getDocument().getElementsByTagName(
-					TLD_TAG_URI);
-			for (int i = 0, n = uriList.getLength(); i < n; i++) {
-				Node uri = uriList.item(i);
-				return uri.getChildNodes().item(0).getNodeValue();
-			}
-		} catch (UnsupportedEncodingException e1) {
-			_log.error("RenderingTraverser.Error.UnsupportedEncoding", e1); //$NON-NLS-1$
-		} catch (IOException e1) {
-			_log.error("RenderingTraverser.Error.IO", e1); //$NON-NLS-1$
-		} finally {
-			ResourceUtils.ensureClosed(in);
-			
-			if (tldModel != null)
-			{
-			    tldModel.releaseFromRead();
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param tldFile
-	 * @return the URI for the TLD in tldFile or null
-	 */
-	public String getURIfromTLD(IFile tldFile) {
-		if (tldFile == null) {
-			return null;
-		}
-		IDOMModel tldModel;
-
-		try {
-			tldModel = (IDOMModel) getModelManager().getModelForRead(tldFile);
-			NodeList uriList = tldModel.getDocument().getElementsByTagName(
-					TLD_TAG_URI);
-			for (int i = 0, n = uriList.getLength(); i < n; i++) {
-				Node uri = uriList.item(i);
-				return uri.getChildNodes().item(0).getNodeValue();
-			}
-		} catch (IOException e) {
-			// Error in taglib locating.
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-		} catch (CoreException e1) {
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	/**
-	 * initialize the map of tlds
-	 */
-	public void initTldMap() {
-		if (_uriMap == null) {
-			_uriMap = new HashMap();
-		}
-		if (_project == null) {
-			return;
-		}
-		if (WebrootUtil.getWebContentFolder(_project) == null) {
-			return;
-		}
-		IFolder webinf = WebrootUtil.getWebContentFolder(_project).getFolder(
-				IFileFolderConstants.FOLDER_WEBINF);
-		if (webinf != null && webinf.exists()) {
-			seekTld(webinf);
-		}
-
-		String locate = PDPlugin.getInstallLocation().append("/jsf-tld") //$NON-NLS-1$
-				.toString();
-		File jsfDir = new File(locate);
-		seekTld(jsfDir);
-
-	}
-
-	public java.lang.String getFileBaseLocation() {
-		return _fileBaseLocation;
-	}
-
-	public java.lang.String getLocationByURI(String uri) {
-		// System.out.println(getLocationByURI(uri, getFileBaseLocation()));
-		return getLocationByURI(uri, getFileBaseLocation());
-	}
-
-	private IModelManager getModelManager() {
-		return StructuredModelManager.getModelManager();
-	}
-
-	private String getLocationFromWEBXML(String uri, String baseReference) {
-		if (uri == null) {
-			return null;
-		}
-		try {
-			// if (_project.hasNature(ICommonConstants.NATURE_WEBAPP))
-			// {
-			if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
-				uri = _project.getProject().getLocation().toString()
-						+ IFileFolderConstants.PATH_SEPARATOR
-						+ WebrootUtil.getWebContentFolderName(_project) + uri;
-			}
-			if (uri.startsWith(URI_PREFIX_HTTP)) {
-				IFile webxml = WebrootUtil.getWebContentFolder(_project)
-						.getFolder(IFileFolderConstants.FOLDER_WEBINF).getFile(
-								IFileFolderConstants.FILE_WEB_XML);
-				IDOMModel xmlModel;
-
-				if (webxml.exists()) {
-					try {
-						xmlModel = (IDOMModel) getModelManager()
-								.getModelForRead(webxml);
-
-						NodeList taglibNodeList = xmlModel
-								.getDocument()
-								.getElementsByTagName(ICSSPropertyID.TAG_TAGLIB);
-
-						for (int i = 0, size = taglibNodeList.getLength(); i < size; i++) {
-							Node taglibNode = taglibNodeList.item(i);
-
-							NodeList childList = taglibNode.getChildNodes();
-							String taguri = ""; //$NON-NLS-1$
-							String taglocation = ""; //$NON-NLS-1$
-							for (int j = 0, childSize = childList.getLength(); j < childSize; j++) {
-								Node childTaglibNode = childList.item(j);
-								if (ICSSPropertyID.ATTR_TAGLIB_URI
-										.equalsIgnoreCase(childTaglibNode
-												.getNodeName())) {
-									taguri = childTaglibNode.getChildNodes()
-											.item(0).getNodeValue();
-								}
-								if (ICSSPropertyID.ATTR_TAGLIB_LOCATION
-										.equalsIgnoreCase(childTaglibNode
-												.getNodeName())) {
-									taglocation = childTaglibNode
-											.getChildNodes().item(0)
-											.getNodeValue();
-								}
-
-							}
-							if (uri.equalsIgnoreCase(taguri))
-								uri = _project.getProject().getLocation()
-										.toString()
-										+ IFileFolderConstants.PATH_SEPARATOR
-										+ WebrootUtil
-												.getWebContentFolderName(_project)
-										+ taglocation;
-						}
-						xmlModel.releaseFromRead();
-					} catch (IOException e) {
-
-						// Error in taglib locating.
-						_log.error(
-								"Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-					} catch (CoreException e1) {
-						e1.printStackTrace();
-						_log.error("Error.ProjectResolver.GetlocationByURI.0", //$NON-NLS-1$
-								e1);
-					}
-
-				}
-			}
-			// }
-		} catch (DOMException e1) {
-			// Error in taglib locating.
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1); //$NON-NLS-1$
-		}
-		// catch (CoreException e1)
-		// {
-		//
-		// _log.error("Error.ProjectResolver.GetlocationByURI.0", e1);
-		// }
-
-		if (isFileURL(uri)) {
-			try {
-				URL url = new URL(uri);
-				return getPath(url);
-			} catch (MalformedURLException e) {
-				_log.error("Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-			}
-		}
-		// defect 244817 end
-		return URIHelper.normalize(uri, baseReference, getRootLocationString());
-
-	}
-
-	public String getLocationByURI(String uri, String baseReference) {
-		// DataWindow may generate URL like "d:\somefile" (dos path). We may
-		// need some
-		// special support. (lium)
-		int columnIndex = uri.indexOf(":"); //$NON-NLS-1$
-		int slashIndex = uri.indexOf("/"); //$NON-NLS-1$
-		if (columnIndex != -1 && (slashIndex == -1 || columnIndex < slashIndex)) {
-			return uri;
-		}
-		try {
-			uri = URLDecoder.decode(uri, "UTF-8");  //$NON-NLS-1$
-		} catch (UnsupportedEncodingException e) {
-			// suppress this.  the user's data may be invalid.
-		}
-		String result = getLocationFromWEBXML(uri, baseReference);
-		if (result != null && !result.equals(uri)) {
-			return result;
-		}
-		if (_uriMap == null) {
-			initTldMap();
-		}
-		if (_uriMap != null) {
-			return (String) _uriMap.get(uri);
-		}
-		return null;
-	}
-
-	// defect 244817 start
-	/**
-	 * @param passedSpec
-	 * @return boolean
-	 */
-	private boolean isFileURL(String passedSpec) {
-		if (passedSpec == null) {
-			return false;
-		}
-		final String spec = passedSpec.trim();
-		if (spec.length() == 0) {
-			return false;
-		}
-		String newProtocol = null;
-		for (int index = 0, limit = spec.length(); index < limit; index++) {
-			final char p = spec.charAt(index);
-			if (p == '/') {
-				//$NON-NLS-1$
-				break;
-			}
-			if (p == ':') {
-				//$NON-NLS-1$
-				newProtocol = spec.substring(0, index);
-				break;
-			}
-		}
-		return (newProtocol != null && newProtocol
-				.compareToIgnoreCase(FILE_PROTOCOL) == 0);
-	}
-
-	/**
-	 * @param url
-	 * @return String
-	 */
-	private String getPath(URL url) {
-		String ref = url.getRef() == null ? "" : "#" + url.getRef(); //$NON-NLS-1$ //$NON-NLS-2$
-		String strPath = url.getFile() + ref;
-		IPath path;
-		if (strPath.length() == 0) {
-			path = Path.ROOT;
-		} else {
-			path = new Path(strPath);
-			String query = null;
-			StringTokenizer parser = new StringTokenizer(strPath, "?"); //$NON-NLS-1$
-			int tokenCount = parser.countTokens();
-			if (tokenCount == 2) {
-				path = new Path((String) parser.nextElement());
-				query = (String) parser.nextElement();
-			}
-			if (query == null) {
-				parser = new StringTokenizer(path.toString(), "#"); //$NON-NLS-1$
-				tokenCount = parser.countTokens();
-				if (tokenCount == 2) {
-					path = new Path((String) parser.nextElement());
-				}
-			}
-		}
-		return getPath(path, url.getHost());
-	}
-
-	/**
-	 * @param path
-	 * @param host
-	 * @return String
-	 */
-	private String getPath(IPath path, String host) {
-		IPath newPath = path;
-		// They are potentially for only Windows operating system.
-		// a.) if path has a device, and if it begins with IPath.SEPARATOR,
-		// remove it
-		final String device = path.getDevice();
-		if (device != null && device.length() > 0) {
-			if (device.charAt(0) == IPath.SEPARATOR) {
-				final String newDevice = device.substring(1);
-				newPath = path.setDevice(newDevice);
-			}
-		}
-		// b.) if it has a hostname, it is UNC name... Any java or eclipse api
-		// helps it ??
-		if (newPath != null && host != null && host.length() != 0) {
-			IPath uncPath = new Path(host);
-			uncPath = uncPath.append(path);
-			newPath = uncPath.makeUNC(true);
-		}
-		
-		if (newPath != null)
-		{
-		    return newPath.toString();
-		}
-		return path.toString();
-	}
-
-	/**
-	 * Resolve the (possibly relative) URI acording to RFC1808 using the default
-	 * file base location. Resolves resource references into absolute resource
-	 * locations without ensuring that the resource actually exists. Note:
-	 * currently resolveCrossProjectLinks is ignored in this implementation.
-	 */
-	public java.lang.String getLocationByURI(String uri,
-			boolean resolveCrossProjectLinks) {
-		return getLocationByURI(uri, getFileBaseLocation(),
-				resolveCrossProjectLinks);
-	}
-
-	/**
-	 * Perform the getLocationByURI action using the baseReference as the point
-	 * of reference instead of the default for this resolver Note: currently
-	 * resolveCrossProjectLinks is ignored in this implementation.
-	 */
-	public java.lang.String getLocationByURI(String uri, String baseReference,
-			boolean resolveCrossProjectLinks) {
-		return getLocationByURI(uri, baseReference);
-	}
-
-	public org.eclipse.core.resources.IProject getProject() {
-		return _project;
-	}
-
-	public org.eclipse.core.resources.IContainer getRootLocation() {
-		return _project;
-	}
-
-	private String getRootLocationString() {
-		return null;
-	}
-
-	public void setFileBaseLocation(java.lang.String newFileBaseLocation) {
-		_fileBaseLocation = newFileBaseLocation;
-	}
-
-	public void setProject(org.eclipse.core.resources.IProject newProject) {
-		_project = newProject;
-	}
-
-	public InputStream getURIStream(String uri) {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java
deleted file mode 100644
index c019190..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public class SelectManyHelper {
-
-	private final static Set<String> JSF_SELECT_TAGS, HTML_SELECT_TAGS;
-
-
-	static {
-		Set<String> tempSet = new HashSet<String>(4);
-		tempSet.add(IHTMLConstants.TAG_SELECT);
-		tempSet.add(IHTMLConstants.TAG_OPTGROUP);
-		HTML_SELECT_TAGS = Collections.unmodifiableSet(tempSet);
-		
-		tempSet = new HashSet(8);
-		tempSet.add(IJSFConstants.TAG_SELECTONELISTBOX);
-		tempSet.add(IJSFConstants.TAG_SELECTONEMENU);
-		tempSet.add(IJSFConstants.TAG_SELECTMANYLISTBOX);//
-		tempSet.add(IJSFConstants.TAG_SELECTMANYMENU);//
-		tempSet.add(IJSFConstants.TAG_SELECTMANYCHECKBOX);
-		JSF_SELECT_TAGS = Collections.unmodifiableSet(tempSet);
-	}
-
-	/**
-	 * @param node
-	 * @return the select option children of node
-	 */
-	public static Object[] getSelectOptions(Element node) {
-		if (node == null) {
-			return null;
-		}
-		IDOMModel xmlModel = null;
-		if (node instanceof IDOMNode) {
-			xmlModel = ((IDOMNode) node).getModel();
-		}
-		if (xmlModel == null) {
-			return null;
-		}
-		// TODO: this query is not cached.
-		String prefixNode = JSPUtil.getPrefix(xmlModel,
-				ITLDConstants.URI_JSF_HTML);
-		if (prefixNode != null && node.getPrefix() != null
-				&& node.getPrefix().equals(prefixNode)) {
-			if (JSF_SELECT_TAGS.contains(node.getLocalName())) {
-				String prefixItem = JSPUtil.getPrefix(xmlModel,
-						ITLDConstants.URI_JSF_CORE);
-				List result = new ArrayList();
-				NodeList items = node.getElementsByTagName(prefixItem
-						+ ":" + IJSFConstants.TAG_SELECTITEM); //$NON-NLS-1$
-				for (int i = 0, n = items.getLength(); i < n; i++) {
-					result.add(items.item(i));
-				}
-				items = node.getElementsByTagName(prefixItem
-						+ ":" + IJSFConstants.TAG_SELECTITEMS); //$NON-NLS-1$
-				for (int i = 0, n = items.getLength(); i < n; i++) {
-					result.add(items.item(i));
-				}
-				return result.size() > 0 ? result.toArray(new Node[result
-						.size()]) : null;
-			}
-		}
-		if (node.getPrefix() == null) {
-			if (HTML_SELECT_TAGS.contains(node.getNodeName().toLowerCase())) {
-				List result = new ArrayList();
-				NodeList options = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTION);
-				NodeList optionGroups = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTGROUP);
-				for (int i = 0, n = options.getLength(); i < n; i++) {
-					result.add(options.item(i));
-				}
-				for (int i = 0, n = optionGroups.getLength(); i < n; i++) {
-					result.add(optionGroups.item(i));
-				}
-				return result.toArray(new Node[result.size()]);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param node
-	 * @return the selection option children of node as strings
-	 */
-	public static String[] getSelectOptionsString(Element node) {
-		if (node == null) {
-			return null;
-		}
-		Object[] options = getSelectOptions(node);
-		if (null == options || options[0] == null) {
-			return null;
-		}
-		List result = new ArrayList();
-		for (int i = 0, n = options.length; i < n; i++) {
-			if (options[i] instanceof Element) {
-				Element element = (Element) options[i];
-				Node value = null;
-				if (element.getNodeName()
-						.indexOf(IJSFConstants.TAG_SELECTITEMS) >= 0) {
-					value = element.getAttributeNode(IJSFConstants.ATTR_VALUE);
-				} else if (element.getNodeName().indexOf(
-						IJSFConstants.TAG_SELECTITEM) >= 0) {
-					value = element
-							.getAttributeNode(ICSSPropertyID.ATTR_ITEMLABEL);
-				}
-				if (value != null) {
-					result.add(value.getNodeValue());
-				}
-			}
-		}
-		return (String[]) result.toArray(new String[] {});
-	}
-
-	/**
-	 * @param node
-	 * @return true if node has select option children
-	 */
-	public static boolean hasSelectOptions(Element node) {
-		if (node == null) {
-			return false;
-		}
-		String uri = CMUtil.getElementNamespaceURI(node);
-		if (ITLDConstants.URI_JSF_HTML.equals(uri)) {
-
-			if (JSF_SELECT_TAGS.contains(node.getLocalName())) {
-				IDOMModel model = ((IDOMElement) node).getModel();
-				String jsfcorePrefix = JSPUtil.getPrefix(model,
-						ITLDConstants.URI_JSF_CORE);
-				if (jsfcorePrefix != null) {
-					NodeList nl = node.getElementsByTagName(jsfcorePrefix + ":" //$NON-NLS-1$
-							+ IJSFConstants.TAG_SELECTITEM);
-					NodeList nl1 = node.getElementsByTagName(jsfcorePrefix
-							+ ":" + IJSFConstants.TAG_SELECTITEMS); //$NON-NLS-1$
-					return nl.getLength() > 0 || nl1.getLength() > 0;
-				}
-                return false;
-			}
-		}
-		if (ITLDConstants.URI_HTML.equals(uri)) {
-			if (HTML_SELECT_TAGS.contains(node.getNodeName().toLowerCase())) {
-				NodeList nl = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTION);
-				NodeList nl1 = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTGROUP);
-				return nl.getLength() > 0 || nl1.getLength() > 0;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param node
-	 * @return true if node is a core or HTML select tag
-	 */
-	public static boolean supportSections(Element node) {
-		String uri = CMUtil.getElementNamespaceURI(node);
-		if (ITLDConstants.URI_JSF_HTML.equals(uri)) {
-			return JSF_SELECT_TAGS.contains(node.getLocalName());
-		}
-		if (ITLDConstants.URI_HTML.equals(uri)) {
-			return HTML_SELECT_TAGS.contains(node.getNodeName().toLowerCase());
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectionHelper.java
deleted file mode 100644
index ee93b58..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectionHelper.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition2;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.CharacterData;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class SelectionHelper {
-	/**
-	 * convert the text selection to a Node. Will use the start offset of the
-	 * text selection.
-	 * 
-	 * @param model
-	 * @param textSel
-	 * @return the node for the text selectin in model or null
-	 */
-	public static Node toNode(IStructuredModel model, ITextSelection textSel) {
-		// FIXME: currently always normalize to a single node. should also
-		// consider change into DesignRange
-		// on text selection, find the appropriate Node
-		Object inode = model.getIndexedRegion(textSel.getOffset());
-		if (inode instanceof Node) {
-			return (Node) inode;
-		}
-        return null;
-	}
-
-	/**
-	 * convert a structured selection of NodeEditPart or Node into the first
-	 * node.
-	 * 
-	 * @param selection
-	 * @return the node for the selection or null
-	 */
-	public static Node toNode(IStructuredSelection selection) {
-		if (selection.isEmpty()) {
-			return null;
-		}
-		Object first = selection.getFirstElement();
-		if (first instanceof Node) {
-			return (Node) first;
-		} else if (first instanceof NodeEditPart) {
-			return ((NodeEditPart) first).getIDOMNode();
-		} else {
-			return null;
-		}
-	}
-
-	/**
-	 * convert a DesignRange into a single node.
-	 * 
-	 * @param range
-	 * @return the node for the design range or null
-	 */
-	public static Node toNode(DesignRange range) {
-		if (range.isValid()) {
-			Node node1 = range.getStartPosition().getContainerNode();
-			Node node2 = range.getEndPosition().getContainerNode();
-			return DOMUtil.findCommonAncester(node1, node2);
-		}
-        return null;
-	}
-
-	/**
-	 * @param model
-	 * @param region
-	 *            if null, then will calculate it using offset.
-	 * @param offset
-	 *            offset in source.
-	 * @return a dom position for the region and offset
-	 */
-	public static IDOMPosition toDOMPosition(IDOMModel model,
-			IndexedRegion region, int offset) {
-		if (region == null) {
-			region = model.getIndexedRegion(offset);
-		}
-		if (region == null && offset > 0) {
-			// in case this is at end of file.
-			offset = offset - 1;
-			region = model.getIndexedRegion(offset);
-			if (region != null) {
-				if (region.getEndOffset() >= offset + 1) {
-					offset += 1; // restore offset.
-				}
-			}
-		}
-		if (region == null) {
-			return new DOMPosition(model.getDocument(), 0);
-		}
-		IDOMNode node = (IDOMNode) region;
-		int start = node.getStartOffset();
-		if (offset <= start) {
-			return new DOMRefPosition(node, false);
-		}
-		int end = node.getEndOffset();
-		if (offset >= end) {
-			return new DOMRefPosition(node, true);
-		}
-		if (node instanceof CharacterData) {
-			String data = ((CharacterData) node).getData();
-			String source = node.getSource();
-			if (data.equals(source)) {
-				return new DOMPosition(node, offset - start);
-			}
-			IStructuredDocumentRegion r = node
-					.getFirstStructuredDocumentRegion();
-			int countedData = 0;
-			// TODO: dead? int offsetInNode = offset - start;
-			while (r != null) {
-				if (DOMRegionContext.XML_CHAR_REFERENCE.equals(r.getType())
-						|| DOMRegionContext.XML_ENTITY_REFERENCE.equals(r
-								.getType())) {
-					countedData += 1; // FIXME: what if the entity reference's
-					// corresponding data is more than 1
-					// char?
-					// where can we get that information?
-					if (r.getEnd() >= offset) {
-						return new DOMPosition(node, countedData);
-					}
-				} else {
-					if (r.getEnd() >= offset) {
-						return new DOMPosition(node, countedData + offset
-								- r.getStart());
-					}
-					countedData += r.getLength();
-				}
-				r = r.getNext();
-			}
-			return new DOMRefPosition(node, true);
-		} else if (node instanceof Element) {
-			CMElementDeclaration cm = CMUtil
-					.getElementDeclaration((Element) node);
-			if (cm != null && cm.getContentType() == CMElementDeclaration.EMPTY) {
-				// this node can't have children.
-				return new DOMRefPosition(node, true);
-			}
-			IStructuredDocumentRegion startRegion = node
-					.getStartStructuredDocumentRegion();
-			if (startRegion == null) {
-				return new DOMRefPosition(node, true);
-			}
-            int startRegionEnd = node.getStartStructuredDocumentRegion()
-            		.getEnd();
-            if (offset <= startRegionEnd) {
-            	// it is in the start tag region. So put position at first
-            	// child position.
-            	return new DOMRefPosition2(node, false);
-            }
-            return new DOMRefPosition2(node, true);
-		} else {
-			return new DOMRefPosition(node, true);
-		}
-		// XXX: the implementation in EditModelQuery seemed to be very complex.
-		// Need revisit that
-		// and refactor the implementation to this class later. (lium)
-	}
-
-	/**
-	 * Give a text selection with offset and length, convert it into a Designer
-	 * selection (IStrucuturedSelection of editpart or DesignerRange). If the
-	 * text selection include just a single element node, we'll create a
-	 * IStructuredSelection, otherwise we'll create a DesignerRange.
-	 * 
-	 * @param graphicViewer
-	 * @param offset
-	 * @param length
-	 * @return a selection
-	 */
-	public static ISelection convertToDesignerSelection(
-			IHTMLGraphicalViewer graphicViewer, int offset, int length) {
-		IDOMModel model = graphicViewer.getModel();
-		IndexedRegion region1 = model.getIndexedRegion(offset);
-		IndexedRegion region2 = model.getIndexedRegion(offset + length);
-		IDOMNode node1 = (IDOMNode) region1;
-
-		if (node1 == null) {
-			IDOMPosition endOfDoc = new DOMRefPosition2(model.getDocument(),
-					true);
-			DesignPosition p = DOMPositionHelper.toDesignPosition(endOfDoc);
-			return new DesignRange(p, p);
-		}
-
-		if ((region1 == region2 || node1.getEndOffset() == offset + length)
-				&& !(node1 instanceof Text)) {
-			// ok, we selected a single node.
-			EditPart part = (EditPart) node1.getAdapterFor(EditPart.class);
-			if (part != null) {
-				return new StructuredSelection(part);
-			}
-		}
-
-		// when we reach here, we'll create a DesignerRange
-		IDOMPosition position1 = toDOMPosition(model, region1, offset);
-		IDOMPosition position2 = (length == 0 ? position1 : toDOMPosition(
-				model, region2, offset + length));
-
-		if (position1 == null || position2 == null) {
-			return new DesignRange(null, null);
-		}
-		DesignPosition p1 = DOMPositionHelper.toDesignPosition(position1);
-		DesignPosition p2 = (length == 0 ? p1 : DOMPositionHelper
-				.toDesignPosition(position2));
-		if (p1 == null || p2 == null) {
-			return new DesignRange(null, null);
-		}
-
-		return new DesignRange(p1, p2);
-
-	}
-
-	/**
-	 * convert a IDOMPosition into index in the source.
-	 * 
-	 * @param p
-	 * @return
-	 */
-	private static int getIndexedRegionLocation(IDOMPosition p) {
-		if (!EditValidateUtil.validPosition(p)) {
-			return 0;
-		}
-
-		IDOMNode parent = (IDOMNode) p.getContainerNode();
-		if (p.isText()) {
-			String text = ((CharacterData) parent).getData();
-			String source = parent.getSource();
-			if (text.length() == source.length()) {
-				// no entity reference.
-				return parent.getStartOffset() + p.getOffset();
-			}
-			// CR404708. Need to handle entity reference in the text.
-			int offset = p.getOffset();
-			int counted = 0;
-			IStructuredDocumentRegion r = parent
-					.getFirstStructuredDocumentRegion();
-			while (r != null && counted < offset) {
-				if (DOMRegionContext.XML_CHAR_REFERENCE.equals(r.getType())
-						|| DOMRegionContext.XML_ENTITY_REFERENCE.equals(r
-								.getType())) {
-					counted++;
-					if (counted >= offset) {
-						return r.getEndOffset();
-					}
-				} else {
-					int length = r.getLength();
-					if (counted + length >= offset) {
-						return r.getStartOffset() + offset - counted;
-					}
-					counted += length;
-				}
-				r = r.getNext();
-			}
-			return parent.getStartOffset() + p.getOffset();
-		}
-        IDOMNode previous = (IDOMNode) p.getPreviousSiblingNode();
-        if (previous != null) {
-        	return previous.getEndOffset();
-        }
-        IDOMNode next = (IDOMNode) p.getNextSiblingNode();
-        if (next != null) {
-        	return next.getStartOffset();
-        }
-        IStructuredDocumentRegion r = parent
-        		.getStartStructuredDocumentRegion();
-        if (r != null) {
-        	return r.getEnd();
-        }
-        // r == null normally means the parent is the document node.
-        return parent.getEndOffset();
-	}
-
-	/**
-	 * convert design selection of structured selection of NodeEditPart into
-	 * structured selection of Node
-	 * 
-	 * @param sel
-	 * @return a structured selectino
-	 */
-	public static IStructuredSelection convertFromDesignSelection(
-			IStructuredSelection sel) {
-		List list = sel.toList();
-		if (list != null) {
-			List result = new ArrayList(list.size());
-			for (int i = 0, size = list.size(); i < size; i++) {
-				NodeEditPart part = (NodeEditPart) list.get(i);
-				result.add(part.getIDOMNode());
-			}
-			return new StructuredSelection(result);
-		}
-        return new StructuredSelection();
-	}
-
-	/**
-	 * 
-	 * @param range
-	 *            selection from designer, could be IStructuredSelection of
-	 *            NodeEditPart, or DesignRange.
-	 * @return a text selection
-	 */
-	public static ITextSelection convertFromDesignSelection(DesignRange range) {
-		if (range.isValid()) {
-			IDOMPosition start = DOMPositionHelper.toDOMPosition(range
-					.getStartPosition());
-			IDOMPosition end = DOMPositionHelper.toDOMPosition(range
-					.getEndPosition());
-			// We should not encounter invalid position.
-			if (EditValidateUtil.validPosition(start)
-					&& EditValidateUtil.validPosition(end)) {
-				int offset = getIndexedRegionLocation(start);
-				int endoffset = getIndexedRegionLocation(end);
-				if (offset > endoffset) {
-					int temp = offset;
-					offset = endoffset;
-					endoffset = temp;
-				}
-				return new TextSelection(offset, endoffset - offset);
-			} 
-		}
-        return new TextSelection(0, 0);
-	}
-
-	/**
-	 * @param selection
-	 * @return a text selection for the selection or TextSelection(0,0)
-	 * if nothing can be determined
-	 */
-	public static ITextSelection convertFromDesignSelectionToTextSelection(
-			ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection nodes = convertFromDesignSelection((IStructuredSelection) selection);
-			IDOMNode node = (IDOMNode) nodes.getFirstElement();
-			if (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
-				return new TextSelection(node.getStartOffset(), node
-						.getEndOffset()
-						- node.getStartOffset());
-			}
-		} else if (selection instanceof DesignRange) {
-			return convertFromDesignSelection((DesignRange) selection);
-		}
-        return new TextSelection(0, 0);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/StructuredModelUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/StructuredModelUtil.java
deleted file mode 100644
index 8853975..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/StructuredModelUtil.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * @author mengbo
- */
-public class StructuredModelUtil {
-
-	/**
-	 * this method is copied from ModelManagerImpl of wtp. Because it is
-	 * internal.
-	 * 
-	 * @param model
-	 * @return null if can't get file.
-	 */
-	// TODO: replace (or supplement) this is a "model info" association to the
-	// IFile that created the model
-	public static IFile getFileFor(IStructuredModel model) {
-		if (model == null)
-			return null;
-		String path = model.getBaseLocation();
-		if (path == null || path.length() == 0) {
-			Object id = model.getId();
-			if (id == null)
-				return null;
-			path = id.toString();
-		}
-		// TODO needs rework for linked resources
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		try {
-			IFile file = root.getFile(new Path(path));
-			// IFile file = root.getFileForLocation(new Path(path));
-			return file;
-		} catch (Exception ex) {
-			return null;
-		}
-	}
-
-	/**
-	 * 
-	 * @param model
-	 * @return null if can't find project for the model
-	 */
-	public static IProject getProjectFor(IStructuredModel model) {
-		IProject project = null;
-
-		IFile file = getFileFor(model);
-		if (file != null) {
-			project = file.getProject();
-		}
-		return project;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/UriAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/UriAdapterFactory.java
deleted file mode 100644
index 4bad85a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/UriAdapterFactory.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-
-/**
- * @author mengbo comment go to Window - Preferences - Java - Code Style - Code
- *         Templates
- */
-public class UriAdapterFactory implements IAdapterFactory {
-	/** Create the logger for this class */
-	//private static Logger _log = PDPlugin.getLogger(UriAdapterFactory.class);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object,
-	 *      java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (URIResolver.class.equals(adapterType)) {
-			IProject project = (IProject) adaptableObject;
-			URIResolver fProjectResolver = new ProjectResolver(project);
-			return fProjectResolver;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		Class[] classes = new Class[1];
-		classes[0] = URIResolver.class;
-		return classes;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java
deleted file mode 100644
index 87324f0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.j2ee.internal.web.deployables.WebDeployableArtifactUtil;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class WebAppUtil {
-	private final static String FACES_SERVLET_NAME = "javax.faces.webapp.FacesServlet"; //$NON-NLS-1$
-
-	/**
-	 * @param url
-	 * @param openedFile
-	 * @return the transformed url
-	 */
-	public static String transformJSPURL(String url, IFile openedFile) {
-		boolean canSupportJSF = JSPUtil.supportTaglib(
-				ITLDConstants.URI_JSF_HTML, openedFile);
-		if (canSupportJSF
-				&& url != null
-				&& url.endsWith(IFileFolderConstants.DOT
-						+ IFileFolderConstants.EXT_JSP)) {
-			String urlPattern = ""; //$NON-NLS-1$
-			IVirtualResource[] resources = ComponentCore
-					.createResources(openedFile);
-			IVirtualComponent component = null;
-			if (resources[0] != null) {
-				component = resources[0].getComponent();
-			}
-			if (component != null) {
-				urlPattern = WebDeployableArtifactUtil.getServletMapping(
-						openedFile.getProject(), true, FACES_SERVLET_NAME,
-						component.getName());
-			}
-			if (urlPattern.lastIndexOf(IFileFolderConstants.DOT) != -1) {
-				String extension = urlPattern.substring(urlPattern
-						.lastIndexOf(IFileFolderConstants.DOT));
-				url = url.substring(0, url.lastIndexOf(IFileFolderConstants.DOT
-						+ IFileFolderConstants.EXT_JSP))
-						+ extension;
-			}
-		}
-		return url;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java
deleted file mode 100644
index 7638cd4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-/**
- * @author mengbo
- */
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.w3c.dom.Document;
-
-/**
- * 
- *
- */
-public class XMLUtil {
-	private static Logger _log = PDPlugin.getLogger(XMLUtil.class);
-
-	/**
-	 * Returns a DocumentBuilder capable of creating a DOM Document from input.
-	 * 
-	 * @return a new instance of a document builder or null if an exception
-	 * occurs on creation
-	 */
-	public synchronized static DocumentBuilder getDocumentBuilder() {
-		DocumentBuilder result = null;
-		try {
-			result = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		} catch (ParserConfigurationException e) {
-			// "Error in create documentBuilder"
-			_log.info("XMLUtil.Error.0", e); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	/**
-	 * Transforms a DOM document into a lightly-formatted UTF-8 represntation
-	 * and outputs it to an outputstream
-	 * 
-	 * @param document
-	 * @param ostream
-	 * @throws IOException
-	 */
-	public static void serialize(Document document, OutputStream ostream)
-			throws IOException {
-		Source domSource = new DOMSource(document);
-		try {
-			Transformer serializer = TransformerFactory.newInstance()
-					.newTransformer();
-			try {
-				serializer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
-				serializer.setOutputProperty(
-						"{http://xml.apache.org/xslt}indent-amount", "4"); //$NON-NLS-1$ //$NON-NLS-2$
-				serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
-			} catch (IllegalArgumentException e) {
-				// "Error in object persistance:"
-				_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			}
-			serializer.transform(domSource, new StreamResult(ostream));
-		} catch (TransformerConfigurationException e) {
-			// "Error in object persistance:"
-			_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			throw new IOException(e.getMessage());
-		} catch (TransformerFactoryConfigurationError e) {
-			// "Error in object persistance:"
-			_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			throw new IOException(e.getMessage());
-		} catch (TransformerException e) {
-			// "Error in object persistance:"
-			_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			throw new IOException(e.getMessage());
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ActionData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ActionData.java
deleted file mode 100644
index e0c1afa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ActionData.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * This method represents a user action, the 'data' could be any related
- * data that will be referenced later in the action processing. For example.
- * when user does a DnD, the localData will be referenced as _data.
- * 
- * @author mengbo
- */
-public class ActionData {
-	/**
-	 * Action type for palette drag and drop
-	 */
-	public static final int PALETTE_DND = 1;
-
-	/**
-	 * Action type for databinding drag and drop
-	 */
-	public static final int DATABINDING_DND = 2;
-
-	/**
-	 * Action type for other drag and  drop
-	 */
-	public static final int OTHER_DND = 3;
-
-	/**
-	 * Action type for key board navigation
-	 */
-	public static final int KEYBOARD_NAVAGATION = 4;
-
-	/**
-	 * Action type for inline editing
-	 */
-	public static final int INLINE_EDIT = 5;
-
-	/**
-	 * Action type for component move
-	 */
-	public static final int COMPONENT_MOVE = 6;
-
-	/**
-	 * Unknown action type (?)
-	 */
-	public static final int UNKNOWN = 0;
-
-	private final int _actionType;
-
-	private final Object _data;
-
-	/**
-	 * @param action 
-	 * @param data 
-	 */
-	public ActionData(int action, Object data) {
-		_actionType = action;
-		if (data != null) {
-			_data = data;
-		} else {
-			_data = new Object();
-		}
-	}
-
-	/**
-	 * @return Returns the _actionType.
-	 */
-	public final int getActionType() {
-		return _actionType;
-	}
-
-	/**
-	 * @return Returns the _data.
-	 */
-	public final Object getData() {
-		return _data;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicMovementRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicMovementRule.java
deleted file mode 100644
index f1306ce..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicMovementRule.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-/*package*/ class BasicMovementRule extends DefaultMovementRule {
-
-	/**
-	 * @param actionData
-	 */
-	public BasicMovementRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementRule#allowsMoveIn(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		if (_actionData.getActionType() == ActionData.INLINE_EDIT) {
-			Node node = target.getNode();
-			return EditModelQuery.isText(node) || node.hasChildNodes();
-		}
-		return super.allowsMoveIn(target);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicPositionRule.java
deleted file mode 100644
index 3eaa5f0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicPositionRule.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.w3c.dom.Node;
-
-/**
- * Deal with widget.
- * 
- * @author mengbo
- */
-/*package*/ class BasicPositionRule extends DefaultPositionRule 
-{
-    private final IPositionMediator _mediator;
-
-	/**
-	 * @param mediator
-	 * @param actionData 
-	 */
-	public BasicPositionRule(IPositionMediator mediator, ActionData actionData) {
-	    super(actionData);
-        _mediator = mediator;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.eclipse.gef.EditPart)
-	 */
-	public boolean hasEditableArea(Target target) {
-		if (target == null || target.getPart() == null) {
-			return false;
-		}
-		if (!EditValidateUtil.validNode(target.getNode())) {
-			return false;
-		}
-		if (DefaultPositionRule.isWidget(target.getPart())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	public boolean isEditable(Target target) {
-		if (target.getPart() == null) {
-			return false;
-		}
-		Node node = target.getNode();
-
-		// text is depending on parent.
-		if (EditModelQuery.isText(node)) {
-			return _mediator.isEditable(new Target(node.getParentNode()));
-		}
-		String name = node.getLocalName();
-		// Name is null, the node should not be Element
-		if (name == null && !EditModelQuery.isDocument(node)
-				&& !EditModelQuery.isText(node)) {
-			return false;
-		}
-		// if is widget, return false;
-		if (DefaultPositionRule.isWidget(target.getPart())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#canStopHere(org.w3c.dom.Node)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		Node node = target.getNode();
-		if (target.getPart() == null || node.getNodeType() != Node.ELEMENT_NODE
-				&& !EditModelQuery.isText(node)) {
-			return false;
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ContainerMoveInAndOutRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ContainerMoveInAndOutRule.java
deleted file mode 100644
index c953334..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ContainerMoveInAndOutRule.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-/*package*/ class ContainerMoveInAndOutRule extends DefaultMovementRule {
-	private static final String[] HTML_CONTAINERS = { IHTMLConstants.TAG_TABLE };
-
-	private static final String[] NONE_HTML_CONTAINERS = {};
-
-	private static final String[] SPECIAL_HTML_CONTAINERS = {
-			IJSFConstants.TAG_OUTPUTLINK, IJSFConstants.TAG_COMMANDLINK,
-			IJSFConstants.TAG_FACET, IJSFConstants.TAG_VERBATIM };
-
-	/**
-	 * @param actionData
-	 */
-	public ContainerMoveInAndOutRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canEnter(org.w3c.dom.Node)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		Node node = target.getNode();
-		if (node.getLocalName() != null && //
-				(Arrays.asList(HTML_CONTAINERS).contains(node.getLocalName()
-						.toLowerCase())) || //
-				Arrays.asList(NONE_HTML_CONTAINERS).contains(
-						node.getLocalName()) || //
-				Arrays.asList(SPECIAL_HTML_CONTAINERS).contains(
-						node.getLocalName())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canMoveOut(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		Node node = target.getNode();
-		if (EditModelQuery.isDocument(node)) {
-			return false;
-		}
-
-		if (_actionData.getActionType() == ActionData.INLINE_EDIT
-				&& (IHTMLConstants.TAG_TD.equalsIgnoreCase(node.getLocalName()) || IHTMLConstants.TAG_TH
-						.equalsIgnoreCase(node.getLocalName()))) {
-			return false;
-		}
-		if (node.getLocalName() != null && //
-				(Arrays.asList(HTML_CONTAINERS).contains(node.getLocalName()
-						.toLowerCase())) || //
-				Arrays.asList(NONE_HTML_CONTAINERS).contains(
-						node.getLocalName())) {
-			return false;
-		}
-
-		if (node.getLocalName() != null
-				&& (Arrays.asList(
-						RootContainerPositionRule.HTML_ROOT_CONTAINERS)
-						.contains(node.getLocalName().toLowerCase()) || //
-				Arrays.asList(JSFRootContainerPositionRule.JSF_ROOT_CONTAINERS)
-						.contains(node.getLocalName()))) {
-			if (!EditModelQuery.isChild(
-					JSFRootContainerPositionRule.JSF_ROOT_CONTAINERS, node,
-					false, true)
-					&& //
-					!EditModelQuery.isChild(
-							RootContainerPositionRule.HTML_ROOT_CONTAINERS,
-							node, true, true)) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultMovementRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultMovementRule.java
deleted file mode 100644
index 1aaab7c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultMovementRule.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-/*package*/ class DefaultMovementRule implements IMovementRule {
-	ActionData _actionData;
-
-	/**
-	 * @param actionData 
-	 * 
-	 */
-	public DefaultMovementRule(ActionData actionData) {
-		super();
-		_actionData = actionData;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementRule#allowsMoveIn(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementRule#allowsMoveOut(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionRule.java
deleted file mode 100644
index 40e8222..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionRule.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-
-/**
- * @author mengbo
- */
-public class DefaultPositionRule implements IPositionRule {
-
-	private ActionData _actionData;
-
-	/**
-	 * @param actionData 
-	 * 
-	 */
-	public DefaultPositionRule(ActionData actionData) {
-		super();
-		if (actionData != null) {
-			_actionData = actionData;
-		} else {
-			_actionData = new ActionData(ActionData.UNKNOWN, new Object());
-		}
-	}
-
-    /**
-     * @return the action data
-     */
-    protected final ActionData getActionData()
-    {
-        return _actionData;
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.w3c.dom.Node)
-	 */
-	public boolean hasEditableArea(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	public boolean isEditable(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isTransparent(org.eclipse.gef.EditPart,
-	 *      org.eclipse.draw2d.geometry.Point)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		return true;
-	}
-
-	/**
-	 * If container is inEditable and can be referenced, the position is
-	 * invalid, otherwise as default the position is valid. (non-Javadoc)
-	 */
-	public boolean isValidPosition(IDOMPosition position) {
-		boolean result = isEditable(new Target(position.getContainerNode()));
-		if (result) {
-			if (position.getOffset() == 0
-					|| position.getOffset() == position.getContainerNode()
-							.getChildNodes().getLength()) {
-				result = true;
-			} else {
-				boolean dir;
-				Target target = null;
-				if (position instanceof DOMRefPosition) {
-					target = new Target(((DOMRefPosition) position)
-							.getReferenceNode());
-					dir = ((DOMRefPosition) position).isForward();
-					result = canReference(target, dir);
-				}
-			}
-		}
-		return result;
-	}
-    
-    /**
-     * @param host
-     * @return true if the host edit part is a widget
-     */
-     public static boolean isWidget(EditPart host) {
-        if (host instanceof NodeEditPart) {
-            return ((NodeEditPart) host).isWidget();
-        }
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionValidator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionValidator.java
deleted file mode 100644
index 6c45a83..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionValidator.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-/*package*/ class DefaultPositionValidator implements IPositionMediator {
-	private List<IValidationRule> _rules = new ArrayList<IValidationRule>();
-
-	/**
-	 * the validator's action data
-	 */
-	protected final ActionData _actionData;
-
-	/**
-	 * @return Returns the _actionData.
-	 */
-	public ActionData getActionData() {
-		return _actionData;
-	}
-
-	/**
-	 * @param actionData 
-	 */
-	protected DefaultPositionValidator(ActionData actionData) {
-		_actionData = actionData;
-		initRules();
-	}
-
-	/**
-	 * initialize the default rules
-	 */
-	protected void initRules() {
-		_rules.clear();
-		addRule(new BasicPositionRule(this, _actionData));
-        addRule(new IETablePositionRule(_actionData));
-        addRule(new RootContainerPositionRule(_actionData));
-        addRule(new JSFRootContainerPositionRule(_actionData));
-        addRule(new WhitespacePositionMoveRule(_actionData));
-	}
-
-	/**
-	 * @return Returns the _rules.
-	 */
-	public List getRules() {
-		return Collections.unmodifiableList(_rules);
-	}
-
-	/**
-	 * @param rule
-	 */
-	protected void addRule(IValidationRule rule) {
-		_rules.add(rule);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#hasEditableArea(org.w3c.dom.Node)
-	 */
-	public boolean hasEditableArea(Target target) {
-		boolean result = true;
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-			if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).hasEditableArea(target);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#isEditable(org.w3c.dom.Node)
-	 */
-	public boolean isEditable(Target target) {
-		Node node = target.getNode();
-		boolean result = true;
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-			if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).isEditable(new Target(node));
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#isValidPosition(org.eclipse.jst.pagedesigner.viewer.DesignPosition)
-	 */
-	public boolean isValidPosition(DesignPosition position) {
-		return isValidPosition(DOMPositionHelper.toDOMPosition(position));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#isValidPosition(org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-	 */
-	public boolean isValidPosition(IDOMPosition position) {
-        // if position is really a IDOMRefPosition, convert it to DOMPosition
-		position = EditHelper.ensureDOMPosition(position);
-		boolean refLeft = true, refRight = true, result = true;
-		if (position == null) {
-			return false;
-		}
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-            
-            // rule may be an IValidationRule that is not a position rule
-            // so only use those that are actually position rules
-			if (rule instanceof IPositionRule) {
-                // the IDOMPosition represents a position somewhere in a parent
-                // node based on a node list index.  We need to verify that the
-                // parent is editable.
-				result &= ((IPositionRule) rule).isEditable(new Target(position
-						.getContainerNode()));
-				if (result) {
-					if (!position.isText()) {
-
-                        // TODO C.B: no sure what the point is here.  It appears
-                        // as though it is validating whether the sibling either
-                        // side of this position is a valid location for this 
-                        // action
-                        
-						// ref1?
-						Node node = EditModelQuery.getInstance().getSibling(
-								position, true);
-						if (node != null & refLeft) {
-							refLeft &= ((IPositionRule) rule).canReference(
-									new Target(node), false);
-						}
-						// ref2?
-						node = EditModelQuery.getInstance().getSibling(
-								position, false);
-						if (node != null & refRight) {
-							refRight = ((IPositionRule) rule).canReference(
-									new Target(node), true);
-						}
-						if (!(refLeft | refRight)) {
-							result = false;
-							break;
-						}
-					}
-				} else {
-					break;
-				}
-				// }
-			}
-		}
-		return (result & (refLeft | refRight));
-	}
-
-	/**
-	 * Adjust the position to an editable area.
-	 */
-	public EditPart getEditableContainer(Target target) {
-		EditPart part = target.getPart();
-		if (hasEditableArea(target)) {
-			return target.getPart();
-		}
-		while (part != null && !(part instanceof DocumentEditPart)) {
-			if (hasEditableArea(target)) {
-				break;
-			}
-			part = part.getParent();
-			target = new Target(part);
-		}
-		if (part instanceof DocumentEditPart
-				&& RootContainerPositionRule.hasBasicContainers((Document) part
-						.getModel())) {
-			Node node = RootContainerPositionRule
-					.getBasicContainer((Document) part.getModel());
-			part = Target.resolvePart(node);
-		}
-		return part;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#canReference(org.w3c.dom.Node)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		boolean result = true;
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-			if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).canReference(target, atRight);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DnDPositionValidator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DnDPositionValidator.java
deleted file mode 100644
index 6fddc52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DnDPositionValidator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * This validator is used for caret positioning when user do drag & drop on the
- * screen.
- * 
- * @author mengbo
- * TODO: is this class complete?
- */
-public class DnDPositionValidator extends DefaultPositionValidator {
-    //TODO: not used
-//	private static DnDPositionValidator _instance;
-//
-//	private ActionData _data;
-
-	/**
-	 * @param actionData
-	 */
-	public DnDPositionValidator(ActionData actionData) {
-		super(actionData);
-	}
-
-    /**
-     * Override to make adding rules public on Dnd validators
-     */
-    public void addRule(IValidationRule rule) 
-    {
-        super.addRule(rule);
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DropActionData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DropActionData.java
deleted file mode 100644
index 0d3f211..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DropActionData.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * An action data for object drops
- * @author cbateman
- *
- */
-public class DropActionData extends ActionData
-{
-    /**
-     * @param action
-     * @param data
-     */
-    public DropActionData(int action, DropData data ) 
-    {
-        super(action, data);
-    }
-
-    /**
-     * @return the drop data or  null if none
-     */
-    public DropData getDropData()
-    {
-        return (DropData) getData();
-    }
-    
-    /**
-     * Encapsulates the tags to be dropped
-     *
-     */
-    public static class DropData
-    {
-        private final List    _tagIds;
-        
-        /**
-         * @param tagIds
-         */
-        public DropData(List tagIds)
-        {
-            _tagIds = Collections.unmodifiableList(tagIds);
-        }
-        
-        /**
-         * @return the list of tag ids being dropped.  List
-         * is unmodifiable
-         */
-        public List getTagIdentifiers()
-        {
-            return _tagIds;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/HeadDataPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/HeadDataPositionRule.java
deleted file mode 100644
index ed2fcae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/HeadDataPositionRule.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * Ensure the DnD for loadBundle or taglib is in head area.
- * 
- * @author mengbo
- */
-/*package*/ class HeadDataPositionRule extends DefaultPositionRule {
-
-	/**
-	 * @param data
-	 */
-	public HeadDataPositionRule(ActionData data) {
-		super(data);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IEPanelgridPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IEPanelgridPositionRule.java
deleted file mode 100644
index df41805..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IEPanelgridPositionRule.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * In some place, wen can't do inline editing, like the area between td, in
- * panelGrid, etc. In these places we can't place caret
- * 
- * @author mengbo
- */
-/*package*/ class IEPanelgridPositionRule extends DefaultPositionRule {
-	/**
-	 * @param actionData
-	 */
-	public IEPanelgridPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/**
-	 * PanelGrid is not editable.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#isEditable(Target)
-	 */
-	public boolean isEditable(Target target) {
-		Node node = target.getNode();
-		return !EditModelQuery.isChild(new String[] {
-				IJSFConstants.TAG_PANELGRID, IJSFConstants.TAG_DATATABLE },
-				node, false, false);
-	}
-
-	public boolean hasEditableArea(Target target) {
-		Node node = target.getNode();
-		return !EditModelQuery.isChild(new String[] {
-				IJSFConstants.TAG_PANELGRID, IJSFConstants.TAG_DATATABLE },
-				node, false, false);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IETablePositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IETablePositionRule.java
deleted file mode 100644
index f93405c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IETablePositionRule.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.w3c.dom.Node;
-
-/**
- * This rule constains the operation within a table: 1. The inputing position
- * can only be in 'td' 2. Table structure must be valid.
- * 
- * @author mengbo
- */
-public class IETablePositionRule extends DefaultPositionRule {
-	// We will introduce validation based on DtD later, this is not final
-	// solution.
-	private final String[] CONTAINER = { IHTMLConstants.TAG_THEAD,
-			IHTMLConstants.TAG_TBODY, IHTMLConstants.TAG_TFOOT };
-
-	/**
-	 * @param actionData 
-	 */
-	public IETablePositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		if (EditModelQuery.isChild(IHTMLConstants.TAG_TABLE, target.getNode(),
-				true)) {
-			if (target.getPart() == null) {
-				return false;
-			}
-			Node node = target.getNode();
-			// The target must be in a valid table structure.
-			String name = node.getLocalName();
-			if (node.hasChildNodes()) {
-				// for constrained container, depends on its children.
-				if (name != null
-						&& (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(name) || //
-								Arrays.asList(CONTAINER).contains(
-										name.toLowerCase()) || //
-						IHTMLConstants.TAG_TR.equalsIgnoreCase(name))) {
-					List children = target.getPart().getChildren();
-					for (int i = 0, n = children.size(); i < n; i++) {
-						if (hasEditableArea(new Target((EditPart) children
-								.get(i)))) {
-							return true;
-						}
-					}
-					return false;
-				}
-			} else {
-				if (!isEditable(new Target(node))) {
-					return false;
-				}
-			}
-		}
-		return super.hasEditableArea(target);
-	}
-
-	/**
-	 * Used to valid the structure of table, later will use dtd to do that.
-	 * @param container 
-	 * @return true if the table is valid
-	 */
-	public boolean isInValidTable(Node container) {
-		boolean result = false;
-		try {
-			if (EditValidateUtil.validNode(container)) {
-				if (EditModelQuery.isText(container)) {
-					container = container.getParentNode();
-				}
-				String name = container.getLocalName();
-				if (EditModelQuery.isChild(IHTMLConstants.TAG_TABLE, container,
-						true)) {
-					List ancestors = EditModelQuery.getAncestors(container,
-							IHTMLConstants.TAG_TABLE, true);
-					int offset = ancestors.size();
-					// remove 'table'
-					Node temp = (Node) ancestors.remove(offset - 1);
-					if (temp == container) {
-						return true;
-					}
-					offset--;
-					result = checkValidTrTd(ancestors, container);
-					if (!result) {
-						// thead->tr->td
-						temp = (Node) ancestors.get(offset - 1);
-						name = temp.getNodeName();
-						if (Arrays.asList(CONTAINER).contains(
-								name.toLowerCase())) {
-							if (temp == container) {
-								result = true;
-							} else {
-								// remove 'thead'
-								ancestors.remove(offset - 1);
-								offset--;
-								result = checkValidTrTd(ancestors, container);
-							}
-						}
-					}
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// The exception means the structure is not a valid table, don't
-			// need to report.
-			return false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean isEditable(Target target) {
-		if (EditModelQuery.isChild(IHTMLConstants.TAG_TABLE, target.getNode(),
-				false)) {
-			if (isInValidTable(target.getNode())) {
-				List ancestors = EditModelQuery.getAncestors(target.getNode(),
-						IHTMLConstants.TAG_TABLE, true);
-				if (ancestors.size() >= 3) {
-					if (IHTMLConstants.TAG_TH
-							.equalsIgnoreCase(((Node) ancestors.get(ancestors
-									.size() - 3)).getNodeName())
-							|| //
-							IHTMLConstants.TAG_TD
-									.equalsIgnoreCase(((Node) ancestors
-											.get(ancestors.size() - 3))
-											.getNodeName())) {
-						return true;
-					} else if (ancestors.size() >= 4 //
-							&& (IHTMLConstants.TAG_TH
-									.equalsIgnoreCase(((Node) ancestors
-											.get(ancestors.size() - 4))
-											.getNodeName()) || //
-							IHTMLConstants.TAG_TD
-									.equalsIgnoreCase(((Node) ancestors
-											.get(ancestors.size() - 4))
-											.getNodeName()))) {
-						return true;
-					}
-				}
-			}
-			return false;
-		}
-		return super.isEditable(target);
-	}
-
-	private boolean checkValidTrTd(List ancestors, Node node) {
-		int offset = ancestors.size();
-		if (IHTMLConstants.TAG_TR.equalsIgnoreCase(((Node) ancestors
-				.get(offset - 1)).getLocalName())) {
-			if (ancestors.get(offset - 1) == node) {
-				return true;
-			} else if (IHTMLConstants.TAG_TH.equalsIgnoreCase(((Node) ancestors
-					.get(offset - 2)).getLocalName())
-					|| //
-					IHTMLConstants.TAG_TD.equalsIgnoreCase(((Node) ancestors
-							.get(offset - 2)).getLocalName())) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementMediator.java
deleted file mode 100644
index 8c1fccd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementMediator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-
-/**
- * @author mengbo
- */
-public interface IMovementMediator extends IPositionMediator {
-	/**
-	 * @param target
-	 * @return true if mediator allows movment in
-	 */
-	public boolean allowsMoveIn(Target target);
-
-	/**
-	 * @param target
-	 * @return true if mediator allows movement out
-	 */
-	public boolean allowsMoveOut(Target target);
-
-	/**
-	 * Return a closest parent part which is editable, and it can't moveout.
-	 * 
-	 * @param target
-	 * @return if taget part is editable, then returns itself.
-	 */
-	public EditPart getConstainedEditableContainer(Target target);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementRule.java
deleted file mode 100644
index 90377a8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementRule.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-public interface IMovementRule extends IValidationRule {
-	/**
-	 * @param target
-	 * @return true if allows move in
-	 */
-	public boolean allowsMoveIn(Target target);
-
-	/**
-	 * @param target
-	 * @return true allows move out
-	 */
-	public boolean allowsMoveOut(Target target);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionMediator.java
deleted file mode 100644
index 235a164..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionMediator.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-
-/**
- * @author mengbo
- */
-public interface IPositionMediator {
-	/**
-	 * @return this mediator's action data
-	 */
-	public ActionData getActionData();
-
-	/**
-	 * To see if the node itself or its descendent is editable.
-	 * 
-	 * @param target
-	 * @return true if the target has editable area
-	 */
-	public boolean hasEditableArea(Target target);
-
-	/**
-	 * To see if the position is valid.
-	 * 
-	 * @param position
-	 * @return true if position is  valid
-	 */
-	public boolean isValidPosition(IDOMPosition position);
-
-	/**
-	 * @param position
-	 * @return true if position is valid
-	 */
-	public boolean isValidPosition(DesignPosition position);
-
-	/**
-	 * To see if the node is editable.
-	 * 
-	 * @param target
-	 * @return true if target is editable
-	 */
-	public boolean isEditable(Target target);
-
-	/**
-	 * @param target
-	 * @param atRight
-	 * @return true if can reference target
-	 */
-	public boolean canReference(Target target, boolean atRight);
-
-	/**
-	 * Return a node which contains 'node', and it has editable area.
-	 * 
-	 * @param target
-	 * @return if part is editable, then itself is returned, otherwise a parent
-	 *         is returned.
-	 */
-	public EditPart getEditableContainer(Target target);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionRule.java
deleted file mode 100644
index 6088e1e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionRule.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-
-/**
- * @author mengbo
- */
-public interface IPositionRule extends IValidationRule {
-	/**
-	 * To see if the node is editable. For inline editing, this means whether
-	 * can we input something into the target. For DnD, this means whether can
-	 * we drag and drop something into it.
-	 * 
-	 * @param target
-	 * @return true if target is editable
-	 */
-	public boolean isEditable(Target target);
-
-	/**
-	 * To see if the node itself or its descendent is editable.
-	 * 
-	 * @param target
-	 * @return true if target is editable
-	 */
-	public boolean hasEditableArea(Target target);
-
-	/**
-	 * Whether can we place caret against this part's border. Some container we
-	 * are consider white box, and whitespace may not be suitable for caret
-	 * reference.
-	 * 
-	 * @param target
-	 * @param atRight
-	 *            TODO
-	 * @return true if can reference target
-	 */
-	public boolean canReference(Target target, boolean atRight);
-
-	/**
-	 * To see if the position is valid. Please note, the container is editable
-	 * means there is a child area whithin it is editable, the position may be
-	 * in an inEditable place. So this method is different from hasEditableArea
-	 * and isEditable.
-	 * 
-	 * @param position
-	 * @return true if position is valid
-	 */
-	public boolean isValidPosition(IDOMPosition position);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IValidationRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IValidationRule.java
deleted file mode 100644
index 296d02b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IValidationRule.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-public interface IValidationRule {
-    // TODO: tagging interface?
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java
deleted file mode 100644
index c1c1115..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class InlineEditingNavigationMediator extends
-		InlineEditingPositionMediator implements IMovementMediator {
-
-	/**
-	 * @param actionData
-	 */
-	public InlineEditingNavigationMediator(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.DefaultPositionValidator#initRules(org.eclipse.jst.pagedesigner.caret.ActionData)
-	 */
-	protected void initRules() {
-		super.initRules();
-		this.addRule(new ContainerMoveInAndOutRule(_actionData));
-		this.addRule(new BasicMovementRule(_actionData));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementValidator#allowsMoveIn(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		boolean result = true;
-		List _rules = getRules();
-		for (int i = 0, n = _rules.size(); i < n; i++) {
-			Object rule = _rules.get(i);
-			if (rule instanceof IMovementRule) {
-				result &= ((IMovementRule) rule).allowsMoveIn(target);
-			} else if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).hasEditableArea(target);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementValidator#allowsMoveOut(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		boolean result = true;
-		List _rules = getRules();
-		for (int i = 0, n = _rules.size(); i < n; i++) {
-			Object rule = _rules.get(i);
-			if (rule instanceof IMovementRule) {
-				result &= ((IMovementRule) rule).allowsMoveOut(target);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param target 
-	 * @return ? 
-	 */
-	public EditPart getRootConstainedEditableContainer(Target target) {
-		// if (EditModelQuery.isDocument(target.getNode()))
-		// {
-		// return target.getPart();
-		// }
-		EditPart part = target.getPart();
-		while (part != null) {
-			if (hasEditableArea(target) && !allowsMoveOut(target)) {
-				break;
-			}
-			part = part.getParent();
-			target = new Target(part);
-		}
-		if (part instanceof DocumentEditPart
-				&& RootContainerPositionRule.hasBasicContainers((Document) part
-						.getModel())) {
-			Node node = RootContainerPositionRule
-					.getBasicContainer((Document) part.getModel());
-			part = Target.resolvePart(node);
-		}
-
-		return part;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator#getConstainedEditableContainer(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public EditPart getConstainedEditableContainer(Target target) {
-		EditPart part = target.getPart();
-		while (part != null) {
-			if (hasEditableArea(target)) {
-				break;
-			}
-			part = part.getParent();
-			target = new Target(part);
-		}
-		if (part instanceof DocumentEditPart
-				&& RootContainerPositionRule.hasBasicContainers((Document) part
-						.getModel())) {
-			Node node = RootContainerPositionRule
-					.getBasicContainer((Document) part.getModel());
-			part = Target.resolvePart(node);
-		}
-		return part;
-	}
-
-	/**
-	 * @param position 
-	 * @param p 
-	 * @param viewer 
-	 * @return the constrained editable container or null if none found for the arguments
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator#getConstainedEditableContainer(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public EditPart getConstainedEditableContainer(DesignPosition position,
-			Point p, GraphicalViewer viewer) {
-		Rectangle rect = new Rectangle(p.x, p.y, 1, 1);
-		Viewport port = ((IHTMLGraphicalViewer) viewer).getViewport();
-
-		Point viewLocation = port.getViewLocation();
-		Point lastLocation = viewLocation.getCopy();
-		new ExposeHelper((IHTMLGraphicalViewer) viewer).exposeArea(rect);
-		viewLocation = port.getViewLocation();
-		Dimension offset = lastLocation.getDifference(viewLocation);
-
-		p.translate(offset.width, offset.height);
-		EditPart part = viewer.findObjectAt(p);
-		if (part != null && !(part instanceof ScalableRootEditPart)) {
-			while (part != null) {
-				Target target = new Target(part);
-				if (hasEditableArea(target)) {
-					if (allowsMoveIn(target)
-							|| EditModelQuery.isChild(target.getNode(),
-									position.getContainerNode())) {
-						break;
-					}
-				}
-				part = part.getParent();
-			}
-			if (part instanceof DocumentEditPart
-					&& RootContainerPositionRule
-							.hasBasicContainers((Document) part.getModel())) {
-				Node node = RootContainerPositionRule
-						.getBasicContainer((Document) part.getModel());
-				part = Target.resolvePart(node);
-			}
-			return part;
-		}
-        return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingPositionMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingPositionMediator.java
deleted file mode 100644
index 5329586..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingPositionMediator.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * This validtor is used for inline editing, caret positioning with mouse.
- * 
- * @author mengbo
- */
-public class InlineEditingPositionMediator extends DefaultPositionValidator {
-
-	/**
-	 * @param actionData
-	 */
-	public InlineEditingPositionMediator(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.DefaultPositionValidator#initRules()
-	 */
-	protected void initRules() {
-		super.initRules();
-		addRule(new IEPanelgridPositionRule(_actionData));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/JSFRootContainerPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/JSFRootContainerPositionRule.java
deleted file mode 100644
index 7ec0906..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/JSFRootContainerPositionRule.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Ensure the DnD of jsf component should be within f:view or f:subview.
- * 
- * @author mengbo
- */
-public class JSFRootContainerPositionRule extends DefaultPositionRule {
-    
-    private final static int  DEFAULT_MAX_DEPTH_SEARCH = 3;
-    
-	/**
-	 * TODO: this is not enough because it ignores the uri and keys on only
-	 * the name of the tag.
-	 */
-	/*package*/ static final String[] JSF_ROOT_CONTAINERS = { "view", "subview" }; //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * @param actionData
-	 */
-	public JSFRootContainerPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node),DEFAULT_MAX_DEPTH_SEARCH)) {
-            ActionData actionData = getActionData();
-			if (actionData instanceof DropActionData) {
-                DropActionData dropActionData = (DropActionData) actionData;
-                TagIdentifier tagId = 
-                     (TagIdentifier) dropActionData.getDropData().getTagIdentifiers().get(0);
-                final String uri  = tagId.getUri();
-				if (ITLDConstants.URI_JSF_HTML.equalsIgnoreCase(uri)
-						|| ITLDConstants.URI_JSF_CORE.equalsIgnoreCase(uri)) {
-					boolean result = EditModelQuery.isChild(
-							JSF_ROOT_CONTAINERS, node, true, false);
-					return result
-							|| EditModelQuery.getChild(node,
-									JSF_ROOT_CONTAINERS, 3, false) != null;
-				}
-			} else if (getActionData().getActionType() == ActionData.DATABINDING_DND) {
-				boolean result = EditModelQuery.isChild(JSF_ROOT_CONTAINERS,
-						node, true, false);
-				return result
-						|| EditModelQuery.getChild(node, JSF_ROOT_CONTAINERS, 3,
-								false) != null;
-			}
-		}
-		return super.isEditable(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#isEditable(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean isEditable(Target target) {
-		boolean result = true;
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node), DEFAULT_MAX_DEPTH_SEARCH)) {
-            ActionData actionData = getActionData();
-            if (actionData instanceof DropActionData) {
-                DropActionData dropActionData = (DropActionData) actionData;
-                TagIdentifier tagId = 
-                     (TagIdentifier) dropActionData.getDropData().getTagIdentifiers().get(0);
-                final String uri  = tagId.getUri();
-
-				if (ITLDConstants.URI_JSF_HTML.equalsIgnoreCase(uri)
-						|| ITLDConstants.URI_JSF_CORE.equalsIgnoreCase(uri)) {
-					result = EditModelQuery.isChild(JSF_ROOT_CONTAINERS,
-							node, true, false);
-				}
-			} else if (getActionData().getActionType() == ActionData.DATABINDING_DND) {
-				result = EditModelQuery.isChild(JSF_ROOT_CONTAINERS, node,
-						true, false);
-			}
-			return result;
-		}
-		return super.isEditable(target);
-	}
-
-
-	/**
-	 * @param document
-	 * @param maxDepth 
-	 * @return the closest tag called "view" or "subview" to the root of document
-	 * search to a maximum tag depth of maxDepth
-	 */
-	public static Node getBasicContainer(Document document, int maxDepth) {
-		Node node = EditModelQuery.getChild(document, JSF_ROOT_CONTAINERS, maxDepth,
-				false);
-		return node;
-	}
-
-	/**
-	 * We need to see if body, view are there. and they should be at first or
-	 * second level.
-	 * 
-	 * @param document
-	 * @param maxDepth 
-	 * @return true if document has a view and subview limited to a maximum search
-	 * depth of maxDepth
-	 */
-	public static boolean hasBasicContainers(Document document, int maxDepth) {
-		return getBasicContainer(document, maxDepth) != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.validation.caret.Target,
-	 *      boolean)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		Node node = target.getNode();
-		if (node.getLocalName() != null) {
-            // if the local name of the target is in the list of JSF root
-            // containers
-			if (Arrays.asList(JSF_ROOT_CONTAINERS).contains(
-					node.getLocalName().toLowerCase())) {
-                
-                // verify that either the target is 
-				return EditModelQuery.isChild(
-						RootContainerPositionRule.HTML_ROOT_CONTAINERS, node,
-						false, false)
-						|| EditModelQuery.isChild(JSF_ROOT_CONTAINERS, node,
-								false, false);
-			}
-		}
-		return super.canReference(target, atRight);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/NodeConstructionPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/NodeConstructionPositionRule.java
deleted file mode 100644
index 54b389f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/NodeConstructionPositionRule.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-public class NodeConstructionPositionRule extends DefaultPositionRule {
-
-	/**
-	 * @param actionData 
-	 */
-	public NodeConstructionPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java
deleted file mode 100644
index b44bdb1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * This rule deal with containers 'body', 'head', 'view', 'subview'.
- * 
- * @author mengbo
- */
-public class RootContainerPositionRule extends DefaultPositionRule {
-	static final String[] HTML_ROOT_CONTAINERS = { IHTMLConstants.TAG_BODY, IHTMLConstants.TAG_HEAD };
-
-	/**
-	 * @param actionData
-	 */
-	public RootContainerPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/**
-	 * 1. If anyone of the three containers exists, the target should be in the
-	 * container. 2. If none of the containers exists, then target will be not
-	 * restricted.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		EditPart part = target.getPart();
-		if (part == null) {
-			return false;
-		}
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
-			return true;// isWithinBasicContainer(node);
-		}
-		return super.hasEditableArea(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	public boolean isEditable(Target target) {
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
-			boolean result = isWithinBasicContainer(node);
-			return result;
-		}
-		return super.isEditable(target);
-	}
-
-	/**
-	 * We need to see if body, view are there. and they should be at first or
-	 * second level.
-	 * 
-	 * @param document
-	 * @return true if the document has basic containers
-	 */
-	public static boolean hasBasicContainers(Document document) {
-		return getBasicContainer(document) != null;
-
-	}
-
-	private static boolean isWithinBasicContainer(Node node) {
-		return EditModelQuery.isChild(HTML_ROOT_CONTAINERS, node, true, false);
-	}
-
-	/**
-	 * @param document
-	 * @return the basic root container for the document or null
-	 */
-	public static Node getBasicContainer(Document document) {
-		Node node = EditModelQuery.getChild(document, HTML_ROOT_CONTAINERS, 2,
-				false);
-		if (node == null) {
-			node = EditModelQuery.getChild(document, HTML_ROOT_CONTAINERS, 2,
-					true);
-		}
-		return node;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.validation.caret.Target,
-	 *      boolean)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		Node node = target.getNode();
-		if (node.getLocalName() != null) {
-			if (Arrays.asList(HTML_ROOT_CONTAINERS).contains(
-					node.getLocalName().toLowerCase())) {
-				return EditModelQuery.isChild(
-						JSFRootContainerPositionRule.JSF_ROOT_CONTAINERS, node,
-						false, false);
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/Target.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/Target.java
deleted file mode 100644
index d680ec9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/Target.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class Target {
-	private EditPart _part;
-
-	private Node _node;
-
-	/**
-	 * @param part
-	 */
-	public Target(EditPart part) {
-		_part = part;
-        
-        if(part.getModel() instanceof Node)
-        {
-            _node = (Node) part.getModel();        
-        }
-        else if (part.getModel() instanceof ITagConverter)
-        {
-            _node = ((ITagConverter)part.getModel()).getHostElement();
-        }
-        else
-        {
-            Assert.isTrue(false);
-        }
-	}
-
-	/**
-	 * @param node
-	 */
-	public Target(Node node) {
-		_node = node;
-		Assert.isTrue(node instanceof INodeNotifier);
-		if (((INodeNotifier) node).getAdapterFor(EditPart.class) != null) {
-			_part = (EditPart) ((INodeNotifier) node)
-					.getAdapterFor(EditPart.class);
-		}
-	}
-
-	/**
-	 * @return Returns the _node.
-	 */
-	public Node getNode() {
-		return _node;
-	}
-
-	/**
-	 * @return Returns the _part.
-	 */
-	public EditPart getPart() {
-		return _part;
-	}
-
-    /**
-     * @return the target's tag wrapper or null if the target
-     * is not an Element node
-     */
-    public TagIdentifier getTagWrapper()
-    {
-        if (_node instanceof Element)
-        {
-            return TagIdentifierFactory.createDocumentTagWrapper((Element)_node);
-        }
-        
-        return null;
-    }
-    
-	/**
-	 * @param node
-	 * @return the edit part for node or null if none found
-	 */
-	public static EditPart resolvePart(Node node) {
-		if (node instanceof INodeNotifier
-				&& ((INodeNotifier) node).getAdapterFor(EditPart.class) != null) {
-			return (EditPart) ((INodeNotifier) node)
-					.getAdapterFor(EditPart.class);
-		}
-		return null;
-	}
-
-	/**
-	 * @param part
-	 * @return the node for part
-	 */
-	public static Node resolveNode(EditPart part) {
-		return (Node) part.getModel();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/WhitespacePositionMoveRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/WhitespacePositionMoveRule.java
deleted file mode 100644
index 79e87c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/WhitespacePositionMoveRule.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.w3c.dom.Text;
-
-/**
- * For whitespaces 1. If there is sibling can be reference, then we don't
- * reference whitespace text. 2. Position can't be between whitespace text.
- * 
- * @author mengbo
- */
-public class WhitespacePositionMoveRule extends DefaultPositionRule implements
-		IMovementRule {
-
-	/**
-	 * @param actionData
-	 */
-	public WhitespacePositionMoveRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canEnter(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		if (EditModelQuery.isTransparentText(target.getNode())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canMoveOut(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		boolean result = super.canReference(target, atRight);
-		if (EditModelQuery.isText(target.getNode())) {
-			if (((Text) target.getNode()).getData().length() == 0) {
-				result = false;
-			} else if (EditModelQuery.isTransparentText(target.getNode())) {
-				DesignPosition position = new DesignRefPosition(target
-						.getPart(), atRight);
-				if (EditPartPositionHelper.getConcretePart(position, atRight) != null) {
-					result = true;
-				} else {
-					EditPart part = EditPartPositionHelper.getNextConcretPart(
-							position, atRight);
-					EditPart oppPart = EditPartPositionHelper
-							.getNextConcretPart(position, !atRight);
-					if (part == null) {
-						if (oppPart == null) {
-							result = true;
-						}
-					}
-					result = false;
-				}
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		if (EditModelQuery.isTransparentText(target.getNode())) {
-			return false;
-		}
-		return super.hasEditableArea(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean isEditable(Target target) {
-		if (EditModelQuery.isTransparentText(target.getNode())) {
-			return false;
-		}
-		return super.isEditable(target);
-	}
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.caret.IPositionRule#isValidPosition(org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-	// */
-	// public boolean isValidPosition(IDOMPosition position)
-	// {
-	// Node node = null;
-	// if (position instanceof DOMRefPosition)
-	// {
-	// node = ((DOMRefPosition)position).getReferenceNode();
-	// } else if (position.isText())
-	// {
-	// node = position.getContainerNode();
-	// } else {
-	// return super.isValidPosition(position);
-	// }
-	// if (EditModelQuery.isTransparentText(position.getContainerNode()))
-	// {
-	// if (node.getPreviousSibling() != null)
-	// {
-	// node = node.getPreviousSibling();
-	// return _mediator.canReference(new Target(node), true);
-	// }
-	// else if (node.getNextSibling() != null)
-	// {
-	// node = node.getNextSibling();
-	// return _mediator.canReference(new Target(node), false);
-	// }
-	// }
-	// return super.isValidPosition(position);
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java
deleted file mode 100644
index 6dbeb64..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.editparts.LayerManager;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * Abstract parent of all concrete client implmentation of IDropLocationStrategy's
- * Clients should sub-class instead of implementing {@link IDropLocationStrategy} directly
- * to avoid future API breakage
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDropLocationStrategy  implements IDropLocationStrategy 
-{
-    private final EditPartViewer        _viewer;
-    
-    /**
-     * @param viewer
-     */
-    public AbstractDropLocationStrategy(EditPartViewer viewer)
-    {
-        _viewer = viewer;
-    }
-    
-    public abstract DesignPosition calculateDesignPosition(EditPart host, Point p,
-            IPositionMediator validator);
-
-    public abstract List showTargetFeedback(EditPart host, DesignPosition position, DropRequest request);
-
-    /**
-     * @return the viewer in which this strategy may show target feedback
-     */
-    protected final EditPartViewer getViewer() 
-    {
-        return _viewer;
-    }
-    
-    /**
-     * @return the figure for the feedback layer
-     */
-    protected final IFigure getFeedbackLayer()
-    {
-        return LayerManager.Helper.find(_viewer.getRootEditPart().getContents()).getLayer(LayerConstants.FEEDBACK_LAYER);
-    }
-    
-    /**
-     * Adds the specified <code>Figure</code> to the {@link LayerConstants#FEEDBACK_LAYER}.
-     * @param figure the feedback to add
-     */
-    protected void addFeedback(IFigure figure) {
-        getFeedbackLayer().add(figure);
-    }
-    
-    /**
-     * Removes the specified <code>Figure</code> to the {@link LayerConstants#FEEDBACK_LAYER}.
-     * @param figure the feedback to remove
-     */
-    protected void removeFeedback(IFigure figure) {
-        getFeedbackLayer().remove(figure);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java
deleted file mode 100644
index 27aae69..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CaretPositionResolver {
-	private IPositionMediator _validator;
-
-	private Point _point;
-
-	private static CaretPositionResolver _instance;
-
-	/**
-	 * @param validator
-	 * @param point
-	 * @return the singleton instance
-	 */
-	public static CaretPositionResolver getInstance(
-			IPositionMediator validator, Point point) {
-		if (_instance == null) {
-			_instance = new CaretPositionResolver();
-		}
-		_instance.setPoint(point);
-		_instance.setValidator(validator);
-		return _instance;
-	}
-
-	/**
-	 * @param _point
-	 *            The _point to set.
-	 */
-	private void setPoint(Point _point) {
-		this._point = _point;
-	}
-
-	/**
-	 * @param _validator
-	 *            The _validator to set.
-	 */
-	private void setValidator(IPositionMediator _validator) {
-		this._validator = _validator;
-	}
-
-	/**
-	 * Calculate the two part's distance to point, the shorter one will be
-	 * return. Distance is calculated based on: if there is one box contains
-	 * point.y, then calculate that box, or if there is no any such one box,
-	 * then calculate the y distance.
-	 * 
-	 * @param part1
-	 * @param part2
-	 * @param point
-	 * @return
-	 */
-	static LayoutPart getCloserPart(LayoutPart part1, LayoutPart part2,
-			Point _point) {
-		if (part1 == null
-				|| EditModelQuery.isTransparentText(Target.resolveNode(part1
-						.getPart()))) {
-			return part2;
-		} else if (part2 == null
-				|| EditModelQuery.isTransparentText(Target.resolveNode(part2
-						.getPart()))) {
-			return part1;
-		}
-		Rectangle rect1 = part1.getAbsoluteBounds();
-		Rectangle rect2 = part2.getAbsoluteBounds();
-		Node n1 = Target.resolveNode(part1.getPart());
-		Node n2 = Target.resolveNode(part2.getPart());
-		// Within same.
-		if (EditModelQuery.isChild(n1, n2)
-				&& (CaretPositionResolver.getXDistance(rect2, _point) == 0)
-				&& !part1.isCloseToEdgeFromOutSide()) {
-			return part2;
-		} else if (EditModelQuery.isChild(n2, n1)
-				&& (CaretPositionResolver.getXDistance(rect1, _point) == 0 && !part2
-						.isCloseToEdgeFromOutSide())
-				&& !part2.isCloseToEdgeFromOutSide()) {
-			return part1;
-		}
-		if (rect1.intersect(new Rectangle(rect1.x, rect2.y, rect1.width,
-				rect2.height)).height == 0) {
-			return heightFirst(part1, part2, _point);
-		}
-        return widthFirst(part1, part2, _point);
-	}
-
-	private static LayoutPart heightFirst(LayoutPart part1, LayoutPart part2,
-			Point _point) {
-		Rectangle rect1 = part1.getAbsoluteBounds();
-		Rectangle rect2 = part2.getAbsoluteBounds();
-		int offset1 = Math.abs(CaretPositionResolver
-				.getYDistance(rect1, _point));
-		int offset2 = Math.abs(CaretPositionResolver
-				.getYDistance(rect2, _point));
-		if (offset1 > offset2) {
-			return part2;
-		} else if (offset1 < offset2) {
-			return part1;
-		} else {
-			offset1 = Math.abs(CaretPositionResolver
-					.getXDistance(rect1, _point));
-			offset2 = Math.abs(CaretPositionResolver
-					.getXDistance(rect2, _point));
-			if (offset1 >= offset2) {
-				return part2;
-			}
-            return part1;
-		}
-	}
-
-	private static LayoutPart widthFirst(LayoutPart part1, LayoutPart part2,
-			Point _point) {
-		Rectangle rect1 = part1.getAbsoluteBounds();
-		Rectangle rect2 = part2.getAbsoluteBounds();
-		int offset1 = Math.abs(CaretPositionResolver
-				.getXDistance(rect1, _point));
-		int offset2 = Math.abs(CaretPositionResolver
-				.getXDistance(rect2, _point));
-		if (offset1 > offset2) {
-			return part2;
-		} else if (offset1 < offset2) {
-			return part1;
-		} else {
-			offset1 = Math.abs(CaretPositionResolver
-					.getYDistance(rect1, _point));
-			offset2 = Math.abs(CaretPositionResolver
-					.getYDistance(rect2, _point));
-			if (offset1 >= offset2) {
-				return part2;
-			}
-            return part1;
-		}
-	}
-
-	/**
-	 * Return a descendent part under parent that is one of the closest part to
-	 * point.
-	 * 
-	 * @param parent
-	 * @return
-	 */
-	private LayoutPart getClosestChildPart(LayoutPart parent) {
-		LayoutPart result = null;
-		if (parent != null) {
-			List children = null;
-			if ((children = parent.getPart().getChildren()).size() > 0) // &&
-			// _validator.hasEditableArea(new
-			// Target(parent.getPart())))
-			{
-				// iterate its children, we know the part doesn't contain p. so
-				// we only see if its children can be
-				// referenced.
-				for (int i = 0, n = children.size(); i < n; i++) {
-					LayoutPart nextPart = new LayoutPart((EditPart) children
-							.get(i), _point);
-					Target target = new Target(nextPart.getPart());
-					if (_validator.isValidPosition(new DesignRefPosition(target
-							.getPart(), false))) {
-						result = getCloserPart(result, nextPart, _point);
-					} else if (_validator.hasEditableArea(target)) {
-						LayoutPart temp = getClosestChildPart(nextPart);
-						if (temp == null) {
-							temp = nextPart;
-						}
-						result = getCloserPart(result, temp, _point);
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Use by vertical movement, we need to see whther the par
-	 * 
-	 * @param closestPart
-	 * @param target
-	 * @return
-	 */
-	LayoutPart resolveClosestPartFrom(LayoutPart closestPart) {
-		Target target = new Target(closestPart.getPart());
-		LayoutPart finalPart = null;
-		if (EditModelQuery.isInline(Target.resolveNode(closestPart.getPart()))) {
-
-			if (closestPart.isAfterPoint() || closestPart.isBeforePoint()) {
-				finalPart = closestPart;
-			} else {
-				if (_validator.hasEditableArea(target)
-						&& (_validator instanceof IMovementMediator
-								&& ((IMovementMediator) _validator)
-										.allowsMoveIn(target) || !(_validator instanceof IMovementMediator))) {
-					finalPart = getClosestChildPartOrPart(closestPart);
-				}
-			}
-		}
-		// block
-		else {
-			if (closestPart.contains(_point)) {
-				if (_validator.hasEditableArea(target) && //
-						(_validator instanceof IMovementMediator
-								&& ((IMovementMediator) _validator)
-										.allowsMoveIn(target) || !(_validator instanceof IMovementMediator))) {
-					finalPart = getClosestChildPartOrPart(closestPart);
-				}
-			}
-			// outside of bounds
-			else {
-				if (_validator.hasEditableArea(target)
-						&& !IHTMLConstants.TAG_TABLE.equalsIgnoreCase(target
-								.getNode().getNodeName())
-						&& (_validator instanceof IMovementMediator
-								&& ((IMovementMediator) _validator)
-										.allowsMoveIn(target) || !(_validator instanceof IMovementMediator))) {
-					if (closestPart.atSameRow(_point)) {
-						finalPart = getClosestChildPartOrPart(closestPart);
-					} else if (!_validator
-							.isValidPosition(new DesignRefPosition(target
-									.getPart(), true))) {
-						finalPart = getClosestChildPartOrPart(closestPart);
-					}
-				}
-			}
-		}
-		if (finalPart == null && //
-				(_validator.isValidPosition(new DesignRefPosition(target
-						.getPart(), true)) || // 
-				_validator.isValidPosition(new DesignRefPosition(target
-						.getPart(), false)))) {
-			finalPart = closestPart;
-		}
-		return finalPart;
-	}
-
-	private LayoutPart getClosestChildPartOrPart(LayoutPart closestPart) {
-		LayoutPart result = getClosestChildPart(closestPart);
-		if (result != null) {
-			result = resolveClosestPartFrom(result);
-		} else {
-			if (closestPart.getConcretePart() == null) {
-				result = closestPart;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Get the distance from rect's edge to point.x.
-	 * 
-	 * @param rect
-	 * @param point
-	 * @return the X distance
-	 */
-	public static int getXDistance(Rectangle rect, Point point) {
-		if (rect.getRight().x <= point.x) {
-			return point.x - (rect.getRight().x);
-		} else if (rect.x >= point.x) {
-			return point.x - rect.x;
-		} else if (rect.x <= point.x && point.x <= rect.getRight().x) {
-			return 0;
-		}
-		return -1;
-	}
-
-	/**
-	 * from point to middle's distance. If the result is nagative, point is at
-	 * left part of rect, if it is positive, the point is at the right part.
-	 * 
-	 * @param rect
-	 * @param point
-	 * @return the X distance
-	 */
-	public static int toXMiddle(Rectangle rect, Point point) {
-		return (point.x - (rect.x + rect.getRight().x) / 2);
-	}
-
-	/**
-	 * from point to middle's distance If the result is nagative, point is at
-	 * upper part of rect, if it is positive, the point is at the lower part.
-	 * 
-	 * @param rect
-	 * @param point
-	 * @return the Y distance
-	 */
-	public static int toYMiddle(Rectangle rect, Point point) {
-		return (point.y - (rect.y + rect.getBottom().y) / 2);
-	}
-
-	/**
-	 * @param rect
-	 * @param point
-	 * @return the Y distance
-	 */
-	public static int getYDistance(Rectangle rect, Point point) {
-		if (rect.y + rect.height <= point.y) {
-			return point.y - (rect.y + rect.height);
-		} else if (rect.y >= point.y) {
-			return point.y - rect.y;
-		} else if (rect.y <= point.y && point.y <= rect.y + rect.height) {
-			return 0;
-		}
-		return -1;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java
deleted file mode 100644
index f116e06..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-import org.eclipse.draw2d.FigureListener;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RangeModel;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.swt.widgets.Caret;
-
-/**
- * This class is responsible for update the caret location. At least the
- * following changes may result in caret location change. <ll>
- * <li>The selection mode change. For example, from/to text mode to/from object
- * mode, we need to hide/display the caret
- * <li>The caret location change in the model.
- * <li>the figures moved. This may result in model change in somewhere else, or
- * user resized the page designer.
- * <li>The figure that containing the caret get recreated. </ll>
- * 
- * @author mengbo
- */
-/*package*/ class CaretUpdater implements IHTMLGraphicalViewerListener,
-		FigureListener {
-//	private static final Logger _log = PDPlugin.getLogger(CaretUpdater.class);
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private boolean _viewerBatchChanging = false;
-
-	/**
-	 * the width value of the caret in pixels
-	 */
-	public static final int CARET_WIDTH = 2;
-
-	/**
-	 * the figure the caret associate to, we need to track this figure's
-	 * resizing, location change, etc.
-	 */
-	private IFigure _trackFigure;
-
-	/**
-	 * @param viewer
-	 */
-	public CaretUpdater(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-		setup();
-	}
-
-	/**
-	 * set up the
-	 */
-	public void setup() {
-		_viewer.addHTMLViewerListener(this);
-	}
-
-	/**
-	 * this method is called after the view is fully initialized.
-	 */
-	public void connectViewer() {
-		Viewport viewport = _viewer.getViewport();
-		if (viewport != null) {
-			viewport.getHorizontalRangeModel().addPropertyChangeListener(
-					new PropertyChangeListener() {
-						public void propertyChange(
-								PropertyChangeEvent propertychangeevent) {
-							if ((propertychangeevent.getSource() instanceof RangeModel)
-									&& (propertychangeevent.getPropertyName()
-											.equals(ICSSPropertyID.ATTR_VALUE) || propertychangeevent
-											.getPropertyName().equals("extent"))) //$NON-NLS-1$
-								updateCaret();
-						}
-
-					});
-			viewport.getVerticalRangeModel().addPropertyChangeListener(
-					new PropertyChangeListener() {
-
-						public void propertyChange(
-								PropertyChangeEvent propertychangeevent) {
-							if ((propertychangeevent.getSource() instanceof RangeModel)
-									&& (propertychangeevent.getPropertyName()
-											.equals(ICSSPropertyID.ATTR_VALUE) || propertychangeevent
-											.getPropertyName().equals("extent"))) //$NON-NLS-1$
-								updateCaret();
-						}
-
-					});
-		}
-	}
-
-	/**
-	 * dispose the instance
-	 */
-	public void dispose() {
-		_viewer.removeHTMLViewerListener(this);
-	}
-
-	/**
-	 * Update the selection
-	 */
-	public void updateSelection() {
-		setCaretVisible(false);
-		updateRangeSelection();
-		updateCaret();
-		reveal();
-	}
-
-	private void setCaretVisible(boolean visible) {
-		Caret caret = _viewer.getCaret();
-		if (caret == null)
-			return;
-		if (caret.isDisposed()) {
-			return;
-		}
-		caret.setVisible(visible);
-	}
-
-	/**
-	 * 
-	 */
-	private void updateRangeSelection() {
-		// FIXME: optimization needed here. Normally should not repaint the
-		// whole page.
-		((GraphicalEditPart) _viewer.getRootEditPart()).getFigure().repaint();
-		((GraphicalEditPart) _viewer.getRootEditPart()).getFigure()
-				.getUpdateManager().performUpdate();
-	}
-
-	/**
-	 * update the caret
-	 */
-	public void updateCaret() {
-		if (_trackFigure != null) {
-			_trackFigure.removeFigureListener(this);
-			_trackFigure = null;
-		}
-		Caret caret = _viewer.getCaret();
-		if (caret == null) {
-			return;
-		}
-		if (caret.isDisposed()) {
-			return;
-		}
-
-		Rectangle rect = null;
-
-		// try get the caret bounds.
-		if (_viewer.isInRangeMode()) {
-			DesignRange range = _viewer.getRangeSelection();
-			if (range != null) {
-				DesignPosition endPosition = range.getEndPosition();
-				if (endPosition != null && endPosition.isValid()) {
-					rect = EditPartPositionHelper
-							.convertToAbsoluteCaretRect(endPosition);
-					_trackFigure = ((GraphicalEditPart) endPosition
-							.getContainerPart()).getFigure();
-					_trackFigure.addFigureListener(this);
-				}
-			}
-		}
-
-		// set visible effect
-		if (rect == null) {
-			caret.setVisible(false);
-		} else {
-			caret.setVisible(false); // make sure it get removed from the
-			// screen.
-			// the caret width doesn't need to be calculated, the x pos should
-			// be adjusted more acurately.
-			caret.setBounds(rect.x, rect.y, CARET_WIDTH, rect.height);
-			caret.setVisible(true);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		if (_viewerBatchChanging) {
-			return;
-		}
-		updateSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionAboutToChange()
-	 */
-	public void selectionAboutToChange() {
-		_viewerBatchChanging = true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionChangeFinished()
-	 */
-	public void selectionChangeFinished() {
-		_viewerBatchChanging = false;
-		updateSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FigureListener#figureMoved(org.eclipse.draw2d.IFigure)
-	 */
-	public void figureMoved(IFigure source) {
-		updateCaret();
-	}
-
-	private void reveal() {
-		Caret caret = _viewer.getCaret();
-		if (caret != null && !caret.isDisposed() && _viewer.isInRangeMode()) {
-			org.eclipse.swt.graphics.Rectangle rect = caret.getBounds();
-			ExposeHelper helper = new ExposeHelper(_viewer);
-			helper.exposeArea(new Rectangle(rect.x, rect.y, rect.width,
-					rect.height));
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java
deleted file mode 100644
index 33fa579..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * A default implementation of the drop location strategy
- * @author cbateman
- *
- */
-public class DefaultDropLocationStrategy extends AbstractDropLocationStrategy 
-{
-    // the amount of vertical offset below the mouse pointer to place
-    // the upper left of the drop hint tooltip
-    private static final int DROP_HINT_VERTICAL_OFFSET = 20;
-
-    /**
-     * @param viewer
-     */
-    public DefaultDropLocationStrategy(EditPartViewer viewer) {
-        super(viewer);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.viewer.AbstractDropLocationStrategy#calculateDesignPosition(org.eclipse.gef.EditPart, org.eclipse.draw2d.geometry.Point, org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator)
-     */
-    @Override
-    public DesignPosition calculateDesignPosition(EditPart host, Point p,
-            IPositionMediator validator) {
-        return EditPartPositionHelper.findEditPartPosition(
-                host, p, validator);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.viewer.AbstractDropLocationStrategy#showTargetFeedback(org.eclipse.gef.EditPart, org.eclipse.jst.pagedesigner.viewer.DesignPosition, org.eclipse.gef.requests.DropRequest)
-     */
-    @Override
-    public List showTargetFeedback(EditPart host, DesignPosition position, DropRequest request) 
-    {
-        List feedback = new ArrayList(4);
-        feedback.add(showFeedbackRect(createCaretBounds(position)));
-        feedback.add(showDropHintLabel(request.getLocation(), position));
-        
-        return feedback;
-    }
-
-    
-    
-    /**
-     * @param rect
-     * @return the default rectangle figure for the requested visual rectangle
-     */
-    protected final RectangleFigure showFeedbackRect(Rectangle rect) {
-        RectangleFigure pf = createFeedbackFigure();
-        pf.translateToRelative(rect);
-        pf.setBounds(rect);
-        return pf;
-    }
-    
-    /**
-     * @param position
-     * @return the bounding rectangle for the caret at the current
-     * position in absolute coords
-     */
-    protected Rectangle createCaretBounds(DesignPosition position)
-    {
-        Rectangle rect = EditPartPositionHelper
-            .convertToAbsoluteCaretRect(position);
-
-        // to avoid enlarge feedback pane.
-        rect = rect.intersect(getFeedbackLayer().getBounds());
-        
-        return rect;
-    }
-    
-    /**
-     * @return the newly created feedback figure
-     */
-    protected RectangleFigure createFeedbackFigure() 
-    {
-        RectangleFigure feedbackFigure = new RectangleFigure();
-        feedbackFigure.setFill(true);
-        feedbackFigure.setOutline(true);
-        feedbackFigure.setLineWidth(1);
-        feedbackFigure.setForegroundColor(ColorConstants.red);
-        feedbackFigure.setBounds(new Rectangle(0, 0, 0, 0));
-        feedbackFigure.setXOR(true);
-        addFeedback(feedbackFigure);
-        return feedbackFigure;
-    }
-
-    /**
-     * Shows a label in a position relative to the drop marker
-     * that hints where the new component will be dropped in
-     * respect of components already there
-     * @param mousePosition 
-     * @param position 
-     * @return the drop hint label
-     */
-    protected final Label showDropHintLabel(Point mousePosition, DesignPosition position)
-    {
-        Label    dropHintLabel = new Label();
-        dropHintLabel.setOpaque(true);
-        dropHintLabel.setBackgroundColor(ColorConstants.tooltipBackground);
-        dropHintLabel.setBorder(
-                new LineBorder(ColorConstants.black, 1)
-                {
-                    // add an extra pixel of inset to make sure the text
-                    // isn't pressed against the border
-                    public Insets getInsets(IFigure figure) {
-                        return new Insets(getWidth()+1);
-                    }
-                }
-        );
-        addFeedback(dropHintLabel);
-
-        final String hintText = getDropHintText(position);
-        dropHintLabel.setText(hintText);
-        //TODO: need to handle viewport clipping and adjust label location appropriately
-        Dimension hintSize = dropHintLabel.getPreferredSize();
-        Point hintLocation = new Point(mousePosition.x, mousePosition.y+DROP_HINT_VERTICAL_OFFSET);
-        Rectangle hintRect = new Rectangle(hintLocation, hintSize);
-
-        //Bug 303524 - [WPE] design view flickers on dnd of jsf html column
-        //    (translateToRelative BEFORE intersect, so intersection happens on final display bounds)
-        dropHintLabel.translateToRelative(hintRect);
-        // we need to intersect the rectangle with the feedback pane, otherwise, when the mouse
-        // is dragged near the edge of the viewport with the drop hint active, the canvas will expand
-        // away from the mouse.  In future a more ideal solution will be to relocate the tooltip
-        // so that is is completely inside the viewport.
-        hintRect = hintRect.intersect(getFeedbackLayer().getBounds());
-
-        dropHintLabel.setBounds(hintRect);
-        
-        return dropHintLabel;
-    }
-    
-    /**
-     * @param position
-     * @return the drop hint text for the current position
-     */
-    protected String getDropHintText(DesignPosition position)
-    {
-        StringBuffer buffer = new StringBuffer("Place"); //$NON-NLS-1$
-        
-        EditPart prevPart = position.getSiblingEditPart(false);
-        EditPart nextPart = position.getSiblingEditPart(true);
-
-        if (nextPart instanceof ElementEditPart)
-        {
-            buffer.append(" before "); //$NON-NLS-1$
-            buffer.append(((ElementEditPart)nextPart).getTagConvert().getHostElement().getNodeName());
-            buffer.append(","); //$NON-NLS-1$
-        }
-        
-        if (prevPart instanceof ElementEditPart)
-        {
-            buffer.append(" after "); //$NON-NLS-1$
-            buffer.append(((ElementEditPart)prevPart).getTagConvert().getHostElement().getNodeName());
-            buffer.append(","); //$NON-NLS-1$
-        }
-        
-        buffer.append(" inside "); //$NON-NLS-1$
-        buffer.append(position.getContainerNode().getNodeName());
-        
-        return buffer.toString();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java
deleted file mode 100644
index a869f80..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DesignPosition {
-	/**
-	 * a singleton that can be used as an invalid position
-	 */
-	public static final DesignPosition INVALID = new DesignPosition(null, -1);
-
-	private EditPart _containerPart;
-
-	int _offset;
-
-	//private Node _containerNode;
-
-	/**
-	 * @param part
-	 * @param offset
-	 */
-	public DesignPosition(EditPart part, int offset) {
-		_containerPart = part;
-		_offset = offset;
-	}
-
-	/**
-	 * if _containerPart is null, means it is invalid
-	 * 
-	 * @return the container edit part
-	 */
-	public EditPart getContainerPart() {
-		return _containerPart;
-	}
-
-	/**
-	 * @return the container node
-	 */
-	public Node getContainerNode() {
-		if (_containerPart != null) {
-			return (Node) _containerPart.getModel();
-		}
-        return null;
-	}
-
-	/**
-	 * if offset < 0, means it is invalid.
-	 * 
-	 * @return the offset
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	/**
-	 * @return true if the design position is valid
-	 */
-	public boolean isValid() {
-		return (_containerPart != null) && (_offset >= 0);
-	}
-
-	/**
-	 * This method should not be called when is text node.
-	 * 
-	 * @param forward
-	 * @return the sibling part one to right in the tree if 
-	 * forward == true, one to the left if forward == false.  May
-	 * return null if position is invalid or there is no valid sibling.
-	 */
-	public EditPart getSiblingEditPart(boolean forward) {
-		if (!isValid()) {
-			return null;
-		}
-
-		int index = forward ? (_offset) : (_offset - 1);
-		List children = _containerPart.getChildren();
-
-		if ((index >= children.size()) || (index < 0)) {
-			return null;
-		}
-
-		return (EditPart) children.get(index);
-	}
-
-	/**
-	 * factory method
-	 * 
-	 * @param part
-	 * @return a design position one before part
-	 */
-	public static DesignPosition createPositionBeforePart(EditPart part) {
-		EditPart parent = part.getParent();
-
-		if (parent == null) {
-			return new DesignPosition(part, 0);
-		}
-        return new DesignPosition(parent, parent.getChildren()
-        		.indexOf(part));
-	}
-
-	/**
-	 * factory method
-	 * 
-	 * @param part
-	 * @return the design position for one after part
-	 */
-	public static DesignPosition createPositionAfterPart(EditPart part) {
-		EditPart parent = part.getParent();
-
-		if (parent == null) {
-			return new DesignPosition(part, part.getChildren().size());
-		}
-        return new DesignPosition(parent, parent.getChildren()
-        		.indexOf(part) + 1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-	    if (obj == this)
-	    {
-	        return true;
-	    }
-	    
-		if (obj instanceof DesignPosition) {
-			DesignPosition p = (DesignPosition) obj;
-
-			return (p.getContainerPart() == this._containerPart)
-					&& (p.getOffset() == this._offset);
-		}
-
-		return false;
-	}
-
-	
-	@Override
-    public int hashCode() {
-	    return System.identityHashCode(_containerPart) ^ System.identityHashCode(Integer.valueOf(_offset));
-    }
-
-	/**
-	 * @param buffer
-	 * @return the buffer with the debug dump
-	 */
-	public StringBuffer debugDump(StringBuffer buffer) {
-//		try {
-			buffer.append("DesignPosition: ").append(this._containerPart) //$NON-NLS-1$
-					.append(": ").append(this._offset).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-			if (this._containerPart.getModel() instanceof Text) {
-				// skip
-			} else {
-				if (this._offset > 0) {
-					buffer.append("after: ").append( //$NON-NLS-1$
-							this._containerPart.getChildren().get(
-									this._offset - 1)).append("\n"); //$NON-NLS-1$
-				}
-
-				if (this._offset < (this._containerPart.getChildren().size() - 1)) {
-					buffer.append("before: ") //$NON-NLS-1$
-							.append(
-									this._containerPart.getChildren().get(
-											this._offset)).append("\n"); //$NON-NLS-1$
-				}
-			}
-            //TODO: what was being caught here?
-//		} catch (Exception e) {
-//		}
-
-		return buffer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-
-		return debugDump(buffer).toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java
deleted file mode 100644
index c3f0552..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.jface.viewers.ISelection;
-
-/**
- * @author mengbo
- */
-public class DesignRange implements ISelection 
-{
-    private final DesignPosition _start;
-    private final DesignPosition _end;
-
-	/**
-	 * @param start
-	 * @param end
-	 */
-	public DesignRange(DesignPosition start, DesignPosition end) {
-		_start = start;
-		_end = end;
-	}
-
-	/**
-	 * @return the start position in the range
-	 */
-	public DesignPosition getStartPosition() {
-		return _start;
-	}
-
-	/**
-	 * @return the end position in the range
-	 */
-	public DesignPosition getEndPosition() {
-		return _end;
-	}
-
-	/**
-	 * @return true if the range is valid
-	 */
-	public boolean isValid() {
-		return _start != null && _start.isValid() && _end != null
-				&& _end.isValid();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelection#isEmpty()
-	 */
-	public boolean isEmpty() {
-		// FIXME: temp implementation, need revisit.
-		return !isValid() || _start.equals(_end);
-	}
-
-	/**
-	 * @param buffer
-	 * @return a buffer with the debug dum
-	 */
-	public StringBuffer debugDump(StringBuffer buffer) {
-		if (_start != null) {
-			buffer.append("Start: ").append(_start); //$NON-NLS-1$
-		} else {
-			buffer.append("Start: null"); //$NON-NLS-1$
-		}
-		if (_end != null) {
-			buffer.append("End: ").append(_end); //$NON-NLS-1$
-		} else {
-			buffer.append("End: null"); //$NON-NLS-1$
-		}
-		return buffer;
-	}
-
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		return debugDump(buffer).toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java
deleted file mode 100644
index da6e305..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.gef.EditPart;
-
-/**
- * @author mengbo
- */
-public class DesignRefPosition extends DesignPosition {
-	private boolean _caretIsAtRight;
-
-	private EditPart _refPart;
-
-	/**
-	 * @param part
-	 * @param caretIsAfter
-	 */
-	public DesignRefPosition(EditPart part, boolean caretIsAfter) {
-		super(part.getParent(), 0);
-		int offset = part.getParent().getChildren().indexOf(part);
-		_offset = caretIsAfter ? offset + 1 : offset;
-		_refPart = part;
-		_caretIsAtRight = caretIsAfter;
-	}
-
-	/**
-	 * @return the reference edit part
-	 */
-	public EditPart getRefPart() {
-		return _refPart;
-	}
-
-	/**
-	 * @return Returns the _isAfter.
-	 */
-	public boolean caretIsAtRight() {
-		return _caretIsAtRight;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
deleted file mode 100644
index 0f11741..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
+++ /dev/null
@@ -1,678 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class EditPartPositionHelper {
-//	private final static Logger _log = PDPlugin
-//			.getLogger(EditPartPositionHelper.class);
-
-	/**
-	 * Add something to current
-	 * 
-	 * @param lineBox
-	 * @param host
-	 * @param point
-	 * @param validator
-	 */
-	private static void addToCurrentLine(FlowBoxLine lineBox, EditPart host,
-			Point point, IPositionMediator validator) {
-		Node node = Target.resolveNode(host);
-		if (!(node == null || EditModelQuery.isDocument(node))) {
-			// Either it is referencable or is editable.
-			if (validator.isValidPosition(new DOMRefPosition(node, true))
-					|| //
-					validator
-							.isValidPosition((new DOMRefPosition(node, false)))
-					|| //
-					validator.isValidPosition(new DOMPosition(node, 0))) {
-				lineBox.addLayoutPart(host, point);
-			}
-		}
-	}
-
-	/**
-	 * @param position 
-	 * @return null means failed to convert to rect.
-	 */
-	public static Rectangle convertToAbsoluteCaretRect(DesignPosition position) {
-		Rectangle ret = null;
-		try {
-			final int CARET_OFFSET = 1;
-			if (position == null || !position.isValid()) {
-				return null;
-			}
-			EditPart containerEditPart = position.getContainerPart();
-			if (containerEditPart instanceof TextEditPart) {
-				CSSTextFigure figure = (CSSTextFigure) ((TextEditPart) containerEditPart)
-						.getFigure();
-				ret = figure.calculateCaretPosition(position.getOffset());
-				figure.translateToAbsolute(ret);
-				ret.width = CaretUpdater.CARET_WIDTH;
-			} else {
-				int offset = position.getOffset();
-				// there is no child
-				if (containerEditPart.getChildren().isEmpty()
-						|| LayoutPart.getConcretePart(containerEditPart) == null) {
-					IFigure figure = ((GraphicalEditPart) containerEditPart)
-							.getFigure();
-					Rectangle bounds = figure.getBounds();
-					if (figure instanceof CSSFigure) {
-						List fragments = ((CSSFigure) figure)
-								.getFragmentsForRead();
-						if (fragments.size() > 0) {
-							FlowBox box = (FlowBox) fragments.get(fragments
-									.size() - 1);
-							bounds = LayoutPart.getBounds(box);
-						}
-					}
-
-					ret = new Rectangle(bounds.x + CARET_OFFSET, bounds.y,
-							CaretUpdater.CARET_WIDTH, bounds.height);
-
-					figure.translateToAbsolute(ret);
-				} else if (offset >= 0
-						&& offset <= containerEditPart.getChildren().size()) {
-					ret = getRefRect(position);
-				}
-			}
-		} catch (Exception e) {
-			// This should never happen, we catch here for later analysis.
-			// _log.debug("Error in caret rect resolving", e);
-			ret = new Rectangle(0, 0, 0, 0);
-		}
-		if (ret == null) {
-			ret = new Rectangle(0, 0, 0, 0);
-		}
-		return ret;
-	}
-
-	/**
-	 * This method will create FlowBoxLine to calculate the accurate parts.
-	 * 
-	 * @param host
-	 * @param p
-	 * @param validator 
-	 * @return the design position
-	 */
-	public static DesignPosition findEditPartPosition(EditPart host, Point p,
-			IPositionMediator validator) {
-		try {
-			host = validator.getEditableContainer(new Target(host));
-			FlowBoxLine boxLine = new FlowBoxLine(
-					new Rectangle(p.x, p.y, 0, 0), validator, p);
-			DesignPosition position = innerFindEditPartPosition(host, host, p,
-					boxLine, validator);
-			if (position == null) {
-				position = innerFindEditPartPosition(host, host, p, boxLine,
-						validator);
-				if (position == null) {
-					EditPart part = boxLine.getClosestPart();
-					if (part != null) {
-						LayoutPart layoutPart = new LayoutPart(part, p);
-						position = layoutPart.resolvePosition(validator);
-					}
-				}
-			}
-			return position;
-		} catch (Exception e) {
-			return null;
-		}
-
-	}
-
-	/**
-	 * This function finds the position, if there is one which is widget or text
-	 * and it contains p, or there is not such widget, then boxLine will return
-	 * the widget that are in a same line which contains p;
-	 * @param rootHost 
-	 * @param host 
-	 * 
-	 * @param p
-	 * @param boxLine 
-	 * @param validator 
-	 * @return the design position
-	 */
-    //TODO: needs refactoring
-	public static DesignPosition innerFindEditPartPosition(EditPart rootHost,
-			EditPart host, Point p, FlowBoxLine boxLine,
-			IPositionMediator validator) {
-		Target target = new Target(host);
-		LayoutPart lPart = new LayoutPart(host, p);
-		// text
-		if (host instanceof TextEditPart) {
-			if (lPart.contains(p)) {
-				DesignPosition position = null;
-				// see if the point is within string.
-				position = findTextEditPartPosition((TextEditPart) host, p);
-				if (position == null) {
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-				// found?!!
-				return position;
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-            return null;
-		}
-		// widget
-		else if (isWidget(host)) {
-			if (lPart.contains(p)
-					&& (validator.isValidPosition(new DOMRefPosition(target
-							.getNode(), true)) || //
-					validator.isValidPosition((new DOMRefPosition(target
-							.getNode(), false))))) {
-				if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(
-						host).getNodeName())) {
-					return new DesignRefPosition(host, lPart.isBeforePoint(p));
-				}
-                return new DesignRefPosition(host, lPart.isBeforePoint(p)
-                		|| !lPart.atLeftPart(p));
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-		} else {
-			// root host. we always support it has editable area.
-			if (host == rootHost) {
-				if (host.getChildren().size() > 0) {
-					List children = host.getChildren();
-					for (int i = 0, size = children.size(); i < size; i++) {
-						GraphicalEditPart child = (GraphicalEditPart) children
-								.get(i);
-						DesignPosition position = innerFindEditPartPosition(
-								rootHost, child, p, boxLine, validator);
-						if (position != null) {
-							return position;
-						}
-					}
-				}
-				if (boxLine.getPartsList().size() == 0) {
-					if (lPart.contains(p)) {
-						// found!!!
-						return new DesignPosition(host, 0);
-					}
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-			}
-			// container
-			else {
-				// can't edit it.
-				if (!validator.hasEditableArea(target)) {
-					if (lPart.contains(p) && //
-							(validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)) || //
-							validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), false)))) {
-						return new DesignRefPosition(host, lPart
-								.isBeforePoint(p)
-								|| !lPart.atLeftPart(p));
-					}
-                    addToCurrentLine(boxLine, host, p, validator);
-				}
-				// can edit
-				else {
-					// contains p
-					if (lPart.contains(p) || //
-							(!validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)) && //
-							!validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), false)))) {
-						if (host.getChildren().size() > 0) {
-							List children = host.getChildren();
-							for (int i = 0, size = children.size(); i < size; i++) {
-								GraphicalEditPart child = (GraphicalEditPart) children
-										.get(i);
-								DesignPosition position = innerFindEditPartPosition(
-										rootHost, child, p, boxLine, validator);
-								if (position != null) {
-									return position;
-								}
-							}
-						} else {
-							// we put the container which is empty here.
-							if (lPart.contains(p)) {
-								// found!!!
-								return new DesignPosition(host, 0);
-							}
-                            addToCurrentLine(boxLine, host, p, validator);
-						}
-					}
-					// not contains p
-					else {
-						addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Similar to findEditPartPositionConstrained, this method is used to
-	 * vertically move caret.
-	 * 
-	 * @param host
-	 * @param p
-	 * @param validator 
-	 * @return the design position
-	 */
-	public static DesignPosition findEditPartPositionConstrained(EditPart host,
-			Point p, IMovementMediator validator) {
-		try {
-			FlowBoxLine boxLine = new FlowBoxLine(
-					new Rectangle(p.x, p.y, 0, 0), validator, p);
-			DesignPosition position = innerFindEditPartPositionConstrained(
-					host, host, p, boxLine, validator);
-			if (position == null) {
-				position = innerFindEditPartPositionConstrained(host, host, p,
-						boxLine, validator);
-				if (position == null) {
-					EditPart part = boxLine.getClosestPart();
-					if (part != null) {
-						LayoutPart layoutPart = new LayoutPart(part, p);
-						position = layoutPart.resolvePosition(validator);
-					}
-				}
-			}
-			return position;
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	/**
-	 * This method is used for move up/down, except for using tactics to deal
-	 * with container, this method is similar to findEditPartPosition.
-	 * 
-	 * @param rootHost 
-	 * @param host 
-	 * @param p
-	 * @param boxLine 
-	 * @param validator 
-	 * @return the design position
-	 */
-    // TODO: needs refactoring
-	public static DesignPosition innerFindEditPartPositionConstrained(
-			EditPart rootHost, EditPart host, Point p, FlowBoxLine boxLine,
-			IMovementMediator validator) {
-		Target target = new Target(host);
-		LayoutPart lPart = new LayoutPart(host, p);
-		// text
-		if (host instanceof TextEditPart) {
-			if (lPart.contains(p)) {
-				DesignPosition position = null;
-				// see if the point is within string.
-				position = findTextEditPartPosition((TextEditPart) host, p);
-				if (position == null) {
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-				// found?!!
-				return position;
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-            return null;
-		}
-		// widget
-		else if (isWidget(host)) {
-			if (lPart.contains(p)) {
-				// found!!!
-				if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(
-						host).getNodeName())) {
-					return new DesignRefPosition(host, lPart.isBeforePoint(p));
-				}
-                return new DesignRefPosition(host, lPart.isBeforePoint(p)
-                		|| !lPart.atLeftPart(p));
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-		} else {
-			// root host. we always support it has editable area.
-			if (host == rootHost) {
-				if (host.getChildren().size() > 0) {
-					List children = host.getChildren();
-					for (int i = 0, size = children.size(); i < size; i++) {
-						GraphicalEditPart child = (GraphicalEditPart) children
-								.get(i);
-						DesignPosition position = innerFindEditPartPositionConstrained(
-								rootHost, child, p, boxLine, validator);
-						if (position != null) {
-							return position;
-						}
-					}
-				} else {
-					if (lPart.contains(p)) {
-						// found!!!
-						return new DesignPosition(host, 0);
-					}
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-			}
-			// container
-			else {
-				// can't edit it.
-				if (!validator.hasEditableArea(target)
-						|| !validator.allowsMoveIn(target)) {
-					if (validator.canReference(target, true)
-							|| validator.canReference(target, false)) {
-						if (lPart.contains(p)) {
-							return new DesignRefPosition(host, lPart
-									.isBeforePoint(p)
-									|| !lPart.atLeftPart(p));
-						}
-                        addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-				// can edit
-				else {
-					// contains p
-					if (lPart.contains(p)) {
-						if (host.getChildren().size() > 0) {
-							List children = host.getChildren();
-							for (int i = 0, size = children.size(); i < size; i++) {
-								GraphicalEditPart child = (GraphicalEditPart) children
-										.get(i);
-								DesignPosition position = innerFindEditPartPositionConstrained(
-										rootHost, child, p, boxLine, validator);
-								if (position != null) {
-									return position;
-								}
-							}
-						} else {
-							// we put the container which is empty here.
-							if (lPart.contains(p)) {
-								// found!!!
-								return new DesignPosition(host, 0);
-							}
-                            addToCurrentLine(boxLine, host, p, validator);
-						}
-					}
-					// not contains p
-					else {
-						addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-			}
-		}
-		return null;
-
-	}
-
-	// /**
-	// * @param host
-	// * @param p
-	// * @return
-	// */
-	// private static DesignPosition
-	// findTextEditPartPositionAdjacent(TextEditPart host, Point p)
-	// {
-	// if (host.getFigure() instanceof CSSTextFigure)
-	// {
-	// CSSTextFigure figure = (CSSTextFigure) host.getFigure();
-	// // make a copy to not destroy the original o
-	// p = p.getCopy();
-	// figure.translateToRelative(p);
-	// int offset = figure.getNewInsertionOffset(p);
-	// if (offset >= 0)
-	// {
-	// return new DesignPosition(host, offset);
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-	// else
-	// {
-	// // should not happen.
-	// return new DesignPosition(host, 0);
-	// }
-	// }
-
-	/**
-	 * @param host
-	 * @param p
-	 * @return
-	 */
-	private static DesignPosition findTextEditPartPosition(TextEditPart host,
-			Point p) {
-		if (host.getFigure() instanceof CSSTextFigure) {
-			CSSTextFigure figure = (CSSTextFigure) host.getFigure();
-			// make a copy to not destroy the original o
-			p = p.getCopy();
-			figure.translateToRelative(p);
-			int offset = figure.getInsertionOffset(p);
-			if (offset >= 0) {
-				return new DesignPosition(host, offset);
-			}
-            return null;
-		}
-        // should not happen.
-        return new DesignPosition(host, 0);
-	}
-
-	/**
-	 * @param figure
-	 * @param box
-	 * @return
-	 */
-//	public static Rectangle getBoxBounds(IFigure figure, FlowBox box) {
-//		Rectangle r = new Rectangle(box._x, box._y, box.getWidth(), box
-//				.getHeight());
-//		figure.translateToAbsolute(r);
-//		return r;
-//	}
-
-	/**
-	 * If child is a GraphicalEditPart, a new copy of its bounding rectangle
-	 * will be returned translated to absolute bounds. If child is not a GraphicalEditPart
-	 * then the empty rectangle (0,0,0,0) is returned.
-	 * 
-	 * @param child
-	 * @return the bounding rectangle or (0,0,0,0) if none.
-	 */
-	public static Rectangle getAbsoluteBounds(EditPart child) {
-		if (child instanceof GraphicalEditPart) {
-			Rectangle bounds = ((GraphicalEditPart) child).getFigure()
-					.getBounds().getCopy();
-			((GraphicalEditPart) child).getFigure().translateToAbsolute(bounds);
-			return bounds;
-		}
-        return new Rectangle(0, 0, 0, 0);
-	}
-
-	/**
-	 * @param host
-	 * @param tagName
-	 * @return
-	 */
-	private static boolean isWidget(EditPart host) {
-		if (host instanceof NodeEditPart) {
-			return ((NodeEditPart) host).isWidget();
-		}
-        return false;
-	}
-
-	/**
-	 * Is Caret at right?
-	 * 
-	 * @param position
-	 * @param caretRefResult
-	 * @return
-	 */
-	private static EditPart tryTwoWays(DesignPosition position,
-			List<Boolean> caretRefResult) {
-		EditPart result = null;
-		// Sibling first:
-		Node node = EditModelQuery.getInstance().getSibling(
-				DOMPositionHelper.toDOMPosition(position), true);
-		if (node != null && !EditModelQuery.isTransparentText(node)) {
-			result = Target.resolvePart(node);
-			caretRefResult.add(Boolean.FALSE);
-		} else {
-			node = EditModelQuery.getInstance().getSibling(
-					DOMPositionHelper.toDOMPosition(position), false);
-			if (node != null && !EditModelQuery.isTransparentText(node)) {
-				result = Target.resolvePart(node);
-				caretRefResult.add(Boolean.TRUE);
-			}
-		}
-		if (result == null) {
-			if (getConcretePart(position, false) != null) {
-				result = getConcretePart(position, false);
-				caretRefResult.add(Boolean.TRUE);
-			} else if (getConcretePart(position, true) != null) {
-				result = getConcretePart(position, true);
-				caretRefResult.add(Boolean.FALSE);
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * Here we are doing something to avoid reference whitespace tag. Since we
-	 * still need to improve whitespace tags's layout further more.
-	 */
-	private static EditPart getNextConcretPart(DesignPosition position,
-			List<Boolean> caretIsAtRightTest) {
-		EditPart result = null;
-		boolean caretIsAtRight = true;
-		if (position instanceof DesignRefPosition) {
-			caretIsAtRight = ((DesignRefPosition) position).caretIsAtRight();
-			result = ((DesignRefPosition) position).getRefPart();
-			caretIsAtRightTest.add(Boolean.valueOf(caretIsAtRight));
-		}
-		if (result == null
-				|| EditModelQuery.isTransparentText(Target.resolveNode(result))) {
-			caretIsAtRightTest.clear();
-			result = tryTwoWays(position, caretIsAtRightTest);
-		}
-		return result;
-	}
-
-	/**
-	 * Avoid whitespaces
-	 * 
-	 * @param position
-	 * @param forward
-	 * @return the edit part at position which is non-whitespace ? TODO:
-	 */
-	public static EditPart getConcretePart(DesignPosition position,
-			boolean forward) {
-		EditPart result = null;
-		Node node = EditModelQuery.getInstance().getSibling(
-				DOMPositionHelper.toDOMPosition(position), forward);
-		while (node != null && EditModelQuery.isTransparentText(node)) {
-			node = EditModelQuery.getInstance().getSibling(node, forward);
-		}
-		if (node != null) {
-			result = Target.resolvePart(node);
-		}
-		return result;
-	}
-
-	/**
-	 * @param position
-	 * @param forward
-	 * @return the next concrete part.
-	 */
-	public static EditPart getNextConcretPart(DesignPosition position,
-			boolean forward) {
-		Node node;
-		EditPart result = null;
-		node = EditModelQuery.getInstance().getSibling(
-				DOMPositionHelper.toDOMPosition(position), forward);
-		if (node != null) {
-			if (forward) {
-				while (node != null) {
-					if (!EditModelQuery.isTransparentText(node)
-							&& (result = Target.resolvePart(node)) != null) {
-						result = Target.resolvePart(node);
-						break;
-					}
-					node = node.getNextSibling();
-				}
-			} else {
-				while (node != null) {
-					if (!EditModelQuery.isTransparentText(node)
-							&& (result = Target.resolvePart(node)) != null) {
-						result = Target.resolvePart(node);
-						break;
-					}
-					node = node.getPreviousSibling();
-				}
-			}
-		}
-		return result;
-	}
-
-	private static Rectangle getRefRect(DesignPosition position) {
-		List<Boolean> caretLocation = new ArrayList<Boolean>();
-		EditPart part = getNextConcretPart(position, caretLocation);
-		LayoutPart layoutPart;
-		Rectangle rect = null;
-		if (part != null) {
-			layoutPart = new LayoutPart(part, null);
-			boolean caretIsAtRight = caretLocation.get(0)
-					.booleanValue();
-			final int CARET_OFFSET = 1;
-			Rectangle bounds = null;
-			IFigure figure = ((GraphicalEditPart) part).getFigure();
-			if (!caretIsAtRight) {
-				FlowBox box;
-				if ((box = layoutPart.getLine(0)) != null) {
-					bounds = LayoutPart.getBounds(box);
-				}
-			} else {
-				FlowBox box;
-				if ((box = layoutPart.getLastLine()) != null) {
-					bounds = LayoutPart.getBounds(box);
-				}
-			}
-			if (bounds == null) {
-				bounds = figure.getBounds();
-			}
-			if (!caretIsAtRight) {
-				rect = new Rectangle(bounds.x - CARET_OFFSET, bounds.y,
-						CaretUpdater.CARET_WIDTH, bounds.height);// new
-			} else {
-				rect = new Rectangle(bounds.getRight().x + CARET_OFFSET,
-						bounds.y, CaretUpdater.CARET_WIDTH, bounds.height);// new
-			}
-			figure.translateToAbsolute(rect);
-		} else {
-			System.out.println("No concrete part?"); //$NON-NLS-1$
-		}
-		return rect;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java
deleted file mode 100644
index 5e45ac1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * FlowBoxLine collects EditParts in a line that cover the x or y coordinate of
- * design view caret. An EditPart may be a widget that can't contains children,
- * a TextEditPart which contains a set of flowbox, or a widgets container which
- * contains some other editparts. For container, there are two types: white box
- * to visitor, that is the container * visitor should consider its content, like
- * <A>, <B>. etc, or black box to visitor, like <TABLE>. Black box means the
- * container will be considered as a whole from outside. For non-container
- * widget we only see TextEditPart can be broken at line end. For black box,
- * only start box or latest box are used for final reference, for white box, we
- * will process its content for reference <@see
- * EditPartPositionHelper.findEditPartPosition>. For Text, the char that is
- * closest to caret will be referenced. In this line class, tree types of
- * EditPart are collected: TextEditPart, Widget, BlackBox container.
- * 
- * @author mengbo
- */
-public class FlowBoxLine {
-	private int _x;
-
-	private int _y;
-
-	private int _height;
-
-	private int _width;
-
-	private HashMap _parts = new HashMap();
-
-	private IPositionMediator _validator;
-
-	private Point _point;
-
-	/**
-	 * @param rect
-	 * @param validator
-	 * @param point
-	 */
-	public FlowBoxLine(Rectangle rect, IPositionMediator validator, Point point) {
-		_x = rect.x;
-		_y = rect.y;
-		_width = rect.width;
-		_height = rect.height;
-		_validator = validator;
-		_point = point;
-	}
-
-	/**
-	 * @return Returns the _height.
-	 */
-	public int getHeight() {
-		return _height;
-	}
-
-	/**
-	 * @return Returns the _width.
-	 */
-	public int getWidth() {
-		return _width;
-	}
-
-	/**
-	 * @return Returns the _x.
-	 */
-	public int getX() {
-		return _x;
-	}
-
-	/**
-	 * @return Returns the _y.
-	 */
-	public int getY() {
-		return _y;
-	}
-
-	/**
-	 * @return the part list
-	 */
-	public Map getPartsList() {
-		return _parts;
-	}
-
-	/**
-	 * @return the right bottom coordiate
-	 */
-	public Point getRightBottom() {
-		return new Point(_x + _width, _y + _height);
-	}
-
-	/**
-	 * @param part
-	 * @param point
-	 * @return layout part added
-	 */
-	public boolean addLayoutPart(EditPart part, Point point) {
-		Assert.isTrue(part != null && point != null);
-		Rectangle rect = null;
-		LayoutPart lPart = new LayoutPart(part, point);
-		if (_parts.size() == 0) {
-			resetBounds(lPart);
-			return true;
-		}
-		if (!interact(lPart)) {
-			if (closer(lPart)) {
-				resetBounds(lPart);
-				return true;
-			}
-            return false;
-		}
-        rect = lPart.getAbsoluteBounds();
-		int xx = Math.min(rect.x, _x);
-		int width = Math.max(rect.getRight().x, getRightBottom().x) - xx;
-		int yy = Math.min(rect.y, _y);
-		int height = Math.max(rect.getBottom().y, getRightBottom().y) - yy;
-		_x = xx;
-		_y = yy;
-		_width = width;
-		_height = height;
-		_parts.put(part, lPart);
-		return true;
-	}
-
-	/**
-	 * @param lPart
-	 * @return true if layout part is within the right bottom corner of the line
-	 */
-	public boolean interact(LayoutPart lPart) {
-		Rectangle rect = lPart.getAbsoluteBounds();
-		return !(rect.getBottom().y <= _y || getRightBottom().y <= rect.y);
-	}
-
-	/**
-	 * @param part
-	 * @return true if the line contains part
-	 */
-	public boolean contains(EditPart part) {
-		return _parts.containsKey(part);
-	}
-
-	/**
-	 * @param part
-	 * @return true if the line contains part
-	 */
-	public boolean contains(LayoutPart part) {
-		return _parts.containsValue(part);
-	}
-
-	/**
-	 * @param part
-	 * @return the layout part for part
-	 */
-	public LayoutPart getLayoutPart(EditPart part) {
-		return (LayoutPart) _parts.get(part);
-	}
-
-	// 
-	/**
-	 * For vertical movement, we need to see if there is part cover p.x.
-	 * 
-	 * @return the closest edit part
-	 */
-	public EditPart getClosestPart() {
-		if (_parts.isEmpty()) {
-			return null;
-		}
-		Collection parts = _parts.values();
-		Iterator iterator = parts.iterator();
-		LayoutPart closestPart = (LayoutPart) iterator.next();
-		if (iterator.hasNext()) {
-			while (iterator.hasNext()) {
-				LayoutPart nextPart = (LayoutPart) iterator.next();
-				closestPart = CaretPositionResolver.getCloserPart(closestPart,
-						nextPart, _point);
-			}
-		}
-		// for children.
-		LayoutPart result = null;
-		if (_validator.getActionData().getActionType() == ActionData.KEYBOARD_NAVAGATION
-				|| //
-				closestPart.isInline()) {
-			result = CaretPositionResolver.getInstance(_validator, _point)
-					.resolveClosestPartFrom(closestPart);
-		} else {
-			result = closestPart;
-		}
-		if (result != null) {
-			return result.getPart();
-		}
-        return null;
-	}
-
-	/**
-	 * See how close the part,box is closer to point, if it is closer than
-	 * current FlowBoxLine. return true;
-	 */
-	private boolean closer(LayoutPart lPart) {
-		int lineYOffset = Math.abs(CaretPositionResolver.getYDistance(
-				getBounds(), _point));
-		int partYOffset = Math.abs(CaretPositionResolver.getYDistance(lPart
-				.getAbsoluteBounds(), _point));
-		return lineYOffset > partYOffset;
-	}
-
-	/**
-	 * @return the bounding rectangle of the line
-	 */
-	public Rectangle getBounds() {
-		return new Rectangle(_x, _y, _width, _height);
-	}
-
-	private void resetBounds(Rectangle rect) {
-		_x = rect.x;
-		_y = rect.y;
-		_width = rect.width;
-		_height = rect.height;
-	}
-
-	private void resetBounds(LayoutPart lPart) {
-		EditPart part = lPart.getPart();
-		Rectangle rect = lPart.getAbsoluteBounds();
-		resetBounds(rect);
-		_parts.clear();
-		_parts.put(part, lPart);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java
deleted file mode 100644
index 7080136..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java
+++ /dev/null
@@ -1,547 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.FigureCanvas;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.nav.CaretPositionTracker;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-
-/**
- * For the GraphicalViewer selection management, we have two different selection
- * mode: Range mode and object mode.
- * 
- * Range mode is to support inline text editing, it selects a range. Object mode
- * selects a list of edit parts.
- * 
- * We let the super class of HTMLGraphicalViewer to handle object selection, and
- * add range selection support in this class. Need to override certain selection
- * related methods of super class to handle selection mode switching.
- * 
- * @author mengbo
- */
-/*package*/ class HTMLGraphicalViewer extends ScrollingGraphicalViewer implements
-		IHTMLGraphicalViewer, CaretPositionTracker {
-	private IEditorPart _parentPart;
-	private Caret _caret;
-	// initially nothing selected, treat as object selectin mode.
-	private boolean _rangeMode = false;
-	private DesignRange _selectionRange = null;
-	private int _inBatch = 0;
-	private final CaretUpdater _caretUpdater;
-	private int _xOffset;
-	private final List<IHTMLGraphicalViewerListener>  _htmlViewerListeners;
-	// private ListenerList _postSelectionChangedListeners = new
-	// ListenerList(1);
-
-	/**
-	 * @param parent 
-	 * 
-	 */
-	public HTMLGraphicalViewer(IEditorPart parent) {
-		_parentPart = parent;
-		// CaretUpdater is not fully initialized yet, since this time the
-		// viewport is not
-		// initialized yet, and we need add listener to range model change.
-        _htmlViewerListeners = new ArrayList<IHTMLGraphicalViewerListener>();
-		_caretUpdater = new CaretUpdater(this);
-	}
-
-	/**
-	 * Adds listener both as a selection changed listener and as an
-	 * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-	 * need not call addSelectionChangedListener.
-	 * @param listener
-	 */
-	public void addHTMLViewerListener(IHTMLGraphicalViewerListener listener)
-	{
-	    addSelectionChangedListener(listener);
-	    
-	    if (!_htmlViewerListeners.contains(listener))
-	    {
-	        _htmlViewerListeners.add(listener);
-	    }
-	}
-	
-	/**
-	 * Removes listener both as a selection changed listener and as an
-     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-     * need not call removeSelectionChangedListener.
-	 * @param listener
-	 */
-	public void removeHTMLViewerListener(IHTMLGraphicalViewerListener listener)
-	{
-	    removeSelectionChangedListener(listener);
-	    _htmlViewerListeners.remove(listener);
-	}
-
-	public Viewport getViewport() {
-		FigureCanvas canvas = this.getFigureCanvas();
-		if (canvas != null) {
-			return canvas.getViewport();
-		}
-        return null;
-	}
-
-	public IDOMModel getModel() {
-		// XXX: temp implementation.
-		EditPart part = this.getContents();
-		if (part != null) {
-			return ((IDOMNode) part.getModel()).getModel();
-		}
-        return null;
-	}
-
-	/**
-	 * @return the status line manager
-	 */
-	public IStatusLineManager getStatusLineManager() {
-		if (_parentPart == null) {
-			return null;
-		}
-        return _parentPart.getEditorSite().getActionBars()
-        		.getStatusLineManager();
-	}
-
-	public Caret getCaret() {
-		if (_caret == null) {
-			Canvas parentCanvas = (Canvas) getControl();
-			if (parentCanvas == null || parentCanvas.isDisposed()) {
-				return null;
-			}
-
-			_caret = new Caret(parentCanvas, 0);
-			_caretUpdater.connectViewer();
-		}
-		return _caret;
-
-	}
-
-	/**
-	 * this method normally should only be called when in object selection mode.
-	 * 
-	 * @return the edit part that has primary selection or null if none
-	 */
-	public EditPart getPrimarySelectedNode() {
-		List list = this.getSelectedEditParts();
-		if (list.isEmpty()) {
-			return null;
-		}
-		for (int i = 0, n = list.size(); i < n; i++) {
-			EditPart part = (EditPart) list.get(i);
-			if (part.getSelected() == EditPart.SELECTED_PRIMARY) {
-				return part;
-			}
-		}
-		return (EditPart) list.get(0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#ensureRangeSelectionMode()
-	 */
-	public void ensureRangeSelectionMode() {
-		if (!_rangeMode) {
-			EditPart primary = getPrimarySelectedNode();
-			this.deselectAll();
-			DesignPosition begin = primary == null ? DesignPosition.INVALID
-					: DesignPosition.createPositionBeforePart(primary);
-			DesignPosition after = primary == null ? DesignPosition.INVALID
-					: DesignPosition.createPositionAfterPart(primary);
-			internalSetRange(begin, after);
-			fireSelectionChanged();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#ensureObjectSelectionMode()
-	 */
-	public void ensureObjectSelectionMode() {
-		if (_rangeMode) {
-			// switch to object selection mode with no selection.
-			internalToObjectMode();
-			fireSelectionChanged();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#isInRangeMode()
-	 */
-	public boolean isInRangeMode() {
-		return _rangeMode;
-	}
-
-	public ISelection getSelection() {
-		if (isInRangeMode()) {
-			return getRangeSelection();
-		}
-        return super.getSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#startSelectionChange()
-	 */
-	public void startSelectionChange() {
-		if (_inBatch == 0) {
-			fireSelectionAboutToChange();
-		}
-		_inBatch++;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#selectionChanged()
-	 */
-	public void selectionChanged() {
-		if (--_inBatch == 0) {
-			fireSelectionChanged();
-			fireSelectionChangeFinished();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void fireSelectionAboutToChange() {
-		IHTMLGraphicalViewerListener listeners[] = 
-		    _htmlViewerListeners.toArray(new IHTMLGraphicalViewerListener[0]);
-
-		for (int i = 0; i < listeners.length; i++) 
-		{
-			listeners[i].selectionAboutToChange();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void fireSelectionChangeFinished()
-	{
-        IHTMLGraphicalViewerListener listeners[] = 
-            _htmlViewerListeners.toArray(new IHTMLGraphicalViewerListener[0]);
-        for (int i = 0; i < listeners.length; i++) 
-        {
-            listeners[i].selectionChangeFinished();
-        }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#fireSelectionChanged()
-	 */
-	protected void fireSelectionChanged() {
-		if (_inBatch == 0)// && this.getControl().isFocusControl())
-		{
-			super.fireSelectionChanged();
-			// firePostSelectionChanged(new SelectionChangedEvent(this,
-			// getSelection()));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection newSelection) {
-		if (newSelection instanceof IStructuredSelection) {
-			internalToObjectMode();
-			ExposeHelper.expose(newSelection, this);
-			updateRangeSelection(newSelection);
-			super.setSelection(newSelection);
-		} else if (newSelection instanceof DesignRange) {
-			DesignRange range = (DesignRange) newSelection;
-			internalSetRange(range.getStartPosition(), range.getEndPosition());
-			fireSelectionChanged();
-		}
-		// else we don't support, ignore
-	}
-
-
-	/**
-	 * @param newSelection
-	 */
-	public void updateRangeSelection(ISelection newSelection) {
-		if (newSelection instanceof IStructuredSelection && //
-				!(((IStructuredSelection) newSelection).getFirstElement() instanceof DocumentEditPart)) {
-			Object element = ((IStructuredSelection) newSelection)
-					.getFirstElement();
-			if (element instanceof ElementEditPart) {
-				updateRangeSelection(new DesignRefPosition((EditPart) element,
-						false), new DesignRefPosition((EditPart) element, true));
-			} else if (element instanceof Node) {
-				IDOMPosition start = new DOMRefPosition((Node) element, false);
-				IDOMPosition end = new DOMRefPosition((Node) element, true);
-				updateRangeSelection(DOMPositionHelper.toDesignPosition(start),
-						DOMPositionHelper.toDesignPosition(end));
-			}
-		}
-	}
-
-	/**
-	 * This method is used to synchronize range mode selection when node
-	 * selection is changed.
-	 * 
-	 * @param position
-	 * @param position2
-	 */
-	private void updateRangeSelection(DesignPosition position,
-			DesignPosition position2) {
-		// if only one position is invalid, we will make a collapsed range using
-		// the valid position
-		if (position == null) {
-			position = DesignPosition.INVALID;
-		}
-		if (position2 == null || !position2.isValid()) {
-			position2 = position;
-		}
-		if (!position.isValid()) {
-			position = position2;
-		}
-
-		_selectionRange = new DesignRange(position, position2);
-	}
-
-	// -------------------------------------------------------------------------------------------------
-	// override super class methods for selection handling.
-	// operations that handles object selection
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#appendSelection(org.eclipse.gef.EditPart)
-	 */
-	public void appendSelection(EditPart editpart) {
-		internalToObjectMode();
-		super.appendSelection(editpart); // super will fireSelectionChanged.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#deselectAll()
-	 */
-	public void deselectAll() {
-		internalToObjectMode();
-		super.deselectAll(); // super.deselectAll() will fireSelectionChanged
-	}
-
-	/**
-	 * Clear the selection to null. When the model is modified, the selection is
-	 * invalid, so we need to clear the selection. We change the selection
-	 * directly, it won't need to fire selectionchange event to other part.
-	 * 
-	 */
-	public void clearSelectionRange() {
-		internalToObjectMode();
-		_selectionRange = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#deselect(org.eclipse.gef.EditPart)
-	 */
-	public void deselect(EditPart editpart) {
-		if (!_rangeMode) {
-			super.deselect(editpart); // super will fireSelectionChanged.
-		}
-		// else just ignore.
-	}
-
-	// ---------------------------------------------------------------------------------------------
-	// range selection handling methods.
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#getRangeSelection()
-	 */
-	public DesignRange getRangeSelection() {
-		return _selectionRange;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#setRange(org.eclipse.jst.pagedesigner.selection.EditPartPosition,
-	 *      org.eclipse.jst.pagedesigner.selection.EditPartPosition)
-	 */
-	public void setRange(DesignPosition position, DesignPosition position2) {
-		internalSetRange(position, position2);
-		fireSelectionChanged();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#setRangeEndPosition(org.eclipse.jst.pagedesigner.selection.EditPartPosition)
-	 */
-	public void setRangeEndPosition(DesignPosition position) {
-		DesignRange range = getRangeSelection();
-		DesignPosition begin = null;
-		if (range != null) {
-			begin = range.getStartPosition();
-		}
-		internalSetRange(begin, position);
-		fireSelectionChanged();
-	}
-
-	// --------------------------------------------------------------------------------------
-	/**
-	 * internall switch to object mode, no selection change event is fired. the
-	 * caller must call some other methods that will result in selection change
-	 * event after calling this method.
-	 */
-	private void internalToObjectMode() {
-		_rangeMode = false;
-	}
-
-	/**
-	 * this method will not fire selection changed event. caller should do that.
-	 * 
-	 * @param position
-	 * @param position2
-	 */
-	private void internalSetRange(DesignPosition position,
-			DesignPosition position2) {
-		if (!_rangeMode) {
-			// XXX: deselectAll() will result in fireSelectionChange, so here is
-			// one unnecessary
-			// event fire. But should be ok.
-			deselectAll();
-			_rangeMode = true;
-		}
-		// if only one position is invalid, we will make a collapsed range using
-		// the valid position
-		if (position == null) {
-			position = DesignPosition.INVALID;
-		}
-		if (position2 == null || !position2.isValid()) {
-			position2 = position;
-		}
-		if (!position.isValid()) {
-			position = position2;
-		}
-
-		_selectionRange = new DesignRange(position, position2);
-	}
-
-	/**
-	 * debug method, dump some debug information to the console
-	 */
-	public void dumpStatus() {
-		if (isInRangeMode()) {
-			// System.out.println("Range start: " +
-			// this.getRangeSelection().getStartPosition());
-			// System.out.println("Range end: " +
-			// this.getRangeSelection().getEndPosition());
-		} else {
-			// System.out.println("Object selection mode");
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.nav.CaretPositionTracker#getXoffset()
-	 */
-	public int getXoffset() {
-		return _xOffset;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.nav.CaretPositionTracker#setXoffset(int)
-	 */
-	public void setXoffset(int xoffset) {
-		this._xOffset = xoffset;
-	}
-
-	/**
-	 * 
-	 */
-	public void updateHorizontalPos() {
-		Caret caret = getCaret();
-		if (caret != null && !caret.isDisposed() && isInRangeMode()) {
-			org.eclipse.swt.graphics.Rectangle rect = caret.getBounds();
-			setXoffset(rect.x);
-		}
-	}
-    
-	// public void addPostSelectionChangedListener(ISelectionChangedListener
-	// listener)
-	// {
-	// _postSelectionChangedListeners.add(listener);
-	//
-	// }
-	//
-	// public void removePostSelectionChangedListener(ISelectionChangedListener
-	// listener)
-	// {
-	// _postSelectionChangedListeners.remove(listener);
-	// }
-
-	/**
-	 * Notifies any post selection listeners that a post selection event has
-	 * been received. Only listeners registered at the time this method is
-	 * called are notified.
-	 * 
-	 * @param event
-	 *            a selection changed event
-	 * 
-	 * @see #addPostSelectionChangedListener(ISelectionChangedListener)
-	 */
-	// public void firePostSelectionChanged(final SelectionChangedEvent event)
-	// {
-	// Object[] listeners = _postSelectionChangedListeners.getListeners();
-	// for (int i = 0; i < listeners.length; ++i)
-	// {
-	// final ISelectionChangedListener l = (ISelectionChangedListener)
-	// listeners[i];
-	// SafeRunnable.run(new SafeRunnable()
-	// {
-	// public void run()
-	// {
-	// l.selectionChanged(event);
-	// }
-	// });
-	// }
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java
deleted file mode 100644
index 4b368aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-
-/**
- * @author cbateman
- * 
- * Default adapter class for IHTMLGraphicalViewerListener
- *
- */
-public abstract class HTMLGraphicalViewerListenenerAdapter implements
-        IHTMLGraphicalViewerListener {
-
-    public void selectionAboutToChange() {
-        // do nothing -- override to implement
-    }
-
-    public void selectionChangeFinished() {
-        // do nothing -- override to implement
-    }
-
-    public void selectionChanged(SelectionChangedEvent event) {
-        // do nothing == override to implement
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IDropLocationStrategy.java
deleted file mode 100644
index 0798fea..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IDropLocationStrategy.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * A strategy used to determine the closest valid drop location given
- * a current position.
- * 
- * Note: clients should not implement or sub-class this interface.  Instead,
- * sub-class AbstractDropLocationStrategy.
- * @author cbateman
- *
- */
-public interface IDropLocationStrategy
-{
-    /**
-     * @param host
-     * @param p
-     * @param validator
-     * @return the closest valid design positionn to p, starting from host
-     * that is valid based on validator, or null if there is no such position
-     * (drop not valid).  validator.isValidPosition must be honoured.
-     */
-    DesignPosition calculateDesignPosition(EditPart host, Point p, IPositionMediator validator);
-    
-    /**
-     * May choose to contribute target feedback given a target part host and given
-     * the proposed drops location given by position
-     * 
-     * @param host 
-     * @param position
-     * @param request 
-     * @return must contain all IFigure objects that were added to the feedback layer by
-     * this call.  Once returned, these IFigure's must not be kept as state information
-     * by the strategy because they may be manipulated at any time after return to the caller.
-     * This includes erasing them from the feedback layer.  List must be modifiable by
-     * the caller.
-     * 
-     * Note: most feedback in Draw2D requires that it is added to the feedback layer
-     * before it can be fully initialized, which is why this call adds feedback and then
-     * returns it.  The caller is responsible for erasing the figures in the list.
-     */
-    List showTargetFeedback(EditPart host, DesignPosition position, DropRequest request);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java
deleted file mode 100644
index 6ee3ce4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * @author mengbo
- */
-public interface IHTMLGraphicalViewer extends GraphicalViewer 
-{
-    /**
-     * Factory for IHTMLGraphicalViewers
-     *
-     */
-    static class Factory
-    {
-        /**
-         * @param part 
-         * @return a new graphical viewer for part
-         */
-        public static IHTMLGraphicalViewer createGraphicalViewer(IEditorPart part)
-        {
-            return new HTMLGraphicalViewer(part);
-        }
-    }
-
-	/**
-	 * @return the dom model
-	 */
-	public IDOMModel getModel();
-
-	/**
-	 * ensure we are in range selection mode
-	 */
-	public void ensureRangeSelectionMode();
-
-	/**
-	 * 
-	 */
-	public void ensureObjectSelectionMode();
-
-	/**
-	 * @return true if in range mode
-	 */
-	public boolean isInRangeMode();
-
-	/**
-	 * @return the current selection range
-	 */
-	public DesignRange getRangeSelection();
-
-	/**
-	 * @param position
-	 * @param position2
-	 */
-	public void setRange(DesignPosition position, DesignPosition position2);
-
-	/**
-	 * @param position
-	 */
-	public void setRangeEndPosition(DesignPosition position);
-
-	/**
-	 * @return the caret
-	 */
-	public Caret getCaret();
-
-	/**
-	 * indicate a batch of operations is began, and may result in selection
-	 * change. This viewer will only fire a single selection changed event when
-	 * this batch of operations finish.
-	 */
-	public void startSelectionChange();
-
-	/**
-	 * batch operation that change the selection finished.
-	 * 
-	 */
-	public void selectionChanged();
-
-	/**
-	 * @return the view port
-	 */
-	public Viewport getViewport();
-	
-	/**
-	 * @return the status line manager
-	 */
-	public IStatusLineManager getStatusLineManager();
-	
-	/**
-	 * @param newSelection
-	 */
-	public void updateRangeSelection(ISelection newSelection);
-	
-	/**
-	 * Update the horizontal position
-	 */
-	public void updateHorizontalPos();
-
-	/**
-	 * Clear the selection to null. When the model is modified, the selection is
-     * invalid, so we need to clear the selection. We change the selection
-     * directly, it won't need to fire selectionchange event to other part.
-     */
-	public void clearSelectionRange();
-
-	/**
-     * Adds listener both as a selection changed listener and as an
-     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-     * need not call addSelectionChangedListener.
-     * @param listener
-     */
-    public void addHTMLViewerListener(IHTMLGraphicalViewerListener listener);
-    
-    /**
-     * Removes listener both as a selection changed listener and as an
-     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-     * need not call removeSelectionChangedListener.
-     * @param listener
-     */
-    public void removeHTMLViewerListener(IHTMLGraphicalViewerListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java
deleted file mode 100644
index 0d48ca9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-
-/**
- * @author mengbo
- */
-public interface IHTMLGraphicalViewerListener extends ISelectionChangedListener {
-	/**
-	 * Fired before selection changes
-	 */
-	public void selectionAboutToChange();
-
-	/**
-	 * Fired after selection changed listeners have all been processed
-	 * for a change
-	 */
-	public void selectionChangeFinished();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java
deleted file mode 100644
index 853ec06..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowUtilities;
-import org.eclipse.jst.pagedesigner.css2.layout.TextFragmentBox;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final  class LayoutPart {
-	private final static int MAX_OFFSET_TO_EDGE = 10;
-
-	private EditPart _part;
-
-	private FlowBox _box;
-
-	private final Point EMPTY_POINT = new Point(0, 0);
-
-	private Point _point = EMPTY_POINT;
-
-	/**
-	 * If caller didn't resolve FlowBox, call this.
-	 * 
-	 * @param part
-	 * @param point
-	 */
-	public LayoutPart(EditPart part, Point point) {
-		Assert.isTrue(part != null);
-		_part = part;
-		_point = point;
-	}
-
-	/**
-	 * @return Returns the _box, when it is null, generate box with part and
-	 *         point.
-	 */
-	public FlowBox getBox() {
-		if (_box == null) {
-			_box = getClosestBox();
-		}
-		return _box;
-	}
-
-	/**
-	 * @return Returns the _part.
-	 */
-	public EditPart getPart() {
-		return _part;
-	}
-
-	/**
-	 * Get closest box's bounds.
-	 * 
-	 * @param point
-	 * @return
-	 */
-	private Rectangle getClosestBoxAbsoluteBounds() {
-		Rectangle rect = null;
-		if (getBox() != null) {
-			rect = getAbsoluteBounds(getBox());
-		}
-		return rect;
-	}
-
-	/**
-	 * Try to get the closest flowbox absolute bounds.
-	 * 
-	 * @return the bounding rectangle
-	 */
-	public Rectangle getAbsoluteBounds() {
-		Rectangle bounds = null;
-		if ((bounds = getClosestBoxAbsoluteBounds()) == null) {
-			// This should never happens.
-			bounds = EditPartPositionHelper.getAbsoluteBounds(_part);
-		}
-		return bounds;
-	}
-
-	/**
-	 * Get box's absolute bounds.
-	 * 
-	 * @param box
-	 * @return the box's bounding rectangle
-	 */
-	public Rectangle getAbsoluteBounds(FlowBox box) {
-		if (box != null) {
-			IFigure figure = ((GraphicalEditPart) _part).getFigure();
-			Rectangle rect = new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-					.getHeight());
-			figure.translateToAbsolute(rect);
-			return rect;
-		}
-		return null;
-	}
-
-	/**
-	 * Closest box is the part's FlowBox which y coordinate is closest to point,
-	 * and then its x coordinate is more close to point than other boxs of the
-	 * same line.
-	 * 
-	 * @param part
-	 * @param point
-	 * @return
-	 */
-	private FlowBox getClosestBox() {
-		FlowBox closestBox = null;
-		List fragments = getLines(_part);
-
-		// if there is one which are at the same line with relative,
-		// calculate that line first;
-		for (int i = 0; i < fragments.size(); i++) {
-			FlowBox box = (FlowBox) fragments.get(i);
-			Rectangle boxRect = getAbsoluteBounds(box);
-			if (boxRect.contains(_point.x, _point.y)) {
-				closestBox = box;
-				break;
-			}
-            if (closestBox == null) {
-            	closestBox = box;
-            } else {
-            	// compare y.
-            	int offset1 = Math.abs(CaretPositionResolver.getYDistance(
-            			boxRect, _point));
-            	Rectangle closestRect = getAbsoluteBounds(closestBox);
-            	int offset2 = Math.abs(CaretPositionResolver.getYDistance(
-            			closestRect, _point));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-            // at the same line
-            if (closestBox != box && boxRect.contains(boxRect.x, _point.y)) {
-            	// compare x.
-            	int offset1 = Math.abs(CaretPositionResolver.getXDistance(
-            			boxRect, _point));
-            	Rectangle closestRect = getAbsoluteBounds(closestBox);
-            	int offset2 = Math.abs(CaretPositionResolver.getXDistance(
-            			closestRect, _point));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-		}
-		return closestBox;
-	}
-
-	/**
-	 * The point is whitin the bounds of the figure.
-	 * 
-	 * @param point
-	 * @return true if point is the absolute bounds of this
-	 */
-	public boolean contains(Point point) {
-		return getAbsoluteBounds().contains(point);
-	}
-
-	/**
-	 * @return the design position
-	 */
-	public DesignPosition resolveTextPosition() {
-		DesignPosition result = null;
-		if (_part instanceof TextEditPart
-				&& !EditModelQuery.isTransparentText(Target.resolveNode(_part))) {
-			FlowBox flowBox = getBox();
-			if (flowBox instanceof TextFragmentBox) {
-				TextFragmentBox box = (TextFragmentBox) flowBox;
-				if (((TextEditPart) _part).getFigure() instanceof CSSTextFigure) {
-					CSSTextFigure figure = (CSSTextFigure) ((TextEditPart) _part)
-							.getFigure();
-					Rectangle boxRect = getAbsoluteBounds(box);
-					int index = FlowUtilities.getTextInWidth(box.getTextData(),
-							figure.getCSSStyle().getCSSFont().getSwtFont(),
-							_point.x - boxRect.x, TextLayoutSupport
-									.getAverageCharWidth(box));
-					result = new DesignPosition(_part, box._offset + index);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param validator
-	 * @return resolve the design position using validator
-	 */
-	public DesignPosition resolvePosition(IPositionMediator validator) {
-		DesignPosition result;
-		if ((result = resolveTextPosition()) == null) {
-			boolean atPointLeft = isBeforePoint(_point);
-//			boolean atPointRight = isAfterPoint(_point);
-//			if (atPointLeft == atPointRight) {
-//			    // TODO: and...?
-//			}
-			Target target = new Target(getPart());
-			if (validator.isValidPosition(new DOMRefPosition(target.getNode(),
-					atPointLeft))) {
-				result = new DesignRefPosition(_part, atPointLeft);
-			} else if (validator.isValidPosition(new DOMRefPosition(target
-					.getNode(), !atPointLeft))) {
-				result = new DesignRefPosition(_part, !atPointLeft);
-			} else if (validator.isEditable(target)) {
-				if (atPointLeft) {
-					result = new DesignPosition(_part, 0);
-				} else {
-					result = new DesignPosition(_part, _part.getChildren()
-							.size());
-				}
-			}
-		}
-		return result;
-	}
-
-    // TODO: dead?
-//	private IFigure getFigure() {
-//		return ((GraphicalEditPart) _part).getFigure();
-//	}
-
-	private boolean isAfterPoint(Point point) {
-		boolean result = false;
-		FlowBox flowBox = getLine(0);
-		if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(_part)
-				.getNodeName())) {
-			if (flowBox != null) {
-				Rectangle boxRect = getAbsoluteBounds(flowBox);
-				result = CaretPositionResolver.getYDistance(boxRect, point) == 0;
-			}
-		} else {
-
-			if (flowBox != null) {
-				Rectangle boxRect = getAbsoluteBounds(flowBox);
-				if (CaretPositionResolver.getXDistance(boxRect, point) != 0) {
-					result = CaretPositionResolver.getXDistance(boxRect, point) < 0
-							&& // 
-							CaretPositionResolver.getYDistance(boxRect, point) == 0;
-				}
-			}
-		}
-		result |= isUnderCaret();
-		// if (isWidget() && flowBox != null)
-		// {
-		// result |= contains(point) &&
-		// CaretPositionResolver.toXMiddle(getAbsoluteBounds(flowBox), point) <
-		// 0;
-		// }
-		return result;
-
-	}
-
-	/*package*/ boolean isBeforePoint(Point point) {
-		boolean result = false;
-		FlowBox flowBox = getLastLine();
-		if (flowBox != null) {
-			Rectangle boxRect = getAbsoluteBounds(flowBox);
-			if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target
-					.resolveNode(_part).getNodeName())) {
-				return CaretPositionResolver.getYDistance(boxRect, point) == 0;
-			} else if (CaretPositionResolver.getXDistance(boxRect, point) != 0) {
-				result = CaretPositionResolver.getXDistance(boxRect, point) > 0
-						&& // 
-						CaretPositionResolver.getYDistance(boxRect, point) == 0;
-			}
-		}
-		result |= isAboveCaret();
-		// if (isWidget() && flowBox != null)
-		// {
-		// result |= contains(point) &&
-		// CaretPositionResolver.toXMiddle(getAbsoluteBounds(flowBox), point) >
-		// 0;
-		// }
-		return result;
-		// return !isAfterPoint(point);
-	}
-
-	/*package*/ boolean isBeforePoint() {
-		return isBeforePoint(_point);
-	}
-
-	/*package*/ boolean atLeftPart(Point point) {
-		FlowBox flowBox = getBox();
-		if (flowBox != null) {
-			Rectangle boxRect = getAbsoluteBounds(flowBox);
-			return CaretPositionResolver.toXMiddle(boxRect, point) < 0;
-		}
-		return true;
-	}
-
-	/*package*/ boolean isAfterPoint() {
-		return isAfterPoint(_point);
-	}
-
-	// TODO: dead but possibly useful?
-//	private boolean atSameLine(Point point) {
-//		Rectangle bounds = getAbsoluteBounds();
-//		return bounds.contains(bounds.getTop().x, point.y);
-//	}
-
-	/*package*/ boolean atSameRow(Point point) {
-		Rectangle bounds = getAbsoluteBounds();
-		return bounds.contains(point.x, bounds.getRight().y);
-	}
-
-	/*package*/ static Rectangle getBounds(FlowBox box) {
-		return new Rectangle(box.getX(), box.getY(), box.getWidth(), box.getHeight());
-	}
-
-	/**
-	 * @return Returns the _point.
-	 */
-	public Point getPoint() {
-		return _point;
-	}
-
-	FlowBox getLine(int index) {
-		FlowBox result = null;
-		List lines = getLines(_part);
-		if (lines.size() > 0 && index >= 0 && index <= lines.size() - 1) {
-			result = (FlowBox) lines.get(index);
-		}
-		return result;
-	}
-
-	FlowBox getLastLine() {
-		FlowBox result = null;
-		List lines = getLines(_part);
-		if (lines.size() > 0) {
-			result = (FlowBox) lines.get(lines.size() - 1);
-		}
-		return result;
-	}
-
-	/**
-	 * @param part
-	 * @return
-	 */
-	List getLines(EditPart part) {
-		List fragments = new ArrayList();
-		if (part instanceof SubNodeEditPart) {
-			IFigure figure = ((GraphicalEditPart) part).getFigure();
-
-			if (figure instanceof CSSTextFigure) {
-				fragments = ((CSSTextFigure) figure).getFragments();
-				((CSSTextFigure) figure).getCSSStyle();
-			} else if (figure instanceof CSSFigure) {
-				fragments = ((CSSFigure) figure).getFragmentsForRead();
-				((CSSFigure) figure).getCSSStyle();
-			}
-		}
-		return fragments;
-	}
-
-	/**
-	 * To search for none empty string, this is not final.
-	 * @param part 
-	 * @return the edit part
-	 * 
-	 */
-	/*package*/ static EditPart getConcretePart(EditPart part) {
-		if (part != null) {
-			Node node = Target.resolveNode(part);
-			Node child = node.getFirstChild();
-			EditPart result;
-			while (child != null) {
-				if (!EditModelQuery.isTransparentText(child)
-						&& (result = Target.resolvePart(child)) != null) {
-					return result;
-				}
-				child = child.getNextSibling();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * To search for none empty string, this is not final.
-	 * Equivalent to getConcretePart(getPart())
-	 * 
-	 * @return the edit part
-	 * 
-	 */
-	public EditPart getConcretePart() {
-		return getConcretePart(_part);
-	}
-
-	/**
-	 * @param node
-	 * @return the node
-	 */
-	public static Node getConcreteNode(Node node) {
-		if (node != null) {
-			Node child = node.getFirstChild();
-			while (child != null) {
-				if (!EditModelQuery.isTransparentText(child)) {
-					return node;
-				}
-				child = child.getNextSibling();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @return true if is close to edge
-	 */
-	public boolean isCloseToEdgeFromOutSide() {
-		boolean result = false;
-		if (EditModelQuery.isBlockNode(Target.resolveNode(_part))) {
-			result = Math.abs(getAbsoluteBounds().getLeft().x - _point.x) <= MAX_OFFSET_TO_EDGE;
-			if (!result) {
-				result = Math.abs(getAbsoluteBounds().getRight().x - _point.x) <= MAX_OFFSET_TO_EDGE;
-			}
-		}
-		return result;
-	}
-
-	private boolean isAboveCaret() {
-		return getAbsoluteBounds().getBottom().y <= _point.y;
-	}
-
-	private boolean isUnderCaret() {
-		return getAbsoluteBounds().getTop().y >= _point.y;
-	}
-
-	/**
-	 * @return tru if getPart() is considered inline
-	 */
-	/*package*/ boolean isInline() {
-		return EditModelQuery.isInline(Target.resolveNode(_part));
-	}
-
-    // TODO: dead?
-//	private boolean isWidget() {
-//		return EditModelQuery.isWidget(_part);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("editPart:" + _part + ", --- box: " + getBox()); //$NON-NLS-1$ //$NON-NLS-2$
-		return sb.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java
deleted file mode 100644
index 46850b4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-
-/**
- * This class used to identify a position in a text node. It's very similiar to
- * EditPartPosition. Used instead of EditPartPosition when in cases we are in
- * the middle of handling something without available EditPart created.
- * 
- * offset has the same meaning as in EditPartPosition.
- * 
- * @author mengbo
- */
-public class TextPosition {
-	private IDOMText _containerNode;
-
-	private int _offset;
-
-	/**
-	 * @param part
-	 * @param offset
-	 */
-	public TextPosition(IDOMText part, int offset) {
-		_containerNode = part;
-		_offset = offset;
-	}
-
-	/**
-	 * if _containerPart is null, means it is invalid
-	 * 
-	 * @return the text node
-	 */
-	public IDOMText getTextNode() {
-		return _containerNode;
-	}
-
-	/**
-	 * if offset < 0, means it is invalid.
-	 * 
-	 * @return the offset
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	/**
-	 * @return if this position is considered valid
-	 */
-	public boolean isValid() {
-		return _containerNode != null && _offset >= 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof TextPosition) {
-			TextPosition p = (TextPosition) obj;
-			return p.getTextNode() == this._containerNode
-					&& p.getOffset() == this._offset;
-		}
-		return false;
-	}
-
-    @Override
-    public int hashCode() 
-    {
-        // match hash code to equals criteria
-        return System.identityHashCode(getTextNode()) 
-                ^ System.identityHashCode(Integer.valueOf(getOffset()));
-    }
-	
-	
-}
